// The PayPal SDK is released under the following license:
//
//     Copyright (c) <2018> PAYPAL, INC.
//
//     SDK LICENSE
//
//     NOTICE TO USER:  PayPal, Inc. is providing the Software and Documentation for use under the terms of
//     this Agreement. Any use, reproduction, modification or distribution of the Software or Documentation,
//     or any derivatives or portions hereof, constitutes your acceptance of this Agreement.
//
//     As used in this Agreement, "PayPal" means PayPal, Inc.  "Software" means the software code accompanying
//     this agreement. "Documentation" means the documents, specifications and all other items accompanying
//     this Agreement other than the Software.
//
//     1.  LICENSE GRANT Subject to the terms of this Agreement, PayPal hereby grants you a non-exclusive,
//     worldwide, royalty free license to use, reproduce, prepare derivative works from, publicly display,
//     publicly perform, distribute and sublicense the Software for any purpose, provided the copyright notice
//     below appears in a conspicuous location within the source code of the distributed Software and this
//     license is distributed in the supporting documentation of the Software you distribute. Furthermore,
//     you must comply with all third party licenses in order to use the third party software contained in the
//     Software.
//
//     Subject to the terms of this Agreement, PayPal hereby grants you a non-exclusive, worldwide, royalty free
//     license to use, reproduce, publicly display, publicly perform, distribute and sublicense the Documentation
//     for any purpose.  You may not modify the Documentation.
//
//     No title to the intellectual property in the Software or Documentation is transferred to you under the
//     terms of this Agreement. You do not acquire any rights to the Software or the Documentation except as
//     expressly set forth in this Agreement.
//
//     If you choose to distribute the Software in a commercial product, you do so with the understanding that
//     you agree to defend, indemnify and hold harmless PayPal and its suppliers against any losses, damages and
//     costs arising from the claims, lawsuits or other legal actions arising out of such distribution.  You may
//     distribute the Software in object code form under your own license, provided that your license agreement:
//
//     (a)     complies with the terms and conditions of this license agreement;
//
//     (b)     effectively disclaims all warranties and conditions, express or implied, on behalf of PayPal;
//
//     (c)     effectively excludes all liability for damages on behalf of PayPal;
//
//     (d)     states that any provisions that differ from this Agreement are offered by you alone and not PayPal; and
//
//     (e)     states that the Software is available from you or PayPal and informs licensees how to obtain it in a
//     reasonable manner on or through a medium customarily used for software exchange.
//
//     2.  DISCLAIMER OF WARRANTY
//     PAYPAL LICENSES THE SOFTWARE AND DOCUMENTATION TO YOU ONLY ON AN "AS IS" BASIS WITHOUT WARRANTIES OR CONDITIONS
//     OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY WARRANTIES OR CONDITIONS OF TITLE,
//     NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  PAYPAL MAKES NO WARRANTY THAT THE
//     SOFTWARE OR DOCUMENTATION WILL BE ERROR-FREE. Each user of the Software or Documentation is solely responsible
//     for determining the appropriateness of using and distributing the Software and Documentation and assumes all
//     risks associated with its exercise of rights under this Agreement, including but not limited to the risks and
//     costs of program errors, compliance with applicable laws, damage to or loss of data, programs, or equipment,
//     and unavailability or interruption of operations.  Use of the Software and Documentation is made with the
//     understanding that PayPal will not provide you with any technical or customer support or maintenance.  Some
//     states or jurisdictions do not allow the exclusion of implied warranties or limitations on how long an implied
//     warranty may last, so the above limitations may not apply to you.  To the extent permissible, any implied
//     warranties are limited to ninety (90) days.
//
//
//     3.  LIMITATION OF LIABILITY
//     PAYPAL AND ITS SUPPLIERS SHALL NOT BE LIABLE FOR LOSS OR DAMAGE ARISING OUT OF THIS AGREEMENT OR FROM THE USE
//     OF THE SOFTWARE OR DOCUMENTATION.  IN NO EVENT WILL PAYPAL OR ITS SUPPLIERS BE LIABLE TO YOU OR ANY THIRD PARTY
//     FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES INCLUDING LOST PROFITS, LOST SAVINGS,
//     COSTS, FEES, OR EXPENSES OF ANY KIND ARISING OUT OF ANY PROVISION OF THIS AGREEMENT OR THE USE OR THE INABILITY
//     TO USE THE SOFTWARE OR DOCUMENTATION, HOWEVER CAUSED AND UNDER ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
//     STRICT LIABILITY OR TORT INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
//     PAYPAL'S AGGREGATE LIABILITY AND THAT OF ITS SUPPLIERS UNDER OR IN CONNECTION WITH THIS AGREEMENT SHALL BE
//     LIMITED TO THE AMOUNT PAID BY YOU FOR THE SOFTWARE AND DOCUMENTATION.
//
//     4.  TRADEMARK USAGE
//     PayPal is a trademark of PayPal, Inc. in the United States and other countries.  Such trademarks may not be used
//     to endorse or promote any product unless expressly permitted under separate agreement with PayPal.
//
// 	5.	CERTIFICATIONS
// 	Please note that if you modify the source code and redistribute these modifications for commercial purposes, you agree and understand you may need to certify or comply with any relevant certification or compliance entities to process payments.
//
// 	6.  TERM
//     Your rights under this Agreement shall terminate if you fail to comply with any of the material terms or
//     conditions of this Agreement and do not cure such failure in a reasonable period of time after becoming
//     aware of such noncompliance.  If all your rights under this Agreement terminate, you agree to cease use
//     and distribution of the Software and Documentation as soon as reasonably practicable.
//
//     7. GOVERNING LAW AND JURISDICTION. This Agreement is governed by the statutes and laws of the State of
//     California, without regard to the conflicts of law principles thereof.  If any part of this Agreement is
//     found void and unenforceable, it will not affect the validity of the balance of the Agreement, which shall
//     remain valid and enforceable according to its terms.  Any dispute arising out of or related to this Agreement
//     shall be brought in the courts of Santa Clara County, California, USA.
//

(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/EventSink.js":[function(require,module,exports){
"use strict";

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.paypalRestSDK$ = exports.paypalRestMessageHelper$ = exports.paypalRestMerchantManager$ = exports.manticoreSetItem$ = exports.manticoreHTTP$ = exports.manticoreGetItem$ = exports.manticoreDeleteItem$ = exports.getSubject = exports["default"] = void 0;

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _manticore = _interopRequireDefault(require("manticore"));

var _curry = _interopRequireDefault(require("ramda/src/curry"));

var _rxjs = require("rxjs");

var _operators = require("rxjs/operators");

var _paypalrestManticore = require("@paypalcorp/paypalrest-manticore");

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context, _context2;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
} // import log from '@paypalcorp/manticore-log';
// const Log = log('EventSink');


var merchantManagerEvents = new _set["default"]([_paypalrestManticore.events.end, _paypalrestManticore.events.tokenRefreshed, _paypalrestManticore.events.tokenExpired]);
var messageHelperEvents = new _set["default"]([_paypalrestManticore.events.tokenExpired, _paypalrestManticore.events.resume, _paypalrestManticore.events.handlingTokenExpiry]);
var sdkEvents = new _set["default"]([_paypalrestManticore.events.networkOffline, _paypalrestManticore.events.untrustedNetwork]);

var paypalRestMerchantManager$ = _paypalrestManticore.eventSink.pipe((0, _filterInstanceProperty(_operators))(function (event) {
  return merchantManagerEvents.has(event);
}));

exports.paypalRestMerchantManager$ = paypalRestMerchantManager$;

var paypalRestMessageHelper$ = _paypalrestManticore.eventSink.pipe((0, _filterInstanceProperty(_operators))(function (event) {
  return messageHelperEvents.has(event);
}));

exports.paypalRestMessageHelper$ = paypalRestMessageHelper$;

var paypalRestSDK$ = _paypalrestManticore.eventSink.pipe((0, _filterInstanceProperty(_operators))(function (event) {
  return sdkEvents.has(event);
}));

exports.paypalRestSDK$ = paypalRestSDK$;
var manticoreSetItem$ = (0, _curry["default"])(function (storageType, fileObject) {
  return new _rxjs.Observable(function (observer) {
    _manticore["default"].setItem(fileObject.fileName, storageType, fileObject.fileContents, function (error) {
      if (error) {
        observer.error(error);
      } else {
        // On the native platforms the fileNames are SHA256 hashed depending on the storage type being used
        observer.next(_objectSpread({}, fileObject));
        observer.complete();
      }
    });
  });
});
exports.manticoreSetItem$ = manticoreSetItem$;
var manticoreGetItem$ = (0, _curry["default"])(function (storageType, fileName) {
  return new _rxjs.Observable(function (observer) {
    _manticore["default"].getItem(fileName, storageType, function (error, fileContents) {
      if (error) {
        observer.error(error);
      } else {
        observer.next({
          fileName: fileName,
          fileContents: fileContents
        });
        observer.complete();
      }
    });
  });
});
exports.manticoreGetItem$ = manticoreGetItem$;
var manticoreDeleteItem$ = (0, _curry["default"])(function (storageType, fileName) {
  return new _rxjs.Observable(function (observer) {
    _manticore["default"].deleteItem(fileName, storageType, function (error) {
      if (error) {
        observer.error(error);
      } else {
        observer.next({
          fileName: fileName
        });
        observer.complete();
      }
    });
  });
});
exports.manticoreDeleteItem$ = manticoreDeleteItem$;

var manticoreHTTP$ = function manticoreHTTP$(options) {
  return new _rxjs.Observable(function (observer) {
    // Log.developer('manticoreHTTP$', { options });
    _manticore["default"].http(options, function (error, response) {
      if (error) {
        observer.error(error);
      } else {
        observer.next(response);
        observer.complete();
      }
    });
  });
};

exports.manticoreHTTP$ = manticoreHTTP$;

var getSubject = function getSubject() {
  return new _rxjs.Subject();
};

exports.getSubject = getSubject;
var obj = {};
var _default = obj;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/paypalrest-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/index.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","ramda/src/curry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curry.js","rxjs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/index.js","rxjs/operators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/operators/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/BraintreeConfig.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
var config = {
  live: {
    base_url: 'https://api.braintreegateway.com/oauth/connect',
    redirect_url: encodeURIComponent('https://www.pph-bt-integration.com'),
    client_id: encodeURIComponent('client_id$production$bgr43xhrvnmgcy9d'),
    scope: 'customer:update,customer:find'
  },
  sandbox: {
    base_url: 'https://api.sandbox.braintreegateway.com/oauth/connect',
    redirect_url: encodeURIComponent('http://www.pph-bt-integration.com'),
    client_id: encodeURIComponent('client_id$sandbox$cxk9dt6cqjccyd7w'),
    scope: 'customer:update,customer:find'
  },
  stage: {
    base_url: 'https://api.sandbox.braintreegateway.com/oauth/connect',
    redirect_url: encodeURIComponent('http://www.pph-bt-integration.com'),
    client_id: encodeURIComponent('client_id$sandbox$p7fpvfz7ksyxmrgs'),
    scope: 'customer:update,customer:find'
  }
};
var _default = config;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/BraintreeManager.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _moment = _interopRequireDefault(require("moment"));

var _url = _interopRequireDefault(require("url"));

var _BraintreeConfig = _interopRequireDefault(require("./BraintreeConfig"));

var _sdkErrors = require("./sdkErrors");

var _Merchant = _interopRequireDefault(require("./Merchant"));

var Log = (0, _manticoreLog["default"])('BraintreeManager');
/**
 * BraintreeManager is responsible for exposing APIs regarding the BrainTree interfaces
 * @class
 */

var BraintreeManager = /*#__PURE__*/function () {
  /**
   * Construct a new DeviceManger
   * @private
   */
  function BraintreeManager() {
    (0, _classCallCheck2["default"])(this, BraintreeManager);
    this.btStateValue = null;
    this.btAuthCode = null;
  }

  (0, _createClass2["default"])(BraintreeManager, [{
    key: "authCode",
    get: function get() {
      return this.btAuthCode;
    }
  }, {
    key: "reset",
    value: function reset() {
      this.btStateValue = null;
      this.btAuthCode = null;
    }
    /**
     * Returns the login URL for BrainTree account login
     * @returns {string} btURL returns the bt login url with the appended state value parameter
     */

  }, {
    key: "getBtLoginUrl",
    value: function getBtLoginUrl() {
      var _context, _context2, _context3, _context4;

      if (!_Merchant["default"].active) {
        throw _sdkErrors.merchant.notInitialized.withDevMessage('You must have an active PP merchant to login to your ' + 'Braintree account. Call InitializeMerchant first, and wait for it to complete.');
      }

      var env = 'stage';

      if (_Merchant["default"].sdkEnvironment && _Merchant["default"].sdkEnvironment.environment === 'live') {
        env = 'live';
      } else if (_Merchant["default"].sdkEnvironment && _Merchant["default"].sdkEnvironment.environment === 'sandbox') {
        env = 'sandbox';
      }

      Log.debug(function () {
        return "environment for BT login URL is ".concat(env);
      });
      var configEnv = _BraintreeConfig["default"][env];

      if (!configEnv) {
        Log.error("BtLoginUrl environment ".concat(env, " set to unsupported environment"));
        throw new Error('Braintree login environment is not set properly');
      }

      this.btStateValue = _moment["default"].utc().valueOf();
      return (0, _concat["default"])(_context = (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = (0, _concat["default"])(_context4 = "".concat(configEnv.base_url, "?client_id=")).call(_context4, configEnv.client_id, "&redirect_uri=")).call(_context3, configEnv.redirect_url, "&scope=")).call(_context2, configEnv.scope, "&state=")).call(_context, this.btStateValue);
    }
    /**
     * Checks if the returned URL contains the auth code and matches the state value in getBTLoginURL()
     * @param {string} returnUrl return URL which contains the auth code and state value parameters
     * @returns {bool} proceedWithUrlLoading returns if the url contains auth code and matches state value
     */

  }, {
    key: "isBtReturnUrlValid",
    value: function isBtReturnUrlValid(returnUrl) {
      var _this = this;

      if (!this.btStateValue) {
        throw _sdkErrors.merchant.failedToLoad.withDevMessage('No state value found for login call. Pls call getBtLoginUrl first.');
      }

      var parseURL = _url["default"].parse(returnUrl, true);

      Log.debug("checkUrlIfValidAndUpdateAuthCode ".concat((0, _stringify["default"])(parseURL, null, 2)));

      if (this.btStateValue && parseURL.query && parseURL.query.code && parseURL.query.merchantId && parseURL.query.state === this.btStateValue.toString()) {
        this.btAuthCode = parseURL.query.code;
        Log.debug(function () {
          return "checkUrlIfValidAndUpdateAuthCode btAuthCode ".concat(_this.btAuthCode);
        });
        return true;
      }

      return false;
    }
  }]);
  return BraintreeManager;
}();

var btMgr = new BraintreeManager(); // eslint-disable-line no-unused-vars

var _default = btMgr;
exports["default"] = _default;

},{"./BraintreeConfig":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/BraintreeConfig.js","./Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","./sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js","url":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/url/url.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/CachedServerFile.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _pphSdkEnums = require("@paypalcorp/pph-sdk-enums");

var Log = (0, _manticoreLog["default"])('cachedServerFile');
/**
 * The ServerBackedFile class is responsible to retrieve and cache a server backed file
 */

var CachedServerFile = /*#__PURE__*/function () {
  /**
   * @param fileId    - Unique Id to the file
   * @param remoteUrl - Server URL for the file
   */
  function CachedServerFile(fileId, remoteUrl) {
    (0, _classCallCheck2["default"])(this, CachedServerFile);
    this.url = remoteUrl;
    this.fileId = fileId;
    this.storageType = _pphSdkEnums.StorageType.Secure;
  }
  /**
   * Looks for a JSON file from local cache store, server and returns the most recent version
   * @param callback  -   Callback will be invoked with the error (if any) and http response as first and second parameters
   */


  (0, _createClass2["default"])(CachedServerFile, [{
    key: "get",
    value: function get(callback) {
      var _this = this;

      this._retrieveCachedFile(function (e, cachedJson) {
        var request = {
          url: _this.url,
          format: 'json',
          headers: {}
        };

        if (cachedJson && cachedJson.headers) {
          var lm = cachedJson.headers['Last-Modified'];
          var eTag = cachedJson.headers.ETag;

          if (lm) {
            request.headers['If-Modified-Since'] = lm;
          }

          if (eTag) {
            request.headers['If-None-Match'] = eTag;
          }
        }

        Log.debug(function () {
          var _context;

          return (0, _concat["default"])(_context = "GET File ".concat(_this.fileId, "\nRequest: ")).call(_context, (0, _stringify["default"])(request));
        });

        _manticore["default"].http(request, function (err, response) {
          if (err || response && response.statusCode >= 300) {
            Log[(response === null || response === void 0 ? void 0 : response.statusCode) === 304 ? 'debug' : 'error']('remoteFileLoadFailed', {
              statusCode: response === null || response === void 0 ? void 0 : response.statusCode,
              error: err ? err.message : 'undefined'
            });
            callback(null, cachedJson ? cachedJson.body : null);
          } else if (response.body) {
            _manticore["default"].setItem(_this.fileId, _this.storageType, (0, _stringify["default"])(response), function () {
              Log.debug(function () {
                return "Using server version of ".concat(_this.fileId);
              });
              callback(null, response.body);
            });
          } else {
            Log.debug(function () {
              return "Using CACHED version of ".concat(_this.fileId);
            });
            callback(null, cachedJson ? cachedJson.body : null);
          }
        });
      });
    }
  }, {
    key: "_retrieveCachedFile",
    value: function _retrieveCachedFile(callback) {
      var _this2 = this;

      _manticore["default"].getItem(this.fileId, this.storageType, function (e, cachedData) {
        if (e) {
          Log.warn('CachedFileLoadFailed', {
            id: _this2.fileId,
            type: _this2.storageType,
            err: e
          });
          callback(e, null);
          return;
        }

        try {
          callback(null, cachedData ? JSON.parse(cachedData) : null);
        } catch (err) {
          Log.warn('CachedFileParseFailed', {
            cachedData: cachedData,
            err: err
          });
          callback(err, null);
        }
      });
    }
  }]);
  return CachedServerFile;
}();

exports["default"] = CachedServerFile;

},{"@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/pph-sdk-enums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/index.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/FakeResponseProvider.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _reduceInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/reduce");

var _Object$keys2 = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$create = require("@babel/runtime-corejs3/core-js-stable/object/create");

var _Symbol$replace = require("@babel/runtime-corejs3/core-js-stable/symbol/replace");

var _sliceInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.test = exports["default"] = void 0;

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.split.js");

require("core-js/modules/es.string.replace.js");

require("core-js/modules/es.regexp.constructor.js");

require("core-js/modules/es.regexp.to-string.js");

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _setPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/setPrototypeOf"));

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _every = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/every"));

var _startsWith = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/starts-with"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _entries = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/entries"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _flat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/flat"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _sort = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort"));

var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _isEmpty = _interopRequireDefault(require("ramda/src/isEmpty"));

var _zip = _interopRequireDefault(require("ramda/src/zip"));

var _pipe = _interopRequireDefault(require("ramda/src/pipe"));

var _omit = _interopRequireDefault(require("ramda/src/omit"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _lib = _interopRequireDefault(require("jsonpath/lib"));

var _qs = _interopRequireDefault(require("qs"));

var _config = _interopRequireDefault(require("./Hereapimock/config.json"));

var _responses = _interopRequireDefault(require("./Hereapimock/responses"));

var _context;

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys2(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty2(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context20, _context21;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context20 = ownKeys(Object(source), !0)).call(_context20, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context21 = ownKeys(Object(source))).call(_context21, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}

function _wrapRegExp() {
  _wrapRegExp = function _wrapRegExp(re, groups) {
    return new BabelRegExp(re, void 0, groups);
  };

  var _super = RegExp.prototype,
      _groups = new _WeakMap();

  function BabelRegExp(re, flags, groups) {
    var _this = new RegExp(re, flags);

    return _groups.set(_this, groups || _groups.get(re)), (0, _setPrototypeOf2["default"])(_this, BabelRegExp.prototype);
  }

  function buildGroups(result, re) {
    var _context19;

    var g = _groups.get(re);

    return _reduceInstanceProperty2(_context19 = _Object$keys2(g)).call(_context19, function (groups, name) {
      return groups[name] = result[g[name]], groups;
    }, _Object$create(null));
  }

  return (0, _inherits2["default"])(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (str) {
    var result = _super.exec.call(this, str);

    return result && (result.groups = buildGroups(result, this)), result;
  }, BabelRegExp.prototype[_Symbol$replace] = function (str, substitution) {
    if ("string" == typeof substitution) {
      var groups = _groups.get(this);

      return _super[_Symbol$replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
        return "$" + groups[name];
      }));
    }

    if ("function" == typeof substitution) {
      var _this = this;

      return _super[_Symbol$replace].call(this, str, function () {
        var args = arguments;
        return "object" != (0, _typeof2["default"])(args[args.length - 1]) && (args = _sliceInstanceProperty2([]).call(args)).push(buildGroups(args, _this)), substitution.apply(this, args);
      });
    }

    return _super[_Symbol$replace].call(this, str, substitution);
  }, _wrapRegExp.apply(this, arguments);
}

var Log = (0, _manticoreLog["default"])('FakeResponseProvider');
var prevHttp = (0, _bind["default"])(_context = _manticore["default"].http).call(_context);
/*
 * Mimicking APIMocker's mocking.
 * Adding JSONPath based switching.
 */

/*
 * // Breaking the RegEx in to multiple lines breaks its named groups feature
 * const urlREArray = [
 *   /(?<protocol>https|http(?=:\/{2}))?/,
 *   /(?<protocolString>:\/{2})?/,
 *   /(?<domainAddress>[a-z.:0-9]*)?/,
 *   /(?<slug>\/[a-z0-9/:]*)?/,
 *   /(?<qs>\?.*)?/,
 * ];
 * const urlRE = new RegExp(urlREArray.map(re => re.source).join(''));
 */
// eslint-disable-next-line max-len,no-useless-escape

var urlRE = /*#__PURE__*/_wrapRegExp(/(https|http(?=:\/{2}))?(:\/{2})?([a-z.:0-9-]*)?(\/[a-zA-Z0-9-/.:]*)?(\?.*)?/, {
  protocol: 1,
  protocolString: 2,
  domainAddress: 3,
  slug: 4,
  queryString: 5
});

function getURLParts(url) {
  var _urlRE$exec$groups, _urlParts$slug;

  var urlParts = (_urlRE$exec$groups = urlRE.exec(url).groups) !== null && _urlRE$exec$groups !== void 0 ? _urlRE$exec$groups : {};
  urlParts.slug = (_urlParts$slug = urlParts.slug) === null || _urlParts$slug === void 0 ? void 0 : (0, _slice["default"])(_urlParts$slug).call(_urlParts$slug, 1);
  return urlParts;
}
/*
 * Compare the URL, from manticore.http, with the API path specified in Hereapimock/config.js
 */


function compareUrlPathAndApiPath(urlPath) {
  var urlPathVerbs = urlPath.split('/');
  return function () {
    var apiPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
    var apiPathVerbs = apiPath.split('/');

    if ((urlPathVerbs === null || urlPathVerbs === void 0 ? void 0 : urlPathVerbs.length) > 0 && (apiPathVerbs === null || apiPathVerbs === void 0 ? void 0 : apiPathVerbs.length) > 0 && urlPathVerbs.length === apiPathVerbs.length) {
      var tuples = (0, _zip["default"])(urlPathVerbs, apiPathVerbs);
      return (0, _every["default"])(tuples).call(tuples, function (_ref) {
        var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
            first = _ref2[0],
            second = _ref2[1];

        return (0, _startsWith["default"])(second).call(second, ':') || first === second;
      });
    }

    return false;
  };
}

function getWebServiceKey() {
  var _context2;

  var urlSlug = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  var compareUrlPathWith = compareUrlPathAndApiPath(urlSlug);
  return (0, _find["default"])(_context2 = (0, _keys["default"])(_config["default"].webServices)).call(_context2, function (apiPath) {
    return compareUrlPathWith(apiPath);
  });
}

function getSwitchKeyForBody(data) {
  var webServiceKey = data.webServiceKey,
      _data$body = data.body,
      json = _data$body === void 0 ? {} : _data$body;
  var switches = data[webServiceKey]["switch"];

  var jsonPathKVString = function jsonPathKVString(switchPath) {
    var jsonPathValue = _lib["default"].query(json, switchPath);

    return jsonPathValue !== null && jsonPathValue !== void 0 && jsonPathValue[0] ? [switchPath, jsonPathValue[0]] : ['', ''];
  };

  if (switches instanceof Array) {
    data.bodySwitchKey = (0, _map["default"])(switches).call(switches, jsonPathKVString);
    return data;
  }

  if (typeof switches === 'string') {
    var jsonPathValue = _lib["default"].query(json, switches);

    data.bodySwitchKey = jsonPathValue !== null && jsonPathValue !== void 0 && jsonPathValue[0] ? [[switches, jsonPathValue[0]]] : [['', '']];
    return data;
  }

  data.bodySwitchKey = [['', '']];
  return data;
}

function getSwitchKeyForURLSlug(data) {
  var _context3;

  var slug = data.slug,
      webServiceKey = data.webServiceKey;
  var tuples = (0, _zip["default"])(webServiceKey.split('/'), slug.split('/'));
  var switchKey = (0, _map["default"])(_context3 = (0, _filter["default"])(tuples).call(tuples, function (_ref3) {
    var _ref4 = (0, _slicedToArray2["default"])(_ref3, 1),
        first = _ref4[0];

    return (0, _startsWith["default"])(first).call(first, ':');
  })).call(_context3, function (_ref5) {
    var _ref6 = (0, _slicedToArray2["default"])(_ref5, 2),
        first = _ref6[0],
        second = _ref6[1];

    return [(0, _slice["default"])(first).call(first, 1), second];
  });
  data.slugSwitchKey = (0, _isEmpty["default"])(switchKey) ? [['', '']] : switchKey;
  return data;
}

function getSwitchKeyForQueryString(data) {
  var _context4;

  var queryString = data.queryString;

  var queryParameters = _qs["default"].parse(queryString || '', {
    ignoreQueryPrefix: true
  });

  var switchKey = (0, _map["default"])(_context4 = (0, _entries["default"])(queryParameters)).call(_context4, function (entry) {
    return entry;
  });
  data.qsSwitchKey = (0, _isEmpty["default"])(switchKey) ? [['', '']] : switchKey;
  return data;
}

var getSwitchKey = (0, _pipe["default"])(getSwitchKeyForBody, getSwitchKeyForURLSlug, getSwitchKeyForQueryString);

function getSwitchResponse(data) {
  var body = data.body,
      webServiceKey = data.webServiceKey;
  var webService = data[webServiceKey];
  data.body = body && JSON.parse(body);

  if (webService["switch"] && webService.switchResponses) {
    var _context5, _context6, _context8, _context9, _context11, _context12, _context14, _context15, _context16, _context17;

    var _data = getSwitchKey(data);

    var slugSwitchKey = (0, _map["default"])(_context5 = (0, _filter["default"])(_context6 = _data.slugSwitchKey).call(_context6, function (_ref7) {
      var _context7;

      var _ref8 = (0, _slicedToArray2["default"])(_ref7, 1),
          first = _ref8[0];

      return first === webService["switch"] || (0, _includes["default"])(_context7 = webService["switch"]).call(_context7, first);
    })).call(_context5, function (_ref9) {
      var _ref10 = (0, _slicedToArray2["default"])(_ref9, 2),
          second = _ref10[1];

      return second;
    }).join('');
    var bodySwitchKey = (0, _flat["default"])(_context8 = (0, _filter["default"])(_context9 = _data.bodySwitchKey).call(_context9, function (_ref11) {
      var _context10;

      var _ref12 = (0, _slicedToArray2["default"])(_ref11, 1),
          first = _ref12[0];

      return first === webService["switch"] || (0, _includes["default"])(_context10 = webService["switch"]).call(_context10, first);
    })).call(_context8).join('');
    var queryParamSwitchKey = (0, _flat["default"])(_context11 = (0, _filter["default"])(_context12 = _data.qsSwitchKey).call(_context12, function (_ref13) {
      var _context13;

      var _ref14 = (0, _slicedToArray2["default"])(_ref13, 1),
          first = _ref14[0];

      return first === webService["switch"] || (0, _includes["default"])(_context13 = webService["switch"]).call(_context13, first);
    })).call(_context11).join('');
    var switchKey = (0, _concat["default"])(_context14 = (0, _concat["default"])(_context15 = "".concat(slugSwitchKey)).call(_context15, bodySwitchKey)).call(_context14, queryParamSwitchKey);
    var strictestToBroadestSwitchKeys = (0, _sort["default"])(_context16 = (0, _filter["default"])(_context17 = (0, _entries["default"])(_data[webServiceKey].switchResponses)).call(_context17, function (_ref15) {
      var _ref16 = (0, _slicedToArray2["default"])(_ref15, 1),
          key = _ref16[0];

      return (0, _includes["default"])(switchKey).call(switchKey, key);
    })).call(_context16, function (_ref17, _ref18) {
      var _ref19 = (0, _slicedToArray2["default"])(_ref17, 1),
          keyA = _ref19[0];

      var _ref20 = (0, _slicedToArray2["default"])(_ref18, 1),
          keyB = _ref20[0];

      return keyB.length - keyA.length;
    });

    var _ref21 = strictestToBroadestSwitchKeys[0] || [],
        _ref22 = (0, _slicedToArray2["default"])(_ref21, 2),
        _switchKey = _ref22[0],
        _switchResponse = _ref22[1];

    _data.switchKey = _switchKey;
    Log.debug('Added switch key', {
      calculatedSwitchKey: _data.switchKey,
      switchKey: _switchKey
    });
    _data.switchResponse = _switchResponse;
    return _data;
  }

  return data;
}

function getResponseBuilders(data) {
  var _webService$verbs;

  Log.debug('Faking response for:', data);
  var slug = data.slug,
      method = data.method;
  var webServiceKey = getWebServiceKey(slug);
  var webService = _config["default"].webServices[webServiceKey];
  var requestMethod = (method || 'get').toLowerCase();
  data.webServiceKey = webServiceKey;
  data[webServiceKey] = webService;

  if (webService !== null && webService !== void 0 && (_webService$verbs = webService.verbs) !== null && _webService$verbs !== void 0 && (0, _some["default"])(_webService$verbs).call(_webService$verbs, function (verb) {
    return verb === requestMethod;
  })) {
    var _webService$responses;

    var fromWebService = (0, _omit["default"])(['responses', 'switchResponses'], webService);
    var fromResponses = (_webService$responses = webService.responses) === null || _webService$responses === void 0 ? void 0 : _webService$responses[requestMethod];
    var fromSwitchResponses = getSwitchResponse(data).switchResponse;
    Log.debug('fromResponses:', {
      fromWebService: fromWebService,
      fromResponses: fromResponses,
      fromSwitchResponses: fromSwitchResponses
    });
    data.responseBuilder = fromSwitchResponses || fromResponses || fromWebService;
  }

  return data;
}

function fillResponse(data) {
  if (data.responseBuilder) {
    data.response = {
      statusCode: data.responseBuilder.httpStatus || 200
    };
    data.response.headers = _responses["default"][data.responseBuilder.headers];

    if (data.responseBuilder.mockBody === '@@request') {
      data.response.body = data.body;
    } else if (data.responseBuilder.mockBody) {
      data.response.body = JSON.parse(data.responseBuilder.mockBody);
    } else if (data.responseBuilder.mockFile) {
      data.response.body = _responses["default"][data.responseBuilder.mockFile];
    }
  }

  return data;
}

function jsonMap(obj) {
  var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (key, value) {
    return value;
  };

  if ((0, _isArray["default"])(obj)) {
    return (0, _map["default"])(obj).call(obj, function (value) {
      return jsonMap(value, cb);
    });
  }

  if ((0, _typeof2["default"])(obj) === 'object') {
    var traversedObj = {};
    var stack = [];
    stack.push.apply(stack, (0, _toConsumableArray2["default"])((0, _entries["default"])(obj)));

    while (stack.length > 0) {
      var _stack$pop = stack.pop(),
          _stack$pop2 = (0, _slicedToArray2["default"])(_stack$pop, 2),
          key = _stack$pop2[0],
          value = _stack$pop2[1];

      traversedObj[key] = (0, _typeof2["default"])(value) === 'object' ? jsonMap(value, cb) : cb(key, value);
    }

    return traversedObj;
  }

  return cb(undefined, obj);
}

function replaceTemplateLiteral(stringWithTemplateLiterals, requestParams) {
  if (typeof stringWithTemplateLiterals === 'string' && (0, _includes["default"])(stringWithTemplateLiterals).call(stringWithTemplateLiterals, '@')) {
    if ((0, _startsWith["default"])(stringWithTemplateLiterals).call(stringWithTemplateLiterals, '@@')) {
      var _requestParams$find = (0, _find["default"])(requestParams).call(requestParams, function (_ref23) {
        var _ref24 = (0, _slicedToArray2["default"])(_ref23, 1),
            key = _ref24[0];

        return "@@".concat(key) === stringWithTemplateLiterals;
      }),
          _requestParams$find2 = (0, _slicedToArray2["default"])(_requestParams$find, 2),
          switchValue = _requestParams$find2[1];

      return Number(switchValue);
    }

    return (0, _reduce["default"])(requestParams).call(requestParams, function (acc, _ref25) {
      var _ref26 = (0, _slicedToArray2["default"])(_ref25, 2),
          templateKey = _ref26[0],
          switchValue = _ref26[1];

      return acc.replace(new RegExp("@".concat(templateKey), 'g'), switchValue);
    }, stringWithTemplateLiterals);
  }

  return stringWithTemplateLiterals;
}

function fillTemplateFromSwitch(data) {
  var _data$responseBuilder;

  if ((_data$responseBuilder = data.responseBuilder) !== null && _data$responseBuilder !== void 0 && _data$responseBuilder.templateSwitch) {
    var templateSwitch = data.responseBuilder.templateSwitch;
    var requestParams = (0, _reduce["default"])(templateSwitch).call(templateSwitch, function (acc, _ref27) {
      var templateKey = _ref27.key,
          switchValue = _ref27["switch"];
      acc.push([templateKey, _lib["default"].query(data.body, switchValue)[0]]);
      return acc;
    }, []);
    data.response.body = jsonMap(data.response.body, function (key, value) {
      return replaceTemplateLiteral(value, requestParams);
    });
  }

  return data;
}

function fillJSONPathUpdates(data) {
  var _data$responseBuilder2;

  if ((_data$responseBuilder2 = data.responseBuilder) !== null && _data$responseBuilder2 !== void 0 && _data$responseBuilder2.jsonPathUpdates) {
    var _context18;

    data.response.body = (0, _reduce["default"])(_context18 = (0, _entries["default"])(data.responseBuilder.jsonPathUpdates)).call(_context18, function (acc, _ref28) {
      var _ref29 = (0, _slicedToArray2["default"])(_ref28, 2),
          key = _ref29[0],
          value = _ref29[1];

      _lib["default"].value(acc, key, value);

      return acc;
    }, data.response.body);
  }

  return data;
}

var _getResponse = (0, _pipe["default"])(getResponseBuilders, fillResponse, fillTemplateFromSwitch, fillJSONPathUpdates);

function getResponse(request) {
  var data = _getResponse(_objectSpread(_objectSpread({}, request), getURLParts(request.url)));

  return data.response;
}
/**
 * Provide Fake Response
 */


function enable() {
  Log.debug('enableFakeResponseProvider');

  _manticore["default"].http = function (opt, callback) {
    var response = getResponse(opt);
    Log.debug('SendingFakeResponse:', response);

    if (response) {
      callback(undefined, response);
    } else {
      prevHttp(opt, callback); // Falling back to internal network handler
    }
  };
}

function disable() {
  Log.debug('disableFakeResponseProvider');

  if (prevHttp && typeof prevHttp === 'function') {
    _manticore["default"].http = prevHttp;
  }
}

var _default = {
  enable: enable,
  disable: disable
};
exports["default"] = _default;
var test = {
  getURLParts: getURLParts,
  getSwitchKeyForBody: getSwitchKeyForBody,
  getSwitchKeyForURLSlug: getSwitchKeyForURLSlug,
  getSwitchKeyForQueryString: getSwitchKeyForQueryString,
  getSwitchResponse: getSwitchResponse
};
exports.test = test;

},{"./Hereapimock/config.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/config.json","./Hereapimock/responses":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/index.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/every":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/every.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/flat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flat.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js","@babel/runtime-corejs3/core-js-stable/instance/sort":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/sort.js","@babel/runtime-corejs3/core-js-stable/instance/starts-with":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/starts-with.js","@babel/runtime-corejs3/core-js-stable/object/create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/create.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/entries":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/entries.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/symbol/replace":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/replace.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/setPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/setPrototypeOf.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.regexp.constructor.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.constructor.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.replace.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","core-js/modules/es.string.split.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js","jsonpath/lib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/index.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","qs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/index.js","ramda/src/isEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isEmpty.js","ramda/src/omit":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/omit.js","ramda/src/pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipe.js","ramda/src/zip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/zip.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/config.json":[function(require,module,exports){
module.exports={
  "note": "This is a sample config file. You should change the mockDirectory to a more reasonable path.",
  "mockDirectory": "node_modules/apimocker/samplemocks/responses/",
  "mockDirectory": "/usr/local/lib/node_modules/apimocker/responses/",
  "mockDirectory": "responses/",
  "staticDirectory": "/file/system/path/to/static/directory",
  "staticPath": "/web/path/to/static/directory",
  "quiet": false,
  "port": "12326",
  "webServices": {
    "ping": {
      "mockFile": "pong.json",
      "latency": 20,
      "verbs": [
        "get"
      ]
    },
    "v1/oauth2/login": {
      "mockFile": "oauth_login.json",
      "verbs": [
        "get",
        "post"
      ]
    },
    "webapps/auth/protocol/openidconnect/v1/userinfo": {
      "mockFile": "userinfo-us.json",
      "verbs": [
        "get",
        "post"
      ]
    },
    "v1/onboarding/onboarding-sessions": {
      "mockFile": "onboardingSessions.json",
      "verbs": [
        "post"
      ]
    },
    "v1/onboarding/onboarding-sessions/:sessionId/users/:userId": {
      "mockFile": "userInfo_us.json",
      "verbs": [
        "get",
        "patch"
      ]
    },
    "v1/onboarding/onboarding-sessions/:sessionId/accounts/:userId": {
        "mockFile": "getUserId.json",
        "verbs": [
            "get",
            "patch"
        ]
    },
    "v1/onboarding/onboarding-sessions/:sessionId/submit": {
        "mockFile": "onboardingSubmitApproved.json",
        "verbs": [
            "post"
        ]
    },
    "v1/secure-terminal/cal": {
      "mockFile": "cal.json",
      "verbs": [
        "post"
      ]
    },
    "v1/retail/secure-terminal-config/cal": {
      "mockFile": "cal.json",
      "verbs": [
        "post"
      ]
    },
    "v1/payments/secure-terminal-payments/tokens": {
      "verbs": ["post"],
      "switch": "$..customer_id",
      "switchResponses": {
        "$..customer_id0": {
          "httpStatus": 500,
          "mockFile": "failVault.json"
        },
        "$..customer_id1": {
          "httpStatus": 200,
          "mockFile": "passVault.json"
        },
        "$..customer_id2": {
          "httpStatus": 400,
          "mockFile": "declinedVault.json"
        }
      }
    },
    "v1/retail/initialize": {
      "mockFile": "initialize.json",
      "verbs": [
        "post"
      ]
    },
    "v1/retail/app/preferences": {
      "mockFile": "app-preferences.json",
      "verbs": [
        "get"
      ]
    },
    "v1/retail/profile/preferences": {
      "mockFile": "profile-preferences.json",
      "verbs": [
        "get",
        "put"
      ]
    },
    "v1/identity/openidconnect/userinfo": {
      "mockFile": "userinfo-us.json",
      "verbs": [
        "get"
      ]
    },
    "v1/retail/checkouts/:transactionId": {
      "mockFile": "continue-payment.json",
      "verbs": [
        "post",
        "put"
      ]
    },
    "v1/retail/checkouts/:transactionId/void": {
      "mockFile": "void-payment.json",
      "verbs": [
        "post"
      ]
    },
    "v1/retail/checkouts/:transactionId/capture": {
      "mockFile": "capture_success.json",
      "verbs": [
        "post"
      ]
    },
    "v1/retail/checkouts": {
      "verbs": [
        "post",
        "get"
      ],
      "switch": [
        "paymentType",
        "$..vendor",
        "$..inputType",
        "total",
        "statuses",
        "invoiceId"
      ],
      "responses": {
        "post": {
          "httpStatus": 200,
          "mockFile": "MTP_default_success_response.json"
        }
      },
      "switchResponses": {
        "statusesPENDING,CANCELED": {
          "httpStatus": 200,
          "mockFile": "auth_list.json"
        },
        "paymentTypecash": {
          "httpStatus": 200,
          "mockFile": "MTP_default_success_response_noTxnId.json"
        },
        "paymentTypecheck": {
          "httpStatus": 200,
          "mockFile": "MTP_default_success_response_noTxnId.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypechip": {
          "httpStatus": 200,
          "mockFile": "MTP_success_response_chip.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypeCONTACTLESS_CHIP": {
          "httpStatus": 200,
          "mockFile": "MTP_success_response_contactless_chip.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypeCONTACTLESS_MSD": {
          "httpStatus": 200,
          "mockFile": "MTP_success_response_contactless_msd.json"
        },
        "invoiceIdINV2-B3E7-ZSPG-YL3E-XC86": {
          "httpStatus": 422,
          "mockFile": "MTP_failed_response_580031_badCard.json"
        },
        "invoiceIdINV2-UH7N-98KC-OLC9-PQXE": {
          "httpStatus": 422,
          "mockFile": "MTP_failed_response_580031_no_warnings_bad_card.json"
        },
        "invoiceIdINV2-N38U-5NUP-KHQF-DTV8": {
          "httpStatus": 500,
          "headers": "MTP_failed_due_to_outage_headers.json",
          "mockFile": "MTP_failed_due_to_outage.json"
        },
        "paymentTypecard$..inputTypekeyIntotal4444": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_580031_badCard.json"
        },
        "paymentTypecard$..inputTypescantotal4444": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_580031_badCard.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypechiptotal4444": {
          "httpStatus": 400,
          "mockFile": "MTP_default_failed_response.json"
        },
        "paymentTypecard$..vendorROAM$..inputTypeswipetotal4444": {
          "httpStatus": 400,
          "mockFile": "MTP_default_failed_response.json"
        },
        "paymentTypecard$..vendorMAGTEK$..inputTypeswipetotal4444": {
          "httpStatus": 400,
          "mockFile": "MTP_default_failed_response.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypeCONTACTLESS_CHIPtotal4444": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600075_miuraErrorContactless.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypeCONTACTLESS_MSDtotal4444": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600075_miuraErrorContactless.json"
        },
        "paymentTypecard$..vendorROAM$..inputTypeswipetotal4.01": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_580022_81swipeErrorTrackSpace.json"
        },
        "paymentTypecard$..vendorMAGTEK$..inputTypeswipetotal4.01": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_580022_81swipeErrorTrackSpace.json"
        },
        "paymentTypecard$..inputTypekeyIntotal4.02": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_580022_57keyInErrorInvalidCardData.json"
        },
        "paymentTypecard$..vendorROAM$..inputTypeswipetotal4.03": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_580029_85swipeErrorKSNEmpty.json"
        },
        "paymentTypecard$..vendorMAGTEK$..inputTypeswipetotal4.03": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_580029_85swipeErrorKSNEmpty.json"
        },
        "paymentTypecard$..inputTypekeyIntotal4.04": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_5800029_58keyInErrorMissingExpDate.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypechiptotal4.05": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_580031_29miuraErrorAUDeclineRetry.json"
        },
        "paymentTypecard$..vendorROAM$..inputTypeswipetotal4.06": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600000_6swipeErrorRestrectedJCB.json"
        },
        "paymentTypecard$..vendorMAGTEK$..inputTypeswipetotal4.06": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600000_6swipeErrorRestrectedJCB.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypechiptotal4.07": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600002_49miuraErrorLockedSellerAccount.json"
        },
        "paymentTypecard$..vendorROAM$..inputTypeswipetotal4.08": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600020_JCBcardNotSupported.json"
        },
        "paymentTypecard$..vendorMAGTEK$..inputTypeswipetotal4.08": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600020_JCBcardNotSupported.json"
        },
        "paymentTypecard$..vendorROAM$..inputTypeswipetotal4.09": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600025_88swipeErrorTrack1Invalid.json"
        },
        "paymentTypecard$..vendorMAGTEK$..inputTypeswipetotal4.09": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600025_88swipeErrorTrack1Invalid.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypechiptotal4.11": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600164_10miuraErrorIncorrectAUOnlinePin.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypechiptotal4.12": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600165_9miuraErrorAUOnlinePinMaxTryExceed.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypechiptotal4.13": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600166_11miuraErrorUnableToVerifyAUOnlinePin.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypeCONTACTLESS_CHIPtotal4.14": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600075_miuraErrorContactless.json"
        },
        "paymentTypecard$..vendorMiura$..inputTypeCONTACTLESS_MSDtotal4.15": {
          "httpStatus": 400,
          "mockFile": "MTP_failed_response_600075_miuraErrorContactless.json"
        },
        "invoiceIdINV2-4M3W-827W-NBMM-M56J": {
          "httpStatus": 422,
          "mockFile": "MTP_declined_response_580031_miuraErrorContactChip.json"
        },
        "invoiceIdINV2-EMQV-9N9Q-VRWM-YJ9Q": {
          "httpStatus": 422,
          "mockFile": "MTP_declined_response_580031_miuraErrorChip.json"
        },
        "invoiceIdINV2-YTTH-ENBF-EPM6-VKQP": {
          "httpStatus": 422,
          "mockFile": "MTP_declined_response_580031_miuraErrorFBSwipe.json"
        },
        "invoiceIdINV2-3VFJ-SBLQ-WS2F-VNXE": {
          "httpStatus": 422,
          "mockFile": "MTP_declined_response_580031_miuraAuthErrorChip.json"
        },
        "invoiceIdINV2-5TNP-KBMM-TQJ7-RMJ9": {
          "httpStatus": 422,
          "mockFile": "MTP_declined_response_580031_miuraAuthErrorContactlessChip.json"
        }
      }
    },
    "v1/retail/pay/:transactionHandle/sendReceipt": {
      "mockFile": "MerchantSendReceipt_success_response.json",
      "verbs": [
        "post"
      ]
    },
    "v1/payments/qrcode-payment-sessions": {
      "mockFile": "QRCode_payment_sessions.json",
      "verbs": ["post"]
    },
    "v1/payments/qrcode-payment-sessions/:id": {
      "mockFile": "QRCode_payment_status_9.json",
      "verbs": ["get"],
      "switch": "id",
      "switchResponses": {
        "uuid_merchant_ref_id": {
          "httpStatus": 200,
          "mockFile": "QRCode_payment_status_1.json"
        },
        "uuid_merchant_ref_id_1": {
          "httpStatus": 200,
          "mockFile": "QRCode_payment_status_2.json"
        },
        "uuid_merchant_ref_id_2": {
          "httpStatus": 200,
          "mockFile": "QRCode_payment_status_3.json"
        },
        "uuid_merchant_ref_id_3": {
          "httpStatus": 200,
          "mockFile": "QRCode_payment_status_4.json"
        },
        "uuid_merchant_ref_id_4": {
          "httpStatus": 200,
          "mockFile": "QRCode_payment_status_5.json"
        },
        "uuid_merchant_ref_id_5": {
          "httpStatus": 200,
          "mockFile": "QRCode_payment_status_6.json"
        },
        "uuid_merchant_ref_id_6": {
          "httpStatus": 200,
          "mockFile": "QRCode_payment_status_7.json"
        },
        "uuid_merchant_ref_id_7": {
          "httpStatus": 200,
          "mockFile": "QRCode_payment_status_8.json"
        }
      }
    },
    "v1/retail/checkouts/:transactionHandle/sendReceipt": {
      "mockFile": "MerchantSendReceipt_success_response.json",
      "verbs": [
        "post"
      ]
    },
    "v1/retail/checkouts/:transactionHandle/validateCard": {
      "mockFile": "RefundCheckEligibility_success_response.json",
      "verbs": [
        "post"
      ]
    },
    "v1/invoicing/invoices/:invoiceId": {
      "mockFile": "get_invoice_details.json",
      "verbs": [
        "get",
        "put"
      ],
      "switch": "invoiceId",
      "responses": {
        "put": {
          "httpStatus": 200,
          "mockFile": "PutInvoiceDetails_success_response.json"
        },
        "get": {
          "httpStatus": 200,
          "mockFile": "details.json"
        }
      },
      "switchResponses": {
        "INV2-75WU-JLDH-Z7MB-JLFS": {
          "httpStatus": 200,
          "mockFile": "details.json"
        }
      }
    },
    "v1/invoicing/invoices/:invoiceId/send": {
      "mockFile": "sendInvoice.json",
      "verbs": [
        "post"
      ],
      "responses": {
        "post": {
          "httpStatus": 200,
          "mockFile": "sendInvoice.json"
        }
      }
    },
    "v1/invoicing/invoices": {
      "mockBody": "@@request",
      "verbs": [
        "post"
      ],
      "jsonPathUpdates": {
        "$.id": "INV2-AVPK-WNNQ-E63E-MQ28"
      },
      "templateSwitch": [
        { "key": "gratuity", "switch": "$.gratuity.value" },
        { "key": "unitPrice", "switch": "$.items[0].unit_price.value"}
      ],
      "switch": ["$.gratuity.value", "$.items[0].unit_price.value"],
      "switchResponses": {
        "$.gratuity.value0.10$.items[0].unit_price.value1.00": {
          "httpStatus": 200,
          "jsonPathUpdates": {
            "$.id": "INV2-QYFN-TX8N-E0SJ-TORN"
          },
          "mockBody": "@@request"
        },
        "$.gratuity.value0.20$.items[0].unit_price.value1.00": {
          "__comment__": "MTP Failed Response 580031 Bad Card",
          "httpStatus": 200,
          "jsonPathUpdates": {
            "$.id": "INV2-B3E7-ZSPG-YL3E-XC86"
          },
          "mockBody": "@@request"
        },
        "$.gratuity.value0.21$.items[0].unit_price.value1.00": {
          "__comment__": "MTP Failed Response 580031 Bad Card; No Warnings",
          "httpStatus": 200,
          "jsonPathUpdates": {
            "$.id": "INV2-UH7N-98KC-OLC9-PQXE"
          },
          "mockBody": "@@request"
        },
        "$.gratuity.value0.30$.items[0].unit_price.value1.00": {
          "__comment__": "MTP Failed Due To Outage",
          "httpStatus": 200,
          "jsonPathUpdates": {
            "$.id": "INV2-N38U-5NUP-KHQF-DTV8"
          },
          "mockBody": "@@request"
        },
        "$.items[0].unit_price.value85.10": {
          "httpStatus": 200,
          "jsonPathUpdates": {
            "$.id": "INV2-4M3W-827W-NBMM-M56J"
          },
          "mockBody": "@@request"
        },
        "$.gratuity.value0.90$.items[0].unit_price.value84.20": {
          "__comment__": "MTP Chip Declined",
          "httpStatus": 200,
          "jsonPathUpdates": {
            "$.id": "INV2-EMQV-9N9Q-VRWM-YJ9Q"
          },
          "mockBody": "@@request"
        },
        "$.gratuity.value1.00$.items[0].unit_price.value84.10": {
          "__comment__": "MTP FB Swipe Declined",
          "httpStatus": 200,
          "jsonPathUpdates": {
            "$.id": "INV2-YTTH-ENBF-EPM6-VKQP"
          },
          "mockBody": "@@request"
        },
        "$.items[0].unit_price.value91.56": {
           "__comment__": "Contact Chip Auth Declined", 
          "httpStatus": 200,
          "jsonPathUpdates": {
            "$.id": "INV2-3VFJ-SBLQ-WS2F-VNXE"
          },
          "mockBody": "@@request"
        },
        "$.gratuity.value0.80$.items[0].unit_price.value84.30": {
          "__comment__": "Contactless Chip Auth Declined",
          "httpStatus": 200,
          "jsonPathUpdates": {
            "$.id": "INV2-5TNP-KBMM-TQJ7-RMJ9"
          },
          "mockBody": "@@request"
        }
      }
    },
    "v1/invoicing/search": {
      "mockFile": "search_invoice.json",
      "verbs": [
        "post"
      ]
    },
    "v1/retail/status": {
      "mockFile": "qrc_enabled_status.json",
      "verbs": [
        "get",
        "post"
      ],
      "switch": "Authorization",
      "switchResponses": {
        "Bearer pph-sdk-simulator-access-token": {
          "httpStatus": 200,
          "mockFile": "status.json"
        },
        "Bearer pph-sdk-simulator-access-token-qrc": {
          "httpStatus": 200,
          "mockFile": "qrc_enabled_status.json"
        }
      }
    },
    "webstatic/pph/device/:country/:vendor/:model/:stage/device_update_config.json": {
      "mockFile": "device_update_config_response.json",
      "verbs": [
        "get",
        "post"
      ]
    },
    "v1/retail/reader": {
      "mockFile": "reader.json",
      "verbs": [
        "get",
        "post"
      ]
    },
    "v1/retail/cardReaderDevice/:vendor/:model": {
      "mockFile": "get-card-reader-device.json",
      "verbs": [
        "get",
        "post"
      ],
      "responses": {
        "get": {
          "httpStatus": 200,
          "mockFile": "get-card-reader-device.json"
        },
        "post": {
          "httpStatus": 200,
          "mockFile": "post-card-reader-device.json"
        }
      }
    },
    "v2/devices/assets": {
      "mockFile": "devices-assets.json",
      "verbs": [
        "post"
      ]
    },
    "v2/retail/validate-config": {
      "mockFile": "validate-config.json",
      "verbs": [
        "post"
      ]
    },
    "v1/payments/sale/:invoiceId/refund": {
      "mockFile": "refund.json",
      "verbs": [
        "post"
      ]
    },
    "v1/mfsauth/proxy-auth/token": {
      "mockFile": "mfsauth-token.json",
      "verbs": [
        "post"
      ]
    },
    "v1/mfsauth/proxy-auth/secure-devicekey": {
      "mockFile": "mfsauth-secure-devicekey.json",
      "verbs": [
        "post"
      ]
    },
    "v1/mfsconsumer/config": {
      "mockFile": "mfsconsumer-config.json",
      "verbs": [
        "get"
      ]
    },
    "v1/mfsconsumer/wallet/devices": {
      "mockFile": "mfsconsumer-devices.json",
      "verbs": [
        "post"
      ]
    },
    "v1/mfsauth/proxy-auth/to_logout": {
      "mockFile": "mfsauth-to_logout.json",
      "verbs": [
        "post"
      ]
    },
    "v1/beta/paypalhere/reporting//txns/salesSummary/:timePeriod/:date": {
        "mockFile": "salesSummary.json",
        "verbs": [
            "get"
        ],
        "switch": "timePeriod",
        "responses": {
            "get": {
                "httpStatus": 200,
                "mockFile": "salesSummary.json"
            }
        },
        "switchResponses": {
            "Weekly": {
                "httpStatus": 200
            },
            "Monthly": {
                "httpStatus": 200,
                "mockFile": "salesSummary.json"
            },
            "Yearly": {
                "httpStatus": 200,
                "mockFile": "salesSummary.json"
            }
        }
    },
    "v1/beta/paypalhere/reporting//empSalesReport/:timePeriod/:date": {
        "mockFile": "empSalesReport.json",
        "verbs": [
            "get"
        ],
        "switch": "timePeriod",
        "responses": {
            "get": {
                "httpStatus": 200,
                "mockFile": "empSalesReport.json"
            }
        },
        "switchResponses": {
            "Weekly": {
                "httpStatus": 200,
                "mockFile": "empSalesReport.json"
            },
            "Monthly": {
                "httpStatus": 200,
                "mockFile": "empSalesReport.json"
            },
            "Yearly": {
                "httpStatus": 200,
                "mockFile": "empSalesReport.json"
            }
        }
    },
    "v1/beta/paypalhere/reporting//productReport/:timePeriod/:date": {
        "mockFile": "productReport.json",
        "verbs": [
            "get"
        ],
        "switch": "timePeriod",
        "responses": {
            "get": {
                "httpStatus": 200,
                "mockFile": "productReport.json"
            }
        },
        "switchResponses": {
            "Weekly": {
                "httpStatus": 200,
                "mockFile": "productReport.json"
            },
            "Monthly": {
                "httpStatus": 200,
                "mockFile": "productReport.json"
            },
            "Yearly": {
                "httpStatus": 200,
                "mockFile": "productReport.json"
            }
        }
    },
    "v1/tracking/events": {
      "mockFile": "events.json",
      "verbs": [
        "post"
      ]
    },
    "v2/devices/limits": {
      "mockFile": "deviceLimit.json",
      "verbs": [
        "get"
      ]
    },
    "v1/mfsonboardingserv/user/verification/email": {
      "mockFile": "emailVerification.json",
      "verbs": [
        "post"
      ]
    },
    "v1/location/address-verify": {
      "mockFile": "addressVerification.json",
      "verbs": [
        "post"
      ]
    },
    "v1/mfspphonboardserv/user/onboard": {
      "verbs": [
        "post"
      ],
      "switch": "onBoardingResult",
      "switchResponses": {
        "onBoardingResultapproved": {
          "httpStatus": 200,
            "mockFile": "userOnboardingApproved.json"
          },
          "onBoardingResultdeclined": {
          "httpStatus": 200,
            "mockFile": "userOnboardingDeclined.json"
          },
          "onBoardingResultinprogress": {
            "httpStatus": 200,
            "mockFile": "userOnboardingInprogress.json"
          },
          "onBoardingResultmanual": {
            "httpStatus": 200,
            "mockFile": "userOnboardingManual.json"
          }
      }
    },
    "v1/wallet/@me/financial-instruments/balances/@self": {
      "mockFile": "financialInstrumentsBalance.json",
      "verbs": [
        "get"
      ]
    },
    "/v1/retail/profile/preferences": {
        "mockFile": "preferenceUpdateResponse.json",
        "verbs": [
            "post"
        ]
    },
    "webstatic/mobile/retail-sdk/feature-map.json": {
      "mockFile": "feature-map.json",
      "verbs": ["get"]
    }
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/CustomerCheckin_success_response.json":[function(require,module,exports){
module.exports={
  "id": "LM5VP6Y4JEGTE",
  "customerId": "P9NWEWTZSU942",
  "status": "active",
  "createDate": "2015-03-25T19:49:04.000+0000",
  "updateDate": "2015-03-25T19:49:04.000+0000",
  "expirationDate": "2015-03-25T21:49:06.000+0000",
  "location": {
    "latitude": 39.377996,
    "longitude": -121.921903,
    "id": "GHUM9926UY62Y",
    "name": "Milpitas Location325",
    "internalName": "Milpitas Location297",
    "mobility": "mobile",
    "address": {
      "line1": "Hamilton Ave",
      "line2": "Bldg 17",
      "city": "San Jose",
      "state": "CA",
      "postalCode": "95134",
      "country": "US"
    },
    "tabType": "standard",
    "gratuityType": "none",
    "availability": "open",
    "tabExtensionType": "status",
    "tabExtensionButtonType": "free_form_text",
    "tabExtensionButtonText": "PayHERE",
    "tabExtensionUrl": "https://jj-integration-13926.stratus.dev.ebay.com:8443/jambajuice",
    "status": "active",
    "createDate": "2015-03-25T19:49:01.000+0000",
    "updateDate": "2015-03-25T19:49:01.000+0000"
  },
  "correlationId": "cdf89c9fb31e4"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/GetInvoiceDetails_success_response.json":[function(require,module,exports){
module.exports={
  "invoiceID": "INV2-ZY5L-5BWK-M2YG-XFTV",
  "invoiceDate": "2015-03-26T01:26:55.000+0000",
  "createdDate": "2015-03-25T19:43:55.000+0000",
  "merchantEmail": "pphan-au-b10@paypal.com",
  "payerEmail": "rnallur-biz@paypal.com",
  "currencyCode": "AUD",
  "number": "0033",
  "status": "paid",
  "merchantInfo": {
    "businessName": "AU Biz Name",
    "address": {
      "line1": "AUOwner Street1",
      "line2": "AUOwner Street2",
      "city": "Melbourne",
      "state": "Victoria",
      "postalCode": "3001",
      "country": "AU"
    }
  },
  "billingInfo": {
    "address": {
      
    }
  },
  "merchantMemo": "[CHIP(M,0467,Interoper. 11 13A)@(-37.928276,145.018881),(1436060055)]",
  "items": [
    {
      "name": "Guitar",
      "description": "test",
      "quantity": 1.0,
      "unitPrice": 1.99,
      "taxName": "tax",
      "taxRate": 1,
      "discountAmount": 0.0
    },
    {
      "name": "Violin",
      "quantity": 1.0,
      "unitPrice": 15.66,
      "discountAmount": 0.0
    }
  ],
  "discountAmount": 0.0,
  "receiptDetails": {
    "payment": {
      "method": "CHIP",
      "type": "M",
      "last": "0467",
      "name": "Interoper. 11 13A",
      "lat": "-37.928276",
      "lng": "145.018881",
      "txHandle": "1436060055"
    },
    "merchant": {
      "stmt": "JOESGENERIC"
    }
  },
  "total": 17.67,
  "payments": [
    {
      "date": "2015-03-25T19:44:17.000+0000",
      "transactionId": "30128382P5475824A"
    }
  ]
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/LocationDelete_success_response.json":[function(require,module,exports){
module.exports={
  "latitude": 39.377996,
  "longitude": -121.921903,
  "id": "GHUM9926UY62Y",
  "name": "Milpitas Location325",
  "internalName": "Milpitas Location297",
  "payerId": "EVPXZ8YG2XDSA",
  "mobility": "mobile",
  "address": {
    "line1": "Hamilton Ave",
    "line2": "Bldg 17",
    "city": "San Jose",
    "state": "CA",
    "postalCode": "95134",
    "country": "US"
  },
  "tabType": "standard",
  "gratuityType": "none",
  "availability": "closed",
  "tabExtensionType": "status",
  "tabExtensionButtonType": "free_form_text",
  "tabExtensionButtonText": "PayHERE",
  "tabExtensionUrl": "https://jj-integration-13926.stratus.dev.ebay.com:8443/jambajuice",
  "status": "deleted",
  "createDate": "2015-03-25T19:49:01.000+0000",
  "updateDate": "2015-03-25T19:49:01.000+0000",
  "correlationId": "52674d3cb7613"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/LocationGet_success_response.json":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/LocationDelete_success_response.json"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/LocationSave_success_response.json":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/LocationDelete_success_response.json"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/LocationUpdate_success_response.json":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/LocationDelete_success_response.json"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_declined_response_580031_miuraAuthErrorChip.json":[function(require,module,exports){
module.exports={
  "correlationId": "f335bf5580980",
  "errorCode": 580031,
  "errorType": "pay/bad_card",
  "message": "Please try another card",
  "developerMessage": "This credit card cannot be processed by PayPal",
  "authCode": "8A023531",
  "txnHandle": "1SR740775U196804A",
  "responseCode": "DECLINED"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_declined_response_580031_miuraAuthErrorContactlessChip.json":[function(require,module,exports){
module.exports={
  "correlationId": "5e1f9b1c89f49",
  "errorCode": 600075,
  "errorType": "pay/contactless_payment_declined",
  "message": "Contactless payment declined",
  "developerMessage": "Contactless payment declined, you may try again by inserting the card",
  "authCode": "8A023531",
  "txnHandle": "7MP710223F6091646",
  "responseCode": "DECLINED",
  "vendorResponseCode": "51"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_declined_response_580031_miuraErrorChip.json":[function(require,module,exports){
module.exports={
  "correlationId": "8c5d6d3f212bc",
  "errorCode": 580031,
  "errorType": "pay/bad_card",
  "message": "Please try another card",
  "developerMessage": "This credit card cannot be processed by PayPal",
  "authCode": "8A023531",
  "txnHandle": "5R542123EF086942E",
  "responseCode": "DECLINED"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_declined_response_580031_miuraErrorContactChip.json":[function(require,module,exports){
module.exports={
  "correlationId": "f20a979899af1",
  "errorCode": 580031,
  "errorType": "pay/bad_card",
  "message": "Please try another card",
  "developerMessage": "This credit card cannot be processed by PayPal",
  "authCode": "8A023531",
  "txnHandle": "2VV75043A7329730S",
  "responseCode": "DECLINED"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_declined_response_580031_miuraErrorFBSwipe.json":[function(require,module,exports){
module.exports={
  "correlationId": "74c707298e60d",
  "errorCode": 580031,
  "errorType": "pay/bad_card",
  "message": "Please try another card",
  "developerMessage": "This credit card cannot be processed by PayPal",
  "authCode": "",
  "txnHandle": "5L303938R5545282W",
  "responseCode": "DECLINED"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_default_failed_response.json":[function(require,module,exports){
module.exports={
  "correlationId": "246b35eadcf97",
  "invoiceId": "INV2-B3E7-ZSPG-YL3E-XC86",
  "warnings": [
    {
      "errorCode": 580031,
      "message": "Please try another card",
      "developerMessage": "This credit card cannot be processed by PayPal",
      "errorType": "pay/bad_card"
    }
  ],
  "transactionHandle": "60N78956476889607",
  "responseCode": "5100",
  "authCode": "910AB942B5CCCCFDFE1B30308A023030"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_default_success_response.json":[function(require,module,exports){
module.exports={
  "correlationId": "a18baf939783b",
  "transactionNumber": "1P402378L3750483S",
  "invoiceId": "INV2-S377-PXPR-SKYD-PT43",
  "transactionHandle": "9YK190794M692661U",
  "responseCode": "0000",
  "payerInfo": {
    "customerId": "XSCCTTQ9UJYDY",
    "maskedEmail": "rn*************@paypal.com",
    "receiptPreferenceToken": "94eLHLyRh5m4LhYxhh79yqmOl/g\u003d"
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_default_success_response_noTxnId.json":[function(require,module,exports){
module.exports={
  "correlationId": "24cd824aef7ba",
  "authCode": "8A023030",
  "invoiceId": "INV2-NPAV-S44M-VYAX-5Z8F"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_due_to_outage.json":[function(require,module,exports){
module.exports={
  "correlationId": "09c3e16c60af4",
  "errorCode": 600000,
  "message": "An internal server error has occurred., Field=null, Issue=INTERNAL_SERVICE_ERROR",
  "developerMessage": "An internal server error has occurred., Field=null, Issue=INTERNAL_SERVICE_ERROR",
  "errorType": "service_error"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_due_to_outage_headers.json":[function(require,module,exports){
module.exports={
  "Retry-After": "0",
  "Content-Type": "application/json",
  "APPLICATION_ID": "APP-2A128197VV566444R",
  "X-SLR-RETRY": "500",
  "Transfer-Encoding": "Identity",
  "X-SLR-RETRY-API": "/v1/retail/checkouts",
  "REFRESH": "",
  "CALLER_ACCT_NUM": "SZEKQNBKSSQ8L",
  "Date": "Thu, 13 May 2021 18:50:21 GMT",
  "BORDER-IP": "10.177.208.139",
  "Location": "",
  "Connection": "close",
  "paypal-debug-id": "09c3e16c60af4"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_5800029_58keyInErrorMissingExpDate.json":[function(require,module,exports){
module.exports={
  "correlationId": "f26d14114dd31",
  "errorCode": 580029,
  "message": "Missing field: expirationMonth",
  "developerMessage": "Your request is missing a field: expirationMonth",
  "errorType": "missing_field"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580022_57keyInErrorInvalidCardData.json":[function(require,module,exports){
module.exports={
  "correlationId": "163e64614620e",
  "errorCode": 580022,
  "message": "Invalid value for Mobile Merchant Tabs",
  "developerMessage": "You\u0027ve specified an invalid value in your request somewhere.",
  "errorType": "invalid_field"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580022_81swipeErrorTrackSpace.json":[function(require,module,exports){
module.exports={
  "correlationId": "15b52c7e0a8ce",
  "errorCode": 580022,
  "message": "Invalid value for Mobile Merchant Tabs",
  "developerMessage": "You\u0027ve specified an invalid value in your request somewhere.",
  "errorType": "invalid_field"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580029_85swipeErrorKSNEmpty.json":[function(require,module,exports){
module.exports={
  "correlationId": "b09591aa23c8e",
  "errorCode": 580029,
  "message": "Missing field: reader.keySerialNumber",
  "developerMessage": "Your request is missing a field: keySerialNumber on the object reader",
  "errorType": "missing_field"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580031_29miuraErrorAUDeclineRetry.json":[function(require,module,exports){
module.exports={
  "correlationId": "d30902e10bda6",
  "invoiceId": "INV2-VUZ3-9P65-M48M-QV64",
  "warnings": [
    {
      "errorCode": 580031,
      "message": "Please try another card",
      "developerMessage": "This credit card cannot be processed by PayPal",
      "errorType": "pay/bad_card"
    }
  ],
  "transactionHandle": "3P026782UC454844M",
  "responseCode": "9100",
  "authCode": "910AB942B5CCCCFDFE1B30308A023030"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580031_badCard.json":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_default_failed_response.json"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580031_no_warnings_bad_card.json":[function(require,module,exports){
module.exports={
  "correlationId": "f20a979899af1",
  "errorCode": 580031,
  "errorType": "pay/bad_card",
  "message": "Please try another card",
  "developerMessage": "This credit card cannot be processed by PayPal",
  "authCode": "8A023531",
  "txnHandle": "2VV75043A7329730S",
  "responseCode": "DECLINED"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600000_6swipeErrorRestrectedJCB.json":[function(require,module,exports){
module.exports={
  "correlationId": "907a966f1bb7a",
  "errorCode": 600000,
  "message": "MobileMerchantPaymentServ: Unknown Error Code: 506356",
  "errorType": "service_error"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600002_49miuraErrorLockedSellerAccount.json":[function(require,module,exports){
module.exports={
  "correlationId": "78d128fc17bbf",
  "errorCode": 600002,
  "message": "There was an error processing because of the merchant account issue",
  "errorType": "pay/processing_failure"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600020_JCBcardNotSupported.json":[function(require,module,exports){
module.exports={
  "correlationId": "decd5b6f0c401",
  "errorCode": 600020,
  "message": "This card type is not supported",
  "errorType": "pay/unsupported_card_type"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600025_88swipeErrorTrack1Invalid.json":[function(require,module,exports){
module.exports={
  "correlationId": "080220d13494a",
  "errorCode": 600025,
  "message": "Card Decryption Failure",
  "developerMessage": "We were unable to decrypt the presented creditCard",
  "errorType": "pay/card_decryption_failure"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600075_miuraErrorContactless.json":[function(require,module,exports){
module.exports={
  "correlationId": "e89b0c7ca8cde",
  "errorCode": 600075,
  "message": "ContactlessPaymentDeclined",
  "developerMessage": "Contactless payment declined. PPAPI RC: 15005&Pimp RC: 9203&AuthCode: 8A023635&TxnHandle: 93S40596D87699730&ResponseCode: 5100&VRC: 65",
  "authCode": "8A023635",
  "txnHandle": "93S40596D87699730",
  "responseCode": "5100",
  "vendorResponseCode": "65",
  "errorType": "pay/contactless_payment_declined"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600164_10miuraErrorIncorrectAUOnlinePin.json":[function(require,module,exports){
module.exports={
  "correlationId": "613fb430d395c",
  "errorCode": 6000164,
  "message": "OnlinePinIncorrect",
  "developerMessage": "The online pin provided is incorrect",
  "authCode": "910AB942B5CCCCFDFE1B30308A023030",
  "txnHandle": "2C0059125Y802711Y",
  "responseCode": "5500",
  "errorType": "pay/online_pin_incorrect"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600164_11miuraErrorUnableToVerifyAUOnlinePin.json":[function(require,module,exports){
module.exports={
  "correlationId": "03f3eec8d7482",
  "errorCode": 6000166,
  "message": "OnlinePinUnableToVerify",
  "developerMessage": "Unable to verify the online pin",
  "authCode": "910AB942B5CCCCFDFE1B30308A023030",
  "txnHandle": "2GM67900L80848913",
  "responseCode": "7900",
  "errorType": "pay/online_pin_unable_to_verify"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600165_9miuraErrorAUOnlinePinMaxTryExceed.json":[function(require,module,exports){
module.exports={
  "correlationId": "11a4bfa6cfec5",
  "errorCode": 6000165,
  "message": "OnlinePinMaxRetryExceed",
  "developerMessage": "The maximum retry for the online pin is exceeded",
  "authCode": "910AB942B5CCCCFDFE1B30308A023030",
  "txnHandle": "8MP33268GX6545336",
  "responseCode": "5130",
  "errorType": "pay/online_pin_maximum_retry_exceeded"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600166_11miuraErrorUnableToVerifyAUOnlinePin.json":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600164_11miuraErrorUnableToVerifyAUOnlinePin.json"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_success_response_contactless_chip.json":[function(require,module,exports){
module.exports={
  "correlationId": "ee6a842d7906d",
  "invoiceId": "INV2-NCVU-4GFY-8QH8-37FJ",
  "transactionHandle": "5RR944120J620570Y",
  "responseCode": "0000",
  "authCode": "710F9F1800860A04DA80279B9ADC8AE32572129F1800860D841E00000808620C3969A7A8F3910A112233445566778899008A023030"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_success_response_contactless_msd.json":[function(require,module,exports){
module.exports={
  "correlationId": "edc8acd050326",
  "transactionNumber": "5BS88924N9682272X",
  "invoiceId": "INV2-R89R-LRSU-HH55-P5Q2",
  "transactionHandle": "7YN92044WT331722L",
  "responseCode": "0000",
  "authCode": "8A023030",
  "payerInfo": {
    "customerId": "3U37YA4CBADYJ",
    "maskedEmail": "rn*************@paypal.com",
    "receiptPreferenceToken": "KDJtGHPy/w7ve3vKj2trZAqc5G0\u003d"
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MerchantSendReceipt_success_response.json":[function(require,module,exports){
module.exports={
  "correlationId": "66ce83af8cf77"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/PutInvoiceDetails_success_response.json":[function(require,module,exports){
module.exports={
  "id": "INV2-U5J4-4D4L-6UXW-UGHM",
  "number": "WEBSL190122100966",
  "template_id": "TEMP-86L91688122303050",
  "status": "PAID",
  "merchant_info": {
      "email": "pphan-us-b10@paypal.com",
      "business_name": "Joe's Generic Business",
      "address": {
          "line1": "3214265 Main Street 73836 Industrial Drive",
          "city": "Summit",
          "state": "NJ",
          "postal_code": "07901",
          "country_code": "US"
      }
  },
  "billing_info": [
      {}
  ],
  "shipping_info": {},
  "items": [
      {
          "name": "Item",
          "quantity": 1,
          "unit_price": {
              "currency": "USD",
              "value": "1.00"
          }
      }
  ],
  "tax_calculated_after_discount": false,
  "tax_inclusive": false,
  "merchant_memo": "[CHIP(M,1083)@(0,0),(1444696071)]",
  "total_amount": {
      "currency": "USD",
      "value": "1.50"
  },
  "gratuity": {
      "currency": "USD",
      "value": "0.50"
  },
  "payments": [
      {
          "type": "PAYPAL",
          "transaction_id": "0V691784PY677433G",
          "transaction_type": "SALE",
          "method": "PAYPAL",
          "date": "2019-01-28 16:22:44 PST",
          "amount": {
              "currency": "USD",
              "value": "1.50"
          }
      }
  ],
  "metadata": {
      "created_date": "2019-01-28 16:22:16 PST"
  },
  "additional_data": "{\"merchant\":{\"stmt\":\"JOESGENERIC\"},\"payment\":{\"method\":\"CHIP\",\"last\":\"1083\",\"txHandle\":\"1444696071\",\"action\":\"SALE\",\"type\":\"M\"}}",
  "allow_partial_payment": false,
  "paid_amount": {
      "paypal": {
          "currency": "USD",
          "value": "1.50"
      }
  },
  "allow_tip": false,
  "links": [
      {
          "rel": "self",
          "href": "https://msamster.stage.paypal.com/v1/invoicing/invoices/INV2-U5J4-4D4L-6UXW-UGHM",
          "method": "GET"
      },
      {
          "rel": "payer-view",
          "href": "https://www.msmaster.stage.paypal.com/invoice/p#INV2-U5J4-4D4L-6UXW-UGHM",
          "method": "GET"
      },
      {
          "rel": "merchant-view",
          "href": "https://www.msmaster.stage.paypal.com/invoice/details/INV2-U5J4-4D4L-6UXW-UGHM",
          "method": "GET"
      }
  ],
  "invoice_date_time": "2019-01-28 16:22:16 PST"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_sessions.json":[function(require,module,exports){
module.exports={
  "isFake": true,
  "invoice": {
    "id": "INV2-P6W6-UKUG-RVF8-KTE3",
    "invoice_number": "uuid999999999",
    "merchant_info": {
      "email": "merchant@example.com",
      "name": {
        "given_name": "John",
        "surname": "Smith"
      },
      "business_name": "Mitchell & Murray"
    },
    "purchase_units": [
      {
        "name": "Zoom System wireless headphones",
        "quantity": 2,
        "unit_price": {
          "currency": "USD",
          "value": "120"
        },
        "tax": {
          "name": "Tax",
          "percent": 8
        }
      },
      {
        "name": "Bluetooth speaker",
        "quantity": 1,
        "unit_price": {
          "currency": "USD",
          "value": "145"
        },
        "tax": {
          "name": "Tax",
          "percent": 8
        }
      }
    ],
    "discount": {
      "percent": 1
    },
    "shipping_cost": {
      "amount": {
        "currency": "USD",
        "value": "10"
      }
    },
    "total_amount": {
      "currency": "USD",
      "value": "421.95"
    }
  },
  "qrcode_payment_info": {
    "session_id": "uuid_merchant_ref_id",
    "invoice_id": "INV2-P6W6-UKUG-RVF8-KTE3",
    "tender_type": "QR_CODE",
    "status": "SESSION_CREATED",
    "events": [
      {
        "name": "SESSION_CREATED",
        "create_time": "2020-05-13T11:56:10+00:00"
      }
    ]
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_1.json":[function(require,module,exports){
module.exports="\n\ndata: {\"isFake\":\"true\",\"session_id\":\"uuid_merchant_ref_id_1\",\"tender_type\":\"QR_CODE\",\"invoice_id\":\"INV2-XXXX-XXXX-XXXX\",\"status\":\"SESSION_CREATED\",\"events\":[{\"name\":\"SESSION_CREATED\",\"create_time\":\"2020-05-13T11:56:10+00:00\"}]}\n\n"

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_2.json":[function(require,module,exports){
module.exports="\n\ndata: {\"isFake\":\"true\",\"session_id\":\"uuid_merchant_ref_id_2\",\"tender_type\":\"QR_CODE\",\"invoice_id\":\"INV2-XXXX-XXXX-XXXX\",\"status\":\"SCANNED\",\"events\":[{\"name\":\"SESSION_CREATED\",\"create_time\":\"2020-05-13T11:56:10+00:00\"},{\"name\":\"SCANNED\",\"create_time\":\"2020-05-13T11:57:10+00:00\"}]}\n\n"

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_3.json":[function(require,module,exports){
module.exports="\n\ndata: {\"isFake\":\"true\",\"session_id\":\"uuid_merchant_ref_id_3\",\"tender_type\":\"QR_CODE\",\"invoice_id\":\"INV2-XXXX-XXXX-XXXX\",\"status\":\"AWAITING_USER_INPUT\",\"events\":[{\"name\":\"SESSION_CREATED\",\"create_time\":\"2020-05-13T11:56:10+00:00\"},{\"name\":\"SCANNED\",\"create_time\":\"2020-05-13T11:57:10+00:00\"},{\"name\":\"AWAITING_USER_INPUT\",\"create_time\":\"2020-05-13T11:58:29+00:00\"}]}\n\n"

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_4.json":[function(require,module,exports){
module.exports="\n\ndata: {\"isFake\":\"true\",\"session_id\":\"uuid_merchant_ref_id_4\",\"tender_type\":\"QR_CODE\",\"invoice_id\":\"INV2-XXXX-XXXX-XXXX\",\"status\":\"AWAITING_USER_INPUT\",\"events\":[{\"name\":\"SESSION_CREATED\",\"create_time\":\"2020-05-13T11:56:10+00:00\"},{\"name\":\"SCANNED\",\"create_time\":\"2020-05-13T11:57:10+00:00\"},{\"name\":\"AWAITING_USER_INPUT\",\"create_time\":\"2020-05-13T11:58:29+00:00\"}]}\n\n"

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_5.json":[function(require,module,exports){
module.exports="\n\ndata: {\"isFake\":\"true\",\"session_id\":\"uuid_merchant_ref_id_5\",\"tender_type\":\"QR_CODE\",\"invoice_id\":\"INV2-XXXX-XXXX-XXXX\",\"status\":\"AWAITING_USER_INPUT\",\"events\":[{\"name\":\"SESSION_CREATED\",\"create_time\":\"2020-05-13T11:56:10+00:00\"},{\"name\":\"SCANNED\",\"create_time\":\"2020-05-13T11:57:10+00:00\"},{\"name\":\"AWAITING_USER_INPUT\",\"create_time\":\"2020-05-13T11:58:45+00:00\"}]}\n\n"

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_6.json":[function(require,module,exports){
module.exports="\n\ndata: {\"isFake\":\"true\",\"session_id\":\"uuid_merchant_ref_id_6\",\"tender_type\":\"QR_CODE\",\"invoice_id\":\"INV2-XXXX-XXXX-XXXX\",\"status\":\"PROCESSING\",\"events\":[{\"name\":\"SESSION_CREATED\",\"create_time\":\"2020-05-13T11:56:10+00:00\"},{\"name\":\"SCANNED\",\"create_time\":\"2020-05-13T11:57:10+00:00\"},{\"name\":\"AWAITING_USER_INPUT\",\"create_time\":\"2020-05-13T11:58:45+00:00\"},{\"name\":\"PROCESSING\",\"create_time\":\"2020-05-13T11:59:20+00:00\"}]}\n\n"

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_7.json":[function(require,module,exports){
module.exports="\n\ndata: {\"isFake\":\"true\",\"session_id\":\"uuid_merchant_ref_id_7\",\"tender_type\":\"QR_CODE\",\"invoice_id\":\"INV2-XXXX-XXXX-XXXX\",\"status\":\"PROCESSING\",\"events\":[{\"name\":\"SESSION_CREATED\",\"create_time\":\"2020-05-13T11:56:10+00:00\"},{\"name\":\"SCANNED\",\"create_time\":\"2020-05-13T11:57:10+00:00\"},{\"name\":\"AWAITING_USER_INPUT\",\"create_time\":\"2020-05-13T11:58:45+00:00\"},{\"name\":\"PROCESSING\",\"create_time\":\"2020-05-13T11:59:25+00:00\"}]}\n\n"

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_8.json":[function(require,module,exports){
module.exports="\n\ndata: {\"isFake\":\"true\",\"session_id\":\"uuid_merchant_ref_id_8\",\"tender_type\":\"QR_CODE\",\"invoice_id\":\"INV2-XXXX-XXXX-XXXX\",\"status\":\"SUCCESS\",\"events\":[{\"name\":\"SESSION_CREATED\",\"create_time\":\"2020-05-13T11:56:10+00:00\"},{\"name\":\"SCANNED\",\"create_time\":\"2020-05-13T11:57:10+00:00\"},{\"name\":\"AWAITING_USER_INPUT\",\"create_time\":\"2020-05-13T11:58:45+00:00\"},{\"name\":\"PROCESSING\",\"create_time\":\"2020-05-13T11:59:25+00:00\"},{\"name\":\"SUCCESS\",\"create_time\":\"2020-05-13T11:59:29+00:00\"}]}\n\n"

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_9.json":[function(require,module,exports){
module.exports="\n\ndata: {\"isFake\":\"true\",\"session_id\":\"uuid_merchant_ref_id\",\"tender_type\":\"QR_CODE\",\"invoice_id\":\"INV2-XXXX-XXXX-XXXX\",\"status\":\"FAILED\",\"events\":[{\"name\":\"FAILED\",\"create_time\":\"2020-05-13T11:56:10+00:00\"}]}\n\n"

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/RefundCheckEligibility_success_response.json":[function(require,module,exports){
module.exports={
  "correlationId": "d68da4301ef11",
  "status": "ELIGIBLE"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/app-preferences.json":[function(require,module,exports){
module.exports={ "correlationId": "074879c60b384", "preferences": { "ccStmtName": "JOESGENERIC", "tax": "on", "signature": "optional", "Coordinates": "{\"longitude\":-97.671615600585938,\"latitude\":30.407367706298828}" } }

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/auth_list.json":[function(require,module,exports){
module.exports={
  "items":[
    {
      "id":"6US13731BX985634V",
      "account": {
        "account_number":"1560650042406573577"
      },
      "time_created": "2020-07-10T23:43:50.000Z",
      "activity_type":"PAYMENT",
      "subtype":"AUTHORIZATION",
      "status":"PENDING",
      "detailed_status":"PENDING",
      "payee_details": {
        "type":"EMAIL",
        "value":"pphan-us-b10@paypal.com"
      },
      "counterparty": {
        "first_name":"PAYPASS",
        "last_name":"ETEC",
        "email":"rnallur-AUEmail@paypal.com",
        "name":"PAYPASS ETEC",
        "account_number":"1672169513437802967",
        "payment_id":"64L87673YX098394C"
      },
      "fee": {
        "currency_code":"USD",
        "value":"0.00"
      },
      "gross": {
        "currency_code":"USD",
        "value":"1.00"
      },
      "net": {
        "currency_code":"USD",
        "value":"1.00"
      },
      "gross_usd_amount":"1.00",
      "is_primary":true,
      "raw_status":"P",
      "internal_id":"X7ydeC-OAU9lQmvET4Jj6KmNemLYPx_ZZMf-939sDWBWJb7xotlMNxc8GJK",
      "extension":{
        "money_movements":[
          {
            "funding_source":{
              "id":"BALANCE"
            },
            "amount":{
              "currency_code":"USD",
              "value":"1.00"
            }
          },
          {
            "funding_source":{
              "last_four_digits":"0028",
              "instrument_type":"MCARD",
              "id":"1388313",
              "type":"CREDIT_CARD"
            },
            "amount":{
              "currency_code":null,
              "value":null
            }
          }
        ],
        "internal_id":"X7ydeC-OAU9lQmvET4Jj6KmNemLYPx_ZZMf-939sDWBWJb7xotlMNxc8GJK",
        "is_balance_affecting":false,
        "running_balance":{
          "currency_code":"USD",
          "value":"23902.02"
        },
        "debit_credit_code":"CREDIT",
        "service_marked_as_completed":true,
        "is_rtr_applicable":false,
        "is_incentive_refund":false,
        "channels":["DIRECT_CREDIT_CARD","MOBILE","PAYPAL_HERE"],
        "purposes":["INVOICE_PAYMENT"],
        "activity_id":"2TH78011VU814523A",
        "invoice_id":"INV2-N7MY-NK97-B2UF-B8KL",
        "tracking_information_added":false,
        "invoice_number":"INV2-N7MY-NK97-B2UF-B8KL",
        "is_handout_activity":false
      },
      "extensions":{
        "payment_properties":{
          "running_balance":{
            "currency_code":"USD",
            "value":"23902.02"
          },
          "purposes":["INVOICE_PAYMENT"],
          "channels":["DIRECT_CREDIT_CARD","MOBILE","PAYPAL_HERE"],
          "debit_credit_code":"CREDIT",
          "is_balance_affecting":false,
          "is_rtr_applicable":false,
          "invoice_id":"INV2-N7MY-NK97-B2UF-B8KL",
          "money_movements":[
            {
              "amount": {
                "currency_code":"USD",
                "value":"1.00"
              },
              "funding_source":{"id":"BALANCE"}
            },
            {
              "amount":{
                "currency_code":null,
                "value":null
              },
              "funding_source":{
                "id":"1388313",
                "type":"CREDIT_CARD",
                "last_four_digits":"0028",
                "instrument_type":"MCARD"
              }
            }
          ],
          "internal_id":"X7ydeC-OAU9lQmvET4Jj6KmNemLYPx_ZZMf-939sDWBWJb7xotlMNxc8GJK",
          "invoice_number":"INV2-N7MY-NK97-B2UF-B8KL",
          "is_handout_activity":false,
          "activity_id":"2TH78011VU814523A",
          "is_incentive_refund":false,
          "tracking_information_added":false,
          "service_marked_as_completed":true
        }
      }
    }
  ]
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/cal.json":[function(require,module,exports){
module.exports={}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/capture_success.json":[function(require,module,exports){
module.exports={
  "id": "5JB45456UL191984E",
  "totalAmount": {
    "currency_code": "USD",
    "value": "1.50"
  },
  "state": "completed",
  "invoiceId": "INV2-N7MY-NK97-B2UF-B8KL"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/continue-payment.json":[function(require,module,exports){
module.exports={
  "correlationId": "07f287e511b4c",
  "success": true,
  "transactionNumber": "1445655480399579582"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/declinedVault.json":[function(require,module,exports){
module.exports={
   "correlationId":"ce9654a19032c",
   "errorCode":600025,
   "errorType":"Invalid Request Parameter",
   "message":"Error while creating Vault, Message = Credit card number is not an accepted test number.",
   "developerMessage":"Error while creating Vault, Message = Credit card number is not an accepted test number."
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/details.json":[function(require,module,exports){
module.exports=
    {
    "id": "INV2-U5J4-4D4L-6UXW-UGHM",
    "number": "WEBSL190122100966",
    "template_id": "TEMP-86L91688122303050",
    "status": "PAID",
    "merchant_info": {
        "email": "pphan-us-b10@paypal.com",
        "business_name": "Joe's Generic Business",
        "address": {
            "line1": "3214265 Main Street 73836 Industrial Drive",
            "city": "Summit",
            "state": "NJ",
            "postal_code": "07901",
            "country_code": "US"
        }
    },
    "billing_info": [
        {}
    ],
    "shipping_info": {},
    "items": [
        {
            "name": "Item",
            "quantity": 1,
            "unit_price": {
                "currency": "USD",
                "value": "1.00"
            }
        }
    ],
    "tax_calculated_after_discount": false,
    "tax_inclusive": false,
    "merchant_memo": "[CHIP(M,1083)@(0,0),(1444696071)]",
    "total_amount": {
        "currency": "USD",
        "value": "1.50"
    },
    "gratuity": {
        "currency": "USD",
        "value": "0.50"
    },
    "payments": [
        {
            "type": "PAYPAL",
            "transaction_id": "0V691784PY677433G",
            "transaction_type": "SALE",
            "method": "PAYPAL",
            "date": "2019-01-28 16:22:44 PST",
            "amount": {
                "currency": "USD",
                "value": "1.50"
            }
        }
    ],
    "metadata": {
        "created_date": "2019-01-28 16:22:16 PST"
    },
    "additional_data": "{\"merchant\":{\"stmt\":\"JOESGENERIC\"},\"payment\":{\"method\":\"CHIP\",\"last\":\"1083\",\"txHandle\":\"1444696071\",\"action\":\"SALE\",\"type\":\"M\"}}",
    "allow_partial_payment": false,
    "paid_amount": {
        "paypal": {
            "currency": "USD",
            "value": "1.50"
        }
    },
    "allow_tip": false,
    "links": [
        {
            "rel": "self",
            "href": "https://msamster.stage.paypal.com/v1/invoicing/invoices/INV2-U5J4-4D4L-6UXW-UGHM",
            "method": "GET"
        },
        {
            "rel": "payer-view",
            "href": "https://www.msmaster.stage.paypal.com/invoice/p#INV2-U5J4-4D4L-6UXW-UGHM",
            "method": "GET"
        },
        {
            "rel": "merchant-view",
            "href": "https://www.msmaster.stage.paypal.com/invoice/details/INV2-U5J4-4D4L-6UXW-UGHM",
            "method": "GET"
        }
    ],
    "invoice_date_time": "2019-01-28 16:22:16 PST"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/device_update_config_response.json":[function(require,module,exports){
module.exports={
  "status": "active",
  "last_time_updated": "10/28/2014",
  "isupdaterequired": "false",
  "modules": [
    {
      "name": "Miura_OS",
      "version": "M000-TESTOS-7-6",
      "urls": [
        "https://www.stage2pph04.stage.paypal.com/webstatic/pph/device/AU/miura/M010/dev-stage-3/7/M000-TESTOS-V7-6.tar.gz",
        "https://www.stage2pph04.stage.paypal.com/webstatic/pph/device/AU/miura/M010/dev-stage-3/7/M000-TESTOSUPDATE-V1-2.tar.gz"
      ]
    }
  ]
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/devices-assets.json":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/cal.json"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/failVault.json":[function(require,module,exports){
module.exports={
  "correlationId": "6947bc2920762",
  "errorCode": 600000,
  "errorType": "service_error",
  "message": "No accessToken found for this request",
  "developerMessage": "No accessToken found for this request"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/feature-map.json":[function(require,module,exports){
module.exports={
  "VERSION": "1.5",
  "GLOBAL":
  {
    "sig": false,
    "apic": true,
    "nslall": false,
    "fhlem": [],
    "fhlbid": [],
    "SWU_CHECK_PERIOD": 300,
    "READER_SLEEP_DELAY": 60
  },
  "ANDROID": { "minSDKVersion": "1.0" },
  "IOS": { "minSDKVersion": "1.0" },
  "US":
  {
    "MCC_CODES": {
      "MCC_CODES":{
        "4121": "*",
        "4411": "*",
        "5812": "*",
        "5813": "*",
        "5814": "*",
        "7011": "*",
        "7230": "*",
        "7298": "*",
        "7512": "*",
        "7519":"*"
      }
    },
    "CONTACTLESS_LIMIT": "10000",
    "CAPABILITY": ["MOBILE", "WEB"]
  },
  "GB": { "CONTACTLESS_LIMIT": "45", "CAPABILITY": ["MOBILE"] },
  "AU": { "CONTACTLESS_LIMIT": "*", "CAPABILITY": ["MOBILE"] }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/get-card-reader-device.json":[function(require,module,exports){
module.exports={
    "deviceUpdateInfoURL":"https://www.stage2pph04.stage.paypal.com/webstatic/pph/device/US/miura/M010/dev-stage-2/device_update_config.json"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/getMerchantDeviceInfo_dongle_success_response.json":[function(require,module,exports){
module.exports={
  "deviceUpdateInfoURL": "https://www.stage2pph04.stage.paypal.com/webstatic/pph/device/GB/Dongle/M200/qa-stage-1/device_update_config.json"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/getMerchantDeviceInfo_miura_success_response.json":[function(require,module,exports){
module.exports={
  "success": true,
  "modules": [
    {
      "name": "Miura_MPI",
      "urls": [
        "https://www.stage2pph04.qa.paypal.com/webstatic/pph/device/uk/miura/M000/qa-stage-1/M000-TESTMPI-V1-17.tar.gz"
      ],
      "version": "M000-MPI-1-17"
    }
  ]
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/goPaypal.json":[function(require,module,exports){
module.exports={
    "access_token": "WH6Mrc2v9Wrz/9LevItHX5mgbiHlTdo5oIfW1JcKotX0SDxzRm6TtiSjnht4SNYwem9zhVYWF8cpkgnTIqUR3C7LLshIeED4Z5U4FrV8eiBg7Dso3zFESeatgXydai2G/CQqiQ==",
    "expires_in": "2336",
    "refresh_url" : "http://sdk-sample-server.herokuapp.com/server/refresh/harish-uk/OyZcROrcVhRgRxmUIL8cMaS3amGBWCrCfBBqj++ID9jpqIdZC17vZQOxXa8RBNR3tdKq7dBZEvjrL23CLyu3dyZch8UJm9qYgqCp9UnMVpHxr+98UCOh2HKVIv3XKaU1T9C7NEVN1It42jMb0u7oymNjkUwlfZucG1bPJUt1+LmRh/wJ6QcYWyN/fylIItpvwQBuQJvgzSfM71IsvtESkwJAc64qp6GeOmA++68qM/rrMTe2/https://www.stage2pph05.stage.paypal.com/webapps/"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/index.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
/* eslint-disable import/no-dynamic-require */

/* eslint-disable global-require */

var responses = {
  'CustomerCheckin_success_response.json': require('./CustomerCheckin_success_response.json'),
  'GetInvoiceDetails_success_response.json': require('./GetInvoiceDetails_success_response.json'),
  'LocationDelete_success_response.json': require('./LocationDelete_success_response.json'),
  'LocationGet_success_response.json': require('./LocationGet_success_response.json'),
  'LocationSave_success_response.json': require('./LocationSave_success_response.json'),
  'LocationUpdate_success_response.json': require('./LocationUpdate_success_response.json'),
  'MTP_default_failed_response.json': require('./MTP_default_failed_response.json'),
  'MTP_default_success_response.json': require('./MTP_default_success_response.json'),
  'MTP_default_success_response_noTxnId.json': require('./MTP_default_success_response_noTxnId.json'),
  'MTP_failed_response_5800029_58keyInErrorMissingExpDate.json': require('./MTP_failed_response_5800029_58keyInErrorMissingExpDate.json'),
  'MTP_failed_response_580022_57keyInErrorInvalidCardData.json': require('./MTP_failed_response_580022_57keyInErrorInvalidCardData.json'),
  'MTP_failed_response_580022_81swipeErrorTrackSpace.json': require('./MTP_failed_response_580022_81swipeErrorTrackSpace.json'),
  'MTP_failed_response_580029_85swipeErrorKSNEmpty.json': require('./MTP_failed_response_580029_85swipeErrorKSNEmpty.json'),
  'MTP_failed_response_580031_29miuraErrorAUDeclineRetry.json': require('./MTP_failed_response_580031_29miuraErrorAUDeclineRetry.json'),
  'MTP_failed_response_580031_badCard.json': require('./MTP_failed_response_580031_badCard.json'),
  'declinedVault.json': require('./declinedVault.json'),
  'MTP_declined_response_580031_miuraErrorContactChip.json': require('./MTP_declined_response_580031_miuraErrorContactChip.json'),
  'MTP_declined_response_580031_miuraErrorChip.json': require('./MTP_declined_response_580031_miuraErrorChip.json'),
  'MTP_declined_response_580031_miuraErrorFBSwipe.json': require('./MTP_declined_response_580031_miuraErrorFBSwipe.json'),
  'MTP_declined_response_580031_miuraAuthErrorChip.json': require('./MTP_declined_response_580031_miuraAuthErrorChip.json'),
  'MTP_declined_response_580031_miuraAuthErrorContactlessChip.json': require('./MTP_declined_response_580031_miuraAuthErrorContactlessChip.json'),
  'MTP_failed_response_600000_6swipeErrorRestrectedJCB.json': require('./MTP_failed_response_600000_6swipeErrorRestrectedJCB.json'),
  'MTP_failed_response_600002_49miuraErrorLockedSellerAccount.json': require('./MTP_failed_response_600002_49miuraErrorLockedSellerAccount.json'),
  'MTP_failed_response_600020_JCBcardNotSupported.json': require('./MTP_failed_response_600020_JCBcardNotSupported.json'),
  'MTP_failed_response_600025_88swipeErrorTrack1Invalid.json': require('./MTP_failed_response_600025_88swipeErrorTrack1Invalid.json'),
  'MTP_failed_response_600075_miuraErrorContactless.json': require('./MTP_failed_response_600075_miuraErrorContactless.json'),
  'MTP_failed_response_600164_10miuraErrorIncorrectAUOnlinePin.json': require('./MTP_failed_response_600164_10miuraErrorIncorrectAUOnlinePin.json'),
  'MTP_failed_response_600164_11miuraErrorUnableToVerifyAUOnlinePin.json': require('./MTP_failed_response_600164_11miuraErrorUnableToVerifyAUOnlinePin.json'),
  'MTP_failed_response_600165_9miuraErrorAUOnlinePinMaxTryExceed.json': require('./MTP_failed_response_600165_9miuraErrorAUOnlinePinMaxTryExceed.json'),
  'MTP_failed_response_600166_11miuraErrorUnableToVerifyAUOnlinePin.json': require('./MTP_failed_response_600166_11miuraErrorUnableToVerifyAUOnlinePin.json'),
  'MTP_failed_due_to_outage.json': require('./MTP_failed_due_to_outage.json'),
  'MTP_failed_due_to_outage_headers.json': require('./MTP_failed_due_to_outage_headers.json'),
  'MTP_failed_response_580031_no_warnings_bad_card.json': require('./MTP_failed_response_580031_no_warnings_bad_card.json'),
  'MTP_success_response_contactless_chip.json': require('./MTP_success_response_contactless_chip.json'),
  'MTP_success_response_contactless_msd.json': require('./MTP_success_response_contactless_msd.json'),
  'MerchantSendReceipt_success_response.json': require('./MerchantSendReceipt_success_response.json'),
  'PutInvoiceDetails_success_response.json': require('./PutInvoiceDetails_success_response.json'),
  'RefundCheckEligibility_success_response.json': require('./RefundCheckEligibility_success_response.json'),
  'app-preferences.json': require('./app-preferences.json'),
  'cal.json': require('./cal.json'),
  'continue-payment.json': require('./continue-payment.json'),
  'details.json': require('./details.json'),
  'device_update_config_response.json': require('./device_update_config_response.json'),
  'get-card-reader-device.json': require('./get-card-reader-device.json'),
  'getMerchantDeviceInfo_dongle_success_response.json': require('./getMerchantDeviceInfo_dongle_success_response.json'),
  'getMerchantDeviceInfo_miura_success_response.json': require('./getMerchantDeviceInfo_miura_success_response.json'),
  'goPaypal.json': require('./goPaypal.json'),
  'initialize.json': require('./initialize.json'),
  'invoiceIdINV2-75WU-JLDH-Z7MB-JLFS.details.json': require('./invoiceIdINV2-75WU-JLDH-Z7MB-JLFS.details.json'),
  'invoices_success_response.json': require('./invoices_success_response.json'),
  'locations.json': require('./locations.json'),
  'login.json': require('./login.json'),
  'oauth_login.json': require('./oauth_login.json'),
  'onboardingSessions.json': require('./onboardingSessions.json'),
  'pong.json': require('./pong.json'),
  'post-card-reader-device.json': require('./post-card-reader-device.json'),
  'profile-preferences.json': require('./profile-preferences.json'),
  'reader.json': require('./reader.json'),
  'search_invoice.json': require('./search_invoice.json'),
  'sendInvoice.json': require('./sendInvoice.json'),
  'status.json': require('./status.json'),
  'qrc_enabled_status.json': require('./qrc_enabled_status.json'),
  'userInfo_us.json': require('./userInfo_us.json'),
  'userinfo-us.json': require('./userinfo-us.json'),
  'userinfo-uk.json': require('./userinfo-uk.json'),
  'void-payment.json': require('./void-payment.json'),
  'devices-assets.json': require('./devices-assets.json'),
  'validate-config.json': require('./validate-config.json'),
  'failVault.json': require('./failVault.json'),
  'passVault.json': require('./passVault.json'),
  'QRCode_payment_sessions.json': require('./QRCode_payment_sessions.json'),
  'QRCode_payment_status_1.json': require('./QRCode_payment_status_1.json'),
  'QRCode_payment_status_2.json': require('./QRCode_payment_status_2.json'),
  'QRCode_payment_status_3.json': require('./QRCode_payment_status_3.json'),
  'QRCode_payment_status_4.json': require('./QRCode_payment_status_4.json'),
  'QRCode_payment_status_5.json': require('./QRCode_payment_status_5.json'),
  'QRCode_payment_status_6.json': require('./QRCode_payment_status_6.json'),
  'QRCode_payment_status_7.json': require('./QRCode_payment_status_7.json'),
  'QRCode_payment_status_8.json': require('./QRCode_payment_status_8.json'),
  'QRCode_payment_status_9.json': require('./QRCode_payment_status_9.json'),
  'feature-map.json': require('./feature-map.json'),
  'auth_list.json': require('./auth_list.json'),
  'capture_success.json': require('./capture_success.json')
};
var _default = responses;
exports["default"] = _default;

},{"./CustomerCheckin_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/CustomerCheckin_success_response.json","./GetInvoiceDetails_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/GetInvoiceDetails_success_response.json","./LocationDelete_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/LocationDelete_success_response.json","./LocationGet_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/LocationGet_success_response.json","./LocationSave_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/LocationSave_success_response.json","./LocationUpdate_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/LocationUpdate_success_response.json","./MTP_declined_response_580031_miuraAuthErrorChip.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_declined_response_580031_miuraAuthErrorChip.json","./MTP_declined_response_580031_miuraAuthErrorContactlessChip.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_declined_response_580031_miuraAuthErrorContactlessChip.json","./MTP_declined_response_580031_miuraErrorChip.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_declined_response_580031_miuraErrorChip.json","./MTP_declined_response_580031_miuraErrorContactChip.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_declined_response_580031_miuraErrorContactChip.json","./MTP_declined_response_580031_miuraErrorFBSwipe.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_declined_response_580031_miuraErrorFBSwipe.json","./MTP_default_failed_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_default_failed_response.json","./MTP_default_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_default_success_response.json","./MTP_default_success_response_noTxnId.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_default_success_response_noTxnId.json","./MTP_failed_due_to_outage.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_due_to_outage.json","./MTP_failed_due_to_outage_headers.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_due_to_outage_headers.json","./MTP_failed_response_5800029_58keyInErrorMissingExpDate.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_5800029_58keyInErrorMissingExpDate.json","./MTP_failed_response_580022_57keyInErrorInvalidCardData.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580022_57keyInErrorInvalidCardData.json","./MTP_failed_response_580022_81swipeErrorTrackSpace.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580022_81swipeErrorTrackSpace.json","./MTP_failed_response_580029_85swipeErrorKSNEmpty.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580029_85swipeErrorKSNEmpty.json","./MTP_failed_response_580031_29miuraErrorAUDeclineRetry.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580031_29miuraErrorAUDeclineRetry.json","./MTP_failed_response_580031_badCard.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580031_badCard.json","./MTP_failed_response_580031_no_warnings_bad_card.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_580031_no_warnings_bad_card.json","./MTP_failed_response_600000_6swipeErrorRestrectedJCB.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600000_6swipeErrorRestrectedJCB.json","./MTP_failed_response_600002_49miuraErrorLockedSellerAccount.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600002_49miuraErrorLockedSellerAccount.json","./MTP_failed_response_600020_JCBcardNotSupported.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600020_JCBcardNotSupported.json","./MTP_failed_response_600025_88swipeErrorTrack1Invalid.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600025_88swipeErrorTrack1Invalid.json","./MTP_failed_response_600075_miuraErrorContactless.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600075_miuraErrorContactless.json","./MTP_failed_response_600164_10miuraErrorIncorrectAUOnlinePin.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600164_10miuraErrorIncorrectAUOnlinePin.json","./MTP_failed_response_600164_11miuraErrorUnableToVerifyAUOnlinePin.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600164_11miuraErrorUnableToVerifyAUOnlinePin.json","./MTP_failed_response_600165_9miuraErrorAUOnlinePinMaxTryExceed.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600165_9miuraErrorAUOnlinePinMaxTryExceed.json","./MTP_failed_response_600166_11miuraErrorUnableToVerifyAUOnlinePin.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_failed_response_600166_11miuraErrorUnableToVerifyAUOnlinePin.json","./MTP_success_response_contactless_chip.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_success_response_contactless_chip.json","./MTP_success_response_contactless_msd.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MTP_success_response_contactless_msd.json","./MerchantSendReceipt_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/MerchantSendReceipt_success_response.json","./PutInvoiceDetails_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/PutInvoiceDetails_success_response.json","./QRCode_payment_sessions.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_sessions.json","./QRCode_payment_status_1.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_1.json","./QRCode_payment_status_2.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_2.json","./QRCode_payment_status_3.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_3.json","./QRCode_payment_status_4.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_4.json","./QRCode_payment_status_5.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_5.json","./QRCode_payment_status_6.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_6.json","./QRCode_payment_status_7.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_7.json","./QRCode_payment_status_8.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_8.json","./QRCode_payment_status_9.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/QRCode_payment_status_9.json","./RefundCheckEligibility_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/RefundCheckEligibility_success_response.json","./app-preferences.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/app-preferences.json","./auth_list.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/auth_list.json","./cal.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/cal.json","./capture_success.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/capture_success.json","./continue-payment.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/continue-payment.json","./declinedVault.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/declinedVault.json","./details.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/details.json","./device_update_config_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/device_update_config_response.json","./devices-assets.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/devices-assets.json","./failVault.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/failVault.json","./feature-map.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/feature-map.json","./get-card-reader-device.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/get-card-reader-device.json","./getMerchantDeviceInfo_dongle_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/getMerchantDeviceInfo_dongle_success_response.json","./getMerchantDeviceInfo_miura_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/getMerchantDeviceInfo_miura_success_response.json","./goPaypal.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/goPaypal.json","./initialize.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/initialize.json","./invoiceIdINV2-75WU-JLDH-Z7MB-JLFS.details.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/invoiceIdINV2-75WU-JLDH-Z7MB-JLFS.details.json","./invoices_success_response.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/invoices_success_response.json","./locations.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/locations.json","./login.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/login.json","./oauth_login.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/oauth_login.json","./onboardingSessions.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/onboardingSessions.json","./passVault.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/passVault.json","./pong.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/pong.json","./post-card-reader-device.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/post-card-reader-device.json","./profile-preferences.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/profile-preferences.json","./qrc_enabled_status.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/qrc_enabled_status.json","./reader.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/reader.json","./search_invoice.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/search_invoice.json","./sendInvoice.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/sendInvoice.json","./status.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/status.json","./userInfo_us.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/userInfo_us.json","./userinfo-uk.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/userinfo-uk.json","./userinfo-us.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/userinfo-us.json","./validate-config.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/validate-config.json","./void-payment.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/void-payment.json","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/initialize.json":[function(require,module,exports){
module.exports={
  "correlationId": "432b0946fb77c",
  "remoteStatus": "IN_PROGRESS",
  "unavailableFeatures": [
    "MOCR",
    "MCC"
  ],
  "productSettings": {
    "CurrencyCode": "USD",
    "MiniCCTxnAmt": "1",
    "PostalCodeForKeyIn": "YES",
    "ValidatePostalCode": "YES",
    "SupportNumber": "877 569 1136",
    "ShowTerms": "YES",
    "OptSigMax": "50",
    "MaxTxnAmt": "10000",
    "CSEmail": "paypalhere-apps@paypal.com"
  },
  "preferences": {
    "AddTax": "0",
    "ItemMode": "Multi",
    "UseDiscounts": "1",
    "TipOnPhone": "1",
    "SellableItem_1": "{\"p\":1,\"n\":\"FixedPrice###\",\"s\":1,\"id\":1,\"tn\":\"No tax rate\",\"tr\":0}",
    "ExclusiveTax": "1",
    "SignatureOptional": "0",
    "TipAsAmount": "0",
    "SellableItemTypes_1_0": "35,[{\"price\":\"1.00\",\"name\":\"Regular\"}]",
    "ccStmtName": "JOESGENERIC",
    "AllowTips": "0",
    "CheckinEnabled": "0"
  },
  "fingerprint": "9ui6PPVGeg3Lm6bRODaiRg==",
  "userDetails": {
    "addresses": [
      {
        "id": "JABD8DSGJ43GG",
        "confirmed": true,
        "line1": "114 C Street",
        "line2": "42104 12th Street",
        "city": "Irvine",
        "state": "CA",
        "postalCode": "92602",
        "country": "US",
        "type": "Home"
      },
      {
        "id": "99BBU34KFJGNQ",
        "confirmed": true,
        "line1": "114 C Street",
        "line2": "42104 12th Street",
        "city": "Irvine",
        "state": "CA",
        "postalCode": "92602",
        "country": "US",
        "type": "Business"
      }
    ],
    "businessName": "Joe's Generic Business",
    "firstName": "Ryan",
    "lastName": "Merchant",
    "payerId": "PCZ5B6C3L9NBA",
    "email": "sathya-us@paypal.com",
    "payerCountry": "US",
    "phones": [
      {
        "id": "74YM6QUSWE5Q2",
        "countryCode": "1",
        "phoneNumber": "3605550283",
        "phoneType": "Home",
        "isInactive": "false"
      },
      {
        "id": "4JLJBX9EH7GFL",
        "countryCode": "1",
        "phoneNumber": "2538615583",
        "phoneType": "Work",
        "isInactive": "false"
      }
    ],
    "availableBalance": [
      {
        "amount": "890",
        "code": "USD"
      }
    ],
    "pendingBalance": [],
    "mccCode": "5971",
    "isBusinessCategoryExists": true
  },
  "confirmedEmail": true,
  "setupStatus": "UNKNOWN",
  "logglyAccessToken": "3ccef8fc-15ad-4446-af2d-3c97b32d3a6f",
  "onboardingInfo" : {
    "needsOnboarding":false,
    "hasConfirmedEmail":true
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/invoiceIdINV2-75WU-JLDH-Z7MB-JLFS.details.json":[function(require,module,exports){
module.exports={
    "id": "INV2-75WU-JLDH-Z7MB-JLFS",
    "number": "0548",
    "template_id": "TEMP-97R187912E771170K",
    "status": "MARKED_AS_PAID",
    "merchant_info": {
        "email": "tlj-us-b10@paypal.com",
        "first_name": "Ryan",
        "last_name": "Wang",
        "business_name": "Joe's Generic Business",
        "address": {
            "line1": "622 Washington Street",
            "line2": "8168 South Broadway",
            "city": "Napa",
            "state": "CA",
            "postal_code": "94559",
            "country_code": "US"
        }
    },
    "billing_info": [
        {
            "email": "john.smith@gmail.com",
            "first_name": "John",
            "last_name": "Smith",
            "phone": {
                "country_code": "US",
                "national_number": "(408) 123-4567"
            },
            "address": {
                "line1": "4756 Benton St",
                "line2": "Suite 18",
                "city": "Santa Clara",
                "state": "CA",
                "postal_code": "95054"
            }
        }
    ],
    "shipping_info": {},
    "items": [
        {
            "name": "TestCashJ9vQW",
            "quantity": 1,
            "unit_price": {
                "currency": "USD",
                "value": "1.00"
            }
        }
    ],
    "tax_calculated_after_discount": true,
    "tax_inclusive": false,
    "merchant_memo": "[CASH@(37.78583400000000125373844639398157596588134765625,-122.406417000000004691173671744763851165771484375)]",
    "total_amount": {
        "currency": "USD",
        "value": "1.00"
    },
    "payments": [
        {
            "type": "EXTERNAL",
            "transaction_id": "EXTR-84437666BT909925L",
            "method": "CASH",
            "date": "2019-01-16 15:47:38 PST",
            "note": "[CASH@(37.78583400000000125373844639398157596588134765625,-122.406417000000004691173671744763851165771484375)]",
            "amount": {
                "currency": "USD",
                "value": "1.00"
            }
        }
    ],
    "metadata": {
        "created_date": "2019-01-16 15:47:37 PST"
    },
    "additional_data": "{\"footer\":{},\"merchant\":{\"seller\":{\"sellerId\":\"Ryan Wang\"}},\"payment\":{\"method\":\"CASH\",\"lng\":\"-122.406417000000004691173671744763851165771484375\",\"lat\":\"37.78583400000000125373844639398157596588134765625\"},\"dname\":\"iPhone-LMSJN00877376\"}",
    "allow_partial_payment": false,
    "paid_amount": {
        "other": {
            "currency": "USD",
            "value": "1.00"
        }
    },
    "allow_tip": false,
    "links": [
        {
            "rel": "self",
            "href": "https://msamster.stage.paypal.com/v1/invoicing/invoices/INV2-SVKP-PYAH-EMYC-NMHG",
            "method": "GET"
        },
        {
            "rel": "payer-view",
            "href": "https://www.msmaster.stage.paypal.com/invoice/p#INV2-SVKP-PYAH-EMYC-NMHG",
            "method": "GET"
        },
        {
            "rel": "merchant-view",
            "href": "https://www.msmaster.stage.paypal.com/invoice/details/INV2-SVKP-PYAH-EMYC-NMHG",
            "method": "GET"
        }
    ],
    "invoice_date_time": "2019-01-16 15:47:37 PST"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/invoices_success_response.json":[function(require,module,exports){
module.exports={
  "number": "0011",
  "merchant_info": {
      "email": "sathya-us@paypal.com",
      "address": {
          "line1": "114 C Street",
          "city": "Irvine",
          "state": "CA",
          "postal_code": "92602",
          "country_code": "US"
      },
      "first_name": "Ryan",
      "last_name": "Merchant",
      "business_name": "Joe's Generic Business"
  },
  "shipping_info": {},
  "billing_info": [
      {}
  ],
  "tax_inclusive": false,
  "tax_calculated_after_discount": true,
  "allow_partial_payment": false,
  "allow_tip": false,
  "additional_data": "{\"dname\":\"iPhone-LM-NWT-21018997\",\"merchant\":{\"seller\":{\"sellerId\":\"Ryan Merchant\"},\"sellerId\":\"Ryan Merchant\"},\"footer\":{}}",
  "template_id": "TEMP-27S11609EL235574A",
  "id": "INV2-AVPK-WNNQ-E63E-MQ28",
  "status": "DRAFT",
  "gratuity": {
      "currency": "USD",
      "value": "@@gratuity"
  },
  "items": [
      {
          "name": "Amount",
          "quantity": 1,
          "unit_price": {
              "value": "@@unitPrice",
              "currency": "USD"
          }
      }
  ]
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/locations.json":[function(require,module,exports){
module.exports={
    "latitude": 39.377996,
    "longitude": -121.921903,
    "id": "GHUM9926UY62Y",
    "name": "Milpitas Location325",
    "internalName": "Milpitas Location297",
    "mobility": "mobile",
    "address": {
	"line1": "Hamilton Ave",
	"line2": "Bldg 17",
	"city": "San Jose",
	"state": "CA",
	"postalCode": "95134",
	"country": "US" },
    "phoneNumber": "",
    "tabType": "standard",
    "gratuityType": "none",
    "availability": "open",
    "tabExtensionType": "status",
    "tabExtensionButtonType": "free_form_text",
    "tabExtensionButtonText": "PayHERE",
    "tabExtensionUrl": "https://jj-integration-13926.stratus.dev.ebay.com:8443/jambajuice",
    "status": "active",
    "createDate": "2015-03-25T19:49:01.000+0000",
    "updateDate": "2015-03-25T19:49:01.000+0000",
    "correlationId": "2f8bfae3b0abe"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/login.json":[function(require,module,exports){
module.exports={
  "merchant": {
    "businessName":"harish-uk's Widgets",
    "city":"Boston",
    "country":"US",
    "currency":"USD",
    "line1":"Address Not Specified",
    "postalCode":"02110",
    "state":"MA"
  },
  "serverinfo":{
    "paypalserver":"stage2pph05"
  },
  "ticket":"3a237f94-e6e5-4624-9ffe-372b07f71af5"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/oauth_login.json":[function(require,module,exports){
module.exports={
  "scope": "phone https://uri.paypal.com/services/paypalhere https://api.paypal.com/v1/payments/.* address email https://api.paypal.com/v1/payments/sale/.*/refund https://uri.paypal.com/services/paypalhere/profile/update https://uri.paypal.com/services/paypalhere/payments openid https://api.paypal.com/v1/payments/refund profile",
  "nonce": "2015-03-25T18:56:31ZHJYp4RbOXBgVxZwtTD_yxQ",
  "access_token": "A015-7L02s1RRAKjEI646NvbQl3Ai8baaPx2o10oBEdIaYA",
  "token_type": "Bearer",
  "app_id": "APP-2A128197VV566444R",
  "expires_in": 28800,
  "refresh_token": "JLeQZADtifby2YoIxQdS1QZSY-W3LwjVdavuLE2T47fk83NttkqVTLMgNNpLKX3s5QA3bJWVXiLaJFDdAku7OWkxfz4PPiVcwLPq0JZeOpOAn4R4ZRLPii_o8pA",
  "session_token": "lE46m4ppG8y7RTxxmGhiM5ffoa.jIP2MtmXhGJW2p89SjfJMKsI4hfrO43ZTGHc.gFzj3M66bR667mD4",
  "visitor_id": "80x8s8SooG__Ds2mxofFM2HyVXzZNCImUGTMIeyE-gFDPn8A3Gr_zeDuzFQd0hI9MPfZbRzVN1S0QJup"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/onboardingSessions.json":[function(require,module,exports){
module.exports={
    "id": "GZ8HMD5CDM7Z8",
    "status": "IN_PROGRESS",
    "data_capture_completed": false,
    "context": {
        "capability_name": "MOBILE_CARD_READER",
        "customer_type": "MERCHANT",
        "country_code": "US",
        "business_channel": "ORGANIC",
        "technical_channel": "WEB",
        "experience_channel": "ANY"
    },
    "time_created": "2019-01-29T18:02:45.667Z",
    "time_last_modified": "2019-01-29T18:02:45.667Z",
    "links": [
        {
            "rel": "self",
            "href": "https://www.stage2d0020.stage.paypal.com/v1/onboarding/onboarding-sessions/GZ8HMD5CDM7Z8",
            "method": "GET"
        },
        {
            "rel": "search",
            "href": "https://www.stage2d0020.stage.paypal.com/v1/onboarding/onboarding-sessions/GZ8HMD5CDM7Z8?credential_handle={credential_handle}&credential_type={credential_type}&account_id={account_id}&status={status}&page_size={page_size}&page={page_size}",
            "method": "GET"
        },
        {
            "rel": "deactivate",
            "href": "https://www.stage2d0020.stage.paypal.com/v1/onboarding/onboarding-sessions/GZ8HMD5CDM7Z8/deactivate",
            "method": "POST"
        },
        {
            "rel": "submit",
            "href": "https://www.stage2d0020.stage.paypal.com/v1/onboarding/onboarding-sessions/GZ8HMD5CDM7Z8/submit",
            "method": "POST"
        }
    ]
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/passVault.json":[function(require,module,exports){
module.exports={
  "id": "CARD-1SW33690TH184423CKM2ZMVY",
  "valid_until": "2017-03-27T00:00:00Z",
  "links": []
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/pong.json":[function(require,module,exports){
module.exports={
	"ping": "pong"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/post-card-reader-device.json":[function(require,module,exports){
module.exports={
  "status": "active",
  "last_time_updated": "10/28/2014",
  "isupdaterequired": "false",
  "modules": []
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/profile-preferences.json":[function(require,module,exports){
module.exports={
  "correlationId": "8ecbc98750bd9",
  "preferences": {
    "UseDiscounts": "1",
    "ccStmtName": "JOESGENERIC",
    "BIcityStateZip": "{\"state\":\"Victoria\",\"postalCode\":\"3001\",\"city\":\"Melbourne\"}",
    "ExclusiveTax": "0",
    "BIaddress1": "125372 Lake Side Terrace",
    "BIaddress2": "61266 Lincoln Drive",
    "SignatureOptional": "0",
    "CheckinEnabled": "0",
    "TaxRate_1": "{\"id\":1,\"n\":\"GST 10%\",\"r\":0.10000,\"d\":1}",
    "TipAsAmount": "0",
    "AddTax": "1",
    "AllowTips": "0",
    "ItemMode": "Multi"
  },
  "fingerprint": "A+kf/ISKa/iylKUlNEfQug=="
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/qrc_enabled_status.json":[function(require,module,exports){
module.exports={
  "status": "ready",
  "paymentTypes": [
    "tab",
    "key",
    "card"
  ],
  "cardSettings": {
    "minimum": "1",
    "maximum": "10000",
    "signatureRequiredAbove": "50",
    "captureThresholdPercentage": "500",
    "authExpiryPeriod": "2592000",
    "authHonorPeriod": "259200",
    "storedPaymentEligibility": false,
    "storedPaymentExpiration": "4320",
    "storedPaymentPublicKey": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURqVENDQW5XZ0F3SUJBZ0lKQkRFVjk0bHlVT29tTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdGTVNZd0pBWURWUVFEREIxeVpYUmhhV3hqYUdWamEyOTFkSE5sY25ZdWNHRjVjR0ZzTG1OdmJURVBNQTBHQTFVRUN3d0dVbVYwWVdsc01SVXdFd1lEVlFRS0RBeFFZWGxRWVd3c0lFbHVZeTR4RVRBUEJnTlZCQWNNQ0ZOaGJpQktiM05sTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1Rc3dDUVlEVlFRR0V3SlZVekFlRncweE9UQXhNRGd3TURReE1qUmFGdzB5TVRBeE1EZ3dNRFF4TWpSYU1JR0ZNU1l3SkFZRFZRUUREQjF5WlhSaGFXeGphR1ZqYTI5MWRITmxjbll1Y0dGNWNHRnNMbU52YlRFUE1BMEdBMVVFQ3d3R1VtVjBZV2xzTVJVd0V3WURWUVFLREF4UVlYbFFZV3dzSUVsdVl5NHhFVEFQQmdOVkJBY01DRk5oYmlCS2IzTmxNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVFzd0NRWURWUVFHRXdKVlV6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxvMUU0aXJ3blBFSTgxR1VycmNWTmhyNE1hYXNqN0FvNFNrK2ZRZ3lHc1ZEQ1FaQTJRZWtYc2NBRm1MMFMvdElpNmJWY2xRbEl3TnJGRzBFVU1tMExLSzYxTmxhbEt0OGxUMWkwd1V3L1UrZWU1T28rbnNnYXNOMVJ6Z2VQL3VxNGRDOUxSejJYdzMvbFNZWldkVE9vZmp3Z212elBCZ2JFc1VrdlkzU2lFQVVDNXZTdmlyVXcxdzJYcWlzL3Vna3B0Myt1OUc4Rkdla1prbTVLR085WkUrTXpLd3RwZXQvbzNqcHd3NEpyRTRzMitpaHlNNkxkaHRPdUtKYUw4emQ2TEh4OUhDWmFkQkltbDU0bDVrMG8xb2lRcWhDcHExNm9aN1JjRGxPdWJ4K3VEOVA4ZFE1cjhSOFVzY2tkSG9IUVNYUjlzOHhyVjdhVjZBQmxYaUMwc0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWJLRFNRdWxVanR2Q3FVc2JHUHVmczI5N2hybVM0UzIyR2lUaVd4K3ZibFhwS0dvYUZrcjRYOTI1MnE3MSs1bU1UbFBsRy9GMDAydTRDTElENGU3MW1kQjZEUVpiN2dKZzU5dVFQd1VHSGVMbWhGQjQxYStQQ20xQU91R3BSQ3Qva3d4RDAxUDhrYkQwQVhKSU52emRIb1JOeW9BNVhYNXREYzYrYUdhWFYyNC9DczVjQTAxZXhBZ2tuTVJmUTF4K2VVRFIvdjJyM3M4V0tMVzUxSEtPU25KeG1wWGFCRHEzUExqdkFhcWVzQzkySVN6MGRydGd5ZVgwczdsUlJLVzRIUHdiZ2lLU2pEeXA2U29MckJ2ajlyUGxkWnBiSk1IUndlY2R3QnBjUUJSdDMxZC9Xa2hxd2hqQ1d1dGgyTGZHU0xpOU5WUnJQcUUzQWpTU1hjV1ZyZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
  },
  "currencyCode": "USD",
  "categoryCode": "5812",
  "businessCategoryExists": true,
  "logglyAccessToken": "3ccef8fc-15ad-4446-af2d-3c97b32d3a6f",
  "merchant_info": "eyJhZGRyZXNzZXMiOlt7ImlkIjoiR0pENzNMWk5EQlVFRyIsImNvbmZpcm1lZCI6ZmFsc2UsImxpbmUxIjoiR3JhYWwgTWFya2V0LCAxMiwgYnNoc2pqcywgIiwibGluZTIiOiJic2hzampzIiwiY2l0eSI6Ikd1YXJhcmVtYSIsInN0YXRlIjoiU1AiLCJwb3N0YWxDb2RlIjoiMDg5MDAtMDAwIiwiY291bnRyeSI6IkJSIn0seyJpZCI6IkZNN05XVVc3Mlo5UkEiLCJjb25maXJtZWQiOmZhbHNlLCJsaW5lMSI6IjEyMyBtYWluIHN0IiwiY2l0eSI6IkJFVkVSTFkgSElMTFMiLCJzdGF0ZSI6IkNBIiwicG9zdGFsQ29kZSI6IjkwMjEwIiwiY291bnRyeSI6IlVTIiwidHlwZSI6IkhvbWUgYW5kIEJ1c2luZXNzIn1dLCJidXNpbmVzc05hbWUiOiJUZXN0aW5nIEluYyIsImZpcnN0TmFtZSI6IlRlc3QiLCJsYXN0TmFtZSI6IlRlc3RlciIsInBheWVySWQiOiJBNkJQMzM4QlAyUlFTIiwiZW1haWwiOiJ0ZXN0MTIzMTIzMTJAdGVzdC5jb20iLCJwYXllckNvdW50cnkiOiJVUyJ9",
  "qrcode_payment_enabled": true,
  "qrcode_payment": {
    "partner_service_provider": "8USH6XVWRTJ8A",
    "merchant_presented_qrcode_templates": [
      {
        "provider": "PAYPAL",
        "qrcode_template": "https%3A%2F%2Fwww.paypal.com%2Fqrcodes%2Fintegrated%3Fpayer_id%3D%7Bpayer_id%7D%26merchant_ref_id%3D%7Bmerchant_ref_id%7D%26time_stamp%3D%7Btime_stamp%7D"
      },
      {
        "provider": "VENMO",
        "qrcode_template": "https%3A%2F%2Fwww.venmo.com%2Fqrcodes%2Fintegrated%3Fpayer_id%3D%7Bpayer_id%7D%26merchant_ref_id%3D%7Bmerchant_ref_id%7D%26time_stamp%3D%7Btime_stamp%7D"
      }
    ]
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/reader.json":[function(require,module,exports){
module.exports={
    "correlationId": "b2780953b6ff0",
    "errorCode": 600152,
    "message": "card reader disabled",
    "developerMessage": "Card reader is disabled.",
    "errorType": "card_reader_disabled"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/search_invoice.json":[function(require,module,exports){
module.exports={
  "invoices":[
    {
      "id":"INV2-U5J4-4D4L-6UXW-UGHM",
      "number":"WEBSL190122100966",
      "status":"PAID",
      "merchant_info":{
        "email":"pphan-us-b10@paypal.com"
      },
      "billing_info":[{}],
      "shipping_info":{},
      "invoice_date":"2019-01-28 PST",
      "merchant_memo":"[CHIP(M,1083)@(0,0),(1444696071)]",
      "total_amount":{
        "currency":"USD",
        "value":"1.50"
      },
      "metadata":{
        "created_date":"2019-01-28 16:22:16 PST"
      },
      "paid_amount":{
        "paypal":{
          "currency":"USD",
          "value":"1.50"
        },
      "other":{
          "currency":"USD",
          "value":"0.00"
        }
      },
      "refunded_amount":{
        "paypal":{
            "currency":"USD",
            "value":"0.00"
          },
        "other":{
            "currency":"USD",
            "value":"0.00"
          }
        },
        "links":[
          {
            "rel":"self",
            "href":"https://msamster.stage.paypal.com/v1/invoicing/invoices/INV2-U5J4-4D4L-6UXW-UGHM",
            "method":"GET"
          },
          {
            "rel":"payer-view",
            "href":"https://www.msmaster.stage.paypal.com/invoice/p#INV2-U5J4-4D4L-6UXW-UGHM",
            "method":"GET"
          },
          {
            "rel":"merchant-view",
            "href":"https://www.msmaster.stage.paypal.com/invoice/details/INV2-U5J4-4D4L-6UXW-UGHM",
            "method":"GET"
          }
        ]
      },
      {
        "id":"INV2-75WU-JLDH-Z7MB-JLFS",
        "number":"0561",
        "status":"MARKED_AS_PAID",
        "merchant_info":{
          "email":"tlj-us-b10@paypal.com"
          },
        "billing_info":[
          {
            "email":"john.smith5Y87F@gmail.com",
            "first_name":"John",
            "last_name":"Smith",
            "phone":{
              "country_code":"US",
              "national_number":"(408) 123-4567"
              }
            }   
          ],
        "shipping_info":{
          "email":"john.smith5Y87F@gmail.com"
        },
          "invoice_date":"2019-01-16 PST",
          "merchant_memo":"[CASH@(37.78583400000000125373844639398157596588134765625,-122.406417000000004691173671744763851165771484375)]",
          "total_amount":{
            "currency":"USD",
            "value":"1.00"
          },
          "metadata":{
            "created_date":"2019-01-16 22:53:03 PST"
          },
          "paid_amount":{
            "paypal":{
              "currency":"USD",
              "value":"0.00"
            },
          "other":{
            "currency":"USD",
            "value":"1.00"
          }
        },
        "refunded_amount":{
          "paypal":{
            "currency":"USD",
            "value":"0.00"
          },
        "other":{
          "currency":"USD",
          "value":"0.00"
          }
        },
        "links":[
          {
            "rel":"self",
            "href":"https://msamster.stage.paypal.com/v1/invoicing/invoices/INV2-75WU-JLDH-Z7MB-JLFS",
            "method":"GET"
            },
          {
            "rel":"payer-view",
            "href":"https://www.msmaster.stage.paypal.com/invoice/p#INV2-75WU-JLDH-Z7MB-JLFS",
            "method":"GET"
          },{
            "rel":"merchant-view",
            "href":"https://www.msmaster.stage.paypal.com/invoice/details/INV2-75WU-JLDH-Z7MB-JLFS",
            "method":"GET"
            }
          ]
      }
    ]
  }
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/sendInvoice.json":[function(require,module,exports){
module.exports={}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/status.json":[function(require,module,exports){
module.exports={
    "status": "ready",
    "paymentTypes": [
        "tab",
        "key",
        "chip",
        "contactless_chip",
        "contactless_msd"
    ],
    "cardSettings": {
        "minimum": "1",
        "maximum": "5500",
        "signatureRequiredAbove": "0",
        "unsupportedCardTypes": [
            "amex",
            "discover"
        ]
    },
    "currencyCode": "USD",
    "categoryCode": "5971",
    "merchant_info": "eyJhZGRyZXNzZXMiOlt7ImlkIjoiWlRDVFY3Q0o2UDJDOCIsImNvbmZpcm1lZCI6dHJ1ZSwibGluZTEiOiIzMDg0IExleGluZ3RvbiBQYXJrIFRlcnJhY2UiLCJsaW5lMiI6IjE2NTE4MSBMIFN0cmVldCIsImNpdHkiOiJSZXNlYXJjaCBUcmlhbmdsZSBQYXJrIiwic3RhdGUiOiJOQyIsInBvc3RhbENvZGUiOiIyNzcwOSIsImNvdW50cnkiOiJVUyIsInR5cGUiOiJIb21lIGFuZCBCdXNpbmVzcyJ9XSwiYnVzaW5lc3NOYW1lIjoiSm9lJ3MgR2VuZXJpYyBCdXNpbmVzcyIsImZpcnN0TmFtZSI6IlJ5YW4iLCJsYXN0TmFtZSI6IkhpY2tleSIsInBheWVySWQiOiJBM1dZNEtLQzg0TEcyIiwiZW1haWwiOiJzcC11cy1iMkBwYXlwYWwuY29tIiwicGF5ZXJDb3VudHJ5IjoiVVMiLCJwaG9uZXMiOltdLCJhdmFpbGFibGVCYWxhbmNlIjpbXSwicGVuZGluZ0JhbGFuY2UiOltdfQ==",
    "businessCategoryExists": true
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/userInfo_us.json":[function(require,module,exports){
module.exports={
    "id": "TWTW34ZKTXTKQ",
    "minimum_data_captured": false,
    "user_type": "PERSON",
    "language_code": "en_US",
    "time_zone": "America/Los_Angeles",
    "credentials": [
        {
            "domain": "PAYPAL_ALIAS",
            "handle": "pphan-us-b11@paypal.com",
            "handle_type": "EMAIL"
        }
    ],
    "person_details": {
        "primary_user": true,
        "names": [
            {
                "id": "8PDBY2Q98LRD6",
                "type": "LEGAL",
                "prefix": "",
                "given_name": "Desta",
                "surname": "Johnson",
                "middle_name": "",
                "suffix": "",
                "orthography": "NONE"
            }
        ],
        "phone_contacts": [
            {
                "id": "FJ7EHHP4Y97AA",
                "country_code": "1",
                "national_number": "2677857564",
                "phone_type": "HOME"
            },
            {
                "id": "FV5W9UNTG5G84",
                "country_code": "1",
                "national_number": "4088425052",
                "phone_type": "MOBILE"
            },
            {
                "id": "WJMVMYW9BY4XG",
                "country_code": "1",
                "national_number": "7072586857",
                "phone_type": "WORK"
            }
        ],
        "addresses": [
            {
                "id": "BX4ERBCFLMRE6",
                "type": "HOME",
                "line1": "123 Main Street",
                "line2": "",
                "city": "San Jose",
                "postal_code": "95112",
                "state": "",
                "country_code": "US",
                "normalization_status": "UNKNOWN",
                "primary": false
            },
            {
                "id": "N99E3SP77RHSQ",
                "type": "HOME",
                "line1": "872383 Ocean Avenue",
                "line2": "5884686 Main Street",
                "city": "Raleigh",
                "postal_code": "27606",
                "state": "NC",
                "country_code": "US",
                "normalization_status": "UNKNOWN",
                "primary": true
            }
        ],
        "card_processing_details": {
            "cc_statement_name": "JOESGENERIC",
            "extended_cc_statement_name": "JOESGENERIC"
        },
        "geography_of_events": [],
        "identity_documents": [
            {
                "id": "LAQ8YUVCS6G4Y",
                "issuer_city": "",
                "issuer_country_code": "US",
                "issuer_description": "",
                "issuer_state": "-",
                "partial_value": false,
                "place_of_issue": "",
                "type": "SOCIAL_SECURITY_NUMBER",
                "value": "610360400"
            }
        ],
        "country_code_of_nationality": "US",
        "email_contacts": [
            {
                "id": "S8XSH47YX52VN",
                "email_address": "pphan-us-b11@paypal.com",
                "primary": true
            }
        ]
    },
    "user_relations": [],
    "card_preferences": [],
    "tags": [],
    "links": [
        {
            "rel": "update-person-user",
            "href": "https://www.stage2d0020.stage.paypal.com/v1/onboarding/onboarding-sessions/GZ8HMD5CDM7Z8/users/TWTW34ZKTXTKQ",
            "method": "PATCH"
        },
        {
            "rel": "person-user",
            "href": "https://www.stage2d0020.stage.paypal.com/v1/onboarding/onboarding-sessions/GZ8HMD5CDM7Z8/users/TWTW34ZKTXTKQ",
            "method": "GET"
        },
        {
            "rel": "upgrade-entities",
            "href": "https://www.stage2d0020.stage.paypal.com/v1/onboarding/onboarding-sessions/GZ8HMD5CDM7Z8/upgrade-entities",
            "method": "POST"
        },
        {
            "rel": "deactivate",
            "href": "https://www.stage2d0020.stage.paypal.com/v1/onboarding/onboarding-sessions/GZ8HMD5CDM7Z8/deactivate",
            "method": "POST"
        },
        {
            "rel": "submit",
            "href": "https://www.stage2d0020.stage.paypal.com/v1/onboarding/onboarding-sessions/GZ8HMD5CDM7Z8/submit",
            "method": "POST"
        }
    ]
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/userinfo-uk.json":[function(require,module,exports){
module.exports={
    "address": {
        "postal_code": "W12 4LQ",
        "locality": "Wolverhampton",
        "region": "West Midlands",
        "country": "GB",
        "street_address": "445731 8th Street, 7430651 Charlois Blvd"
    },
    "family_name": "Merchant",
    "verified": "true",
    "phone_number": "06863424024",
    "businessName": "Joe's Generic Business",
    "name": "Ryan Merchant",
    "email": "harish-uk@paypal.com",
    "given_name": "Ryan",
    "businessSubCategory": "Painting",
    "businessCategory": "Arts",
    "user_id": "https://www.paypal.com/webapps/auth/identity/user/fLajwXVP4yk7IP5jgqSKZ37Kvbg7njyQuDe2q-IoA2I"
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/userinfo-us.json":[function(require,module,exports){
module.exports={
  "user_id": "https://www.paypal.com/webapps/auth/identity/user/PVYZlAGAEqoXYq7OFKO9P8ujK8aTBy_IB1JZLobtoIY",
  "name": "Kimiko Deboe",
  "given_name": "Kimiko",
  "family_name": "Deboe",
  "email": "pphan-us-b10@paypal.com",
  "verified": "true",
  "phone_number": "6824805332",
  "payer_id": "FA86MFJMMSWKL",
  "address": {
    "street_address": "3214265 Main Street 73836 Industrial Drive",
    "locality": "Summit",
    "region": "NJ",
    "postal_code": "07901",
    "country": "US"
  },
  "language": "en_US",
  "account_type": "BUSINESS",
  "account_creation_date": "2011-01-13",
  "businessName": "Joe's Generic Business",
  "businessCategory": "Toys and hobbies",
  "businessSubCategory": "Hobby, toy, and game shops",
  "email_verified": "true"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/validate-config.json":[function(require,module,exports){
module.exports={
  "version": "1",
  "optional": false,
  "modules": []
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Hereapimock/responses/void-payment.json":[function(require,module,exports){
module.exports={
    "correlationId": "33b61b7c889ad",
    "success": true
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/InstLogger.js":[function(require,module,exports){
"use strict";

var _filterInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.getCaptureEndInstrumentationEvent = getCaptureEndInstrumentationEvent;
exports.getInstrumentationBulkEvent = getInstrumentationBulkEvent;
exports.getQrcContextInstrumentationData = getQrcContextInstrumentationData;
exports.getQrcContextTxEndInstrumentationEvent = getQrcContextTxEndInstrumentationEvent;
exports.getTxContextBenchmarkInstrumentationEvent = getTxContextBenchmarkInstrumentationEvent;
exports.getTxContextTxEndInstrumentationEvent = getTxContextTxEndInstrumentationEvent;
exports.offlineReplayEndEvent = offlineReplayEndEvent;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _mccMncList = require("mcc-mnc-list");

var _moment = _interopRequireDefault(require("moment"));

var _retailSDKUtil = require("./retailSDKUtil");

var _Merchant = _interopRequireDefault(require("./Merchant"));

var _OfflinePaymentStatus = require("../transaction/OfflinePaymentStatus");

var _QRCStatus = require("../transaction/qrc/QRCStatus");

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty2(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context3, _context4;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context3 = ownKeys(Object(source), !0)).call(_context3, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context4 = ownKeys(Object(source))).call(_context4, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
} // const Log = log('InstLogger');


var android = 'android';
var ios = 'ios';

function getInstrumentationBulkEvent(events) {
  var _Merchant$sdkEnvironm, _Merchant$sdkEnvironm2, _context, _context2, _Merchant$sdkEnvironm14, _Merchant$sdkEnvironm15, _Merchant$sdkEnvironm16, _Merchant$sdkEnvironm17, _Merchant$sdkEnvironm18, _Merchant$active2, _Merchant$sdkEnvironm19, _Merchant$sdkEnvironm20, _Merchant$sdkEnvironm21;

  var merchantOSName = (_Merchant$sdkEnvironm = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm === void 0 ? void 0 : (_Merchant$sdkEnvironm2 = _Merchant$sdkEnvironm.osName) === null || _Merchant$sdkEnvironm2 === void 0 ? void 0 : _Merchant$sdkEnvironm2.toLowerCase();

  var getEnvironment = function getEnvironment() {
    var _Merchant$sdkEnvironm3, _Merchant$sdkEnvironm4, _Merchant$sdkEnvironm5, _Merchant$sdkEnvironm6;

    return ((_Merchant$sdkEnvironm3 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm3 === void 0 ? void 0 : (_Merchant$sdkEnvironm4 = _Merchant$sdkEnvironm3.appName) === null || _Merchant$sdkEnvironm4 === void 0 ? void 0 : _Merchant$sdkEnvironm4.toLowerCase()) === 'testapp' || ((_Merchant$sdkEnvironm5 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm5 === void 0 ? void 0 : (_Merchant$sdkEnvironm6 = _Merchant$sdkEnvironm5.environment) === null || _Merchant$sdkEnvironm6 === void 0 ? void 0 : _Merchant$sdkEnvironm6.toLowerCase()) !== 'live' ? 'development' : 'production';
  };

  var getMCC = function getMCC() {
    var _Merchant$sdkEnvironm7;

    if ((_Merchant$sdkEnvironm7 = _Merchant["default"].sdkEnvironment) !== null && _Merchant$sdkEnvironm7 !== void 0 && _Merchant$sdkEnvironm7.carrierCode && _Merchant["default"].sdkEnvironment.carrierCode !== 'NA') {
      return _Merchant["default"].sdkEnvironment.carrierCode.substr(0, 3);
    }

    return 'NA';
  };

  var getMNC = function getMNC() {
    var _Merchant$sdkEnvironm8;

    if ((_Merchant$sdkEnvironm8 = _Merchant["default"].sdkEnvironment) !== null && _Merchant$sdkEnvironm8 !== void 0 && _Merchant$sdkEnvironm8.carrierCode && _Merchant["default"].sdkEnvironment.carrierCode !== 'NA') {
      return _Merchant["default"].sdkEnvironment.carrierCode.substr(3);
    }

    return 'NA';
  };

  var getDeviceCarrier = function getDeviceCarrier() {
    var _Merchant$sdkEnvironm9;

    if ((_Merchant$sdkEnvironm9 = _Merchant["default"].sdkEnvironment) !== null && _Merchant$sdkEnvironm9 !== void 0 && _Merchant$sdkEnvironm9.carrierCode) {
      var _operators$;

      var operators = (0, _filterInstanceProperty2(_mccMncList))({
        mccmnc: _Merchant["default"].sdkEnvironment.carrierCode
      });
      return (operators === null || operators === void 0 ? void 0 : (_operators$ = operators[0]) === null || _operators$ === void 0 ? void 0 : _operators$.operator) || 'NA';
    }

    return 'NA';
  };

  var getAdId = function getAdId() {
    var _Merchant$sdkEnvironm10, _Merchant$sdkEnvironm11;

    var osName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
    return (_Merchant$sdkEnvironm10 = _Merchant["default"].sdkEnvironment) !== null && _Merchant$sdkEnvironm10 !== void 0 && _Merchant$sdkEnvironm10.osName && osName && merchantOSName === (osName === null || osName === void 0 ? void 0 : osName.toLowerCase()) ? (_Merchant$sdkEnvironm11 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm11 === void 0 ? void 0 : _Merchant$sdkEnvironm11.osAdId : undefined;
  };

  var getDeviceId = function getDeviceId() {
    var _Merchant$sdkEnvironm12, _Merchant$sdkEnvironm13;

    var osName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
    return (_Merchant$sdkEnvironm12 = _Merchant["default"].sdkEnvironment) !== null && _Merchant$sdkEnvironm12 !== void 0 && _Merchant$sdkEnvironm12.osName && osName && merchantOSName === (osName === null || osName === void 0 ? void 0 : osName.toLowerCase()) ? (_Merchant$sdkEnvironm13 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm13 === void 0 ? void 0 : _Merchant$sdkEnvironm13.deviceId : undefined;
  };

  var mobileOSNameToPlatformMapping = {
    android: 'Android',
    ios: 'iOS'
  };
  var webOSNameToPlatformMapping = {
    darwin: 'Web',
    win32: 'Web',
    win64: 'Web'
  };
  var formattedWebOSName = {
    darwin: 'MacOS',
    win32: 'Windows',
    win64: 'Windows'
  };
  var formattedWebDeviceManufacturer = {
    darwin: 'Apple',
    win32: 'Microsoft',
    win64: 'Microsoft'
  };

  var _map$filter = (0, _filter["default"])(_context = (0, _map["default"])(_context2 = ['darwin', 'win32', 'win64']).call(_context2, function (osName) {
    return getDeviceId(osName);
  })).call(_context, function (id) {
    return !!id;
  }),
      _map$filter2 = (0, _slicedToArray2["default"])(_map$filter, 1),
      partnerWebDeviceID = _map$filter2[0];

  var getAppType = function getAppType() {
    var _Merchant$active;

    return (_Merchant$active = _Merchant["default"].active) !== null && _Merchant$active !== void 0 && _Merchant$active.initWithData && !partnerWebDeviceID ? 'PPH App' : 'PPH Partner App';
  };

  return {
    events: events,
    device_info: {
      android_advertising_id: getAdId(android),
      android_uuid: getDeviceId(android),
      brand: (_Merchant$sdkEnvironm14 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm14 === void 0 ? void 0 : _Merchant$sdkEnvironm14.brand,
      ios_advertising_id: getAdId(ios),
      ios_idfv: getDeviceId(ios),
      platform: mobileOSNameToPlatformMapping[merchantOSName],
      os_version: (_Merchant$sdkEnvironm15 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm15 === void 0 ? void 0 : _Merchant$sdkEnvironm15.osVersion,
      device_model: (_Merchant$sdkEnvironm16 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm16 === void 0 ? void 0 : _Merchant$sdkEnvironm16.deviceModel,
      device_manufacturer: (_Merchant$sdkEnvironm17 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm17 === void 0 ? void 0 : _Merchant$sdkEnvironm17.deviceManufacturer,
      network_carrier: getDeviceCarrier(),
      network_mobile_country_code: getMCC(),
      network_code: getMNC()
    },
    user_attributes: {
      'App Name': (_Merchant$sdkEnvironm18 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm18 === void 0 ? void 0 : _Merchant$sdkEnvironm18.appName,
      'App Type': getAppType(),
      'Partner ID': ((_Merchant$active2 = _Merchant["default"].active) === null || _Merchant$active2 === void 0 ? void 0 : _Merchant$active2.getReferrerCode()) || 'NA',
      'Amplitude.device_id': partnerWebDeviceID,
      'Amplitude.platform': webOSNameToPlatformMapping[merchantOSName],
      'Amplitude.os_name': formattedWebOSName[merchantOSName],
      'Amplitude.device_manufacturer': formattedWebDeviceManufacturer[merchantOSName],
      'Browser Name': (_Merchant$sdkEnvironm19 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm19 === void 0 ? void 0 : _Merchant$sdkEnvironm19.browserName,
      'Browser Version': (_Merchant$sdkEnvironm20 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm20 === void 0 ? void 0 : _Merchant$sdkEnvironm20.browserVersion
    },
    deleted_user_attributes: [],
    user_identities: {
      customerid: _Merchant["default"].active.payerId
    },
    application_info: {
      application_name: 'RetailSDK',
      application_version: (_Merchant$sdkEnvironm21 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm21 === void 0 ? void 0 : _Merchant$sdkEnvironm21.appVersion
    },
    schema_version: 2,
    environment: getEnvironment()
  };
}

function getCaptureEndInstrumentationEvent(request, error) {
  var _request$gratuity, _Merchant$sdkEnvironm22;

  var errorData = error ? {
    'Error Domain': error.domain,
    'Error Code': error.code,
    'Error Message': error.message
  } : {};
  return {
    data: {
      event_name: 'SDK Transaction Completed',
      custom_event_type: 'transaction',
      timestamp_unixtime_ms: (0, _moment["default"])().valueOf(),
      custom_attributes: _objectSpread({
        Amount: request.totalAmount.value,
        'Tip Amount': (_request$gratuity = request.gratuity) === null || _request$gratuity === void 0 ? void 0 : _request$gratuity.value,
        'Discount Amount': 0,
        'Tax Amount': 0,
        'Reader Type': 'None',
        CVM: request.signature !== '' ? 'Signature' : 'None',
        'Payment Type': 'None',
        'Payment Status': request.message,
        'Sale Type': 'Capture',
        'Quick Chip': 'No',
        'SDK Version': (_Merchant$sdkEnvironm22 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm22 === void 0 ? void 0 : _Merchant$sdkEnvironm22.retailSDKVersion,
        'Transaction Error': error ? 'Yes' : 'No'
      }, errorData)
    },
    event_type: 'custom_event'
  };
}

function getTxContextTxEndInstrumentationEvent(context, error) {
  var _context$invoice, _context$invoice2, _context$invoice3, _context$invoice4, _context$invoice5, _Merchant$sdkEnvironm23, _Merchant$active3;

  var txEnd = (0, _retailSDKUtil.getTxEndData)(context);
  var gcData = context.invoice.hasDigitalGiftCardPayment || context.isDigitalCardTrasnactionVoided ? {
    'Has Digital Gift Card': 'Yes',
    'Amount After Digital Gift Card': (_context$invoice = context.invoice) === null || _context$invoice === void 0 ? void 0 : _context$invoice.total,
    'Amount Paid With Digital Gift Card': (_context$invoice2 = context.invoice) === null || _context$invoice2 === void 0 ? void 0 : _context$invoice2.digitalCardTotal,
    'Digital Gift Card Void': context.isDigitalCardTrasnactionVoided ? 'Yes' : 'No'
  } : {};
  var errorData = error ? {
    'Error Domain': error.domain,
    'Error Code': error.code,
    'Error Message': error.message
  } : {};
  return {
    data: {
      event_name: 'SDK Transaction Completed',
      custom_event_type: 'transaction',
      timestamp_unixtime_ms: (0, _moment["default"])().valueOf(),
      custom_attributes: _objectSpread(_objectSpread({
        'Transaction ID': context.id,
        Amount: context.transactionAmount,
        'Tip Amount': (_context$invoice3 = context.invoice) === null || _context$invoice3 === void 0 ? void 0 : _context$invoice3.gratuityAmount,
        'Discount Amount': (_context$invoice4 = context.invoice) === null || _context$invoice4 === void 0 ? void 0 : _context$invoice4.totalDiscount,
        'Tax Amount': (_context$invoice5 = context.invoice) === null || _context$invoice5 === void 0 ? void 0 : _context$invoice5.itemTax,
        'Reader Type': txEnd.readerType(),
        CVM: txEnd.cvm(),
        'Payment Type': txEnd.paymentType(),
        'Vault Type': txEnd.vaultType(),
        'Payment Status': txEnd.flowData.message,
        'Sale Type': txEnd.transactionType(),
        'Quick Chip': context.quickChipEnabled ? 'Yes' : 'No',
        'SDK Version': (_Merchant$sdkEnvironm23 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm23 === void 0 ? void 0 : _Merchant$sdkEnvironm23.retailSDKVersion,
        'Offline Payment': context.offlinePaymentEnabled ? 'Yes' : 'No',
        'Transaction Error': error ? 'Yes' : 'No',
        'Soft Descriptor': ((_Merchant$active3 = _Merchant["default"].active) === null || _Merchant$active3 === void 0 ? void 0 : _Merchant$active3.softDescriptor) || 'NA'
      }, gcData), errorData)
    },
    event_type: 'custom_event'
  };
}

function getTxContextBenchmarkInstrumentationEvent(context, error) {
  var _context$card, _Merchant$sdkEnvironm24;

  var txEnd = (0, _retailSDKUtil.getTxEndData)(context);
  var timeStamps = context.timeCard.timeStamps || {};
  return {
    data: {
      event_name: 'SDK Transaction Timestamps',
      custom_event_type: 'transaction',
      timestamp_unixtime_ms: (0, _moment["default"])().valueOf(),
      custom_attributes: _objectSpread({
        'Transaction ID': context.id,
        'Reader Type': txEnd.readerType(),
        'Payment Type': txEnd.paymentType(),
        'Vault Type': txEnd.vaultType(),
        'Sale Type': txEnd.transactionType(),
        'Payment Status': txEnd.flowData.message,
        'Quick Chip': context.quickChipEnabled ? 'Yes' : 'No',
        'Form Factor': ((_context$card = context.card) === null || _context$card === void 0 ? void 0 : _context$card.formFactor) || 'NA',
        CVM: txEnd.cvm(),
        'SDK Version': (_Merchant$sdkEnvironm24 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm24 === void 0 ? void 0 : _Merchant$sdkEnvironm24.retailSDKVersion,
        'Has Digital Gift Card': context.invoice.hasDigitalGiftCardPayment ? 'Yes' : 'No',
        'Offline Payment': context.offlinePaymentEnabled ? 'Yes' : 'No',
        'Transaction Error': error ? 'Yes' : 'No'
      }, timeStamps)
    },
    event_type: 'custom_event'
  };
}

function offlineReplayEndEvent(status) {
  var _status$invoice, _status$invoice2, _status$invoice3, _Merchant$sdkEnvironm25;

  return {
    data: {
      event_name: 'SDK Offline Transaction Completed',
      custom_event_type: 'transaction',
      timestamp_unixtime_ms: (0, _moment["default"])().valueOf(),
      custom_attributes: {
        Amount: status.amount,
        'Tip Amount': (_status$invoice = status.invoice) === null || _status$invoice === void 0 ? void 0 : _status$invoice.gratuityAmount,
        'Discount Amount': (_status$invoice2 = status.invoice) === null || _status$invoice2 === void 0 ? void 0 : _status$invoice2.totalDiscount,
        'Tax Amount': (_status$invoice3 = status.invoice) === null || _status$invoice3 === void 0 ? void 0 : _status$invoice3.itemTax,
        'Replay Count': status.replay,
        'Reader Type': status.instrumentation.readerType,
        CVM: status.instrumentation.cvm,
        'Payment Type': status.instrumentation.paymentType,
        'Payment Status': _OfflinePaymentStatus.OfflinePaymentInstrumentationStatus[_OfflinePaymentStatus.OfflineTransactionState.toString[status.state]],
        'Sale Type': status.instrumentation.saleType,
        'Quick Chip': status.instrumentation.quickChip,
        'SDK Version': (_Merchant$sdkEnvironm25 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm25 === void 0 ? void 0 : _Merchant$sdkEnvironm25.retailSDKVersion
      }
    },
    event_type: 'custom_event'
  };
}

function getQrcContextTxEndInstrumentationEvent(qrcData) {
  return {
    data: {
      event_name: 'SDK QRC Transaction Completed',
      custom_event_type: 'transaction',
      timestamp_unixtime_ms: (0, _moment["default"])().valueOf(),
      custom_attributes: {
        'Invoice ID': qrcData.qrcInvoiceId,
        Amount: qrcData.amount,
        'Tip Amount': qrcData.tipAmount,
        'Discount Amount': qrcData.discountAmount,
        'Tax Amount': qrcData.taxAmount,
        'Payment Type': qrcData.paymentType,
        'Sale Type': qrcData.saleType,
        'Payment Status': qrcData.paymentStatus,
        'SDK Version': qrcData.sdkVersion,
        'Store ID': qrcData.storeId,
        'Session ID': qrcData.sessionId,
        'Soft Descriptor': qrcData.softDescriptor,
        Provider: qrcData.provider
      }
    },
    event_type: 'custom_event'
  };
}

function getQrcContextInstrumentationData(qrc) {
  var _qrc$invoice, _qrc$invoice2, _qrc$invoice3, _qrc$invoice4, _qrc$invoice5, _qrc$qrcStatusHandler, _qrc$qrcStatusHandler2, _Merchant$sdkEnvironm26, _Merchant$active4, _Merchant$active5, _Merchant$active6;

  var txData = (0, _retailSDKUtil.getTxEndData)(qrc.txContext);
  return {
    qrcInvoiceId: (_qrc$invoice = qrc.invoice) === null || _qrc$invoice === void 0 ? void 0 : _qrc$invoice.payPalId,
    amount: (_qrc$invoice2 = qrc.invoice) === null || _qrc$invoice2 === void 0 ? void 0 : _qrc$invoice2.total,
    tipAmount: (_qrc$invoice3 = qrc.invoice) === null || _qrc$invoice3 === void 0 ? void 0 : _qrc$invoice3.gratuityAmount,
    discountAmount: (_qrc$invoice4 = qrc.invoice) === null || _qrc$invoice4 === void 0 ? void 0 : _qrc$invoice4.totalDiscount,
    taxAmount: (_qrc$invoice5 = qrc.invoice) === null || _qrc$invoice5 === void 0 ? void 0 : _qrc$invoice5.itemTax,
    paymentType: txData.paymentType(),
    saleType: txData === null || txData === void 0 ? void 0 : txData.transactionType(),
    paymentStatus: _QRCStatus.QrcPaymentInstrumentationStatus[_QRCStatus.QRCStatus.toString[(_qrc$qrcStatusHandler = qrc.qrcStatusHandler) === null || _qrc$qrcStatusHandler === void 0 ? void 0 : (_qrc$qrcStatusHandler2 = _qrc$qrcStatusHandler.qrcRecord) === null || _qrc$qrcStatusHandler2 === void 0 ? void 0 : _qrc$qrcStatusHandler2.qrcStatus]],
    sdkVersion: (_Merchant$sdkEnvironm26 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm26 === void 0 ? void 0 : _Merchant$sdkEnvironm26.retailSDKVersion,
    storeId: qrc.storeId,
    sessionId: qrc.sessionId,
    provider: qrc.qrcProvider,
    merchantQrcServiceProvider: (_Merchant$active4 = _Merchant["default"].active) === null || _Merchant$active4 === void 0 ? void 0 : _Merchant$active4.qrcServiceProvider,
    merchantQrcTemplates: (_Merchant$active5 = _Merchant["default"].active) === null || _Merchant$active5 === void 0 ? void 0 : _Merchant$active5.qrcTemplates,
    softDescriptor: ((_Merchant$active6 = _Merchant["default"].active) === null || _Merchant$active6 === void 0 ? void 0 : _Merchant$active6.softDescriptor) || 'NA'
  };
}

},{"../transaction/OfflinePaymentStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/OfflinePaymentStatus.js","../transaction/qrc/QRCStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatus.js","./Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","./retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","mcc-mnc-list":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/mcc-mnc-list/index.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/JoseCryptoMgr.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _nodeJose = require("node-jose");

var Log = (0, _manticoreLog["default"])('cryptoMgr');
var cryptoConfig = {
  pem: 'pem',
  utf8: 'utf8',
  encoder: 'A256GCM',
  // 'A256CBC-HS512' also works!;
  alg: 'RSA-OAEP-256'
};

function makeJWTKey(_x) {
  return _makeJWTKey.apply(this, arguments);
}

function _makeJWTKey() {
  _makeJWTKey = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(pem) {
    return _regenerator["default"].wrap(function _callee2$(_context2) {
      while (1) {
        switch (_context2.prev = _context2.next) {
          case 0:
            return _context2.abrupt("return", _nodeJose.JWK.asKey(pem, cryptoConfig.pem));

          case 1:
          case "end":
            return _context2.stop();
        }
      }
    }, _callee2);
  }));
  return _makeJWTKey.apply(this, arguments);
}

function decode(string) {
  var decoded = Buffer.from(string, 'base64').toString();

  try {
    return JSON.parse(decoded);
  } catch (e) {
    return decoded;
  }
}
/**
 * CryptoMgr is responsible for exposing APIs regarding the jose encryption/decryption.
 * None of the APIs are accessible to the native side
 */


var JoseCryptoMgr = /*#__PURE__*/function () {
  function JoseCryptoMgr() {
    (0, _classCallCheck2["default"])(this, JoseCryptoMgr);
  }

  (0, _createClass2["default"])(JoseCryptoMgr, [{
    key: "setPublicKey",
    value: function setPublicKey(key) {
      this._publicKey = key;
    }
  }, {
    key: "encrypt",
    value: function () {
      var _encrypt = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(raw) {
        var buffer, key, jwksKey, encrypted;
        return _regenerator["default"].wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                if (raw) {
                  _context.next = 2;
                  break;
                }

                throw new Error('Jose encrypt: Missing raw data.');

              case 2:
                if (this._publicKey) {
                  _context.next = 4;
                  break;
                }

                throw new Error('Jose encrypt: Public Key is NOT set');

              case 4:
                buffer = Buffer.from((0, _stringify["default"])(raw), cryptoConfig.utf8);
                key = decode(this._publicKey);
                _context.next = 8;
                return makeJWTKey(key);

              case 8:
                jwksKey = _context.sent;
                _context.next = 11;
                return _nodeJose.JWE.createEncrypt({
                  format: 'compact',
                  protect: '',
                  contentAlg: cryptoConfig.encoder,
                  fields: {
                    cty: 'application/json',
                    enc: cryptoConfig.encoder,
                    alg: cryptoConfig.alg
                  }
                }, jwksKey).update(buffer)["final"]();

              case 11:
                encrypted = _context.sent;
                Log.debug('Encrypted:', function () {
                  return encrypted;
                });
                return _context.abrupt("return", encrypted);

              case 14:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function encrypt(_x2) {
        return _encrypt.apply(this, arguments);
      }

      return encrypt;
    }()
  }]);
  return JoseCryptoMgr;
}();

var joseCryptoMgr = new JoseCryptoMgr(); // eslint-disable-line no-unused-vars

var _default = joseCryptoMgr;
exports["default"] = _default;

}).call(this)}).call(this,require("buffer").Buffer)
},{"@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","node-jose":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$keys2 = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.replace.js");

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

require("core-js/modules/es.promise.js");

require("core-js/modules/es.promise.finally.js");

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _startsWith = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/starts-with"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _trim = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/trim"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _parseFloat2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-float"));

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _paypalrestManticore = require("@paypalcorp/paypalrest-manticore");

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _retailPageTracker = require("retail-page-tracker");

var _events = require("events");

var _moment = _interopRequireDefault(require("moment"));

var _PPObjects = _interopRequireDefault(require("./PPObjects"));

var _sdkErrors = require("./sdkErrors");

var _retailSDKUtil = require("./retailSDKUtil");

var _JoseCryptoMgr = _interopRequireDefault(require("./JoseCryptoMgr"));

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys2(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context26, _context27;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context26 = ownKeys(Object(source), !0)).call(_context26, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context27 = ownKeys(Object(source))).call(_context27, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('merchant');

function simpleUrl(env, service, op) {
  if (service === 'retail') {
    var _context;

    return (0, _concat["default"])(_context = "".concat((0, _retailSDKUtil.getHost)(env), "/v1/retail/")).call(_context, op);
  }

  if (service === 'auth') {
    var _context2, _context3; // 5/11/2018- Identity team suggested using openidconnect to retrieve business information
    // return `https://${host}.paypal.com/v1/oauth2/token/${op}`;


    return (0, _startsWith["default"])(env).call(env, 'stage') ? (0, _concat["default"])(_context2 = "https://www.".concat(env, ".stage.paypal.com/webapps/auth/protocol/openidconnect/v1/")).call(_context2, op) : (0, _concat["default"])(_context3 = "".concat((0, _retailSDKUtil.getHost)(env), "/v1/identity/openidconnect/")).call(_context3, op);
  }

  if (service === 'payments') {
    var _context4;

    return (0, _concat["default"])(_context4 = "".concat((0, _retailSDKUtil.getHost)(env), "/v1/payments/")).call(_context4, op);
  }

  if (service === 'activities') {
    var _context5;

    return (0, _concat["default"])(_context5 = "".concat((0, _retailSDKUtil.getHost)(env), "/v1/activities/")).call(_context5, op);
  }

  if (service === 'devices') {
    var _context6;

    return (0, _concat["default"])(_context6 = "".concat((0, _retailSDKUtil.getHost)(env), "/v2/devices/")).call(_context6, op);
  }

  return null;
}

var defaultQrcURLFormatter = function defaultQrcURLFormatter(template, qrcServiceProvider, merchantRefId, timeStamp) {
  return decodeURIComponent(template).replace(/\{payer_id\}/, qrcServiceProvider).replace(/\{merchant_ref_id\}/, merchantRefId).replace(/\{time_stamp\}/, timeStamp);
};
/**
 * The merchant represents the account that all calls to the PayPal services will affect. Essentially this is
 * where all collected money will go, which account locations and checkin operations will occur under, etc.
 * @class
 * @property {string} emailAddress The email address of the merchant. @readonly
 * @property {string} businessName The name of the business operated by the merchant. @readonly
 * @property {string} currency The "home" currency of the merchant. @readonly
 * @property {string} payerId The payer id of the merchant. @readonly
 * @property {InvoiceAddress} address The business address of the merchant @readonly
 * @property {string} environment The PayPal environment this merchant exists in - live or sandbox. Sandbox means the money is not real! @readonly
 * @property {decimal} signatureRequiredAbove The invoice total amount above which signature would be collected for swipe transactions.
 * @property {bool} isCertificationMode Run in certification mode.
 * @property {string} referrerCode The Partner Attribution Id code that is used for analytics
 * @property {string} storeId The storeId to pull the store location address
 * @property {string} softDescriptor The soft descriptor that will be shown on the receipt,  provided by the partner
 * PLEASE NOTE: manipulating this setting (especially upwards) may cause you to be liable for chargebacks in the event we cannot retrieve
 * a signature for the transaction. MODIFY THIS SETTING AT YOUR OWN RISK!
 */


var Merchant = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(Merchant, _EventEmitter);

  var _super = _createSuper(Merchant);
  /**
   * Only JS will make Merchants.
   * @package
   * @constructor
   */


  function Merchant(data) {
    var _this;

    (0, _classCallCheck2["default"])(this, Merchant);
    _this = _super.call(this);
    Merchant.active = null;
    _this.api = null;
    _this.userInfo = {};
    _this.status = {};
    _this.cbs = [];
    _this.environment = 'live';
    _this.pairingId = '';
    _this._isOffline = false;
    _this._offlineInit = false;
    _this._onlineStatus = null;
    _this._onlineUserInfo = null;
    _this._initWithData = false;
    _this._address = new _paypalInvoicing.InvoiceAddress();

    if (data) {
      _this._initWithData = true;

      _this._validateAndSetCompositeToken(data);

      _this._buildObjectWithData(data);

      _this.isAccessTokenValid = true;
    }

    return _this;
  }

  (0, _createClass2["default"])(Merchant, [{
    key: "initializeWithData",
    value: function initializeWithData(callback) {
      var _this2 = this;

      this._loadMerchantStatusFromData(function (err) {
        Log.track('MerchantUserInfoPostStatus', _this2._getUserInfoLog(_this2.userInfo));

        if (err) {
          Log.error('merchantStatusLoadFailed', {
            errName: (0, _retailSDKUtil.getErrorName)(err),
            errDomain: err.domain || 'None',
            errCode: err.code || 'None',
            err: (0, _stringify["default"])(err),
            payerId: _this2.payerId || 'None'
          });
        } else {
          Log.info('Successfully initialized merchant from data: ', {
            payerId: _this2.payerId
          });
        }

        _this2._merchantInitialized(false, undefined, callback);
      });
    }
  }, {
    key: "initialize",
    value: function initialize(token, repository, callback) {
      this._initWithData = false;

      this._setToken(token, repository);

      this._fetchMerchantInfo(callback);

      return true;
    }
  }, {
    key: "initializeOffline",
    value: function initializeOffline(callback) {
      this.loadOfflineMerchant(true, callback);
      return true;
    }
  }, {
    key: "_validateAndSetCompositeToken",
    value: function _validateAndSetCompositeToken(data) {
      var _data$compositeToken;

      if ((data === null || data === void 0 ? void 0 : (_data$compositeToken = data.compositeToken) === null || _data$compositeToken === void 0 ? void 0 : _data$compositeToken.length) > 0 && data !== null && data !== void 0 && data.repository) {
        this._setToken(data.compositeToken, data.repository);

        return;
      }

      throw _sdkErrors.merchant.invalidToken;
    }
  }, {
    key: "_makeInvoiceResolver",
    value: function _makeInvoiceResolver(api) {
      var _this3 = this;

      var env = api.env;
      return function (service, opts) {
        var _context7;

        opts.headers = opts.headers || {};
        opts.headers['X-PAYPAL-REQUEST-SOURCE'] = 'MPA-DEVICE';

        if (Merchant.sdkUserAgent) {
          // The Merchant.sdkUserAgent User-Agent must ONLY be used for API calls made to PayPal Here Services
          opts.headers['User-Agent'] = Merchant.sdkUserAgent;
        }

        var referrerCode = _this3.referrerCode || _this3.referrerCodeFromInvoice;
        Log.debug(function () {
          return "referrerCode ".concat(referrerCode);
        });

        if (referrerCode) {
          opts.headers['PayPal-Partner-Attribution-Id'] = referrerCode;
        }

        return (0, _concat["default"])(_context7 = "".concat((0, _retailSDKUtil.getHost)(env), "/v1/invoicing/")).call(_context7, opts.op);
      };
    }
  }, {
    key: "updateReferrerCode",
    value: function updateReferrerCode(invoice) {
      // Note that for sideloader apps, the referrerCode comes from invoice only!
      if (invoice.referrerCode) {
        Log.debug(function () {
          return "referrerCode ".concat(invoice.referrerCode, " updated from invoice");
        });
        this.referrerCodeFromInvoice = invoice.referrerCode;
      } else {
        this.referrerCodeFromInvoice = null;
      }
    }
  }, {
    key: "_setToken",
    value: function _setToken(token, repository) {
      this.api = _paypalrestManticore.PayPalREST.fromToken(token);
      _paypalInvoicing.InvoicingRequester.api = this.api;
      this.environment = this.api.env;
      this.repository = repository;
      this.api.addResolver('retail', Merchant._resolver);
      this.api.addResolver('auth', Merchant._resolver);
      this.api.addResolver('invoicing', this._makeInvoiceResolver(this.api));
      this.api.addResolver('payments', Merchant._resolver);
      this.api.addResolver('devices', Merchant._resolver); // This is a "non-server SDK" generally, so warn if they have app info

      if (this.api.app) {
        Log.warn('Using debug-only SDK token with embedded app secret. DO NOT USE IN LIVE APPS.');
      }

      Log.debug('Setting Merchant Token', {
        environment: this.environment,
        repository: this.repository
      });
    }
  }, {
    key: "_fetchMerchantInfo",
    value: function _fetchMerchantInfo(callback) {
      var _this4 = this;

      this._loadMerchantStatusFromToken(function (err) {
        if (!err) {
          _PPObjects["default"].loadFeatureMapFile();

          if (_this4.environment === 'sandbox') {
            _PPObjects["default"].loadBraintreeSandboxCardsFile();
          }
        }

        _this4._merchantInitialized(false, err, callback);
      });
    }
  }, {
    key: "_saveOfflineMerchant",
    value: function _saveOfflineMerchant() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      var offlineMerchant = {
        initWithData: this.initWithData,
        environment: this.environment,
        repository: this.repository,
        status: this.status,
        softDescriptor: this.softDescriptor,
        storeId: this.storeId,
        userInfo: {
          payerId: this.userInfo.payerId,
          address: this.address.toJSON(),
          email: this.emailAddress,
          businessName: this.businessName,
          phoneDictionary: this.phoneDictionary
        }
      };
      Log.debug(function () {
        return 'offlineMerchant:';
      }, offlineMerchant);
      (0, _retailSDKUtil.saveOfflineMerchant)(offlineMerchant).then(function () {
        return callback();
      })["catch"](function (error) {
        return callback(error);
      });
    }
  }, {
    key: "loadOfflineMerchant",
    value: function loadOfflineMerchant(setToken, callback) {
      var _this5 = this;

      var err = null;
      (0, _retailSDKUtil.getOfflineMerchantFromStorage)().then(function (offlineMerchant) {
        var _offlineMerchant$stat, _offlineMerchant$stat2;

        if (offlineMerchant !== null && offlineMerchant !== void 0 && (_offlineMerchant$stat = offlineMerchant.status) !== null && _offlineMerchant$stat !== void 0 && (_offlineMerchant$stat2 = _offlineMerchant$stat.cardSettings) !== null && _offlineMerchant$stat2 !== void 0 && _offlineMerchant$stat2.storedPaymentEligibility) {
          if (setToken) {
            var offlineToken = "{\"env\": \"".concat(offlineMerchant.environment, "\",") + '"access_token": "offlineAccessToken","expires_in": "","refresh_url": "http://offline-pph.paypal.com"}';
            Log.debug(function () {
              var _context8;

              return (0, _concat["default"])(_context8 = "loadOfflineMerchant set token ".concat(offlineToken, " \n for repository ")).call(_context8, offlineMerchant.repository);
            });

            _this5._setToken(offlineToken, offlineMerchant.repository);
          }

          _this5._offlineInit = setToken;
          _this5._onlineStatus = _this5.status;
          _this5._onlineUserInfo = _this5.userInfo;
          _this5._address = null;
          _this5._initWithData = offlineMerchant.initWithData;
          _this5.status = offlineMerchant.status;
          _this5.userInfo = offlineMerchant.userInfo;
          _this5.softDescriptor = offlineMerchant.softDescriptor;
          _this5.storeId = offlineMerchant.storeId;
          _paypalInvoicing.Invoice.DefaultCurrency = _this5.currency;
          _paypalInvoicing.Invoice.DefaultMerchant = {
            emailAddress: _this5.emailAddress,
            businessName: _this5.businessName,
            address: _this5.addressCopy,
            phoneDictionary: _this5.phoneDictionary
          };
          Log.info('OfflineMerchantLoaded', offlineMerchant);
        } else if (!offlineMerchant) {
          Log.error('Failed to load merchant information. No prior info saved.');
          err = _sdkErrors.merchant.offlineInfoNotAvailable;
        } else if (offlineMerchant.status && offlineMerchant.status.cardSettings && !offlineMerchant.status.cardSettings.storedPaymentEligibility) {
          Log.error('Failed to load merchant information. Merchant is not offlineEnabled.');
          err = _sdkErrors.merchant.offlinePaymentIneligible;
        } else {
          Log.error('offlineUserInfo> error loading offline merchant info');
          err = _sdkErrors.merchant.failedToLoadOfflineMerchant;
        }

        Log.info('OfflineMerchantLoaded _merchantInitialized');

        _this5._merchantInitialized(true, err, callback);
      })["catch"](function (storageError) {
        Log.error("offlineUserInfo> error loading offline merchant info: ".concat((0, _stringify["default"])(storageError)));
        err = _sdkErrors.merchant.failedToLoadOfflineMerchant;

        _this5._merchantInitialized(false, err, callback);
      });
    }
  }, {
    key: "reloadOnlineMerchant",
    value: function reloadOnlineMerchant(callback) {
      var _this6 = this;

      Log.debug(function () {
        var _context9;

        return (0, _concat["default"])(_context9 = "reloadOnlineMerchant offlineInit: ".concat(_this6._offlineInit, ", isOffline: ")).call(_context9, _this6._isOffline);
      });

      if (!this._offlineInit) {
        if (this._isOffline) {
          Log.debug('reloadOnlineMerchant...');
          this._address = null;
          this.status = this._onlineStatus;
          this.userInfo = this._onlineUserInfo;
          _paypalInvoicing.Invoice.DefaultMerchant = {
            emailAddress: this.emailAddress,
            businessName: this.businessName,
            address: this.addressCopy,
            phoneDictionary: this.phoneDictionary
          };
          this._isOffline = false;
        }

        if (callback) {
          callback(null, this);
        }
      } else if (callback) {
        Log.debug('failedToReloadOnlineMerchant');
        callback(_sdkErrors.merchant.failedToReloadOnlineMerchant, this);
      }
    }
  }, {
    key: "_getUserInfoLog",
    value: function _getUserInfoLog(info) {
      var _info$addresses, _info$phones, _info$address, _info$businessAddress, _info$phoneDictionari, _info$phoneDictionari2;

      return {
        addressesExists: !!(info !== null && info !== void 0 && info.addresses),
        phonesExists: !!(info !== null && info !== void 0 && info.phones),
        addressExists: !!(info !== null && info !== void 0 && info.address),
        phoneExists: !!(info !== null && info !== void 0 && info.phone_number),
        addressCount: info === null || info === void 0 ? void 0 : (_info$addresses = info.addresses) === null || _info$addresses === void 0 ? void 0 : _info$addresses.length,
        phoneCount: info === null || info === void 0 ? void 0 : (_info$phones = info.phones) === null || _info$phones === void 0 ? void 0 : _info$phones.length,
        addressType: info === null || info === void 0 ? void 0 : (_info$address = info.address) === null || _info$address === void 0 ? void 0 : _info$address.type,
        businessAddressType: info === null || info === void 0 ? void 0 : (_info$businessAddress = info.businessAddress) === null || _info$businessAddress === void 0 ? void 0 : _info$businessAddress.type,
        phoneType: info === null || info === void 0 ? void 0 : (_info$phoneDictionari = info.phoneDictionaries) === null || _info$phoneDictionari === void 0 ? void 0 : _info$phoneDictionari.type,
        countryCode: !!(info !== null && info !== void 0 && (_info$phoneDictionari2 = info.phoneDictionaries) !== null && _info$phoneDictionari2 !== void 0 && _info$phoneDictionari2.countryCode),
        emailExists: !!(info !== null && info !== void 0 && info.email),
        logglyAccessTokenExists: !!this.logglyAccessToken,
        instrumentationAccessTokenexists: !!this.instrumentationAccessToken
      };
    }
  }, {
    key: "_decodeAndParseAccountInfo",
    value: function _decodeAndParseAccountInfo(encodedData, correlationId) {
      var logger = {};
      var decodedJSONString = '';

      try {
        var _decodedJSON$addresse, _decodedJSON$addresse2, _decodedJSON$phones, _decodedJSON$phones2, _context12, _context13;

        decodedJSONString = Buffer.from(encodedData, 'base64').toString('ascii');
        var decodedJSON = JSON.parse(decodedJSONString) || {};
        var businessAddress = ((_decodedJSON$addresse = decodedJSON.addresses) === null || _decodedJSON$addresse === void 0 ? void 0 : (0, _find["default"])(_decodedJSON$addresse).call(_decodedJSON$addresse, function (value) {
          var _value$type, _context10;

          return (_value$type = value.type) === null || _value$type === void 0 ? void 0 : (0, _includes["default"])(_context10 = _value$type.toLowerCase()).call(_context10, 'business');
        })) || ((_decodedJSON$addresse2 = decodedJSON.addresses) === null || _decodedJSON$addresse2 === void 0 ? void 0 : _decodedJSON$addresse2[0]);
        var phoneDictionaries = ((_decodedJSON$phones = decodedJSON.phones) === null || _decodedJSON$phones === void 0 ? void 0 : (0, _find["default"])(_decodedJSON$phones).call(_decodedJSON$phones, function (value) {
          var _value$phoneType, _context11;

          return (_value$phoneType = value.phoneType) === null || _value$phoneType === void 0 ? void 0 : (0, _includes["default"])(_context11 = _value$phoneType.toLowerCase()).call(_context11, 'work');
        })) || ((_decodedJSON$phones2 = decodedJSON.phones) === null || _decodedJSON$phones2 === void 0 ? void 0 : _decodedJSON$phones2[0]) || {};
        logger = this._getUserInfoLog(_objectSpread(_objectSpread({}, decodedJSON), {}, {
          businessAddress: businessAddress,
          phoneDictionaries: phoneDictionaries
        }));
        return _objectSpread(_objectSpread({}, decodedJSON), {}, {
          name: decodedJSON.firstName || decodedJSON.lastName ? (0, _trim["default"])(_context12 = (0, _concat["default"])(_context13 = "".concat(decodedJSON.firstName, " ")).call(_context13, decodedJSON.lastName)).call(_context12) : '',
          address: businessAddress,
          phone_number: phoneDictionaries.phoneNumber || '',
          country_code: phoneDictionaries.countryCode || ''
        });
      } catch (error) {
        var _decodedJSONString; // Get masked data to help us get a hint of what could be wrong


        var maskedDecodedData = (_decodedJSONString = decodedJSONString) === null || _decodedJSONString === void 0 ? void 0 : _decodedJSONString.replace(/([a-zA-Z0-9])/g, 'a');
        Log.error('accountInfoParseFailed', _objectSpread({
          error: error.toString(),
          correlationId: correlationId,
          maskedDecodedData: maskedDecodedData
        }, logger));
      }

      return undefined;
    }
    /**
     * Provide a token expiration handler if you want to handle token expiration during a transaction
     * @param {Merchant~tokenExpirationHandler} expirationHandler
     */

  }, {
    key: "setTokenExpiredHandler",
    value: function setTokenExpiredHandler(expirationHandler) {
      var _this$api, _this$api2;

      if (!expirationHandler && this.api) {
        this.api.tokenExpirationHandler = undefined;
        return;
      }

      if ((_this$api = this.api) !== null && _this$api !== void 0 && _this$api.tokenExpirationHandler) {
        Log.info('Expiration handler can not be updated once set');
        return;
      }

      (_this$api2 = this.api) === null || _this$api2 === void 0 ? void 0 : _this$api2.setTokenExpirationHandler(expirationHandler);
    }
  }, {
    key: "_loadMerchantStatus",
    value: function _loadMerchantStatus(initializedFromData, cb) {
      var _this7 = this;

      Log.debug('Loading merchant status...');
      this.request({
        service: 'retail',
        op: 'status',
        format: 'json'
      }, function (err, hereApiStatus) {
        var _hereApiStatus$body, _hereApiStatus$header, _this7$_decodeAndPars;

        if (err) {
          cb(err, _this7);
          return;
        }

        var status = hereApiStatus.body;
        var correlationId = (hereApiStatus === null || hereApiStatus === void 0 ? void 0 : (_hereApiStatus$body = hereApiStatus.body) === null || _hereApiStatus$body === void 0 ? void 0 : _hereApiStatus$body.correlationId) || (hereApiStatus === null || hereApiStatus === void 0 ? void 0 : (_hereApiStatus$header = hereApiStatus.headers) === null || _hereApiStatus$header === void 0 ? void 0 : _hereApiStatus$header['paypal-debug-id']);

        if (!_this7._validateStatus(status) || !status.merchant_info) {
          // 'Failed to load required merchant status information like currency code, status, payment types.');
          Log.error('merchantStatusValidationFailed', {
            statusExists: !!status,
            status: status === null || status === void 0 ? void 0 : status.status,
            currencyCode: status === null || status === void 0 ? void 0 : status.currencyCode,
            businessCategoryExists: status === null || status === void 0 ? void 0 : status.businessCategoryExists,
            paymentTypes: status === null || status === void 0 ? void 0 : status.paymentTypes,
            merchantInfoExists: !!(status !== null && status !== void 0 && status.merchant_info),
            correlationId: correlationId
          });
          cb(_sdkErrors.merchant.invalidMerchantStatusInfo, null);
          return;
        }

        _this7.logglyAccessToken = status.logglyAccessToken;
        _this7.instrumentationAccessToken = status.instrumentationAccessToken;
        _this7.userInfo = (_this7$_decodeAndPars = _this7._decodeAndParseAccountInfo(status.merchant_info, correlationId)) !== null && _this7$_decodeAndPars !== void 0 ? _this7$_decodeAndPars : _this7.userInfo;

        if (!_this7.userInfo) {
          Log.error('merchInfoLoadFailEmptyResp', {
            correlationId: correlationId
          });
          cb(_sdkErrors.merchant.failedToLoad.withDebugId(correlationId), null);
          return;
        }

        if (!_this7._validateUserInfo(_this7.userInfo)) {
          // 'Failed to load required merchant information like address, country code, email or name. '
          // 'May be the scope used to generate token was not right?');
          Log.error('merchInfoValidationFail', {
            info: (0, _stringify["default"])(_this7.userInfo, null, 4),
            correlationId: correlationId
          });
          cb(_sdkErrors.merchant.invalidMerchantUserInfo.withDebugId(correlationId), null);
          return;
        }

        _paypalInvoicing.Invoice.DefaultMerchant = {
          emailAddress: _this7.emailAddress,
          businessName: _this7.businessName,
          address: _this7.addressCopy,
          phoneDictionary: _this7.phoneDictionary
        };
        Log.info('SuccessfullyLoadedMerchantUserInfo!', {
          correlationId: correlationId
        });
        Log.developer(function () {
          return "DefaultMerchant : \n".concat((0, _stringify["default"])(_paypalInvoicing.Invoice.DefaultMerchant, null, 4));
        });
        _this7.isAccessTokenValid = true;

        if (initializedFromData) {
          // The status was already set from _buildObjectWithData
          // Read offline properties from the merchant status response
          if (_this7.status.cardSettings && status.cardSettings) {
            _this7.status.cardSettings.storedPaymentEligibility = status.cardSettings.storedPaymentEligibility;
            _this7.status.cardSettings.storedPaymentPerTxnLimit = status.cardSettings.storedPaymentPerTxnLimit;
            _this7.status.cardSettings.storedPaymentExpiration = status.cardSettings.storedPaymentExpiration;
            _this7.status.cardSettings.storedPaymentTPVLimit = status.cardSettings.storedPaymentTPVLimit;
            _this7.status.cardSettings.storedPaymentPublicKey = status.cardSettings.storedPaymentPublicKey;
          } // Note that PPH does not have qrc related properties
          // update qrc related properties for PPH


          Log.debug('updating qrc parts for PPH', {
            qrcode_payment: status.qrcode_payment
          });
          _this7.status.qrcode_payment = status.qrcode_payment;
        } else {
          _this7.status = status;
          _paypalInvoicing.Invoice.DefaultCurrency = _this7.currency;
        }

        Log.developer(function () {
          return "Successfully loaded merchant status ".concat((0, _stringify["default"])(status, null, 4));
        });

        _this7._getPreferences();

        cb(err, _this7);
      });
    }
  }, {
    key: "_loadMerchantStatusFromData",
    value: function _loadMerchantStatusFromData(cb) {
      Log.track('MerchantUserInfoPreStatus', this._getUserInfoLog(this.userInfo));

      this._loadMerchantStatus(true, cb);
    }
  }, {
    key: "_loadMerchantStatusFromToken",
    value: function _loadMerchantStatusFromToken(cb) {
      this._loadMerchantStatus(false, cb);
    }
  }, {
    key: "_validateUserInfo",
    value: function _validateUserInfo(userInfo) {
      return userInfo && userInfo.address && userInfo.address.country && userInfo.email && (userInfo.businessName || userInfo.name); // TODO add payer_id back after we have added the scope for all existing and future partners
      // && userInfo.payer_id);
    }
  }, {
    key: "_validateStatus",
    value: function _validateStatus(status) {
      return status && status.status && status.currencyCode && status.businessCategoryExists && status.paymentTypes;
    }
  }, {
    key: "_buildObjectWithData",
    value: function _buildObjectWithData(merchantData) {
      // This method creates a usable merchant object for the constructor
      Log.debug('Building the merchant object');

      if (!merchantData) {
        throw _sdkErrors.merchant.merchantDataNotProvided;
      }

      if (!this._validateUserInfo(merchantData.userInfo)) {
        throw _sdkErrors.merchant.invalidMerchantUserInfo;
      }

      if (!this._validateStatus(merchantData.status)) {
        throw _sdkErrors.merchant.invalidMerchantStatusInfo;
      }

      this.userInfo = merchantData.userInfo;
      this.status = merchantData.status;
      this.logglyAccessToken = merchantData.logglyAccessToken;
      this.instrumentationAccessToken = merchantData.instrumentationAccessToken;
      this.status = merchantData.status;
      this.pairingId = merchantData.pairingId;
      _paypalInvoicing.Invoice.DefaultMerchant = {
        emailAddress: this.emailAddress,
        businessName: this.businessName,
        address: this.addressCopy,
        phoneDictionary: this.phoneDictionary
      };
      _paypalInvoicing.Invoice.DefaultCurrency = this.currency;
      Log.debug(function () {
        return "Successfully created Default merchant : \n".concat((0, _stringify["default"])(_paypalInvoicing.Invoice.DefaultMerchant, null, 4));
      });
    }
  }, {
    key: "isPlatformSupported",
    value: function isPlatformSupported(platform) {
      var _this$featureMap, _this$featureMap$CAPA, _Merchant$sdkEnvironm, _Merchant$sdkEnvironm2;

      return !((_this$featureMap = this.featureMap) !== null && _this$featureMap !== void 0 && (_this$featureMap$CAPA = _this$featureMap.CAPABILITY) !== null && _this$featureMap$CAPA !== void 0 && (0, _includes["default"])(_this$featureMap$CAPA).call(_this$featureMap$CAPA, platform)) && ((_Merchant$sdkEnvironm = Merchant.sdkEnvironment) === null || _Merchant$sdkEnvironm === void 0 ? void 0 : (_Merchant$sdkEnvironm2 = _Merchant$sdkEnvironm.capability) === null || _Merchant$sdkEnvironm2 === void 0 ? void 0 : (0, _includes["default"])(_Merchant$sdkEnvironm2).call(_Merchant$sdkEnvironm2, platform));
    }
  }, {
    key: "_merchantInitialized",
    value: function _merchantInitialized(isOffline, err, callback) {
      var _this8 = this;

      if (err) {
        Log.error('MerchantInitFailed', _objectSpread(_objectSpread({}, (0, _retailSDKUtil.getSdkEnvironmentData)(Merchant)), {}, {
          error: err,
          payerId: this.payerId || 'None',
          isOffline: isOffline
        }));

        this._emitInitialized(err, callback);

        return;
      }

      this._isOffline = isOffline;

      if (this.isPlatformSupported('WEB')) {
        var webFeatureError = _sdkErrors.merchant.webFeatureNotEnabled;
        Log.error('MerchantInitFailed', _objectSpread(_objectSpread({}, (0, _retailSDKUtil.getSdkEnvironmentData)(Merchant)), {}, {
          err: (0, _stringify["default"])(webFeatureError),
          payerId: this.payerId || 'None',
          isOffline: isOffline
        }));

        this._emitInitialized(_sdkErrors.merchant.webFeatureNotEnabled, callback);

        return;
      }

      if (!isOffline) {
        this._updateSandboxStoredPaymentEligibility();

        Merchant.active = this;

        this._saveOfflineMerchant(function (saveErr) {
          _this8._emitInitialized(saveErr, callback);
        });
      } else {
        Merchant.active = this;

        this._emitInitialized(null, callback);

        _JoseCryptoMgr["default"].setPublicKey(this.storedPaymentPublicKey);
      }

      Log.track('MerchantInitSuccessful', _objectSpread(_objectSpread(_objectSpread({}, (0, _retailSDKUtil.getSdkEnvironmentData)(Merchant)), (0, _retailSDKUtil.getPartnerData)(Merchant)), {}, {
        payerId: this.payerId || 'None',
        isOffline: isOffline
      }));
    }
  }, {
    key: "_emitInitialized",
    value: function _emitInitialized(err) {
      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      Merchant.events.emit('initialized', err);
      callback(err, this);
    }
  }, {
    key: "_updateSandboxStoredPaymentEligibility",
    value: function _updateSandboxStoredPaymentEligibility() {
      if (this.environment === 'sandbox') {
        var _context14;

        var cardSettings = this.status.cardSettings;

        if (typeof cardSettings === 'string' || cardSettings instanceof String) {
          this.status.cardSettings = JSON.parse(cardSettings);
        }

        this.status.cardSettings.storedPaymentEligibility = !(0, _includes["default"])(_context14 = this.emailAddress).call(_context14, 'blacklist');
      }
    }
  }, {
    key: "request",
    value: function request(options) {
      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      return this.api.request(options, callback);
    }
  }, {
    key: "instrumentationAccessToken",
    get: function get() {
      return this._instrumentationAccessToken;
    },
    set: function set(token) {
      var getObjectFromBase64String = function getObjectFromBase64String() {
        var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Buffer.from((0, _stringify["default"])({})).toString('base64');
        var valueUTF8 = value ? Buffer.from(value, 'base64').toString() : false;
        return valueUTF8 ? JSON.parse(valueUTF8) : {};
      };

      this._instrumentationAccessToken = getObjectFromBase64String(token);
    }
  }, {
    key: "signatureRequiredAbove",
    get: function get() {
      return (0, _retailSDKUtil.asBigNumber)(this._signatureRequiredAbove) || (0, _retailSDKUtil.asBigNumber)(this.cardSettings.signatureRequiredAbove) || (0, _retailSDKUtil.asBigNumber)(0);
    },
    set: function set(value) {
      this._signatureRequiredAbove = value;
    }
  }, {
    key: "initWithData",
    get: function get() {
      return this._initWithData;
    }
  }, {
    key: "featureMap",
    get: function get() {
      return (0, _map["default"])(_PPObjects["default"])[this.country];
    }
  }, {
    key: "emailAddress",
    get: function get() {
      var _this$userInfo, _this$userInfo$email;

      return (_this$userInfo = this.userInfo) === null || _this$userInfo === void 0 ? void 0 : (_this$userInfo$email = _this$userInfo.email) === null || _this$userInfo$email === void 0 ? void 0 : (0, _slice["default"])(_this$userInfo$email).call(_this$userInfo$email);
    }
  }, {
    key: "phoneDictionary",
    get: function get() {
      return this.phoneNumber ? {
        national_number: this.phoneNumber,
        country_code: this.countryCode
      } : {};
    }
  }, {
    key: "countryCode",
    get: function get() {
      var _this$userInfo2, _this$userInfo2$count; // eslint-disable-next-line camelcase


      return ((_this$userInfo2 = this.userInfo) === null || _this$userInfo2 === void 0 ? void 0 : (_this$userInfo2$count = _this$userInfo2.country_code) === null || _this$userInfo2$count === void 0 ? void 0 : (0, _slice["default"])(_this$userInfo2$count).call(_this$userInfo2$count)) || ' ';
    }
  }, {
    key: "phoneNumber",
    get: function get() {
      var _this$userInfo3, _this$userInfo3$phone; // eslint-disable-next-line camelcase


      return (_this$userInfo3 = this.userInfo) === null || _this$userInfo3 === void 0 ? void 0 : (_this$userInfo3$phone = _this$userInfo3.phone_number) === null || _this$userInfo3$phone === void 0 ? void 0 : (0, _slice["default"])(_this$userInfo3$phone).call(_this$userInfo3$phone);
    }
  }, {
    key: "payerId",
    get: function get() {
      var _this$userInfo4;

      return (_this$userInfo4 = this.userInfo) === null || _this$userInfo4 === void 0 ? void 0 : _this$userInfo4.payerId;
    }
  }, {
    key: "businessName",
    get: function get() {
      var _this$userInfo5, _this$userInfo5$busin, _this$userInfo6, _this$userInfo6$name;

      return ((_this$userInfo5 = this.userInfo) === null || _this$userInfo5 === void 0 ? void 0 : (_this$userInfo5$busin = _this$userInfo5.businessName) === null || _this$userInfo5$busin === void 0 ? void 0 : (0, _slice["default"])(_this$userInfo5$busin).call(_this$userInfo5$busin)) || ((_this$userInfo6 = this.userInfo) === null || _this$userInfo6 === void 0 ? void 0 : (_this$userInfo6$name = _this$userInfo6.name) === null || _this$userInfo6$name === void 0 ? void 0 : (0, _slice["default"])(_this$userInfo6$name).call(_this$userInfo6$name));
    }
  }, {
    key: "currency",
    get: function get() {
      return this.status.currencyCode;
    }
  }, {
    key: "country",
    get: function get() {
      return this.address.country;
    }
  }, {
    key: "isOffline",
    get: function get() {
      return this._isOffline;
    }
  }, {
    key: "offlinePaymentEligibility",
    get: function get() {
      var _this$cardSettings$st;

      return (_this$cardSettings$st = this.cardSettings.storedPaymentEligibility) !== null && _this$cardSettings$st !== void 0 ? _this$cardSettings$st : false;
    }
  }, {
    key: "offlinePaymentPerTxnLimit",
    get: function get() {
      return this.cardSettings.storedPaymentPerTxnLimit ? (0, _parseFloat2["default"])(this.cardSettings.storedPaymentPerTxnLimit) : 30;
    }
  }, {
    key: "offlinePaymentTPVLimit",
    get: function get() {
      return this.cardSettings.storedPaymentTPVLimit ? (0, _parseFloat2["default"])(this.cardSettings.storedPaymentTPVLimit) : 1000;
    }
  }, {
    key: "storedPaymentPublicKey",
    get: function get() {
      return this.cardSettings.storedPaymentPublicKey;
    }
  }, {
    key: "offlinePaymentExpiration",
    get: function get() {
      // Assumption is that the shelf life will be in hours.
      // HereServ gives it in minutes so converting to hours
      return this.cardSettings.storedPaymentExpiration ? (0, _parseInt2["default"])(this.cardSettings.storedPaymentExpiration, 10) / 60 : 24;
    }
  }, {
    key: "getReferrerCode",
    value: function getReferrerCode() {
      try {
        return this.referrerCode || this.referrerCodeFromInvoice;
      } catch (e) {
        Log.debug(function () {
          return "Unable to get referrerCode ".concat(e);
        });
        return '';
      }
    }
  }, {
    key: "cardSettings",
    get: function get() {
      var cardSettings = this.status.cardSettings;

      if (typeof cardSettings === 'string' || cardSettings instanceof String) {
        var cardSettingsJson = JSON.parse(cardSettings);
        return cardSettingsJson;
      }

      return cardSettings;
    }
  }, {
    key: "address",
    get: function get() {
      var _this$_address, _this$userInfo7, _this$userInfo7$addre, _this$userInfo8, _this$userInfo8$addre, _this$userInfo9, _this$userInfo9$addre, _this$userInfo10, _this$userInfo10$addr, _this$userInfo11, _this$userInfo11$addr, _this$userInfo12, _this$userInfo12$addr, _this$userInfo13, _this$userInfo13$addr, _this$userInfo14, _this$userInfo14$addr, _this$userInfo15, _this$userInfo15$addr;

      if ((_this$_address = this._address) !== null && _this$_address !== void 0 && _this$_address.hasAnyValue()) {
        return this._address;
      }

      this._address = new _paypalInvoicing.InvoiceAddress();
      this._address.country = ((_this$userInfo7 = this.userInfo) === null || _this$userInfo7 === void 0 ? void 0 : (_this$userInfo7$addre = _this$userInfo7.address) === null || _this$userInfo7$addre === void 0 ? void 0 : _this$userInfo7$addre.country) || ((_this$userInfo8 = this.userInfo) === null || _this$userInfo8 === void 0 ? void 0 : (_this$userInfo8$addre = _this$userInfo8.address) === null || _this$userInfo8$addre === void 0 ? void 0 : _this$userInfo8$addre.country_code);
      this._address.postalCode = (_this$userInfo9 = this.userInfo) === null || _this$userInfo9 === void 0 ? void 0 : (_this$userInfo9$addre = _this$userInfo9.address) === null || _this$userInfo9$addre === void 0 ? void 0 : _this$userInfo9$addre.postal_code;
      this._address.city = ((_this$userInfo10 = this.userInfo) === null || _this$userInfo10 === void 0 ? void 0 : (_this$userInfo10$addr = _this$userInfo10.address) === null || _this$userInfo10$addr === void 0 ? void 0 : _this$userInfo10$addr.locality) || ((_this$userInfo11 = this.userInfo) === null || _this$userInfo11 === void 0 ? void 0 : (_this$userInfo11$addr = _this$userInfo11.address) === null || _this$userInfo11$addr === void 0 ? void 0 : _this$userInfo11$addr.city);
      this._address.line1 = ((_this$userInfo12 = this.userInfo) === null || _this$userInfo12 === void 0 ? void 0 : (_this$userInfo12$addr = _this$userInfo12.address) === null || _this$userInfo12$addr === void 0 ? void 0 : _this$userInfo12$addr.street_address) || ((_this$userInfo13 = this.userInfo) === null || _this$userInfo13 === void 0 ? void 0 : (_this$userInfo13$addr = _this$userInfo13.address) === null || _this$userInfo13$addr === void 0 ? void 0 : _this$userInfo13$addr.line1);
      this._address.state = ((_this$userInfo14 = this.userInfo) === null || _this$userInfo14 === void 0 ? void 0 : (_this$userInfo14$addr = _this$userInfo14.address) === null || _this$userInfo14$addr === void 0 ? void 0 : _this$userInfo14$addr.region) || ((_this$userInfo15 = this.userInfo) === null || _this$userInfo15 === void 0 ? void 0 : (_this$userInfo15$addr = _this$userInfo15.address) === null || _this$userInfo15$addr === void 0 ? void 0 : _this$userInfo15$addr.state);
      return this._address;
    }
  }, {
    key: "addressCopy",
    get: function get() {
      var invoiceAddress = new _paypalInvoicing.InvoiceAddress();
      invoiceAddress.readFromJson(this.address.toJSON());
      return invoiceAddress;
    }
  }, {
    key: "qrcEligibility",
    get: function get() {
      var _this$status$qrcode_p;

      return (_this$status$qrcode_p = this.status.qrcode_payment_enabled) !== null && _this$status$qrcode_p !== void 0 ? _this$status$qrcode_p : true;
    }
  }, {
    key: "qrcServiceProvider",
    get: function get() {
      var _this$qrcSettings;

      return (_this$qrcSettings = this.qrcSettings) === null || _this$qrcSettings === void 0 ? void 0 : _this$qrcSettings.partner_service_provider;
    }
  }, {
    key: "qrcTemplates",
    get: function get() {
      if (!this._qrcTemplates) {
        var _this$qrcSettings2, _context15;

        this._qrcTemplates = ((_this$qrcSettings2 = this.qrcSettings) === null || _this$qrcSettings2 === void 0 ? void 0 : (0, _reduce["default"])(_context15 = _this$qrcSettings2.merchant_presented_qrcode_templates).call(_context15, function (acc, template) {
          acc[template.provider] = template.qrcode_template;
          return acc;
        }, {})) || {};
        Log.info('qrcURL Templates: ', {
          templates: this._qrcTemplates
        });
      }

      return this._qrcTemplates;
    }
  }, {
    key: "qrcUrlTemplate",
    value: function qrcUrlTemplate(provider, merchantRefId) {
      var timeStamp = (0, _moment["default"])().valueOf(); // unix epoch time in milliseconds

      if (this.qrcTemplates[provider]) {
        return {
          url: defaultQrcURLFormatter(this.qrcTemplates[provider], this.qrcServiceProvider, merchantRefId, timeStamp)
        };
      }

      Log.error('qrcURL Template can not be found: ', {
        provider: provider,
        templates: this.qrcTemplates
      });
      return {
        error: _sdkErrors.transaction.failedQRCUrlGeneration
      };
    }
  }, {
    key: "qrcUrlTemplateProviders",
    value: function qrcUrlTemplateProviders() {
      return (0, _keys["default"])(this.qrcTemplates);
    }
  }, {
    key: "qrcSettings",
    get: function get() {
      var qrcode_payment = this.status.qrcode_payment;
      Log.debug('qrcSettings:', {
        qrcode_payment: qrcode_payment
      });

      if (typeof qrcode_payment === 'string' || qrcode_payment instanceof String) {
        return JSON.parse(qrcode_payment);
      }

      return qrcode_payment;
    }
  }, {
    key: "qrcPollingTime",
    get: function get() {
      var _this$featureMap2, _this$featureMap2$QRC, _this$featureMap2$QRC2, _PayPalObjects$map, _PayPalObjects$map$GL, _PayPalObjects$map$GL2, _PayPalObjects$map$GL3; // This method returns polling frequency needed for qrc payments
      // in terms of milliseconds. defaults to 2000 milliseconds


      return ((_this$featureMap2 = this.featureMap) === null || _this$featureMap2 === void 0 ? void 0 : (_this$featureMap2$QRC = _this$featureMap2.QRC) === null || _this$featureMap2$QRC === void 0 ? void 0 : (_this$featureMap2$QRC2 = _this$featureMap2$QRC.POLLING) === null || _this$featureMap2$QRC2 === void 0 ? void 0 : _this$featureMap2$QRC2.INTERVAL) || ((_PayPalObjects$map = (0, _map["default"])(_PPObjects["default"])) === null || _PayPalObjects$map === void 0 ? void 0 : (_PayPalObjects$map$GL = _PayPalObjects$map.GLOBAL) === null || _PayPalObjects$map$GL === void 0 ? void 0 : (_PayPalObjects$map$GL2 = _PayPalObjects$map$GL.QRC) === null || _PayPalObjects$map$GL2 === void 0 ? void 0 : (_PayPalObjects$map$GL3 = _PayPalObjects$map$GL2.POLLING) === null || _PayPalObjects$map$GL3 === void 0 ? void 0 : _PayPalObjects$map$GL3.INTERVAL) || 2000;
    }
  }, {
    key: "qrcPollingTimeLimit",
    get: function get() {
      var _this$featureMap3, _this$featureMap3$QRC, _this$featureMap3$QRC2, _PayPalObjects$map2, _PayPalObjects$map2$G, _PayPalObjects$map2$G2, _PayPalObjects$map2$G3; // This method returns polling time limit for qrc payments in milliseconds.


      return ((_this$featureMap3 = this.featureMap) === null || _this$featureMap3 === void 0 ? void 0 : (_this$featureMap3$QRC = _this$featureMap3.QRC) === null || _this$featureMap3$QRC === void 0 ? void 0 : (_this$featureMap3$QRC2 = _this$featureMap3$QRC.POLLING) === null || _this$featureMap3$QRC2 === void 0 ? void 0 : _this$featureMap3$QRC2.TIMEOUT) || ((_PayPalObjects$map2 = (0, _map["default"])(_PPObjects["default"])) === null || _PayPalObjects$map2 === void 0 ? void 0 : (_PayPalObjects$map2$G = _PayPalObjects$map2.GLOBAL) === null || _PayPalObjects$map2$G === void 0 ? void 0 : (_PayPalObjects$map2$G2 = _PayPalObjects$map2$G.QRC) === null || _PayPalObjects$map2$G2 === void 0 ? void 0 : (_PayPalObjects$map2$G3 = _PayPalObjects$map2$G2.POLLING) === null || _PayPalObjects$map2$G3 === void 0 ? void 0 : _PayPalObjects$map2$G3.TIMEOUT) || 60000;
    }
  }, {
    key: "qrcTCenable",
    get: function get() {
      var _this$featureMap4, _this$featureMap4$QRC, _this$featureMap4$QRC2, _PayPalObjects$map3, _PayPalObjects$map3$G, _PayPalObjects$map3$G2, _PayPalObjects$map3$G3;

      return ((_this$featureMap4 = this.featureMap) === null || _this$featureMap4 === void 0 ? void 0 : (_this$featureMap4$QRC = _this$featureMap4.QRC) === null || _this$featureMap4$QRC === void 0 ? void 0 : (_this$featureMap4$QRC2 = _this$featureMap4$QRC.TC) === null || _this$featureMap4$QRC2 === void 0 ? void 0 : _this$featureMap4$QRC2.ENABLE) || ((_PayPalObjects$map3 = (0, _map["default"])(_PPObjects["default"])) === null || _PayPalObjects$map3 === void 0 ? void 0 : (_PayPalObjects$map3$G = _PayPalObjects$map3.GLOBAL) === null || _PayPalObjects$map3$G === void 0 ? void 0 : (_PayPalObjects$map3$G2 = _PayPalObjects$map3$G.QRC) === null || _PayPalObjects$map3$G2 === void 0 ? void 0 : (_PayPalObjects$map3$G3 = _PayPalObjects$map3$G2.TC) === null || _PayPalObjects$map3$G3 === void 0 ? void 0 : _PayPalObjects$map3$G3.ENABLE) || false;
    }
  }, {
    key: "qrcTCcontent",
    get: function get() {
      var _this$featureMap5, _this$featureMap5$QRC, _this$featureMap5$QRC2, _PayPalObjects$map4, _PayPalObjects$map4$G, _PayPalObjects$map4$G2, _PayPalObjects$map4$G3;

      return ((_this$featureMap5 = this.featureMap) === null || _this$featureMap5 === void 0 ? void 0 : (_this$featureMap5$QRC = _this$featureMap5.QRC) === null || _this$featureMap5$QRC === void 0 ? void 0 : (_this$featureMap5$QRC2 = _this$featureMap5$QRC.TC) === null || _this$featureMap5$QRC2 === void 0 ? void 0 : _this$featureMap5$QRC2.CONTENT) || ((_PayPalObjects$map4 = (0, _map["default"])(_PPObjects["default"])) === null || _PayPalObjects$map4 === void 0 ? void 0 : (_PayPalObjects$map4$G = _PayPalObjects$map4.GLOBAL) === null || _PayPalObjects$map4$G === void 0 ? void 0 : (_PayPalObjects$map4$G2 = _PayPalObjects$map4$G.QRC) === null || _PayPalObjects$map4$G2 === void 0 ? void 0 : (_PayPalObjects$map4$G3 = _PayPalObjects$map4$G2.TC) === null || _PayPalObjects$map4$G3 === void 0 ? void 0 : _PayPalObjects$map4$G3.CONTENT) || undefined;
    }
  }, {
    key: "qrcTClink",
    get: function get() {
      var _this$featureMap6, _this$featureMap6$QRC, _this$featureMap6$QRC2, _PayPalObjects$map5, _PayPalObjects$map5$G, _PayPalObjects$map5$G2, _PayPalObjects$map5$G3;

      return ((_this$featureMap6 = this.featureMap) === null || _this$featureMap6 === void 0 ? void 0 : (_this$featureMap6$QRC = _this$featureMap6.QRC) === null || _this$featureMap6$QRC === void 0 ? void 0 : (_this$featureMap6$QRC2 = _this$featureMap6$QRC.TC) === null || _this$featureMap6$QRC2 === void 0 ? void 0 : _this$featureMap6$QRC2.LINK) || ((_PayPalObjects$map5 = (0, _map["default"])(_PPObjects["default"])) === null || _PayPalObjects$map5 === void 0 ? void 0 : (_PayPalObjects$map5$G = _PayPalObjects$map5.GLOBAL) === null || _PayPalObjects$map5$G === void 0 ? void 0 : (_PayPalObjects$map5$G2 = _PayPalObjects$map5$G.QRC) === null || _PayPalObjects$map5$G2 === void 0 ? void 0 : (_PayPalObjects$map5$G3 = _PayPalObjects$map5$G2.TC) === null || _PayPalObjects$map5$G3 === void 0 ? void 0 : _PayPalObjects$map5$G3.LINK) || undefined;
    }
  }, {
    key: "qrcTCversion",
    get: function get() {
      var _this$featureMap7, _this$featureMap7$QRC, _this$featureMap7$QRC2, _PayPalObjects$map6, _PayPalObjects$map6$G, _PayPalObjects$map6$G2, _PayPalObjects$map6$G3;

      return ((_this$featureMap7 = this.featureMap) === null || _this$featureMap7 === void 0 ? void 0 : (_this$featureMap7$QRC = _this$featureMap7.QRC) === null || _this$featureMap7$QRC === void 0 ? void 0 : (_this$featureMap7$QRC2 = _this$featureMap7$QRC.TC) === null || _this$featureMap7$QRC2 === void 0 ? void 0 : _this$featureMap7$QRC2.VERSION) || ((_PayPalObjects$map6 = (0, _map["default"])(_PPObjects["default"])) === null || _PayPalObjects$map6 === void 0 ? void 0 : (_PayPalObjects$map6$G = _PayPalObjects$map6.GLOBAL) === null || _PayPalObjects$map6$G === void 0 ? void 0 : (_PayPalObjects$map6$G2 = _PayPalObjects$map6$G.QRC) === null || _PayPalObjects$map6$G2 === void 0 ? void 0 : (_PayPalObjects$map6$G3 = _PayPalObjects$map6$G2.TC) === null || _PayPalObjects$map6$G3 === void 0 ? void 0 : _PayPalObjects$map6$G3.VERSION) || '0';
    }
    /**
     * @package
     * @param preferencesJSON
     */

  }, {
    key: "savePreferences",
    value: function savePreferences(preferencesJSON) {
      this.preferences = preferencesJSON;
      this.request({
        service: 'retail',
        op: 'profile/preferences',
        method: 'PUT',
        format: 'json',
        headers: {
          'Content-Type': 'application/json'
        },
        body: (0, _stringify["default"])({
          preferences: preferencesJSON
        })
      }, function (err, response) {
        var _response$body;

        Log.debug('got this in repsonse', response);

        if (!err && response !== null && response !== void 0 && (_response$body = response.body) !== null && _response$body !== void 0 && _response$body.ack) {
          Log.info('preferences saved', {
            ack: response.body.ack,
            debugId: response.body.correlationId
          });
        } else {
          var _response$headers, _response$body2;

          Log.error('failed to store preferences', {
            err: err === null || err === void 0 ? void 0 : err.toString(),
            debugId: response === null || response === void 0 ? void 0 : (_response$headers = response.headers) === null || _response$headers === void 0 ? void 0 : _response$headers['paypal-debug-id'],
            status: response === null || response === void 0 ? void 0 : response.statusCode,
            ack: response === null || response === void 0 ? void 0 : (_response$body2 = response.body) === null || _response$body2 === void 0 ? void 0 : _response$body2.ack
          });
        }
      });
    }
  }, {
    key: "_getPreferences",
    value: function _getPreferences() {
      var _this9 = this;

      this.request({
        service: 'retail',
        op: 'profile/preferences',
        method: 'GET',
        format: 'json',
        headers: {
          'Content-Type': 'application/json'
        }
      }, function (err, response) {
        Log.debug('got this in repsonse', response);

        if (!err && (response === null || response === void 0 ? void 0 : response.statusCode) === 200) {
          var _response$body3, _response$headers2;

          _this9.preferences = (_response$body3 = response.body) === null || _response$body3 === void 0 ? void 0 : _response$body3.preferences;
          Log.info('preferences retrieved', {
            preferecesJsonExists: !!_this9.preferences,
            debugId: (_response$headers2 = response.headers) === null || _response$headers2 === void 0 ? void 0 : _response$headers2['paypal-debug-id']
          });
        } else {
          var _response$headers3;

          Log.error('failed to store preferences', {
            err: err === null || err === void 0 ? void 0 : err.toString(),
            debugId: response === null || response === void 0 ? void 0 : (_response$headers3 = response.headers) === null || _response$headers3 === void 0 ? void 0 : _response$headers3['paypal-debug-id'],
            status: response === null || response === void 0 ? void 0 : response.statusCode
          });
        }
      });
    }
  }, {
    key: "getQrcTcAcceptance",
    value: function getQrcTcAcceptance() {
      var _this$preferences, _this$preferences$qrc, _this$preferences2, _this$preferences3, _this$preferences4;

      var accepted = ((_this$preferences = this.preferences) === null || _this$preferences === void 0 ? void 0 : (_this$preferences$qrc = _this$preferences.qrcTcAcceptance) === null || _this$preferences$qrc === void 0 ? void 0 : _this$preferences$qrc.toLowerCase()) === 'true' && (0, _parseInt2["default"])((_this$preferences2 = this.preferences) === null || _this$preferences2 === void 0 ? void 0 : _this$preferences2.qrcTcAcceptanceVersion, 10) >= (0, _parseInt2["default"])(this.qrcTCversion, 10);
      Log.debug('getQrcTcAcceptance', {
        qrcTcAcceptance: (_this$preferences3 = this.preferences) === null || _this$preferences3 === void 0 ? void 0 : _this$preferences3.qrcTcAcceptance,
        qrcTcAcceptanceVersion: (_this$preferences4 = this.preferences) === null || _this$preferences4 === void 0 ? void 0 : _this$preferences4.qrcTcAcceptanceVersion,
        qrcTCVersion: this.qrcTCversion,
        accepted: accepted
      });
      return accepted;
    }
  }, {
    key: "setQrcTcAcceptance",
    value: function setQrcTcAcceptance(isAccepted) {
      var preferencesJSON = {
        qrcTcAcceptance: isAccepted.toString(),
        qrcTcAcceptanceVersion: isAccepted ? this.qrcTCversion : '0'
      };
      Log.debug('setQrcTcAcceptance', preferencesJSON);
      this.savePreferences(preferencesJSON);
    }
    /**
     * Forward a receipt for an invoice.
     * @param {RetailInvoice} invoice The invoice object for which the receipt is supposed
     * @param {string} emailOrSms Either send a receipt as an email or as an sms to a phone number
     * @param {string} txNumber The transactionNumber or the handle
     * @param {string} txType The status of the invoice
     * @param {string} customerId The customer identification number if any
     * @param {string} receiptPreferenceToken The receipt preference token if any
     * @param {Merchant~receiptForwarded} callback Error callback if any or null
     */

  }, {
    key: "forwardReceipt",
    value: function forwardReceipt(invoice, emailOrSms, txNumber, txType, customerId, receiptPreferenceToken, callback) {
      if (this._isOffline) {
        Log.debug(function () {
          return 'forwardReceipt offline flow';
        });
        callback(_sdkErrors.transaction.offlinePaymentEnabled);
        return;
      }

      Log.debug(function () {
        return 'Inside Forward Receipt';
      });
      var rq = {
        invoiceId: invoice.payPalId,
        transactionType: txType
      };

      if ((0, _indexOf["default"])(emailOrSms).call(emailOrSms, '@') > 0) {
        rq.email = emailOrSms;

        _retailPageTracker.Tracker.publishPageView(null, _retailPageTracker.pages.paymentReceiptEmail);
      } else {
        rq.phoneNumber = emailOrSms;

        _retailPageTracker.Tracker.publishPageView(null, _retailPageTracker.pages.paymentReceiptSms);
      }

      rq.customerId = customerId;
      rq.receiptPreferenceToken = receiptPreferenceToken;
      var op;

      if (txNumber) {
        op = "checkouts/".concat(txNumber, "/sendReceipt");
      } else {
        op = 'checkouts/sendReceipt';
      }

      Log.developer(function () {
        var _context16;

        return (0, _concat["default"])(_context16 = "SendReceipt op: ".concat(op, "\n")).call(_context16, (0, _stringify["default"])(rq));
      });
      Merchant.active.request({
        service: 'retail',
        op: op,
        format: 'json',
        method: 'POST',
        debug: true,
        headers: {
          'Content-Type': 'application/json'
        },
        body: (0, _stringify["default"])(rq)
      }, callback);
    }
  }], [{
    key: "_resolver",
    value: function _resolver(api, options) {
      var env = api.env;
      var service = options.service,
          op = options.op;
      options.headers = options.headers || {};

      if (Merchant.sdkUserAgent) {
        // The Merchant.sdkUserAgent User-Agent must ONLY be used for API calls made to PayPal Here Services
        options.headers['User-Agent'] = Merchant.sdkUserAgent;
      }

      return simpleUrl(env, service, op);
    }
  }, {
    key: "formatUserAgentString",
    value: function formatUserAgentString(value) {
      if (value && (typeof value === 'string' || value instanceof String) && value.length > 0) {
        return "".concat(value.replace('-', '_'));
      }

      return undefined;
    }
  }, {
    key: "sdkUserAgent",
    get: function get() {
      var _context17;

      if (!Merchant.apiUserAgent) {
        return undefined;
      }

      return (0, _concat["default"])(_context17 = "".concat(Merchant.apiUserAgent, "-context_")).call(_context17, Merchant.sdkContextInformation);
    }
  }, {
    key: "sdkContextInformation",
    get: function get() {
      var _context18, _Merchant$sdkContextI, _Merchant$sessionId;

      return (0, _concat["default"])(_context18 = "".concat((_Merchant$sdkContextI = Merchant.sdkContextId) !== null && _Merchant$sdkContextI !== void 0 ? _Merchant$sdkContextI : '')).call(_context18, (_Merchant$sessionId = Merchant.sessionId) !== null && _Merchant$sessionId !== void 0 ? _Merchant$sessionId : '');
    }
  }, {
    key: "sessionId",
    get: function get() {
      return Merchant._sessionId;
    }
  }, {
    key: "refreshSessionId",
    value: function refreshSessionId() {
      Merchant._sessionId = "m_".concat((0, _retailSDKUtil.getRandomId)());
    }
  }, {
    key: "sdkContextId",
    get: function get() {
      return Merchant._sdkContextId;
    },
    set: function set(value) {
      Merchant._sdkContextId = Merchant.formatUserAgentString(value);
    }
  }, {
    key: "sdkEnvironment",
    get: function get() {
      return Merchant._sdkEnvironment;
    },
    set: function set(sdkEnvInfo) {
      var _sdkEnvInfo$osName;

      Merchant._sdkEnvironment = sdkEnvInfo;

      if (((_sdkEnvInfo$osName = sdkEnvInfo.osName) === null || _sdkEnvInfo$osName === void 0 ? void 0 : _sdkEnvInfo$osName.toLowerCase()) === 'ios') {
        Merchant.setApiUserAgent(sdkEnvInfo);
        Log.info('sdkEnvironment set with native deviceId', {
          apiUserAgent: Merchant.apiUserAgent
        });
        return;
      }

      (0, _retailSDKUtil.getPphDeviceIdFromStorage)().then(function (pphSdkDeviceId) {
        sdkEnvInfo.deviceId = pphSdkDeviceId;
      })["catch"](function (error) {
        Log.error('Error in getPphDeviceIdFromStorage', {
          error: error
        });
      })["finally"](function () {
        Merchant._sdkEnvironment = sdkEnvInfo;
        Merchant.setApiUserAgent(sdkEnvInfo);
        Log.info('sdkEnvironment set with JS deviceId', {
          apiUserAgent: Merchant.apiUserAgent
        });
      });
    }
  }, {
    key: "setApiUserAgent",
    value: function setApiUserAgent(sdkEnvInfo) {
      var _context19, _context20, _context21, _context22, _context23, _context24, _context25; // The apiUserAgent must ONLY be used for API calls made to PayPal Here Services


      Merchant.apiUserAgent = (0, _concat["default"])(_context19 = (0, _concat["default"])(_context20 = (0, _concat["default"])(_context21 = (0, _concat["default"])(_context22 = (0, _concat["default"])(_context23 = (0, _concat["default"])(_context24 = (0, _concat["default"])(_context25 = "pph_sdk_v".concat(sdkEnvInfo.retailSDKVersion, "-")).call(_context25, sdkEnvInfo.osName, "_")).call(_context24, sdkEnvInfo.osVersion, "-")).call(_context23, sdkEnvInfo.appName, "_v")).call(_context22, sdkEnvInfo.appVersion, "_")).call(_context21, sdkEnvInfo.appBuild)).call(_context20, sdkEnvInfo.merchantId ? "-".concat(sdkEnvInfo.merchantId) : '')).call(_context19, sdkEnvInfo.deviceId ? "-d".concat(sdkEnvInfo.deviceId.replace('-', '_')) : '');
    }
  }]);
  return Merchant;
}(_events.EventEmitter);
/**
 * After an attempt has been made to send your receipt to the PayPal servers,
 * the completion handler will be called with the error (if any, or null if not)
 * @callback Merchant~receiptForwarded
 * @param {PayPalError} error The error that occurred, if any
 */

/**
 * @callback Merchant~tokenExpirationHandler
 * @param {TokenExpirationHandler} tokenExpirationHandler Call quit to abort the HTTP call or call continueWithNewToken
 * by providing a valid composite token
 */


exports["default"] = Merchant;
Merchant.events = new _events.EventEmitter();

}).call(this)}).call(this,require("buffer").Buffer)
},{"./JoseCryptoMgr":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/JoseCryptoMgr.js","./PPObjects":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/PPObjects.js","./retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","./sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/starts-with":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/starts-with.js","@babel/runtime-corejs3/core-js-stable/instance/trim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/parse-float":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/paypalrest-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.promise.finally.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.finally.js","core-js/modules/es.promise.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.replace.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js","retail-page-tracker":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/retail-page-tracker/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/MerchantManager.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.merchant$ = exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-timeout"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _paypalrestManticore = require("@paypalcorp/paypalrest-manticore");

var _rxjs = require("rxjs");

var _Merchant = _interopRequireDefault(require("./Merchant"));

var _SimulationManager = _interopRequireDefault(require("./SimulationManager"));

var _merchant = _interopRequireDefault(require("./simulatorData/merchant.json"));

var _sdkErrors = require("./sdkErrors");

var _EventSink = require("../EventSink");

var Log = (0, _manticoreLog["default"])('MerchantManager');

var _merchant$ = new _rxjs.BehaviorSubject({
  loggedIn: false
});

var DELAY = 5000; // ms

/**
 * MerchantManager is a public facing facade to everything related to Merchant.
 * @class
 */

var MerchantManager = /*#__PURE__*/function () {
  function MerchantManager() {
    (0, _classCallCheck2["default"])(this, MerchantManager);
  }

  (0, _createClass2["default"])(MerchantManager, [{
    key: "_wrapMerchantInitCallback",
    value: function _wrapMerchantInitCallback() {
      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      return function (error, merchant) {
        if (!error && merchant) {
          _Merchant["default"].refreshSessionId();

          (0, _setTimeout2["default"])(function () {
            return _merchant$.next({
              loggedIn: true
            });
          }, DELAY);

          _EventSink.paypalRestMerchantManager$.subscribe({
            next: function next(event) {
              if (event === _paypalrestManticore.events.tokenExpired && _Merchant["default"].active) {
                _Merchant["default"].active.isAccessTokenValid = false;
              }

              if (event === _paypalrestManticore.events.tokenRefreshed && _Merchant["default"].active) {
                _Merchant["default"].refreshSessionId();

                _Merchant["default"].active.isAccessTokenValid = true;
              }
            }
          });
        }

        cb(error, merchant);
      };
    }
  }, {
    key: "setMerchant",
    value: function setMerchant(merchantObj, callback) {
      // TODO: This is duplicate of the same method in sdk.js
      // Get rid of the redundancy by removing this from sdk.js
      // Update all usage in native and JS to point to MerchantManager
      Log.debug('Received the merchant object for setMerchant');
      Log.developer(function () {
        return "Received the merchant object : ".concat((0, _stringify["default"])(merchantObj));
      });

      if (!merchantObj) {
        throw _sdkErrors.merchant.merchantDataNotProvided;
      }

      if (!callback) {
        throw _sdkErrors.merchant.merchantInitializedCallbackNotProvided;
      }

      merchantObj.compositeToken = this.buildCompositeToken(merchantObj.token);
      var merchant = new _Merchant["default"](merchantObj);
      merchant.initializeWithData(this._wrapMerchantInitCallback(callback));
      return merchant;
    }
  }, {
    key: "setFakeMerchant",
    value: function setFakeMerchant(fakeMerchant) {
      Log.debug("setFakeMerchant ".concat((0, _stringify["default"])(fakeMerchant)));
      return this.setMerchant(fakeMerchant || _merchant["default"]);
    }
    /**
     * Get the fake merchant data
     * @returns {Object} fake merchant data
     */

  }, {
    key: "getFakeMerchantData",
    value: function getFakeMerchantData() {
      return _merchant["default"];
    }
    /**
     * Get the active merchant
     * @returns {Merchant} merchant
     */

  }, {
    key: "getMerchant",
    value: function getMerchant() {
      return _Merchant["default"].active;
    }
  }, {
    key: "buildCompositeToken",
    value: function buildCompositeToken(tokenObj) {
      var _context, _context3;

      Log.debug('Received composite token');
      Log.developer('Received composite token', tokenObj);

      if (!tokenObj) {
        throw _sdkErrors.merchant.tokenDataNotProvided;
      }

      if (!tokenObj.accessToken && !(tokenObj.appId && tokenObj.appSecret)) {
        throw _sdkErrors.merchant.missingCredentials;
      }

      if (!tokenObj.environment) {
        throw _sdkErrors.merchant.environmentNotProvided;
      }

      tokenObj.environment = tokenObj.environment.toLowerCase();
      var appIdSecret = tokenObj.appId && tokenObj.appSecret ? Buffer.from((0, _concat["default"])(_context = "".concat(tokenObj.appId, ":")).call(_context, tokenObj.appSecret)).toString('base64') : null;
      var tokenParts = [tokenObj.accessToken, 28880, tokenObj.refreshUrl, tokenObj.refreshToken, appIdSecret];
      Log.developer(function () {
        var _context2;

        return (0, _concat["default"])(_context2 = "environment: ".concat(tokenObj.environment, " tokenParts ")).call(_context2, (0, _stringify["default"])(tokenParts));
      });
      return (0, _concat["default"])(_context3 = "".concat(tokenObj.environment, ":")).call(_context3, Buffer.from((0, _stringify["default"])(tokenParts)).toString('base64'));
    }
  }, {
    key: "initializeMerchant",
    value: function initializeMerchant(token, repository, callback) {
      new _Merchant["default"]().initialize(token, repository, this._wrapMerchantInitCallback(callback));
    }
  }, {
    key: "initializeFakeMerchant",
    value: function initializeFakeMerchant(token, repository, callback) {
      Log.warn('Fake Initializing will turn on Fake Server Responses');
      _Merchant["default"].active = new _Merchant["default"]();

      _Merchant["default"].active._setToken((0, _stringify["default"])(_merchant["default"].token), _merchant["default"].repository);

      _SimulationManager["default"].enableFakeResponse();

      _Merchant["default"].active._fetchMerchantInfo(this._wrapMerchantInitCallback(callback));
    }
  }, {
    key: "initializeMerchantOffline",
    value: function initializeMerchantOffline(initializeCallback) {
      new _Merchant["default"]().initializeOffline(initializeCallback);
    }
  }, {
    key: "logOut",
    value: function logOut() {
      _merchant$.next({
        loggedIn: false
      });

      _merchant$.complete();
    }
  }]);
  return MerchantManager;
}();

var merchantManager = new MerchantManager();
var _default = merchantManager;
exports["default"] = _default;

var merchant$ = _merchant$.asObservable();

exports.merchant$ = merchant$;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../EventSink":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/EventSink.js","./Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","./SimulationManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/SimulationManager.js","./sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./simulatorData/merchant.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/simulatorData/merchant.json","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/set-timeout":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypalrest-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","rxjs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/NetworkHandler/NetworkRequest.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
/**
 * The NetworkRequest class represents the HTTP Request object from the SDK
 * @class
 * @property {string} url Request Url
 * @property {string} method HTTP Request method
 * @property {string} format Format of the HTTP Request
 * @property {object} headers HTTP Request headers
 * @property {string} body Request body
 */


var NetworkRequest = /*#__PURE__*/function () {
  /**
   * @package
   */
  function NetworkRequest(callback) {
    (0, _classCallCheck2["default"])(this, NetworkRequest);
    this.callback = callback;
  }
  /**
   *
   * @param {error} err Error (if any) from handling network request
   * @param {bool} didHandle Indicates if the request was handled or not. When set to false, the SDK will fallback to
   * default network handler for handling the network requests
   * @param {NetworkResponse} response response to HTTP request. Can be null if didHandle is set to 'false'
   */


  (0, _createClass2["default"])(NetworkRequest, [{
    key: "continueWithResponse",
    value: function continueWithResponse(err, didHandle, response) {
      this.callback(err, didHandle, response);
    }
  }]);
  return NetworkRequest;
}();

exports["default"] = NetworkRequest;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/NetworkHandler/NetworkResponse.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.NetworkResponse = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));
/* eslint-disable no-useless-constructor,no-empty-function */

/**
 * NetworkResponse class represents contains the response from HTTPRequest in a format that is compatible with the SDK
 * @class
 * @property {string} statusCode Response status code
 * @property {string} format Format of the response body
 * @property {object} headers Response headers
 * @property {string} body Response body
 */


var NetworkResponse = /*#__PURE__*/(0, _createClass2["default"])( // eslint-disable-line import/prefer-default-export

/**
 * @constructor
 */
function NetworkResponse() {
  (0, _classCallCheck2["default"])(this, NetworkResponse);
});
/* eslint-enable no-useless-constructor,no-empty-function */

exports.NetworkResponse = NetworkResponse;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/NetworkHandler/networkInterceptor.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = setNetworkHandler;

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _NetworkRequest = _interopRequireDefault(require("./NetworkRequest"));

var _TransactionManager = _interopRequireDefault(require("../../transaction/TransactionManager"));

var _sdkErrors = require("../sdkErrors");

var Log = (0, _manticoreLog["default"])('NetworkInterceptor');
/**
 * Add a network handler to intercept all outgoing SDK network calls
 * @param {SDK~intercept} interceptor
 */

function setNetworkHandler(interceptor) {
  var prevHttp = _manticore["default"].http;

  _manticore["default"].http = function (opt, callback) {
    if (_TransactionManager["default"] && _TransactionManager["default"].getOfflinePaymentEnabled()) {
      callback(_sdkErrors.network.networkNotAllowedInOfflineMode, {
        statusCode: '400'
      });
      return;
    }

    var networkRequest = new _NetworkRequest["default"](function (err, didHandleRequest, networkResponse) {
      if (!didHandleRequest) {
        prevHttp(opt, callback); // Falling back to internal network handler

        return;
      }

      Log.debug(function () {
        return "Request ".concat(opt.url, " was handled by custom handler");
      });

      if (networkResponse.format === 'json') {
        try {
          networkResponse.body = JSON.parse(networkResponse.body);
        } catch (x) {
          Log.error('JSONBodyParseErr', {
            resp: networkResponse.body,
            x: x
          });
          throw x;
        }
      }

      callback(err, networkResponse);
    });
    networkRequest.url = opt.url;
    networkRequest.method = opt.method;
    networkRequest.headers = opt.headers;
    networkRequest.body = opt.body;

    try {
      interceptor(networkRequest);
    } catch (x) {
      Log.error('CustNWInterceptorInvokeErrFallbackToDefault', {
        err: x
      });
      prevHttp(opt, callback);
    }
  };
}

},{"../../transaction/TransactionManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionManager.js","../sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./NetworkRequest":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/NetworkHandler/NetworkRequest.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/PPObjects.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _parseFloat2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-float"));

require("core-js/modules/es.array.map.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _CachedServerFile = _interopRequireDefault(require("./CachedServerFile"));

var _featureMap = _interopRequireDefault(require("../../resources/feature-map.json"));

var _braintreesandbox = _interopRequireDefault(require("./Vaulting/braintreesandbox.json"));

var Log = (0, _manticoreLog["default"])('PayPalObjects');
var fileInfo = {
  FeatureMapStoreKey: {
    localFile: _featureMap["default"],
    url: 'https://www.paypalobjects.com/webstatic/mobile/retail-sdk/feature-map.json'
  },
  BraintreeSandboxCards: {
    localFile: _braintreesandbox["default"],
    url: 'https://www.paypalobjects.com/digitalassets/c/pph/content/retailsdk/braintree/sandbox/cardDetails.json'
  }
};

var PPObjects = /*#__PURE__*/function () {
  function PPObjects() {
    (0, _classCallCheck2["default"])(this, PPObjects);
    this.map = _featureMap["default"];
    this.braintreeSandboxCards = _braintreesandbox["default"];
  }

  (0, _createClass2["default"])(PPObjects, [{
    key: "getFile",
    value: function getFile(fileId, callback) {
      var remoteFile = new _CachedServerFile["default"](fileId, fileInfo[fileId].url);
      var localFile = fileInfo[fileId].localFile;
      remoteFile.get(function (err, file) {
        if (err || !file) {
          Log.debug('RemoteFeatureRetrieveFailed', {
            err: err
          });
          return;
        }

        if (!localFile.VERSION && !file.VERSION) {
          return;
        }

        Log.debug('LocalFileInfo', {
          ver: localFile.VERSION,
          remoteMapVer: file.VERSION
        });

        if ((0, _parseFloat2["default"])(localFile.VERSION) < (0, _parseFloat2["default"])(file.VERSION)) {
          Log.debug('Replacing local feature map with remote');
          callback(file);
        }
      });
    }
  }, {
    key: "loadFeatureMapFile",
    value: function loadFeatureMapFile() {
      var _this = this;

      this.getFile('FeatureMapStoreKey', function (file) {
        _this.map = file;
      });
    }
  }, {
    key: "loadBraintreeSandboxCardsFile",
    value: function loadBraintreeSandboxCardsFile() {
      var _this2 = this;

      this.getFile('BraintreeSandboxCards', function (file) {
        _this2.braintreeSandboxCards = file;
      });
    }
  }]);
  return PPObjects;
}();

var PayPalObjects = new PPObjects();
var _default = PayPalObjects;
exports["default"] = _default;

},{"../../resources/feature-map.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/resources/feature-map.json","./CachedServerFile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/CachedServerFile.js","./Vaulting/braintreesandbox.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Vaulting/braintreesandbox.json","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/parse-float":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.array.map.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.array.map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/PayPalErrorGenerator.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreUtil = require("manticore-util");

var _manticorePaypalerror = require("@paypalcorp/manticore-paypalerror");

var _pphSdkEnums = require("@paypalcorp/pph-sdk-enums");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _sdkErrors = require("./sdkErrors");
/*
 * This class is used by SDK.js so that it can be used by the native layer to construct PayPalError objects
 * and pass them to JS layer.
 */


var PayPalErrorGenerator = /*#__PURE__*/function () {
  function PayPalErrorGenerator() {
    (0, _classCallCheck2["default"])(this, PayPalErrorGenerator);
    this.deviceErrorKeyFromValues = (0, _manticoreUtil.reverseKeysAndValues)(_pphSdkEnums.DeviceError);
    this.sdkErrorKeyFromValues = (0, _manticoreUtil.reverseKeysAndValues)(_pphSdkEnums.SdkError);
    this.transactionErrorKeyFromValues = (0, _manticoreUtil.reverseKeysAndValues)(_pphSdkEnums.TransactionError);
    this.merchantErrorKeyFromValues = (0, _manticoreUtil.reverseKeysAndValues)(_pphSdkEnums.MerchantError);
    this.errorDomainKeyFromValues = (0, _manticoreUtil.reverseKeysAndValues)(_pphSdkEnums.ErrorDomain);
  }

  (0, _createClass2["default"])(PayPalErrorGenerator, [{
    key: "getPayPalErrorForDeviceError",
    value: function getPayPalErrorForDeviceError(code) {
      return this._getPayPalError(_pphSdkEnums.ErrorDomain.paymentDevice, code);
    }
  }, {
    key: "getPayPalErrorForSdkError",
    value: function getPayPalErrorForSdkError(code) {
      return this._getPayPalError(_pphSdkEnums.ErrorDomain.sdk, code);
    }
  }, {
    key: "getPayPalErrorForTransactionError",
    value: function getPayPalErrorForTransactionError(code) {
      return this._getPayPalError(_pphSdkEnums.ErrorDomain.transaction, code);
    }
  }, {
    key: "getPayPalErrorForMerchantError",
    value: function getPayPalErrorForMerchantError(code) {
      return this._getPayPalError(_pphSdkEnums.ErrorDomain.merchant, code);
    }
  }, {
    key: "_getPayPalError",
    value: function _getPayPalError(domain, code) {
      var _paypalError;

      if (domain === _pphSdkEnums.ErrorDomain.paymentDevice) {
        _paypalError = _retailPaymentDevice.deviceError[this.deviceErrorKeyFromValues[code]];
      } else if (domain === _pphSdkEnums.ErrorDomain.sdk) {
        _paypalError = _sdkErrors.sdk[this.sdkErrorKeyFromValues[code]];
      } else if (domain === _pphSdkEnums.ErrorDomain.transaction) {
        _paypalError = _sdkErrors.transaction[this.transactionErrorKeyFromValues[code]];
      } else if (domain === _pphSdkEnums.ErrorDomain.merchant) {
        _paypalError = _sdkErrors.merchant[this.merchantErrorKeyFromValues[code]];
      } else {
        return this.getPayPalErrorForUnknownDomain(code);
      }

      return _paypalError || this.getPayPalErrorForUnknownCode(domain, code);
    }
  }, {
    key: "getPayPalErrorForUnknownCode",
    value: function getPayPalErrorForUnknownCode(domain, code) {
      var _PayPalErrorInfo = new _manticorePaypalerror.PayPalErrorInfo();

      _PayPalErrorInfo.domain = this.errorDomainKeyFromValues[domain];
      _PayPalErrorInfo.code = code;
      _PayPalErrorInfo.message = 'Unknown Code. Please raise an issue for PPH SDK';
      _PayPalErrorInfo.developerMessage = 'Did you forget to add the actual error?';
      return _manticorePaypalerror.PayPalError.makeError(undefined, _PayPalErrorInfo);
    }
  }, {
    key: "getPayPalErrorForUnknownDomain",
    value: function getPayPalErrorForUnknownDomain(code) {
      var _PayPalErrorInfo = new _manticorePaypalerror.PayPalErrorInfo();

      _PayPalErrorInfo.domain = 'NA';
      _PayPalErrorInfo.code = code;
      _PayPalErrorInfo.message = 'Unknown Domain. Please raise an issue for PPH SDK';
      _PayPalErrorInfo.developerMessage = 'Please raise an issue for PPH SDK';
      return _manticorePaypalerror.PayPalError.makeError(undefined, _PayPalErrorInfo);
    }
  }]);
  return PayPalErrorGenerator;
}();

var payPalErrorGenerator = new PayPalErrorGenerator();
var _default = payPalErrorGenerator;
exports["default"] = _default;

},{"./sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-paypalerror":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-paypalerror/build/index.js","@paypalcorp/pph-sdk-enums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/SdkEnvironmentInfo.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.SdkEnvironmentInfo = void 0;

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
/**
 * The executing environment of the SDK
 * @class
 * @property {string} merchantId Merchant identifier like PayerId, etc.
 * @property {string} osName Operating system name Android, iOS, darwin, win32, win64, etc
 * @property {string} osVersion Operating system version
 * @property {string} appId Id of the integrating App
 * @property {string} appName Name of the integrating App
 * @property {string} appVersion Version of the integrating App
 * @property {string} appBuild Build number of the integrating app
 * @property {string} carrierCode The MCC-MNC for the device
 * @property {string} currency Currency for the Merchant
 * @property {string} environment Environment- live or sandbox
 * @property {string} deviceModel Device model
 * @property {string} deviceManufacturer Device manufacturer
 * @property {string} retailSDKVersion The retailSDK Version
 * @property {string} osAdId Either android_advertising_id or ios_advertising_id
 * @property {string} deviceId Either android_id or idfa
 * @property {string} brand Device brand
 */


var SdkEnvironmentInfo = /*#__PURE__*/function () {
  function SdkEnvironmentInfo() {
    (0, _classCallCheck2["default"])(this, SdkEnvironmentInfo);
  }

  (0, _createClass2["default"])(SdkEnvironmentInfo, [{
    key: "toString",
    value: // eslint-disable-line import/prefer-default-export
    function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      var _context, _context2, _context3;

      return {
        merchantId: this.merchantId,
        os: (0, _concat["default"])(_context = "v".concat(this.osName, "-")).call(_context, this.osVersion),
        app: (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = "".concat(this.appName, "_v")).call(_context3, this.appVersion, "-")).call(_context2, this.appBuild),
        currency: this.currency,
        environment: this.environment,
        capability: this.capability
      };
    }
  }]);
  return SdkEnvironmentInfo;
}();

exports.SdkEnvironmentInfo = SdkEnvironmentInfo;

},{"@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/SimulationManager.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _DeviceSimulator = _interopRequireDefault(require("../simulator/devices/DeviceSimulator"));

var _FakeResponseProvider = _interopRequireDefault(require("./FakeResponseProvider"));

var Log = (0, _manticoreLog["default"])('SimulationManager');
/**
 * SimulationManager is a public facing facade to everything related to SDK simulation.
 * @class
 * @property {PayPalError} errorToSimulate Error to be simulated
 */

var SimulationManager = /*#__PURE__*/function () {
  function SimulationManager() {
    (0, _classCallCheck2["default"])(this, SimulationManager);
  }

  (0, _createClass2["default"])(SimulationManager, [{
    key: "enableFakeResponse",
    value:
    /**
     * Provide Fake Response for all HTTP calls made by the SDK
     */
    function enableFakeResponse() {
      Log.info('EnablingFakeResponses');

      _FakeResponseProvider["default"].enable();
    }
    /**
     * Simulate the requested error, if supported
     * @param {PayPalError} deviceError
     * @returns {bool} Returns true if this error simulation is supported
     */

  }, {
    key: "simulateError",
    value: function simulateError(error) {
      delete this.errorToSimulate;

      if (_retailPaymentDevice.deviceError.timeout.equals(error)) {
        this.errorToSimulate = error;
        Log.info('simulateError', {
          requested: error,
          errorToSimulate: this.errorToSimulate
        });
        return true;
      }

      Log.info('simulateError', {
        requested: error,
        errorToSimulate: this.errorToSimulate
      });
      return false;
    }
    /**
     * Switch off Fake Response for all HTTP calls
     */

  }, {
    key: "disableFakeResponse",
    value: function disableFakeResponse() {
      Log.info('DisablingFakeResponses');

      _FakeResponseProvider["default"].disable();
    }
    /**
     * Provide fake devices. If fake is enable, no actual devices will work.
     * @param {DeviceSimulatorType} devices
     * @param {SimulatorUseCase} usecase (SWIPE, CHIP, CONTACTLESS)
     * @param {string} jsonResponseData
     */

  }, {
    key: "simulateDevice",
    value: function simulateDevice(device, usecase, responseData) {
      var _context;

      Log.info((0, _concat["default"])(_context = "startingSimulatorFor:".concat(device, "-")).call(_context, usecase));

      _DeviceSimulator["default"].start(device, usecase, responseData);
    }
  }]);
  return SimulationManager;
}();

var simulationManager = new SimulationManager();
var _default = simulationManager;
exports["default"] = _default;

},{"../simulator/devices/DeviceSimulator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/DeviceSimulator.js","./FakeResponseProvider":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/FakeResponseProvider.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/TimeoutManager.js":[function(require,module,exports){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-timeout"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context, _context2;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}
/**
 * TimeoutManager is responsible for monitoring timeouts.
 * You can use TimeoutManager start monitoring timeout for specific actions
 * If the timeout is not cleared within an expected timeframe, an error callback is invoked
 * Every startTimeoutMonitor clears the previous timeout and resets the timeout clock
 * @class
 */


var TimeoutManager = /*#__PURE__*/function () {
  /**
   * Construct a new TimeoutManager
   * @param {TimeoutManager~timeoutCallback} timeoutErrorCallback
   * @param {TimeoutManager~timeoutCallback} timeoutDebugCallback
   */
  function TimeoutManager() {
    var timeoutErrorCallback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
    var timeoutDebugCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
    (0, _classCallCheck2["default"])(this, TimeoutManager);
    this._timeoutErrorCallback = timeoutErrorCallback;
    this._timeoutDebugCallback = timeoutDebugCallback;
  }

  (0, _createClass2["default"])(TimeoutManager, [{
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        monitorTimeoutDescription: this._description,
        monitorIsUserInteraction: this._isUserInteraction
      };
    }
    /**
     * Start monitoring for timeout
     * startTimeoutMonitor clears the previous timeout (if any) and resets the timeout clock
     * @param description Description of what is being monitored
     * @param isUserInteraction Is this a user interaction or sdk processing. The timeout is longer for user interaction.
     */

  }, {
    key: "startTimeoutMonitor",
    value: function startTimeoutMonitor(description) {
      var _this = this;

      var isUserInteraction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var timeout = isUserInteraction ? 30000 : 15000;

      this._timeoutDebugCallback('startTimeoutMonitor', _objectSpread({
        newMonitorTimeoutDescription: description,
        newMonitorIsUserInteraction: isUserInteraction,
        newMonitorIsUserInteractionTimeout: timeout
      }, this.toJSON()));

      this.clearTimeoutMonitor(false);
      this._description = description;
      this._isUserInteraction = isUserInteraction;
      this._timeoutHandle = (0, _setTimeout2["default"])(function () {
        _this._timeoutErrorCallback('TimeoutMonitor', _this.toJSON());
      }, timeout);
    }
    /**
     * Clear the ongoing timeout monitoring
     * @param logBeforeClear
     */

  }, {
    key: "clearTimeoutMonitor",
    value: function clearTimeoutMonitor() {
      var logBeforeClear = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;

      if (this._timeoutHandle !== undefined) {
        if (logBeforeClear) {
          this._timeoutDebugCallback('clearTimeoutMonitor', this.toJSON());
        }

        clearTimeout(this._timeoutHandle);
        this._timeoutHandle = undefined;
        this._description = undefined;
        this._isUserInteraction = undefined;
      }
    }
  }]);
  return TimeoutManager;
}();
/**
 * The callback invoked when there is any timeout related information
 * @callback TimeoutManager~timeoutCallback
 * @param {string} message Message for the timeout
 * @param {object} data Data for the timeout
 */


exports["default"] = TimeoutManager;

},{"@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/set-timeout":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/UITheme.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
/**
 * The UI theme for the SDK
 * @enum {int}
 */

var UITheme = {
  /**
   * light UI theme
   */
  light: 0,

  /**
   * blue UI theme
   */
  blue: 1
};
/**
 * The Receipt Screen orientation for the SDK
 * @enum {int}
 */

var ReceiptScreenOrientation = {
  /**
   * orientation with auto rotate
   */
  SENSOR: 0,

  /**
   * Portrait orientation
   */
  PORTRAIT: 1,

  /**
   * Landscape orientation
   */
  LANDSCAPE: 2
};
var _default = {
  UITheme: UITheme,
  ReceiptScreenOrientation: ReceiptScreenOrientation
};
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Vaulting/braintreesandbox.json":[function(require,module,exports){
module.exports={
  "VERSION": "4.0",
  "M010": {
    "Visa": {
      "Chip": {
        "amount": "18.00",
        "card": {
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10986689",
            "deviceModel": "M010"
          },
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "inputType": "chip",
          "emvData": "5f2a02084082027c00500b56495341204352454449549f1c0831303938363638399f0607a00000000310105f201a5649534120414351554952455220544553542f434152442031385f280208405f300202015f3401015f24032212318407a0000000031010950508800080009a031906059b02e8009c01009f02060000000018009f03060000000000009f090200969f100706010a03a000009f120f4352454449544f20444520564953419f1101019f1a0208409f1e0831303938363638399f260878bf1b2a23b38bfb9f2701809f3303e028c89f34031e03009f3501229f360218019f37046ba2f9419f410400000064dfae0220cb58ce4d3f20d16a0f4a8c971665d07fe02cbb77da5f859571f7f0dcb50c0de3dfae030affff9802a2284c000024dfae5711476173ffffff0010d2212201ffffffffffdfae5a08476173ffffff0010",
          "PAN": "4761739001010010",
          "test": "ADVT Test Case 18"
        }
      },
      "MagneticCardSwipe": {
        "amount": "8.00",
        "card": {
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10986689",
            "deviceModel": "M010",
            "keySerialNumber": "ffff9802a2284c000025"
          },
          "isMSRFallbackAllowed": false,
          "ksn": "ffff9802a2284c000025",
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "inputType": "swipe",
          "track2": "48020007dfae0278014e896583dfb54a10f0a573edc95763bf3c043d9e73b64cf677fada0b112221334c895c7c1a76fdc7a18bdf7b6f02d3352de01889788399e53bd7a16ce3cb3b00b5e88a5dbb647ab5dd7dc238e948b9559d3c649ae98535fc946c802cc53d6a74325dc93f68ee29123d00cdefe2f83863c361aed57526c0dfae030affff980264967400016fdfae22253b3437363137332a2a2a2a2a2a303236373d323231323230312a2a2a2a2a2a2a2a2a2a3f2a"
        },
        "PAN": "4761739001010267",
        "test": "ADVT Test Case 08"
      },
      "FallbackSwipe": {
        "amount": "8.00",
        "card": {
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10986689",
            "deviceModel": "M010",
            "keySerialNumber": "ffff9802a2284c000025"
          },
          "isMSRFallbackAllowed": true,
          "ksn": "ffff9802a2284c000025",
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "inputType": "fallback_swipe",
          "track2": "48020007dfae0278014e896583dfb54a10f0a573edc95763bf3c043d9e73b64cf677fada0b112221334c895c7c1a76fdc7a18bdf7b6f02d3352de01889788399e53bd7a16ce3cb3b00b5e88a5dbb647ab5dd7dc238e948b9559d3c649ae98535fc946c802cc53d6a74325dc93f68ee29123d00cdefe2f83863c361aed57526c0dfae030affff980264967400016fdfae22253b3437363137332a2a2a2a2a2a303236373d323231323230312a2a2a2a2a2a2a2a2a2a3f2a"
        },
        "PAN": "4761739001010267",
        "test": "ADVT Test Case 08"
      },
      "EmvCertifiedContactless": {
        "amount": "2.02",
        "card": {
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10949280",
            "deviceModel": "M010"
          },
          "isSignatureRequired": false,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "inputType": "contactless_chip",
          "emvData": "5f2a02084082022000500b56495341204352454449549f1c0831323334353637389f0607a00000000310105f20135649534120434445542032322f4341524430325f3401015f24032112318407a00000000310109a031906059c01009f02060000000002029f03060000000000009f090200019f100706010a03a000009f1a0208409f1e0831303938363638399f2608a8a64ae7f3a486a29f2701809f3303e0a8c89f3501229f360202019f37042056e45e9f4104000000709f6604328040009f6e0420000000df280100df30020301dfae02208870de9e8c41249b14a77c9e0e3fb7e98f5ae5ccd4fd5ee5d9e58c387f96daccdfae030affff9802a2284c000026dfae5710476173ffffff0135d1912201ffffffffdfae5a08476173ffffff0135",
          "PAN": "4761739001010135",
          "test": "CDET Test Case 02"
        }
      }
    },
    "MasterCard": {
      "Chip": {
        "amount": "20.00",
        "card": {
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10986689",
            "deviceModel": "M010"
          },
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "inputType": "chip",
          "emvData": "5f2a02084082027900500a4d4153544552434152449f1c0831303033363633379f0607a00000000410105f200e4d5449503530204d4344203136415f280201245f300206015f24032512318407a0000000041010950504000080009a031906209b02e8009c01009f02060000000001509f03060000000000009f090200029f10120210a0000f240000000000000000000000ff9f1a0208409f1e0831303033363633379f2608b036c291cba3ca5f9f2701809f3303e028c89f34035e03009f3501229f360200089f37042e27c9239f410400000618dfae0220a6f5f61c2d60b7aad6834363380dc69cd717c26c5d114aaf2b311549944f5f78dfae030affff9802649674000165dfae5713541333ffffff0508d2512201ffffffffffffffdfae5a08541333ffffff0508"
        },
        "PAN": "5413330089020508",
        "test": "M_TIP50_Test_01_Scenario_01"
      },
      "FallbackSwipe": {
        "Amount": "4.00",
        "card": {
          "isSignatureRequired": true,
          "pinPresent": false,
          "isMSRFallbackAllowed": true,
          "ksn": "ffff9802a2284c00002f",
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10986689",
            "deviceModel": "M010",
            "keySerialNumber": "ffff9802a2284c00002f"
          },
          "inputType": "fallback_swipe",
          "track2": "48020005dfae02287e960ef387237b739f4130ef518f83ab6f5cee39f5ddfd2ca745181d6c1158d7dc42c2490c3c9cf6dfae030affff9802649674000172dfae22243b3534313333332a2a2a2a2a2a303032393d323531323230312a2a2a2a2a2a2a2a2a3f2a"
        },
        "PAN": "5413330089020029",
        "test": "M_TIP02_Test_01_Scenario_04"
      },
      "MagneticCardSwipe": {
        "amount": "20.00",
        "card": {
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10986689",
            "deviceModel": "M010",
            "keySerialNumber": "ffff9802a2284c000030"
          },
          "isSignatureRequired": false,
          "pinPresent": false,
          "ksn": "ffff9802a2284c000030",
          "inputType": "swipe",
          "track2": "48020005dfae0228e6fb63e243a8ebf02dc6ce449e4f6d868539a4b7edf99afee985c5e4da45654fbd8cf00b90d41213dfae030affff9802649674000174dfae22243b3534313333332a2a2a2a2a2a303033373d323531323130312a2a2a2a2a2a2a2a2a3f2a"
        },
        "PAN": "5413330089020037",
        "test": "M_TIP04_Test_01_Scenario_01"
      },
      "EmvCertifiedContactless": {
        "amount": "30.00",
        "card": {
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10986689",
            "deviceModel": "M010"
          },
          "isSignatureRequired": false,
          "pinPresent": false,
          "isContactlessMSD": false,
          "inputType": "contactless_chip",
          "emvData": "5f2a02084082025980500f505043204d434420303320763220329f1c0831323334353637389f0607a00000000410105f200c455445432f504159504153535f280200565f3401015f24032512318407a0000000041010950504000080009a031906059c01009f02060000000030009f03060000000000009f090200029f10120110a00009240000000000000000000000ff9f1a0208409f1e0831303938363638399f2608a6cb0c3af67af5349f2701809f33030008089f34031f03029f3501229f360200019f3704fe29223b9f410400000099df280100df30020201dfae0220cf9f4f893fb3b7e127015fc960fe334caa536c7d15abc1d2b9d46373e9ef59e5dfae030affff9802a2284c000031dfae5711541333ffffff0036d2512206ffffffffffdfae5a08541333ffffff0036"
        },
        "PAN": "5413330089600036",
        "test": "PPC.MCD.03.Test.01.Scenario.01"
      }
    },
    "Amex": {
      "Chip": {
        "amount": "31.00",
        "card": {
          "isSignatureRequired": true,
          "pinPresent": false,
          "isContactlessMSD": false,
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10986689",
            "deviceModel": "M010"
          },
          "inputType": "chip",
          "emvData": "5f2a02084082025c005010414d45524943414e20455850524553539f1c0831303938363638399f0608a0000000250108015f201041454950532032312f56455220322e305f280208405f300202215f3401005f24032412318408a000000025010801950542000080009a031906059b02e8009c01009f02060000000031009f03060000000000009f090200019f100706020103a020009f1a0208409f1e0831303938363638399f2608a1c55d172eab95b99f2701809f3303e028c89f34035e03009f3501229f360202019f3704c60919d49f410400000116dfae022043f54de659da944ca499430c48320eb6f7711abc602d1d6e41a702471405ec40dfae030affff9802a2284c000033dfae5713374245fffff1006d2412221fffffffffffffffdfae5a08374245fffff1006f"
        },
        "PAN": "374245002741006",
        "test": "AXP EMV 002"
      },
      "FallbackSwipe": {
        "amount": "36.00",
        "card": {
          "isSignatureRequired": true,
          "pinPresent": false,
          "isMSRFallbackAllowed": true,
          "ksn": "ffff980264986c00001f",
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10036763",
            "deviceModel": "M010",
            "keySerialNumber": "ffff980264986c00001f"
          },
          "inputType": "fallback_swipe",
          "track2": "48020007dfae028180ae5811f6aa2f2af79f8a38ce6f6d264ef1b3a7f0dbf5d229f8d2eed579c8b029f57265f3cdb216597848810411946543526dc245123e8fcb54dc10db33bcb88d68d0e6fafa07b72ae718d8188d62de9938e7131dbd793eae9e4a0bbf3155c54495de44860d7f1f9fe3639ee3102f2c93fb7f221b86f95e11845e0a42b2347090dfae030affff980264986c00001fdfae22283b3337343234352a2a2a2a2a313030363d323431323230312a2a2a2a2a2a2a2a2a2a2a2a2a2a3f2a5f201a4145495053203238202020202020202020202020202020202020"
        },
        "PAN": "374245003731006",
        "test": "AXP EMV 007"
      },
      "MagneticCardSwipe": {
        "amount": "57.00",
        "card": {
          "isSignatureRequired": true,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffff980264986c00001e",
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10036763",
            "deviceModel": "M010",
            "keySerialNumber": "ffff980264986c00001e"
          },
          "inputType": "swipe",
          "track2": "48020007dfae0268f45b01c2b6b0f4bee3a8ff8b4890d190a9fed08ba37a4cc9593860384581fdaadcbf5e55c9e628072ca6b24126384fbdbffe986dfbb3fd545a837b94ade9f09278900ddfb66ff37f8b2ecbf9fac559ce203f61d752fcd795d29bd73f876b5646238d5f949fefe156dfae030affff980264986c00001edfae22203b3337333935332a2a2a2a2a313030343d323431323137312a2a2a2a2a2a3f2a5f201a5354414e4441524420414e534920202020202020202020202020"
        },
        "PAN": "373953192351004",
        "test": "AXP MAG 001"
      }
    },
    "Discover": {
      "Chip": {
        "amount": "12.00",
        "card": {
          "isSignatureRequired": true,
          "pinPresent": false,
          "isContactlessMSD": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10986689",
            "deviceModel": "M010"
          },
          "inputType": "chip",
          "emvData": "5f2a020840820258005008444953434f5645529f1c0831303938363638399f0607a00000015230105f200d434152442f494d4147452032305f280208405f300202215f3401015f24032012318407a0000001523010950542000080009a031906059b02e8009c01009f02060000000012009f03060000000000009f090200019f10080105a000030000009f1a0208409f1e0831303938363638399f26089b813794345e1aaa9f2701809f3303e028c89f34035e03009f3501229f360222019f37041c7ce6929f410400000155dfae02204469447b53fa4ad38425cc5acf8ab4c65007fc21f604f7600691dcf7b92afc7bdfae030affff9802a2284c000041dfae5713651000ffffff0208d1712221ffffffffffffffdfae5a08651000ffffff0208"
        },
        "PAN": "6510000000000208",
        "test": "E2E 22"
      },
      "MagneticCardSwipe": {
        "amount": "211.00",
        "card": {
          "isSignatureRequired": true,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffff980264986c000021",
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10036763",
            "deviceModel": "M010",
            "keySerialNumber": "ffff980264986c000021"
          },
          "inputType": "swipe",
          "track2": "48020007dfae0278bc0d6e4d9c2d4cabb60c4a94821a67297b13b507c11348d20e01995a30b646e862d94a5d53df314f43b3ef54f806b3c68d8ac1f7f94d66fca65eb282ba99a7764f3c559acde0dd81b2a2d43ccd0695f35c052c55a6d1edee2f8e774794116e4516ebd3a9ae50f20b963975e4ac4b102435688b152fbdc4e7dfae030affff980264986c000021dfae22283b3635313030302a2a2a2a2a2a303333313d323331323230312a2a2a2a2a2a2a2a2a2a2a2a2a3f2a5f201a434152442f494d41474520333320202020202020202020202020"
        },
        "PAN": "6510000000000331",
        "test": "E2E 35"
      },
      "FallbackSwipe": {
        "amount": "211.00",
        "card": {
          "isSignatureRequired": true,
          "pinPresent": false,
          "isMSRFallbackAllowed": true,
          "ksn": "ffff980264986c000021",
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10036763",
            "deviceModel": "M010",
            "keySerialNumber": "ffff980264986c000021"
          },
          "inputType": "fallback_swipe",
          "track2": "48020007dfae0278bc0d6e4d9c2d4cabb60c4a94821a67297b13b507c11348d20e01995a30b646e862d94a5d53df314f43b3ef54f806b3c68d8ac1f7f94d66fca65eb282ba99a7764f3c559acde0dd81b2a2d43ccd0695f35c052c55a6d1edee2f8e774794116e4516ebd3a9ae50f20b963975e4ac4b102435688b152fbdc4e7dfae030affff980264986c000021dfae22283b3635313030302a2a2a2a2a2a303333313d323331323230312a2a2a2a2a2a2a2a2a2a2a2a2a3f2a5f201a434152442f494d41474520333320202020202020202020202020"
        },
        "PAN": "6510000000000331",
        "test": "E2E 35"
      },
      "EmvCertifiedContactless": {
        "amount": "1.10",
        "card": {
          "isSignatureRequired": false,
          "pinPresent": false,
          "isContactlessMSD": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "MIURA",
            "readerSerialNumber": "10986689",
            "deviceModel": "M010"
          },
          "inputType": "contactless_chip",
          "emvData": "5f2a020840820211005010436f6e746163746c65737320445041539f1c0831323334353637389f0607a00000015230105f280208405f3401018407a0000001523010950580800080009a031906059b0208009c01009f02060000000001109f03060000000000009f090201009f100a011520100000000090009f1210436f6e746163746c65737320445041539f1101019f1a0208409f1e0831303938363638399f2608a8ab447ba6e36e019f2701809f3303e0a8c89f3501229f360200019f370463ab32c19f4104000001599f530820100000000090009f6604b2a04000df280100df30020601dfae0218bd27f998369e52fc147cbdbe9d951f388f50803779a8fd11dfae030affff9802a2284c000043dfae5713651000ffffff0016d2012201ffffffffffffff"
        },
        "PAN": "6510000000100016",
        "test": "E2E CL01"
      }
    }
  },
  "RP450": {
    "Visa": {
      "Chip": {
        "amount": "18.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083931",
            "deviceModel": "RP450"
          },
          "inputType": "chip",
          "emvData": "5f24032212319f090200965f300202019f02060000000001509f03060000000000009f2608c913465de94a81c14f07a000000003101082027c00500b56495341204352454449549f360218019f0702ff009f34031e03009f2701808407a00000000310109f1e0831303038333933319f100706010a03a000005f280208405f3401019f3901059f0607a00000000310109f33036028c89f1a0208409f350122950508800080009f5301525f2a0208409a031906209f4104472708449b02e8009c01009f37040ed98ec357114761730000000010d22122011143844489df82250affffff890100a3c006a1df8223187126aaa0128fc389b6145cea7183ae405c585f0486a0c22e"
        },
        "PAN": "4761739001010010",
        "test": "ADVT Test Case 18"
      },
      "MagneticCardSwipe": {
        "amount": "8.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffffff890100a3c006b0",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083931",
            "deviceModel": "RP450",
            "keySerialNumber": "ffffff890100a3c006b0"
          },
          "inputType": "swipe",
          "track2": "df82250affffff890100a3c0070cdf822378d73f24a2f35ad9f955df17c602d1361dc71036beca56c977918f81ae9e11353c4ccec7fa456249e44b7ba13476faf3bd517f1c86f54c3e9ac80422263f9c18d1ac239e8a1ffe92f7e9c6abe535d7241891af09138d20db0216f59305bb2781fc9d43e708a2feb1bdd371a1e491db85548b452f9e53f60016df8256462542343736313733000000000000303236375e5649534120414351554952455220544553542f434152442030385e32323132323031000000000000000000000000000000003fdf8257243b343736313733000000000000303236373d32323132323031000000000000000000003f"
        },
        "PAN": "4761739001010267",
        "test": "ADVT Test Case 08"
      },
      "FallbackSwipe": {
        "amount": "8.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": true,
          "ksn": "ffffff890100a3c006b0",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083931",
            "deviceModel": "RP450",
            "keySerialNumber": "ffffff890100a3c006b0"
          },
          "inputType": "fallback_swipe",
          "track2": "df82250affffff890100a3c0070cdf822378d73f24a2f35ad9f955df17c602d1361dc71036beca56c977918f81ae9e11353c4ccec7fa456249e44b7ba13476faf3bd517f1c86f54c3e9ac80422263f9c18d1ac239e8a1ffe92f7e9c6abe535d7241891af09138d20db0216f59305bb2781fc9d43e708a2feb1bdd371a1e491db85548b452f9e53f60016df8256462542343736313733000000000000303236375e5649534120414351554952455220544553542f434152442030385e32323132323031000000000000000000000000000000003fdf8257243b343736313733000000000000303236373d32323132323031000000000000000000003f"
        },
        "PAN": "4761739001010267",
        "test": "ADVT Test Case 08"
      },
      "EmvCertifiedContactless": {
        "amount": "2.02",
        "card": {
          "isSignatureRequired": false,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083936",
            "deviceModel": "RP450"
          },
          "inputType": "contactless_chip",
          "emvData": "9f7c0c010a434152440244474991159f6604b28040009f0702c2809f3901079f0607a00000000310105f280208404f07a0000000031010500b5649534120435245444954820200208407a0000000031010950500000000009a032010129c01005f2a0208405f3401019f02060000000002029f03060000000000009f090200969f10201f220100a00000000000000000000000000000000000000000000000000000009f1a0208409f1e0831303038333933369f2608e3693c8dfbc3f04e9f2701809f33036028c89f34033f00009f3501229f360200029f3704dc8033899f4104053276699f5301529f6e04207000005f20155649534120434445542032332d422f43415244303257104761730000000027d241220119058254df82250affffff890100a140061adf822318e564c23c496ad1d30f83c508906d984a820a219ec8d9b721df6f020482"
        },
        "PAN": "4761739001010135",
        "test": "CDET Test Case 02"
      }
    },
    "MasterCard": {
      "Chip": {
        "amount": "20.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083931",
            "deviceModel": "RP450"
          },
          "inputType": "chip",
          "emvData": "5f24032512319f090200025f300206019f02060000000001509f03060000000000009f260892af87e0e60acb904f07a000000004101082027900500a4d4153544552434152449f360200089f0702ff009f34035e03009f2701808407a00000000410109f1e0831303038333933319f10120210a0000f240000000000000000000000ff5f280201249f3901059f0607a00000000410109f33036028c89f1a0208409f350122950504000080009f5301525f2a0208409a031906219f4104472708619b02e8009c01009f37047856838757135413330000000508d25122010727005691234fdf82250affffff890100a3c006b2df822318bdb04c2b233e7871d6b9e81124fc99085c4070b647905de8"
        },
        "PAN": "5413330089020508",
        "test": "M_TIP50_Test_01_Scenario_01"
      },
      "FallbackSwipe": {
        "Amount": "4.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": true,
          "ksn": "ffffff890100a3c0071c",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083931",
            "deviceModel": "RP450",
            "keySerialNumber": "ffffff890100a3c0071c"
          },
          "inputType": "fallback_swipe",
          "track2": "df82250affffff890100a3c0071cdf8223301ef9bde258493df8bb5df9c0196abb65ec656e560b4c66f6b5f40648972fc1a4a78e89ec464b0219f6346011635e303ddf8257233b353431333333000000000000303032393d323531323230310000000000000000003f"
        },
        "PAN": "5413330089020029",
        "Test": "M_TIP02_Test_01_Scenario_04"
      },
      "MagneticCardSwipe": {
        "Amount": "20.00",
        "card": {
          "isSignatureRequired": false,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffffff890100a3c006e8",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083931",
            "deviceModel": "RP450",
            "keySerialNumber": "ffffff890100a3c006e8"
          },
          "inputType": "swipe",
          "track2": "df82250affffff890100a3c00710df8223303c2b9f16f6d168e675bfda8b4badf05e2b82bbde67b2c14079ac75a3fbf06aae1dd78545ee1549364c0e0604ef2e411cdf8257233b353431333333000000000000303033373d323531323130310000000000000000003f"
        },
        "PAN": "5413330089020037",
        "Test": "M_TIP04_Test_01_Scenario_01"
      }
    },
    "Amex": {
      "Chip": {
        "amount": "31.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083931",
            "deviceModel": "RP450"
          },
          "inputType": "chip",
          "emvData": "5f24032412319f090200015f300202219f02060000000001509f03060000000000009f26084c80a744796934aa4f08a00000002501080182025c005010414d45524943414e20455850524553539f360200019f0702ff009f34035e03009f2701808408a0000000250108019f1e0831303038333933319f100706020103a020005f280208405f3401009f3901059f0608a0000000250108019f33036028c89f1a0208409f350122950542000080009f5301525f2a0208409a031906219f4104472708639b02e8009c01009f37047e7038e35713374245000001006d241222117101234500000fdf82250affffff890100a3c006b4df82231805acac8f0551a4a234c52e79773ca514daba17105822b685"
        },
        "PAN": "374245002741006",
        "test": "AXP EMV 002"
      },
      "FallbackSwipe": {
        "amount": "36.00",
        "card": {
          "isSignatureRequired": false,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffffff89010092e00121",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083827",
            "deviceModel": "RP450",
            "keySerialNumber": "ffffff89010092e00121"
          },
          "inputType": "fallback_swipe",
          "track2": "df82250affffff89010092e00121df82238188cd35aa72abd7d169b6433ef2e53967ddaa4646e67ab1e054a9dfa6f2b81106ca2c4e8cd1ec8459c79b29db22a83a886f12e3dbb1d5c66ccd7ce7e794808f7a3a0c200756dcc57bd116b36894c3d28b34848edac764d6f3721cbe9fcd638b6e10bd1497a8071474238fb2cf6c4cdf47abc6e8eafdbb302a96384081b684f883a7bbccf8ef21ae6a36df82564e25423337343234350000000000313030365e41454950532032382020202020202020202020202020202020205e323431323230310000000000000000000000000000000000000000000000000000df8257273b3337343234350000000000313030363d3234313232303100000000000000000000000000003f"
        },
        "PAN": "374245003731006",
        "test": "AXP EMV 007"
      },
      "MagneticCardSwipe": {
        "amount": "57.00",
        "card": {
          "isSignatureRequired": false,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffffff89010092e0011c",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083827",
            "deviceModel": "RP450",
            "keySerialNumber": "ffffff89010092e0011c"
          },
          "inputType": "swipe",
          "track2": "df82250affffff89010092e0011cdf822368b54c63abbad2e7f41f92ce0edd41bd2823c45cf62c932f9578c88632a45d2c546796f47a9b137bb6ef8622deb5cb281f44597e60af4269800a2c8e12da43fae43e37f49dac06f155ae342120dac723ef599106c67c9ca498131603d992f2554dd5302eea1ce3548cdf82563d254233373339203500000000000000313030345e5354414e4441524420414e5349202020202020202020202020205e323431323137310000000000003fdf82571f3b3337333935330000000000313030343d323431323137310000000000003f"
        },
        "PAN": "373953192351004",
        "test": "AXP MAG 001"
      }
    },
    "Discover": {
      "Chip": {
        "amount": "12.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083936",
            "deviceModel": "RP450"
          },
          "inputType": "chip",
          "emvData": "5f200d434152442f494d4147452032305f24032312319f090200015f300202219f02060000000206009f03060000000000009f2608d35022050683b72e4f07a0000001523010820218005008444953434f5645529f360222039f0702ffc09f34035e03009f2701808407a00000015230109f1e0831303038333933369f10080105a000030000005f280208405f3401019f3901059f0607a00000015230109f33036028c89f1a0208409f350122950580000080009f5301525f2a0208409a032010129f4104053276509b0268009c01009f3704e5a1ca6357136510000000000208d23122211000083600000fdf82250affffff890100a1400607df822318362323302b6df4eb3047ef9050353076a8a1777d0970e281"
        },
        "PAN": "6510000000000208",
        "test": "E2E 22"
      },
      "MagneticCardSwipe": {
        "amount": "211.00",
        "card": {
          "isSignatureRequired": false,
          "pinPresent": false,
          "isContactlessMSD": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffffff89010092e00126",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083827",
            "deviceModel": "RP450",
            "keySerialNumber": "ffffff89010092e00126"
          },
          "inputType": "swipe",
          "track2": "df82250affffff89010092e00126df82237866d34a7b01b024ebc710b7a8eb08883c201944fba1a0ec0ad161d7036f1630026786d5edde72b7ccff14b3d9ee52637b4f5d1411bb66e631715b0b701ece7af61e277d6057d39be8f5600fcf7c1bb3dfa6685c478acf16c3e75504f1e8ddee1b63f45b6d95269a79646259ebc6302a19afb05228bc65785cdf8256432542363531303030000000000000303333315e434152442f494d414745203333202020202020202020202020205e32333132323031000000000000000000000000003fdf8257273b363531303030000000000000303333313d32333132323031000000000000000000000000003f"
        },
        "PAN": "6510000000000331",
        "test": "E2E 35"
      },
      "FallbackSwipe": {
        "amount": "211.00",
        "card": {
          "isSignatureRequired": false,
          "pinPresent": false,
          "isContactlessMSD": false,
          "isMSRFallbackAllowed": true,
          "ksn": "ffffff89010092e00126",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083827",
            "keySerialNumber": "ffffff89010092e00126",
            "deviceModel": "RP450"
          },
          "inputType": "fallback_swipe",
          "track2": "df82250affffff89010092e00126df82237866d34a7b01b024ebc710b7a8eb08883c201944fba1a0ec0ad161d7036f1630026786d5edde72b7ccff14b3d9ee52637b4f5d1411bb66e631715b0b701ece7af61e277d6057d39be8f5600fcf7c1bb3dfa6685c478acf16c3e75504f1e8ddee1b63f45b6d95269a79646259ebc6302a19afb05228bc65785cdf8256432542363531303030000000000000303333315e434152442f494d414745203333202020202020202020202020205e32333132323031000000000000000000000000003fdf8257273b363531303030000000000000303333313d32333132323031000000000000000000000000003f"
        },
        "PAN": "6510000000000331",
        "test": "E2E 35"
      },
      "EmvCertifiedContactless": {
        "amount": "1.10",
        "card": {
          "isSignatureRequired": false,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083931",
            "deviceModel": "RP450"
          },
          "inputType": "contactless_chip",
          "emvData": "9f6604b28040009f0702ffc09f3901079f0607a00000015230105f280208404f07a00000015230105010436f6e746163746c6573732044504153820211008407a0000001523010950580000080009a031906229c01005f2a0208405f3401019f02060000000001509f03060000000000009f090200019f100a011520100000000090009f1a0208409f1e0831303038333933319f2608df85b6c0ea8b95b69f2701809f33036028c89f34031f03029f3501229f360200029f3704085220b09f4104472709259f53015257136510000000000016d20122011324215866201fdf82250affffff890100a3c006f2df82234804ed35e717feee2142b0a946b21b464619b75ec7c7777be37a538933363e486a10f6803075844f923da0adf353ba607c21f4b84e101efa0c4dce9745be5fd3669c1488cb5807f26fdf6f022082dfdf42283b363531303000000000000000303031364432303132323031313332343231353836363230313f00"
        },
        "PAN": "6510000000100016",
        "test": "E2E CL01"
      }
    }
  },
  "MOBY3000": {
    "Visa": {
      "Chip": {
        "amount": "18.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10391599",
            "deviceModel": "MOBY3000"
          },
          "inputType": "chip",
          "emvData": "5f24032212319f090200965f300202019f02060000000001509f03060000000000009f2608ecd66d3e040d044b4f07a000000003101082027c00500b56495341204352454449549f360218019f0702ff009f34031e03009f2701808407a00000000310109f1e0831303339313539399f100706010a03a000005f280208405f3401019f3901059f0607a00000000310109f33036028c89f1a0208409f350122950508800080009f5301525f2a0208409a031906219f4104201135689b02e8009c01009f3704d6beedbf57114761730000000010d22122011143844489df82250affffff91067e90400088df8223183e82c98d08f562d87e15822cd01f97e0813acfec5d4862c5"
        },
        "PAN": "4761739001010010",
        "Test": "ADVT Test Case 18"
      },
      "MagneticCardSwipe": {
        "amount": "8.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffffff91067e9040009c",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10391599",
            "deviceModel": "MOBY3000",
            "keySerialNumber": "ffffff91067e9040009c"
          },
          "inputType": "swipe",
          "track2": "df82250affffff91067e904000d2df8223784a52f0677b4e778a57cade9d39a9e033f246626c3f1b6d7be92df3c9da6663502d1c7cfaf6eab99d273aef0d62bd58f02d91c97a6d5cd2524907bb7ed0ce559e4670fcfa97de0a867ca6a3af52206cfb4ea5a1b15b5332011d1b5f10d2fd67935c64f8779a6f1e4a7c3d32a45f62d7d97adf67c004d4ecc4df8256462542343736313733000000000000303236375e5649534120414351554952455220544553542f434152442030385e32323132323031000000000000000000000000000000003fdf8257243b343736313733000000000000303236373d32323132323031000000000000000000003f"
        },
        "PAN": "4761739001010267",
        "test": "ADVT Test Case 08"
      },
      "FallbackSwipe": {
        "amount": "8.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": true,
          "ksn": "ffffff91067e9040009c",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10391599",
            "deviceModel": "MOBY3000",
            "keySerialNumber": "ffffff91067e9040009c"
          },
          "inputType": "fallback_swipe",
          "track2": "df82250affffff91067e904000d2df8223784a52f0677b4e778a57cade9d39a9e033f246626c3f1b6d7be92df3c9da6663502d1c7cfaf6eab99d273aef0d62bd58f02d91c97a6d5cd2524907bb7ed0ce559e4670fcfa97de0a867ca6a3af52206cfb4ea5a1b15b5332011d1b5f10d2fd67935c64f8779a6f1e4a7c3d32a45f62d7d97adf67c004d4ecc4df8256462542343736313733000000000000303236375e5649534120414351554952455220544553542f434152442030385e32323132323031000000000000000000000000000000003fdf8257243b343736313733000000000000303236373d32323132323031000000000000000000003f"
        },
        "PAN": "4761739001010267",
        "test": "ADVT Test Case 08"
      }
    },
    "MasterCard": {
      "Chip": {
        "amount": "20.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10391599",
            "deviceModel": "MOBY3000"
          },
          "inputType": "chip",
          "emvData": "5f24032512319f090200025f300206019f02060000000001509f03060000000000009f26080baf86964e76084d4f07a000000004101082027900500a4d4153544552434152449f360200099f0702ff009f34035e03009f2701808407a00000000410109f1e0831303339313539399f10120210a0000f240000000000000000000000ff5f280201249f3901059f0607a00000000410109f33036028c89f1a0208409f350122950504000080009f5301525f2a0208409a031906219f4104201135749b02e8009c01009f3704a3abe8a057135413330000000508d25122010727005691234fdf82250affffff91067e9040008edf822318e810121c26123cb3c2afcd9ad8574c0f291ec88e77e59ed5"
        },
        "PAN": "5413330089020508",
        "test": "M_TIP50_Test_01_Scenario_01"
      },
      "FallbackSwipe": {
        "amount": "4.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": true,
          "ksn": "ffffff91067e904000c9",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10391599",
            "deviceModel": "MOBY3000",
            "keySerialNumber": "ffffff91067e904000c9"
          },
          "inputType": "fallback_swipe",
          "track2": "df82250affffff91067e904000c9df82233053dddb8149107e9b38a20a6ec8bee5ee1778f1cf699738f6ec048642ee5441a5431237424b609b4cd6c49691537b2b63df8257233b353431333333000000000000303032393d323531323230310000000000000000003f"
        },
        "PAN": "5413330089020029",
        "test": "M_TIP02_Test_01_Scenario_04"
      },
      "MagneticCardSwipe": {
        "amount": "20.00",
        "card": {
          "isSignatureRequired": false,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffffff91067e904000a3",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10391599",
            "deviceModel": "MOBY3000",
            "keySerialNumber": "ffffff91067e904000a3"
          },
          "inputType": "swipe",
          "track2": "df82250affffff91067e904000b9df822330451e763f6c471cf8f9892a5ec2dde6b3825ad22b029fe4be7077225f893d4d8d06361bb6ffa41de5c866812851012c0bdf8257233b353431333333000000000000303033373d323531323130310000000000000000003f"
        },
        "PAN": "5413330089020037",
        "test": "M_TIP04_Test_01_Scenario_01"
      }
    },
    "Amex": {
      "Chip": {
        "Amount": "31.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10391599",
            "deviceModel": "MOBY3000"
          },
          "inputType": "chip",
          "emvData": "5f24032412319f090200015f300202219f02060000000001509f03060000000000009f2608e169ccd9ebf1bac44f08a00000002501080182025c005010414d45524943414e20455850524553539f360200019f0702ff009f34035e03009f2701808408a0000000250108019f1e0831303339313539399f100706020103a020005f280208405f3401009f3901059f0608a0000000250108019f33036028c89f1a0208409f350122950542000080009f5301525f2a0208409a031906219f4104201135769b02e8009c01009f37043f80da815713374245000001006d241222117101234500000fdf82250affffff91067e90400090df82231891dd000c4695247b67415de351fdf0ea892ae4c313bbf70a"
        },
        "PAN": "374245002741006",
        "Test": "AXP EMV 002"
      },
      "FallbackSwipe": {
        "amount": "36.00",
        "card": {
          "isSignatureRequired": false,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffffff89010092e00121",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083827",
            "deviceModel": "MOBY3000",
            "keySerialNumber": "ffffff89010092e00121"
          },
          "inputType": "swipe",
          "track2": "df82250affffff89010092e00121df82238188cd35aa72abd7d169b6433ef2e53967ddaa4646e67ab1e054a9dfa6f2b81106ca2c4e8cd1ec8459c79b29db22a83a886f12e3dbb1d5c66ccd7ce7e794808f7a3a0c200756dcc57bd116b36894c3d28b34848edac764d6f3721cbe9fcd638b6e10bd1497a8071474238fb2cf6c4cdf47abc6e8eafdbb302a96384081b684f883a7bbccf8ef21ae6a36df82564e25423337343234350000000000313030365e41454950532032382020202020202020202020202020202020205e323431323230310000000000000000000000000000000000000000000000000000df8257273b3337343234350000000000313030363d3234313232303100000000000000000000000000003f"
        },
        "PAN": "374245003731006",
        "test": "AXP EMV 007"
      },
      "MagneticCardSwipe": {
        "amount": "57.00",
        "card": {
          "isSignatureRequired": false,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffffff89010092e00121",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083827",
            "deviceModel": "MOBY3000",
            "keySerialNumber": "ffffff89010092e00121"
          },
          "inputType": "swipe",
          "track2": "df82250affffff89010092e00121df82238188cd35aa72abd7d169b6433ef2e53967ddaa4646e67ab1e054a9dfa6f2b81106ca2c4e8cd1ec8459c79b29db22a83a886f12e3dbb1d5c66ccd7ce7e794808f7a3a0c200756dcc57bd116b36894c3d28b34848edac764d6f3721cbe9fcd638b6e10bd1497a8071474238fb2cf6c4cdf47abc6e8eafdbb302a96384081b684f883a7bbccf8ef21ae6a36df82564e25423337343234350000000000313030365e41454950532032382020202020202020202020202020202020205e323431323230310000000000000000000000000000000000000000000000000000df8257273b3337343234350000000000313030363d3234313232303100000000000000000000000000003f"
        },
        "PAN": "373953192351004",
        "test": "AXP MAG 001"
      }
    },
    "Discover": {
      "Chip": {
        "amount": "12.00",
        "card": {
          "isSignatureRequired": true,
          "isContactlessMSD": false,
          "pinPresent": false,
          "isMSRFallbackAllowed": false,
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10391599",
            "deviceModel": "MOBY3000"
          },
          "inputType": "chip",
          "emvData": "5f24031712319f090200015f300202219f02060000000001509f03060000000000009f2608a8e1e0f4828ca2064f07a0000001523010820258005008444953434f5645529f360222019f0702ffc09f34035e03009f2701808407a00000015230109f1e0831303339313539399f10080105a000030000005f280208405f3401019f3901059f0607a00000015230109f33036028c89f1a0208409f350122950542400080009f5301525f2a0208409a031906219f4104201135789b02e8009c01009f370440433c5357136510000000000208d17122211000078700000fdf82250affffff91067e90400092df82231866e4dcc916b450663b14fea38672f429605172ddae2c10e9"
        },
        "PAN": "6510000000000208",
        "test": "E2E 22"
      },
      "MagneticCardSwipe": {
        "amount": "211.00",
        "card": {
          "isSignatureRequired": false,
          "pinPresent": false,
          "isContactlessMSD": false,
          "isMSRFallbackAllowed": false,
          "ksn": "ffffff89010092e00126",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083827",
            "deviceModel": "MOBY3000",
            "keySerialNumber": "ffffff89010092e00126"
          },
          "inputType": "swipe",
          "track2": "df82250affffff89010092e00126df82237866d34a7b01b024ebc710b7a8eb08883c201944fba1a0ec0ad161d7036f1630026786d5edde72b7ccff14b3d9ee52637b4f5d1411bb66e631715b0b701ece7af61e277d6057d39be8f5600fcf7c1bb3dfa6685c478acf16c3e75504f1e8ddee1b63f45b6d95269a79646259ebc6302a19afb05228bc65785cdf8256432542363531303030000000000000303333315e434152442f494d414745203333202020202020202020202020205e32333132323031000000000000000000000000003fdf8257273b363531303030000000000000303333313d32333132323031000000000000000000000000003f"
        },
        "PAN": "6510000000000331",
        "test": "E2E 35"
      },
      "FallbackSwipe": {
        "amount": "211.00",
        "card": {
          "isSignatureRequired": false,
          "pinPresent": false,
          "isContactlessMSD": false,
          "isMSRFallbackAllowed": true,
          "ksn": "ffffff89010092e00126",
          "reader": {
            "vendor": "INGENICO",
            "readerSerialNumber": "10083827",
            "deviceModel": "MOBY3000",
            "keySerialNumber": "ffffff89010092e00126"
          },
          "inputType": "fallback_swipe",
          "track2": "df82250affffff89010092e00126df82237866d34a7b01b024ebc710b7a8eb08883c201944fba1a0ec0ad161d7036f1630026786d5edde72b7ccff14b3d9ee52637b4f5d1411bb66e631715b0b701ece7af61e277d6057d39be8f5600fcf7c1bb3dfa6685c478acf16c3e75504f1e8ddee1b63f45b6d95269a79646259ebc6302a19afb05228bc65785cdf8256432542363531303030000000000000303333315e434152442f494d414745203333202020202020202020202020205e32333132323031000000000000000000000000003fdf8257273b363531303030000000000000303333313d32333132323031000000000000000000000000003f"
        },
        "PAN": "6510000000000331",
        "test": "E2E 35"
      }
    }
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/cachedLog.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.promise.js");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _concatInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/concat");

var _mapInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/map");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports._test = exports.RootCachedLogConfig = void 0;
exports.attachCachedLogger = attachCachedLogger;
exports.detachCachedLogger = detachCachedLogger;
exports.startCachedLogging = startCachedLogging;
exports.stopCachedLogging = stopCachedLogging;

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.replace.js");

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _now = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/date/now"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/values"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _moment = _interopRequireDefault(require("moment"));

var R = _interopRequireWildcard(require("ramda"));

var RA = _interopRequireWildcard(require("ramda-adjunct"));

var _v = _interopRequireDefault(require("uuid/v4"));

var _rxjs = require("rxjs");

var _operators = require("rxjs/operators");

var _pphSdkEnums = require("@paypalcorp/pph-sdk-enums");

var _Merchant = _interopRequireDefault(require("./Merchant"));

var _TransactionManager = _interopRequireDefault(require("../transaction/TransactionManager"));

var _MerchantManager = require("./MerchantManager");

var _cachedLogUtil = require("./cachedLogUtil");

var _EventSink = require("../EventSink");

var _cal = require("./cal");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context5, _context6;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context5 = ownKeys(Object(source), !0)).call(_context5, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context6 = ownKeys(Object(source))).call(_context6, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
} // const Log = log('cachedLog');


var loggly = 'loggly';
var mParticle = 'mParticle';
var written = 'written';
var deleted = 'deleted';
var CACHED_LOG_STORE_KEY = 'CachedLogStore';
var CACHED_LOG_ERROR_KEY = 'CachedLogsErrorFlag';
var DELAY = 5000; // ms

var RootCachedLogConfig = {
  level: _manticoreLog["default"].Level.TRACK,
  children: {}
};
exports.RootCachedLogConfig = RootCachedLogConfig;

var LOGGLY_JSON_URL = function LOGGLY_JSON_URL() {
  return "https://www.paypalobjects.com/pph/loggly/loggly.json?".concat((0, _moment["default"])().unix());
};
/*
// Sample loggly configuration
{
  "merchants": {
    "PAYERID": {
      "calLevel": "QUIET"
    }
  },
  "country": {},
  "global": {
    "logLevel": "TRACK",
    "flushLevel": "ERROR",
    "calLevel": "QUIET",
    // Override global settings for non-live environments
    "sandbox": {
      "logLevel": "DEBUG",
      "flushLevel": "ERROR",
      "calLevel": "QUIET"
    },
  },
}
*/


var bannedComponents = new _set["default"](['cachedLog', 'cachedLogUtil', 'cal', 'LogQueue', 'EventSink']); // TODO: revert before release

var defaultLogLevels = {
  logLevel: RootCachedLogConfig.level,
  flushRank: _manticoreLog["default"].Ranks.ERROR,
  flushLevel: _manticoreLog["default"].Level.ERROR,
  calLevel: _cal.RootCalConfig.level
};
var manticoreSetBlobItem$ = (0, _EventSink.manticoreSetItem$)(_pphSdkEnums.StorageType.Blob);
var manticoreGetBlobItem$ = (0, _EventSink.manticoreGetItem$)(_pphSdkEnums.StorageType.Blob);
var manticoreDeleteBlobItem$ = (0, _EventSink.manticoreDeleteItem$)(_pphSdkEnums.StorageType.Blob);

var merchantLoggedIn$ = _MerchantManager.merchant$.pipe((0, _filterInstanceProperty(_operators))(function (_ref) {
  var loggedIn = _ref.loggedIn;
  return loggedIn;
}));

var cachedLog$ = (0, _EventSink.getSubject)();

var formatLevel = function formatLevel(level) {
  var logLevelCaps = level === null || level === void 0 ? void 0 : level.toUpperCase();
  return _manticoreLog["default"].Ranks[logLevelCaps] ? logLevelCaps : undefined;
};

function generateGroupId() {
  var _context;

  return (0, _concat["default"])(_context = "".concat((0, _now["default"])(), "-")).call(_context, Math.random());
}

var logGroup = generateGroupId();

var getLogLevelTrio = function getLogLevelTrio() {
  var _Merchant$sdkEnvironm, _Merchant$sdkEnvironm2, _levelLog$logEnvironm;

  var levelLog = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  var sdkEnvironmentOrDefault = (_Merchant$sdkEnvironm = (_Merchant$sdkEnvironm2 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm2 === void 0 ? void 0 : _Merchant$sdkEnvironm2.environment) !== null && _Merchant$sdkEnvironm !== void 0 ? _Merchant$sdkEnvironm : 'live';
  var logEnvironment = sdkEnvironmentOrDefault === 'live' ? 'live' : 'sandbox';
  var environmentLevelLog = (_levelLog$logEnvironm = levelLog[logEnvironment]) !== null && _levelLog$logEnvironm !== void 0 ? _levelLog$logEnvironm : levelLog;
  var formattedLogLevel = formatLevel(environmentLevelLog.logLevel);

  var formattedFlushRank = _manticoreLog["default"].Ranks[formatLevel(environmentLevelLog.flushLevel)];

  var formattedCalLevel = formatLevel(environmentLevelLog.calLevel);
  var returnObj = {};

  if (formattedLogLevel && formattedFlushRank) {
    returnObj.logLevel = _manticoreLog["default"].Ranks[formattedLogLevel] === _manticoreLog["default"].Ranks.DEVELOPER ? _manticoreLog["default"].Level.DEBUG : formattedLogLevel;
    returnObj.flushRank = formattedFlushRank === _manticoreLog["default"].Ranks.DEVELOPER ? _manticoreLog["default"].Ranks.DEBUG : formattedFlushRank;
  }

  if (formattedCalLevel) {
    returnObj.calLevel = formattedCalLevel; // To be removed when cachedLogger is used for cal logging.

    _cal.RootCalConfig.level = formattedCalLevel;
  }

  return returnObj;
};

var falseOrObject = function falseOrObject(obj) {
  return R.isEmpty(obj) ? false : obj;
};

function mapParse(logglyConfig) {
  var _logglyConfig$deviceI, _Merchant$sdkEnvironm3, _logglyConfig$merchan, _Merchant$active, _logglyConfig$appId, _Merchant$sdkEnvironm4, _Merchant$sdkEnvironm5, _logglyConfig$country, _Merchant$active2;

  return falseOrObject(getLogLevelTrio(logglyConfig === null || logglyConfig === void 0 ? void 0 : (_logglyConfig$deviceI = logglyConfig.deviceId) === null || _logglyConfig$deviceI === void 0 ? void 0 : _logglyConfig$deviceI[(_Merchant$sdkEnvironm3 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm3 === void 0 ? void 0 : _Merchant$sdkEnvironm3.deviceId])) || falseOrObject(getLogLevelTrio(logglyConfig === null || logglyConfig === void 0 ? void 0 : (_logglyConfig$merchan = logglyConfig.merchants) === null || _logglyConfig$merchan === void 0 ? void 0 : _logglyConfig$merchan[(_Merchant$active = _Merchant["default"].active) === null || _Merchant$active === void 0 ? void 0 : _Merchant$active.payerId])) || // eslint-disable-next-line max-len
  falseOrObject(getLogLevelTrio(logglyConfig === null || logglyConfig === void 0 ? void 0 : (_logglyConfig$appId = logglyConfig.appId) === null || _logglyConfig$appId === void 0 ? void 0 : _logglyConfig$appId[(_Merchant$sdkEnvironm4 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm4 === void 0 ? void 0 : (_Merchant$sdkEnvironm5 = _Merchant$sdkEnvironm4.appId) === null || _Merchant$sdkEnvironm5 === void 0 ? void 0 : _Merchant$sdkEnvironm5.replace(/[^a-zA-Z0-9]/g, '_')])) || falseOrObject(getLogLevelTrio(logglyConfig === null || logglyConfig === void 0 ? void 0 : (_logglyConfig$country = logglyConfig.country) === null || _logglyConfig$country === void 0 ? void 0 : _logglyConfig$country[(_Merchant$active2 = _Merchant["default"].active) === null || _Merchant$active2 === void 0 ? void 0 : _Merchant$active2.countryCode])) || falseOrObject(getLogLevelTrio(logglyConfig === null || logglyConfig === void 0 ? void 0 : logglyConfig.global)) || defaultLogLevels;
}

var _logglyConfig$ = (0, _concatInstanceProperty2(_rxjs))((0, _rxjs.of)({
  body: {
    global: defaultLogLevels
  }
}), (0, _EventSink.manticoreHTTP$)({
  url: LOGGLY_JSON_URL(),
  format: 'json'
})).pipe( // response.body contains the loggly config
(0, _mapInstanceProperty2(_operators))(function (_ref2) {
  var body = _ref2.body;
  return body;
}), (0, _operators.catchError)(function () {
  return (0, _rxjs.of)({});
}), (0, _operators.publishReplay)(1), (0, _operators.refCount)());

function logglyConfiged$(source$, filterFn) {
  return (0, _rxjs.combineLatest)([_logglyConfig$, source$]).pipe((0, _mapInstanceProperty2(_operators))(function (_ref3) {
    var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2),
        logLevel = _ref4[0],
        logObj = _ref4[1];

    return [mapParse(logLevel), logObj];
  }), (0, _filterInstanceProperty(_operators))(filterFn), (0, _mapInstanceProperty2(_operators))(function (_ref5) {
    var _ref6 = (0, _slicedToArray2["default"])(_ref5, 2),
        logObj = _ref6[1];

    return logObj;
  }));
}

function cachedLog(level, component, message) {
  var _transactionManager$g, _transactionManager$g2;

  var extraData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};

  if (bannedComponents.has(component.name)) {
    return;
  }

  var currentInvoiceId = (_transactionManager$g = _TransactionManager["default"].getCurrentTransactionContext()) === null || _transactionManager$g === void 0 ? void 0 : (_transactionManager$g2 = _transactionManager$g.invoice) === null || _transactionManager$g2 === void 0 ? void 0 : _transactionManager$g2.payPalId;
  var eventObj = level === _manticoreLog["default"].Level.INSTRUMENT ? {
    level: level,
    extraData: extraData,
    uuid: (0, _v["default"])(),
    type: mParticle
  } : {
    level: level,
    timestamp: (0, _moment["default"])().toISOString(),
    component: component.name,
    message: message,
    merchantContext: _Merchant["default"].sdkContextInformation,
    logGroup: logGroup,
    requestSource: _Merchant["default"].sdkUserAgent,
    extraData: extraData,
    currentInvoiceId: currentInvoiceId,
    uuid: (0, _v["default"])(),
    type: loggly
  };
  cachedLog$.next(eventObj);
}
/*
 * To read cached messages from file
 */


var readMessages$ = manticoreGetBlobItem$(CACHED_LOG_STORE_KEY).pipe( // tap(val => Log.debug('Tap Value@ readMessages$ readBeforeParse', val)),
// Should read an array of UUIDs from the file in to fileContents
(0, _mapInstanceProperty2(_operators))(function (_ref7) {
  var fileContents = _ref7.fileContents;
  var parsedFileContents = JSON.parse(fileContents);
  return RA.isArray(parsedFileContents) ? parsedFileContents : [];
}), (0, _operators.catchError)(function () {
  return (0, _rxjs.of)([]);
}), // tap(val => Log.debug('Tap Value@ readMessages$ readAfterParse', val)),
(0, _operators.mergeMap)( // The from will emit each observable one by one, thereby unwrapping the array of observables
function (UUIDs) {
  return (0, _rxjs.from)( // Map each UUID to a get observable
  (0, _map["default"])(UUIDs).call(UUIDs, function (UUID) {
    return manticoreGetBlobItem$(UUID).pipe( // filter(({ fileContents }) => (fileContents !== undefined)),
    // tap(val => Log.debug('Tap Value@ readMessages$ before map', val)),
    (0, _mapInstanceProperty2(_operators))(function (_ref8) {
      var _uuid = _ref8.fileName,
          fileContents = _ref8.fileContents;
      return _objectSpread({
        uuid: _uuid
      }, JSON.parse(fileContents));
    }), // tap(val => Log.debug('Tap Value@ readMessages$ after map', val)),
    (0, _operators.catchError)(function () {
      return _rxjs.EMPTY;
    }));
  }));
}), (0, _operators.mergeMap)(R.identity) // subscribe to the observables from the `from`
);
/*
 * To read the final error, set on the native.
 */

var readNativeErrorMessage$ = manticoreGetBlobItem$(CACHED_LOG_ERROR_KEY).pipe((0, _mapInstanceProperty2(_operators))(function (_ref9) {
  var fileName = _ref9.fileName,
      fileContents = _ref9.fileContents;
  return _objectSpread({
    uuid: fileName
  }, JSON.parse(fileContents));
}), (0, _operators.catchError)(function () {
  return _rxjs.EMPTY;
}));

function delayUntilLogin$(activity$) {
  var _onLogin$ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : merchantLoggedIn$;

  return activity$.pipe((0, _operators.delayWhen)(function () {
    return _onLogin$;
  }));
}

var _partition = (0, _rxjs.partition)(readMessages$, function (_ref10) {
  var type = _ref10.type;
  return type === loggly;
}),
    _partition2 = (0, _slicedToArray2["default"])(_partition, 2),
    readCachedLogMessages$ = _partition2[0],
    readMParticleEvents$ = _partition2[1];

var _partition3 = (0, _rxjs.partition)(cachedLog$, function (_ref11) {
  var type = _ref11.type;
  return type === mParticle;
}),
    _partition4 = (0, _slicedToArray2["default"])(_partition3, 2),
    newMParticleEvents$ = _partition4[0],
    newEvents$ = _partition4[1];
/*
 * The running buffer is an implementation similar to token bucket on the message stream
 * Bucket size is configured by bufferSize
 * The contents of the bucket are only returned when the bucket is full
 * When an entry is added to a full bucket, the bucket is emptied before adding the new entry
 * Use this to get buckets of a fixed number of elements (bufferSize)
 * In this buffer, the last message is the most recent
 * (int, observable: Object) => observable: [Object]
 */


var runningBuffer$ = R.curry(function (bufferSize, logs$) {
  return logs$.pipe((0, _operators.scan)(function (acc, curr) {
    var _context2;

    return acc.length === bufferSize ? [curr] : (0, _concat["default"])(_context2 = []).call(_context2, (0, _toConsumableArray2["default"])(acc), [curr]);
  }, []), (0, _filterInstanceProperty(_operators))(function (buffer) {
    return buffer.length === bufferSize;
  }));
});
/*
 * The circular flush buffer is an application of a modified circular queue on the message stream.
 * Queue size is configured by bufferSize
 * This buffer clears previous elements when the last element is above the flush rank
 * In this buffer, the last message is the most recent
 * (int, observable: Object) => observable: [Object]
 */

var circularFlushBuffer$ = R.curry(function (bufferSize, logs$) {
  return (0, _rxjs.combineLatest)([_logglyConfig$, logs$]).pipe((0, _mapInstanceProperty2(_operators))(function (_ref12) {
    var _ref13 = (0, _slicedToArray2["default"])(_ref12, 2),
        logLevel = _ref13[0],
        logObj = _ref13[1];

    return [mapParse(logLevel), logObj];
  }), (0, _operators.scan)(function (acc, curr) {
    var _context3, _context4;

    var _curr = (0, _slicedToArray2["default"])(curr, 2),
        flushRank = _curr[0].flushRank,
        logObj = _curr[1];

    var lastObj = acc.length > 0 ? acc[acc.length - 1] : undefined;

    if (lastObj && _manticoreLog["default"].Ranks[lastObj.level] >= flushRank) {
      // Log.debug('circularFlushBuffer$ reset', { flushRank, curr, acc, logObj });
      return [logObj];
    }

    return (0, _slice["default"])(_context3 = (0, _concat["default"])(_context4 = []).call(_context4, (0, _toConsumableArray2["default"])(acc), [logObj])).call(_context3, bufferSize);
  }, []));
});
var size10RunningBufferOf$ = runningBuffer$(10);
var size50RunningBufferOf$ = circularFlushBuffer$(-50);

var _partition5 = (0, _rxjs.partition)(newEvents$, function (eventObj) {
  return eventObj.level === _manticoreLog["default"].Level.TRACK;
}),
    _partition6 = (0, _slicedToArray2["default"])(_partition5, 2),
    trackLogs$ = _partition6[0],
    guideLogs$ = _partition6[1];

var _partition7 = (0, _rxjs.partition)(readCachedLogMessages$, function (_ref14) {
  var level = _ref14.level;
  return level === _manticoreLog["default"].Level.TRACK;
}),
    _partition8 = (0, _slicedToArray2["default"])(_partition7, 2),
    trackCachedLogs$ = _partition8[0],
    guideCachedLogs$ = _partition8[1];

function logglyConfigBuffer$(buffer$) {
  return logglyConfiged$(buffer$, function (_ref15) {
    var _ref16 = (0, _slicedToArray2["default"])(_ref15, 2),
        flushRank = _ref16[0].flushRank,
        logBuffer = _ref16[1];

    return (0, _some["default"])(logBuffer).call(logBuffer, function (logObj) {
      return _manticoreLog["default"].Ranks[logObj.level] >= flushRank;
    });
  });
}

var buffer10OnLogin$ = R.pipe(delayUntilLogin$, size10RunningBufferOf$);
var buffer50OnLogin$ = R.pipe(delayUntilLogin$, size50RunningBufferOf$); // RunningBufferObject

var trackRunningBuffer$ = buffer10OnLogin$((0, _rxjs.merge)(trackLogs$, trackCachedLogs$));
var mParticleRunningBuffer$ = buffer10OnLogin$((0, _rxjs.merge)(readMParticleEvents$, newMParticleEvents$));
var filteredGuideLogs$ = logglyConfiged$(guideLogs$, function (_ref17) {
  var _ref18 = (0, _slicedToArray2["default"])(_ref17, 2),
      logLevels = _ref18[0],
      logObj = _ref18[1];

  return _manticoreLog["default"].Ranks[logObj.level] >= _manticoreLog["default"].Ranks[logLevels.logLevel];
});
var guideRunningBuffer$ = R.pipe(buffer50OnLogin$, logglyConfigBuffer$)((0, _rxjs.scheduled)([filteredGuideLogs$, guideCachedLogs$, readNativeErrorMessage$], _rxjs.asapScheduler).pipe((0, _operators.mergeAll)())); // Create a separate bufferedObservable for Track events
// (observable: interval, requestify, observable: [eventObj]) => observable: [UUIDs, response]

var sendMessageWDelay$ = R.curry(function (requestify, _bufferedMessages$) {
  var getRequest$ = R.pipe(requestify, _EventSink.manticoreHTTP$);
  return _bufferedMessages$.pipe( // tap(val => Log.debug('Tap Value@ sendMessageWDelay$', val)),
  // ([buffer, delayValue] => [Observable, [UUIDs]])
  (0, _mapInstanceProperty2(_operators))(function (buffer) {
    return [getRequest$(buffer), (0, _map["default"])(buffer).call(buffer, function (message) {
      return message.uuid;
    })];
  }), // [request$, UUIDs] => [UUIDs, response]
  (0, _operators.mergeMap)(function (_ref19) {
    var _ref20 = (0, _slicedToArray2["default"])(_ref19, 1),
        request$ = _ref20[0];

    return (0, _rxjs.timer)(DELAY).pipe((0, _operators.take)(1), (0, _operators.mergeMap)(function () {
      return request$;
    }));
  }, function (_ref21, response) {
    var _ref22 = (0, _slicedToArray2["default"])(_ref21, 2),
        UUIDs = _ref22[1];

    return [UUIDs, response];
  }, 1), (0, _operators.catchError)(function () {
    return (0, _rxjs.of)([[]]);
  }) // tap(val => Log.debug('Tap Value@ sendMessageWDelay$ after response', val)),
  );
});
var logglyFlusher$ = sendMessageWDelay$(_cachedLogUtil.logglyRequestify);
var mParticleFlusher$ = sendMessageWDelay$(_cachedLogUtil.mParticleRequestify);

function write$(source$) {
  return source$.pipe( // A written message does not contain its UUID
  // tap(val => Log.debug('Tap Value@ write$', val)),
  (0, _mapInstanceProperty2(_operators))(function (eventObj) {
    return {
      fileName: eventObj.uuid,
      fileContents: (0, _cachedLogUtil.stringify)(eventObj)
    };
  }), (0, _operators.mergeMap)(manticoreSetBlobItem$), (0, _mapInstanceProperty2(_operators))(function (_ref23) {
    var fileName = _ref23.fileName;
    return {
      fileName: fileName,
      state: written
    };
  }));
}

function delete$(source$) {
  return source$.pipe( // tap(val => Log.debug('Tap Value@ Delete', val)),
  (0, _operators.mergeMap)(function (_ref24) {
    var _ref25 = (0, _slicedToArray2["default"])(_ref24, 1),
        UUIDs = _ref25[0];

    return (0, _rxjs.from)((0, _map["default"])(UUIDs).call(UUIDs, manticoreDeleteBlobItem$));
  }), (0, _operators.mergeMap)(function (observable) {
    return observable.pipe((0, _operators.catchError)(function () {
      return _rxjs.EMPTY;
    }));
  }), // fileObject: { fileName, filePath }
  (0, _mapInstanceProperty2(_operators))(function (_ref26) {
    var fileName = _ref26.fileName;
    return {
      fileName: fileName,
      state: deleted
    };
  }));
}

function scribe$(writeSource$, deleteSource$) {
  return (0, _rxjs.merge)(writeSource$, deleteSource$).pipe( // tap(val => Log.debug('Tap Value@ logScribe', val)),
  (0, _operators.scan)(function (acc, _ref27) {
    var fileName = _ref27.fileName,
        state = _ref27.state;

    if (state === written) {
      acc.add(fileName);
    }

    if (state === deleted) {
      acc["delete"](fileName);
    }

    return acc;
  }, new _set["default"]()), (0, _operators.concatMap)(function (messagesOnFileSet) {
    return manticoreSetBlobItem$({
      fileName: CACHED_LOG_STORE_KEY,
      fileContents: (0, _stringify["default"])((0, _toConsumableArray2["default"])((0, _values["default"])(messagesOnFileSet).call(messagesOnFileSet)))
    });
  }));
}

var logScribe$ = scribe$(write$((0, _rxjs.merge)(filteredGuideLogs$, newMParticleEvents$)), delete$((0, _rxjs.merge)(logglyFlusher$(guideRunningBuffer$), logglyFlusher$(trackRunningBuffer$), mParticleFlusher$(mParticleRunningBuffer$)))); // - Files created should be deleted after sending (make sure the filtered messages are also deleted)
// - Files are stored by UUIDs so maintain an array of UUIDs in one file
// - The behavior of the logger upon rebooting after a crash
//   - Should read from the UUIDs file to get the file addresses of the messages which have not been sent
//   - Make sure that the native crash report file is read properly
//   - Send them using the flusher streams
//   - Clean up of the files should ensue.
// - Set the flush levels and minimum level allowed from the remote config file.
// Keep in mind that it is possible for the running buffer to drop messages when the log rate is high. Those messages need to be deleted as well.
// The CachedLog and LogQueue work but their implementation is very verbose.
// LogQueue saves every message it receives to the fileSystem, by retrieving the old message DS, appending the received
// message and then overwriting the existing file. The sending of the messages only happens after the above process is completed.
// It works but this implementation has a lot of overhead.
// Some improvements:
//  - Decouple the persistence of the message from its sending.
//  - One message/file eliminates parsing, appending and writing process. It will be files creation, reading in case of failure and deletion. The reading becomes optional.

var logScribeSubscription;

var removeCachedLogger = function removeCachedLogger() {};

function attachCachedLogger() {
  var _logScribe$ = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : logScribe$;

  logGroup = generateGroupId();
  logScribeSubscription = _logScribe$.subscribe();
}

function startCachedLogging() {
  removeCachedLogger = _manticoreLog["default"].addLogger(cachedLog);
}

function stopCachedLogging() {
  removeCachedLogger();
}

function detachCachedLogger() {
  var _logScribeSubscriptio;

  (_logScribeSubscriptio = logScribeSubscription) === null || _logScribeSubscriptio === void 0 ? void 0 : _logScribeSubscriptio.unsubscribe();
}

var _test = {
  delayUntilLogin$: delayUntilLogin$,
  delete$: delete$,
  filteredGuideLogs$: filteredGuideLogs$,
  guideLogs$: guideLogs$,
  logglyConfigBuffer$: logglyConfigBuffer$,
  mParticleFlusher$: mParticleFlusher$,
  mParticleRunningBuffer$: mParticleRunningBuffer$,
  readMessages$: readMessages$,
  readNativeErrorMessage$: readNativeErrorMessage$,
  runningBuffer$: runningBuffer$,
  circularFlushBuffer$: circularFlushBuffer$,
  scribe$: scribe$,
  write$: write$
};
exports._test = _test;

},{"../EventSink":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/EventSink.js","../transaction/TransactionManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionManager.js","./Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","./MerchantManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/MerchantManager.js","./cachedLogUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/cachedLogUtil.js","./cal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/cal.js","@babel/runtime-corejs3/core-js-stable/date/now":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/date/now.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js","@babel/runtime-corejs3/core-js-stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/pph-sdk-enums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.promise.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.string.replace.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js","ramda-adjunct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/index.js","rxjs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/index.js","rxjs/operators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/operators/index.js","uuid/v4":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/v4.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/cachedLogUtil.js":[function(require,module,exports){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.logglyRequestify = logglyRequestify;
exports.mParticleRequestify = mParticleRequestify;
exports.stringify = void 0;

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.replace.js");

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _stringify2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _ = _interopRequireDefault(require("ramda/src/__"));

var _curry = _interopRequireDefault(require("ramda/src/curry"));

var _curryN = _interopRequireDefault(require("ramda/src/curryN"));

var _flip = _interopRequireDefault(require("ramda/src/flip"));

var _pipe = _interopRequireDefault(require("ramda/src/pipe"));

var _Merchant = _interopRequireDefault(require("./Merchant"));

var _InstLogger = require("./InstLogger");

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context3, _context4;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context3 = ownKeys(Object(source), !0)).call(_context3, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context4 = ownKeys(Object(source))).call(_context4, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
} // const Log = log('cachedLogUtil');


var LOGGLY_URL = function LOGGLY_URL() {
  var _Merchant$active;

  return "https://logs-01.loggly.com/bulk/".concat((_Merchant$active = _Merchant["default"].active) === null || _Merchant$active === void 0 ? void 0 : _Merchant$active.logglyAccessToken, "/tag/");
};

var tags = function tags() {
  var _context, _merchant$active, _merchant$active2;

  var _merchant = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _Merchant["default"];

  return _merchant.sdkEnvironment ? (0, _map["default"])(_context = ["appId_".concat(_merchant.sdkEnvironment.appId), "appBuild_".concat(_merchant.sdkEnvironment.appBuild), "appVersion_".concat(_merchant.sdkEnvironment.appVersion), "os_".concat(_merchant.sdkEnvironment.osName), "osVersion_".concat(_merchant.sdkEnvironment.osVersion), "env_".concat(_merchant.sdkEnvironment.environment), "deviceManufacturer_".concat(_merchant.sdkEnvironment.deviceManufacturer), "deviceModel_".concat(_merchant.sdkEnvironment.deviceModel), "deviceId_".concat(_merchant.sdkEnvironment.deviceId), "currency_".concat(_merchant.sdkEnvironment.currency), "retailSDK_".concat(_merchant.sdkEnvironment.retailSDKVersion), "merchantId_".concat((_merchant$active = _merchant.active) === null || _merchant$active === void 0 ? void 0 : _merchant$active.payerId), "merchantContext_".concat(_merchant.sdkContextInformation)]).call(_context, function (tag) {
    return tag.replace(/[\s.,-]/g, '_');
  }).join(',') : "merchantId_".concat((_merchant$active2 = _merchant.active) === null || _merchant$active2 === void 0 ? void 0 : _merchant$active2.payerId);
}; // In case the Merchant.sdkEnvironment is not set


var ignoreUUID = (0, _curry["default"])(function (key, value) {
  return key === 'uuid' ? undefined : value;
});
var ignoreLevel = (0, _curry["default"])(function (key, value) {
  return key === 'level' ? undefined : value;
});
var ignoreType = (0, _curry["default"])(function (key, value) {
  return key === 'type' ? undefined : value;
});
var stringifyFlipped = (0, _flip["default"])((0, _curryN["default"])(3, _stringify2["default"]))(_["default"], _["default"], '');
var stringify = stringifyFlipped(ignoreUUID);
exports.stringify = stringify;

function logglyRequestify(buffer) {
  var _context2; // Log.debug('logglyRequestify start', { buffer });


  var _ignore = function _ignore(key) {
    return (0, _pipe["default"])(ignoreUUID(key), ignoreType(key));
  };

  var _stringify = stringifyFlipped(function (key, value) {
    return _ignore(key)(value);
  });
  /* Log.debug('logglyRequestify request', {
    merchantId: Merchant.active?.payerId,
    deviceId: Merchant.sdkEnvironment?.deviceId,
    url: encodeURI(`${LOGGLY_URL()}${tags()}/`),
  }); */


  var logglyRequest = {
    url: encodeURI((0, _concat["default"])(_context2 = "".concat(LOGGLY_URL())).call(_context2, tags(), "/")),
    method: 'POST',
    headers: {
      'Content-Type': 'text/plain'
    },
    body: (0, _map["default"])(buffer).call(buffer, function (event) {
      var _Merchant$active2, _Merchant$sdkEnvironm;

      return _stringify(_objectSpread(_objectSpread({}, event), {}, {
        merchantId: (_Merchant$active2 = _Merchant["default"].active) === null || _Merchant$active2 === void 0 ? void 0 : _Merchant$active2.payerId,
        deviceId: (_Merchant$sdkEnvironm = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm === void 0 ? void 0 : _Merchant$sdkEnvironm.deviceId
      }));
    }).join('\n')
  }; // Log.debug('logglyRequestify', { buffer, logglyRequest });

  return logglyRequest;
}

function mParticleRequestify(buffer) {
  var _ignore = function _ignore(key) {
    return (0, _pipe["default"])(ignoreUUID(key), ignoreLevel(key), ignoreType(key));
  };

  var _stringify = stringifyFlipped(function (key, value) {
    return _ignore(key)(value);
  });

  var getAuthKey = function getAuthKey() {
    var _Merchant$sdkEnvironm2, _Merchant$active3, _Merchant$active3$ins;

    var osNameToMerchantInstTokenKeyMapping = {
      Android: 'android',
      iOS: 'iOS',
      darwin: 'web',
      win32: 'web',
      win64: 'web'
    };
    var key = osNameToMerchantInstTokenKeyMapping[(_Merchant$sdkEnvironm2 = _Merchant["default"].sdkEnvironment) === null || _Merchant$sdkEnvironm2 === void 0 ? void 0 : _Merchant$sdkEnvironm2.osName];
    return ((_Merchant$active3 = _Merchant["default"].active) === null || _Merchant$active3 === void 0 ? void 0 : (_Merchant$active3$ins = _Merchant$active3.instrumentationAccessToken) === null || _Merchant$active3$ins === void 0 ? void 0 : _Merchant$active3$ins[key]) || '';
  };

  return {
    url: 'https://s2s.mparticle.com/v2/events',
    method: 'POST',
    headers: {
      'Content-Type': 'text/plain',
      Authorization: "Basic ".concat(getAuthKey())
    },
    body: _stringify((0, _InstLogger.getInstrumentationBulkEvent)((0, _map["default"])(buffer).call(buffer, function (val) {
      return val === null || val === void 0 ? void 0 : val.extraData;
    })))
  };
}

},{"./InstLogger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/InstLogger.js","./Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.string.replace.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","ramda/src/__":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/__.js","ramda/src/curry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curry.js","ramda/src/curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","ramda/src/flip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/flip.js","ramda/src/pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/cal.js":[function(require,module,exports){
"use strict";

require("core-js/modules/es.object.to-string.js");

var _sliceInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.RootCalConfig = void 0;
exports.attach = attach;
exports.configure = configure;
exports.detach = detach;
exports.flush = flush;
exports.newGroup = newGroup;
exports.setInvoiceId = setInvoiceId;
exports.setRequestSourceId = setRequestSourceId;

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.split.js");

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _now = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/date/now"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _splice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/splice"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _pphSdkEnums = require("@paypalcorp/pph-sdk-enums");

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context7;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty2(_context7 = Object.prototype.toString.call(o)).call(_context7, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

function generateGroupId() {
  var _context;

  return (0, _concat["default"])(_context = "".concat((0, _now["default"])(), "-")).call(_context, Math.random());
}

var Log = (0, _manticoreLog["default"])('cal');
var MAX_CAL_EVENT_LENGTH = 50;
var MAX_HTTP_CAL_LENGTH = 20;
var CAL_LOG_SUCCESS = 0;
var CAL_LOG_FAIL = -1;
var CAL_LOG_STORE_KEY = 'CalLogStore';
var RootCalConfig = {
  level: 'QUIET',
  children: {}
};
exports.RootCalConfig = RootCalConfig;
var queueDetails;
var logGroup = generateGroupId();
var logInvoiceId = '';
var requestSource = 'RetailSDK';
var savingLogStore = false;
var overlappedSaves = [];
var messageRunCounter = 0;

var detachLogger = function detachLogger() {};

function saveLogStore(cb) {
  if (savingLogStore) {
    // Even if it's null, because we need to know to save again
    overlappedSaves.push(cb);
    return;
  }

  _manticore["default"].setItem(CAL_LOG_STORE_KEY, _pphSdkEnums.StorageType.SecureBlob, (0, _stringify["default"])(queueDetails), function (saveError) {
    savingLogStore = false;

    if (overlappedSaves.length) {
      var nextSaves = overlappedSaves;
      overlappedSaves = [];
      saveLogStore(function (e) {
        var _iterator = _createForOfIteratorHelper(nextSaves),
            _step;

        try {
          for (_iterator.s(); !(_step = _iterator.n()).done;) {
            var savedCallback = _step.value;

            if (savedCallback) {
              savedCallback(e);
            }
          }
        } catch (err) {
          _iterator.e(err);
        } finally {
          _iterator.f();
        }
      });
    }

    if (cb) {
      cb(saveError);
    }
  });
}

function setDefaultCalLogData(calLogData, level) {
  var _context2, _context3; // Set the actionId to message if not specified


  if (!calLogData.actionId) {
    calLogData.actionId = 'message';
  } // Set the status based on level, if not specified in calLogData


  if (!calLogData.status) {
    switch (level.toLowerCase()) {
      case 'developer':
        calLogData.status = CAL_LOG_SUCCESS;
        break;

      case 'debug':
        calLogData.status = CAL_LOG_SUCCESS;
        break;

      case 'info':
        calLogData.status = CAL_LOG_SUCCESS;
        break;

      case 'track':
        calLogData.status = CAL_LOG_SUCCESS;
        break;

      case 'error':
        calLogData.status = CAL_LOG_FAIL;
        break;

      case 'warn':
        calLogData.status = CAL_LOG_FAIL;
        break;

      default:
        calLogData.status = CAL_LOG_FAIL;
        break;
    }
  } // Build the msgId which is an incrementing-per-sdk-launch "runId", a forever-incrementing message counter, and a
  // per-run message counter


  messageRunCounter += 1;
  queueDetails.msgCounter += 1;
  calLogData.msgId = (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = "".concat(queueDetails.runCounter, ".")).call(_context3, queueDetails.msgCounter, ".")).call(_context2, messageRunCounter);
}

function buildCalConfigMapping(component) {
  // Build the association of CAL configuration to manticore-log component
  var loggers = component.name.split('.');
  var myComponent = RootCalConfig;
  var parent = RootCalConfig;

  for (var i = 0; i < loggers.length; i++) {
    if (!myComponent.children[loggers[i]]) {
      myComponent.children[loggers[i]] = {
        children: {},
        parent: parent
      };
    }

    myComponent = myComponent.children[loggers[i]];
    parent = myComponent;
  }

  component.calConfig = myComponent;
}

function addCalEvent(calLogEvent) {
  var logOverflow = function logOverflow() {
    return MAX_CAL_EVENT_LENGTH <= queueDetails.events.length;
  };

  if (logOverflow()) {
    Log.warn('CALLogOverflow', {
      length: MAX_CAL_EVENT_LENGTH
    });
  } // if the previous flush attempt was not successful, then remove an element from the array


  while (logOverflow()) {
    queueDetails.events.shift();

    if (queueDetails.saving) {
      queueDetails.saving -= 1;
    }
  }

  queueDetails.events.push(calLogEvent);
  saveLogStore();
}
/**
 * Cal logging framework for the SDK.
 * Cal logs require: name, actionId, status (0=success, -1 = fail), type (always set to "BIZ")
 * and logData consisting of actionId dependent values such as
 * timestamp (universal yyyy-MM-dd HH:mm:ss:fff +0000), duration, message details
 * The method signature is the same as the manticore log, with one additional Cal logging parameter: calLogData
 * manticore logs are verbose messages that can be logged as-is. These will be logged with "message" actionId (ToDo).
 * We could have a configuration that specifies what level of logs should be sent to Cal as messages.
 * For non-message logs, e.g. ClientInfo, NetworkResponse etc., the code will include Cal-specific log calls
 * These Cal-specific calls will send cal-specific information in the calLogData object.
 * Open for discussion: What comes first? manticore-log, and that in turn calls Cal log,
 * or Start with Cal log, and then call Manticore log from Cal?
 * @param level Debug, Trace, Info, Warn, Error
 * @param component ?
 * @param fnOrString Log message. You can pass a string, or use an es6 template INSIDE a function (for best performance).
 * @param calLogData json object with actionId dependent values
 * e.g. actionId=SWIPE/CreateInvoice etc., status=0/-1 (Success = 0, Fail = -1+ ...
 */


function calLog(level, component, fnOrString, calLogData) {
  // avoid recursive calls.
  if (component.name === 'cal' || component.name === 'cachedLog') {
    return;
  }

  if (!component.calConfig) {
    buildCalConfigMapping(component);
  }

  if (_manticoreLog["default"].Ranks[level] < _manticoreLog["default"].levelFor(component.calConfig)) {
    return;
  } // default actionId = message


  if (!calLogData) {
    calLogData = {
      actionId: 'Message'
    }; // eslint-disable-line no-param-reassign
  }

  setDefaultCalLogData(calLogData, level, fnOrString); // ToDo: calculate status based on the level, if it is not available in calLogData

  var calLogEvent = {
    status: calLogData.status,
    type: 'BIZ',
    name: "".concat(calLogData.actionId, ".CLIENT")
  }; // cal log data expects the status as 'result', so change that before stringifying the json object.

  calLogData.result = calLogData.status;
  delete calLogData.status;
  calLogData.details = fnOrString;
  calLogData.logGroup = logGroup;
  calLogData.invoiceId = logInvoiceId;
  calLogData.component = component && component.name;
  calLogEvent.data = (0, _stringify["default"])(calLogData);

  _manticore["default"].setTimeout(function () {
    return addCalEvent(calLogEvent);
  }, 0);
}

function removePostedLogs(cb) {
  var _context4;

  (0, _splice["default"])(_context4 = queueDetails.events).call(_context4, 0, queueDetails.saving);
  Log.debug(function () {
    var _context5;

    return (0, _concat["default"])(_context5 = "Removed ".concat(queueDetails.saving, " posted logs. New queue size: ")).call(_context5, queueDetails.events.length);
  });
  queueDetails.saving = 0;
  saveLogStore(cb);
}

function doHttpPost(calLogMessageBody) {
  var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

  var Merchant = require('./Merchant')["default"]; // eslint-disable-line global-require


  var saved = queueDetails.saving;

  if (Merchant.active) {
    Merchant.active.request({
      service: 'retail',
      op: 'secure-terminal-config/cal',
      method: 'POST',
      headers: {
        'X-PAYPAL-REQUEST-SOURCE': requestSource,
        'Content-Type': 'application/json'
      },
      body: calLogMessageBody
    }, function (error, rz) {
      if (!error && rz && rz.statusCode === 200) {
        removePostedLogs(function (e) {
          if (cb) {
            cb(e, saved);
          }
        });
      } else {
        queueDetails.saving = 0; // TODO decide whether to re-post now or some other time... Or whether
        // someone else should handle that decision based on the callback

        cb(error);
      }
    });
  } else if (cb) {
    cb(new Error('No merchant available, cannot post CAL logs'));
  }
}
/**
 * Attach the CAL logger to the manticore logging infra and setup the various counters.
 * @param callback
 */


function attach(callback) {
  // Load the existing log set
  _manticore["default"].getItem(CAL_LOG_STORE_KEY, _pphSdkEnums.StorageType.Secure, function (e, jsonString) {
    if (e) {
      Log.error('PersistedCALQueueGetFail', {
        err: e.message
      });
    }

    if (jsonString) {
      queueDetails = JSON.parse(jsonString); // Increment the run counter since this is a new run

      queueDetails.runCounter += 1;
    } else {
      queueDetails = {
        // Currently queued events
        events: [],
        // When we're in the process of posting, we need to know how many we're saving
        // so that we can recover gracefully
        saving: 0,
        runCounter: 1,
        msgCounter: 0
      };
    }

    detachLogger = _manticoreLog["default"].addLogger(calLog);
    callback(e, detachLogger);
  });
}

function configure(json) {
  _manticoreLog["default"].configure(json, RootCalConfig);
}
/**
 * Mostly for testing purposes, but this will shut down CAL logging and unregister from manticore logging
 * @param callback
 */


function detach() {
  var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  saveLogStore(callback);
  detachLogger();
}
/**
 * Flush the queued logs to the server
 * @param cb
 */


function flush(cb) {
  if (queueDetails.saving) {
    if (cb) {
      cb(new Error('Save already in progress.'));
    }

    return;
  }

  if (queueDetails.events.length) {
    var _context6;

    var logData = (0, _slice["default"])(_context6 = queueDetails.events).call(_context6, 0, MAX_HTTP_CAL_LENGTH);
    var body = (0, _stringify["default"])({
      events: logData
    });
    queueDetails.saving = logData.length;
    Log.debug(function () {
      return "Flushing ".concat(queueDetails.saving, " logs to CAL server.");
    });
    doHttpPost(body, cb);
  } else if (cb) {
    cb(null, 0);
  }
} // TODO these won't work like this if and when we don't have a single active transaction. We should restructure
// this soon to avoid the problem later. Easiest thing is probably to have some closure trick that will create a
// "logging facade" that stores this info and merges it with the fourth argument to regular logging.
// Log grouping
// Logs can grouped by associating a logGroup with each log within a transaction
// The transaction manager can invoke newLogGroup() to generate a new log group


function newGroup(groupId) {
  logGroup = groupId || generateGroupId();
  logInvoiceId = '';
  Log.debug(function () {
    return "Set group Id to ".concat(logGroup);
  });
  return logGroup;
}

function setInvoiceId(invoiceId) {
  logInvoiceId = invoiceId;
}

function setRequestSourceId(id) {
  if (id) {
    requestSource = "RetailSDK.".concat(id.substr(0, 150));
  }
}

},{"./Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/date/now":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/date/now.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/pph-sdk-enums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.string.split.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/eventTracking.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.tracking = void 0;
/* eslint-disable import/prefer-default-export */

var tracking = {
  REFUND_OPTION: 'Transaction Refund - Refund Option',
  REFUND_OPTION_KEY: 'Option',
  REFUND_OPTION_WITHCARD: 'With Card',
  REFUND_OPTION_WITHOUTCARD: 'Without Card'
};
exports.tracking = tracking;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/flow.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _events = require("events");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow');
var FACADE = (0, _symbol["default"])('flow');
/**
 * Present a protected view of the flow to a particular step so that it can't call the
 * true flow step after it is deactivated.
 */

var FlowFacade = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(FlowFacade, _EventEmitter);

  var _super = _createSuper(FlowFacade);

  function FlowFacade(flow) {
    var _this;

    (0, _classCallCheck2["default"])(this, FlowFacade);
    _this = _super.call(this);
    _this.active = true;
    _this.flow = flow;
    return _this;
  }

  (0, _createClass2["default"])(FlowFacade, [{
    key: "_prepareForChange",
    value: function _prepareForChange(noPush) {
      var f = this.flow;

      if (!noPush) {
        f.previousSteps.push(f.stepIndex);
      }

      if (f[FACADE]) {
        f[FACADE].active = false;
      }

      f[FACADE] = new FlowFacade(f);
    }
  }, {
    key: "_check",
    value: function _check() {
      if (!this.active) {
        Log.error('FlowStepCompletionFunctionCalledByInactiveStep', {
          name: this.stepName
        });
        this.flow.emit('flowError', new Error('Flow step completion function called by inactive step!'));
        return false;
      }

      return true;
    }
  }, {
    key: "stepName",
    get: function get() {
      var fn = this.flow.steps[this.flow.stepIndex];
      return fn ? fn.fnName || fn.name : undefined;
    }
  }, {
    key: "_executeStep",
    value: function _executeStep(index) {
      var _this2 = this;

      var direction = index < this.flow.stepIndex ? 'regressing' : 'advancing';
      this.flow.stepIndex = index;
      var stepFn = this.flow.steps[index];
      Log.debug(function () {
        var _context;

        return (0, _concat["default"])(_context = "Flow ".concat(direction, " to ")).call(_context, _this2.stepName);
      });

      try {
        stepFn.call(this.flow.owner, this.flow[FACADE]);
      } catch (e) {
        Log.error('FlowStepExecutionErr', {
          name: this.stepName,
          err: e.message
        });
        this.flow[FACADE].abortFlow(e);
      }
    }
    /**
     * A flow step should call next to advance to the next step, or complete if it's the last
     */

  }, {
    key: "next",
    value: function next() {
      if (!this._check()) {
        Log.debug('Flow::next called out of turn!');
        return;
      }

      var f = this.flow;

      if (f.stepIndex + 1 >= f.steps.length) {
        this.completeFlow();
        return;
      }

      f.emit('next', f.stepIndex);

      this._prepareForChange();

      this._executeStep(f.stepIndex + 1);
    }
    /**
     * A flow step should call back to end the current step and go back to the previous step
     * (or abort if you're the first)
     * TODO how do we continue to go back if the previous step was skipped?
     */

  }, {
    key: "back",
    value: function back() {
      if (!this._check()) {
        Log.debug('Flow::back called out of turn!');
        return;
      }

      var f = this.flow;

      if (f.previousSteps.length === 0) {
        this.abortFlow();
        return;
      }

      f.emit('back', f.steps[f.stepIndex], f.steps[f.stepIndex - 1]);

      this._prepareForChange(true);

      this._executeStep(f.previousSteps.pop());
    }
    /**
     * Immediately complete the flow, firing the completed event
     */

  }, {
    key: "completeFlow",
    value: function completeFlow() {
      var _this3 = this;

      if (!this._check()) {
        Log.debug('Flow::complete called out of turn!');
        return;
      }

      Log.debug(function () {
        return "".concat(_this3.flow.name || 'Anonymous', " Flow completed.");
      });
      var f = this.flow;

      this._prepareForChange();

      f.stepIndex = null;
      f[FACADE] = null;
      f.emit('completed', f.data);
      f.emit('ended', f.data);
    }
    /**
     * Immediately abort the flow, firing the aborted event
     */

  }, {
    key: "abortFlow",
    value: function abortFlow(error) {
      var _this4 = this;

      if (!this._check()) {
        Log.debug('Flow::abortFlow called out of order!');
        return;
      }

      Log.debug(function () {
        return "".concat(_this4.flow.name || 'Anonymous', " Flow aborted");
      });
      var f = this.flow;

      if (error) {
        f.data.error = error;
      }

      f[FACADE].emit('aborted');

      this._prepareForChange();

      f.stepIndex = null;
      f[FACADE] = null;
      f.emit('aborted', f.data);
      f.emit('ended', f.data);
    }
  }, {
    key: "nextOrAbort",
    value: function nextOrAbort(error) {
      if (error) {
        this.abortFlow(error);
      } else {
        this.next();
      }
    }
  }, {
    key: "data",
    get: function get() {
      return this.flow.data;
    }
  }, {
    key: "stepIndex",
    get: function get() {
      return this.flow.stepIndex;
    }
  }, {
    key: "previousSteps",
    get: function get() {
      return this.flow.previousSteps;
    }
  }]);
  return FlowFacade;
}(_events.EventEmitter);
/**
 * A flow is a series of steps in order to complete a process. Each step may complete, cancel, go forward or back
 * in the process. In code, a flow is an array of functions. The functions take one argument - a flow controller -
 * which exposes methods to control the next step in the flow.
 *
 */


var Flow = /*#__PURE__*/function (_EventEmitter2) {
  (0, _inherits2["default"])(Flow, _EventEmitter2);

  var _super2 = _createSuper(Flow);
  /**
   * Construct a new flow with steps pass as individual arguments (each a function) OR
   * as a single array as the second argument.
   * Call start() after setting up appropriate event handlers.
   */


  function Flow(thisForSteps, allSteps) {
    var _this5;

    (0, _classCallCheck2["default"])(this, Flow);
    _this5 = _super2.call(this);
    _this5.owner = thisForSteps;

    if ((0, _isArray["default"])(allSteps)) {
      _this5.steps = allSteps;
    } else {
      _this5.steps = (0, _slice["default"])(Array.prototype).call(arguments, 1); // eslint-disable-line prefer-rest-params
    }
    /**
     * A grab bag of data that can be used to share information among steps
     * @type {object}
     */


    _this5.data = {};
    _this5[FACADE] = null;
    _this5.stepIndex = 0;
    _this5.previousSteps = [];
    return _this5;
  }

  (0, _createClass2["default"])(Flow, [{
    key: "start",
    value: function start() {
      this[FACADE] = new FlowFacade(this);

      this[FACADE]._executeStep(0);

      return this;
    }
  }, {
    key: "abortFlow",
    value: function abortFlow(error) {
      if (!this[FACADE]) {
        Log.error('inactiveFlowAbortCalled!');
        return;
      }

      this[FACADE].abortFlow(error);
    }
  }, {
    key: "stepName",
    get: function get() {
      var _this$FACADE;

      return (_this$FACADE = this[FACADE]) === null || _this$FACADE === void 0 ? void 0 : _this$FACADE.stepName;
    }
  }]);
  return Flow;
}(_events.EventEmitter);

exports["default"] = Flow;

},{"@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/flowAsync.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _events = require("events");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flowAsync');
var FACADE = (0, _symbol["default"])('flowAsync');
/**
 * Present a protected view of the flow to a particular step so that it can't call the
 * true flow step after it is deactivated.
 */

var FlowFacadeAsync = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(FlowFacadeAsync, _EventEmitter);

  var _super = _createSuper(FlowFacadeAsync);

  function FlowFacadeAsync(flow) {
    var _this;

    (0, _classCallCheck2["default"])(this, FlowFacadeAsync);
    _this = _super.call(this);
    _this.active = true;
    _this.flow = flow;
    return _this;
  }

  (0, _createClass2["default"])(FlowFacadeAsync, [{
    key: "toJSON",
    value: function toJSON() {
      return {
        stepName: this.stepName,
        active: this.active,
        flow: this.flow
      };
    }
  }, {
    key: "_prepareForChange",
    value: function () {
      var _prepareForChange2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(noPush) {
        var f;
        return _regenerator["default"].wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                f = this.flow;

                if (!noPush) {
                  f.previousSteps.push(f.stepIndex);
                }

                if (f[FACADE]) {
                  f[FACADE].active = false;
                }

                f[FACADE] = new FlowFacadeAsync(f);

              case 4:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function _prepareForChange(_x) {
        return _prepareForChange2.apply(this, arguments);
      }

      return _prepareForChange;
    }()
  }, {
    key: "_check",
    value: function _check() {
      if (!this.active) {
        Log.error('FlowStepCompletionFunctionCalledByInactiveStep', {
          name: this.stepName
        });
        this.flow.emit('flowError', new Error('Flow step completion function called by inactive step!'));
        return false;
      }

      return true;
    }
  }, {
    key: "stepName",
    get: function get() {
      var fn = this.flow.steps[this.flow.stepIndex];
      return fn ? fn.fnName || fn.name : undefined;
    }
  }, {
    key: "_executeStep",
    value: function () {
      var _executeStep2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(index) {
        var _this2 = this;

        var direction, stepFn;
        return _regenerator["default"].wrap(function _callee2$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                direction = index < this.flow.stepIndex ? 'regressing' : 'advancing';
                this.flow.stepIndex = index;
                stepFn = this.flow.steps[index];
                Log.debug(function () {
                  var _context2;

                  return (0, _concat["default"])(_context2 = "Flow ".concat(direction, " to ")).call(_context2, _this2.stepName);
                });
                _context3.prev = 4;
                _context3.next = 7;
                return stepFn.call(this.flow.owner, this.flow[FACADE]);

              case 7:
                _context3.next = 14;
                break;

              case 9:
                _context3.prev = 9;
                _context3.t0 = _context3["catch"](4);
                Log.error('FlowStepReturnedErr', {
                  name: this.stepName,
                  err: _context3.t0
                });
                _context3.next = 14;
                return this.flow[FACADE].abortFlow(_context3.t0);

              case 14:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee2, this, [[4, 9]]);
      }));

      function _executeStep(_x2) {
        return _executeStep2.apply(this, arguments);
      }

      return _executeStep;
    }()
    /**
     * A flow step should call next to advance to the next step, or complete if it's the last
     */

  }, {
    key: "next",
    value: function () {
      var _next = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
        var f;
        return _regenerator["default"].wrap(function _callee3$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                if (this._check()) {
                  _context4.next = 3;
                  break;
                }

                Log.debug(function () {
                  return 'Flow::next called out of turn!';
                });
                return _context4.abrupt("return");

              case 3:
                f = this.flow;

                if (!(f.stepIndex + 1 >= f.steps.length)) {
                  _context4.next = 8;
                  break;
                }

                _context4.next = 7;
                return this.completeFlow();

              case 7:
                return _context4.abrupt("return");

              case 8:
                f.emit('next', f.stepIndex);
                _context4.next = 11;
                return this._prepareForChange();

              case 11:
                _context4.next = 13;
                return this._executeStep(f.stepIndex + 1);

              case 13:
              case "end":
                return _context4.stop();
            }
          }
        }, _callee3, this);
      }));

      function next() {
        return _next.apply(this, arguments);
      }

      return next;
    }()
    /**
     * A flow step should call back to end the current step and go back to the previous step
     * (or abort if you're the first)
     * TODO how do we continue to go back if the previous step was skipped?
     */

  }, {
    key: "back",
    value: function () {
      var _back = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
        var f;
        return _regenerator["default"].wrap(function _callee4$(_context5) {
          while (1) {
            switch (_context5.prev = _context5.next) {
              case 0:
                if (this._check()) {
                  _context5.next = 3;
                  break;
                }

                Log.debug(function () {
                  return 'Flow::back called out of turn!';
                });
                return _context5.abrupt("return");

              case 3:
                f = this.flow;

                if (!(f.previousSteps.length === 0)) {
                  _context5.next = 8;
                  break;
                }

                _context5.next = 7;
                return this.abortFlow();

              case 7:
                return _context5.abrupt("return");

              case 8:
                f.emit('back', f.steps[f.stepIndex], f.steps[f.stepIndex - 1]);
                _context5.next = 11;
                return this._prepareForChange(true);

              case 11:
                _context5.next = 13;
                return this._executeStep(f.previousSteps.pop());

              case 13:
              case "end":
                return _context5.stop();
            }
          }
        }, _callee4, this);
      }));

      function back() {
        return _back.apply(this, arguments);
      }

      return back;
    }()
    /**
     * Immediately complete the flow, firing the completed event
     */

  }, {
    key: "completeFlow",
    value: function () {
      var _completeFlow = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
        var _this3 = this;

        var f;
        return _regenerator["default"].wrap(function _callee5$(_context6) {
          while (1) {
            switch (_context6.prev = _context6.next) {
              case 0:
                if (this._check()) {
                  _context6.next = 3;
                  break;
                }

                Log.debug(function () {
                  return 'Flow::complete called out of turn!';
                });
                return _context6.abrupt("return");

              case 3:
                Log.debug(function () {
                  return "".concat(_this3.flow.name || 'Anonymous', " Flow completed.");
                });
                f = this.flow;
                _context6.next = 7;
                return this._prepareForChange();

              case 7:
                f.stepIndex = null;
                f[FACADE] = null;
                f.emit('completed', f.data);
                f.emit('ended', f.data);

              case 11:
              case "end":
                return _context6.stop();
            }
          }
        }, _callee5, this);
      }));

      function completeFlow() {
        return _completeFlow.apply(this, arguments);
      }

      return completeFlow;
    }()
    /**
     * Immediately abort the flow, firing the aborted event
     */

  }, {
    key: "abortFlow",
    value: function () {
      var _abortFlow = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(error) {
        var _this4 = this;

        var f;
        return _regenerator["default"].wrap(function _callee6$(_context7) {
          while (1) {
            switch (_context7.prev = _context7.next) {
              case 0:
                if (this._check()) {
                  _context7.next = 3;
                  break;
                }

                Log.debug(function () {
                  return 'Flow::abortFlow called out of order!';
                });
                return _context7.abrupt("return");

              case 3:
                Log.debug(function () {
                  return "".concat(_this4.flow.name || 'Anonymous', " Flow aborted");
                });
                f = this.flow;

                if (error) {
                  f.data.error = error;
                }

                f[FACADE].emit('aborted');
                _context7.next = 9;
                return this._prepareForChange();

              case 9:
                f.stepIndex = null;
                f[FACADE] = null;
                f.emit('aborted', f.data);
                f.emit('ended', f.data);

              case 13:
              case "end":
                return _context7.stop();
            }
          }
        }, _callee6, this);
      }));

      function abortFlow(_x3) {
        return _abortFlow.apply(this, arguments);
      }

      return abortFlow;
    }()
  }, {
    key: "nextOrAbort",
    value: function () {
      var _nextOrAbort = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(error) {
        return _regenerator["default"].wrap(function _callee7$(_context8) {
          while (1) {
            switch (_context8.prev = _context8.next) {
              case 0:
                if (!error) {
                  _context8.next = 5;
                  break;
                }

                _context8.next = 3;
                return this.abortFlow(error);

              case 3:
                _context8.next = 7;
                break;

              case 5:
                _context8.next = 7;
                return this.next();

              case 7:
              case "end":
                return _context8.stop();
            }
          }
        }, _callee7, this);
      }));

      function nextOrAbort(_x4) {
        return _nextOrAbort.apply(this, arguments);
      }

      return nextOrAbort;
    }()
  }, {
    key: "data",
    get: function get() {
      return this.flow.data;
    }
  }, {
    key: "stepIndex",
    get: function get() {
      return this.flow.stepIndex;
    }
  }, {
    key: "previousSteps",
    get: function get() {
      return this.flow.previousSteps;
    }
  }]);
  return FlowFacadeAsync;
}(_events.EventEmitter);
/**
 * A flow is a series of steps in order to complete a process. Each step may complete, cancel, go forward or back
 * in the process. In code, a flow is an array of functions. The functions take one argument - a flow controller -
 * which exposes methods to control the next step in the flow.
 *
 */


var FlowAsync = /*#__PURE__*/function (_EventEmitter2) {
  (0, _inherits2["default"])(FlowAsync, _EventEmitter2);

  var _super2 = _createSuper(FlowAsync);
  /**
   * Construct a new flow with steps pass as individual arguments (each a function) OR
   * as a single array as the second argument.
   * Call start() after setting up appropriate event handlers.
   */


  function FlowAsync(thisForSteps, allSteps) {
    var _this5;

    (0, _classCallCheck2["default"])(this, FlowAsync);
    _this5 = _super2.call(this);
    _this5.owner = thisForSteps;

    if ((0, _isArray["default"])(allSteps)) {
      _this5.steps = allSteps;
    } else {
      _this5.steps = (0, _slice["default"])(Array.prototype).call(arguments, 1); // eslint-disable-line prefer-rest-params
    }
    /**
     * A grab bag of data that can be used to share information among steps
     * @type {object}
     */


    _this5.data = {};
    _this5[FACADE] = null;
    _this5.stepIndex = 0;
    _this5.previousSteps = [];
    return _this5;
  }

  (0, _createClass2["default"])(FlowAsync, [{
    key: "toJSON",
    value: function toJSON() {
      return {
        data: this.data,
        stepIndex: this.stepIndex,
        previousSteps: this.previousSteps
      };
    }
  }, {
    key: "start",
    value: function () {
      var _start = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
        return _regenerator["default"].wrap(function _callee8$(_context9) {
          while (1) {
            switch (_context9.prev = _context9.next) {
              case 0:
                this[FACADE] = new FlowFacadeAsync(this);
                _context9.next = 3;
                return this[FACADE]._executeStep(0);

              case 3:
                return _context9.abrupt("return", this);

              case 4:
              case "end":
                return _context9.stop();
            }
          }
        }, _callee8, this);
      }));

      function start() {
        return _start.apply(this, arguments);
      }

      return start;
    }()
  }, {
    key: "abortFlow",
    value: function () {
      var _abortFlow2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(error) {
        return _regenerator["default"].wrap(function _callee9$(_context10) {
          while (1) {
            switch (_context10.prev = _context10.next) {
              case 0:
                if (this[FACADE]) {
                  _context10.next = 3;
                  break;
                }

                Log.error('inactiveFlowAbortCalled!');
                return _context10.abrupt("return");

              case 3:
                _context10.next = 5;
                return this[FACADE].abortFlow(error);

              case 5:
              case "end":
                return _context10.stop();
            }
          }
        }, _callee9, this);
      }));

      function abortFlow(_x5) {
        return _abortFlow2.apply(this, arguments);
      }

      return abortFlow;
    }()
  }, {
    key: "stepName",
    get: function get() {
      var _this$FACADE;

      return (_this$FACADE = this[FACADE]) === null || _this$FACADE === void 0 ? void 0 : _this$FACADE.stepName;
    }
  }]);
  return FlowAsync;
}(_events.EventEmitter);

exports["default"] = FlowAsync;

},{"@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/index.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _invoicing = require("./invoicing");

var _NetworkResponse = require("./NetworkHandler/NetworkResponse");

var _SdkEnvironmentInfo = require("./SdkEnvironmentInfo");

var _flow = _interopRequireDefault(require("./flow"));

module.exports = {
  RetailInvoice: _invoicing.RetailInvoice,
  RetailInvoicePayment: _invoicing.RetailInvoicePayment,
  NetworkResponse: _NetworkResponse.NetworkResponse,
  SdkEnvironmentInfo: _SdkEnvironmentInfo.SdkEnvironmentInfo,
  Flow: _flow["default"]
};

},{"./NetworkHandler/NetworkResponse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/NetworkHandler/NetworkResponse.js","./SdkEnvironmentInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/SdkEnvironmentInfo.js","./flow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/flow.js","./invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/invoicing/index.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/invoicing/RetailInvoice.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some"));

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticoreUtil = require("manticore-util");

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _retailSDKUtil = require("../retailSDKUtil");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('retail.invoice');

function getTransactionType(transactionType) {
  if (transactionType === _retailPaymentDevice.TransactionType.Sale) {
    return 'SALE';
  }

  if (transactionType === _retailPaymentDevice.TransactionType.Auth) {
    return 'AUTHORIZATION';
  }

  return undefined;
}

var ToPaymentConversion = {
  merchant_info: 'merchant_info',
  number: 'invoice_number',
  items: 'purchase_units',
  invoice_date: 'invoice_date',
  logo_url: 'logo_url',
  terms: 'terms',
  tax_calculated_after_discount: 'tax_calculated_after_discount',
  tax_inclusive: 'tax_inclusive',
  gratuity: 'gratuity',
  discount: 'discount',
  shipping_cost: 'shipping_cost',
  additional_data: 'receipt'
};
var FromPaymentConversion = {
  invoice_number: 'number',
  purchase_units: 'items',
  receipt: 'additional_data'
};
/**
 * The "Retail" Implementation of Invoice that is used by PPH only. Contains receiptDetails such as store ID,
 * TerminalID, and countryCode.
 * This class is a specific version implementation of the Invoice.
 *
 * @class
 * @extends Invoice
 *
 * @property {string} name Transaction type of the Invoice
 * @property {decimal} total Total Invoice amount
 * @property {string} txnHandle The transaction handle
 * @property {string} countryCode The country object that contains the country code and country name
 * @property {string} storeId The store id where the receipt was generated
 * @property {string} terminalId The terminal ID where the actual receipt was generated
 * @property {string} sellerId The seller Id (Normally set to Primary users' full name)
 * @property {Invoice.Status} status The current status of the invoice
 * @property {[InvoicePayment]} payments an array of payment objects
 * @property {string} deviceName The device name
 * @property {string} footer The custom footer text
 * @property {string} payPalId The id assigned by PayPal for an invoice. This is basically same the
 *                    super class' payPalId. This is added to open the setter on the native side.
 * @property {bool} isCancelled Check if the transaction was cancelled by the user
 * @property {bool} isFailed Check if the payment was declined by the api
 * @property {string} referrerCode the referrer code coming from sideloader calls
 */

var RetailInvoice = /*#__PURE__*/function (_Invoice) {
  (0, _inherits2["default"])(RetailInvoice, _Invoice);

  var _super = _createSuper(RetailInvoice);
  /**
   * Creates a Retail Invoice object with the following Receipt Details.
   * @constructor
   * @param {string} currencyCode Currency code identifying the currency for amounts on the invoice.
   */


  function RetailInvoice(currencyCode) {
    var _this;

    (0, _classCallCheck2["default"])(this, RetailInvoice); // eslint-disable-line no-useless-constructor

    _this = _super.call(this, currencyCode);
    _this.paidAmount = _paypalInvoicing.Currency.round(currencyCode, 0);
    _this.refundedAmount = _paypalInvoicing.Currency.round(currencyCode, 0);
    _this.isCancelled = false;
    _this.isFailed = false;
    return _this;
  }

  (0, _createClass2["default"])(RetailInvoice, [{
    key: "toPaymentJSON",
    value: function toPaymentJSON() {
      var paymentInvoice = {};
      (0, _retailSDKUtil.merge)(this.toJSON(), paymentInvoice, ToPaymentConversion);
      this.updateMerchantInfo(paymentInvoice);
      return paymentInvoice;
    }
  }, {
    key: "updateMerchantInfo",
    value: function updateMerchantInfo(target) {
      var _merchantInfo$address;

      var merchantInfo = target.merchant_info;
      var merchantAddress = (_merchantInfo$address = merchantInfo.address) !== null && _merchantInfo$address !== void 0 ? _merchantInfo$address : {};
      var modifiedMerchantInfo = {
        address: {
          address_line_1: merchantAddress.line1,
          address_line_2: merchantAddress.line2,
          admin_area_1: merchantAddress.state,
          admin_area_2: merchantAddress.city,
          country_code: merchantAddress.country,
          postal_code: merchantAddress.postalCode
        },
        business_name: merchantInfo.businessName,
        email: merchantInfo.email,
        // ToDo: figure out the phone_number why it is blank.
        // Note that the empty phone_number not accepted by hereServ
        // phone_number: merchantInfo.phoneDictionary,
        website: merchantInfo.website,
        tax_id: merchantInfo.taxId,
        name: {
          given_name: merchantInfo.firstName,
          surname: merchantInfo.lastName
        }
      };
      target.merchant_info = modifiedMerchantInfo;
    }
  }, {
    key: "fromPaymentJSON",
    value: function fromPaymentJSON(serverJSON) {
      (0, _retailSDKUtil.merge)(serverJSON, serverJSON, FromPaymentConversion); // DTPPHMM-619: merchantInfo needs to be updated otherwise invoice object does not have it!!!

      this.readJSON((0, _manticoreUtil.deepToJSON)(serverJSON), true);
    }
  }, {
    key: "total",
    get: function get() {
      return (0, _get2["default"])((0, _getPrototypeOf2["default"])(RetailInvoice.prototype), "total", this).minus(this.digitalCardTotal);
    }
  }, {
    key: "originalTotal",
    get: function get() {
      return (0, _get2["default"])((0, _getPrototypeOf2["default"])(RetailInvoice.prototype), "total", this);
    }
  }, {
    key: "digitalCardTotal",
    get: function get() {
      var _total = _paypalInvoicing.Currency.round(this.currencyCode, 0);

      if (this.payments) {
        var _context, _context2;

        return (0, _reduce["default"])(_context = (0, _filter["default"])(_context2 = this.payments).call(_context2, function (payment) {
          return payment.method === _paypalInvoicing.InvoiceEnums.PaymentMethod.DIGITAL_CARD;
        })).call(_context, function (acc, payment) {
          return acc.plus(payment.amount);
        }, _total);
      }

      return _total;
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      var invoiceJSON = (0, _get2["default"])((0, _getPrototypeOf2["default"])(RetailInvoice.prototype), "toJSON", this).call(this); // Check if invoiceJSON contains a field called 'additional data' and it is a valid JSON object

      this._buildAdditionalDataObject(invoiceJSON); // Return the invoiceJSON as is


      return invoiceJSON;
    }
  }, {
    key: "readJSON",
    value: function readJSON(serverJSON, hasDetails) {
      (0, _get2["default"])((0, _getPrototypeOf2["default"])(RetailInvoice.prototype), "readJSON", this).call(this, serverJSON, hasDetails);

      this._parseJSONResponse(serverJSON);
    }
  }, {
    key: "_buildAdditionalDataObject",
    value: function _buildAdditionalDataObject(invoiceJSON) {
      var additionalData = {};

      if (invoiceJSON.additional_data) {
        try {
          additionalData = JSON.parse(invoiceJSON.additional_data);
        } catch (x) {
          // CANNOT DO MUCH HERE... LOG WARNING AND QUIT
          Log.warn('JSONParsingErrorFor"additional data object"..');
          return;
        }
      }

      additionalData.dname = this.deviceName || additionalData.dname;
      additionalData.footer = additionalData.footer || {};
      additionalData.referrerCode = this.referrerCode || additionalData.referrerCode;
      additionalData.footer.customText = this.footer || additionalData.footer.customText;
      additionalData.merchant = additionalData.merchant || {};
      additionalData.merchant.sellerId = this.sellerId || additionalData.merchant.sellerId;
      additionalData.merchant.storeId = this.storeId || additionalData.merchant.storeId;
      additionalData.merchant.terminalId = this.terminalId || additionalData.merchant.terminalId;
      invoiceJSON.additional_data = (0, _stringify["default"])(additionalData);
    }
  }, {
    key: "_parseJSONResponse",
    value: function _parseJSONResponse(serverJSON) {
      /*
       Parse the stringified additional Data and set it to the respective variables.
       */
      var jsonAdditionalData;

      if (serverJSON.additional_data) {
        try {
          jsonAdditionalData = JSON.parse(serverJSON.additional_data);
        } catch (e) {
          // Valid JSON not present .. Dont parse any values from it.
          Log.warn('JSONParsingErrorFor"additional data object" from server..');
          return;
        }

        this.deviceName = jsonAdditionalData.dname;

        if (jsonAdditionalData.footer) {
          this.footer = jsonAdditionalData.footer.customText;
        }

        if (jsonAdditionalData.merchant) {
          if (jsonAdditionalData.merchant.seller) {
            this.sellerId = jsonAdditionalData.merchant.seller.sellerId;
          }

          this.terminalId = jsonAdditionalData.merchant.terminalId;
          this.storeId = jsonAdditionalData.merchant.storeId;
        } // Do nothing if Additional Data is not present

      }
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }, {
    key: "sanitize",
    value: function sanitize() {
      this.merchantInfo = undefined;
      this.additional_data = undefined;
      this.shippingInfo = undefined;
      this.billingInfo = undefined;
    } // Digital card state methods

  }, {
    key: "isInvoiceStatusPartial",
    get: function get() {
      var _this2 = this;

      Log.debug(function () {
        return "isInvoiceStatusPartial Invoice Status ".concat(_this2.status);
      });
      return this.status === _paypalInvoicing.InvoiceEnums.Status.PARTIALLY_PAID;
    }
  }, {
    key: "hasDigitalGiftCardPayment",
    get: function get() {
      var _this$payments;

      return (_this$payments = this.payments) === null || _this$payments === void 0 ? void 0 : (0, _some["default"])(_this$payments).call(_this$payments, function (payment) {
        return payment.method === _paypalInvoicing.InvoiceEnums.PaymentMethod.DIGITAL_CARD;
      });
    }
  }, {
    key: "resetFlags",
    value: function resetFlags() {
      this.isCancelled = false;
      this.isFailed = false;
    }
  }, {
    key: "addPayment",
    value: function addPayment(invoicePayment, paymentType) {
      invoicePayment.transactionType = getTransactionType(paymentType);

      if (!this.payments) {
        this.payments = [invoicePayment];
      } else {
        this.payments.push(invoicePayment);
      }

      this.paidAmount = this.paidAmount.plus(invoicePayment.amount);

      this._updateStatusFromPayments();
    }
  }, {
    key: "_calculatePaidAmount",
    value: function _calculatePaidAmount() {
      var _context3;

      this.paidAmount = (0, _reduce["default"])(_context3 = this.payments).call(_context3, function (acc, payment) {
        return acc.plus(payment.amount);
      }, _paypalInvoicing.Currency.round(this.currencyCode, 0));

      this._updateStatusFromPayments();
    }
  }, {
    key: "_updateStatusFromPayments",
    value: function _updateStatusFromPayments() {
      if (this.paidAmount.isGreaterThanOrEqualTo((0, _get2["default"])((0, _getPrototypeOf2["default"])(RetailInvoice.prototype), "total", this))) {
        this.status = _paypalInvoicing.InvoiceEnums.Status.PAID;
      } else if (this.paidAmount.isEqualTo(0)) {
        this.status = _paypalInvoicing.InvoiceEnums.Status.UNPAID;
      } else {
        this.status = _paypalInvoicing.InvoiceEnums.Status.PARTIALLY_PAID;
      }
    }
  }, {
    key: "addRefund",
    value: function addRefund(invoiceRefund) {
      invoiceRefund.transactionType = 'REFUND';

      if (!this.refunds) {
        this.refunds = [invoiceRefund];
      } else {
        this.refunds.push(invoiceRefund);
      }

      this.refundedAmount = this.refundedAmount.plus(invoiceRefund.amount);

      this._updateStatusFromRefunds();
    }
  }, {
    key: "_updateStatusFromRefunds",
    value: function _updateStatusFromRefunds() {
      if (this.refundedAmount.isGreaterThanOrEqualTo((0, _get2["default"])((0, _getPrototypeOf2["default"])(RetailInvoice.prototype), "total", this))) {
        this.status = _paypalInvoicing.InvoiceEnums.Status.REFUNDED;
      } else if (this.refundedAmount.isEqualTo(0)) {
        this.status = _paypalInvoicing.InvoiceEnums.Status.PAID;
      } else {
        this.status = _paypalInvoicing.InvoiceEnums.Status.PARTIALLY_REFUNDED;
      }
    }
  }, {
    key: "removePayments",
    value: function removePayments() {
      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {
        return true;
      };

      if (this.payments) {
        var _context4;

        this.payments = (0, _filter["default"])(_context4 = this.payments).call(_context4, function (payment) {
          return !cb(payment);
        });

        this._calculatePaidAmount();
      }
    }
    /**
     * Create a true copy / duplicate of an invoice. This is named duplicate instead
     * of copy to avoid code gen issues on iOS
     * @returns {RetailInvoice}
     */

  }, {
    key: "duplicate",
    value: function duplicate() {
      return (0, _get2["default"])((0, _getPrototypeOf2["default"])(RetailInvoice.prototype), "duplicate", this).call(this);
    }
  }]);
  return RetailInvoice;
}(_paypalInvoicing.Invoice);

exports["default"] = RetailInvoice;

},{"../retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/invoicing/RetailInvoicePayment.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}
/**
 * This class is only used to expose properties useful for retail invoice payments.
 * @class
 * @extends InvoicePayment
 */


var RetailInvoicePayment = /*#__PURE__*/function (_InvoicePayment) {
  (0, _inherits2["default"])(RetailInvoicePayment, _InvoicePayment);

  var _super = _createSuper(RetailInvoicePayment);

  function RetailInvoicePayment() {
    (0, _classCallCheck2["default"])(this, RetailInvoicePayment);
    return _super.apply(this, arguments);
  }

  return (0, _createClass2["default"])(RetailInvoicePayment);
}(_paypalInvoicing.InvoicePayment);

exports["default"] = RetailInvoicePayment;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/invoicing/index.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

_Object$defineProperty(exports, "RetailInvoice", {
  enumerable: true,
  get: function get() {
    return _RetailInvoice2["default"];
  }
});

_Object$defineProperty(exports, "RetailInvoicePayment", {
  enumerable: true,
  get: function get() {
    return _RetailInvoicePayment2["default"];
  }
});

var _RetailInvoice2 = _interopRequireDefault(require("./RetailInvoice"));

var _RetailInvoicePayment2 = _interopRequireDefault(require("./RetailInvoicePayment"));

},{"./RetailInvoice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/invoicing/RetailInvoice.js","./RetailInvoicePayment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/invoicing/RetailInvoicePayment.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _en = _interopRequireDefault(require("./localized/en"));

var _jp = _interopRequireDefault(require("./localized/jp"));
/**
 * Load the overall retail SDK localization files
 */


var _default = require('l10n-manticore')({
  en: _en["default"],
  jp: _jp["default"]
}); // eslint-disable-line global-require


exports["default"] = _default;

},{"./localized/en":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/localized/en.js","./localized/jp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/localized/jp.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","l10n-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/l10n-manticore/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/localized/en.js":[function(require,module,exports){
"use strict";
/* eslint-disable no-template-curly-in-string, max-len */

module.exports = {
  Refund: 'Refund',
  Refunded: 'refunded',
  Payment: 'Payment',
  Paid: 'paid',
  Done: 'Done',
  Cancel: 'Cancel',
  Ok: 'OK',
  Yes: 'Yes',
  No: 'No',
  Error: 'Oops!',
  RemoveCard: '\nPlease remove card.',
  Sig: {
    Collecting: 'Waiting for customer signature',
    Title: 'Charge ${amount} to ${cardIssuer} *${lastFour}',
    Here: 'Sign Here',
    Footer: 'I agree to pay the amount above according to the terms applicable to my card.'
  },
  Rcpt: {
    Title: '${amount}',
    Prompt: 'Would you like a receipt?',
    EmailButtonTitle: 'Email',
    SMSButtonTitle: 'Text',
    NoThanksButtonTitle: 'No Thanks',
    Sending: 'Sending Receipt...',
    Disclaimer: 'Receipts will be delivered by PayPal. See your receipt for PayPal\'s Privacy Policy.',
    PromptDueToNetworkError: 'There may have been an issue with this ${transactionType}.\n Check your payment history to confirm the ${transactionType} status.\n Would you like a receipt?',
    Email: {
      Title: 'EMAIL RECEIPT',
      Placeholder: 'me@somewhere.com',
      Disclaimer: 'By entering my email, I agree to receive email receipts from PayPal.',
      SendButtonTitle: 'Send'
    },
    SMS: {
      Title: 'TEXT RECEIPT',
      Placeholder: '+14085551212',
      Disclaimer: 'By entering my phone number, I agree to receive receipt via text from PayPal. Message and data rates may apply.',
      SendButtonTitle: 'Send'
    }
  },
  Tx: {
    Alert: {
      Ready: {
        Title: 'Ready',
        Msg: 'Tap, Insert or Swipe a card.'
      },
      EnterPin: {
        Title: '${amount}',
        Message: 'Please enter the PIN on the card reader keypad.'
      },
      IncorrectPin: {
        Title: 'Incorrect PIN',
        Message: 'The PIN is incorrect. Please try again.'
      },
      CardNotInSlot: {
        Title: 'Cancelling...',
        Msg: 'Chip card not in reader'
      },
      ReadyForInsertOrSwipeOnly: {
        Title: 'Ready',
        Msg: 'Insert or swipe a card.'
      },
      ReadyForSwipeOnly: {
        Title: 'Ready',
        Msg: 'Swipe a card'
      },
      ReadyForInsertOnly: {
        Title: 'Ready',
        Msg: 'Insert a card.'
      },
      ReadyForQRCOnly: {
        Title: 'Ready',
        Msg: 'Select QR-code.'
      },
      Cancel: {
        Title: 'Cancel',
        Msg: 'Would you like to cancel this ${transactionType}?'
      },
      TimeOut: {
        Title: 'Payment Timed Out',
        Msg: 'Payment was not completed.',
        Button: 'Cancel ${transactionType}'
      },
      NfcNotAllowed: {
        Title: 'Insert or swipe card',
        Msg: 'Card provider requires that you insert or swipe card.'
      },
      NfcFallback: {
        Title: 'Unable to Read Card',
        Msg: 'Insert or swipe card now, or try a different card.'
      },
      NfcPaymentDeclined: {
        Title: 'Contactless ${transactionType} Declined',
        Msg: 'Do you want to try again by inserting the card?'
      },
      InsertOrSwipe: {
        Title: 'Insert or Swipe Card',
        Msg: 'Card issuer requires\nthat you insert or swipe card.',
        Button: 'Cancel ${transactionType}'
      },
      IncorrectOnlinePin: {
        Title: 'Incorrect PIN',
        Msg: 'The PIN entered was incorrect. Please try again.'
      },
      GenericError: {
        Title: '${transactionType} canceled',
        Msg: 'Unable to process ${transactionType}.'
      },
      Cancelled: {
        Title: '${transactionType} canceled',
        Msg: 'Unable to process ${transactionType}.'
      },
      Declined: {
        Title: '${transactionType} declined',
        Msg: 'Unable to process ${transactionType}.'
      },
      Failed: {
        Title: '${transactionType} failed',
        Msg: 'Unable to process ${transactionType}.'
      },
      NetworkOffline: {
        Title: 'Network Offline',
        Msg: 'Unable to process ${transactionType} due to network offline.'
      },
      TapDifferentCard: {
        Title: 'Unable to read card',
        Msg: 'Please insert or swipe card now, or press OK and tap a different card.'
      },
      TryDifferentCard: {
        Title: 'Unable to read card',
        Msg: 'Please try again with a different card.'
      },
      BlockedCard: {
        Title: 'Declined',
        Msg: 'Contact the card issuer for more information.'
      },
      BlockedCardTapped: {
        Title: 'Declined',
        Msg: 'Please contact the card issuer for more information.'
      },
      BlockedCardSwiped: {
        Title: 'Declined',
        Msg: 'Please contact the card issuer for more information.'
      },
      ChipCardSwiped: {
        Title: 'Chip card detected',
        Msg: 'Please Insert the card.\n Or use another card.'
      },
      UnsuccessfulInsert: {
        Title: 'Unable to read card',
        Msg: 'Please try again. Firmly insert the card, chip first, into the reader.'
      },
      AmountTooLow: {
        Title: 'Amount Too Low',
        Msg: 'The minimum amount for card payments is ${amount}. Please enter a higher amount.'
      },
      AmountTooHigh: {
        Title: 'Amount Too High',
        Msg: 'The maximum amount for card payments is ${amount}. Please enter a lower amount.'
      },
      Refund: {
        Title: 'Refund type',
        Msg: 'Please select a type',
        Buttons: {
          WithCard: 'Refund With Card',
          WithoutCard: 'Refund Without Card'
        },
        CardMismatch: {
          Title: 'Card Mismatch',
          Msg: 'Card presented for refund is not the one used for the original payment.'
        }
      },
      MultipleContactlessCardsDetected: {
        Title: 'Please present only one card',
        Msg: 'Multiple Contactless Cards Detected'
      },
      cardRemovedBeforeRead: {
        Title: '${transactionType} canceled',
        Msg: 'The card was removed before it was read.'
      },
      LowBattery: {
        Title: 'Battery Low',
        Msg: 'Please recharge your card reader'
      },
      SeePhone: {
        Title: 'Ready',
        Msg: 'Tap, Insert or Swipe a card.\n Please ask customer to see phone.'
      }
    },
    Retry: 'Try again?',
    CancelledByUser: '${transactionType} Canceled',
    TransactionFailed: '${transactionType} Failed',
    TransactionDeclined: '${transactionType} Declined',
    TransactionSuccessful: '${transactionType} Successful',
    OfflineComplete: 'Payment Complete',
    TransactionErrorDueToNetwork: 'Network Error'
  },
  SwUpgrade: {
    Required: {
      Title: 'Update Required',
      Msg: 'Your card reader must be updated before you can process payments.'
    },
    Optional: {
      Title: 'Update available',
      Msg: 'An update is available for your card reader.'
    },
    Buttons: {
      Ok: 'OK',
      UpdateNow: 'Update Now',
      NotNow: 'Not Now',
      Retry: 'Try again'
    },
    Failed: {
      Title: 'Software Update Failed',
      Msg: 'Sorry, the update could not be completed.',
      BatteryLow: 'Please recharge the card reader.'
    },
    Updating: {
      Title: 'Updating Reader',
      Msg: '\nPlease do not close the app or disconnect the reader'
    },
    Success: {
      Title: 'Update Successful',
      Msg: 'Your card reader is ready.\nYou can now accept card payments.'
    },
    Downloading: 'Downloading ${count}/${total}',
    Initializing: 'Initializing card reader...\nPlease do not close the app or disconnect the reader',
    ValidatingSecurityKeys: 'Validating security keys...\nPlease do not close the app or disconnect the reader',
    SecurityKeysInstalled: 'Security keys installed.',
    UpdatingWithDetails: 'Updating ${stage} ${progress}%\nPlease do not close the app or disconnect the reader',
    Restarting: 'Restarting card reader...\nPlease do not close the app',
    Reconnecting: 'Reconnecting to card reader...\nPlease do not close the app',
    RestartInstruction: {
      Title: 'Start Reader',
      Msg: 'Please start the reader to proceed with the update'
    },
    Connected: 'Connected',
    Usb: {
      UsbUnplug: 'Please unplug your USB reader and press OK',
      UsbWait: 'Please wait before plugging in your USB reader.',
      UsbPlug: 'Please reconnect your USB reader.'
    }
  },
  EMV: {
    Tip: {
      Title: 'Waiting for customer input...',
      Buttons: {
        NoTip: 'No Tip'
      }
    },
    QuickChip: {
      RemoveCard: 'Please Remove Card.',
      Processing: 'Processing...',
      EmptyTitle: ' '
    },
    Processing: 'Processing...',
    ProcessingPinOk: 'Processing... PIN OK',
    PinOk: 'PIN OK',
    ProcessingRefund: 'Processing Refund...',
    Cancelling: 'Cancelling...',
    Finalize: 'Completing ${transactionType}...',
    DoNotRemove: 'Do not remove card.',
    Remove: 'Please remove card.',
    Complete: '${amount} ${transactionCompleteType}',
    Select: 'Choose an application:'
  },
  Vault: {
    Complete: ' ',
    Remove: 'Please remove card.',
    Finalize: 'Completing Vault...'
  },
  OfflinePayment: {
    Save: 'Offline Payment of ${amount} saved',
    Complete: 'Offline Payment of ${amount} completed',
    Continue: 'Do you want to continue?',
    Check: 'Make sure the card is valid',
    NoAudioReader: 'Offline Payment Mode is not available for Audio Readers',
    TxnAmountTooHigh: {
      Title: 'Amount Too High',
      Msg: 'The maximum amount for offline payments is ${amount}. Please enter a lower amount.'
    },
    TotalAmountTooHigh: {
      Title: 'Total Amount Exceeded',
      Msg: 'You cannot exceed ${amount} in stored offline payments. Please reconnect to the internet in order to process your offline payments and reduce this balance.'
    }
  },
  QRC: {
    UrlPage: {
      Title: '${amount} ',
      Msg: 'Ask customer to scan QR-code'
    },
    Scanned: {
      Title: 'Scanned',
      Msg: 'Awaiting input from\ncustomer. Please wait.'
    }
  },
  MultiCard: {
    Title: 'Select a device',
    Msg: 'Please select the PayPal card reader you would like to use:'
  },
  Device: {
    Connecting: {
      Title: 'Connecting to\n${deviceId}'
    },
    Connected: {
      Title: 'Card reader connected',
      Buttons: {
        Switch: 'Switch Card Readers'
      }
    },
    RetryConnection: {
      Title: 'Sorry, we could not connect to this reader',
      Message: 'Please make sure that the card reader is charged and switched on',
      Buttons: {
        Retry: 'Try Again'
      }
    },
    ConnectingFailed: {
      Title: 'Could not\nconnect to\n${deviceId}',
      Buttons: {
        Cancel: 'OK'
      }
    },
    LastReaderUsed: {
      titleLastReaderUsed: 'Last reader used',
      titleConnected: 'Card Reader Connected',
      msgConnecting: 'Connecting',
      msgConnectionFailed: 'Sorry, we could not connect to this reader',
      msgFindFailed: 'Sorry, we couldn\'t find any available card readers',
      msgCheckReader: 'Please make sure that the card reader is charged and switched on',
      msgTurnOnBlueTooth: 'In device settings, turn Bluetooth "ON"',
      btnConnect: 'Connect',
      btnFindAnother: 'Find Another Reader',
      btnDone: 'Done',
      btnSwitchCardReader: 'Switch Card Readers',
      btnTryAgain: 'Try Again',
      btnCancel: 'Cancel'
    },
    ChipAndSwipe: 'PayPal Chip and Swipe Reader',
    Chip: 'PayPal Chip Card Reader',
    ChipAndTap: 'PayPal Chip and Tap Reader',
    Swipe: 'PayPal Swipe Reader',
    Verifone: 'Verifone Reader',
    VerifoneP400: 'Verifone P400 Plus Reader',
    VerifoneE285: 'Verifone E285 Reader'
  }
};
/* eslint-enable no-template-curly-in-string, max-len */

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/localized/jp.js":[function(require,module,exports){
"use strict";
/* eslint-disable no-template-curly-in-string, max-len */

module.exports = {
  Done: '完了',
  Cancel: 'キャンセル',
  Ok: 'OK',
  Yes: 'はい',
  No: 'いいえ',
  Error: '申し訳ありません。',
  Sig: {
    Title: '${cardIssuer}　*${lastFour}に${amount}を請求します',
    Here: 'ここにサイン',
    Footer: 'カードに適用される利用条件に従い、上記の金額を支払うことに同意します。'
  },
  Rcpt: {
    Title: '${amount}',
    Prompt: 'レシートを発行しますか? ',
    EmailButtonTitle: 'メール',
    SMSButtonTitle: 'テキスト',
    NoThanksButtonTitle: '不要',
    Sending: 'レシートを送信中…',
    Disclaimer: 'レシートはPayPalからお送りします。PayPalのプライバシーポリシーについては、レシートをご確認ください',
    Email: {
      Title: 'メールで送信',
      Placeholder: 'me@somewhere.com',
      Disclaimer: 'メールアドレスを入力することで、今後のすべてのPayPal Here取引についてメールを受け取ることに同意します。',
      SendButtonTitle: '送信'
    },
    SMS: {
      Title: 'SMSで送信',
      Placeholder: '14085551212',
      Disclaimer: 'この電話番号を追加する権限があることと、自動送信メールを受け取ることに同意します。メール・データ料金が適用される場合があります。レシートはPayPalからお送りします。PayPalのプライバシーポリシーについては、レシートをご確認ください。',
      SendButtonTitle: '送信'
    }
  },
  Tx: {
    Alert: {
      Ready: {
        Title: '準備完了',
        Msg: '用意ができたらカードをタップ、挿入、またはスワイプします。'
      },
      EnterPin: {
        Title: '${amount}',
        Message: 'カードリーダーのキーパッドに暗証番号を入力してください'
      },
      IncorrectPin: {
        Title: '暗証番号が間違っています',
        Message: '暗証番号が間違っています。もう一度お試しください。'
      },
      ReadyForInsertOrSwipeOnly: {
        Title: '準備完了',
        Msg: '用意ができたらカードを挿入またはスワイプします。'
      },
      ReadyForSwipeOnly: {
        Title: 'カードをリーダーに通してください',
        Msg: 'カードをリーダーの上部で通してください'
      },
      ReadyForInsertOnly: {
        Title: '準備完了',
        Msg: '用意ができたらカードを挿入します。'
      },
      Cancelled: {
        Title: 'キャンセルされました',
        Msg: '取引がキャンセルされました'
      },
      Cancel: {
        Title: 'キャンセル',
        Msg: 'この取引をキャンセルしますか? '
      },
      TimeOut: {
        Title: '取引がタイムアウトになりました',
        Msg: '取引は完了しませんでした。',
        Button: '取引のキャンセル'
      },
      NfcNotAllowed: {
        Title: 'カードの挿入またはリーダーに通す',
        Msg: 'クレジットカード会社により、カードの挿入またはスワイプが求められています。'
      },
      NfcFallback: {
        Title: 'カードを読み取れません',
        Msg: 'カードを挿入するかスワイプしてください。または別のカードをお試しください。'
      },
      NfcPaymentDeclined: {
        Title: '非接触式取引が拒否されました',
        Msg: 'カードを挿入して再度実行しますか? '
      },
      InsertOrSwipe: {
        Title: 'カードの挿入またはスワイプ',
        Msg: 'カード会社により、\nカードの挿入またはスワイプが求められています',
        Button: '取引のキャンセル'
      },
      IncorrectOnlinePin: {
        Title: '暗証番号が間違っています',
        Msg: '入力された暗証番号が正しくありません。もう一度お試しください。'
      },
      GenericError: {
        Title: '取引がキャンセルされました',
        PaymentMessage: '支払いを実行できません',
        RefundMessage: '返金を実行できません'
      },
      TapDifferentCard: {
        Title: 'カードを読み取れません',
        Msg: 'カードを挿入するかスワイプしてください。または[OK]を押して別のカードをタップしてください。'
      },
      BlockedCard: {
        Title: '拒否済み',
        Msg: '詳細についてはカード会社にお問い合わせください'
      },
      BlockedCardInserted: {
        Title: '拒否済み',
        Msg: 'カードを取り外し、カード会社に詳細をお問い合わせください'
      },
      BlockedCardTapped: {
        Title: '拒否済み',
        Msg: '詳細についてはカード会社にお問い合わせください'
      },
      BlockedCardSwiped: {
        Title: '拒否済み',
        Msg: '詳細についてはカード会社にお問い合わせください'
      },
      ChipCardSwiped: {
        Title: 'ICカードを認識しました',
        Msg: 'カードを挿入してください'
      },
      UnsuccessfulInsert: {
        Title: 'カードを読み取れません',
        Msg: 'もう一度お試しください。カードリーダーのにある挿入口にICチップ側を先にしてカードをしっかり入れます'
      },
      AmountTooLow: {
        Title: '金額が低すぎます',
        Msg: 'カード支払いの場合の最低ご利用額は${amount}です。金額を入力し直すか、別の支払方法をお選びください。'
      },
      AmountTooHigh: {
        Title: '金額が高すぎます',
        Msg: 'カード支払いの場合のご利用最高額は${amount}です。金額を入力し直すか、別の支払方法をお選びください。'
      },
      Refund: {
        Title: '返金の種類',
        Msg: '種類を選択してください',
        Buttons: {
          WithCard: 'カードを使用して返金',
          WithoutCard: 'カードを使用せずに返金'
        },
        CardMismatch: {
          Title: 'カードが一致しません',
          Msg: '返金用に提示されたカードは最初の支払い時に使用されたものではありません'
        }
      }
    },
    Retry: '再度実行しますか? ',
    CancelledByUser: '支払いのキャンセル',
    TransactionFailed: '支払いが拒否されました',
    TransactionSuccessful: '支払い完了',
    RefundSuccessful: '返金が完了しました',
    RefundFailed: '返金に失敗しました'
  },
  SwUpgrade: {
    Required: {
      Title: '更新が必要です',
      Msg: '取引を処理する前に、カードリーダーを更新する必要があります。'
    },
    Optional: {
      Title: '更新を利用できます',
      Msg: 'カードリーダーの更新を利用できます。'
    },
    Buttons: {
      Ok: 'OK',
      UpdateNow: '今すぐ更新する',
      NotNow: '後で実行',
      Retry: '再度実行'
    },
    Failed: {
      Title: 'ソフトウェアの更新に失敗しました',
      Msg: '申し訳ありませんが、更新を完了できませんでした。',
      BatteryLow: 'カードリーダーを充電してください。'
    },
    Updating: {
      Title: 'カードリーダーを更新しています',
      Msg: 'カードリーダーを取り外さないでください'
    },
    Success: {
      Title: 'ソフトウェアの更新が完了しました'
    },
    Downloading: '${count}/${total}をダウンロードしています',
    Initializing: 'カードリーダーを初期化中...取り外さないでください',
    ValidatingSecurityKeys: 'セキュリティキーを確認しています...取り外さないでください',
    SecurityKeysInstalled: 'セキュリティキーをインストールしました。',
    UpdatingWithDetails: '${stage} ${progress}%を更新しています...取り外さないでください',
    Restarting: 'カードリーダーを再起動しています....取り外さないでください',
    Reconnecting: 'カードリーダーに再接続しています...取り外さないでください',
    Connected: '接続済みです',
    Usb: {
      UsbUnplug: 'USBリーダーを抜いて[OK]を押してください',
      UsbWait: '時間をおいてからUSBリーダーを接続してください。',
      UsbPlug: 'USBリーダーを再度接続してください。'
    }
  },
  EMV: {
    Tip: {
      Title: '顧客の入力を待機中…',
      Buttons: {
        NoTip: 'チップ不要'
      }
    },
    Processing: '処理中...',
    ProcessingPinOk: '処理中...暗証番号はOKです',
    PinOk: '暗証番号はOKです',
    ProcessingRefund: '返金処理中...',
    Cancelling: '取消中...',
    Finalize: '支払い処理を完了中...',
    DoNotRemove: 'カードを取り出さないでください。',
    Remove: 'カードを取り出してください。',
    Complete: '${amount}を支払いました',
    RefundComplete: '${amount}を返金しました',
    Select: 'アプリを選択します: '
  },
  MultiCard: {
    Title: '端末を選択します',
    Msg: '使用するPayPalカードリーダーを選択してください: '
  },
  Device: {
    Connecting: {
      Title: '${deviceId}に\n接続しています'
    },
    RetryConnecting: {
      Title: '${deviceId}に\n接続しますか? ',
      Message: '端末が起動していることを確認します',
      Buttons: {
        Retry: '再度実行',
        NotNow: '後で実行'
      }
    },
    ConnectingFailed: {
      Title: '${deviceId}に\n接続できません\nでした',
      Buttons: {
        Cancel: 'OK'
      }
    }
  }
};
/* eslint-enable no-template-curly-in-string, max-len */

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/logLevel.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
/**
 * The log level for the SDK
 * @enum {int}
 */

var logLevel = {
  /**
   * Developer logs will be forwarded to output but not to external log stores
   */
  developer: 1,

  /**
   * Debug, Info, Track, Warn & Error logs will be forwarded to output.
   */
  debug: 2,

  /**
   * Info, Track, Warn & Error logs will be forwarded to output
   */
  info: 3,

  /**
   * Track, Warn & Error logs will be forwarded to output
   */
  track: 4,

  /**
   * Warn and Error logs will be forwarded to the output
   */
  warn: 5,

  /**
   * Error logs will be forwarded to the output
   */
  error: 6,

  /**
   * No logs statements will be included in the output
   */
  quiet: 7
};
var _default = logLevel;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/paymentDeviceUtils.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.addPaymentCancelListeners = addPaymentCancelListeners;
exports.createAddPaymentCancelListenersStep = createAddPaymentCancelListenersStep;
exports.createRemovePaymentCancelListenersStep = createRemovePaymentCancelListenersStep;
exports.removePaymentCancelListeners = removePaymentCancelListeners;

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var Log = (0, _manticoreLog["default"])('paymentDeviceUtils');

function addPaymentCancelListeners() {
  var _this$card;

  var r = (_this$card = this.card) === null || _this$card === void 0 ? void 0 : _this$card.reader;

  if (this.context.allowInProgressPaymentCancel && r) {
    Log.debug('AddPaymentCancelListeners');

    var _cardRemovedHandler = this.handleQCRemoveCard ? this.handleQCRemoveCard : this.transactionCancelRequested;

    r.once(_retailPaymentDevice.PaymentDevice.Event.cardRemoved, _cardRemovedHandler);
    r.once(_retailPaymentDevice.PaymentDevice.Event.cancelRequested, this.transactionCancelRequested);
    r.once(_retailPaymentDevice.PaymentDevice.Event.disconnected, this.transactionCancelled);
    r.once(_retailPaymentDevice.PaymentDevice.Event.cancelled, this.transactionCancelled);
  } else {
    Log.warn('Missing card or reader for AddPaymentCancelListenersStep');
  }
}

function removePaymentCancelListeners() {
  var _this$card2;

  var r = (_this$card2 = this.card) === null || _this$card2 === void 0 ? void 0 : _this$card2.reader;

  if (this.context.allowInProgressPaymentCancel && r) {
    Log.debug('RemovePaymentCancelListeners', this.card);

    var _cardRemovedHandler = this.handleQCRemoveCard ? this.handleQCRemoveCard : this.transactionCancelRequested;

    r.removeListener(_retailPaymentDevice.PaymentDevice.Event.cardRemoved, _cardRemovedHandler);
    r.removeListener(_retailPaymentDevice.PaymentDevice.Event.cancelRequested, this.transactionCancelRequested);
    r.removeListener(_retailPaymentDevice.PaymentDevice.Event.disconnected, this.transactionCancelled);
    r.removeListener(_retailPaymentDevice.PaymentDevice.Event.cancelled, this.transactionCancelled);
  } else {
    Log.warn('Missing card or reader for RemovePaymentCancelListeners');
  }
}

function createAddPaymentCancelListenersStep(flow) {
  (0, _bind["default"])(addPaymentCancelListeners).call(addPaymentCancelListeners, this)();
  flow.next();
}

function createRemovePaymentCancelListenersStep(flow) {
  (0, _bind["default"])(removePaymentCancelListeners).call(removePaymentCancelListeners, this)();
  flow.next();
}

},{"@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _sliceInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.asBigNumber = asBigNumber;
exports.chunk = chunk;
exports.cleanTrackData = cleanTrackData;
exports.convertToRetailInvoice = convertToRetailInvoice;
exports.currencySymbols = void 0;
exports.getAmountWithCurrencySymbol = getAmountWithCurrencySymbol;
exports.getCardReaderDescription = getCardReaderDescription;
exports.getCardReaderIcon = getCardReaderIcon;
exports.getCardReaderManufacturer = getCardReaderManufacturer;
exports.getCardReaderModel = getCardReaderModel;
exports.getDeviceErrorWithId = getDeviceErrorWithId;
exports.getDeviceModelName = getDeviceModelName;
exports.getEnumName = getEnumName;
exports.getErrorName = getErrorName;
exports.getExpiryDate = getExpiryDate;
exports.getHost = getHost;
exports.getLocationAsync = getLocationAsync;
exports.getMsgsByError = getMsgsByError;
exports.getOfflineMerchantFromStorage = getOfflineMerchantFromStorage;
exports.getOfflinePaymentListFromStorage = getOfflinePaymentListFromStorage;
exports.getOfflineTxnFromStorage = getOfflineTxnFromStorage;
exports.getPartnerData = getPartnerData;
exports.getPaymentSubstitutions = getPaymentSubstitutions;
exports.getPphDeviceIdFromStorage = getPphDeviceIdFromStorage;
exports.getRandomId = getRandomId;
exports.getRefundSubstitutions = getRefundSubstitutions;
exports.getSdkEnvironmentData = getSdkEnvironmentData;
exports.getTransactionTypeSubstitutions = getTransactionTypeSubstitutions;
exports.getTxEndData = getTxEndData;
exports.hereAPICardDataFromCard = hereAPICardDataFromCard;
exports.hereVaultAPICardDataFromCard = hereVaultAPICardDataFromCard;
exports.isCardValid = isCardValid;
exports.isDatesWithinOffset = isDatesWithinOffset;
exports.isHardDeclined = isHardDeclined;
exports.isNetworkOffline = isNetworkOffline;
exports.isRoamSwiper = isRoamSwiper;
exports.isTxCancelled = isTxCancelled;
exports.merge = merge;
exports.saveOfflineMerchant = saveOfflineMerchant;
exports.saveOfflinePaymentInfoToListStorage = saveOfflinePaymentInfoToListStorage;
exports.saveOfflinePaymentListToStorage = saveOfflinePaymentListToStorage;
exports.saveOfflineTxnToStorage = saveOfflineTxnToStorage;

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.replace.js");

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

require("core-js/modules/es.symbol.js");

require("core-js/modules/es.symbol.description.js");

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _startsWith = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/starts-with"));

var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _entries = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/entries"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _lodash = _interopRequireDefault(require("lodash"));

var _isNil = _interopRequireDefault(require("ramda/src/isNil"));

var _moment = _interopRequireDefault(require("moment"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticore = _interopRequireDefault(require("manticore"));

var _bignumber = _interopRequireDefault(require("bignumber.js"));

var _uuid = _interopRequireDefault(require("uuid"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _paypalrestManticore = require("@paypalcorp/paypalrest-manticore");

var _pphSdkEnums = require("@paypalcorp/pph-sdk-enums");

var _miuraEmv = require("@paypalcorp/miura-emv");

var _manticoreUtil = require("manticore-util");

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _tlvlib = require("tlvlib");

var _l10n = _interopRequireDefault(require("./l10n"));

var _IngenicoTags = _interopRequireDefault(require("../ingenico-emv/IngenicoTags"));

var _DeviceProviders = _interopRequireDefault(require("../paymentDevice/DeviceProviders"));

var _sdkErrors = require("./sdkErrors");

var _TransactionBeginOptions = require("../transaction/TransactionBeginOptions");

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context29;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty2(_context29 = Object.prototype.toString.call(o)).call(_context29, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var $$ = function $$(a) {
  return a === undefined || a === null ? null : new _bignumber["default"](a);
};

var mockServer = {
  url: 'http://localhost:12326',
  host: 'localhost',
  env: 'mockserver'
};

var getPlatformType = function getPlatformType() {
  var platform = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'android';
  return {
    ios: 'mobile',
    android: 'mobile',
    windows: 'web',
    osx: 'web'
  }[platform];
};

var Log = (0, _manticoreLog["default"])('sdkUtil');
var DEVICE_ID_KEY = 'PphSdkDeviceId';
module.exports.StorageType = _pphSdkEnums.StorageType;
module.exports.MockServer = mockServer;

function getHost(env) {
  if (!env || env === 'live') {
    return 'https://api-m.paypal.com';
  }

  if (env === 'sandbox') {
    return 'https://api-m.sandbox.paypal.com';
  }

  if (env !== null && env !== void 0 && (0, _startsWith["default"])(env).call(env, 'stage')) {
    return "https://www.".concat(env, ".stage.paypal.com:12326");
  }

  if (env === mockServer.env) {
    return mockServer.url;
  }
  /* In case the env has been set to anything else, we will try to create a full base host
   * with the assumption of this being a apimocker IP.
   * TODO we cannot pass the entire url PayPalREST.fromToken brakes due the "/" in the url
   */


  return "http://".concat(env, ":12326");
}

function asBigNumber(value) {
  return $$(value);
}

function getEnumName(obj, val) {
  for (var prop in obj) {
    if ({}.hasOwnProperty.call(obj, prop)) {
      if (obj[prop] === val) {
        return prop;
      }
    }
  }

  return val;
}

function isTxCancelled(error) {
  var _context;

  return (0, _some["default"])(_context = [_retailPaymentDevice.deviceError.paymentCancelled, _sdkErrors.transaction.customerCancel, _retailPaymentDevice.deviceError.deviceNotConnected]).call(_context, function (cancellationError) {
    return cancellationError.equals(error);
  });
}

function isNetworkOffline(error) {
  var _context2;

  return (0, _some["default"])(_context2 = [_sdkErrors.network.networkOffline, _sdkErrors.network.sslHandshakeFailed, _paypalrestManticore.restError.networkOffline, _paypalrestManticore.restError.untrustedNetwork]).call(_context2, function (_payPalError) {
    return _payPalError.equals(error);
  });
}

function getPaymentSubstitutions() {
  return {
    transactionCompleteType: (0, _l10n["default"])('Paid'),
    transactionType: (0, _l10n["default"])('Payment')
  };
}

function getRefundSubstitutions() {
  return {
    transactionCompleteType: (0, _l10n["default"])('Refunded'),
    transactionType: (0, _l10n["default"])('Refund')
  };
}

function getTransactionTypeSubstitutions(context) {
  return context.isRefund() ? getRefundSubstitutions() : getPaymentSubstitutions();
}

function isHardDeclined(error) {
  var _context3, _context4;

  return (0, _includes["default"])(_context3 = (0, _toConsumableArray2["default"])(_sdkErrors.hardDecline)).call(_context3, error === null || error === void 0 ? void 0 : error.code) || (0, _some["default"])(_context4 = [_retailPaymentDevice.deviceError.contactIssuer, _sdkErrors.transaction.declinedQRC]).call(_context4, function (_hardDeclinedErr) {
    return _hardDeclinedErr.equals(error);
  });
}

var getErrorMessages = function getErrorMessages(context) {
  return [{
    paymentErrorHandlerMsg: _sdkErrors.PaymentErrorHandlerErrors.cancelled,
    rcptMsg: (0, _l10n["default"])('Tx.CancelledByUser', getTransactionTypeSubstitutions(context)),
    offlineDeclineFlowMsg: (0, _l10n["default"])('cancelled...', ''),
    equals: isTxCancelled
  }, {
    paymentErrorHandlerMsg: _sdkErrors.PaymentErrorHandlerErrors.networkOffline,
    rcptMsg: (0, _l10n["default"])('Tx.TransactionErrorDueToNetwork', getTransactionTypeSubstitutions(context)),
    offlineDeclineFlowMsg: (0, _l10n["default"])('network error...', ''),
    equals: isNetworkOffline
  }, {
    paymentErrorHandlerMsg: _sdkErrors.PaymentErrorHandlerErrors.declined,
    rcptMsg: (0, _l10n["default"])('Tx.TransactionDeclined', getTransactionTypeSubstitutions(context)),
    offlineDeclineFlowMsg: (0, _l10n["default"])('declined...', ''),
    equals: isHardDeclined
  }, {
    paymentErrorHandlerMsg: _sdkErrors.PaymentErrorHandlerErrors.failed,
    rcptMsg: (0, _l10n["default"])('Tx.TransactionFailed', getTransactionTypeSubstitutions(context)),
    offlineDeclineFlowMsg: (0, _l10n["default"])('failed...', ''),
    equals: function equals(error) {
      return !!error;
    }
  }];
};

function getMsgsByError(context, error) {
  var _context5;

  return (0, _find["default"])(_context5 = getErrorMessages(context)).call(_context5, function (message) {
    return message.equals(error);
  });
}

function _getReadyMessageIdForFF(ff) {
  if (ff.has(_retailPaymentDevice.FormFactor.MagneticCardSwipe) && ff.has(_retailPaymentDevice.FormFactor.Chip)) {
    return {
      id: _retailPaymentDevice.PaymentDevice.Message.ReadyForInsertAndSwipePayment
    };
  }

  if (ff.has(_retailPaymentDevice.FormFactor.MagneticCardSwipe)) {
    return {
      id: _retailPaymentDevice.PaymentDevice.Message.ReadyForSwipePayment
    };
  }

  if (ff.has(_retailPaymentDevice.FormFactor.Chip)) {
    return {
      id: _retailPaymentDevice.PaymentDevice.Message.ReadyForInsertPayment
    };
  }

  return undefined;
}

function getDeviceErrorWithId(device) {
  var shouldUpdateImageForFF = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  var approvedFormFactors = arguments.length > 2 ? arguments[2] : undefined;
  var deviceStatus = device.isReadyForTransaction();
  var opt = {
    id: _retailPaymentDevice.PaymentDevice.Message.ReadyWithId,
    displaySystemIcons: true,
    substitutions: {
      id: device.id
    }
  };

  if (!deviceStatus.isReady) {
    Log.warn('SelectedDeviceFailedAvailabilityCheck', {
      crId: device.id,
      err: deviceStatus.error
    });

    if (deviceStatus.error === _retailPaymentDevice.deviceError.lowOnBattery) {
      return {
        error: _retailPaymentDevice.deviceError.lowOnBattery,
        opt: {
          id: _retailPaymentDevice.PaymentDevice.Message.RechargeNow
        }
      };
    }

    if (deviceStatus.error === _retailPaymentDevice.deviceError.swUpdatePending) {
      return {
        error: _retailPaymentDevice.deviceError.swUpdatePending,
        opt: {
          id: _retailPaymentDevice.PaymentDevice.Message.SoftwareUpdateRequired,
          substitutions: {
            id: device.id
          }
        }
      };
    }

    if (deviceStatus.error === _retailPaymentDevice.deviceError.blacklisted) {
      return {
        error: _retailPaymentDevice.deviceError.blacklisted,
        opt: {
          id: _retailPaymentDevice.PaymentDevice.Message.Blacklisted
        }
      };
    }

    return {
      error: deviceStatus.error,
      opt: {
        id: _retailPaymentDevice.PaymentDevice.Message.NotReady
      }
    };
  }

  if (shouldUpdateImageForFF) {
    return {
      error: undefined,
      opt: _getReadyMessageIdForFF(approvedFormFactors || device.getSetOfActiveFormFactors()) || opt
    };
  }

  return {
    error: undefined,
    opt: opt
  };
}

function getDeviceModelName(readerModel) {
  if (readerModel === _retailPaymentDevice.ReaderModel.M003) {
    return 'M000';
  }

  var modelName = (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.ReaderModel, readerModel);
  return modelName ? modelName.toUpperCase() : '';
}

function getReaderSpecificTags(readerManufacturer) {
  switch (readerManufacturer) {
    case _retailPaymentDevice.deviceManufacturer.miura:
      return [_miuraEmv.MiuraTags.MiuraMaskedTrack2, _miuraEmv.MiuraTags.MiuraMaskedTrack1, _miuraEmv.MiuraTags.MiuraMaskedTrack3];

    case _retailPaymentDevice.deviceManufacturer.ingenico:
      return [_IngenicoTags["default"].MaskedTrack2, _IngenicoTags["default"].MaskedTrack1];

    /*
     * The Dual Band Audio Readers are currently generating only track 1 data. The following tag is being commented
     * so that if there is a reader out there which generates track 2 data, this "cleaning" doesn't corrupt the
     * track information and cause legitimate transactions to fail.
     */
    // case deviceManufacturer.roam:
    //   tags.push(['\\$29', '\\$', false, '                            ']);
    //   break;

    default:
      return [];
  }
}

function getClearText(tag, trackData) {
  var _context6;

  var tlv = (0, _find["default"])(_context6 = new _tlvlib.TlvList(Buffer.from(trackData, 'hex'))).call(_context6, tag);
  return tlv ? tlv.toBytes().toString('hex') : '';
}

function getExpiryDate(cardReaderManufacturer, trackData) {
  var expiryDate = (0, _moment["default"])({
    year: 1970,
    month: 0
  });

  if ((0, _isNil["default"])(cardReaderManufacturer) || !trackData) {
    Log.debug('Unable to extract date because passed info was incorrect');
    return expiryDate;
  }

  var tags = getReaderSpecificTags(cardReaderManufacturer);

  if (tags.length === 0) {
    Log.debug('Unable to extract date because tags were not found');
    return expiryDate;
  }

  var match = getClearText(tags[0], trackData);

  if (match === '') {
    Log.debug('Unable to extract date because tags could not be matched');
    return expiryDate;
  }

  var ascii = Buffer.from(match, 'hex').toString('ascii');
  var indexOfEqualTo = (0, _indexOf["default"])(ascii).call(ascii, '=');

  if (indexOfEqualTo === -1) {
    Log.debug('Unable to extract date because = is not there in clear text');
    return expiryDate;
  }

  var yymm = ascii.substr(indexOfEqualTo + 1, 4);
  return (0, _moment["default"])({
    year: (0, _moment["default"])().format('YYYY').substr(0, 2) + yymm.substr(0, 2),
    month: (0, _parseInt2["default"])(yymm.substr(2, 2), 10) - 1 // moment months are 0 indexed

  });
}

function cleanTrackData(cardReaderManufacturer, trackData) {
  if ((0, _isNil["default"])(cardReaderManufacturer) || !trackData) {
    return trackData;
  }

  var tags = getReaderSpecificTags(cardReaderManufacturer);
  return (0, _reduce["default"])(tags).call(tags, function (acc, tag) {
    return acc.replace(getClearText(tag, acc), '');
  }, trackData);
}

function hereAPICardDataFromCard(card) {
  var logCardDataInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  var cardData = {
    reader: {
      vendor: _DeviceProviders["default"].getManufacturerName(card.reader.manufacturer).toUpperCase(),
      readerSerialNumber: card.reader.serialNumber,
      deviceModel: getDeviceModelName(card.reader.model)
    }
  };

  if (card.formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
    cardData.reader.keySerialNumber = card.ksn;
    cardData.inputType = card.isMSRFallbackAllowed ? 'fallback_swipe' : 'swipe';
    /*
     * The track 1 is not being cleaned right now because removing the readable information results in
     * Issuer initiated transaction decline.
     */

    cardData.track1 = card.track1; // Generated by audio readers/roam

    cardData.track2 = cleanTrackData(cardData.reader.vendor, card.track2); // Generated by Miura & Ingenico

    cardData.track3 = card.track3;
  } else if (card.formFactor === _retailPaymentDevice.FormFactor.ManualCardEntry) {
    cardData.inputType = 'keyIn';
    cardData.emvData = card.emvData;

    if (card.expiration && card.expiration.length > 2) {
      cardData.expirationMonth = card.expiration.substring(2);
      cardData.expirationYear = (0, _parseInt2["default"])(card.expiration.substring(0, 2), 10) + 2000;
    }

    cardData.cvv = card.cvv;
  } else if (card.formFactor === _retailPaymentDevice.FormFactor.Chip) {
    cardData.inputType = 'chip';
    cardData.emvData = card.emvData.apdu.data.toString('hex');
  } else if (card.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless) {
    cardData.inputType = card.isContactlessMSD ? 'contactless_msd' : 'contactless_chip';
    cardData.emvData = card.emvData.apdu.data.toString('hex');
  } else {
    throw new Error("Cannot generate HereAPI card data from ".concat(card));
  }

  if (logCardDataInfo) {
    var _cardData$emvData, _card$emvData, _cardData$track, _cardData$track2, _card$track, _cardData$track3;

    Log.track('CardDataResponseInfo', {
      requestEmvHexLength: (_cardData$emvData = cardData.emvData) === null || _cardData$emvData === void 0 ? void 0 : _cardData$emvData.length,
      readerResponseLength: (_card$emvData = card.emvData) === null || _card$emvData === void 0 ? void 0 : _card$emvData.length,
      emvResponseInfo: card.emvResponseInfo,
      t1: (_cardData$track = cardData.track1) === null || _cardData$track === void 0 ? void 0 : _cardData$track.length,
      t2clean: (_cardData$track2 = cardData.track2) === null || _cardData$track2 === void 0 ? void 0 : _cardData$track2.length,
      t2original: (_card$track = card.track2) === null || _card$track === void 0 ? void 0 : _card$track.length,
      t3: (_cardData$track3 = cardData.track3) === null || _cardData$track3 === void 0 ? void 0 : _cardData$track3.length,
      formFactor: card.formFactor
    });
  }

  return cardData;
}

function hereVaultAPICardDataFromCard(card) {
  var cardData = {
    card_reader: {
      brand: 'PAYPAL',
      // TODO: how do we know if it is OEM or PAYPAL?
      manufacturer: _DeviceProviders["default"].getManufacturerName(card.reader.manufacturer).toUpperCase(),
      serial_number: card.reader.serialNumber,
      device_model: getDeviceModelName(card.reader.model)
    }
  };

  if (card.formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
    cardData.crypto_data = {
      ksn: card.ksn
    };
    cardData.card_data = {
      mag_stripe: {
        track1: card.track1,
        // Generated by audio readers/roam
        track2: cleanTrackData(cardData.card_reader.manufacturer, card.track2),
        // Generated by Miura & Ingenico
        track3: card.track3
      },
      input_method: card.inputMethod
    };
  } else if (card.formFactor === _retailPaymentDevice.FormFactor.Chip) {
    cardData.card_data = {
      chip_pin: {
        emv_data: card.emvData.apdu.data.toString('hex')
      },
      input_method: card.inputMethod
    };
  } else if (card.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless) {
    cardData.card_data = {
      chip_pin: {
        emv_data: card.emvData.apdu.data.toString('hex')
      },
      input_method: card.inputMethod
    };
  } else if (card.formFactor === _retailPaymentDevice.FormFactor.ManualCardEntry) {
    var expiration = card.getExpiration() || ''; // in format MMYYYY

    cardData.card_data = {
      visible_card_data: {
        card_number: card.getCardNumber(),
        expire_month: expiration.substr(0, 2),
        expire_year: expiration.substr(2, 4),
        cvv2: card.getCVV()
      },
      input_method: card.inputMethod
    };
  } else {
    throw new Error("Cannot generate HereAPI card data from ".concat(card));
  }

  return cardData;
}

function getErrorName(error) {
  var getErrName = function getErrName(obj) {
    return _lodash["default"].findKey(obj, function (item) {
      return item.code === error.code;
    }) || 'None';
  };

  switch (error.domain) {
    case _sdkErrors.domain.transaction:
      return getErrName(_sdkErrors.transaction);

    case _sdkErrors.domain.merchant:
      return getErrName(_sdkErrors.merchant);

    case _sdkErrors.domain.retail:
      return getErrName(_sdkErrors.retail);

    case _sdkErrors.domain.sdk:
      return getErrName(_sdkErrors.sdk);

    case _sdkErrors.domain.network:
      return getErrName(_sdkErrors.network);

    case _retailPaymentDevice.deviceErrorDomain:
      return getErrName(_retailPaymentDevice.deviceError);

    default:
      return 'None';
  }
}

function getPartnerData(Merchant) {
  var _Merchant$active, _Merchant$active2, _Merchant$active3, _Merchant$active4, _Merchant$active5, _Merchant$active6, _Merchant$sdkEnvironm, _Merchant$sdkEnvironm2, _Merchant$active7;

  var initWithDataVal = (_Merchant$active = Merchant.active) !== null && _Merchant$active !== void 0 && _Merchant$active.initWithData ? 'SMB' : 'NOREF';
  var partnerType = (_Merchant$active2 = Merchant.active) !== null && _Merchant$active2 !== void 0 && _Merchant$active2.getReferrerCode() ? 'MM' : initWithDataVal;
  var isSideloader = ((_Merchant$active3 = Merchant.active) === null || _Merchant$active3 === void 0 ? void 0 : _Merchant$active3.initWithData) && Merchant.active.getReferrerCode();
  var partnerId = ((_Merchant$active4 = Merchant.active) === null || _Merchant$active4 === void 0 ? void 0 : _Merchant$active4.getReferrerCode()) || 'NA';
  var softDescriptor = ((_Merchant$active5 = Merchant.active) === null || _Merchant$active5 === void 0 ? void 0 : _Merchant$active5.softDescriptor) || 'NA';
  var storeId = ((_Merchant$active6 = Merchant.active) === null || _Merchant$active6 === void 0 ? void 0 : _Merchant$active6.storeId) || 'NA';

  var getFirmwareClientTypeForMobile = function getFirmwareClientTypeForMobile(appInit) {
    return appInit ? 'app' : 'sdk';
  };

  var firmwareImageClientType = getPlatformType(Merchant === null || Merchant === void 0 ? void 0 : (_Merchant$sdkEnvironm = Merchant.sdkEnvironment) === null || _Merchant$sdkEnvironm === void 0 ? void 0 : (_Merchant$sdkEnvironm2 = _Merchant$sdkEnvironm.osName) === null || _Merchant$sdkEnvironm2 === void 0 ? void 0 : _Merchant$sdkEnvironm2.toLowerCase()) === 'mobile' ? getFirmwareClientTypeForMobile((_Merchant$active7 = Merchant.active) === null || _Merchant$active7 === void 0 ? void 0 : _Merchant$active7.initWithData) : 'websdk';
  return {
    partnerType: partnerType,
    isSideloader: isSideloader,
    partnerId: partnerId,
    softDescriptor: softDescriptor,
    storeId: storeId,
    firmwareImageClientType: firmwareImageClientType
  };
}

function getSdkEnvironmentData(Merchant) {
  var _Merchant$sdkEnvironm3, _Merchant$sdkEnvironm4, _Merchant$sdkEnvironm5, _Merchant$sdkEnvironm6, _Merchant$sdkEnvironm7, _Merchant$sdkEnvironm8;

  return {
    appId: ((_Merchant$sdkEnvironm3 = Merchant.sdkEnvironment) === null || _Merchant$sdkEnvironm3 === void 0 ? void 0 : _Merchant$sdkEnvironm3.appId) || 'None',
    appVersion: ((_Merchant$sdkEnvironm4 = Merchant.sdkEnvironment) === null || _Merchant$sdkEnvironm4 === void 0 ? void 0 : _Merchant$sdkEnvironm4.appVersion) || 'None',
    appBuild: ((_Merchant$sdkEnvironm5 = Merchant.sdkEnvironment) === null || _Merchant$sdkEnvironm5 === void 0 ? void 0 : _Merchant$sdkEnvironm5.appBuild) || 'None',
    appName: ((_Merchant$sdkEnvironm6 = Merchant.sdkEnvironment) === null || _Merchant$sdkEnvironm6 === void 0 ? void 0 : _Merchant$sdkEnvironm6.appName) || 'None',
    osName: ((_Merchant$sdkEnvironm7 = Merchant.sdkEnvironment) === null || _Merchant$sdkEnvironm7 === void 0 ? void 0 : _Merchant$sdkEnvironm7.osName) || 'None',
    sdkVersion: ((_Merchant$sdkEnvironm8 = Merchant.sdkEnvironment) === null || _Merchant$sdkEnvironm8 === void 0 ? void 0 : _Merchant$sdkEnvironm8.retailSDKVersion) || 'None'
  };
}

function getTxEndData(context) {
  var _context$flow, _context$flow$flow, _context$card;

  var flowData = (context === null || context === void 0 ? void 0 : (_context$flow = context.flow) === null || _context$flow === void 0 ? void 0 : (_context$flow$flow = _context$flow.flow) === null || _context$flow$flow === void 0 ? void 0 : _context$flow$flow.data) || {};
  var card = context !== null && context !== void 0 && (_context$card = context.card) !== null && _context$card !== void 0 && _context$card.reader && (context === null || context === void 0 ? void 0 : context.paymentType) !== _TransactionBeginOptions.PaymentTypes.keyIn ? hereAPICardDataFromCard(context.card) : {};

  var flowDataHasSign = function flowDataHasSign() {
    return (flowData === null || flowData === void 0 ? void 0 : flowData.signature) && (flowData === null || flowData === void 0 ? void 0 : flowData.signature) !== '';
  };

  var flowDataInputType = function flowDataInputType() {
    return (card === null || card === void 0 ? void 0 : card.inputType) || 'None';
  };

  var flowDataInputTypeFormatter = function flowDataInputTypeFormatter() {
    var inputType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'None';
    var inputTypeLowered = inputType.toLowerCase();

    if (inputTypeLowered === 'fallback_swipe') {
      return 'Fallback Swipe';
    }

    if (inputTypeLowered === 'swipe') {
      return 'Swipe';
    }

    if (inputTypeLowered === 'keyin') {
      return 'Key-in';
    }

    if (inputTypeLowered === 'chip') {
      return 'Chip';
    }

    if (inputTypeLowered === 'contactless_msd' || inputTypeLowered === 'contactless_chip') {
      return 'Contactless';
    }

    return 'None';
  };

  var readerType = function readerType() {
    var _card$reader;

    return (card === null || card === void 0 ? void 0 : (_card$reader = card.reader) === null || _card$reader === void 0 ? void 0 : _card$reader.deviceModel) || 'None';
  };

  var readerTypeForLoggly = function readerTypeForLoggly() {
    var _card$reader2, _context$deviceContro, _context$deviceContro2;

    return (card === null || card === void 0 ? void 0 : (_card$reader2 = card.reader) === null || _card$reader2 === void 0 ? void 0 : _card$reader2.deviceModel) || (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.ReaderModel, (_context$deviceContro = context.deviceController) === null || _context$deviceContro === void 0 ? void 0 : (_context$deviceContro2 = _context$deviceContro.selectedDevice) === null || _context$deviceContro2 === void 0 ? void 0 : _context$deviceContro2.model) || 'None';
  };

  var refundType = function refundType() {
    if (context.isRefund()) {
      return flowData.transactionNumber ? 'txNumber' : 'invId';
    }

    return 'None';
  };

  var authSuffix = function authSuffix() {
    var _flowData$tx;

    if (flowData !== null && flowData !== void 0 && (_flowData$tx = flowData.tx) !== null && _flowData$tx !== void 0 && _flowData$tx.captureId && flowData.tx.captureId !== '') {
      return '-Capture';
    }

    if (isTxCancelled(flowData.error)) {
      return '-Void';
    }

    return '';
  };

  var cvm = function cvm() {
    if (context.pinPresent && flowDataHasSign()) {
      return 'Pin-Signature';
    }

    if (context.pinPresent) {
      return 'Pin';
    }

    if (flowDataHasSign()) {
      return 'Signature';
    }

    return 'None';
  };

  var paymentType = function paymentType() {
    switch (context.paymentType) {
      case _TransactionBeginOptions.PaymentTypes.card:
        return flowDataInputTypeFormatter(flowDataInputType());

      case _TransactionBeginOptions.PaymentTypes.cash:
        return 'Cash';

      case _TransactionBeginOptions.PaymentTypes.check:
        return 'Check';

      case _TransactionBeginOptions.PaymentTypes.keyIn:
        return 'Key-in';

      case _TransactionBeginOptions.PaymentTypes.qrc:
        return 'Qrc';

      case _TransactionBeginOptions.PaymentTypes.digitalCard:
        return 'Digital-card';

      default:
        return 'None';
    }
  };

  var transactionType = function transactionType() {
    switch (context.type) {
      case _retailPaymentDevice.TransactionType.Vault:
        return 'Vault';

      case _retailPaymentDevice.TransactionType.Sale:
        return 'Sale';

      case _retailPaymentDevice.TransactionType.Auth:
        return "Auth".concat(authSuffix());

      case _retailPaymentDevice.TransactionType.Refund:
        return 'Refund';

      case _retailPaymentDevice.TransactionType.PartialRefund:
        return 'PartialRefund';

      default:
        return 'None';
    }
  };

  var vaultType = function vaultType() {
    if (context.isTransactionVaultOnly) {
      return 'VaultOnly';
    }

    if (context.isTransactionPayAndVault) {
      return 'PayAndVault';
    }

    return 'None';
  };

  return {
    flowData: flowData,
    readerType: readerType,
    refundType: refundType,
    authSuffix: authSuffix,
    cvm: cvm,
    paymentType: paymentType,
    vaultType: vaultType,
    readerTypeForLoggly: readerTypeForLoggly,
    transactionType: transactionType
  };
}

function isCountryValidForCard(cardIssuer, merchantCountry) {
  var isCountryValid = false;

  _lodash["default"].forOwn(_retailPaymentDevice.CardDataUtil._controlNumber, function (value) {
    if (value.issuer === cardIssuer) {
      isCountryValid = value.country.has(merchantCountry);
    }
  });

  return isCountryValid;
}

function isCardValid(card, merchantCountry) {
  var expiryDate = getExpiryDate(card.reader.manufacturer, card.track2);
  return (card.cardIssuer !== _retailPaymentDevice.CardIssuer.Unknown ? isCountryValidForCard(card.cardIssuer, merchantCountry) : false) && expiryDate.isAfter((0, _moment["default"])());
}

var currencySymbols = {
  USD: '$',
  AUD: '$',
  CAD: '$',
  HKD: '$',
  GBP: '£',
  EUR: '€'
};
exports.currencySymbols = currencySymbols;

function getAmountWithCurrencySymbol(currencyCode, amount) {
  var _context7;

  if (new _bignumber["default"](amount).isEqualTo(0)) {
    return '';
  }

  var symbol = currencySymbols[currencyCode] || '$';

  var formatted = _paypalInvoicing.Currency.round(currencyCode, amount).toFormat(2, _bignumber["default"].ROUND_HALF_UP);

  return (0, _concat["default"])(_context7 = "".concat(symbol)).call(_context7, formatted);
}

function getRandomId() {
  return Math.floor(Math.random() * 10000000000000);
}

function isDatesWithinOffset(startDate, endDate, offsetDays) {
  var momentStartDate = (0, _moment["default"])(startDate);
  var momentEndDate = (0, _moment["default"])(endDate);
  var daysDifference = momentEndDate.diff(momentStartDate, 'days', true);
  return daysDifference >= 0 && daysDifference <= offsetDays;
}

function getCardReaderModel(name) {
  return _DeviceProviders["default"].getReaderModel(name).model;
}

function getCardReaderManufacturer(name) {
  return _DeviceProviders["default"].getProviderByName(name).getReaderManufacturer();
}

function getCardReaderIcon(name) {
  return _DeviceProviders["default"].getProviderByName(name).getReaderIcon();
}

function getCardReaderDescription(name) {
  return _DeviceProviders["default"].getProviderByName(name).getReaderDescription();
}

function isRoamSwiper(name) {
  return getCardReaderModel(name) === _retailPaymentDevice.ReaderModel.Swiper;
}

function getLocationAsync() {
  return _getLocationAsync.apply(this, arguments);
}

function _getLocationAsync() {
  _getLocationAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
    return _regenerator["default"].wrap(function _callee$(_context9) {
      while (1) {
        switch (_context9.prev = _context9.next) {
          case 0:
            return _context9.abrupt("return", (0, _manticoreUtil.callbackToPromise)(_manticore["default"].getLocation));

          case 1:
          case "end":
            return _context9.stop();
        }
      }
    }, _callee);
  }));
  return _getLocationAsync.apply(this, arguments);
}

function saveItemAsync(_x, _x2, _x3) {
  return _saveItemAsync.apply(this, arguments);
}

function _saveItemAsync() {
  _saveItemAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(key, type, data) {
    return _regenerator["default"].wrap(function _callee2$(_context10) {
      while (1) {
        switch (_context10.prev = _context10.next) {
          case 0:
            return _context10.abrupt("return", (0, _manticoreUtil.callbackToPromise)(_manticore["default"].setItem, key, type, data));

          case 1:
          case "end":
            return _context10.stop();
        }
      }
    }, _callee2);
  }));
  return _saveItemAsync.apply(this, arguments);
}

function getItemAsync(_x4, _x5) {
  return _getItemAsync.apply(this, arguments);
}

function _getItemAsync() {
  _getItemAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(key, type) {
    return _regenerator["default"].wrap(function _callee3$(_context11) {
      while (1) {
        switch (_context11.prev = _context11.next) {
          case 0:
            return _context11.abrupt("return", (0, _manticoreUtil.callbackToPromise)(_manticore["default"].getItem, key, type));

          case 1:
          case "end":
            return _context11.stop();
        }
      }
    }, _callee3);
  }));
  return _getItemAsync.apply(this, arguments);
}

function getMerchantStorageKey(key, activeMerchant) {
  var _context8; // Save data with the payerId so that it is specific to the merchant


  var payerId = activeMerchant && activeMerchant.payerId;
  var merchantKey = (0, _concat["default"])(_context8 = "".concat(key)).call(_context8, payerId);
  return merchantKey;
}

function saveOfflineTxnToStorage(_x6) {
  return _saveOfflineTxnToStorage.apply(this, arguments);
}

function _saveOfflineTxnToStorage() {
  _saveOfflineTxnToStorage = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(mtpRq) {
    var data, id, path, _context13;

    return _regenerator["default"].wrap(function _callee4$(_context14) {
      while (1) {
        switch (_context14.prev = _context14.next) {
          case 0:
            data = (0, _stringify["default"])({
              mtpRequest: mtpRq
            });
            Log.debug(function () {
              return "saveOfflineTxnToStorage data: ".concat(data);
            });
            _context14.prev = 2;
            id = "OfflinePayment-".concat(_uuid["default"].v1());
            _context14.next = 6;
            return saveItemAsync(id, _pphSdkEnums.StorageType.SecureBlob, data);

          case 6:
            path = _context14.sent;
            Log.debug(function () {
              var _context12;

              return (0, _concat["default"])(_context12 = "offlineTxn> Successfully saved '".concat(data, "' to ")).call(_context12, path);
            });
            _context14.next = 14;
            break;

          case 10:
            _context14.prev = 10;
            _context14.t0 = _context14["catch"](2);
            Log.error((0, _concat["default"])(_context13 = "offlineTxn> Error saving '".concat(data, "': ")).call(_context13, (0, _stringify["default"])(_context14.t0)));
            throw _context14.t0;

          case 14:
            return _context14.abrupt("return", id);

          case 15:
          case "end":
            return _context14.stop();
        }
      }
    }, _callee4, null, [[2, 10]]);
  }));
  return _saveOfflineTxnToStorage.apply(this, arguments);
}

function getOfflineTxnFromStorage(_x7) {
  return _getOfflineTxnFromStorage.apply(this, arguments);
}
/**
 * Function to get offline payment list from storage. This should be a method in Merchant.
 * @package
 * @param {Merchant} activeMerchant
 * @returns {Promise<[]|PayPalError>} An array of Offline Payment Status JSONs Or a PayPalError object
 */


function _getOfflineTxnFromStorage() {
  _getOfflineTxnFromStorage = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(id) {
    var offlineTxn, data, _context15;

    return _regenerator["default"].wrap(function _callee5$(_context16) {
      while (1) {
        switch (_context16.prev = _context16.next) {
          case 0:
            Log.debug(function () {
              return "getOfflineTxnFromStorage id: ".concat(id);
            });
            offlineTxn = null;
            _context16.prev = 2;
            _context16.next = 5;
            return getItemAsync(id, _pphSdkEnums.StorageType.SecureBlob);

          case 5:
            data = _context16.sent;
            Log.debug(function () {
              return "offlineTxn> data: ".concat((0, _stringify["default"])(data, null, 4));
            });
            offlineTxn = JSON.parse(data);
            Log.debug(function () {
              return "offlineTxn> details: ".concat((0, _stringify["default"])(offlineTxn, null, 4));
            });
            _context16.next = 15;
            break;

          case 11:
            _context16.prev = 11;
            _context16.t0 = _context16["catch"](2);
            Log.warn((0, _concat["default"])(_context15 = "offlineTxn> Unable to retrieve offline txn from storage for id:".concat(id, ". Error: ")).call(_context15, (0, _stringify["default"])(_context16.t0)));
            throw _context16.t0;

          case 15:
            return _context16.abrupt("return", offlineTxn);

          case 16:
          case "end":
            return _context16.stop();
        }
      }
    }, _callee5, null, [[2, 11]]);
  }));
  return _getOfflineTxnFromStorage.apply(this, arguments);
}

function getOfflinePaymentListFromStorage(_x8) {
  return _getOfflinePaymentListFromStorage.apply(this, arguments);
}

function _getOfflinePaymentListFromStorage() {
  _getOfflinePaymentListFromStorage = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(activeMerchant) {
    var data, list;
    return _regenerator["default"].wrap(function _callee6$(_context17) {
      while (1) {
        switch (_context17.prev = _context17.next) {
          case 0:
            _context17.prev = 0;
            _context17.next = 3;
            return getItemAsync(getMerchantStorageKey('OfflinePaymentList', activeMerchant), _pphSdkEnums.StorageType.SecureBlob);

          case 3:
            data = _context17.sent;
            list = JSON.parse(data) || [];
            Log.debug(function () {
              return "offlinePaymentList> details: ".concat((0, _stringify["default"])(list, null, 4));
            });
            return _context17.abrupt("return", list);

          case 9:
            _context17.prev = 9;
            _context17.t0 = _context17["catch"](0);
            Log.warn('Unable to retrieve offlinePaymentList from storage', {
              key: 'OfflinePaymentList',
              error: _context17.t0
            });

            if (!_sdkErrors.sdk.fileNotFound.equals(_context17.t0)) {
              _context17.next = 14;
              break;
            }

            return _context17.abrupt("return", []);

          case 14:
            throw _context17.t0;

          case 15:
          case "end":
            return _context17.stop();
        }
      }
    }, _callee6, null, [[0, 9]]);
  }));
  return _getOfflinePaymentListFromStorage.apply(this, arguments);
}

function getOfflineMerchantFromStorage() {
  return _getOfflineMerchantFromStorage.apply(this, arguments);
}

function _getOfflineMerchantFromStorage() {
  _getOfflineMerchantFromStorage = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
    var offlineMerchant, data;
    return _regenerator["default"].wrap(function _callee7$(_context18) {
      while (1) {
        switch (_context18.prev = _context18.next) {
          case 0:
            offlineMerchant = null;
            _context18.prev = 1;
            _context18.next = 4;
            return getItemAsync('OfflineMerchant', _pphSdkEnums.StorageType.SecureBlob);

          case 4:
            data = _context18.sent;
            offlineMerchant = JSON.parse(data);
            Log.debug(function () {
              return "offlineMerchant> details: ".concat((0, _stringify["default"])(offlineMerchant, null, 4));
            });
            _context18.next = 13;
            break;

          case 9:
            _context18.prev = 9;
            _context18.t0 = _context18["catch"](1);
            Log.warn("offlineUserInfo> Unable to retrieve offlineMerchant from storage. Key: OfflineMerchant. Error: ".concat((0, _stringify["default"])(_context18.t0)));
            throw _context18.t0;

          case 13:
            return _context18.abrupt("return", offlineMerchant);

          case 14:
          case "end":
            return _context18.stop();
        }
      }
    }, _callee7, null, [[1, 9]]);
  }));
  return _getOfflineMerchantFromStorage.apply(this, arguments);
}

function saveOfflinePaymentInfoToListStorage(_x9, _x10) {
  return _saveOfflinePaymentInfoToListStorage.apply(this, arguments);
}

function _saveOfflinePaymentInfoToListStorage() {
  _saveOfflinePaymentInfoToListStorage = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(statusInfo, activeMerchant) {
    var list, _context19, _context20, path, _context22, _context23;

    return _regenerator["default"].wrap(function _callee8$(_context24) {
      while (1) {
        switch (_context24.prev = _context24.next) {
          case 0:
            Log.debug(function () {
              return "saveOfflinePaymentInfoToListStorage statusInfo: ".concat(statusInfo);
            });
            list = [];
            _context24.prev = 2;
            _context24.next = 5;
            return getOfflinePaymentListFromStorage(activeMerchant);

          case 5:
            list = _context24.sent;
            _context24.next = 11;
            break;

          case 8:
            _context24.prev = 8;
            _context24.t0 = _context24["catch"](2);
            Log.error((0, _concat["default"])(_context19 = (0, _concat["default"])(_context20 = "offlinePaymentInfo> First-time saving for  '".concat(statusInfo.id, " - ")).call(_context20, statusInfo.amount, "': ")).call(_context19, (0, _stringify["default"])(_context24.t0)));

          case 11:
            list.push(statusInfo);
            Log.debug(function () {
              return "offlinePaymentInfo> list: ".concat((0, _stringify["default"])(list));
            });
            _context24.prev = 13;
            _context24.next = 16;
            return saveItemAsync(getMerchantStorageKey('OfflinePaymentList', activeMerchant), _pphSdkEnums.StorageType.SecureBlob, (0, _stringify["default"])(list));

          case 16:
            path = _context24.sent;
            Log.debug(function () {
              var _context21;

              return (0, _concat["default"])(_context21 = "offlinePaymentInfo> Successfully saved '".concat(statusInfo.id, "' to ")).call(_context21, path);
            });
            _context24.next = 24;
            break;

          case 20:
            _context24.prev = 20;
            _context24.t1 = _context24["catch"](13);
            Log.error((0, _concat["default"])(_context22 = (0, _concat["default"])(_context23 = "offlinePaymentInfo> Error saving '".concat(statusInfo.id, " - ")).call(_context23, statusInfo.amount, "': ")).call(_context22, (0, _stringify["default"])(_context24.t1)));
            throw _context24.t1;

          case 24:
          case "end":
            return _context24.stop();
        }
      }
    }, _callee8, null, [[2, 8], [13, 20]]);
  }));
  return _saveOfflinePaymentInfoToListStorage.apply(this, arguments);
}

function saveOfflinePaymentListToStorage(_x11, _x12) {
  return _saveOfflinePaymentListToStorage.apply(this, arguments);
}

function _saveOfflinePaymentListToStorage() {
  _saveOfflinePaymentListToStorage = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(list, activeMerchant) {
    var path;
    return _regenerator["default"].wrap(function _callee9$(_context25) {
      while (1) {
        switch (_context25.prev = _context25.next) {
          case 0:
            Log.debug(function () {
              return "saveOfflinePaymentListToStorage data: ".concat((0, _stringify["default"])(list, null, 2));
            });
            _context25.prev = 1;
            _context25.next = 4;
            return saveItemAsync(getMerchantStorageKey('OfflinePaymentList', activeMerchant), _pphSdkEnums.StorageType.SecureBlob, (0, _stringify["default"])(list));

          case 4:
            path = _context25.sent;
            Log.debug(function () {
              return "offlinePaymentList> Successfully saved to ".concat(path);
            });
            _context25.next = 12;
            break;

          case 8:
            _context25.prev = 8;
            _context25.t0 = _context25["catch"](1);
            Log.error("offlinePaymentList> Error saving list: ".concat(_context25.t0));
            throw _context25.t0;

          case 12:
          case "end":
            return _context25.stop();
        }
      }
    }, _callee9, null, [[1, 8]]);
  }));
  return _saveOfflinePaymentListToStorage.apply(this, arguments);
}

function saveOfflineMerchant(_x13) {
  return _saveOfflineMerchant.apply(this, arguments);
}

function _saveOfflineMerchant() {
  _saveOfflineMerchant = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(offlineMerchant) {
    var path;
    return _regenerator["default"].wrap(function _callee10$(_context26) {
      while (1) {
        switch (_context26.prev = _context26.next) {
          case 0:
            Log.debug(function () {
              return "saveOfflineMerchant data: ".concat((0, _stringify["default"])(offlineMerchant, null, 2));
            });
            _context26.prev = 1;
            _context26.next = 4;
            return saveItemAsync('OfflineMerchant', _pphSdkEnums.StorageType.SecureBlob, (0, _stringify["default"])(offlineMerchant));

          case 4:
            path = _context26.sent;
            Log.debug(function () {
              return "offlineMerchant> Successfully saved to ".concat(path);
            });
            _context26.next = 12;
            break;

          case 8:
            _context26.prev = 8;
            _context26.t0 = _context26["catch"](1);
            Log.error("offlineMerchant> Error saving info: ".concat(_context26.t0));
            throw _context26.t0;

          case 12:
          case "end":
            return _context26.stop();
        }
      }
    }, _callee10, null, [[1, 8]]);
  }));
  return _saveOfflineMerchant.apply(this, arguments);
}

function generatePphDeviceId() {
  return _generatePphDeviceId.apply(this, arguments);
}

function _generatePphDeviceId() {
  _generatePphDeviceId = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
    var pphSdkDeviceId, path;
    return _regenerator["default"].wrap(function _callee11$(_context27) {
      while (1) {
        switch (_context27.prev = _context27.next) {
          case 0:
            pphSdkDeviceId = _uuid["default"].v1();
            _context27.prev = 1;
            _context27.next = 4;
            return saveItemAsync(DEVICE_ID_KEY, _pphSdkEnums.StorageType.SecureBlob, pphSdkDeviceId);

          case 4:
            path = _context27.sent;
            Log.debug('pphSdkDeviceId successfully saved', function () {
              return {
                path: path
              };
            });
            _context27.next = 12;
            break;

          case 8:
            _context27.prev = 8;
            _context27.t0 = _context27["catch"](1);
            pphSdkDeviceId = 'NA';
            Log.error('Error saving pphSdkDeviceId', {
              error: _context27.t0
            });

          case 12:
            return _context27.abrupt("return", pphSdkDeviceId);

          case 13:
          case "end":
            return _context27.stop();
        }
      }
    }, _callee11, null, [[1, 8]]);
  }));
  return _generatePphDeviceId.apply(this, arguments);
}

function getPphDeviceIdFromStorage() {
  return _getPphDeviceIdFromStorage.apply(this, arguments);
}

function _getPphDeviceIdFromStorage() {
  _getPphDeviceIdFromStorage = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
    var pphSdkDeviceId;
    return _regenerator["default"].wrap(function _callee12$(_context28) {
      while (1) {
        switch (_context28.prev = _context28.next) {
          case 0:
            pphSdkDeviceId = null;
            _context28.prev = 1;
            _context28.next = 4;
            return getItemAsync(DEVICE_ID_KEY, _pphSdkEnums.StorageType.SecureBlob);

          case 4:
            pphSdkDeviceId = _context28.sent;
            Log.debug('pphSdkDeviceId', function () {
              return {
                pphSdkDeviceId: pphSdkDeviceId
              };
            });
            _context28.next = 14;
            break;

          case 8:
            _context28.prev = 8;
            _context28.t0 = _context28["catch"](1);
            _context28.next = 12;
            return generatePphDeviceId();

          case 12:
            pphSdkDeviceId = _context28.sent;
            Log.info('Unable to retrieve PphSdkDeviceId from storage.', {
              error: _context28.t0,
              pphSdkDeviceId: pphSdkDeviceId
            });

          case 14:
            return _context28.abrupt("return", pphSdkDeviceId);

          case 15:
          case "end":
            return _context28.stop();
        }
      }
    }, _callee12, null, [[1, 8]]);
  }));
  return _getPphDeviceIdFromStorage.apply(this, arguments);
}

function toJson(obj) {
  var camelCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;

  if (camelCase) {
    return (0, _manticoreUtil.keysToCamel)((0, _manticoreUtil.deepToJSON)(obj));
  }

  return (0, _manticoreUtil.deepToJSON)(obj);
}

function convertToRetailInvoice(invoice) {
  // Note that we have an invoice from `invoicing/invoices` (snake_case)
  // but we need to convert it to the format that `retail/checkouts` is using
  // which is from `retail/invoices` format (camelCase)
  Log.debug('convertToRetailInvoice-> invoice: ', invoice);

  try {
    var _newInv$merchantInfo, _newInv$items$, _newInv$items$$unitPr, _newInv$merchantInfo2, _newInv$merchantInfo3, _newInv$merchantInfo4, _newInv$merchantInfo5, _newInv$merchantInfo6, _newInv$merchantInfo7, _newInv$merchantInfo8, _newInv$merchantInfo9, _newInv$gratuity, _newInv$gratuity2, _invoice$billingInfo$;

    var newInv = toJson(invoice.toJSON());
    Log.debug('convertToRetailInvoice-> newInv: ', newInv);
    var retailInvoice = {
      invoiceID: newInv.id,
      merchantEmail: (_newInv$merchantInfo = newInv.merchantInfo) === null || _newInv$merchantInfo === void 0 ? void 0 : _newInv$merchantInfo.email,
      currencyCode: (_newInv$items$ = newInv.items[0]) === null || _newInv$items$ === void 0 ? void 0 : (_newInv$items$$unitPr = _newInv$items$.unitPrice) === null || _newInv$items$$unitPr === void 0 ? void 0 : _newInv$items$$unitPr.currency,
      number: newInv.number,
      merchantInfo: {
        website: (_newInv$merchantInfo2 = newInv.merchantInfo) === null || _newInv$merchantInfo2 === void 0 ? void 0 : _newInv$merchantInfo2.website,
        businessName: (_newInv$merchantInfo3 = newInv.merchantInfo) === null || _newInv$merchantInfo3 === void 0 ? void 0 : _newInv$merchantInfo3.businessName,
        address: {
          line1: (_newInv$merchantInfo4 = newInv.merchantInfo) === null || _newInv$merchantInfo4 === void 0 ? void 0 : _newInv$merchantInfo4.address.line1,
          line2: (_newInv$merchantInfo5 = newInv.merchantInfo) === null || _newInv$merchantInfo5 === void 0 ? void 0 : _newInv$merchantInfo5.address.line2,
          city: (_newInv$merchantInfo6 = newInv.merchantInfo) === null || _newInv$merchantInfo6 === void 0 ? void 0 : _newInv$merchantInfo6.address.city,
          state: (_newInv$merchantInfo7 = newInv.merchantInfo) === null || _newInv$merchantInfo7 === void 0 ? void 0 : _newInv$merchantInfo7.address.state,
          postalCode: (_newInv$merchantInfo8 = newInv.merchantInfo) === null || _newInv$merchantInfo8 === void 0 ? void 0 : _newInv$merchantInfo8.address.postalCode,
          country: (_newInv$merchantInfo9 = newInv.merchantInfo) === null || _newInv$merchantInfo9 === void 0 ? void 0 : _newInv$merchantInfo9.address.countryCode
        }
      },
      billingInfo: newInv.billingInfo[0],
      taxCalculatedAfterDiscount: newInv.taxCalculatedAfterDiscount,
      taxInclusive: newInv.taxInclusive,
      items: [],
      discountPercent: invoice.discountPercentage ? Number(invoice.discountPercentage) : undefined,
      discountAmount: invoice.discountAmount ? Number(invoice.discountAmount) : undefined,
      gratuityAmount: (_newInv$gratuity = newInv.gratuity) !== null && _newInv$gratuity !== void 0 && _newInv$gratuity.value ? Number((_newInv$gratuity2 = newInv.gratuity) === null || _newInv$gratuity2 === void 0 ? void 0 : _newInv$gratuity2.value) : undefined,
      total: Number(invoice.total),
      payerEmail: (_invoice$billingInfo$ = invoice.billingInfo[0]) === null || _invoice$billingInfo$ === void 0 ? void 0 : _invoice$billingInfo$.email
    };
    Log.debug('convertToRetailInvoice-> retailInvoice: ', retailInvoice);

    var _iterator = _createForOfIteratorHelper(newInv.items),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var _item$unitPrice, _item$unitPrice2, _item$tax, _item$tax2, _item$tax3;

        var item = _step.value;
        retailInvoice.items.push({
          name: item.name,
          quantity: item.quantity,
          unitPrice: (_item$unitPrice = item.unitPrice) !== null && _item$unitPrice !== void 0 && _item$unitPrice.value ? Number((_item$unitPrice2 = item.unitPrice) === null || _item$unitPrice2 === void 0 ? void 0 : _item$unitPrice2.value) : undefined,
          discountAmount: item.discount ? Number(item.discount) : undefined,
          taxRate: (_item$tax = item.tax) !== null && _item$tax !== void 0 && _item$tax.percent ? Number((_item$tax2 = item.tax) === null || _item$tax2 === void 0 ? void 0 : _item$tax2.percent) : undefined,
          taxName: (_item$tax3 = item.tax) === null || _item$tax3 === void 0 ? void 0 : _item$tax3.name,
          description: item.description
        });
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }

    retailInvoice.invoiceDate = (0, _moment["default"])().format();
    Log.debug('convertToRetailInvoice -> retailInvoice: ', retailInvoice);
    return retailInvoice;
  } catch (e) {
    Log.error('convertToRetailInvoice -> error: ', e);
    throw e;
  }
}

function chunk(array, size) {
  var chunkedArr = [];
  var index = 0;

  while (index < array.length) {
    chunkedArr.push((0, _slice["default"])(array).call(array, index, size + index));
    index += size;
  }

  return chunkedArr;
}
/**
 * The merge method takes source, target and mapper objects
 * Based on mapper, it does add properties to the target from the source
 * Note that the attribute name of source and target may be different based on the key-value in the mapper
 */


function merge(source, target, mapper) {
  for (var _i = 0, _Object$entries = (0, _entries["default"])(mapper); _i < _Object$entries.length; _i++) {
    var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
        key = _Object$entries$_i[0],
        value = _Object$entries$_i[1];

    target[value] = source[key];
  }
}

}).call(this)}).call(this,require("buffer").Buffer)
},{"../ingenico-emv/IngenicoTags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/IngenicoTags.js","../paymentDevice/DeviceProviders":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceProviders.js","../transaction/TransactionBeginOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionBeginOptions.js","./l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","./sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js","@babel/runtime-corejs3/core-js-stable/instance/starts-with":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/starts-with.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/entries":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/entries.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/miura-emv":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/paypalrest-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/index.js","@paypalcorp/pph-sdk-enums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","bignumber.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/bignumber.js/bignumber.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.replace.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","core-js/modules/es.symbol.description.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.description.js","core-js/modules/es.symbol.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js","ramda/src/isNil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isNil.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js","uuid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/saveReader.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.getLastActiveReader = getLastActiveReader;
exports.saveLastActiveReader = saveLastActiveReader;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _pphSdkEnums = require("@paypalcorp/pph-sdk-enums");

var _manticore = _interopRequireDefault(require("manticore"));

var Log = (0, _manticoreLog["default"])('saveCardReader');
var itemKeyActiveReader = 'last-active-card-reader';

function saveLastActiveReader(cardReader) {
  var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
  var data = (0, _stringify["default"])({
    id: cardReader.id,
    address: cardReader.address,
    manufacturer: cardReader.manufacturer,
    connectionType: cardReader.connectionType
  });

  _manticore["default"].setItem(itemKeyActiveReader, _pphSdkEnums.StorageType.SecureBlob, data, function (err, path) {
    if (err) {
      Log.error('lastCRSaveErr', {
        data: data,
        err: err
      });
    } else {
      Log.debug('lastCRSaved', {
        data: data,
        path: path
      });
    }

    cb(cardReader);
  });
}

function getLastActiveReader() {
  var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

  _manticore["default"].getItem(itemKeyActiveReader, _pphSdkEnums.StorageType.SecureBlob, function (err, data) {
    if (err || !data) {
      Log.warn('lastActiveCRRetrievalFailed', {
        err: err
      });
      cb(undefined);
      return;
    }

    Log.debug('lastReader> Found last connected card reader', {
      data: data
    });
    cb(JSON.parse(data));
  });
}

},{"@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/pph-sdk-enums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/index.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.domain = exports.PaymentErrorHandlerErrors = void 0;
exports.getDefaultDevMessage = getDefaultDevMessage;
exports.network = exports.merchant = exports.hardDeclineForOffline = exports.hardDecline = void 0;
exports.payPalError = payPalError;
exports.retail = void 0;
exports.retailErrorFromResponse = retailErrorFromResponse;
exports.transaction = exports.sdk = exports.retryStatuses = void 0;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _manticorePaypalerror = require("@paypalcorp/manticore-paypalerror");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var Log = (0, _manticoreLog["default"])('sdkErrors');
var domain = {
  transaction: 'transaction',
  merchant: 'merchant',
  retail: 'retail',
  sdk: 'sdk',
  network: 'network'
};
exports.domain = domain;

function payPalError(errDomain) {
  var code = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  var message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
  var errorInfo = new _manticorePaypalerror.PayPalErrorInfo();
  errorInfo.code = code.toString();
  errorInfo.domain = errDomain;
  errorInfo.message = message;
  return _manticorePaypalerror.PayPalError.makeError(null, errorInfo);
}
/**
 * All errors are belong to here. One assignment per domain will keep auto-complete happy.
 */


var transaction = {
  customerCancel: payPalError(domain.transaction, 1, 'Transaction cancelled by customer'),
  genericCancel: payPalError(domain.transaction, 2, 'The transaction was cancelled'),
  cardCantContinue: payPalError(domain.transaction, 3, 'Cannot continue with specified card.'),
  noFunctionalDevices: payPalError(domain.transaction, 4, 'No functional devices.'),
  invoiceStatusMismatch: payPalError(domain.transaction, 5, 'The invoice status is not eligible for the given transaction method'),
  amountTooLow: payPalError(domain.transaction, 6, 'The invoice amount was too low'),
  amountTooHigh: payPalError(domain.transaction, 7, 'The invoice amount was too high'),
  failedToCollectSignature: payPalError(domain.transaction, 8, 'Failed to collect signature'),
  cannotSwipeChipCard: payPalError(domain.transaction, 9, 'Cannot swipe a chip card'),
  mustSwipeCard: payPalError(domain.transaction, 10, 'Must swipe the card'),
  refundCardMismatch: payPalError(domain.transaction, 11, 'Card presented for refund is not the one used for the original payment'),
  cardTypeMismatch: payPalError(domain.transaction, 12, 'Presented card is not of the expected type'),
  locationError: payPalError(domain.transaction, 13, 'Unable to retrieve location information'),
  missingInvoiceId: payPalError(domain.transaction, 14, 'Invoice ID is required to complete this refund.'),
  missingTransactionNumberOrInvoiceId: payPalError(domain.transaction, 15, 'Transaction number or invoice id is required to complete this refund.'),
  cannotDiscardCard: payPalError(domain.transaction, 16, 'Cannot discard the presented card'),
  multipleContactlessCardsDetected: payPalError(domain.transaction, 17, 'Multiple Contactless Cards Detected'),
  tryDifferentInterface: payPalError(domain.transaction, 18, 'Try different interface'),
  cannotClearActiveTransaction: payPalError(domain.transaction, 19, 'Cannot clear transaction when payment is in progress'),
  authorizationFailed: payPalError(domain.transaction, 20, 'The authorization request has failed'),
  captureFailed: payPalError(domain.transaction, 21, 'The capture request has failed'),
  invalidAuthorization: payPalError(domain.transaction, 22, 'Authorization is not possible on this payment mode'),
  retrieveAuthListFailed: payPalError(domain.transaction, 23, 'Unable to retrieve list of authorizations'),
  voidFailed: payPalError(domain.transaction, 24, 'Unable to void the authorization'),
  notSupported: payPalError(domain.transaction, 25, 'Current operation not supported'),
  captureValidationFailed: payPalError(domain.transaction, 26, 'Validation failed for payment capture'),
  authRetrieveValidationFailed: payPalError(domain.transaction, 27, 'Validation failed for retrieving list of authorized transactions'),
  invalidInvoiceItem: payPalError(domain.transaction, 28, 'Not allowed to have an invalid item in the invoice item list'),
  offlinePaymentEnabled: payPalError(domain.transaction, 29, 'Offline Payment Enabled'),
  offlineTxnLimit: payPalError(domain.transaction, 30, 'Offline Payment Transaction Limit Reached'),
  offlineTotalLimit: payPalError(domain.transaction, 31, 'Offline Payment Total Limit Reached'),
  noAudioReaderWhenOffline: payPalError(domain.transaction, 32, 'Offline Payment Mode is not available for Audio Readers'),
  nfcContactlessLimitReached: payPalError(domain.transaction, 33, 'NFC Contactless Limit Reached'),
  offlinePaymentStopped: payPalError(domain.transaction, 34, 'Offline Payment Stopped'),
  offlinePaymentKeyinNotAllowed: payPalError(domain.transaction, 35, 'Offline Payment key in is not allowed'),
  payAndVaultFailed: payPalError(domain.transaction, 36, 'Pay and Vault payment failed'),
  vaultFailed: payPalError(domain.transaction, 37, 'Vault failed'),
  invoiceLoadFailed: payPalError(domain.transaction, 38, 'Failed to load invoice'),
  missingTransactionNumber: payPalError(domain.transaction, 39, 'Missing transaction number'),
  failedDueToOutage: payPalError(domain.transaction, 40, 'transaction failed due to outage'),
  qrcSessionTimeOut: payPalError(domain.transaction, 41, 'QRC session timed out'),
  qrcPollingFailed: payPalError(domain.transaction, 42, 'QRC polling failed'),
  cannotCancelActiveQrcTransaction: payPalError(domain.transaction, 43, 'Cannot clear transaction after QR code is scanned'),
  failedQRCServiceProvider: payPalError(domain.transaction, 44, 'Failed to get the QRC service provider'),
  failedQRCUrlGeneration: payPalError(domain.transaction, 45, 'Failed to generate the QRC URL'),
  failedQRC: payPalError(domain.transaction, 46, 'Failed the QRC payment'),
  declinedQRC: payPalError(domain.transaction, 47, 'declined the QRC payment'),
  failedQRCReferrerCode: payPalError(domain.transaction, 48, 'Failed to get the QRC referrer(BN) code'),
  merchantCancel: payPalError(domain.transaction, 49, 'transaction cancelled by merchant'),
  cancellationFailure: payPalError(domain.transaction, 50, 'cannot Cancel inflight transaction'),
  missingDigitalCardRedemption: payPalError(domain.transaction, 51, 'Missing digital card redemption information'),
  cardRemovedBeforeRead: payPalError(domain.transaction, 52, 'The card was removed before it was read')
};
exports.transaction = transaction;
var merchant = {
  failedToLoad: payPalError(domain.merchant, 1, 'Failed to load the merchant information'),
  requiredInfoNotLoaded: payPalError(domain.merchant, 2, 'Failed to load required merchant information'),
  notInitialized: payPalError(domain.merchant, 3, 'Merchant not initialized'),
  missingCredentials: payPalError(domain.merchant, 4, 'Access token or ClientId/Secret is missing from provided credentials'),
  environmentNotProvided: payPalError(domain.merchant, 5, 'Environment is missing from provided credentials'),
  merchantDataNotProvided: payPalError(domain.merchant, 6, 'Data required to create the merchant object are missing'),
  invalidMerchantUserInfo: payPalError(domain.merchant, 7, 'Failed to load required merchant user information'),
  invalidMerchantStatusInfo: payPalError(domain.merchant, 8, 'Failed to load required merchant status information'),
  invalidToken: payPalError(domain.merchant, 9, 'The token is either invalid or missing'),
  tokenDataNotProvided: payPalError(domain.merchant, 10, 'The token data to build the composite token is either invalid or missing'),
  offlinePaymentIneligible: payPalError(domain.merchant, 11, 'Merchant not white listed to make offline payments'),
  offlineInfoNotAvailable: payPalError(domain.merchant, 12, 'Online initialize required once before you can initialize offline'),
  failedToLoadOfflineMerchant: payPalError(domain.merchant, 13, 'Failed to load offline merchant information'),
  failedToReloadOnlineMerchant: payPalError(domain.merchant, 14, 'Failed to reload online merchant information. Did you have an active merchant before switching to offline mode?'),
  merchantInitializedCallbackNotProvided: payPalError(domain.merchant, 15, 'merchantInitialized callback is missing'),
  webFeatureNotEnabled: payPalError(domain.merchant, 16, 'The region is not eligible for the web feature'),
  qrcIneligible: payPalError(domain.merchant, 17, 'Merchant not white listed to make QRC payments')
}; // The error codes used here must match the codes returned by the retail payments endpoint

exports.merchant = merchant;
var retail = {
  nfcPaymentDeclined: payPalError(domain.retail, 600075),
  incorrectOnlinePin: payPalError(domain.retail, 6000164),
  onlinePinMaxRetryExceed: payPalError(domain.retail, 6000165),
  contactIssuer: payPalError(domain.retail, 580031)
};
exports.retail = retail;
var network = {
  requestFailed: payPalError(domain.network, 1, 'Request failed'),
  networkOffline: payPalError(domain.network, -1001),
  sslHandshakeFailed: payPalError(domain.network, -999),
  networkNotAllowedInOfflineMode: payPalError(domain.network, 2, 'Network not allowed in offline mode.')
};
exports.network = network;
var sdk = {
  userCancelled: payPalError(domain.sdk, 1, 'Action was cancelled by user'),
  fileNotFound: payPalError(domain.sdk, 2, 'Unable to retrieve file from device storage'),
  validationError: payPalError(domain.sdk, 3, 'The arguments passed are invalid.'),
  cardReaderScannerNotInitialized: payPalError(domain.sdk, 4, 'Card reader scanner not initialized'),
  noReaderFound: payPalError(domain.sdk, 5, 'No reader found'),
  bluetoothDisabled: payPalError(domain.sdk, 6, 'Bluetooth disabled'),
  logout: payPalError(domain.sdk, 7, 'User logout'),
  selectedReaderUnavailable: payPalError(domain.sdk, 8, 'Selected card reader unavailable'),
  multipleReaders: payPalError(domain.sdk, 9, 'Multiple card readers associated with the provided ReaderConfiguration').withDevMessage('Provide more details in the config or search with UI to select the reader'),
  selectionInProgress: payPalError(domain.sdk, 10, 'An ongoing card reader selection can not be interrupted'),
  rapidSuccessiveCall: payPalError(domain.sdk, 11, 'Rapid successive calls'),
  readerAlreadyConnected: payPalError(domain.sdk, 12, 'A card reader is already connected'),
  stoppingAutoConnect: payPalError(domain.sdk, 13, 'Stopping auto connect to start a new scan')
};
exports.sdk = sdk;
var hardDeclineForOffline = ['403', '580022', '580031'];
exports.hardDeclineForOffline = hardDeclineForOffline;
var hardDecline = ['403', '580022', '580031', '600075', '600000'];
exports.hardDecline = hardDecline;
var PaymentErrorHandlerErrors = {
  genericError: 'GenericError',
  declined: 'Declined',
  failed: 'Failed',
  cancelled: 'Cancelled',
  amountTooLow: 'AmountTooLow',
  amountTooHigh: 'AmountTooHigh',
  refundCardMismatch: 'Refund.CardMismatch',
  blockedCard: 'BlockedCard',
  blockedCardSwiped: 'BlockedCardSwiped',
  blockedCardTapped: 'BlockedCardTapped',
  networkOffline: 'NetworkOffline',
  tapDifferentCard: 'TapDifferentCard',
  multipleContactlessCardsDetected: 'MultipleContactlessCardsDetected',
  incorrectPin: 'IncorrectPin',
  cardNotInSlot: 'CardNotInSlot',
  lowBattery: 'LowBattery',
  nfcPaymentDeclined: 'NfcPaymentDeclined',
  chipCardSwiped: 'ChipCardSwiped',
  tryDifferentCard: 'TryDifferentCard',
  cardRemovedBeforeRead: 'cardRemovedBeforeRead'
}; // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After
// retry-after is not expected for 500, but that was the only code we were handling earlier.
// TODO: Analyze logs and remove 500 if we don't see retry-after for status 500

exports.PaymentErrorHandlerErrors = PaymentErrorHandlerErrors;
var retryStatuses = [301, 429, 500, 503];
exports.retryStatuses = retryStatuses;

function getDefaultDevMessage(error, requestType, devMessage) {
  var _context, _context2, _context3, _context4, _context5;

  return (0, _concat["default"])(_context = (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = (0, _concat["default"])(_context4 = (0, _concat["default"])(_context5 = "[".concat(requestType, "] Error. domain:")).call(_context5, error.domain, ", code:")).call(_context4, error.code, ", message: ")).call(_context3, error.message, ", debugId: ")).call(_context2, error.debugId, ", developerMessage: ")).call(_context, devMessage);
}

function retailErrorFromResponse(requestType, err, response, softDescriptor) {
  var _response$headers, _response$headers2, _response$headers3, _response$headers4, _response$headers5, _error, _response$body, _response$body2, _response$body3, _response$body3$warni;

  var error = err;
  var logResponse = {
    headers: {
      'Content-Type': response === null || response === void 0 ? void 0 : (_response$headers = response.headers) === null || _response$headers === void 0 ? void 0 : _response$headers['Content-Type'],
      Date: response === null || response === void 0 ? void 0 : (_response$headers2 = response.headers) === null || _response$headers2 === void 0 ? void 0 : _response$headers2.Date,
      'paypal-debug-id': response === null || response === void 0 ? void 0 : (_response$headers3 = response.headers) === null || _response$headers3 === void 0 ? void 0 : _response$headers3['paypal-debug-id'],
      'Retry-After': response === null || response === void 0 ? void 0 : (_response$headers4 = response.headers) === null || _response$headers4 === void 0 ? void 0 : _response$headers4['Retry-After'],
      'Transfer-Encoding': response === null || response === void 0 ? void 0 : (_response$headers5 = response.headers) === null || _response$headers5 === void 0 ? void 0 : _response$headers5['Transfer-Encoding']
    },
    body: response === null || response === void 0 ? void 0 : response.body,
    statusCode: response === null || response === void 0 ? void 0 : response.statusCode
  };

  if (error) {
    error.developerMessage = error.developerMessage || getDefaultDevMessage(error, requestType);
    Log.error("ResponseError [".concat(requestType, "]"), {
      error: error,
      logResponse: logResponse
    });
  }

  var devMessage = (_error = error) === null || _error === void 0 ? void 0 : _error.developerMessage;
  var corrId = (response === null || response === void 0 ? void 0 : (_response$body = response.body) === null || _response$body === void 0 ? void 0 : _response$body.correlationId) || (response === null || response === void 0 ? void 0 : response.headers) && response.headers['paypal-debug-id'];
  var apiErrorCode = response === null || response === void 0 ? void 0 : (_response$body2 = response.body) === null || _response$body2 === void 0 ? void 0 : _response$body2.errorCode;
  var apiWarning = response === null || response === void 0 ? void 0 : (_response$body3 = response.body) === null || _response$body3 === void 0 ? void 0 : (_response$body3$warni = _response$body3.warnings) === null || _response$body3$warni === void 0 ? void 0 : _response$body3$warni[0];

  if (apiErrorCode) {
    // Give priority to here-api errors
    error = payPalError(domain.retail, apiErrorCode, response.body.message).withDebugId(corrId);
    error.developerMessage = (response === null || response === void 0 ? void 0 : response.body.developerMessage) || getDefaultDevMessage(error, requestType, devMessage);
    Log.error("ApiError [".concat(requestType, "]"), {
      error: error,
      logResponse: logResponse
    });
  }

  if (apiWarning) {
    // TODO: After Millennium release, analyze logs and get rid of this "if" check
    // with Millennium, we are not supposed to get this warning when softDescriptor is set!
    if (softDescriptor && apiWarning.errorCode === '600002') {
      Log.track("SoftDescriptorIgnore600002 [".concat(requestType, "]"), {
        error: error,
        logResponse: logResponse
      });
    } else {
      var _error2;

      devMessage = (_error2 = error) === null || _error2 === void 0 ? void 0 : _error2.developerMessage;
      corrId = corrId || apiWarning.correlationId; // Give priority to here-api errors

      error = payPalError(domain.retail, response.body.warnings[0].errorCode, response.body.warnings[0].message).withDebugId(corrId);
      error.developerMessage = response.body.warnings[0].developerMessage || getDefaultDevMessage(error, requestType, devMessage);
      Log.error("ApiWarning [".concat(requestType, "]"), {
        error: error,
        logResponse: logResponse
      });
    }
  }

  if ((0, _includes["default"])(retryStatuses).call(retryStatuses, response === null || response === void 0 ? void 0 : response.statusCode) && response.headers && response.headers['Retry-After']) {
    var retryAfter = (0, _parseInt2["default"])(response.headers['Retry-After'], 10);
    error = transaction.failedDueToOutage.withDevMessage("retryAfter: ".concat(retryAfter)).withDebugId(corrId).withDetails({
      retryAfter: retryAfter
    });
    Log.error("FailedDueToOutage [".concat(requestType, "]"), {
      error: error,
      logResponse: logResponse
    });
  }

  return error;
}

},{"@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/manticore-paypalerror":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-paypalerror/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/simulatorData/merchant.json":[function(require,module,exports){
module.exports={
  "status":{
    "status":"0",
    "categoryCode":true,
    "currencyCode":"USD",
    "paymentTypes":[
      "Chip",
      "Card",
      "Contactless_MSD",
      "Contactless_EMV"
    ],
    "businessCategoryExists":true,
    "cardSettings":{
      "unsupportedCardTypes":[
        "discover_contactless",
        "amex_contactless"
      ],
      "minimum":"1",
      "signatureRequiredAbove":"50",
      "maximum":"10000"
    },
    "merchant_info": true
  },
  "logglyAccessToken":"SimulatorLogglyAccessToken",
  "instrumentationAccessToken":"eyJ3ZWIiOiJNMll4TlRWbE5HVTRaV1U0WTJVME5tSmhOamhrTm1FMU1qRXlOVFF4WW1NNk9VMWlXRU5qWWxOcFpFUmpUMlZpVjNCM1lYVjFaM2g0V1hwcVNYTkpWRXBNYUU5b09GaDNPRlpWUW1scFNrbFNZME5yYldoYVpsaGZVbTVHUjI1Q1VRPT0iLCJhbmRyb2lkIjoiWXpSaE5XSm1Nak15Tmpaak5UVTBaams0TlRFME5EVXhNMkUzWVdVMVpEazZYemxVUm1oeVpGVnhSbTE0V2pWV1dGcGxjVzVFYVV0cGFGWTVRVGhEUlRoeVFtSTFVMUUyZG1sMVVWaGlVQzFKTkdWMldWUXlPRGgyVlVNdFJqZERXQT09IiwiaU9TIjoiTkRRek9EVXdOMlZrWWpJNVlUWTBZVGxpWXpaa09UUXdZV1EzTnpBek1UYzZXV2xoVDFsU2JFTjJXRjlQTlMxM1owWm1NVVozUlhCNU1rWjVaSE5RU0cxNlJGQk1RWGRpZEROTmFYTkVaazFJUTNSbFQyUXpWMW90WDFvMVJXbEhTUT09In0",
  "repository":"production",
  "pairingId":"SimulatorPairingId",
  "token":{
    "accessToken":"pph-sdk-simulator-access-token",
    "access_token":"pph-sdk-simulator-access-token",
    "env":"live",
    "environment":"live"
  },
  "userInfo":{
    "email":"pphsimaccount@paypal.com",
    "given_name":"PPH Sdk Simulator",
    "businessCategory":"",
    "address":{
      "locality":"San Jose",
      "street_address":"2211 N 1st St",
      "country":"US",
      "region":"CA",
      "postal_code":"95131"
    },
    "name":"PPH Sdk Simulator",
    "payer_id":"SIMULATOR"
  },
  "simulatorMode":true
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/debug.js":[function(require,module,exports){
"use strict";

var m = require('manticore');

m.miuraSwRepo = 'dev-stage-2';

},{"manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseFlowAsync.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _flowAsync = _interopRequireDefault(require("../common/flowAsync"));

var Log = (0, _manticoreLog["default"])('flow.BaseFlowAsync');
/**
 * Base class to manage All Async flows..
 */

var BaseFlowAsync = /*#__PURE__*/function () {
  function BaseFlowAsync() {
    (0, _classCallCheck2["default"])(this, BaseFlowAsync);
  }

  (0, _createClass2["default"])(BaseFlowAsync, [{
    key: "setFlowSteps",
    value:
    /**
     * Sets the flow steps for the controller
     * @param flowName - Name for the flow
     * @param flowSteps - Sequence flow steps that will be executed by the flow controller
     * @returns {BaseFlowAsync} - Returns 'this' object for enabling Fluent Interface
     */
    function setFlowSteps(flowName, flowSteps) {
      this.flowSteps = flowSteps;
      this.flow = new _flowAsync["default"](this, this.flowSteps);
      this.flow.name = flowName;
      return this;
    }
  }, {
    key: "addFlowEndedHandler",
    value: function addFlowEndedHandler() {
      var handler = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      this._check();

      this.flow.once('ended', handler);
      return this;
    }
  }, {
    key: "addFlowAbortedHandler",
    value: function addFlowAbortedHandler() {
      var handler = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      this._check();

      this.flow.once('aborted', handler);
      return this;
    }
  }, {
    key: "addFlowCompletedHandler",
    value: function addFlowCompletedHandler() {
      var handler = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      this._check();

      this.flow.once('completed', handler);
      return this;
    }
  }, {
    key: "_check",
    value: function _check() {
      if (!this.flow) {
        throw new Error('Flow needs to be initialized first');
      }
    }
    /**
     * Sets the flow that should be triggered on completion of the flowSteps registered via 'setFlowSteps' function
     * @param completionFlowName - Name fr the completion flow
     * @param flowCompletionSteps - List of flow steps
     * @returns {BaseFlowAsync} - Returns 'this' object for enabling Fluent Interface
     */

  }, {
    key: "setCompletionSteps",
    value: function setCompletionSteps(completionFlowName, flowCompletionSteps) {
      var _this = this;

      var onCompleteCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
      this.completionFlowName = completionFlowName;
      this.completionFlowSteps = flowCompletionSteps;
      this.onCompleteCallback = onCompleteCallback;
      this.flow.on('completed', function (data) {
        Log.debug(function () {
          return "flow completed  ".concat((0, _stringify["default"])(data, null, 4));
        });

        _this.completeTransaction(data);
      });
      this.addFlowAbortedHandler(onCompleteCallback);
      return this;
    }
    /**
     * Displays an alert dialog on the application.
     * @param messageHelperFunc A function that contains the message to be displayed.
     * @returns {Function} The current flow step.
     */

  }, {
    key: "createFlowMessageStep",
    value: function createFlowMessageStep(messageHelperFunc) {
      var _this2 = this;

      return function (flow) {
        messageHelperFunc(_this2.context, flow.data, function (alert) {
          _this2.alert = alert;
          flow.next();
        });
      };
    }
    /**
     * Starts executing the flow steps that were set by the 'setFlowSteps' function
     */

  }, {
    key: "startFlow",
    value: function () {
      var _startFlow = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
        var _this3 = this;

        return _regenerator["default"].wrap(function _callee$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                Log.debug(function () {
                  var _context;

                  return (0, _concat["default"])(_context = "Start executing ".concat(_this3.flowSteps.length, " steps for ")).call(_context, _this3.flow.name, " flow");
                });
                _context2.next = 3;
                return this.flow.start();

              case 3:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee, this);
      }));

      function startFlow() {
        return _startFlow.apply(this, arguments);
      }

      return startFlow;
    }()
  }, {
    key: "completeTransaction",
    value: function completeTransaction(data) {
      var _this4 = this;

      if (!this.completionFlowSteps) {
        Log.debug(function () {
          return 'Flow ended and completion steps not defined. Proceeding to invoke complete callback';
        });
        this.onCompleteCallback(data);
        return;
      }

      this.completionFlow = new _flowAsync["default"](this, this.completionFlowSteps);
      this.completionFlow.name = this.completionFlowName;
      this.completionFlow.data = data;
      this.completionFlow.on('ended', function (dt) {
        Log.debug(function () {
          return "Flow ended. Proceeding to invoke flow complete callback (error: ".concat(dt.error, ")");
        });

        _this4.onCompleteCallback(dt);
      });

      if (this.completionFlow) {
        this.completionFlow.start();
      } else {
        Log.debug('Did not find any completionFlow');
      }
    }
  }]);
  return BaseFlowAsync;
}();

exports["default"] = BaseFlowAsync;

},{"../common/flowAsync":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/flowAsync.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseTransactionFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreUtil = require("manticore-util");

var _paypalrestManticore = require("@paypalcorp/paypalrest-manticore");

var _sdkErrors = require("../common/sdkErrors");

var _PaymentErrorHandler = _interopRequireDefault(require("./PaymentErrorHandler"));

var _flow = _interopRequireDefault(require("../common/flow"));

var Cal = _interopRequireWildcard(require("../common/cal"));

var messageHelper = _interopRequireWildcard(require("./messageHelper"));

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _TimeCard = _interopRequireDefault(require("../transaction/TimeCard"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

var Log = (0, _manticoreLog["default"])('flow.baseTransactionFlow');
var AuthCode = _retailPaymentDevice.PaymentDevice.authCode;
/**
 * Parent class to manage payment flows (swipe, nfc and emv)
 */

var BaseTransactionFlow = /*#__PURE__*/function () {
  function BaseTransactionFlow(context, onCompleteCallback) {
    var _this = this;

    (0, _classCallCheck2["default"])(this, BaseTransactionFlow);
    this.context = context;
    this.card = context.card;
    this.onCompleteCallback = onCompleteCallback;

    this.transactionCancelRequested = function () {
      Log.info('TxCancelRequestedFromCR', {
        crId: _this.card.reader.id
      });

      _this.card.reader.abortTransaction(_this.context, function () {
        Log.info('DeactivatedCR', {
          crId: _this.card.reader.id
        });

        _this.flow.abortFlow(_retailPaymentDevice.deviceError.paymentCancelled);
      });
    };

    this.transactionCancelled = function () {
      Log.info('TxCancelledOnCR', {
        crId: _this.card.reader.id
      });

      _this.flow.abortFlow(_retailPaymentDevice.deviceError.paymentCancelled);
    };
  }
  /**
   * Sets the flow steps for the controller
   * @param flowName - Name for the flow
   * @param flowSteps - Sequence flow steps that will be executed by the flow controller
   * @returns {BaseTransactionFlow} - Returns 'this' object for enabling Fluent Interface
   */


  (0, _createClass2["default"])(BaseTransactionFlow, [{
    key: "setFlowSteps",
    value: function setFlowSteps(flowName, flowSteps) {
      this.flowName = flowName;
      this.flowSteps = flowSteps;
      this.flow = new _flow["default"](this, this.flowSteps);
      return this;
    }
  }, {
    key: "addFlowEndedHandler",
    value: function addFlowEndedHandler(handler) {
      if (this.flow === undefined) {
        throw new Error('Flow needs to be initialized first');
      }

      this.flow.on('ended', handler);
      return this;
    }
    /**
     * Sets the flow that should be triggered on completion of the flowSteps registered via 'setFlowSteps' function
     * @param completionFlowName - Name fr the completion flow
     * @param flowCompletionSteps - List of flow steps
     * @returns {BaseTransactionFlow} - Returns 'this' object for enabling Fluent Interface
     */

  }, {
    key: "setCompletionSteps",
    value: function setCompletionSteps(completionFlowName, flowCompletionSteps) {
      this.completionFlowName = completionFlowName;
      this.completionFlowSteps = flowCompletionSteps;
      return this;
    }
    /**
     * Starts executing the flow steps that were set by the 'setFlowSteps' function
     */

  }, {
    key: "startFlow",
    value: function startFlow() {
      var _this2 = this;

      Log.debug(function () {
        var _context;

        return (0, _concat["default"])(_context = "Start executing ".concat(_this2.flowSteps.length, " steps for ")).call(_context, _this2.flowName, " flow");
      });
      this.flow.name = this.flowName;
      this.context.setPaymentFlowStarted();
      this.flow.on('completed', function (data) {
        _this2.completeTransaction(data);
      });
      this.flow.on('aborted', function (data) {
        _this2.abortTransaction(data);
      });
      this.flow.start();
    }
  }, {
    key: "invokeCompleteCallback",
    value: function invokeCompleteCallback(flowData, action, opt) {
      if (flowData.alert && (action === _PaymentErrorHandler["default"].action.abort || action === _PaymentErrorHandler["default"].action.offlineDecline)) {
        flowData.alert.dismiss();
      }

      if (this.context.isTransactionVaultOnly) {
        var vaultRecord = flowData.vault || {};
        vaultRecord.card = vaultRecord.card || this.card;
        this.onCompleteCallback(flowData.error, action, vaultRecord, opt);
      } else {
        var transactionRecord = flowData.tx || {};
        transactionRecord.card = transactionRecord.card || this.card;
        this.onCompleteCallback(flowData.error, action, transactionRecord, opt);
      }
    }
  }, {
    key: "completeTransaction",
    value: function completeTransaction(data, action) {
      var _this3 = this;

      Log.debug(function () {
        return "Starting completion steps for ".concat(_this3.flowName, " flow");
      });

      if (!this.completionFlowSteps) {
        Log.debug(function () {
          return 'Flow ended and completion steps not defined. Proceeding to invoke complete callback';
        });
        this.invokeCompleteCallback(data, action);
        return;
      }

      this.completionFlow = new _flow["default"](this, this.completionFlowSteps);
      this.completionFlow.name = this.completionFlowName;
      this.completionFlow.data = data;
      this.completionFlow.on('ended', function (dt) {
        Log.debug(function () {
          return "Flow ended. Proceeding to invoke flow complete callback (error: ".concat(dt.error, ")");
        });

        _this3.invokeCompleteCallback(dt, action);
      });

      if (this.completionFlow) {
        var _this$card;

        if ((_this$card = this.card) !== null && _this$card !== void 0 && _this$card.reader) {
          // Reset the terminal
          this.card.reader.postTransactionCleanup(function () {
            return _this3.completionFlow.start();
          });
        } else {
          this.completionFlow.start();
        }
      } else {
        Log.debug('Did not find any completionFlow');
      }
    }
  }, {
    key: "abortTransaction",
    value: function abortTransaction(data) {
      var _this4 = this,
          _this$card2,
          _this$card3;

      Log.debug(function () {
        return "Aborting ".concat(_this4.context.id);
      });
      this.voidPaymentIfApplicable(data);
      var err = data.error;
      var formFactor = (_this$card2 = this.card) === null || _this$card2 === void 0 ? void 0 : _this$card2.formFactor;
      var reader = ((_this$card3 = this.card) === null || _this$card3 === void 0 ? void 0 : _this$card3.reader) || this.context.deviceController.selectedDevice;

      if (!err) {
        if (reader) {
          var transactionTypeFlagName = this.context.getTransactionTypeFlagName();
          reader.display({
            id: _retailPaymentDevice.PaymentDevice.Message[transactionTypeFlagName].Cancelled,
            substitutions: messageHelper.getSubstitutions(this.context)
          }, function () {
            return _this4.completeTransaction(data);
          });
        } else {
          this.completeTransaction(data);
        }

        return;
      }

      Log.warn('FlowAborted', {
        ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, formFactor),
        domain: err.domain,
        err: err,
        code: err.code
      });
      var handler = new _PaymentErrorHandler["default"](this.context);
      handler.handle(err, formFactor, reader, function (action, opt) {
        if (action === _PaymentErrorHandler["default"].action.abort) {
          _this4.completeTransaction(data, action);
        } else {
          _this4.invokeCompleteCallback(data, action, opt);
        }
      });
    }
  }, {
    key: "_hardDecline",
    value: function _hardDecline(error) {
      var _context2, _context3;

      return (0, _includes["default"])(_context2 = (0, _concat["default"])(_context3 = []).call(_context3, (0, _toConsumableArray2["default"])(_sdkErrors.hardDecline), [_paypalrestManticore.restError.unauthorized.code])).call(_context2, error.code);
    }
  }, {
    key: "voidPaymentIfApplicable",
    value: function voidPaymentIfApplicable(data) {
      var _data$tx,
          _data$tx2,
          _data$tx3,
          _data$cardResponse,
          _data$cardResponse$ap,
          _data$cardResponse$ap2,
          _this5 = this;

      Log.debug(function () {
        return "voidPaymentIfApplicable data.error: ".concat((0, _stringify["default"])(data.error));
      });
      var transactionQueryParam = this.context.type === _retailPaymentDevice.TransactionType.Auth ? data === null || data === void 0 ? void 0 : (_data$tx = data.tx) === null || _data$tx === void 0 ? void 0 : _data$tx.transactionNumber : data === null || data === void 0 ? void 0 : (_data$tx2 = data.tx) === null || _data$tx2 === void 0 ? void 0 : _data$tx2.transactionHandle;

      if (!transactionQueryParam) {
        Log.debug('Will not void transaction as transaction handle/number was not assigned');
        return;
      }

      if (data !== null && data !== void 0 && data.error && this._hardDecline(data.error)) {
        Log.debug(function () {
          return "Will not void transaction. Declined with error: ".concat((0, _stringify["default"])(data.error));
        });
        return;
      }

      var body = {
        invoiceId: this.context.invoice.payPalId,
        responseCode: data === null || data === void 0 ? void 0 : (_data$tx3 = data.tx) === null || _data$tx3 === void 0 ? void 0 : _data$tx3.responseCode,
        emvData: data === null || data === void 0 ? void 0 : (_data$cardResponse = data.cardResponse) === null || _data$cardResponse === void 0 ? void 0 : (_data$cardResponse$ap = _data$cardResponse.apdu) === null || _data$cardResponse$ap === void 0 ? void 0 : (_data$cardResponse$ap2 = _data$cardResponse$ap.data) === null || _data$cardResponse$ap2 === void 0 ? void 0 : _data$cardResponse$ap2.toString('hex'),
        paymentAction: this.context.paymentAction
      };
      var op = "checkouts/".concat(transactionQueryParam, "/void");
      Log.debug(function () {
        return "Invoice void request:".concat((0, _stringify["default"])(body, null, 4));
      });

      _Merchant["default"].active.request({
        service: 'retail',
        op: op,
        format: 'json',
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: (0, _stringify["default"])(body)
      }, function (error, voidRz) {
        if (error) {
          Log.error('VoidRequestErr', {
            op: op,
            payload: (0, _stringify["default"])(body, null, 4),
            err: error
          });
          return;
        }

        Log.info('SuccessfullyVoidedInvoice', {
          invId: _this5.context.invoice.payPalId,
          resp: (0, _stringify["default"])(voidRz)
        });
      });
    }
  }, {
    key: "saveInvoiceStep",
    value: function saveInvoiceStep(flow) {
      var _this6 = this;

      Log.debug('saveInvoiceStep beforeSave', {
        invoice: this.context.invoice
      });
      this.context.timeCard.startTime(_TimeCard["default"].Events.invoiceSaveStep);
      this.context.timeCard.startTime(_TimeCard["default"].Events.invoiceSaveCall);
      this.context.invoice.save(function (error) {
        _this6.context.timeCard.stopTime(_TimeCard["default"].Events.invoiceSaveCall);

        if (error && _this6.card && _this6.card.reader) {
          Log.error('saveInvoiceFailed', {
            err: error,
            inv: (0, _stringify["default"])(_this6.context.invoice, null, 4)
          });
          var authCode = AuthCode.TransactionFailure;

          if (error.code === _sdkErrors.network.networkOffline.code || error.code === _sdkErrors.network.sslHandshakeFailed.code) {
            authCode = AuthCode.NoNetwork;
          }

          Log.debug(function () {
            return "Pushing authCode : ".concat(authCode);
          });

          _this6.card.reader.completeTransaction(authCode, function (err) {
            if (err) {
              Log.error('ErrRespOnPushingAuthCodeToTerminal', {
                err: err
              });
            }

            return flow.abortFlow(error);
          });
        } else if (error) {
          flow.abortFlow(error);
        } else {
          Log.debug('saveInvoiceStep afterSave', {
            invoice: _this6.context.invoice
          });
          Cal.setInvoiceId(_this6.context.invoice.payPalId);

          _this6.context.timeCard.stopTime(_TimeCard["default"].Events.invoiceSaveStep);

          flow.next();
        }
      });
    }
  }, {
    key: "deactivateFormFactorsStep",
    value: function deactivateFormFactorsStep(flow) {
      this.context.deactivateFormFactors([_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.EmvCertifiedContactless, _retailPaymentDevice.FormFactor.MagneticCardSwipe], function () {
        return flow.next();
      });
    }
  }, {
    key: "createFlowMessageStep",
    value: function createFlowMessageStep(messageHelperFunc) {
      var _this7 = this;

      return function (flow) {
        return messageHelperFunc(_this7.context, flow.data, function () {
          return flow.next();
        });
      };
    }
  }]);
  return BaseTransactionFlow;
}();

exports["default"] = BaseTransactionFlow;

},{"../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/cal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/cal.js","../common/flow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/flow.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../transaction/TimeCard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TimeCard.js","./PaymentErrorHandler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/PaymentErrorHandler.js","./messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypalrest-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/CaptureHandler.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
/* eslint-disable no-unused-vars */

/**
 * @class
 */


var CaptureHandler = /*#__PURE__*/function () {
  function CaptureHandler() {
    (0, _classCallCheck2["default"])(this, CaptureHandler);
  }

  (0, _createClass2["default"])(CaptureHandler, [{
    key: "doCapture",
    value:
    /**
     * To capture the authorization
     * @param {decimal} gratuityAmount
     * @param {string} signature
     */
    function doCapture(gratuityAmount, signature) {}
    /**
     * To void the authorization
     */

  }, {
    key: "doVoid",
    value: function doVoid() {}
  }]);
  return CaptureHandler;
}();

exports["default"] = CaptureHandler;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/CreditCardFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var messageHelper = _interopRequireWildcard(require("./messageHelper"));

var _BaseTransactionFlow2 = _interopRequireDefault(require("./BaseTransactionFlow"));

var _MerchantTakePaymentStep = _interopRequireDefault(require("./steps/MerchantTakePaymentStep"));

var _SignatureStep = _interopRequireDefault(require("./steps/SignatureStep"));

var _FinalizePaymentStep = _interopRequireDefault(require("./steps/FinalizePaymentStep"));

var _UpdateInvoicePaymentStep = _interopRequireDefault(require("./steps/UpdateInvoicePaymentStep"));

var _RemoveCardStep = _interopRequireDefault(require("./steps/RemoveCardStep"));

var _ReceiptStep = _interopRequireDefault(require("./steps/ReceiptStep"));

var _CaptureStep = _interopRequireDefault(require("./steps/CaptureStep"));

var _paymentDeviceUtils = require("../common/paymentDeviceUtils");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.creditCardFlow');

var CreditCardFlow = /*#__PURE__*/function (_BaseTransactionFlow) {
  (0, _inherits2["default"])(CreditCardFlow, _BaseTransactionFlow);

  var _super = _createSuper(CreditCardFlow);

  function CreditCardFlow(context, callback) {
    var _context;

    var _thisSuper, _this;

    (0, _classCallCheck2["default"])(this, CreditCardFlow);
    Log.debug('Initializing Credit Flow');
    _this = _super.call(this, context, callback);
    (0, _get2["default"])((_thisSuper = (0, _assertThisInitialized2["default"])(_this), (0, _getPrototypeOf2["default"])(CreditCardFlow.prototype)), "setFlowSteps", _thisSuper).call(_thisSuper, 'Credit', [_paymentDeviceUtils.createAddPaymentCancelListenersStep, _this.createFlowMessageStep(messageHelper.showProcessingMessage), _this.saveInvoiceStep, new _MerchantTakePaymentStep["default"](context, (0, _bind["default"])(_context = _this.voidPaymentIfApplicable).call(_context, (0, _assertThisInitialized2["default"])(_this))).flowStep, new _SignatureStep["default"](context).flowStep, _this.createFlowMessageStep(messageHelper.showFinalizeMessage), _paymentDeviceUtils.createRemovePaymentCancelListenersStep, new _FinalizePaymentStep["default"](context).flowStep, new _RemoveCardStep["default"](context).flowStep, new _CaptureStep["default"](context).flowStep, _this.deactivateFormFactorsStep, _this.createFlowMessageStep(messageHelper.showCompleteMessage)]).addFlowEndedHandler((0, _bind["default"])(_paymentDeviceUtils.removePaymentCancelListeners).call(_paymentDeviceUtils.removePaymentCancelListeners, (0, _assertThisInitialized2["default"])(_this))).setCompletionSteps('Credit-Receipt', [new _UpdateInvoicePaymentStep["default"](context).flowStep, new _ReceiptStep["default"](_this.context).flowStep]).startFlow();
    return _this;
  }

  return (0, _createClass2["default"])(CreditCardFlow);
}(_BaseTransactionFlow2["default"]);

exports["default"] = CreditCardFlow;

},{"../common/paymentDeviceUtils":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/paymentDeviceUtils.js","./BaseTransactionFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseTransactionFlow.js","./messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./steps/CaptureStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/CaptureStep.js","./steps/FinalizePaymentStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FinalizePaymentStep.js","./steps/MerchantTakePaymentStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/MerchantTakePaymentStep.js","./steps/ReceiptStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/ReceiptStep.js","./steps/RemoveCardStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/RemoveCardStep.js","./steps/SignatureStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/SignatureStep.js","./steps/UpdateInvoicePaymentStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/UpdateInvoicePaymentStep.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/DigitalCardFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var messageHelper = _interopRequireWildcard(require("./messageHelper"));

var _BaseTransactionFlow2 = _interopRequireDefault(require("./BaseTransactionFlow"));

var _MerchantTakePaymentStep = _interopRequireDefault(require("./steps/MerchantTakePaymentStep"));

var _UpdateInvoiceDigitalCardStep = _interopRequireDefault(require("./steps/UpdateInvoiceDigitalCardStep"));

var _ReceiptStep = _interopRequireDefault(require("./steps/ReceiptStep"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.digitalCardFlow');

var DigitalCardFlow = /*#__PURE__*/function (_BaseTransactionFlow) {
  (0, _inherits2["default"])(DigitalCardFlow, _BaseTransactionFlow);

  var _super = _createSuper(DigitalCardFlow);

  function DigitalCardFlow(context, callback) {
    var _thisSuper, _this;

    (0, _classCallCheck2["default"])(this, DigitalCardFlow);
    Log.debug('Initializing Digital Card Flow');
    _this = _super.call(this, context, callback);
    (0, _get2["default"])((_thisSuper = (0, _assertThisInitialized2["default"])(_this), (0, _getPrototypeOf2["default"])(DigitalCardFlow.prototype)), "setFlowSteps", _thisSuper).call(_thisSuper, 'Payment', [_this.createFlowMessageStep(messageHelper.showProcessingMessage), _this.saveInvoiceStep, new _MerchantTakePaymentStep["default"](context).flowStep, _this.createFlowMessageStep(messageHelper.showCompleteMessage)]).setCompletionSteps('Payment-Receipt', [new _UpdateInvoiceDigitalCardStep["default"](context).flowStep, new _ReceiptStep["default"](_this.context).flowStep]).startFlow();
    return _this;
  }

  return (0, _createClass2["default"])(DigitalCardFlow);
}(_BaseTransactionFlow2["default"]);

exports["default"] = DigitalCardFlow;

},{"./BaseTransactionFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseTransactionFlow.js","./messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./steps/MerchantTakePaymentStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/MerchantTakePaymentStep.js","./steps/ReceiptStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/ReceiptStep.js","./steps/UpdateInvoiceDigitalCardStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/UpdateInvoiceDigitalCardStep.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/DigitalCardVoidFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var messageHelper = _interopRequireWildcard(require("./messageHelper"));

var _BaseTransactionFlow2 = _interopRequireDefault(require("./BaseTransactionFlow"));

var _DigitalCardVoidStep = _interopRequireDefault(require("./steps/DigitalCardVoidStep"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.digitalCardVoidFlow');

var DigitalCardVoidFlow = /*#__PURE__*/function (_BaseTransactionFlow) {
  (0, _inherits2["default"])(DigitalCardVoidFlow, _BaseTransactionFlow);

  var _super = _createSuper(DigitalCardVoidFlow);

  function DigitalCardVoidFlow(context, callback) {
    var _thisSuper, _this;

    (0, _classCallCheck2["default"])(this, DigitalCardVoidFlow);
    Log.debug('Initializing Digital Card Void Flow');
    _this = _super.call(this, context, callback);
    (0, _get2["default"])((_thisSuper = (0, _assertThisInitialized2["default"])(_this), (0, _getPrototypeOf2["default"])(DigitalCardVoidFlow.prototype)), "setFlowSteps", _thisSuper).call(_thisSuper, 'Void', [_this.createFlowMessageStep(messageHelper.showProcessingMessage), new _DigitalCardVoidStep["default"](context).flowStep]).setCompletionSteps('Void-Completion', [_this.createFlowMessageStep(messageHelper.dismissMessage)]).startFlow();
    return _this;
  }

  return (0, _createClass2["default"])(DigitalCardVoidFlow);
}(_BaseTransactionFlow2["default"]);

exports["default"] = DigitalCardVoidFlow;

},{"./BaseTransactionFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseTransactionFlow.js","./messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./steps/DigitalCardVoidStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/DigitalCardVoidStep.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/OfferReceiptFlow.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _flow = _interopRequireDefault(require("../common/flow"));

var _ReceiptStep = _interopRequireDefault(require("./steps/ReceiptStep"));

var Log = (0, _manticoreLog["default"])('flow.OfferReceipt');

var OfferReceiptFlow = /*#__PURE__*/function () {
  function OfferReceiptFlow(err, context, callback) {
    (0, _classCallCheck2["default"])(this, OfferReceiptFlow);
    this.err = err;
    this.context = context;
    this.callback = callback;
    Log.debug('Initializing Offer receipt flow');
  }

  (0, _createClass2["default"])(OfferReceiptFlow, [{
    key: "startFlow",
    value: function startFlow() {
      var _this = this;

      this.offerReceipt = new _flow["default"](this, [function deactivateFormFactorsOnReader(flow) {
        this.context.deactivateFormFactors([_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.EmvCertifiedContactless, _retailPaymentDevice.FormFactor.MagneticCardSwipe], function () {
          return flow.next();
        });
      }, new _ReceiptStep["default"](this.context).flowStep]);
      this.offerReceipt.data.error = this.err;
      this.offerReceipt.on('ended', function (data) {
        return _this.callback(data);
      });
      this.offerReceipt.start();
    }
  }]);
  return OfferReceiptFlow;
}();

exports["default"] = OfferReceiptFlow;

},{"../common/flow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/flow.js","./steps/ReceiptStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/ReceiptStep.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/OfflineDeclineFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _flow = _interopRequireDefault(require("../common/flow"));

var _ReceiptStep = _interopRequireDefault(require("./steps/ReceiptStep"));

var retailSDKUtils = _interopRequireWildcard(require("../common/retailSDKUtil"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

var Log = (0, _manticoreLog["default"])('flow.OfflineDeclineFlow');

var OfflineDeclineFlow = /*#__PURE__*/function () {
  function OfflineDeclineFlow(err, context, callback) {
    (0, _classCallCheck2["default"])(this, OfflineDeclineFlow);
    this.err = err;
    this.context = context;
    this.callback = callback;
    Log.debug('Initializing Offline Decline Flow');
  }

  (0, _createClass2["default"])(OfflineDeclineFlow, [{
    key: "startFlow",
    value: function startFlow() {
      var _this2 = this;

      this.cancellationFlow = new _flow["default"](this, [function saveInvoiceStep(flow) {
        var _this = this;

        this.context.invoice.isCancelled = retailSDKUtils.isTxCancelled(this.err);
        this.context.invoice.isFailed = true;
        this.context.invoice.save(function (e) {
          if (e) {
            Log.error('saveInvoiceFailed', {
              err: e,
              invoice: (0, _stringify["default"])(_this.context.invoice, null, 4)
            });
            flow.abortFlow(e);
            return;
          }

          flow.next();
        });
      }, new _ReceiptStep["default"](this.context).flowStep]);
      this.cancellationFlow.data.error = this.err;
      this.cancellationFlow.on('ended', function (data) {
        return _this2.callback(data);
      });
      this.cancellationFlow.on('aborted', function (data) {
        return _this2.abortedFlow(data);
      });
      this.cancellationFlow.start();
    }
  }, {
    key: "abortedFlow",
    value: function abortedFlow(data) {
      var err = data.error;

      if (!err) {
        return;
      }

      Log.warn('OfflineDeclineFlowAbortedWithErr', {
        err: err
      });
    }
  }]);
  return OfflineDeclineFlow;
}();

exports["default"] = OfflineDeclineFlow;

},{"../common/flow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/flow.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","./steps/ReceiptStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/ReceiptStep.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/OfflinePaymentFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _parseFloat2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-float"));

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticore = _interopRequireDefault(require("manticore"));

var _moment = _interopRequireDefault(require("moment"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _lodash = require("lodash");

var _BaseFlowAsync2 = _interopRequireDefault(require("./BaseFlowAsync"));

var _retailSDKUtil = require("../common/retailSDKUtil");

var _JoseCryptoMgr = _interopRequireDefault(require("../common/JoseCryptoMgr"));

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _SignatureStep = _interopRequireDefault(require("./steps/SignatureStep"));

var _ReceiptStep = _interopRequireDefault(require("./steps/ReceiptStep"));

var _l10n = _interopRequireDefault(require("../common/l10n"));

var messageHelper = _interopRequireWildcard(require("./messageHelper"));

var _OfflinePaymentStatus = _interopRequireDefault(require("../transaction/OfflinePaymentStatus"));

var _sdkErrors = require("../common/sdkErrors");

var _OfflineTransactionRecord = _interopRequireDefault(require("../transaction/OfflineTransactionRecord"));

var _TransactionBeginOptions = require("../transaction/TransactionBeginOptions");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.offlinePaymentFlow');

var OfflinePaymentFlow = /*#__PURE__*/function (_BaseFlowAsync) {
  (0, _inherits2["default"])(OfflinePaymentFlow, _BaseFlowAsync);

  var _super = _createSuper(OfflinePaymentFlow);

  function OfflinePaymentFlow(context, callback) {
    var _this;

    (0, _classCallCheck2["default"])(this, OfflinePaymentFlow);
    Log.debug('Initializing Offline Payment Flow');
    _this = _super.call(this);
    _this.card = context.card;
    _this.context = context;
    _this.completionCallback = callback;

    _this.start().then(function () {
      Log.debug('offline payment flow ended...');
    }, function (error) {
      Log.error("OfflinePaymentFlow failed with ".concat(error));
    });

    return _this;
  }

  (0, _createClass2["default"])(OfflinePaymentFlow, [{
    key: "start",
    value: function () {
      var _start = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
        var _this2 = this;

        return _regenerator["default"].wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                _context.prev = 0;
                _context.next = 3;
                return (0, _get2["default"])((0, _getPrototypeOf2["default"])(OfflinePaymentFlow.prototype), "setFlowSteps", this).call(this, 'OfflinePayment', [this._verifyOfflineTxn, this._validateCard, new _SignatureStep["default"](this.context).flowStep, new _ReceiptStep["default"](this.context).flowStep, this._saveOfflineTxnToStorage, this._saveItToOfflinePaymentList]);

              case 3:
                (0, _get2["default"])((0, _getPrototypeOf2["default"])(OfflinePaymentFlow.prototype), "addFlowEndedHandler", this).call(this, function (data) {
                  return _this2._completeOfflinePaymentFlow(data);
                });
                _context.next = 6;
                return (0, _get2["default"])((0, _getPrototypeOf2["default"])(OfflinePaymentFlow.prototype), "startFlow", this).call(this);

              case 6:
                _context.next = 11;
                break;

              case 8:
                _context.prev = 8;
                _context.t0 = _context["catch"](0);
                Log.error("OfflinePaymentStepsFlow failed with ".concat(_context.t0));

              case 11:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this, [[0, 8]]);
      }));

      function start() {
        return _start.apply(this, arguments);
      }

      return start;
    }()
  }, {
    key: "_validateCard",
    value: function () {
      var _validateCard2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(flow) {
        var _this3 = this;

        var alertOptions;
        return _regenerator["default"].wrap(function _callee3$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                Log.debug(function () {
                  return "Validating card for Offline Payments ".concat(_this3.card.cardIssuer);
                });

                if ((0, _retailSDKUtil.isCardValid)(this.card, this.context.merchant.country.toUpperCase())) {
                  _context4.next = 7;
                  break;
                }

                Log.debug('Card seems to be invalid');
                alertOptions = {
                  title: (0, _l10n["default"])('OfflinePayment.Check'),
                  message: (0, _l10n["default"])('OfflinePayment.Continue'),
                  buttons: [(0, _l10n["default"])('Ok'), (0, _l10n["default"])('Cancel')]
                };

                if (this.alert) {
                  // Dismiss any alert showing from before
                  this.alert.dismiss();
                }

                this.alert = _manticore["default"].alert(alertOptions, function (dialog, index) {
                  (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
                    return _regenerator["default"].wrap(function _callee2$(_context3) {
                      while (1) {
                        switch (_context3.prev = _context3.next) {
                          case 0:
                            if (_this3.alert) {
                              // Dismiss the invalid card and choice notification
                              _this3.alert.dismiss();
                            }

                            Log.debug(function () {
                              var _context2;

                              return (0, _concat["default"])(_context2 = "Button pressed : ".concat(index, " ")).call(_context2, (0, _stringify["default"])(dialog, null, 4));
                            });

                            if (!(index === 1)) {
                              _context3.next = 7;
                              break;
                            }

                            _context3.next = 5;
                            return _this3.abort(_retailPaymentDevice.deviceError.tryDifferentCard);

                          case 5:
                            _context3.next = 11;
                            break;

                          case 7:
                            if (!(index === 0)) {
                              _context3.next = 11;
                              break;
                            } // Ok is on index 0 in buttons array


                            _this3._createOfflineTxRecord(flow);

                            _context3.next = 11;
                            return flow.next();

                          case 11:
                          case "end":
                            return _context3.stop();
                        }
                      }
                    }, _callee2);
                  }))();
                });
                return _context4.abrupt("return");

              case 7:
                this._createOfflineTxRecord(flow);

                _context4.next = 10;
                return flow.next();

              case 10:
              case "end":
                return _context4.stop();
            }
          }
        }, _callee3, this);
      }));

      function _validateCard(_x) {
        return _validateCard2.apply(this, arguments);
      }

      return _validateCard;
    }()
  }, {
    key: "_createOfflineTxRecord",
    value: function _createOfflineTxRecord(flow) {
      var _this$context$invoice, _this$context$invoice2;

      flow.data.record = new _OfflineTransactionRecord["default"]();
      flow.data.record.card = this.card;
      flow.data.record.invoiceNumber = (_this$context$invoice = this.context.invoice) === null || _this$context$invoice === void 0 ? void 0 : _this$context$invoice.number;
      flow.data.record.amount = (_this$context$invoice2 = this.context.invoice) === null || _this$context$invoice2 === void 0 ? void 0 : _this$context$invoice2.total;
    }
  }, {
    key: "_verifyOfflineTxn",
    value: function () {
      var _verifyOfflineTxn2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(flow) {
        var _this4 = this;

        var values, alertOptions, txns, total, _values, _alertOptions;

        return _regenerator["default"].wrap(function _callee4$(_context7) {
          while (1) {
            switch (_context7.prev = _context7.next) {
              case 0:
                _context7.prev = 0;
                Log.debug(function () {
                  return "_verifyOfflineTxn -> invoice total: ".concat(_this4.context.invoice.total);
                });

                if (!(this.context.invoice.total > this.context.merchant.offlinePaymentPerTxnLimit)) {
                  _context7.next = 8;
                  break;
                }

                Log.debug(function () {
                  var _context5;

                  return (0, _concat["default"])(_context5 = "offline payment failed:  invoice total: ".concat(_this4.context.invoice.total, " > ")).call(_context5, _this4.context.merchant.offlinePaymentPerTxnLimit);
                });
                values = messageHelper.getSubstitutions(this.context, this.context.merchant.offlinePaymentPerTxnLimit);
                alertOptions = {
                  title: (0, _l10n["default"])('OfflinePayment.TxnAmountTooHigh.Title'),
                  message: (0, _l10n["default"])('OfflinePayment.TxnAmountTooHigh.Msg', values),
                  cancel: (0, _l10n["default"])('Ok')
                };
                this.alertAndAbort(alertOptions, _sdkErrors.transaction.offlineTxnLimit);
                return _context7.abrupt("return");

              case 8:
                _context7.next = 10;
                return (0, _retailSDKUtil.getOfflinePaymentListFromStorage)(_Merchant["default"].active);

              case 10:
                txns = _context7.sent;
                Log.debug(function () {
                  return "_verifyOfflineTxn -> offline txn: ".concat((0, _stringify["default"])(txns, null, 2));
                });

                if (!(txns && txns.length !== 0)) {
                  _context7.next = 21;
                  break;
                }

                total = _lodash._.add((0, _reduce["default"])(_lodash._).call(_lodash._, txns, function (sum, txn) {
                  return sum + (0, _parseFloat2["default"])(txn.amount);
                }, 0.0), this.context.invoice.total);
                Log.debug(function () {
                  return "_verifyOfflineTxn -> offline txn total: ".concat(total);
                });

                if (!(total > this.context.merchant.offlinePaymentTPVLimit)) {
                  _context7.next = 21;
                  break;
                }

                Log.debug(function () {
                  var _context6;

                  return (0, _concat["default"])(_context6 = "offline payment failed:  total: ".concat(total, " > ")).call(_context6, _this4.context.merchant.offlinePaymentTPVLimit);
                });
                _values = messageHelper.getSubstitutions(this.context, this.context.merchant.offlinePaymentTPVLimit);
                _alertOptions = {
                  title: (0, _l10n["default"])('OfflinePayment.TotalAmountTooHigh.Title'),
                  message: (0, _l10n["default"])('OfflinePayment.TotalAmountTooHigh.Msg', _values),
                  cancel: (0, _l10n["default"])('Ok')
                };
                this.alertAndAbort(_alertOptions, _sdkErrors.transaction.offlineTotalLimit);
                return _context7.abrupt("return");

              case 21:
                _context7.next = 28;
                break;

              case 23:
                _context7.prev = 23;
                _context7.t0 = _context7["catch"](0);
                _context7.next = 27;
                return this.abort(_context7.t0);

              case 27:
                return _context7.abrupt("return");

              case 28:
                _context7.next = 30;
                return flow.next();

              case 30:
              case "end":
                return _context7.stop();
            }
          }
        }, _callee4, this, [[0, 23]]);
      }));

      function _verifyOfflineTxn(_x2) {
        return _verifyOfflineTxn2.apply(this, arguments);
      }

      return _verifyOfflineTxn;
    }()
  }, {
    key: "alertAndAbort",
    value: function alertAndAbort(alertOptions, err) {
      var _this5 = this;

      if (this.alert) {
        this.alert.dismiss();
      }

      this.alert = _manticore["default"].alert(alertOptions, function () {
        if (_this5.alert) {
          _this5.alert.dismiss();
        }

        _this5.abort(err).then(function () {
          Log.debug('user clicked on OK button');
        });
      });
    }
  }, {
    key: "_saveOfflineTxnToStorage",
    value: function () {
      var _saveOfflineTxnToStorage2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(flow) {
        var _this6 = this;

        var location, mtpEncrypted;
        return _regenerator["default"].wrap(function _callee5$(_context8) {
          while (1) {
            switch (_context8.prev = _context8.next) {
              case 0:
                _context8.prev = 0;
                _context8.next = 3;
                return (0, _retailSDKUtil.getLocationAsync)();

              case 3:
                location = _context8.sent;
                Log.debug(function () {
                  return "location: '".concat((0, _stringify["default"])(location, null, 4), "'");
                });
                this.mtpRq = this._buildRequest(location, flow);
                Log.debug(function () {
                  return "MTP request: '".concat((0, _stringify["default"])(_this6.mtpRq, null, 4), "'");
                });
                Log.info(function () {
                  return "OfflinePayment: Merchant has made a store request with amount: offlineTransactionStoreAmount ".concat(_this6.context.invoice.total, ".");
                });
                _context8.next = 10;
                return _JoseCryptoMgr["default"].encrypt(this.mtpRq);

              case 10:
                mtpEncrypted = _context8.sent;
                Log.debug("mtpEncrypted: ".concat((0, _stringify["default"])(mtpEncrypted, null, 4)));
                _context8.next = 14;
                return (0, _retailSDKUtil.saveOfflineTxnToStorage)(mtpEncrypted);

              case 14:
                this.id = _context8.sent;

                if (flow.data.record) {
                  flow.data.record.id = this.id;
                }

                Log.debug(function () {
                  return "offlinePayment id : ".concat(_this6.id);
                });
                _context8.next = 26;
                break;

              case 19:
                _context8.prev = 19;
                _context8.t0 = _context8["catch"](0);
                Log.info(function () {
                  return "OfflinePayment: Store request failed with amount: offlineTransactionFailedStoreAmount ".concat(_this6.context.invoice.total, ".");
                });
                Log.debug(function () {
                  return "Saving to offline storage aborted: ".concat(_context8.t0);
                });
                _context8.next = 25;
                return this.abort(_context8.t0);

              case 25:
                return _context8.abrupt("return");

              case 26:
                _context8.next = 28;
                return flow.next();

              case 28:
              case "end":
                return _context8.stop();
            }
          }
        }, _callee5, this, [[0, 19]]);
      }));

      function _saveOfflineTxnToStorage(_x3) {
        return _saveOfflineTxnToStorage2.apply(this, arguments);
      }

      return _saveOfflineTxnToStorage;
    }()
  }, {
    key: "_saveItToOfflinePaymentList",
    value: function () {
      var _saveItToOfflinePaymentList2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(flow) {
        var statusInfo;
        return _regenerator["default"].wrap(function _callee6$(_context9) {
          while (1) {
            switch (_context9.prev = _context9.next) {
              case 0:
                _context9.prev = 0;
                statusInfo = new _OfflinePaymentStatus["default"](this.id, this.context, this.mtpRq);
                _context9.next = 4;
                return (0, _retailSDKUtil.saveOfflinePaymentInfoToListStorage)(statusInfo, _Merchant["default"].active);

              case 4:
                if (flow.data.record) {
                  flow.data.record.validUntil = statusInfo.expiry;
                }

                _context9.next = 12;
                break;

              case 7:
                _context9.prev = 7;
                _context9.t0 = _context9["catch"](0);
                _context9.next = 11;
                return this.abort(_context9.t0);

              case 11:
                return _context9.abrupt("return");

              case 12:
                _context9.next = 14;
                return flow.next();

              case 14:
              case "end":
                return _context9.stop();
            }
          }
        }, _callee6, this, [[0, 7]]);
      }));

      function _saveItToOfflinePaymentList(_x4) {
        return _saveItToOfflinePaymentList2.apply(this, arguments);
      }

      return _saveItToOfflinePaymentList;
    }()
  }, {
    key: "_buildRequest",
    value: function _buildRequest(location, _ref2) {
      var _this7 = this;

      var _ref2$data = _ref2.data,
          signature = _ref2$data.signature,
          receipt = _ref2$data.receipt;
      var request = {
        invoice: (0, _retailSDKUtil.convertToRetailInvoice)(this.context.invoice),
        paymentType: 'card',
        paymentRelayMethod: 'stored',
        latitude: location.latitude || 0,
        longitude: location.longitude || 0,
        dateTime: (0, _moment["default"])().format(),
        softDescriptor: _Merchant["default"].active.softDescriptor,
        storeId: _Merchant["default"].active.storeId,
        receipt: receipt,
        signature: signature
      };

      if (this.context.type === _retailPaymentDevice.TransactionType.Auth) {
        Log.debug(function () {
          return "".concat(_this7.context.id, " MTP setting the transaction type to AUTH, expiry & honor period");
        });
        request.paymentAction = 'authorization';

        if (_Merchant["default"].active.status && _Merchant["default"].active.status.cardSettings) {
          request.authExpiryPeriod = _Merchant["default"].active.status.cardSettings.authExpiryPeriod;
          request.authHonorPeriod = _Merchant["default"].active.status.cardSettings.authHonorPeriod;
        }
      }

      if (this.context.paymentType === _TransactionBeginOptions.PaymentTypes.card) {
        var card = (0, _retailSDKUtil.hereAPICardDataFromCard)(this.card, true);

        if (this.card.formFactor !== _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
          card.pinPresent = !!this.context.pinPresent;
        } // In hereApiCardDataFromCard(), the vendor, if Mirua, is being set to 'MIURA_FB_SWIPE'.
        // Which is not true, as we are only allowing magnetic swipes right now.
        // So we are checking manually here for Miura and setting the vendor.
        // TODO: Remove this if block and input type when we start allowing other form factors for offlinePayment. Defect: DE108731.


        if (this.card.reader.manufacturer === _retailPaymentDevice.deviceManufacturer.miura) {
          card.reader.vendor = 'MIURA';
        }

        card.inputType = 'swipe';
        card.signatureRequired = this.card.isSignatureRequired || false;
        request.dateTime = this.card.timestamp || request.dateTime;
        request.card = card;
      }

      return request;
    }
  }, {
    key: "abort",
    value: function () {
      var _abort = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(err) {
        return _regenerator["default"].wrap(function _callee7$(_context10) {
          while (1) {
            switch (_context10.prev = _context10.next) {
              case 0:
                Log.debug(function () {
                  return "abort with error: ".concat(err);
                });

                if (this.alert) {
                  this.alert.dismiss();
                  delete this.alert;
                }

                _context10.next = 4;
                return this.flow.abortFlow(err);

              case 4:
              case "end":
                return _context10.stop();
            }
          }
        }, _callee7, this);
      }));

      function abort(_x5) {
        return _abort.apply(this, arguments);
      }

      return abort;
    }()
  }, {
    key: "_completeOfflinePaymentFlow",
    value: function _completeOfflinePaymentFlow(data) {
      var _this8 = this;

      Log.debug(function () {
        var _context11;

        return (0, _concat["default"])(_context11 = "_completeOfflinePaymentFlow with id: ".concat(_this8.context.id, " and ")).call(_context11, (0, _stringify["default"])(data, null, 2));
      });

      if (this.alert) {
        this.alert.dismiss();
        delete this.alert;
      }

      this.completionCallback(data.error, null, data.record);
    }
  }]);
  return OfflinePaymentFlow;
}(_BaseFlowAsync2["default"]);

exports["default"] = OfflinePaymentFlow;

},{"../common/JoseCryptoMgr":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/JoseCryptoMgr.js","../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../transaction/OfflinePaymentStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/OfflinePaymentStatus.js","../transaction/OfflineTransactionRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/OfflineTransactionRecord.js","../transaction/TransactionBeginOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionBeginOptions.js","./BaseFlowAsync":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseFlowAsync.js","./messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./steps/ReceiptStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/ReceiptStep.js","./steps/SignatureStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/SignatureStep.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/parse-float":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/OfflinePaymentReplayFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _reduceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/reduce");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$create = require("@babel/runtime-corejs3/core-js-stable/object/create");

var _Symbol$replace = require("@babel/runtime-corejs3/core-js-stable/symbol/replace");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.constructor.js");

require("core-js/modules/es.regexp.to-string.js");

require("core-js/modules/es.string.replace.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.match.js");

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

var _setPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/setPrototypeOf"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticore = _interopRequireDefault(require("manticore"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreUtil = require("manticore-util");

var _BaseFlowAsync2 = _interopRequireDefault(require("./BaseFlowAsync"));

var _retailSDKUtil = require("../common/retailSDKUtil");

var _UpdateInvoicePaymentStep = _interopRequireDefault(require("./steps/UpdateInvoicePaymentStep"));

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _sdkErrors = require("../common/sdkErrors");

var _TransactionRecord = _interopRequireDefault(require("../transaction/TransactionRecord"));

var _l10n = _interopRequireDefault(require("../common/l10n"));

function _wrapRegExp() {
  _wrapRegExp = function _wrapRegExp(re, groups) {
    return new BabelRegExp(re, void 0, groups);
  };

  var _super = RegExp.prototype,
      _groups = new _WeakMap();

  function BabelRegExp(re, flags, groups) {
    var _this = new RegExp(re, flags);

    return _groups.set(_this, groups || _groups.get(re)), (0, _setPrototypeOf2["default"])(_this, BabelRegExp.prototype);
  }

  function buildGroups(result, re) {
    var _context12;

    var g = _groups.get(re);

    return _reduceInstanceProperty(_context12 = _Object$keys(g)).call(_context12, function (groups, name) {
      return groups[name] = result[g[name]], groups;
    }, _Object$create(null));
  }

  return (0, _inherits2["default"])(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (str) {
    var result = _super.exec.call(this, str);

    return result && (result.groups = buildGroups(result, this)), result;
  }, BabelRegExp.prototype[_Symbol$replace] = function (str, substitution) {
    if ("string" == typeof substitution) {
      var groups = _groups.get(this);

      return _super[_Symbol$replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
        return "$" + groups[name];
      }));
    }

    if ("function" == typeof substitution) {
      var _this = this;

      return _super[_Symbol$replace].call(this, str, function () {
        var args = arguments;
        return "object" != (0, _typeof2["default"])(args[args.length - 1]) && (args = _sliceInstanceProperty([]).call(args)).push(buildGroups(args, _this)), substitution.apply(this, args);
      });
    }

    return _super[_Symbol$replace].call(this, str, substitution);
  }, _wrapRegExp.apply(this, arguments);
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.offlinePaymentReplayFlow');

var OfflinePaymentReplayFlow = /*#__PURE__*/function (_BaseFlowAsync) {
  (0, _inherits2["default"])(OfflinePaymentReplayFlow, _BaseFlowAsync);

  var _super = _createSuper(OfflinePaymentReplayFlow);

  function OfflinePaymentReplayFlow(txnStatus, callback) {
    var _this;

    (0, _classCallCheck2["default"])(this, OfflinePaymentReplayFlow);
    Log.debug('Initializing Offline Payment Replay Flow');
    _this = _super.call(this, txnStatus, callback);
    _this.txnStatus = txnStatus;
    _this.invoice = txnStatus.invoice;
    _this.id = txnStatus.id;
    _this._showAlerts = false;
    _this.completionCallback = callback;
    return _this;
  }

  (0, _createClass2["default"])(OfflinePaymentReplayFlow, [{
    key: "start",
    value: function () {
      var _start = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
        var _this2 = this;

        return _regenerator["default"].wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                (0, _get2["default"])((0, _getPrototypeOf2["default"])(OfflinePaymentReplayFlow.prototype), "setFlowSteps", this).call(this, 'OfflinePaymentReplay', [this._createProcessingMessageStep, this._getOfflineTxnFromStorage, this._performMTP, this._createFinalizeMessageStep]).setCompletionSteps('Offline-Receipt', [new _UpdateInvoicePaymentStep["default"](this).flowStep], function (data) {
                  return _this2._completeOfflinePaymentFlow(data);
                });
                _context.next = 3;
                return (0, _get2["default"])((0, _getPrototypeOf2["default"])(OfflinePaymentReplayFlow.prototype), "startFlow", this).call(this);

              case 3:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function start() {
        return _start.apply(this, arguments);
      }

      return start;
    }()
  }, {
    key: "_getOfflineTxnFromStorage",
    value: function () {
      var _getOfflineTxnFromStorage2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(flow) {
        var offlineTxn;
        return _regenerator["default"].wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                Log.debug('getting offline txn');
                _context2.prev = 1;
                _context2.next = 4;
                return (0, _retailSDKUtil.getOfflineTxnFromStorage)(this.id);

              case 4:
                offlineTxn = _context2.sent;
                this.mtpRequest = offlineTxn.mtpRequest;
                _context2.next = 14;
                break;

              case 8:
                _context2.prev = 8;
                _context2.t0 = _context2["catch"](1);
                Log.warn("Aborting the offline payment flow with error : ".concat(_context2.t0, " "));
                _context2.next = 13;
                return this.abort(_context2.t0);

              case 13:
                return _context2.abrupt("return");

              case 14:
                _context2.next = 16;
                return flow.next();

              case 16:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this, [[1, 8]]);
      }));

      function _getOfflineTxnFromStorage(_x) {
        return _getOfflineTxnFromStorage2.apply(this, arguments);
      }

      return _getOfflineTxnFromStorage;
    }()
  }, {
    key: "_saveInvoiceToBackend",
    value: function () {
      var _saveInvoiceToBackend2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(flow) {
        var _this3 = this;

        var _context3, _context4;

        return _regenerator["default"].wrap(function _callee3$(_context5) {
          while (1) {
            switch (_context5.prev = _context5.next) {
              case 0:
                if (this.txnStatus.invoiceId) {
                  _context5.next = 14;
                  break;
                }

                _context5.prev = 1;
                _context5.next = 4;
                return (0, _manticoreUtil.callbackToPromise)((0, _bind["default"])(_context3 = this.invoice.save).call(_context3, this.invoice));

              case 4:
                Log.debug(function () {
                  return "Saved invoice successfully ".concat((0, _stringify["default"])(_this3.invoice, null, 4));
                });
                Log.debug(function () {
                  return "Saved invoice payPalId ".concat(_this3.invoice.payPalId);
                });
                _context5.next = 14;
                break;

              case 8:
                _context5.prev = 8;
                _context5.t0 = _context5["catch"](1);
                Log.error((0, _concat["default"])(_context4 = "Unable to save invoice. Error: ".concat(_context5.t0, "\n")).call(_context4, (0, _stringify["default"])(this.invoice, null, 4)));
                _context5.next = 13;
                return this.abort(_context5.t0);

              case 13:
                return _context5.abrupt("return");

              case 14:
                _context5.next = 16;
                return flow.next();

              case 16:
              case "end":
                return _context5.stop();
            }
          }
        }, _callee3, this, [[1, 8]]);
      }));

      function _saveInvoiceToBackend(_x2) {
        return _saveInvoiceToBackend2.apply(this, arguments);
      }

      return _saveInvoiceToBackend;
    }()
  }, {
    key: "_performMTP",
    value: function () {
      var _performMTP2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(flow) {
        var _this4 = this;

        var merchant, headers;
        return _regenerator["default"].wrap(function _callee4$(_context6) {
          while (1) {
            switch (_context6.prev = _context6.next) {
              case 0:
                merchant = _Merchant["default"].active;
                headers = this._buildRequestHeaders(merchant);
                Log.debug('Offline MTP request:', function () {
                  return {
                    request: _this4.mtpRequest,
                    headers: headers
                  };
                });
                merchant.request({
                  service: 'retail',
                  op: 'checkouts',
                  format: 'json',
                  method: 'POST',
                  headers: headers,
                  body: this.mtpRequest
                }, function (mtpError, mtpRz) {
                  Log.developer('Offline MTP Response', function () {
                    return {
                      error: mtpError,
                      response: mtpRz
                    };
                  }); // eslint-disable-next-line no-param-reassign

                  mtpError = (0, _sdkErrors.retailErrorFromResponse)('MTP', mtpError, mtpRz);
                  var body = mtpRz === null || mtpRz === void 0 ? void 0 : mtpRz.body;
                  flow.data.tx = body ? new _TransactionRecord["default"](body) : {};
                  flow.data.tx.invoiceId = flow.data.tx.invoiceId || _this4.mtpRequest.invoiceId;

                  if (mtpError) {
                    Log.error('MTP Error', {
                      id: _this4.id,
                      mtpError: mtpError,
                      formFactor: _retailPaymentDevice.FormFactor.MagneticCardSwipe,
                      currency: merchant.currency,
                      amount: _this4.txnStatus.amount,
                      responseStatus: mtpRz ? mtpRz.statusCode : 'empty',
                      responseBody: body
                    });
                  } else {
                    Log.info('Offline MTP response received', {
                      id: _this4.id,
                      currency: merchant.currency,
                      amount: _this4.txnStatus.amount,
                      AuthCode: body === null || body === void 0 ? void 0 : body.authCode,
                      flowDataTx: flow.data.tx
                    });
                  }

                  flow.nextOrAbort(mtpError);
                });

              case 4:
              case "end":
                return _context6.stop();
            }
          }
        }, _callee4, this);
      }));

      function _performMTP(_x3) {
        return _performMTP2.apply(this, arguments);
      }

      return _performMTP;
    }()
  }, {
    key: "_buildRequestHeaders",
    value: function _buildRequestHeaders(merchant) {
      var headers = {
        'Content-Type': 'application/jose'
      };

      if (merchant.pairingId) {
        headers['PayPal-Client-Metadata-Id'] = merchant.pairingId;
      }

      if (this.txnStatus.id) {
        var id = this.txnStatus.id.match( /*#__PURE__*/_wrapRegExp(/(OfflinePayment)\x2D(.*)/, {
          prefix: 1,
          id: 2
        })).groups.id;
        headers['PayPal-Request-Id'] = id;
      }

      return headers;
    }
  }, {
    key: "_createProcessingMessageStep",
    value: function () {
      var _createProcessingMessageStep2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(flow) {
        var alertOptions, alert;
        return _regenerator["default"].wrap(function _callee5$(_context7) {
          while (1) {
            switch (_context7.prev = _context7.next) {
              case 0:
                if (this._showAlerts) {
                  _context7.next = 4;
                  break;
                }

                _context7.next = 3;
                return flow.next();

              case 3:
                return _context7.abrupt("return");

              case 4:
                Log.debug('_createProcessingMessageStep');
                _context7.prev = 5;
                alertOptions = {
                  title: (0, _l10n["default"])('EMV.Processing'),
                  message: null,
                  showActivity: true,
                  replace: true,
                  audio: {
                    file: 'success_card_read.mp3'
                  }
                };

                if (this.alert) {
                  this.alert.dismiss();
                }

                alert = _manticore["default"].alert(alertOptions, function () {});
                this.alert = alert;
                _context7.next = 17;
                break;

              case 12:
                _context7.prev = 12;
                _context7.t0 = _context7["catch"](5);
                _context7.next = 16;
                return this.abort(_context7.t0);

              case 16:
                return _context7.abrupt("return");

              case 17:
                _context7.next = 19;
                return flow.next();

              case 19:
              case "end":
                return _context7.stop();
            }
          }
        }, _callee5, this, [[5, 12]]);
      }));

      function _createProcessingMessageStep(_x4) {
        return _createProcessingMessageStep2.apply(this, arguments);
      }

      return _createProcessingMessageStep;
    }()
  }, {
    key: "_createFinalizeMessageStep",
    value: function () {
      var _createFinalizeMessageStep2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(flow) {
        var _this5 = this;

        var merchant, amt, alertOptions;
        return _regenerator["default"].wrap(function _callee7$(_context9) {
          while (1) {
            switch (_context9.prev = _context9.next) {
              case 0:
                if (this._showAlerts) {
                  _context9.next = 4;
                  break;
                }

                _context9.next = 3;
                return flow.next();

              case 3:
                return _context9.abrupt("return");

              case 4:
                merchant = _Merchant["default"].active;
                amt = {
                  amount: (0, _retailSDKUtil.getAmountWithCurrencySymbol)(Number(this.txnStatus.amount), merchant.currency)
                };
                Log.debug('_createFinalizeMessageStep');
                _context9.prev = 7;
                alertOptions = {
                  title: (0, _l10n["default"])('OfflinePayment.Complete', amt),
                  message: null,
                  cancel: (0, _l10n["default"])('Ok')
                };

                if (this.alert) {
                  this.alert.dismiss();
                }

                this.alert = _manticore["default"].alert(alertOptions, /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
                  return _regenerator["default"].wrap(function _callee6$(_context8) {
                    while (1) {
                      switch (_context8.prev = _context8.next) {
                        case 0:
                          if (_this5.alert) {
                            _this5.alert.dismiss();
                          }

                          Log.debug('user clicked on OK button--00');
                          _context8.next = 4;
                          return flow.next();

                        case 4:
                        case "end":
                          return _context8.stop();
                      }
                    }
                  }, _callee6);
                })));
                _context9.next = 17;
                break;

              case 13:
                _context9.prev = 13;
                _context9.t0 = _context9["catch"](7);
                _context9.next = 17;
                return this.abort(_context9.t0);

              case 17:
              case "end":
                return _context9.stop();
            }
          }
        }, _callee7, this, [[7, 13]]);
      }));

      function _createFinalizeMessageStep(_x5) {
        return _createFinalizeMessageStep2.apply(this, arguments);
      }

      return _createFinalizeMessageStep;
    }()
  }, {
    key: "abort",
    value: function () {
      var _abort = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(err) {
        return _regenerator["default"].wrap(function _callee8$(_context10) {
          while (1) {
            switch (_context10.prev = _context10.next) {
              case 0:
                Log.debug(function () {
                  return "abort with error: ".concat(err);
                });

                if (this.alert) {
                  this.alert.dismiss();
                  delete this.alert;
                }

                _context10.next = 4;
                return this.flow.abortFlow(err);

              case 4:
              case "end":
                return _context10.stop();
            }
          }
        }, _callee8, this);
      }));

      function abort(_x6) {
        return _abort.apply(this, arguments);
      }

      return abort;
    }()
  }, {
    key: "_completeOfflinePaymentFlow",
    value: function _completeOfflinePaymentFlow(data) {
      var _this6 = this;

      Log.debug(function () {
        var _context11;

        return (0, _concat["default"])(_context11 = "_completeOfflinePaymentFlow with id: ".concat(_this6.id, " and ")).call(_context11, (0, _stringify["default"])(data));
      });

      if (this.alert) {
        this.alert.dismiss();
        delete this.alert;
      }

      this.completionCallback(data.error, data.tx);
    }
  }]);
  return OfflinePaymentReplayFlow;
}(_BaseFlowAsync2["default"]);

exports["default"] = OfflinePaymentReplayFlow;

},{"../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../transaction/TransactionRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionRecord.js","./BaseFlowAsync":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseFlowAsync.js","./steps/UpdateInvoicePaymentStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/UpdateInvoicePaymentStep.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/create.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/symbol/replace":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/replace.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/setPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/setPrototypeOf.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.constructor.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.constructor.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.match.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.match.js","core-js/modules/es.string.replace.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/PaymentErrorHandler.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _defineProperty3 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.array.iterator.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.promise.js");

require("core-js/modules/esnext.promise.all-settled.js");

require("core-js/modules/web.dom-collections.iterator.js");

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticore = _interopRequireDefault(require("manticore"));

var _isEmpty = _interopRequireDefault(require("ramda/src/isEmpty"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _paypalrestManticore = require("@paypalcorp/paypalrest-manticore");

var _manticoreUtil = require("manticore-util");

var _sdkErrors = require("../common/sdkErrors");

var messageHelper = _interopRequireWildcard(require("./messageHelper"));

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _transactionStates = require("../transaction/transactionStates");

var retailSDKUtil = _interopRequireWildcard(require("../common/retailSDKUtil"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context8, _context9;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context8 = ownKeys(Object(source), !0)).call(_context8, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context9 = ownKeys(Object(source))).call(_context9, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}

var Log = (0, _manticoreLog["default"])('flow.paymentErrorHandler');

var getDeviceMessages = function getDeviceMessages(transactionFlagName) {
  return [{
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message[transactionFlagName].Cancelled,
    deviceMessageRemoveCard: _retailPaymentDevice.PaymentDevice.Message[transactionFlagName].CancelledRemoveCard,
    equals: function equals(error) {
      var _context;

      return (0, _some["default"])(_context = [_retailPaymentDevice.deviceError.paymentCancelled, _sdkErrors.transaction.customerCancel, _retailPaymentDevice.deviceError.deviceNotConnected, _retailPaymentDevice.deviceError.generic, _retailPaymentDevice.deviceError.cancelReadCardData, _retailPaymentDevice.deviceError.smartCardNotInSlot]).call(_context, function (_payPalError) {
        return _payPalError.equals(error);
      });
    }
  }, {
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message.NfcDecline,
    equals: function equals(error) {
      return _sdkErrors.retail.nfcPaymentDeclined.equals(error);
    }
  }, {
    deviceMessage: undefined,
    equals: function equals(error) {
      var _context2;

      return (0, _some["default"])(_context2 = [_sdkErrors.transaction.multipleContactlessCardsDetected, _retailPaymentDevice.deviceError.lowOnBattery]).call(_context2, function (_payPalError) {
        return _payPalError.equals(error);
      });
    }
  }, {
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message.CannotSwipeChip,
    equals: function equals(error) {
      return _sdkErrors.transaction.cannotSwipeChipCard.equals(error);
    }
  }, {
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message.UnableToReadNfcCard,
    equals: function equals(error) {
      var _context3;

      return (0, _some["default"])(_context3 = [_sdkErrors.transaction.tryDifferentInterface, _retailPaymentDevice.deviceError.tryDifferentCard]).call(_context3, function (_payPalError) {
        return _payPalError.equals(error);
      });
    }
  }, {
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message.IncorrectPin,
    equals: function equals(error) {
      return _sdkErrors.retail.incorrectOnlinePin.equals(error);
    }
  }, {
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message.NetworkOffline,
    deviceMessageRemoveCard: _retailPaymentDevice.PaymentDevice.Message.NetworkOfflineRemoveCard,
    equals: retailSDKUtil.isNetworkOffline
  }, {
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message.ContactIssuer,
    deviceMessageRemoveCard: _retailPaymentDevice.PaymentDevice.Message.ContactIssuerRemoveCard,
    equals: function equals(error) {
      var _context4;

      return (0, _some["default"])(_context4 = [_retailPaymentDevice.deviceError.cardBlocked, _retailPaymentDevice.deviceError.contactIssuer, _sdkErrors.retail.contactIssuer, _sdkErrors.retail.onlinePinMaxRetryExceed]).call(_context4, function (_payPalError) {
        return _payPalError.equals(error);
      });
    }
  }, {
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message[transactionFlagName].Declined,
    deviceMessageRemoveCard: _retailPaymentDevice.PaymentDevice.Message[transactionFlagName].DeclinedRemoveCard,
    equals: retailSDKUtil.isHardDeclined
  }, {
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message.RefundCardMismatch,
    deviceMessageRemoveCard: _retailPaymentDevice.PaymentDevice.Message.RefundCardMismatchRemoveCard,
    equals: function equals(error) {
      return _sdkErrors.transaction.refundCardMismatch.equals(error);
    }
  }, {
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message.AmountTooHigh,
    deviceMessageRemoveCard: _retailPaymentDevice.PaymentDevice.Message.AmountTooHighRemoveCard,
    equals: function equals(error) {
      return _sdkErrors.transaction.amountTooHigh.equals(error);
    }
  }, {
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message.AmountTooLow,
    deviceMessageRemoveCard: _retailPaymentDevice.PaymentDevice.Message.AmountTooLowRemoveCard,
    equals: function equals(error) {
      return _sdkErrors.transaction.amountTooLow.equals(error);
    }
  }, {
    deviceMessage: _retailPaymentDevice.PaymentDevice.Message[transactionFlagName].Failed,
    deviceMessageRemoveCard: _retailPaymentDevice.PaymentDevice.Message[transactionFlagName].FailedRemoveCard,
    equals: function equals(error) {
      return !!error;
    }
  }];
};

function getDeviceMessagesByError(context, error) {
  var _context5;

  return (0, _find["default"])(_context5 = getDeviceMessages(context.getTransactionTypeFlagName())).call(_context5, function (message) {
    return message.equals(error);
  });
}
/**
 * The PaymentErrorHandler class is responsible for displaying appropriate alerts on the App and terminal based on
 * the errorCode and formFactor properties on the error object.
 */


var PaymentErrorHandler = /*#__PURE__*/function () {
  function PaymentErrorHandler(context) {
    var _nfcHandlersForDevice, _insertHandlersForDev, _commonHandlersForDev, _nfcHandlersForApiErr, _insertHandlersForApi, _multipleContactlessC, _commonHandlersForTra, _commonHandlersForNet, _networkHandlersForFF, _retailPaymentDevice$, _sdkErrors$domain$ret, _sdkErrors$domain$tra, _this$errorHandlers;

    var _this = this;

    (0, _classCallCheck2["default"])(this, PaymentErrorHandler);
    this.context = context;
    this.substitutions = messageHelper.getSubstitutions(this.context);
    this.l10n = messageHelper.l10nDefault(context);
    var action = PaymentErrorHandler.action,
        errors = PaymentErrorHandler.errors,
        displayMessage = PaymentErrorHandler.displayMessage;

    var nfcContactIssuer = function nfcContactIssuer(pd, error, cb) {
      if (_this.context.charityEnabled) {
        cb(action.abort);
      } else {
        _this.errorHandlerCompletion(pd, error, cb, action.abort, errors.blockedCardTapped, displayMessage.ok);
      }
    };

    var nfcHandlersForDeviceErrors = (_nfcHandlersForDevice = {}, (0, _defineProperty3["default"])(_nfcHandlersForDevice, _retailPaymentDevice.deviceError.nfcTimeout.code, function (pd, error, cb) {
      Log.debug(function () {
        return 'Received an NFC timeout. Retrying again.';
      });
      cb(action.retry);
    }), (0, _defineProperty3["default"])(_nfcHandlersForDevice, _retailPaymentDevice.deviceError.nfcNotAllowed.code, function (pd, error, cb) {
      if (_this.context.charityEnabled) {
        cb(action.abort);
      } else {
        _this._nfcPaymentDeclineErrorHandler(pd, function (performAction) {
          if (performAction === PaymentErrorHandler.action.retryWithInsertOrSwipe) {
            cb(performAction);
          } else {
            cb(action.offlineDecline);
          }
        });
      }
    }), (0, _defineProperty3["default"])(_nfcHandlersForDevice, _retailPaymentDevice.deviceError.tryDifferentCard.code, function (pd, error, cb) {
      if (_this.context.charityEnabled) {
        cb(action.abort);
      } else {
        var _cb = function _cb(_action) {
          return cb(_action, {
            overrideShowPromptInApp: true
          });
        };

        _this.errorHandlerCompletion(pd, error, _cb, action.retry, errors.tapDifferentCard, displayMessage.ok);
      }
    }), (0, _defineProperty3["default"])(_nfcHandlersForDevice, _retailPaymentDevice.deviceError.contactIssuer.code, nfcContactIssuer), (0, _defineProperty3["default"])(_nfcHandlersForDevice, _retailPaymentDevice.deviceError.seePhone.code, function (pd, error, cb) {
      var _cb = function _cb(_action) {
        return cb(_action, {
          title: _this.l10n('Tx.Alert.SeePhone.Title'),
          message: _this.l10n('Tx.Alert.SeePhone.Msg'),
          overrideShowPromptInApp: true
        });
      };

      _this.errorHandlerCompletion(pd, error, _cb, PaymentErrorHandler.action.retryWithNoChange);
    }), (0, _defineProperty3["default"])(_nfcHandlersForDevice, _retailPaymentDevice.deviceError.contactlessPaymentAbortedByCardInsert.code, PaymentErrorHandler._doNothing), (0, _defineProperty3["default"])(_nfcHandlersForDevice, _retailPaymentDevice.deviceError.contactlessPaymentAbortedByCardSwipe.code, PaymentErrorHandler._doNothing), _nfcHandlersForDevice);
    var insertHandlersForDeviceErrors = (_insertHandlersForDev = {}, (0, _defineProperty3["default"])(_insertHandlersForDev, _retailPaymentDevice.deviceError.cardBlocked.code, function (pd, error, cb) {
      return _this._insertContactIssuer(pd, error, cb, true);
    }), (0, _defineProperty3["default"])(_insertHandlersForDev, _retailPaymentDevice.deviceError.contactIssuer.code, function (pd, error, cb) {
      return _this._insertContactIssuer(pd, error, cb, true);
    }), (0, _defineProperty3["default"])(_insertHandlersForDev, _retailPaymentDevice.deviceError.smartCardNotInSlot.code, function (pd, error, cb) {
      var _cb = function _cb(_action) {
        pd.abortTransaction(_this.context);
        cb(_action);
      };

      _this.errorHandlerCompletion(pd, error, _cb, action.offlineDecline, errors.cardNotInSlot);
    }), (0, _defineProperty3["default"])(_insertHandlersForDev, _retailPaymentDevice.deviceError.lowOnBattery.code, function (pd, error, cb) {
      var _cb = function _cb(_action) {
        pd.disconnect();
        cb(_action);
      };

      _this.errorHandlerCompletion(undefined, error, _cb, action.abort, errors.lowBattery, displayMessage.cancel);
    }), (0, _defineProperty3["default"])(_insertHandlersForDev, _retailPaymentDevice.deviceError.invalidChip.code, function (pd, error, cb) {
      Log.debug(function () {
        return "Invalid chip card (Attempt: ".concat(_this.context.retryCountInvalidChip + 1, ")");
      });

      if (_this.context.retryCountInvalidChip >= _retailPaymentDevice.PaymentDevice.constant.InvalidChipRetryCount) {
        _this._updateDisplay(pd, _retailPaymentDevice.PaymentDevice.Message.ReadyForSwipePayment, _this._getAmountByError(error), {
          title: _this.l10n('Tx.Alert.ReadyForSwipeOnly.Title'),
          message: _this.l10n('Tx.Alert.ReadyForSwipeOnly.Msg'),
          imageIcon: 'img_emv_swipe',
          cancel: _this.l10n('Ok')
        }, function () {
          var _this$alert;

          return (_this$alert = _this.alert) === null || _this$alert === void 0 ? void 0 : _this$alert.dismiss();
        });

        _this.context.allowFallBackSwipe = true;

        _this.context.timeoutManager.startTimeoutMonitor('PaymentErrorHandler-retryWithSwipe-waitForCardRemoval-start', true);

        pd.waitForCardRemoval(function () {
          _this.context.timeoutManager.startTimeoutMonitor('PaymentErrorHandler-retryWithSwipe-waitForCardRemoval-end');

          cb(action.retryWithSwipe);
        });
        return;
      }

      _this.context.retryCountInvalidChip += 1;

      _this.context.timeoutManager.startTimeoutMonitor('PaymentErrorHandler-invalidChip-waitForCardRemoval-Start', true);

      var ids = pd.waitForCardRemoval(function () {
        _this.context.timeoutManager.startTimeoutMonitor('PaymentErrorHandler-invalidChip-waitForCardRemoval-end');

        cb(action.retryWithInsertOrSwipe, {
          overrideShowPromptInApp: true
        });
      });

      _this._updateDisplay(pd, _retailPaymentDevice.PaymentDevice.Message.InvalidChipCard, null, {
        title: _this.l10n('Tx.Alert.UnsuccessfulInsert.Title'),
        message: _this.l10n('Tx.Alert.UnsuccessfulInsert.Msg'),
        imageIcon: 'img_emv_insert',
        cancel: _this.l10n('Cancel')
      }, function () {
        _this.context.timeoutManager.startTimeoutMonitor('PaymentErrorHandler-invalidChip-updateDisplay');

        pd.stopWaitingForCardRemoval(ids);
        cb(action.abort);
      });
    }), _insertHandlersForDev);

    var swipeContactIssuer = function swipeContactIssuer(pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.abort, errors.blockedCardSwiped, displayMessage.ok);
    };

    var transactionFailedCB = function transactionFailedCB(pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.abort, errors.failed, displayMessage.ok);
    };

    var transactionCancelledCB = function transactionCancelledCB(pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.abort, errors.cancelled, displayMessage.done);
    };

    var swipeHandlersForDeviceErrors = (0, _defineProperty3["default"])({}, _retailPaymentDevice.deviceError.contactIssuer.code, swipeContactIssuer); // Handler for errors from payment device that apply to all card presentation types

    var commonHandlersForDeviceErrors = (_commonHandlersForDev = {}, (0, _defineProperty3["default"])(_commonHandlersForDev, _retailPaymentDevice.deviceError.mustSwipeCard.code, function (pd, error, cb) {
      _this._mustSwipeCardHandler(pd, cb);
    }), (0, _defineProperty3["default"])(_commonHandlersForDev, _retailPaymentDevice.deviceError.generic.code, function (pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.abort, errors.genericError, displayMessage.ok);
    }), (0, _defineProperty3["default"])(_commonHandlersForDev, _retailPaymentDevice.deviceError.badEmvData.code, transactionFailedCB), (0, _defineProperty3["default"])(_commonHandlersForDev, _retailPaymentDevice.deviceError.badSwipeData.code, transactionFailedCB), (0, _defineProperty3["default"])(_commonHandlersForDev, _retailPaymentDevice.deviceError.paymentCancelled.code, transactionCancelledCB), (0, _defineProperty3["default"])(_commonHandlersForDev, _retailPaymentDevice.deviceError.deviceNotConnected.code, transactionCancelledCB), (0, _defineProperty3["default"])(_commonHandlersForDev, _retailPaymentDevice.deviceError.cancelReadCardData.code, function (pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.offlineDecline, errors.cancelled, displayMessage.done);
    }), (0, _defineProperty3["default"])(_commonHandlersForDev, _retailPaymentDevice.deviceError.invalidCardData.code, function (pd, error, cb) {
      var _cb = function _cb(_action) {
        return cb(_action, {
          overrideShowPromptInApp: true
        });
      };

      _this.errorHandlerCompletion(pd, _retailPaymentDevice.deviceError.invalidCardData, _cb, action.retry, errors.tryDifferentCard, displayMessage.ok);
    }), _commonHandlersForDev);
    var nfcHandlersForApiErrors = (_nfcHandlersForApiErr = {}, (0, _defineProperty3["default"])(_nfcHandlersForApiErr, _sdkErrors.retail.nfcPaymentDeclined.code, function (pd, error, cb) {
      if (_this.context.charityEnabled) {
        cb(action.abort);
      } else {
        var _cb = function _cb(_action) {
          cb(_action, {
            showPrompt: false,
            syncInvoiceTotal: false,
            title: _this.l10n('Tx.Alert.NfcPaymentDeclined.Title'),
            message: _this.l10n('Tx.Alert.NfcPaymentDeclined.Msg'),
            overrideShowPromptInApp: true
          });
        };

        _this.errorHandlerCompletion(pd, error, _cb, action.retryWithInsertOrSwipe);
      }
    }), (0, _defineProperty3["default"])(_nfcHandlersForApiErr, _sdkErrors.retail.onlinePinMaxRetryExceed.code, nfcContactIssuer), (0, _defineProperty3["default"])(_nfcHandlersForApiErr, _sdkErrors.retail.contactIssuer.code, nfcContactIssuer), _nfcHandlersForApiErr);
    var insertHandlersForApiErrors = (_insertHandlersForApi = {}, (0, _defineProperty3["default"])(_insertHandlersForApi, _sdkErrors.retail.contactIssuer.code, function (pd, error, cb) {
      return _this._insertContactIssuer(pd, error, cb, false);
    }), (0, _defineProperty3["default"])(_insertHandlersForApi, _sdkErrors.retail.onlinePinMaxRetryExceed.code, function (pd, error, cb) {
      return _this._insertContactIssuer(pd, error, cb, false);
    }), _insertHandlersForApi);
    var swiperHandlersForApiErrors = (0, _defineProperty3["default"])({}, _sdkErrors.retail.contactIssuer.code, swipeContactIssuer);
    var commonHandlersForApiErrors = (0, _defineProperty3["default"])({}, _sdkErrors.retail.incorrectOnlinePin.code, function (pd, error, cb) {
      var _cb = function _cb(_action) {
        return cb(_action, {
          overrideShowPromptInApp: true
        });
      };

      _this.errorHandlerCompletion(pd, error, _cb, action.retry, errors.incorrectPin, displayMessage.ok);
    });
    var swipeHandlersForTransactionErrors = (0, _defineProperty3["default"])({}, _sdkErrors.transaction.cannotSwipeChipCard.code, function (pd, error, cb) {
      var _cb = function _cb(_action) {
        return cb(_action, {
          title: _this.l10n('Tx.Alert.ChipCardSwiped.Title'),
          message: _this.l10n('Tx.Alert.ChipCardSwiped.Msg'),
          overrideShowPromptInApp: true
        });
      };

      _this.errorHandlerCompletion(pd, error, _cb, PaymentErrorHandler.action.retryWithNoChange);
    });
    var multipleContactlessCardsDetectedForTransactionErrors = (_multipleContactlessC = {}, (0, _defineProperty3["default"])(_multipleContactlessC, _sdkErrors.transaction.multipleContactlessCardsDetected.code, function (pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.retry, errors.multipleContactlessCardsDetected, displayMessage.ok);
    }), (0, _defineProperty3["default"])(_multipleContactlessC, _sdkErrors.transaction.nfcContactlessLimitReached.code, function (pd, error, cb) {
      cb(action.retryWithInsertOrSwipe);

      var _cb = function _cb(_action) {
        return cb(_action, {
          overrideShowPromptInApp: true
        });
      };

      _this.errorHandlerCompletion(pd, error, _cb, action.retryWithDeactivation, errors.tapDifferentCard, displayMessage.ok);
    }), _multipleContactlessC); // Handlers that apply to all form of transactions (insert, tap & swipe)

    var commonHandlersForTransactionErrors = (_commonHandlersForTra = {}, (0, _defineProperty3["default"])(_commonHandlersForTra, _sdkErrors.transaction.mustSwipeCard.code, function (pd, error, cb) {
      return _this._mustSwipeCardHandler(pd, cb);
    }), (0, _defineProperty3["default"])(_commonHandlersForTra, _sdkErrors.transaction.amountTooLow.code, function (pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.abort, errors.amountTooLow, displayMessage.ok);
    }), (0, _defineProperty3["default"])(_commonHandlersForTra, _sdkErrors.transaction.amountTooHigh.code, function (pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.abort, errors.amountTooHigh, displayMessage.ok);
    }), (0, _defineProperty3["default"])(_commonHandlersForTra, _sdkErrors.transaction.refundCardMismatch.code, function (pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.abort, errors.refundCardMismatch, displayMessage.ok);
    }), (0, _defineProperty3["default"])(_commonHandlersForTra, _sdkErrors.transaction.cardRemovedBeforeRead.code, function (pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.abort, errors.cardRemovedBeforeRead, displayMessage.done);
    }), (0, _defineProperty3["default"])(_commonHandlersForTra, _sdkErrors.transaction.customerCancel.code, function (pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.abort, errors.cancelled, displayMessage.done);
    }), (0, _defineProperty3["default"])(_commonHandlersForTra, _sdkErrors.transaction.offlinePaymentKeyinNotAllowed.code, function (pd, error, cb) {
      return cb(action.abort);
    }), (0, _defineProperty3["default"])(_commonHandlersForTra, _sdkErrors.transaction.tryDifferentInterface.code, function (pd, error, cb) {
      _this._startListeningForPayments();

      var _cb = function _cb(_action) {
        return cb(_action, {
          overrideShowPromptInApp: true
        });
      };

      _this.errorHandlerCompletion(pd, error, _cb, action.retry, errors.tapDifferentCard, displayMessage.ok);
    }), _commonHandlersForTra);

    var networkOfflineCB = function networkOfflineCB(pd, error, cb) {
      _this.errorHandlerCompletion(pd, error, cb, action.abort, errors.networkOffline, displayMessage.ok);
    };

    var commonHandlersForNetworkErrors = (_commonHandlersForNet = {}, (0, _defineProperty3["default"])(_commonHandlersForNet, _paypalrestManticore.restError.unauthorized.code, networkOfflineCB), (0, _defineProperty3["default"])(_commonHandlersForNet, _paypalrestManticore.restError.networkOffline.code, networkOfflineCB), (0, _defineProperty3["default"])(_commonHandlersForNet, _paypalrestManticore.restError.untrustedNetwork.code, networkOfflineCB), (0, _defineProperty3["default"])(_commonHandlersForNet, _sdkErrors.network.networkOffline.code, networkOfflineCB), (0, _defineProperty3["default"])(_commonHandlersForNet, _sdkErrors.network.sslHandshakeFailed.code, networkOfflineCB), _commonHandlersForNet);
    var networkHandlersForFFs = (_networkHandlersForFF = {}, (0, _defineProperty3["default"])(_networkHandlersForFF, _retailPaymentDevice.FormFactor.None, commonHandlersForNetworkErrors), (0, _defineProperty3["default"])(_networkHandlersForFF, _retailPaymentDevice.FormFactor.EmvCertifiedContactless, commonHandlersForNetworkErrors), (0, _defineProperty3["default"])(_networkHandlersForFF, _retailPaymentDevice.FormFactor.Chip, commonHandlersForNetworkErrors), (0, _defineProperty3["default"])(_networkHandlersForFF, _retailPaymentDevice.FormFactor.MagneticCardSwipe, commonHandlersForNetworkErrors), _networkHandlersForFF);
    this.errorHandlers = (_this$errorHandlers = {}, (0, _defineProperty3["default"])(_this$errorHandlers, _retailPaymentDevice.deviceErrorDomain, (_retailPaymentDevice$ = {}, (0, _defineProperty3["default"])(_retailPaymentDevice$, _retailPaymentDevice.FormFactor.None, commonHandlersForDeviceErrors), (0, _defineProperty3["default"])(_retailPaymentDevice$, _retailPaymentDevice.FormFactor.EmvCertifiedContactless, (0, _manticoreUtil.extend)(nfcHandlersForDeviceErrors, commonHandlersForDeviceErrors)), (0, _defineProperty3["default"])(_retailPaymentDevice$, _retailPaymentDevice.FormFactor.Chip, (0, _manticoreUtil.extend)(insertHandlersForDeviceErrors, commonHandlersForDeviceErrors)), (0, _defineProperty3["default"])(_retailPaymentDevice$, _retailPaymentDevice.FormFactor.MagneticCardSwipe, (0, _manticoreUtil.extend)(swipeHandlersForDeviceErrors, commonHandlersForDeviceErrors)), _retailPaymentDevice$)), (0, _defineProperty3["default"])(_this$errorHandlers, _sdkErrors.domain.retail, (_sdkErrors$domain$ret = {}, (0, _defineProperty3["default"])(_sdkErrors$domain$ret, _retailPaymentDevice.FormFactor.None, commonHandlersForApiErrors), (0, _defineProperty3["default"])(_sdkErrors$domain$ret, _retailPaymentDevice.FormFactor.EmvCertifiedContactless, (0, _manticoreUtil.extend)(nfcHandlersForApiErrors, commonHandlersForApiErrors)), (0, _defineProperty3["default"])(_sdkErrors$domain$ret, _retailPaymentDevice.FormFactor.Chip, (0, _manticoreUtil.extend)(insertHandlersForApiErrors, commonHandlersForApiErrors)), (0, _defineProperty3["default"])(_sdkErrors$domain$ret, _retailPaymentDevice.FormFactor.MagneticCardSwipe, (0, _manticoreUtil.extend)(swiperHandlersForApiErrors, commonHandlersForApiErrors)), _sdkErrors$domain$ret)), (0, _defineProperty3["default"])(_this$errorHandlers, _sdkErrors.domain.transaction, (_sdkErrors$domain$tra = {}, (0, _defineProperty3["default"])(_sdkErrors$domain$tra, _retailPaymentDevice.FormFactor.None, commonHandlersForTransactionErrors), (0, _defineProperty3["default"])(_sdkErrors$domain$tra, _retailPaymentDevice.FormFactor.EmvCertifiedContactless, (0, _manticoreUtil.extend)(multipleContactlessCardsDetectedForTransactionErrors, commonHandlersForTransactionErrors)), (0, _defineProperty3["default"])(_sdkErrors$domain$tra, _retailPaymentDevice.FormFactor.Chip, commonHandlersForTransactionErrors), (0, _defineProperty3["default"])(_sdkErrors$domain$tra, _retailPaymentDevice.FormFactor.MagneticCardSwipe, (0, _manticoreUtil.extend)(swipeHandlersForTransactionErrors, commonHandlersForTransactionErrors)), (0, _defineProperty3["default"])(_sdkErrors$domain$tra, _retailPaymentDevice.FormFactor.ManualCardEntry, commonHandlersForTransactionErrors), _sdkErrors$domain$tra)), (0, _defineProperty3["default"])(_this$errorHandlers, _paypalrestManticore.paypalRestErrorDomain, networkHandlersForFFs), (0, _defineProperty3["default"])(_this$errorHandlers, _sdkErrors.domain.network, networkHandlersForFFs), _this$errorHandlers);
  }

  (0, _createClass2["default"])(PaymentErrorHandler, [{
    key: "_getAmountByError",
    value: function _getAmountByError(error) {
      if (_sdkErrors.transaction.amountTooLow.equals(error)) {
        return messageHelper.getSubstitutions(this.context, _Merchant["default"].active.cardSettings.minimum);
      }

      if (_sdkErrors.transaction.amountTooHigh.equals(error)) {
        return messageHelper.getSubstitutions(this.context, _Merchant["default"].active.cardSettings.maximum);
      }

      return this.substitutions;
    }
  }, {
    key: "errorHandlerCompletion",
    value: function errorHandlerCompletion(pd, error, cb, action, appMessageKey, alertButtonKey) {
      var _this2 = this;

      if (!error || this.context.charityEnabled) {
        Log.track('Ignore errorHandlerCompletion', function () {
          return {
            context: _this2.context,
            error: error,
            action: action,
            appMessageKey: appMessageKey,
            alertButtonKey: alertButtonKey
          };
        });
        cb(action);
        return;
      }

      var amount = this._getAmountByError(error);

      var _getDeviceMessagesByE = getDeviceMessagesByError(this.context, error),
          deviceMessage = _getDeviceMessagesByE.deviceMessage,
          deviceMessageRemoveCard = _getDeviceMessagesByE.deviceMessageRemoveCard;

      var pdDisplayMessage = deviceMessage;
      var shouldPromptCardRemoval = (pd === null || pd === void 0 ? void 0 : pd.isConnected()) && pd.cardInSlot;

      var appUpdateDisplay = _objectSpread(_objectSpread({}, appMessageKey ? {
        title: this.l10n("Tx.Alert.".concat(appMessageKey, ".Title")),
        message: this.l10n("Tx.Alert.".concat(appMessageKey, ".Msg"), amount)
      } : {}), alertButtonKey ? {
        cancel: this.l10n("".concat(alertButtonKey))
      } : {});

      if (shouldPromptCardRemoval) {
        appUpdateDisplay = this._cardInSlotHelper(pd, cb, action, appUpdateDisplay, pdDisplayMessage, amount);
        pdDisplayMessage = deviceMessageRemoveCard;
      }

      this._updateDisplay(pd, pdDisplayMessage, amount, appUpdateDisplay, function () {
        if (!shouldPromptCardRemoval) {
          cb(action);
        }
      });
    }
  }, {
    key: "_cardInSlotHelper",
    value: function _cardInSlotHelper(pd, cb, action, appUpdateDisplay, pdMessage, amount) {
      var _context6,
          _this3 = this;

      appUpdateDisplay.message = (0, _concat["default"])(_context6 = appUpdateDisplay.message).call(_context6, this.l10n(PaymentErrorHandler.displayMessage.removeCard));
      delete appUpdateDisplay.cancel;
      this.context.timeoutManager.startTimeoutMonitor('PaymentErrorHandler-cardInSlotHelper-waitForCardRemoval-start', true);
      pd.waitForCardRemoval(function () {
        var _this3$alert;

        _this3.context.timeoutManager.startTimeoutMonitor('PaymentErrorHandler-cardInSlotHelper-waitForCardRemoval-end');

        (_this3$alert = _this3.alert) === null || _this3$alert === void 0 ? void 0 : _this3$alert.dismiss();
        pd.display({
          id: _this3.l10n(pdMessage),
          substitutions: amount
        }, function () {
          return cb(action);
        });
      });
      return appUpdateDisplay;
    }
  }, {
    key: "_startListeningForPayments",
    value: function _startListeningForPayments() {
      var _this4 = this;

      Log.debug(function () {
        return "Will activate Chip & Swipe form factors for ".concat(_this4.context.id);
      });
      this.context.setPaymentState(_transactionStates.PaymentState.retry);
      this.context.deviceController.activate({
        showPrompt: false,
        formFactors: [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.MagneticCardSwipe],
        syncInvoiceTotal: false
      });
    }
  }, {
    key: "_mustSwipeCardHandler",
    value: function _mustSwipeCardHandler(pd, cb) {
      this._updateDisplay(pd, null, null, {
        title: this.l10n('Tx.Alert.ReadyForSwipeOnly.Title'),
        message: this.l10n('Tx.Alert.ReadyForSwipeOnly.Msg'),
        imageIcon: 'img_emv_swipe'
      });

      this.context.allowFallBackSwipe = true;
      cb(PaymentErrorHandler.action.retryWithSwipe);
    }
  }, {
    key: "_nfcPaymentDeclineErrorHandler",
    value: function _nfcPaymentDeclineErrorHandler(pd, cb) {
      this._updateDisplay(pd, _retailPaymentDevice.PaymentDevice.Message.NfcDecline, null, {
        title: this.l10n('Tx.Alert.NfcPaymentDeclined.Title'),
        message: this.l10n('Tx.Alert.NfcPaymentDeclined.Msg'),
        buttons: [this.l10n('Ok')],
        cancel: this.l10n('Cancel')
      }, function (a, ix) {
        if (ix === 0) {
          cb(PaymentErrorHandler.action.retryWithInsertOrSwipe, {
            overrideShowPromptInApp: true
          });
        } else {
          cb(PaymentErrorHandler.action.abort);
        }
      });
    }
  }, {
    key: "_insertContactIssuer",
    value: function _insertContactIssuer(pd, error, cb, isOffline) {
      var action = isOffline ? PaymentErrorHandler.action.offlineDecline : PaymentErrorHandler.action.abort;
      this.errorHandlerCompletion(pd, error, cb, action, PaymentErrorHandler.errors.blockedCard, PaymentErrorHandler.displayMessage.ok);
    }
    /**
     * Display alerts on the payment device and app
     */

  }, {
    key: "_updateDisplay",
    value: function _updateDisplay(pd, deviceMessageId, deviceMessageSubstitutions, alertOptions) {
      var _this5 = this,
          _context7;

      var cb = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function () {};

      var onDeviceDisplay = function onDeviceDisplay(finishPromiseCB) {
        var deviceDisplayCB = function deviceDisplayCB() {
          for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
            args[_key] = arguments[_key];
          }

          return finishPromiseCB(undefined, args);
        };

        if (!alertOptions || (0, _isEmpty["default"])(alertOptions)) {
          deviceDisplayCB();
          return;
        }

        _this5.alert = _manticore["default"].alert(alertOptions, function (a, ix) {
          var _this5$alert;

          (_this5$alert = _this5.alert) === null || _this5$alert === void 0 ? void 0 : _this5$alert.dismiss();
          deviceDisplayCB(a, ix);
        });

        if (!alertOptions.cancel && !alertOptions.buttons) {
          deviceDisplayCB(_this5.alert);
        }
      };

      var promises = pd !== null && pd !== void 0 && pd.isConnected() && deviceMessageId ? [(0, _manticoreUtil.callbackToPromise)(onDeviceDisplay), (0, _manticoreUtil.callbackToPromise)((0, _bind["default"])(_context7 = pd.display).call(_context7, pd), {
        id: deviceMessageId,
        substitutions: deviceMessageSubstitutions
      })] : [(0, _manticoreUtil.callbackToPromise)(onDeviceDisplay)];

      _promise["default"].allSettled(promises).then(function (_ref) {
        var _ref2 = (0, _slicedToArray2["default"])(_ref, 1),
            deviceDisplayStatus = _ref2[0];

        return cb.apply(void 0, (0, _toConsumableArray2["default"])(deviceDisplayStatus.value));
      });
    }
    /**
     * Handles payment errors by displaying appropriate alerts on the terminal and app side.
     * @param {PayPalError} error
     * @param formFactor
     * @param paymentDevice
     * @param cb Callback to invoke after the error was handled. A single parameter with value action.abort or
     *                  action.retry will be passed to the callback function.
     */

  }, {
    key: "handle",
    value: function handle(error, formFactor, paymentDevice, cb) {
      var _this$errorHandlers$e, _this$errorHandlers$e2;

      Log.debug('Handling error', {
        error: error,
        formFactor: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, formFactor),
        device: paymentDevice === null || paymentDevice === void 0 ? void 0 : paymentDevice.id
      });

      if (error.domain && formFactor !== undefined && (_this$errorHandlers$e = this.errorHandlers[error.domain]) !== null && _this$errorHandlers$e !== void 0 && (_this$errorHandlers$e2 = _this$errorHandlers$e[formFactor]) !== null && _this$errorHandlers$e2 !== void 0 && _this$errorHandlers$e2[error.code]) {
        var handler = this.errorHandlers[error.domain][formFactor][error.code];

        try {
          handler(paymentDevice, error, cb);
          return;
        } catch (err) {
          Log.error('executingHandlerErr', {
            handler: handler,
            error: error,
            err: err
          });
          throw err;
        }
      }

      Log.warn('handlersUndefined', {
        ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, formFactor),
        error: error
      });

      var _retailSDKUtil$getMsg = retailSDKUtil.getMsgsByError(this.context, error),
          paymentErrorHandlerMsg = _retailSDKUtil$getMsg.paymentErrorHandlerMsg;

      this.errorHandlerCompletion(paymentDevice, error, cb, PaymentErrorHandler.action.abort, paymentErrorHandlerMsg, PaymentErrorHandler.displayMessage.ok);
    }
  }], [{
    key: "_doNothing",
    value: function _doNothing(pd, error, cb) {
      cb(null);
    }
  }]);
  return PaymentErrorHandler;
}();
/**
 * Contains the list of actions PaymentErrorHandler class could request the caller of Handle function to perform
 * @type {{Abort: string, Retry: string}}
 * @package
 */


exports["default"] = PaymentErrorHandler;
PaymentErrorHandler.action = {
  offlineDecline: 'OfflineDecline',
  abort: 'abort',
  retry: 'retry',
  retryWithDeactivation: 'retryWithDeactivation',
  retryWithInsertOrSwipe: 'retryWithInsertOrSwipe',
  retryWithInsert: 'retryWithInsert',
  retryWithSwipe: 'retryWithSwipe',
  retryWithNoChange: 'retryWithNoChange'
};
PaymentErrorHandler.errors = _sdkErrors.PaymentErrorHandlerErrors;
PaymentErrorHandler.displayMessage = {
  ok: 'Ok',
  done: 'Done',
  cancel: 'Cancel',
  removeCard: 'RemoveCard',
  refundMessage: 'RefundMessage',
  paymentMessage: 'PaymentMessage'
};

},{"../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../transaction/transactionStates":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionStates.js","./messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/promise.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypalrest-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.array.iterator.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.array.iterator.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.promise.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.js","core-js/modules/esnext.promise.all-settled.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/esnext.promise.all-settled.js","core-js/modules/web.dom-collections.iterator.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.dom-collections.iterator.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js","ramda/src/isEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isEmpty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/PaymentFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var messageHelper = _interopRequireWildcard(require("./messageHelper"));

var _BaseTransactionFlow2 = _interopRequireDefault(require("./BaseTransactionFlow"));

var _MerchantTakePaymentStep = _interopRequireDefault(require("./steps/MerchantTakePaymentStep"));

var _UpdateInvoicePaymentStep = _interopRequireDefault(require("./steps/UpdateInvoicePaymentStep"));

var _ReceiptStep = _interopRequireDefault(require("./steps/ReceiptStep"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.paymentFlow');

var PaymentFlow = /*#__PURE__*/function (_BaseTransactionFlow) {
  (0, _inherits2["default"])(PaymentFlow, _BaseTransactionFlow);

  var _super = _createSuper(PaymentFlow);

  function PaymentFlow(context, callback) {
    var _thisSuper, _this;

    (0, _classCallCheck2["default"])(this, PaymentFlow);
    Log.debug('Initializing Payment Flow');
    _this = _super.call(this, context, callback);
    (0, _get2["default"])((_thisSuper = (0, _assertThisInitialized2["default"])(_this), (0, _getPrototypeOf2["default"])(PaymentFlow.prototype)), "setFlowSteps", _thisSuper).call(_thisSuper, 'Payment', [_this.createFlowMessageStep(messageHelper.showProcessingMessage), _this.saveInvoiceStep, new _MerchantTakePaymentStep["default"](context).flowStep, _this.createFlowMessageStep(messageHelper.showCompleteMessage)]).setCompletionSteps('Payment-Receipt', [new _UpdateInvoicePaymentStep["default"](context).flowStep, new _ReceiptStep["default"](_this.context).flowStep]).startFlow();
    return _this;
  }

  return (0, _createClass2["default"])(PaymentFlow);
}(_BaseTransactionFlow2["default"]);

exports["default"] = PaymentFlow;

},{"./BaseTransactionFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseTransactionFlow.js","./messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./steps/MerchantTakePaymentStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/MerchantTakePaymentStep.js","./steps/ReceiptStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/ReceiptStep.js","./steps/UpdateInvoicePaymentStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/UpdateInvoicePaymentStep.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/QuickChipCreditCardFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var messageHelper = _interopRequireWildcard(require("./messageHelper"));

var _BaseTransactionFlow2 = _interopRequireDefault(require("./BaseTransactionFlow"));

var _MerchantTakePaymentStep = _interopRequireDefault(require("./steps/MerchantTakePaymentStep"));

var _SignatureStep = _interopRequireDefault(require("./steps/SignatureStep"));

var _FinalizePaymentStep = _interopRequireDefault(require("./steps/FinalizePaymentStep"));

var _UpdateInvoicePaymentStep = _interopRequireDefault(require("./steps/UpdateInvoicePaymentStep"));

var _ReceiptStep = _interopRequireDefault(require("./steps/ReceiptStep"));

var _RemoveCardStep = _interopRequireDefault(require("./steps/RemoveCardStep"));

var _paymentDeviceUtils = require("../common/paymentDeviceUtils");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.QuickChipCreditCardFlow');
/**
 * This step is to handle Quick Chip Flow
 *
 * . Once the card data is read (QuickChipAction), send 'Z3' auth code to reader
 * . Send "Remove card" message to he reader (QuickChipAction)
 * . Remove cardRemoved listener
 * . Do not send the Auth code from server to reader (#MerchantTakePaymentStep)
 * . Change the message in Signature Step
 *
 */

var QuickChipCreditCardFlow = /*#__PURE__*/function (_BaseTransactionFlow) {
  (0, _inherits2["default"])(QuickChipCreditCardFlow, _BaseTransactionFlow);

  var _super = _createSuper(QuickChipCreditCardFlow);

  function QuickChipCreditCardFlow(context, callback) {
    var _thisSuper, _this;

    (0, _classCallCheck2["default"])(this, QuickChipCreditCardFlow);
    Log.debug('Initializing Quick Chip Credit Flow');
    _this = _super.call(this, context, callback);

    _this.handleQCRemoveCard = function () {
      if (!context.card.qcAuthSend) {
        _this.transactionCancelRequested();
      }
    };

    (0, _get2["default"])((_thisSuper = (0, _assertThisInitialized2["default"])(_this), (0, _getPrototypeOf2["default"])(QuickChipCreditCardFlow.prototype)), "setFlowSteps", _thisSuper).call(_thisSuper, 'QCCredit', [_paymentDeviceUtils.createAddPaymentCancelListenersStep, _this.createFlowMessageStep(messageHelper.showQCProcessing), _this.saveInvoiceStep, new _MerchantTakePaymentStep["default"](context, _this.voidPaymentIfApplicable).flowStep, _paymentDeviceUtils.createRemovePaymentCancelListenersStep, new _SignatureStep["default"](context).flowStep, _this.createFlowMessageStep(messageHelper.showFinalizeMessage), new _FinalizePaymentStep["default"](context).flowStep, new _RemoveCardStep["default"](context).flowStep, _this.deactivateFormFactorsStep, _this.createFlowMessageStep(messageHelper.showCompleteMessage)]).addFlowEndedHandler((0, _bind["default"])(_paymentDeviceUtils.removePaymentCancelListeners).call(_paymentDeviceUtils.removePaymentCancelListeners, (0, _assertThisInitialized2["default"])(_this))).setCompletionSteps('Credit-Receipt', [new _UpdateInvoicePaymentStep["default"](context).flowStep, new _ReceiptStep["default"](_this.context).flowStep]).startFlow();
    return _this;
  }

  return (0, _createClass2["default"])(QuickChipCreditCardFlow);
}(_BaseTransactionFlow2["default"]);

exports["default"] = QuickChipCreditCardFlow;

},{"../common/paymentDeviceUtils":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/paymentDeviceUtils.js","./BaseTransactionFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseTransactionFlow.js","./messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./steps/FinalizePaymentStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FinalizePaymentStep.js","./steps/MerchantTakePaymentStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/MerchantTakePaymentStep.js","./steps/ReceiptStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/ReceiptStep.js","./steps/RemoveCardStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/RemoveCardStep.js","./steps/SignatureStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/SignatureStep.js","./steps/UpdateInvoicePaymentStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/UpdateInvoicePaymentStep.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/ReaderTippingFlow.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.exec.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticore = _interopRequireDefault(require("manticore"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _BaseFlowAsync2 = _interopRequireDefault(require("./BaseFlowAsync"));

var _l10n = _interopRequireDefault(require("../common/l10n"));

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context14;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context14 = Object.prototype.toString.call(o)).call(_context14, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.ReaderTippingFlow');

var ReaderTippingFlow = /*#__PURE__*/function (_BaseFlowAsync) {
  (0, _inherits2["default"])(ReaderTippingFlow, _BaseFlowAsync);

  var _super = _createSuper(ReaderTippingFlow);

  function ReaderTippingFlow(device, amountBasedTip, invoice, callback) {
    var _this;

    (0, _classCallCheck2["default"])(this, ReaderTippingFlow);
    Log.debug('Initializing Tipping Flow');
    _this = _super.call(this);
    _this.device = device;
    _this.amountBasedTip = amountBasedTip;
    _this.invoice = invoice;
    _this.completionCallback = callback;
    return _this;
  }

  (0, _createClass2["default"])(ReaderTippingFlow, [{
    key: "start",
    value: function () {
      var _start = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
        var _this2 = this;

        return _regenerator["default"].wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                _context.next = 2;
                return (0, _get2["default"])((0, _getPrototypeOf2["default"])(ReaderTippingFlow.prototype), "setFlowSteps", this).call(this, 'Tipping', [this._stopBatteryPollStep, this._createFlowMessageStep, this._requestForTip, this._receiveTip, this._confirmTip]);

              case 2:
                (0, _get2["default"])((0, _getPrototypeOf2["default"])(ReaderTippingFlow.prototype), "addFlowEndedHandler", this).call(this, function () {
                  return _this2._completeTippingFlow();
                });
                _context.next = 5;
                return (0, _get2["default"])((0, _getPrototypeOf2["default"])(ReaderTippingFlow.prototype), "startFlow", this).call(this);

              case 5:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function start() {
        return _start.apply(this, arguments);
      }

      return start;
    }()
  }, {
    key: "_stopBatteryPollStep",
    value: function () {
      var _stopBatteryPollStep2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(flow) {
        return _regenerator["default"].wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                Log.debug('Stop polling for key in TippingOnReader');
                this.device.stopPollForBattery();
                _context2.next = 4;
                return flow.next();

              case 4:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function _stopBatteryPollStep(_x) {
        return _stopBatteryPollStep2.apply(this, arguments);
      }

      return _stopBatteryPollStep;
    }()
  }, {
    key: "_createFlowMessageStep",
    value: function () {
      var _createFlowMessageStep2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(flow) {
        var _this3 = this;

        var alertOpts;
        return _regenerator["default"].wrap(function _callee3$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                Log.debug('_createFlowMessageStep');
                _context3.prev = 1;
                alertOpts = {
                  title: (0, _l10n["default"])('EMV.Tip.Title'),
                  buttons: [(0, _l10n["default"])('EMV.Tip.Buttons.NoTip')]
                };
                this.alert = _manticore["default"].alert(alertOpts, function (a, ix) {
                  if (_this3.alert) {
                    _this3.alert.dismiss();
                  }

                  Log.debug('No Tip button pushed so aborting...');

                  if (ix === 0) {
                    // No Tip button
                    // clear any persisting transactions on the reader
                    _this3.device.abortTipping().then(function () {
                      return Log.debug('aborted tipping on the terminal');
                    })["catch"](function (err) {
                      Log.warn('failedToAbortTippingOnTerminal', {
                        err: err
                      });
                    });

                    _this3.abort();
                  }
                });
                _context3.next = 12;
                break;

              case 6:
                _context3.prev = 6;
                _context3.t0 = _context3["catch"](1);
                Log.warn('AbortingReaderTippingFlow', {
                  err: _context3.t0
                });
                _context3.next = 11;
                return this.abort(_context3.t0);

              case 11:
                return _context3.abrupt("return");

              case 12:
                _context3.next = 14;
                return flow.next();

              case 14:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee3, this, [[1, 6]]);
      }));

      function _createFlowMessageStep(_x2) {
        return _createFlowMessageStep2.apply(this, arguments);
      }

      return _createFlowMessageStep;
    }()
  }, {
    key: "_requestForTip",
    value: function () {
      var _requestForTip2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(flow) {
        return _regenerator["default"].wrap(function _callee4$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                Log.debug('Request Tip');
                _context4.prev = 1;
                _context4.next = 4;
                return this.device.requestForTip(this.invoice);

              case 4:
                _context4.next = 12;
                break;

              case 6:
                _context4.prev = 6;
                _context4.t0 = _context4["catch"](1);
                Log.warn('AbortingReaderTippingRequestForTipFlow', {
                  err: _context4.t0
                });
                _context4.next = 11;
                return this.abort(_context4.t0);

              case 11:
                return _context4.abrupt("return");

              case 12:
                _context4.next = 14;
                return this._registerKeyPressListeners(flow);

              case 14:
              case "end":
                return _context4.stop();
            }
          }
        }, _callee4, this, [[1, 6]]);
      }));

      function _requestForTip(_x3) {
        return _requestForTip2.apply(this, arguments);
      }

      return _requestForTip;
    }()
  }, {
    key: "_receiveTip",
    value: function () {
      var _receiveTip2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(flow) {
        var tip;
        return _regenerator["default"].wrap(function _callee5$(_context5) {
          while (1) {
            switch (_context5.prev = _context5.next) {
              case 0:
                Log.debug('Receiving Tip');
                tip = 0;
                _context5.prev = 2;
                _context5.next = 5;
                return this.device.promptForTip(this.amountBasedTip);

              case 5:
                tip = _context5.sent;
                _context5.next = 14;
                break;

              case 8:
                _context5.prev = 8;
                _context5.t0 = _context5["catch"](2);
                Log.warn('AbortingTippingFlowReceiveTip', {
                  err: _context5.t0,
                  tip: tip
                });
                _context5.next = 13;
                return this.abort(_context5.t0);

              case 13:
                return _context5.abrupt("return");

              case 14:
                if (tip) {
                  _context5.next = 19;
                  break;
                }

                Log.warn('AbortingTippingFlowReceiveTipWithFailedTip', {
                  tip: tip
                });
                _context5.next = 18;
                return this.abort();

              case 18:
                return _context5.abrupt("return");

              case 19:
                Log.info('TipReceived', {
                  tip: tip
                });

                if (this.amountBasedTip) {
                  this.invoice.gratuityAmount = tip;
                } else {
                  // percentage based tip
                  this.invoice.gratuityAmount = (tip * this.invoice.subTotal / 100).toFixed(2);
                }

                _context5.next = 23;
                return flow.next();

              case 23:
              case "end":
                return _context5.stop();
            }
          }
        }, _callee5, this, [[2, 8]]);
      }));

      function _receiveTip(_x4) {
        return _receiveTip2.apply(this, arguments);
      }

      return _receiveTip;
    }()
  }, {
    key: "_confirmTip",
    value: function () {
      var _confirmTip2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(flow) {
        return _regenerator["default"].wrap(function _callee6$(_context6) {
          while (1) {
            switch (_context6.prev = _context6.next) {
              case 0:
                Log.debug('Confirm Tip');
                _context6.prev = 1;
                flow.confirmTip = true;
                _context6.next = 5;
                return this.device.confirmTip(this.invoice);

              case 5:
                _context6.next = 13;
                break;

              case 7:
                _context6.prev = 7;
                _context6.t0 = _context6["catch"](1);
                Log.warn('AbortingReaderTippingConfirmTipFlow', {
                  err: _context6.t0
                });
                _context6.next = 12;
                return this.abort(_context6.t0);

              case 12:
                return _context6.abrupt("return");

              case 13:
                _context6.next = 15;
                return this._registerKeyPressListeners(flow);

              case 15:
              case "end":
                return _context6.stop();
            }
          }
        }, _callee6, this, [[1, 7]]);
      }));

      function _confirmTip(_x5) {
        return _confirmTip2.apply(this, arguments);
      }

      return _confirmTip;
    }()
  }, {
    key: "_registerKeyPressListeners",
    value: function () {
      var _registerKeyPressListeners2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(flow) {
        var _this4 = this;

        return _regenerator["default"].wrap(function _callee7$(_context7) {
          while (1) {
            switch (_context7.prev = _context7.next) {
              case 0:
                this.device.once(_retailPaymentDevice.PaymentDevice.Event.cancelRequested, function () {
                  return _this4._proceedWithFlow(flow, true);
                });
                this.device.once(_retailPaymentDevice.PaymentDevice.Event.proceed, function () {
                  return _this4._proceedWithFlow(flow, false);
                });

              case 2:
              case "end":
                return _context7.stop();
            }
          }
        }, _callee7, this);
      }));

      function _registerKeyPressListeners(_x6) {
        return _registerKeyPressListeners2.apply(this, arguments);
      }

      return _registerKeyPressListeners;
    }()
  }, {
    key: "_proceedWithFlow",
    value: function () {
      var _proceedWithFlow2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(flow, abort) {
        return _regenerator["default"].wrap(function _callee8$(_context8) {
          while (1) {
            switch (_context8.prev = _context8.next) {
              case 0:
                Log.debug('_proceedWithFlow');
                _context8.next = 3;
                return this._deRegisterKeyPressListeners();

              case 3:
                if (!abort) {
                  _context8.next = 16;
                  break;
                }

                if (!flow.confirmTip) {
                  _context8.next = 11;
                  break;
                }

                flow.confirmTip = false;
                Log.debug('confirmTip cancelled so going back');
                _context8.next = 9;
                return flow.back();

              case 9:
                _context8.next = 14;
                break;

              case 11:
                Log.debug('Tip Cancelled');
                _context8.next = 14;
                return this.abort();

              case 14:
                _context8.next = 18;
                break;

              case 16:
                _context8.next = 18;
                return flow.next();

              case 18:
              case "end":
                return _context8.stop();
            }
          }
        }, _callee8, this);
      }));

      function _proceedWithFlow(_x7, _x8) {
        return _proceedWithFlow2.apply(this, arguments);
      }

      return _proceedWithFlow;
    }()
  }, {
    key: "_deRegisterKeyPressListeners",
    value: function () {
      var _deRegisterKeyPressListeners2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
        return _regenerator["default"].wrap(function _callee9$(_context9) {
          while (1) {
            switch (_context9.prev = _context9.next) {
              case 0:
                _context9.next = 2;
                return this._removeListeners();

              case 2:
              case "end":
                return _context9.stop();
            }
          }
        }, _callee9, this);
      }));

      function _deRegisterKeyPressListeners() {
        return _deRegisterKeyPressListeners2.apply(this, arguments);
      }

      return _deRegisterKeyPressListeners;
    }()
  }, {
    key: "_removeListeners",
    value: function () {
      var _removeListeners2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
        var events, _i, _events, e, _iterator, _step, l;

        return _regenerator["default"].wrap(function _callee10$(_context10) {
          while (1) {
            switch (_context10.prev = _context10.next) {
              case 0:
                Log.debug('_removeListeners');
                events = [_retailPaymentDevice.PaymentDevice.Event.cancelRequested, _retailPaymentDevice.PaymentDevice.Event.proceed];

                for (_i = 0, _events = events; _i < _events.length; _i++) {
                  e = _events[_i];
                  _iterator = _createForOfIteratorHelper(this.device.listeners(e));

                  try {
                    for (_iterator.s(); !(_step = _iterator.n()).done;) {
                      l = _step.value;
                      this.device.removeListener(e, l);
                    }
                  } catch (err) {
                    _iterator.e(err);
                  } finally {
                    _iterator.f();
                  }
                }

              case 3:
              case "end":
                return _context10.stop();
            }
          }
        }, _callee10, this);
      }));

      function _removeListeners() {
        return _removeListeners2.apply(this, arguments);
      }

      return _removeListeners;
    }()
  }, {
    key: "abort",
    value: function () {
      var _abort = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(err) {
        return _regenerator["default"].wrap(function _callee11$(_context11) {
          while (1) {
            switch (_context11.prev = _context11.next) {
              case 0:
                Log.debug(function () {
                  return "abort with error: ".concat(err);
                });

                if (this.alert) {
                  this.alert.dismiss();
                  delete this.alert;
                }

                _context11.next = 4;
                return this._clearTip();

              case 4:
                _context11.next = 6;
                return this.flow.abortFlow(err);

              case 6:
              case "end":
                return _context11.stop();
            }
          }
        }, _callee11, this);
      }));

      function abort(_x9) {
        return _abort.apply(this, arguments);
      }

      return abort;
    }()
  }, {
    key: "_clearTip",
    value: function () {
      var _clearTip2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
        return _regenerator["default"].wrap(function _callee12$(_context12) {
          while (1) {
            switch (_context12.prev = _context12.next) {
              case 0:
                Log.debug('Tip Cleared');
                this.invoice.gratuityAmount = 0;

              case 2:
              case "end":
                return _context12.stop();
            }
          }
        }, _callee12, this);
      }));

      function _clearTip() {
        return _clearTip2.apply(this, arguments);
      }

      return _clearTip;
    }()
  }, {
    key: "_completeTippingFlow",
    value: function () {
      var _completeTippingFlow2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
        var _this5 = this;

        return _regenerator["default"].wrap(function _callee13$(_context13) {
          while (1) {
            switch (_context13.prev = _context13.next) {
              case 0:
                Log.debug(function () {
                  return "completeTippingFlow with tipAmount: ".concat(_this5.invoice.gratuityAmount);
                });

                if (this.alert) {
                  this.alert.dismiss();
                  delete this.alert;
                }

                _context13.next = 4;
                return this._removeListeners();

              case 4:
                Log.debug('Start polling for battery');
                _context13.next = 7;
                return this.device.startPollForBattery();

              case 7:
                this.completionCallback();

              case 8:
              case "end":
                return _context13.stop();
            }
          }
        }, _callee13, this);
      }));

      function _completeTippingFlow() {
        return _completeTippingFlow2.apply(this, arguments);
      }

      return _completeTippingFlow;
    }()
  }]);
  return ReaderTippingFlow;
}(_BaseFlowAsync2["default"]);

exports["default"] = ReaderTippingFlow;

},{"../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","./BaseFlowAsync":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseFlowAsync.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/VaultOnlyFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var messageHelper = _interopRequireWildcard(require("./messageHelper"));

var _BaseTransactionFlow2 = _interopRequireDefault(require("./BaseTransactionFlow"));

var _RemoveCardStep = _interopRequireDefault(require("./steps/RemoveCardStep"));

var _VaultStep = _interopRequireDefault(require("./steps/VaultStep"));

var _paymentDeviceUtils = require("../common/paymentDeviceUtils");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.vaultFlow');

var VaultOnlyFlow = /*#__PURE__*/function (_BaseTransactionFlow) {
  (0, _inherits2["default"])(VaultOnlyFlow, _BaseTransactionFlow);

  var _super = _createSuper(VaultOnlyFlow);

  function VaultOnlyFlow(context, callback) {
    var _thisSuper, _this;

    (0, _classCallCheck2["default"])(this, VaultOnlyFlow);
    Log.debug('Initializing Vault Flow');
    _this = _super.call(this, context, callback);
    (0, _get2["default"])((_thisSuper = (0, _assertThisInitialized2["default"])(_this), (0, _getPrototypeOf2["default"])(VaultOnlyFlow.prototype)), "setFlowSteps", _thisSuper).call(_thisSuper, 'Vault', [_paymentDeviceUtils.createAddPaymentCancelListenersStep, _this.createFlowMessageStep(messageHelper.showProcessingMessage), new _VaultStep["default"](context).flowStep, _this.createFlowMessageStep(messageHelper.showFinalizeMessage), _paymentDeviceUtils.createRemovePaymentCancelListenersStep, new _RemoveCardStep["default"](context).flowStep, _this.createFlowMessageStep(messageHelper.showCompleteMessage)]).addFlowEndedHandler((0, _bind["default"])(_paymentDeviceUtils.removePaymentCancelListeners).call(_paymentDeviceUtils.removePaymentCancelListeners, (0, _assertThisInitialized2["default"])(_this))).startFlow();
    return _this;
  }

  return (0, _createClass2["default"])(VaultOnlyFlow);
}(_BaseTransactionFlow2["default"]);

exports["default"] = VaultOnlyFlow;

},{"../common/paymentDeviceUtils":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/paymentDeviceUtils.js","./BaseTransactionFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseTransactionFlow.js","./messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./steps/RemoveCardStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/RemoveCardStep.js","./steps/VaultStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/VaultStep.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/VaultOnlyWithoutUiFlow.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _flow = _interopRequireDefault(require("../common/flow"));

var _VaultStep = _interopRequireDefault(require("./steps/VaultStep"));

var Log = (0, _manticoreLog["default"])('flow.VaultOnlyWithoutUiFlow');

var VaultOnlyWithoutUiFlow = /*#__PURE__*/function () {
  function VaultOnlyWithoutUiFlow(context, callback) {
    (0, _classCallCheck2["default"])(this, VaultOnlyWithoutUiFlow);
    this.card = context.card;
    this.context = context;
    this.callback = callback;
    Log.debug('Initializing VaultOnly without Ui flow');
    this.startFlow();
  }

  (0, _createClass2["default"])(VaultOnlyWithoutUiFlow, [{
    key: "startFlow",
    value: function startFlow() {
      var _this = this;

      this.vaultOnly = new _flow["default"](this, [new _VaultStep["default"](this.context).flowStep]);
      this.vaultOnly.on('ended', function (data) {
        return _this.callback(data.error, null, data.vault);
      });
      this.vaultOnly.start();
    }
  }]);
  return VaultOnlyWithoutUiFlow;
}();

exports["default"] = VaultOnlyWithoutUiFlow;

},{"../common/flow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/flow.js","./steps/VaultStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/VaultStep.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js":[function(require,module,exports){
"use strict";

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.exec.js");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.dismissMessage = dismissMessage;
exports.getSubstitutions = getSubstitutions;
exports.l10nDefault = void 0;
exports.readerDisplay = readerDisplay;
exports.showCompleteMessage = showCompleteMessage;
exports.showCompleteTransactionMessage = showCompleteTransactionMessage;
exports.showFinalizeMessage = showFinalizeMessage;
exports.showProcessingMessage = showProcessingMessage;
exports.showProcessingWithPinMessage = showProcessingWithPinMessage;
exports.showQCProcessing = showQCProcessing;
exports.showQCRemoveCard = showQCRemoveCard;
exports.showRefundProcessingMessage = showRefundProcessingMessage;
exports.showRemoveCardMessage = showRemoveCardMessage;
exports.showSelectApplicationPrompt = showSelectApplicationPrompt;
exports.showSimpleMessage = showSimpleMessage;

var _freeze = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/freeze"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _paypalrestManticore = require("@paypalcorp/paypalrest-manticore");

var _l10n2 = _interopRequireDefault(require("../common/l10n"));

var _EventSink = require("../EventSink");

var _retailSDKUtil = require("../common/retailSDKUtil");

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context3;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context3 = Object.prototype.toString.call(o)).call(_context3, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context, _context2;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}

var Log = (0, _manticoreLog["default"])('messageHelper');

function getSubstitutions(context, constantAmount) {
  if (context.isTransactionVaultOnly) {
    return _objectSpread({
      amount: ''
    }, (0, _retailSDKUtil.getTransactionTypeSubstitutions)(context));
  }

  var amount = context.isRefund() ? context.refundAmount : context.invoice.total;
  return _objectSpread({
    amount: (0, _retailSDKUtil.getAmountWithCurrencySymbol)(context.invoice.currency, constantAmount || amount)
  }, (0, _retailSDKUtil.getTransactionTypeSubstitutions)(context));
}

var l10nDefault = function l10nDefault(context) {
  var defaultSubstitution = getSubstitutions(context);
  return function (message, substitutions) {
    return (0, _l10n2["default"])(message, substitutions !== null && substitutions !== void 0 ? substitutions : defaultSubstitution);
  };
};

exports.l10nDefault = l10nDefault;

function displayOrReuseAlert(container, options) {
  // Q: Why container and not return?
  // A: Show doesn't work properly otherwise because of
  // https://medium.com/@naveenkarippai/learning-how-references-work-in-javascript-a066a4e15600
  if (!options.title && !options.message) {
    container.alert = (0, _freeze["default"])({
      isShowing: function isShowing() {
        return false;
      },
      show: function show() {},
      dismiss: function dismiss() {}
    });
    return;
  }

  var alert = {
    alert: _manticore["default"].alert(options, function () {})
  };
  var dismissIrrevocably = false;
  var alertWrapper = {
    isShowing: function isShowing() {
      var _alert$alert;

      return !!((_alert$alert = alert.alert) !== null && _alert$alert !== void 0 && _alert$alert.isShowing());
    },
    show: function show() {
      if (!dismissIrrevocably) {
        alertWrapper.dismiss(false);
        displayOrReuseAlert(container, options);
      }
    }
  };

  var messageHelperObservableSubscription = _EventSink.paypalRestMessageHelper$.subscribe({
    next: function next(event) {
      if (event === _paypalrestManticore.events.tokenExpired || event === _paypalrestManticore.events.handlingTokenExpiry) {
        Log.debug('On dismissAlerts'); // We don't want to use alertWrapper#dismiss because we don't want to unsubscribe from the events yet.

        alertWrapper === null || alertWrapper === void 0 ? void 0 : alertWrapper.hide();
      }

      if (event === _paypalrestManticore.events.resume) {
        Log.debug('On showAlerts'); // alertWrapper could have been deleted

        alertWrapper === null || alertWrapper === void 0 ? void 0 : alertWrapper.show();
      }

      if (event === _paypalrestManticore.events.end) {
        // If the IA calls quit on TokenExpirationHandler then we can dismiss the alert
        // and unsubscribe from any further events.
        alertWrapper === null || alertWrapper === void 0 ? void 0 : alertWrapper.dismiss();
      }
    }
  });

  alertWrapper.dismiss = function () {
    var _alert$alert2;

    var _dismissIrrevocably = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;

    dismissIrrevocably = _dismissIrrevocably;
    (_alert$alert2 = alert.alert) === null || _alert$alert2 === void 0 ? void 0 : _alert$alert2.dismiss();
    delete alert.alert;
    messageHelperObservableSubscription.unsubscribe();
  };

  alertWrapper.hide = function () {
    var _alert$alert3;

    (_alert$alert3 = alert.alert) === null || _alert$alert3 === void 0 ? void 0 : _alert$alert3.dismiss();
    delete alert.alert;
  };

  container.alert = (0, _freeze["default"])(alertWrapper);
}

function readerDisplay(context, messageId, substitutions) {
  var _context$card;

  var cb = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {};
  var displaySystemIcons = arguments.length > 4 ? arguments[4] : undefined;
  var reader = (_context$card = context.card) !== null && _context$card !== void 0 && _context$card.reader ? context.card.reader : context.deviceController.selectedDevice;

  if (reader) {
    reader.display({
      id: messageId,
      substitutions: substitutions,
      displaySystemIcons: displaySystemIcons
    }, cb);
  } else {
    cb();
  }
}

function showSimpleMessage(title, message, showActivity) {
  var flowData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
  displayOrReuseAlert(flowData, {
    title: title,
    message: message,
    showActivity: showActivity,
    replace: true
  });
  return flowData.alert;
}

function dismissMessage(context, flowData, cb) {
  if (flowData.alert) {
    flowData.alert.dismiss();
  }

  cb();
}

function showProcessingMessage(context, flowData, cb) {
  var _l10n = l10nDefault(context);

  var chip = context.card && context.card.formFactor === _retailPaymentDevice.FormFactor.Chip;
  var alertOptions = {
    title: chip ? _l10n('EMV.DoNotRemove') : _l10n('EMV.Processing'),
    message: chip ? _l10n('EMV.Processing') : null,
    showActivity: true,
    replace: true,
    audio: {
      file: 'success_card_read.mp3'
    }
  };
  var messageId = chip ? _retailPaymentDevice.PaymentDevice.Message.ProcessingContact : _retailPaymentDevice.PaymentDevice.Message.Processing;

  if (context.pinPresent) {
    alertOptions.message = chip ? _l10n('EMV.ProcessingPinOk') : _l10n('EMV.PinOk');
    messageId = chip ? _retailPaymentDevice.PaymentDevice.Message.ProcessingContactWithPin : _retailPaymentDevice.PaymentDevice.Message.ProcessingWithPin;
  }

  displayOrReuseAlert(flowData, alertOptions);
  var amount = getSubstitutions(context);

  if (context.isTransactionVaultOnly && chip) {
    messageId = _retailPaymentDevice.PaymentDevice.Message.Vault.ProcessingContact;
  }

  readerDisplay(context, messageId, amount, function () {
    return cb(flowData.alert);
  });
}

function showQCRemoveCard(context, flowData) {
  var _context$waitForCardR;

  var cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
  var transactionTypeFlagName = context.getTransactionTypeFlagName();
  var reader = context.card.reader;
  reader.stopWaitingForCardRemoval(context.waitForCardRemovalIds);
  context.timeoutManager.startTimeoutMonitor('MessageHelper-showQCRemoveCard-start', true);
  var ids = reader.waitForCardRemoval(function () {
    context.timeoutManager.startTimeoutMonitor('MessageHelper-showQCRemoveCard-end');
    readerDisplay(context, _retailPaymentDevice.PaymentDevice.Message[transactionTypeFlagName].ProcessingContact, getSubstitutions(context));
    cb();
  });

  (_context$waitForCardR = context.waitForCardRemovalIds).push.apply(_context$waitForCardR, (0, _toConsumableArray2["default"])(ids));

  readerDisplay(context, _retailPaymentDevice.PaymentDevice.Message[transactionTypeFlagName].ProcessingRemoveCard, getSubstitutions(context));
}

function getQCUIMessages(context) {
  var _l10n = l10nDefault(context);

  if (context.isQuickChipAmountKnown && context.card.reader.cardInSlot) {
    return {
      title: _l10n('EMV.QuickChip.RemoveCard'),
      message: _l10n('EMV.QuickChip.Processing')
    };
  }

  if (context.isQuickChipAmountKnown) {
    return {
      title: _l10n('EMV.QuickChip.Processing'),
      message: _l10n('EMV.QuickChip.EmptyTitle')
    };
  }

  return {};
}

function showQCProcessing(context, flowData) {
  var _context$alert, _flowData$alert;

  var cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};

  var showQCAlert = function showQCAlert() {
    return displayOrReuseAlert(flowData, _objectSpread(_objectSpread({}, getQCUIMessages(context)), {}, {
      showActivity: true,
      replace: true
    }));
  };

  (_context$alert = context.alert) === null || _context$alert === void 0 ? void 0 : _context$alert.dismiss();
  (_flowData$alert = flowData.alert) === null || _flowData$alert === void 0 ? void 0 : _flowData$alert.dismiss();
  showQCAlert();
  var transactionTypeFlagName = context.getTransactionTypeFlagName();

  if (context.card.reader.cardInSlot) {
    showQCRemoveCard(context, flowData, showQCAlert);
  } else {
    readerDisplay(context, _retailPaymentDevice.PaymentDevice.Message[transactionTypeFlagName].ProcessingContact, getSubstitutions(context));
  }

  cb();
}

function showProcessingWithPinMessage(context, flowData, cb) {
  readerDisplay(context, _retailPaymentDevice.PaymentDevice.Message.ProcessingWithPin, null, cb);
}

function showFinalizeMessage(context, flowData, cb) {
  var _l10n = l10nDefault(context); // Showing "Completing payment" dialog irrespective of payment type


  var appTitle = 'EMV.Finalize';
  var msgId = _retailPaymentDevice.PaymentDevice.Message.CompletingPayment;

  if (context.isTransactionVaultOnly) {
    appTitle = 'Vault.Finalize';
    msgId = _retailPaymentDevice.PaymentDevice.Message.Vault.Completing;
  }

  var alert = showSimpleMessage(_l10n(appTitle), null, true, flowData);
  readerDisplay(context, msgId, getSubstitutions(context), function () {
    return cb(alert);
  });
}

function showRefundProcessingMessage(context, flowData, cb) {
  var _l10n = l10nDefault(context);

  return cb(showSimpleMessage(_l10n('EMV.ProcessingRefund'), null, true, flowData));
}

function showRemoveCardMessage(context, flowData, cb) {
  var _l10n = l10nDefault(context);

  var appTitle = 'EMV.Complete';
  var appMessage = 'EMV.Remove';

  var messageId = _retailPaymentDevice.PaymentDevice.Message[context.getTransactionTypeFlagName()].RemoveCard;

  if (flowData.error || flowData.removeCard) {
    appTitle = 'EMV.Remove';
    appMessage = '';
  }

  if (context.isTransactionVaultOnly) {
    appTitle = 'Vault.Remove';
    appMessage = 'Vault.Complete';
  }

  var alert = showSimpleMessage(_l10n(appTitle), _l10n(appMessage), false, flowData);
  readerDisplay(context, messageId, getSubstitutions(context), function () {
    return cb(alert);
  });
}

function showCompleteTransactionMessage(context, cb) {
  readerDisplay(context, _retailPaymentDevice.PaymentDevice.Message.Auth.CompleteTransaction, '', function () {
    return cb();
  });
}

function showCompleteMessage(context, flowData, cb) {
  var amt = getSubstitutions(context);

  var messageId = _retailPaymentDevice.PaymentDevice.Message[context.getTransactionTypeFlagName()].Successful;

  readerDisplay(context, messageId, amt, function () {
    return cb(flowData);
  });
}

function showSelectApplicationPrompt(context, flowData, applicationPairs) {
  var cb = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {};

  var _l10n = l10nDefault(context);

  var buttons = [];

  var _iterator = _createForOfIteratorHelper(applicationPairs),
      _step;

  try {
    for (_iterator.s(); !(_step = _iterator.n()).done;) {
      var app = _step.value;
      buttons.push(app[1] || app[0]);
    }
  } catch (err) {
    _iterator.e(err);
  } finally {
    _iterator.f();
  }

  flowData.alert = _manticore["default"].alert({
    title: _l10n('EMV.Select'),
    buttons: buttons
  }, function (error, ix) {
    var applicationId = applicationPairs[ix][0];
    var applicationName = applicationPairs[ix][1];
    cb(applicationId, applicationName);
  });
  return flowData.alert;
}

},{"../EventSink":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/EventSink.js","../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/freeze":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/freeze.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypalrest-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/refundFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var messageHelper = _interopRequireWildcard(require("./messageHelper"));

var _UpdateInvoicePaymentStep = _interopRequireDefault(require("./steps/UpdateInvoicePaymentStep"));

var _BaseTransactionFlow2 = _interopRequireDefault(require("./BaseTransactionFlow"));

var _CheckRefundEligibilityStep = _interopRequireDefault(require("./steps/CheckRefundEligibilityStep"));

var _IssueRefundStep = _interopRequireDefault(require("./steps/IssueRefundStep"));

var _RemoveCardStep = _interopRequireDefault(require("./steps/RemoveCardStep"));

var _ReceiptStep = _interopRequireDefault(require("./steps/ReceiptStep"));

var _LoadInvoiceStep = _interopRequireDefault(require("./steps/LoadInvoiceStep"));

var _paymentDeviceUtils = require("../common/paymentDeviceUtils");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context, _context2;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.refundFlow');

var RefundFlow = /*#__PURE__*/function (_BaseTransactionFlow) {
  (0, _inherits2["default"])(RefundFlow, _BaseTransactionFlow);

  var _super = _createSuper(RefundFlow);

  function RefundFlow(context, callback) {
    var _thisSuper, _this;

    (0, _classCallCheck2["default"])(this, RefundFlow);
    Log.debug('Initializing Refund Flow');
    _this = _super.call(this, context, callback);
    (0, _get2["default"])((_thisSuper = (0, _assertThisInitialized2["default"])(_this), (0, _getPrototypeOf2["default"])(RefundFlow.prototype)), "setFlowSteps", _thisSuper).call(_thisSuper, 'Refund', [_paymentDeviceUtils.createAddPaymentCancelListenersStep, function endTransactionOnTerminal(flow) {
      if (this.card) {
        this.card.reader.abortTransaction(this.context, function () {
          return flow.next();
        });
      } else {
        flow.next();
      }
    }, _this.createFlowMessageStep(messageHelper.showProcessingMessage), new _CheckRefundEligibilityStep["default"](context).flowStep, _this.createFlowMessageStep(messageHelper.showRefundProcessingMessage), _paymentDeviceUtils.createRemovePaymentCancelListenersStep, new _LoadInvoiceStep["default"](context).flowStep, new _IssueRefundStep["default"](context).flowStep, new _RemoveCardStep["default"](context).flowStep, _this.deactivateFormFactorsStep, _this.createFlowMessageStep(messageHelper.showCompleteMessage)]).addFlowEndedHandler((0, _bind["default"])(_paymentDeviceUtils.removePaymentCancelListeners).call(_paymentDeviceUtils.removePaymentCancelListeners, (0, _assertThisInitialized2["default"])(_this))).setCompletionSteps('Refund-Receipt', [new _UpdateInvoicePaymentStep["default"](context).flowStep, new _ReceiptStep["default"](_this.context).flowStep]);
    var paymentToRefund = context.invoice.payments && context.invoice.payments[0];
    _this.flow.data.invoiceId = context.invoice.payPalId;
    Log.debug(function () {
      return 'PaymentToRefund:';
    }, _objectSpread(_objectSpread({}, paymentToRefund), {}, {
      actualRefundAmt: context.refundAmount
    }));

    if (paymentToRefund) {
      _this.flow.data.transactionNumber = paymentToRefund.transactionID;
      _this.flow.data.paymentMethod = paymentToRefund.method;
    }

    _this.startFlow();

    return _this;
  }

  return (0, _createClass2["default"])(RefundFlow);
}(_BaseTransactionFlow2["default"]);

exports["default"] = RefundFlow;

},{"../common/paymentDeviceUtils":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/paymentDeviceUtils.js","./BaseTransactionFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseTransactionFlow.js","./messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./steps/CheckRefundEligibilityStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/CheckRefundEligibilityStep.js","./steps/IssueRefundStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/IssueRefundStep.js","./steps/LoadInvoiceStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/LoadInvoiceStep.js","./steps/ReceiptStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/ReceiptStep.js","./steps/RemoveCardStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/RemoveCardStep.js","./steps/UpdateInvoicePaymentStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/UpdateInvoicePaymentStep.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/CaptureStep.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var messageHelper = _interopRequireWildcard(require("../messageHelper"));

var _CaptureHandler = _interopRequireDefault(require("../CaptureHandler"));

var _DeviceSelector = _interopRequireDefault(require("../../paymentDevice/DeviceSelector"));

var _l10n = _interopRequireDefault(require("../../common/l10n"));

var _captureManager = _interopRequireDefault(require("../../transaction/captureManager"));

var _sdkErrors = require("../../common/sdkErrors");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.captureStep');

var CaptureStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(CaptureStep, _FlowStep);

  var _super = _createSuper(CaptureStep);

  function CaptureStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, CaptureStep);
    _this = _super.call(this);
    _this.context = context;
    return _this;
  }

  (0, _createClass2["default"])(CaptureStep, [{
    key: "execute",
    value: function execute(flow) {
      var _flow$data$tx,
          _this2 = this;

      if (this.context.captureHandler && this.context.type === _retailPaymentDevice.TransactionType.Auth && (_flow$data$tx = flow.data.tx) !== null && _flow$data$tx !== void 0 && _flow$data$tx.transactionNumber) {
        var _DeviceSelector$selec;

        (_DeviceSelector$selec = _DeviceSelector["default"].selectedDevice) === null || _DeviceSelector$selec === void 0 ? void 0 : _DeviceSelector$selec.startPollForBattery();
        this.context.timeoutManager.startTimeoutMonitor('CaptureStepStart', true);
        var captureHandler = new _CaptureHandler["default"]();

        captureHandler.doCapture = function (gratuityAmount, signature) {
          var _DeviceSelector$selec2;

          (_DeviceSelector$selec2 = _DeviceSelector["default"].selectedDevice) === null || _DeviceSelector$selec2 === void 0 ? void 0 : _DeviceSelector$selec2.stopPollForBattery();

          _this2.context.timeoutManager.startTimeoutMonitor('CaptureStepEnd-doCapture');

          messageHelper.showSimpleMessage((0, _l10n["default"])('EMV.Processing'), null, true, flow.data);
          var invoice = _this2.context.invoice;
          var txRecord = flow.data.tx;

          var cb = function cb(error, captureId) {
            if (error) {
              flow.abortFlow(error);
            } else {
              messageHelper.readerDisplay(_this2.context, (0, _l10n["default"])('EMV.Complete'), messageHelper.getSubstitutions(_this2.context), function () {}, null);
              flow.data.tx.captureId = captureId;
              flow.next();
            }
          };

          invoice.gratuityAmount = gratuityAmount;
          Log.info('doCapture called', {
            total: invoice.total,
            tip: invoice.gratuityAmount
          });
          (0, _captureManager["default"])(txRecord.transactionNumber, txRecord.invoiceId, invoice.total, gratuityAmount, invoice.currency, signature, cb);
        };

        captureHandler.doVoid = function () {
          var _DeviceSelector$selec3;

          _this2.context.timeoutManager.startTimeoutMonitor('CaptureStepEnd-Void');

          (_DeviceSelector$selec3 = _DeviceSelector["default"].selectedDevice) === null || _DeviceSelector$selec3 === void 0 ? void 0 : _DeviceSelector$selec3.stopPollForBattery();
          Log.info('doVoid called'); // Manually adding the error codes so that the UpdateInvoicePaymentStep treats this as txn being cancelled.

          flow.abortFlow(flow.data.error || _sdkErrors.transaction.customerCancel);
        };

        messageHelper.showCompleteTransactionMessage(this.context, function () {
          _this2.context.captureHandler(flow.data.error, captureHandler, flow.data.tx);

          Log.debug('Invoking the capture handler.');
        });
      } else {
        flow.next();
      }
    }
  }]);
  return CaptureStep;
}(_FlowStep2["default"]);

exports["default"] = CaptureStep;

},{"../../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../../paymentDevice/DeviceSelector":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceSelector.js","../../transaction/captureManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/captureManager.js","../CaptureHandler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/CaptureHandler.js","../messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/CheckRefundEligibilityStep.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _moment = _interopRequireDefault(require("moment"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var _Merchant = _interopRequireDefault(require("../../common/Merchant"));

var retailSDKUtil = _interopRequireWildcard(require("../../common/retailSDKUtil"));

var _sdkErrors = require("../../common/sdkErrors");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.step.checkRefundEligibility');

var CheckRefundEligibilityFlowStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(CheckRefundEligibilityFlowStep, _FlowStep);

  var _super = _createSuper(CheckRefundEligibilityFlowStep);

  function CheckRefundEligibilityFlowStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, CheckRefundEligibilityFlowStep);
    _this = _super.call(this);
    _this.context = context;
    return _this;
  }

  (0, _createClass2["default"])(CheckRefundEligibilityFlowStep, [{
    key: "execute",
    value: function execute(flow) {
      var _rq$card$reader$vendo;

      if (!this.context.card) {
        flow.next();
        return;
      }

      if (flow.data.error) {
        Log.warn('SkipIssuingRefundReason:One/moreOfPreviousStepsLoggedAnError');
        flow.next();
        return;
      }

      var rq = this._buildRequest(flow);

      Log.debug(function () {
        return "this is the card data ".concat((0, _stringify["default"])(rq));
      }); // Legacy required vendor and input type adjustments for M010 refund swipe and fallback_swipe

      if (_retailPaymentDevice.deviceManufacturer[(_rq$card$reader$vendo = rq.card.reader.vendor) === null || _rq$card$reader$vendo === void 0 ? void 0 : _rq$card$reader$vendo.toLowerCase()] === _retailPaymentDevice.deviceManufacturer.miura) {
        if (rq.card.inputType === 'swipe') {
          rq.card.reader.vendor = 'MIURA_SWIPE';
        } else if (rq.card.inputType === 'fallback_swipe') {
          rq.card.reader.vendor = 'MIURA_FB_SWIPE';
          rq.card.inputType = 'swipe';
        }
      }

      _Merchant["default"].active.request({
        service: 'retail',
        op: "checkouts/".concat(flow.data.transactionNumber, "/validateCard"),
        format: 'json',
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: (0, _stringify["default"])(rq)
      }, function (error, refundResponse) {
        var actualError = null;

        if (!error && refundResponse.body && refundResponse.body.status !== 'ELIGIBLE') {
          actualError = _sdkErrors.transaction.refundCardMismatch;
        }

        flow.nextOrAbort(error || actualError);
      });
    }
  }, {
    key: "_buildRequest",
    value: function _buildRequest() {
      return {
        invoiceId: this.context.invoice.payPalId,
        dateTime: (0, _moment["default"])().format('YYYY-MM-DDTHH:mm:ssZZ'),
        card: retailSDKUtil.hereAPICardDataFromCard(this.context.card, true)
      };
    }
  }]);
  return CheckRefundEligibilityFlowStep;
}(_FlowStep2["default"]);

exports["default"] = CheckRefundEligibilityFlowStep;

},{"../../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/DigitalCardVoidStep.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var _Merchant = _interopRequireDefault(require("../../common/Merchant"));

var _TimeCard = _interopRequireDefault(require("../../transaction/TimeCard"));

var _sdkErrors = require("../../common/sdkErrors");

var _TransactionRecord = _interopRequireDefault(require("../../transaction/TransactionRecord"));

var _InstLogger = require("../../common/InstLogger");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.DigitalCardVoidStep');

var DigitalCardVoidStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(DigitalCardVoidStep, _FlowStep);

  var _super = _createSuper(DigitalCardVoidStep);

  function DigitalCardVoidStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, DigitalCardVoidStep);
    _this = _super.call(this);
    _this.context = context;
    return _this;
  }

  (0, _createClass2["default"])(DigitalCardVoidStep, [{
    key: "execute",
    value: function execute(flow) {
      var _this2 = this;

      Log.debug(function () {
        return "Trying to void invoice ".concat(_this2.context.invoice.payPalId);
      });
      var body = {
        invoiceId: this.context.invoice.payPalId,
        paymentAction: 'redemption'
      };
      var op = "checkouts/".concat(this.context.invoice.payPalId, "/void");
      Log.debug(function () {
        return "Digital Card void request:".concat((0, _stringify["default"])(body, null, 4));
      });
      this.context.timeCard.startTime(_TimeCard["default"].Events.voidCall);

      _Merchant["default"].active.request({
        service: 'retail',
        op: op,
        format: 'json',
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: (0, _stringify["default"])(body)
      }, function (err, voidRz) {
        _this2.context.timeCard.stopTime(_TimeCard["default"].Events.voidCall);

        var voidError = (0, _sdkErrors.retailErrorFromResponse)('DigitalCardVoid', err, voidRz);
        Log.debug('Void response received from API retail/checkouts/void');
        Log.developer(function () {
          return "Void response: ".concat((0, _stringify["default"])(voidRz, null, 4));
        });
        flow.data.tx = voidRz && voidRz.body ? new _TransactionRecord["default"](voidRz.body) : {};
        flow.data.tx.invoiceId = flow.data.tx.invoiceId || _this2.context.invoice.payPalId;

        _this2.context.trackGiftCardVoid(voidError, flow.data.tx);

        _this2._voidLocalInvoice(voidError);

        flow.nextOrAbort(voidError);
      });
    }
  }, {
    key: "_voidLocalInvoice",
    value: function _voidLocalInvoice(voidError) {
      var _this3 = this;

      if (!voidError) {
        this.context.isDigitalCardTrasnactionVoided = true;
        Log.instrument('TransactionCompleted', (0, _InstLogger.getTxContextTxEndInstrumentationEvent)(this.context));
        this.context.invoice.payments = [];
        Log.debug(function () {
          return "Invoice After VOID ".concat((0, _stringify["default"])(_this3.context.invoice));
        });
      }
    }
  }]);
  return DigitalCardVoidStep;
}(_FlowStep2["default"]);

exports["default"] = DigitalCardVoidStep;

},{"../../common/InstLogger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/InstLogger.js","../../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../../transaction/TimeCard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TimeCard.js","../../transaction/TransactionRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionRecord.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FinalizePaymentStep.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _sdkErrors = require("../../common/sdkErrors");

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var _Merchant = _interopRequireDefault(require("../../common/Merchant"));

var _TimeCard = _interopRequireDefault(require("../../transaction/TimeCard"));

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.step.mft');

var FinalizePaymentStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(FinalizePaymentStep, _FlowStep);

  var _super = _createSuper(FinalizePaymentStep);

  function FinalizePaymentStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, FinalizePaymentStep);
    _this = _super.call(this);
    _this.context = context;
    _this.isContaclessMSDTransaction = context.card.isContactlessMSD;
    return _this;
  }

  (0, _createClass2["default"])(FinalizePaymentStep, [{
    key: "execute",
    value: function execute(flow) {
      var _this2 = this;

      this.context.timeCard.startTime(_TimeCard["default"].Events.mftStep);

      if (flow.data.error) {
        Log.warn('SkippingFinalizePaymentReason:One/moreOfPreviousStepsLoggedAnError');
        flow.next();
        return;
      }

      if (!flow.data.signature) {
        if (!flow.data.cardResponse || this.isContaclessMSDTransaction) {
          Log.debug('Skipping Finalize payment', function () {
            return {
              isSignaturePresent: !!flow.data.signature,
              isCardResponsePresent: !!flow.data.cardResponse,
              isContaclessMSDTransaction: _this2.isContaclessMSDTransaction
            };
          });
          flow.next();
          return;
        }
      }

      var rq = this.buildRequest(flow);
      Log.debug(function () {
        return "MFT request:\n".concat((0, _stringify["default"])(rq, null, 4));
      });
      this.context.timeCard.startTime(_TimeCard["default"].Events.mftCall);

      _Merchant["default"].active.request({
        service: 'retail',
        op: "checkouts/".concat(flow.data.tx.transactionHandle),
        format: 'json',
        method: 'PUT',
        headers: {
          'Content-Type': 'application/json'
        },
        body: (0, _stringify["default"])(rq)
      }, function (err, finalizeRz) {
        _this2.context.timeCard.stopTime(_TimeCard["default"].Events.mftCall);

        var mftError = (0, _sdkErrors.retailErrorFromResponse)('MFT', err, finalizeRz);
        Log.debug('MFT', {
          response: finalizeRz,
          error: err,
          mftError: mftError
        });
        var sdkError = null;

        if (!finalizeRz || mftError) {
          Log.error('MFTErr', {
            currency: _this2.context.invoice.currency,
            total: _this2.context.invoice.total,
            err: mftError,
            resp: (0, _stringify["default"])(finalizeRz)
          });
          sdkError = mftError || _sdkErrors.network.requestFailed.withDevMessage('MFT empty response');
          flow.abortFlow(sdkError);
          return;
        }

        if (!finalizeRz.body) {
          flow.abortFlow(_sdkErrors.network.requestFailed);
          return;
        } // During the auth flow the MFT response doesn't have the payer info. It only comes as part of MTP response.


        flow.data.tx.updateFromFinalize(finalizeRz.body);
        Log.info('invoiceFinalizePaymentResp', {
          id: _this2.context.id,
          currency: _this2.context.invoice.currency,
          total: _this2.context.invoice.total,
          data: flow.data.tx.toString()
        });

        _this2.context.timeCard.stopTime(_TimeCard["default"].Events.mftStep);

        flow.next();
      });
    }
  }, {
    key: "buildRequest",
    value: function buildRequest(flow) {
      // TODO get the signature if available...
      var rq = {
        invoiceId: this.context.invoice.payPalId,
        orderId: this.context.orderId
      }; // For contactless msd transactions, we should not be sending the emv data. Otherwise, the backend would throw an invoice already paid error.

      if (flow.data.cardResponse && !this.isContaclessMSDTransaction) {
        rq.emvData = flow.data.cardResponse.apdu.data.toString('hex');
        rq.responseCode = flow.data.tx.responseCode;
      }

      if (flow.data.signature) {
        rq.signature = flow.data.signature.toString('utf-8');
      }

      return rq;
    }
  }]);
  return FinalizePaymentStep;
}(_FlowStep2["default"]);

exports["default"] = FinalizePaymentStep;

},{"../../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../../transaction/TimeCard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TimeCard.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var FlowStep = /*#__PURE__*/function () {
  function FlowStep() {
    (0, _classCallCheck2["default"])(this, FlowStep);
  }

  (0, _createClass2["default"])(FlowStep, [{
    key: "flowStep",
    get: function get() {
      var self = this;

      var stepFn = function stepFn(flow) {
        self.execute(flow);
      };

      stepFn.fnName = this.constructor.name;
      return stepFn;
    }
  }, {
    key: "execute",
    value: function execute() {
      throw new Error('FlowStep must define execute method.');
    }
  }]);
  return FlowStep;
}();

exports["default"] = FlowStep;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/IssueRefundStep.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _l10n = _interopRequireDefault(require("../../common/l10n"));

var _Merchant = _interopRequireDefault(require("../../common/Merchant"));

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var _TransactionRecord = _interopRequireDefault(require("../../transaction/TransactionRecord"));

var _sdkErrors = require("../../common/sdkErrors");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.step.issueRefund');

var IssueRefundStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(IssueRefundStep, _FlowStep);

  var _super = _createSuper(IssueRefundStep);

  function IssueRefundStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, IssueRefundStep);
    _this = _super.call(this);
    _this.context = context;
    return _this;
  }

  (0, _createClass2["default"])(IssueRefundStep, [{
    key: "execute",
    value: function execute(flow) {
      var _this2 = this;

      if (flow.data.error) {
        Log.warn('SkipIssuingRefundReason:One/moreOfPreviousStepsLoggedAnError');
        flow.next();
        return;
      }

      var merchant = _Merchant["default"].active;
      var service;
      var op;
      var rq;

      if (flow.data.paymentMethod === _paypalInvoicing.InvoiceEnums.PaymentMethod.CASH || flow.data.paymentMethod === _paypalInvoicing.InvoiceEnums.PaymentMethod.CHECK) {
        if (!flow.data.invoiceId) {
          Log.error('invoiceIdNotFoundForRefundSoAborting');
          flow.abortFlow(_sdkErrors.transaction.missingInvoiceId);
          return;
        }

        service = 'invoicing';
        op = "invoices/".concat(flow.data.invoiceId, "/record-refund");
        rq = {};
        Log.info('IssuingRefundForCheck/Cash', {
          invId: flow.data.invoiceId,
          amount: this.context.refundAmount
        });
      } else {
        if (!flow.data.transactionNumber && !flow.data.invoiceId) {
          Log.error('NoTxNumberOrInvoiceIdFoundAborting.');
          flow.abortFlow(_sdkErrors.transaction.missingTransactionNumberOrInvoiceId);
          return;
        }

        var usePayments = flow.data.transactionNumber;
        var refundId = flow.data.transactionNumber || flow.data.invoiceId;
        var idType = flow.data.transactionNumber ? 'TRANSACTION_ID' : 'INVOICE_ID';
        service = usePayments ? 'payments' : 'retail';
        op = usePayments ? "sale/".concat(flow.data.transactionNumber, "/refund") : "checkouts/".concat(refundId, "/refund");
        rq = this._buildRequest(merchant, usePayments ? null : idType);
        Log.info('IssuingRefund', {
          id: this.context.id,
          invId: flow.data.invoiceId,
          txnNum: flow.data.transactionNumber,
          usePayments: usePayments,
          amount: this.context.refundAmount
        });
      }

      merchant.request({
        service: service,
        op: op,
        format: 'json',
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: (0, _stringify["default"])(rq)
      }, function (error, refundRz) {
        _this2._processResult(flow, error, refundRz);
      });
    }
  }, {
    key: "_buildRequest",
    value: function _buildRequest(merchant, idType) {
      var rb = {
        is_non_platform_transaction: 'YES'
      };

      if (this.context.refundAmount) {
        rb.amount = {
          total: this.context.refundAmount,
          currency: merchant.currency
        };

        if (idType) {
          rb.payment_id_type = idType;
        }
      }

      return rb;
    }
  }, {
    key: "_processResult",
    value: function _processResult(flow, error, refundRz) {
      Log.debug(function () {
        return "Response from refund is ".concat((0, _stringify["default"])(refundRz, null, 4));
      });
      flow.data.tx = {};

      if (refundRz && refundRz.body) {
        flow.data.tx = new _TransactionRecord["default"](refundRz.body);
      } else if (flow.data.paymentMethod === _paypalInvoicing.InvoiceEnums.PaymentMethod.CASH || flow.data.paymentMethod === _paypalInvoicing.InvoiceEnums.PaymentMethod.CHECK) {
        // check/cash refund returns empty body
        flow.data.tx = new _TransactionRecord["default"]({
          invoiceId: flow.data.invoiceId
        });
      } else {
        Log.error('NeitherCardNorCash/CheckCase!CheckItOut!');
      }

      if (error) {
        error.message = (0, _l10n["default"])('Tx.RefundFailed');
      } else {
        Log.info('SuccessfullyRefunded', {
          id: this.context.id,
          txn: flow.data.tx
        });
      }

      flow.nextOrAbort(error);
    }
  }]);
  return IssueRefundStep;
}(_FlowStep2["default"]);

exports["default"] = IssueRefundStep;

},{"../../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../../transaction/TransactionRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionRecord.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/LoadInvoiceStep.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticoreUtil = require("manticore-util");

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var _Merchant = _interopRequireDefault(require("../../common/Merchant"));

var _sdkErrors = require("../../common/sdkErrors");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.step.loadInvoice');

function getInvoiceDetails(invoice) {
  Log.debug('getInvoiceDetails');

  if (invoice.payPalId) {
    var _context;

    Log.debug('getInvoiceDetails with invoiceId');
    return (0, _manticoreUtil.callbackToPromise)((0, _bind["default"])(_context = invoice.getDetails).call(_context, invoice));
  }

  return _promise["default"].reject(_sdkErrors.transaction.invoiceLoadFailed);
}

function getInvoiceNumberFromTransactionNumber(merchant, _transactionNumber) {
  Log.debug('getInvoiceNumberFromTransactionNumber with transactionNumber');

  if (merchant && _transactionNumber) {
    var _context2;

    return (0, _manticoreUtil.callbackToPromise)((0, _bind["default"])(_context2 = merchant.request).call(_context2, merchant), {
      service: 'payments',
      op: "sale/".concat(_transactionNumber)
    });
  }

  return _promise["default"].reject(_sdkErrors.transaction.missingTransactionNumberOrInvoiceId);
}

var LoadInvoiceStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(LoadInvoiceStep, _FlowStep);

  var _super = _createSuper(LoadInvoiceStep);

  function LoadInvoiceStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, LoadInvoiceStep);
    _this = _super.call(this);
    _this.context = context;
    return _this;
  }

  (0, _createClass2["default"])(LoadInvoiceStep, [{
    key: "flowStepLogic",
    value: function () {
      var _flowStepLogic = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(context, flow) {
        var invoiceNumberResponse;
        return _regenerator["default"].wrap(function _callee$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                _context3.prev = 0;

                if (context.invoice.payPalId) {
                  _context3.next = 6;
                  break;
                }

                _context3.next = 4;
                return getInvoiceNumberFromTransactionNumber(_Merchant["default"].active, flow.data.transactionNumber);

              case 4:
                invoiceNumberResponse = _context3.sent;
                context.invoice.payPalId = invoiceNumberResponse.invoice_number;
              // eslint-disable-line camelcase

              case 6:
                _context3.next = 8;
                return getInvoiceDetails(context.invoice);

              case 8:
                return _context3.abrupt("return", _promise["default"].resolve());

              case 11:
                _context3.prev = 11;
                _context3.t0 = _context3["catch"](0);
                Log.error('Error in loading invoice details', _context3.t0);
                return _context3.abrupt("return", _promise["default"].reject(_context3.t0));

              case 15:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee, null, [[0, 11]]);
      }));

      function flowStepLogic(_x, _x2) {
        return _flowStepLogic.apply(this, arguments);
      }

      return flowStepLogic;
    }()
  }, {
    key: "execute",
    value: function execute(flow) {
      this.flowStepLogic(this.context, flow).then(function () {
        return flow.next();
      })["catch"](function (error) {
        return flow.abortFlow(error);
      });
    }
  }]);
  return LoadInvoiceStep;
}(_FlowStep2["default"]);

exports["default"] = LoadInvoiceStep;

},{"../../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/promise.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/MerchantTakePaymentStep.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticore = _interopRequireDefault(require("manticore"));

var _moment = _interopRequireDefault(require("moment"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticoreUtil = require("manticore-util");

var _sdkErrors = require("../../common/sdkErrors");

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var _TransactionRecord = _interopRequireDefault(require("../../transaction/TransactionRecord"));

var retailSDKUtil = _interopRequireWildcard(require("../../common/retailSDKUtil"));

var _Merchant = _interopRequireDefault(require("../../common/Merchant"));

var _TimeCard = _interopRequireDefault(require("../../transaction/TimeCard"));

var _TransactionBeginOptions = require("../../transaction/TransactionBeginOptions");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.step.mtp');
var AuthCode = _retailPaymentDevice.PaymentDevice.authCode;

var MerchantTakePaymentStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(MerchantTakePaymentStep, _FlowStep);

  var _super = _createSuper(MerchantTakePaymentStep);

  function MerchantTakePaymentStep(context) {
    var _this;

    var voidFunc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
    (0, _classCallCheck2["default"])(this, MerchantTakePaymentStep);
    _this = _super.call(this);
    _this.context = context;
    _this.instrument = context.card;
    _this.voidFunc = voidFunc;
    _this.quickChipEnabled = context.quickChipEnabled;
    return _this;
  }

  (0, _createClass2["default"])(MerchantTakePaymentStep, [{
    key: "execute",
    value: function execute(flow) {
      var _this2 = this;

      this.context.timeCard.startTime(_TimeCard["default"].Events.mtpStep);

      if (this.context.paymentType === _TransactionBeginOptions.PaymentTypes.keyIn && !(this.instrument instanceof _retailPaymentDevice.ManuallyEnteredCard)) {
        flow.abortFlow(_sdkErrors.transaction.cardTypeMismatch.withDevMessage('Expected card to be of type ManuallyEnteredCard'));
        return;
      }

      this._getLocation(function (err, location) {
        if (err) {
          Log.error('retrievingLocationErr', {
            err: err
          });
          flow.abortFlow(_sdkErrors.transaction.locationError.withDevMessage('Error while retrieving location information.'));
          return;
        }

        Log.debug('Retrieved location information');
        Log.developer(function () {
          return "Retrieved location information : ".concat((0, _stringify["default"])(location));
        });
        flow.data.location = location;

        _this2._performMTP(flow);
      });
    }
  }, {
    key: "_performMTP",
    value: function _performMTP(flow) {
      var _this3 = this;

      var merchant = _Merchant["default"].active;

      var rq = this._buildRequest(flow.data.location);

      var headers = this._buildRequestHeaders(merchant);

      Log.debug('MTP request to : retail/checkouts');
      Log.developer(function () {
        return "MTP request :\n".concat((0, _stringify["default"])(rq, null, 4));
      });
      Log.debug(function () {
        return 'MTP request headers';
      }, headers);
      this.context.timeCard.startTime(_TimeCard["default"].Events.mtpCall);
      merchant.request({
        service: 'retail',
        op: 'checkouts',
        format: 'json',
        method: 'POST',
        headers: headers,
        body: (0, _stringify["default"])(rq)
      }, function (err, mtpRz) {
        var _mtpRz$body, _rq$card;

        _this3.context.timeCard.stopTime(_TimeCard["default"].Events.mtpCall);

        var mtpError = (0, _sdkErrors.retailErrorFromResponse)('MTP', err, mtpRz, merchant.softDescriptor);
        Log.debug('MTP response received from API retail/checkouts');
        Log.developer(function () {
          return "MTP response: ".concat((0, _stringify["default"])(mtpRz, null, 4));
        });
        flow.data.tx = mtpRz && mtpRz.body ? new _TransactionRecord["default"](mtpRz.body) : {};
        flow.data.tx.invoiceId = flow.data.tx.invoiceId || _this3.context.invoice.payPalId;
        flow.data.tx.card = _this3.context.card; // For all non card reader transactions, finish the flow and move on.

        if (_this3.context.paymentType !== _TransactionBeginOptions.PaymentTypes.card) {
          _this3.context.timeCard.stopTime(_TimeCard["default"].Events.mtpStep);

          flow.nextOrAbort(mtpError);
          return;
        }

        var mtpRzAuthCode = mtpRz !== null && mtpRz !== void 0 && (_mtpRz$body = mtpRz.body) !== null && _mtpRz$body !== void 0 && _mtpRz$body.authCode && mtpRz.body.authCode !== 'null' ? mtpRz.body.authCode : null;
        var isEmv = (rq === null || rq === void 0 ? void 0 : (_rq$card = rq.card) === null || _rq$card === void 0 ? void 0 : _rq$card.emvData) && (_this3.instrument.formFactor === _retailPaymentDevice.FormFactor.Chip || _this3.instrument.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless);

        if (mtpError) {
          Log.error('MTPErr', {
            currency: _this3.context.invoice.currency,
            total: _this3.context.invoice.total,
            ff: _this3.instrument.formFactor,
            isEmv: isEmv,
            err: (0, _stringify["default"])(mtpError),
            status: mtpRz ? mtpRz.statusCode : 'empty',
            resp: (0, _stringify["default"])(mtpRz ? mtpRz.body : {})
          });
        } else {
          Log.info('invoiceMTPResp', {
            id: _this3.context.id,
            currency: _this3.context.invoice.currency,
            total: _this3.context.invoice.total,
            ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, _this3.instrument.formFactor),
            authCode: mtpRz && mtpRz.body && mtpRz.body.authCode,
            tx: flow.data.tx.toString()
          });
        }

        _this3._processResult(isEmv, mtpRzAuthCode, flow, mtpError);
      });
    }
  }, {
    key: "_processResult",
    value: function _processResult(isEmv, rzAuthCode, flow, mtpError) {
      var _this4 = this;

      var cbStepComplete = function cbStepComplete(error, rz) {
        flow.data.cardResponse = rz; // If we encountered an error while waiting on an MTP response and it eventually succeeded then we need to void.

        if (flow.data.error) {
          Log.info('VoidingTxAsFlowWasAbortedWhenMTPRequestWasInFlight', {
            id: _this4.context.id,
            err: (0, _stringify["default"])(flow.data.error)
          });

          _this4.voidFunc(flow.data);

          return;
        }

        _this4.context.timeCard.stopTime(_TimeCard["default"].Events.mtpStep);

        flow.nextOrAbort(mtpError || error);
      };

      if (isEmv && !flow.data.error) {
        // For EMV, even if we don't get an auth code from the server, we need to make one so the card
        // can function correctly. So if we got an error, we can assume failure.
        // TODO really, we want to assume success?
        if (rzAuthCode) {
          // Before we go to the next step in the flow for EMV, we need to tell the card what we got from MTP
          flow.data.tx.authCode = rzAuthCode;
        } else {
          flow.data.tx.authCode = AuthCode.TransactionSuccess;

          if (mtpError) {
            flow.data.tx.authCode = mtpError.code === _sdkErrors.network.networkOffline.code || mtpError.code === _sdkErrors.network.sslHandshakeFailed.code ? AuthCode.NoNetwork : AuthCode.TransactionFailure;
          }
        }

        if (this.quickChipEnabled) {
          // use the same EMV data for Finalize Payment
          cbStepComplete(null, this.instrument.emvData);
        } else {
          this._pushAuthCode(flow.data.tx.authCode, cbStepComplete);
        }
      } else {
        cbStepComplete(null, null);
      }
    }
  }, {
    key: "_pushAuthCode",
    value: function _pushAuthCode(authCode, cb) {
      var _this5 = this; // Before we go to the next step in the flow for EMV, we need to tell the card what we got from MTP


      Log.debug('Pushing authCode', {
        authCode: authCode,
        readerId: this.instrument.reader.id
      });
      this.instrument.reader.completeTransaction(authCode, function (error, rz) {
        if (error) {
          Log.error('ErrRespOnPushingAuthCodeToTerminal', {
            id: _this5.context.id,
            err: error
          });
          cb(error, rz);
          return;
        }

        Log.info('authCodePushSuccessful', {
          id: _this5.context.id,
          authCode: authCode,
          crId: _this5.instrument.reader.id,
          template: rz.apdu ? rz.apdu.template : ''
        });
        cb(null, rz);
      });
    }
  }, {
    key: "_getLocation",
    value: function _getLocation(callback) {
      Log.debug('getLocation');

      _manticore["default"].getLocation(callback);
    }
  }, {
    key: "_buildRequestHeaders",
    value: function _buildRequestHeaders(merchant) {
      var headers = {
        'Content-Type': 'application/json'
      };

      if (merchant.pairingId) {
        headers['PayPal-Client-Metadata-Id'] = merchant.pairingId;
      }

      if (this.context.paymentOptions && this.context.paymentOptions.vaultCustomerId) {
        headers['PAYPAL-BRAINTREE-CUSTOMER-ID'] = this.context.paymentOptions.vaultCustomerId;
      }

      return headers;
    }
  }, {
    key: "paymentType",
    get: function get() {
      if (this.context.paymentType === _TransactionBeginOptions.PaymentTypes.digitalCard) {
        return 'digital_card';
      }

      if (this.context.paymentType === _TransactionBeginOptions.PaymentTypes.keyIn || this.context.paymentType === _TransactionBeginOptions.PaymentTypes.card) {
        return 'card';
      }

      if (this.context.paymentType === _TransactionBeginOptions.PaymentTypes.cash) {
        return 'cash';
      }

      if (this.context.paymentType === _TransactionBeginOptions.PaymentTypes.check) {
        return 'check';
      }

      return '';
    }
  }, {
    key: "_buildRequest",
    value: function _buildRequest(location) {
      var _this6 = this;

      var request = {
        invoiceId: this.context.invoice.payPalId,
        paymentType: this.paymentType,
        latitude: location.latitude || 0,
        longitude: location.longitude || 0,
        dateTime: (0, _moment["default"])().format(),
        softDescriptor: _Merchant["default"].active.softDescriptor,
        storeId: _Merchant["default"].active.storeId,
        orderId: this.context.orderId
      };

      if (this.context.type === _retailPaymentDevice.TransactionType.Auth) {
        var _Merchant$active$stat;

        Log.debug(function () {
          return "".concat(_this6.context.id, " MTP setting the transaction type to AUTH, expiry & honor period");
        });
        request.paymentAction = 'authorization';

        if ((_Merchant$active$stat = _Merchant["default"].active.status) !== null && _Merchant$active$stat !== void 0 && _Merchant$active$stat.cardSettings) {
          request.authExpiryPeriod = _Merchant["default"].active.status.cardSettings.authExpiryPeriod;
          request.authHonorPeriod = _Merchant["default"].active.status.cardSettings.authHonorPeriod;
        }
      }

      if (this.context.paymentType === _TransactionBeginOptions.PaymentTypes.digitalCard) {
        request.paymentAction = 'redemption';
        request.digitalCardInfo = {
          code: this.context.digitalCard.code
        };
      }

      if (this.context.paymentType === _TransactionBeginOptions.PaymentTypes.card) {
        var card = retailSDKUtil.hereAPICardDataFromCard(this.instrument, true);

        if (this.instrument.formFactor !== _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
          card.pinPresent = !!this.context.pinPresent;
        }

        card.signatureRequired = this.instrument.isSignatureRequired;
        request.dateTime = this.instrument.timestamp || request.dateTime;
        request.card = card;
      }

      if (this.context.paymentType === _TransactionBeginOptions.PaymentTypes.keyIn) {
        var expiration = this.instrument.getExpiration() || ''; // in format MMYYYY

        request.card = {
          inputType: 'keyIn',
          accountNumber: this.instrument.getCardNumber(),
          expirationMonth: expiration.substr(0, 2),
          expirationYear: expiration.substr(2, 4),
          cvv: this.instrument.getCVV(),
          postalCode: this.instrument.getPostalCode()
        };
      }

      return request;
    }
  }]);
  return MerchantTakePaymentStep;
}(_FlowStep2["default"]);

exports["default"] = MerchantTakePaymentStep;

},{"../../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../../transaction/TimeCard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TimeCard.js","../../transaction/TransactionBeginOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionBeginOptions.js","../../transaction/TransactionRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionRecord.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/ReceiptStep.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _defineProperty2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPageTracker = require("retail-page-tracker");

var _paypalrestManticore = require("@paypalcorp/paypalrest-manticore");

var _ReceiptViewContent = require("../../transaction/ReceiptViewContent");

var _l10n = _interopRequireDefault(require("../../common/l10n"));

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var _retailSDKUtil = require("../../common/retailSDKUtil");

var _Merchant = _interopRequireDefault(require("../../common/Merchant"));

var _sdkErrors = require("../../common/sdkErrors");

var _ReceiptDestination = require("../../transaction/ReceiptDestination");

var _TimeCard = _interopRequireDefault(require("../../transaction/TimeCard"));

var _transactionUtil = require("../../transaction/transactionUtil");

var _DeviceSelector = _interopRequireDefault(require("../../paymentDevice/DeviceSelector"));

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.step.receipt');

var ReceiptStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(ReceiptStep, _FlowStep);

  var _super = _createSuper(ReceiptStep);

  function ReceiptStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, ReceiptStep);
    _this = _super.call(this);
    _this.context = context;
    return _this;
  }

  (0, _createClass2["default"])(ReceiptStep, [{
    key: "execute",
    value: function execute(flow) {
      var _DeviceSelector$selec,
          _tx$payer,
          _tx$payer2,
          _this2 = this;

      (_DeviceSelector$selec = _DeviceSelector["default"].selectedDevice) === null || _DeviceSelector$selec === void 0 ? void 0 : _DeviceSelector$selec.startPollForBattery();
      this.context.timeCard.startTime(_TimeCard["default"].Events.receiptStep);

      if (flow.data.alert) {
        flow.data.alert.dismiss();
        delete flow.data.alert;
      }

      if (!flow.data.tx && !this.context.offlinePaymentEnabled) {
        Log.error('LostTxData!');
      } // Failures prior to payment/refund may not have the transaction record


      flow.data.tx = flow.data.tx || (0, _transactionUtil.getDefaultRecord)({
        paymentType: this.context.paymentType,
        offlinePaymentEnabled: this.context.offlinePaymentEnabled,
        enabledForVaultOnlyFlow: this.context.enabledForVaultOnlyFlow
      });
      var _this$context = this.context,
          switchToLightTheme = _this$context.switchToLightTheme,
          invoice = _this$context.invoice;
      var _flow$data = flow.data,
          tx = _flow$data.tx,
          error = _flow$data.error;

      if (tx.isPaymentIncomplete()) {
        flow.next();
        return;
      }

      var viewContent = new _ReceiptViewContent.ReceiptViewContent(this.context, error, tx === null || tx === void 0 ? void 0 : (_tx$payer = tx.payer) === null || _tx$payer === void 0 ? void 0 : _tx$payer.maskedEmail, tx === null || tx === void 0 ? void 0 : (_tx$payer2 = tx.payer) === null || _tx$payer2 === void 0 ? void 0 : _tx$payer2.maskedPhone, switchToLightTheme);
      Log.developer('Receipt flow data', {
        flowData: flow.data
      });
      Log.debug('Receipt view content', viewContent);
      flow.data.message = viewContent.receiptOptionsViewContent.message;

      if (this.context.skipReceipt || (error === null || error === void 0 ? void 0 : error.code) === _paypalrestManticore.restError.unauthorized.code) {
        Log.track('Skipping receipt step', {
          skipReceipt: this.context.skipReceipt,
          unauthorized: (error === null || error === void 0 ? void 0 : error.code) === _paypalrestManticore.restError.unauthorized.code
        });
        flow.next();
        return;
      }

      this.context.timeoutManager.startTimeoutMonitor('ReceiptStepStart', true);

      _manticore["default"].offerReceipt({
        invoice: invoice,
        error: flow.data.error,
        viewContent: viewContent
      }, function (err, option) {
        var cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};

        _this2.context.timeoutManager.startTimeoutMonitor('ReceiptStepEnd');

        if (option) {
          if (option.name === 'emailOrSms') {
            _this2._sendReceipt(flow, option.value, invoice, tx, cb);
          } else {
            Log.info('CustomReceiptOptionSelected', {
              id: _this2.context.id,
              value: option.value,
              name: option.name
            });

            if (_this2.context.receiptHandler) {
              _this2.context.receiptHandler(option.value, option.name, flow.data.tx);
            }

            _retailPageTracker.Tracker.publishPageView(null, _this2.context.isRefund() ? _retailPageTracker.pages.refundReceiptCustom.withAction(option.name) : _retailPageTracker.pages.paymentReceiptCustom.withAction(option.name));

            cb();

            _this2.context.timeCard.stopTime(_TimeCard["default"].Events.receiptStep);

            flow.next();
          }
        } else {
          _retailPageTracker.Tracker.publishPageView(null, _this2.context.isRefund() ? _retailPageTracker.pages.refundReceiptNoThanks : _retailPageTracker.pages.paymentReceiptNoThanks);

          Log.debug(function () {
            return "Email/SMS receipt forwarding not required. Skipping receipt step. Native response: ".concat(option);
          });
          cb();

          _this2.context.timeCard.stopTime(_TimeCard["default"].Events.receiptStep);

          flow.next();
        }
      });
    }
  }, {
    key: "_sendReceipt",
    value: function _sendReceipt(flow, emailOrSms, invoice, tx) {
      var _tx$payer3,
          _tx$payer4,
          _this3 = this;

      var cb = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function () {};
      Log.debug('Forward receipt to ', {
        emailOrSms: emailOrSms
      });

      var alert = _manticore["default"].alert({
        showActivity: true,
        title: (0, _l10n["default"])('Rcpt.Sending')
      }, function () {// TODO add cancel button support.
      });

      var txNumber = tx && (tx.transactionHandle || tx.transactionNumber) || flow.data.transactionNumber;

      var txType = this._transactionType(flow);

      var customerId = tx === null || tx === void 0 ? void 0 : (_tx$payer3 = tx.payer) === null || _tx$payer3 === void 0 ? void 0 : _tx$payer3.customerId;
      var receiptPreferenceToken = tx === null || tx === void 0 ? void 0 : (_tx$payer4 = tx.payer) === null || _tx$payer4 === void 0 ? void 0 : _tx$payer4.receiptPreferenceToken;
      this.context.timeCard.startTime(_TimeCard["default"].Events.receiptCall);

      var _this$_emailOrSms = this._emailOrSms(emailOrSms),
          type = _this$_emailOrSms.type,
          value = _this$_emailOrSms.value;

      _Merchant["default"].active.forwardReceipt(invoice, emailOrSms, txNumber, txType, customerId, receiptPreferenceToken, function (err) {
        if (err) {
          Log.error('SendReceiptFailed', {
            err: (0, _stringify["default"])(err)
          });

          if (err === _sdkErrors.transaction.offlinePaymentEnabled) {
            flow.data.receipt = (0, _defineProperty2["default"])({}, _ReceiptDestination.ReceiptDestinationTypeStr[type], value);
          }
        } else {
          _this3.context.timeCard.stopTime(_TimeCard["default"].Events.receiptCall);

          Log.info('SuccessfullyForwardedReceipt', {
            id: _this3.context.id,
            emailOrSms: emailOrSms,
            txNum: txNumber
          });

          if (!tx.receiptDestination) {
            tx.receiptDestination = new _ReceiptDestination.ReceiptDestination();
          }

          tx.receiptDestination.type = type;
          tx.receiptDestination[_ReceiptDestination.ReceiptDestinationTypeStr[type]] = value;
        }

        alert.dismiss(); // callback to finish the receipt options screen after receipt is sent

        cb();
        Log.debug('Receipt screen dismissed', {
          emailOrSms: emailOrSms
        });

        _this3.context.timeCard.stopTime(_TimeCard["default"].Events.receiptStep);

        flow.next();
      });
    }
  }, {
    key: "_emailOrSms",
    value: function _emailOrSms(emailOrSms) {
      return {
        type: (0, _indexOf["default"])(emailOrSms).call(emailOrSms, '@') > 0 ? _ReceiptDestination.ReceiptDestinationType.email : _ReceiptDestination.ReceiptDestinationType.text,
        value: emailOrSms
      };
    }
  }, {
    key: "_transactionType",
    value: function _transactionType(flow) {
      if (flow.data.error) {
        return (0, _retailSDKUtil.isTxCancelled)(flow.data.error) ? 'VOID' : 'DECLINE';
      }

      if (this.context.type === _retailPaymentDevice.TransactionType.Refund) {
        return 'REFUND';
      }

      if (this.context.type === _retailPaymentDevice.TransactionType.PartialRefund) {
        return 'PARTIAL';
      }

      if (this.context.type === _retailPaymentDevice.TransactionType.Redemption) {
        return 'REDEMPTION';
      }

      return 'SALE';
    }
  }]);
  return ReceiptStep;
}(_FlowStep2["default"]);

exports["default"] = ReceiptStep;

},{"../../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../../paymentDevice/DeviceSelector":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceSelector.js","../../transaction/ReceiptDestination":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/ReceiptDestination.js","../../transaction/ReceiptViewContent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/ReceiptViewContent.js","../../transaction/TimeCard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TimeCard.js","../../transaction/transactionUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionUtil.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypalrest-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","retail-page-tracker":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/retail-page-tracker/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/RemoveCardStep.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var messageHelper = _interopRequireWildcard(require("../messageHelper"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}
/**
 * Wait for the card to be removed from the reader before continuing.
 */


var RemoveCardStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(RemoveCardStep, _FlowStep);

  var _super = _createSuper(RemoveCardStep);

  function RemoveCardStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, RemoveCardStep);
    _this = _super.call(this);
    _this.context = context;
    _this.quickChipEnabled = context.quickChipEnabled;
    return _this;
  }

  (0, _createClass2["default"])(RemoveCardStep, [{
    key: "execute",
    value: function execute(flow) {
      var _this2 = this;

      if (this.quickChipEnabled && !this.context.card.reader.cardInSlot) {
        flow.next();
        return;
      }

      var cardContext = this.context.card;

      if ((cardContext === null || cardContext === void 0 ? void 0 : cardContext.formFactor) === _retailPaymentDevice.FormFactor.Chip) {
        this.context.timeoutManager.startTimeoutMonitor('RemoveCardStep-waitForCardRemoval-Start', true);
        cardContext.reader.waitForCardRemoval(function () {
          var _flow$data$alert;

          (_flow$data$alert = flow.data.alert) === null || _flow$data$alert === void 0 ? void 0 : _flow$data$alert.dismiss();
          delete flow.data.alert;

          _this2.context.timeoutManager.startTimeoutMonitor('RemoveCardStep-waitForCardRemoval-End');

          flow.next();
        });

        var hasError = function hasError(flowData) {
          return flowData && flowData.error;
        };

        if (!hasError(flow.data) && this.context.type === _retailPaymentDevice.TransactionType.Auth) {
          flow.data.removeCard = true;
        }

        messageHelper.showRemoveCardMessage(this.context, flow.data, function (alert) {
          flow.data.alert = alert;

          if (flow.data.removeCard) {
            delete flow.data.removeCard;
          }
        });
      } else {
        var _flow$data$alert2;

        (_flow$data$alert2 = flow.data.alert) === null || _flow$data$alert2 === void 0 ? void 0 : _flow$data$alert2.dismiss();
        delete flow.data.alert;
        flow.next();
      }
    }
  }]);
  return RemoveCardStep;
}(_FlowStep2["default"]);

exports["default"] = RemoveCardStep;

},{"../messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/SignatureStep.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-timeout"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _SignatureReceiver = _interopRequireDefault(require("../../transaction/SignatureReceiver"));

var _transactionEvent = _interopRequireDefault(require("../../transaction/transactionEvent"));

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var messageHelper = _interopRequireWildcard(require("../messageHelper"));

var _TimeCard = _interopRequireDefault(require("../../transaction/TimeCard"));

var _DeviceSelector = _interopRequireDefault(require("../../paymentDevice/DeviceSelector"));

var _l10n = _interopRequireDefault(require("../../common/l10n"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.step.signature');
var Message = _retailPaymentDevice.PaymentDevice.Message;

var SignatureStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(SignatureStep, _FlowStep);

  var _super = _createSuper(SignatureStep);

  function SignatureStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, SignatureStep);
    _this = _super.call(this);
    _this.timeout = 2000;
    _this.context = context;
    _this.quickChipEnabled = context.quickChipEnabled;
    return _this;
  }

  (0, _createClass2["default"])(SignatureStep, [{
    key: "execute",
    value: function execute(flow) {
      var _DeviceSelector$selec,
          _this$context$payment,
          _DeviceSelector$selec2,
          _this2 = this;

      this.context.timeCard.startTime(_TimeCard["default"].Events.signatureStep);

      if (this.context.type === _retailPaymentDevice.TransactionType.Auth) {
        Log.debug('Skipping signature step. Reason: Auth flow');

        if (flow.data.alert) {
          flow.data.alert.dismiss();
          delete flow.data.alert;
        }

        flow.next();
        return;
      }

      if (this.context.card.isSignatureRequired === false || this.context.skipSignature) {
        Log.debug('Skipping signature step. Reason: Signature not required for this transaction');
        flow.next();
        return;
      }

      this.context.emit(_transactionEvent["default"].willPresentSignature);

      if (flow.data.error) {
        Log.debug('Skipping signature step. Reason: One/more of previous steps logged an error');
        flow.next();
        return;
      }

      var useReaderForSignature = ((_DeviceSelector$selec = _DeviceSelector["default"].selectedDevice) === null || _DeviceSelector$selec === void 0 ? void 0 : _DeviceSelector$selec.manufacturer) === _retailPaymentDevice.deviceManufacturer.verifone && !!((_this$context$payment = this.context.paymentOptions) !== null && _this$context$payment !== void 0 && _this$context$payment.signatureOnCardReader);
      (_DeviceSelector$selec2 = _DeviceSelector["default"].selectedDevice) === null || _DeviceSelector$selec2 === void 0 ? void 0 : _DeviceSelector$selec2.startPollForBattery();
      this.context.timeoutManager.startTimeoutMonitor('SignatureStepStart', true);

      if (!this.context._signatureCollector && useReaderForSignature) {
        var collectSignature = function collectSignature(cb) {
          _DeviceSelector["default"].selectedDevice.collectSignature(function (_error, _signature) {
            if (_error) {
              Log.error('signature collection error', {
                error: _error
              });
            }

            if ((_error === null || _error === void 0 ? void 0 : _error.code) === _retailPaymentDevice.deviceError.noSignature.code || _this2.context.card.formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe && _error) {
              var deviceMessageId = (_error === null || _error === void 0 ? void 0 : _error.code) === _retailPaymentDevice.deviceError.noSignature.code ? _retailPaymentDevice.PaymentDevice.Message.NoEmptySignature : _retailPaymentDevice.PaymentDevice.Message.NoSignatureCancellationOnSwipe;
              messageHelper.readerDisplay(_this2.context, deviceMessageId);
              (0, _setTimeout2["default"])(function () {
                return collectSignature(cb);
              }, _this2.timeout);
            } else if (_this2.context.card.formFactor === _retailPaymentDevice.FormFactor.Chip && !_this2.quickChipEnabled) {
              messageHelper.readerDisplay(_this2.context, _retailPaymentDevice.PaymentDevice.Message.Processing, messageHelper.getSubstitutions(_this2.context));

              _DeviceSelector["default"].selectedDevice.isCardPresent(cb(_signature));
            } else {
              cb(_signature)(true);
            }
          });
        };

        var signAndCardCB = function signAndCardCB(_signatureReceiver) {
          return function (signature) {
            return function (isCardPresent) {
              var _flow$data$alert;

              (_flow$data$alert = flow.data.alert) === null || _flow$data$alert === void 0 ? void 0 : _flow$data$alert.dismiss();
              delete flow.data.alert;

              if (isCardPresent && signature) {
                _signatureReceiver.continueWithSignature(signature);
              } else {
                _signatureReceiver.cancel();
              }
            };
          };
        };

        this.context.setSignatureCollector(function (verifoneSignatureReceiver) {
          var _flow$data$alert2;

          (_flow$data$alert2 = flow.data.alert) === null || _flow$data$alert2 === void 0 ? void 0 : _flow$data$alert2.dismiss();
          delete flow.data.alert;
          var alertOpts = {
            title: (0, _l10n["default"])('Sig.Collecting'),
            showActivity: true
          };
          flow.data.alert = _manticore["default"].alert(alertOpts, function () {});
          collectSignature(signAndCardCB(verifoneSignatureReceiver));
        });
      }

      var signatureReceiver = new _SignatureReceiver["default"](this.context, function (err, b64Signature) {
        var _DeviceSelector$selec3;

        flow.removeListener('aborted', _this2.dismissSignature);
        flow.data.signature = b64Signature;
        Log.info('SignatureCollected', {
          id: _this2.context.id,
          err: !!err
        });

        _this2.context.timeCard.stopTime(_TimeCard["default"].Events.signatureStep);

        (_DeviceSelector$selec3 = _DeviceSelector["default"].selectedDevice) === null || _DeviceSelector$selec3 === void 0 ? void 0 : _DeviceSelector$selec3.stopPollForBattery();

        _this2.context.timeoutManager.startTimeoutMonitor('SignatureStepEnd');

        flow.nextOrAbort(err);
      });

      this.dismissSignature = function () {
        return signatureReceiver.dismiss();
      };

      flow.once('aborted', this.dismissSignature);
      var substitutions = messageHelper.getSubstitutions(this.context);
      var messageId = SignatureStep.getReaderDisplayMessage(this.context.card, this.quickChipEnabled);
      this.context.card.reader.stopWaitingForCardRemoval(this.context.waitForCardRemovalIds);
      this.context.card.reader.display({
        id: messageId,
        substitutions: substitutions
      }, function () {
        var _flow$data$alert3;

        (_flow$data$alert3 = flow.data.alert) === null || _flow$data$alert3 === void 0 ? void 0 : _flow$data$alert3.dismiss();
        delete flow.data.alert;

        if (_this2.context._signatureCollector) {
          _this2.context._signatureCollector(signatureReceiver);
        } else {
          signatureReceiver.acquireSignature();
        }
      });
    }
  }], [{
    key: "getReaderDisplayMessage",
    value: function getReaderDisplayMessage(card, quickChipEnabled) {
      if (card.formFactor === _retailPaymentDevice.FormFactor.Chip) {
        return quickChipEnabled ? Message.QuickChip.Signature : Message.SignatureForInsert;
      }

      if (card.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless && !card.isContactlessMSD) {
        return Message.SignatureForTap;
      }

      return Message.SignatureForNonEmv;
    }
  }]);
  return SignatureStep;
}(_FlowStep2["default"]);

exports["default"] = SignatureStep;

},{"../../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../../paymentDevice/DeviceSelector":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceSelector.js","../../transaction/SignatureReceiver":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/SignatureReceiver.js","../../transaction/TimeCard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TimeCard.js","../../transaction/transactionEvent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionEvent.js","../messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/set-timeout":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/UpdateInvoiceDigitalCardStep.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var retailSDKUtils = _interopRequireWildcard(require("../../common/retailSDKUtil"));

var _sdkErrors = require("../../common/sdkErrors");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.step.updateInvoiceDigitalCard');

var UpdateInvoiceDigitalCardStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(UpdateInvoiceDigitalCardStep, _FlowStep);

  var _super = _createSuper(UpdateInvoiceDigitalCardStep);

  function UpdateInvoiceDigitalCardStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, UpdateInvoiceDigitalCardStep);
    _this = _super.call(this);
    _this.context = context;
    return _this;
  }

  (0, _createClass2["default"])(UpdateInvoiceDigitalCardStep, [{
    key: "execute",
    value: function execute(flow) {
      var _flow$data, _flow$data$tx, _flow$data$tx$digital, _flow$data2, _flow$data2$tx, _flow$data2$tx$digita, _flow$data2$tx$digita2;

      Log.debug('Begin Update Invoice for Digital Card Flow');
      var error = flow.data.error;
      this.context.invoice.resetFlags();

      if (!error && !((_flow$data = flow.data) !== null && _flow$data !== void 0 && (_flow$data$tx = _flow$data.tx) !== null && _flow$data$tx !== void 0 && (_flow$data$tx$digital = _flow$data$tx.digitalCardInfo) !== null && _flow$data$tx$digital !== void 0 && _flow$data$tx$digital.redeemedAmount)) {
        Log.error('missingDigitalCardRedemption');
        flow.abortFlow(_sdkErrors.transaction.missingDigitalCardRedemption);
        return;
      }

      if (!error && (_flow$data2 = flow.data) !== null && _flow$data2 !== void 0 && (_flow$data2$tx = _flow$data2.tx) !== null && _flow$data2$tx !== void 0 && (_flow$data2$tx$digita = _flow$data2$tx.digitalCardInfo) !== null && _flow$data2$tx$digita !== void 0 && (_flow$data2$tx$digita2 = _flow$data2$tx$digita.redeemedAmount) !== null && _flow$data2$tx$digita2 !== void 0 && _flow$data2$tx$digita2.isGreaterThan(0)) {
        this._updatePayments(flow, this.context.invoice);
      } else if (error) {
        this.context.invoice.isCancelled = retailSDKUtils.isTxCancelled(error);
        this.context.invoice.isFailed = !retailSDKUtils.isTxCancelled(error);
      }

      flow.next();
    }
  }, {
    key: "_updatePayments",
    value: function _updatePayments(flow, invoice) {
      var stubPayment = new _paypalInvoicing.InvoicePayment(this.context.paymentType, flow.data.tx.digitalCardInfo.redeemedAmount, flow.data.tx.digitalCardInfo.currency);
      stubPayment.digitalCardCode = flow.data.tx.digitalCardInfo.code;
      flow.data.tx.paymentMethod = stubPayment.method;
      invoice.addPayment(stubPayment, this.context.type);
    }
  }]);
  return UpdateInvoiceDigitalCardStep;
}(_FlowStep2["default"]);

exports["default"] = UpdateInvoiceDigitalCardStep;

},{"../../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/UpdateInvoicePaymentStep.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var _retailSDKUtil = require("../../common/retailSDKUtil");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.step.UpdateInvoicePaymentStep');

var UpdateInvoicePaymentStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(UpdateInvoicePaymentStep, _FlowStep);

  var _super = _createSuper(UpdateInvoicePaymentStep);

  function UpdateInvoicePaymentStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, UpdateInvoicePaymentStep);
    _this = _super.call(this);
    _this.context = context;
    return _this;
  }

  (0, _createClass2["default"])(UpdateInvoicePaymentStep, [{
    key: "execute",
    value: function execute(flow) {
      var error = flow.data.error;
      var invoice = this.context.invoice;
      invoice.resetFlags();

      if (!error) {
        var paymentItem;

        if (this.context.refundAmount) {
          paymentItem = new _paypalInvoicing.InvoiceRefund(this.context.paymentType, this.context.refundAmount, invoice.currency);
          invoice.addRefund(paymentItem);
        } else {
          paymentItem = new _paypalInvoicing.InvoicePayment(this.context.paymentType, invoice.total, invoice.currency);
          invoice.addPayment(paymentItem, this.context.type);
        }

        if (flow.data.tx) {
          paymentItem.transactionID = flow.data.tx.transactionNumber;
          flow.data.tx.paymentMethod = paymentItem.method;
        }
      } else if (error) {
        this._removeDigitalCardPayments(invoice);

        invoice.isCancelled = (0, _retailSDKUtil.isTxCancelled)(error);
        invoice.isFailed = !(0, _retailSDKUtil.isTxCancelled)(error);
      }

      flow.next();
    }
  }, {
    key: "_removeDigitalCardPayments",
    value: function _removeDigitalCardPayments(invoice) {
      invoice.removePayments(function (payment) {
        return payment.method === _paypalInvoicing.InvoiceEnums.PaymentMethod.DIGITAL_CARD;
      });
      Log.debug('remaining invoice payments', {
        payments: invoice.payments
      });
    }
  }]);
  return UpdateInvoicePaymentStep;
}(_FlowStep2["default"]);

exports["default"] = UpdateInvoicePaymentStep;

},{"../../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/VaultStep.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticoreUtil = require("manticore-util");

var _sdkErrors = require("../../common/sdkErrors");

var _FlowStep2 = _interopRequireDefault(require("./FlowStep"));

var retailSDKUtil = _interopRequireWildcard(require("../../common/retailSDKUtil"));

var _Merchant = _interopRequireDefault(require("../../common/Merchant"));

var _BraintreeManager = _interopRequireDefault(require("../../common/BraintreeManager"));

var _VaultRecord = _interopRequireDefault(require("../../transaction/VaultRecord"));

var _TransactionBeginOptions = require("../../transaction/TransactionBeginOptions");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('flow.step.vault');

var VaultStep = /*#__PURE__*/function (_FlowStep) {
  (0, _inherits2["default"])(VaultStep, _FlowStep);

  var _super = _createSuper(VaultStep);

  function VaultStep(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, VaultStep);
    _this = _super.call(this);
    _this.context = context;
    _this.instrument = context.card;
    return _this;
  }

  (0, _createClass2["default"])(VaultStep, [{
    key: "execute",
    value: function execute(flow) {
      if (this.context.paymentType !== _TransactionBeginOptions.PaymentTypes.card) {
        flow.abortFlow(_sdkErrors.transaction.cardTypeMismatch.withDevMessage('Expected paymentType to be of type card'));
        return;
      }

      if (this.context.paymentOptions.vaultProvider === null) {
        flow.abortFlow(_sdkErrors.transaction.vaultFailed.withDevMessage('Vault Provider is NOT given!!!'));
        return;
      }

      this._performVault(flow);
    }
  }, {
    key: "_performVault",
    value: function _performVault(flow) {
      var _this2 = this;

      var merchant = _Merchant["default"].active;

      var rq = this._buildRequest();

      var headers = this._buildRequestHeaders();

      Log.debug('Vault request to : payments/secure-terminal-payments/tokens');
      Log.debug(function () {
        return "Vault request :\n".concat((0, _stringify["default"])(rq, null, 4));
      });
      Log.debug(function () {
        return 'Vault request headers';
      }, headers);
      merchant.request({
        service: 'payments',
        op: 'secure-terminal-payments/tokens',
        format: 'json',
        method: 'POST',
        headers: headers,
        body: (0, _stringify["default"])(rq)
      }, function (err, vaultRz) {
        var _rq$card_data; // TODO: when we get the final version of body including error code, revisit here!


        var vaultError = (0, _sdkErrors.retailErrorFromResponse)('Vault', err, vaultRz);
        Log.debug('Vault response received from API payments/secure-terminal-payments/tokens');
        Log.debug(function () {
          return "Vault response: ".concat((0, _stringify["default"])(vaultRz, null, 4));
        });
        flow.data.vault = vaultRz !== null && vaultRz !== void 0 && vaultRz.body ? new _VaultRecord["default"](vaultRz.body) : {};
        flow.data.vault.card = _this2.context.card; // For all non card reader transactions, finish the flow and move on.

        if (_this2.context.paymentType !== _TransactionBeginOptions.PaymentTypes.card) {
          flow.nextOrAbort(vaultError);
          return;
        }

        var isEmv = (rq === null || rq === void 0 ? void 0 : (_rq$card_data = rq.card_data) === null || _rq$card_data === void 0 ? void 0 : _rq$card_data.emv_data) && ( // eslint-disable-line camelcase
        _this2.instrument.formFactor === _retailPaymentDevice.FormFactor.Chip || _this2.instrument.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless);

        if (vaultError) {
          Log.error('VaultErr', {
            currency: _this2.context.invoice.currency,
            ff: _this2.instrument.formFactor,
            isEmv: isEmv,
            err: (0, _stringify["default"])(vaultError),
            status: vaultRz ? vaultRz.statusCode : 'empty',
            resp: (0, _stringify["default"])(vaultRz ? vaultRz.body : {})
          });
        } else {
          Log.info('VaultResp', {
            id: _this2.context.id,
            currency: _this2.context.invoice.currency,
            ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, _this2.instrument.formFactor),
            vault: (0, _stringify["default"])(flow.data.vault)
          });
        } // auth_code shall be used ONLY once right at the beginning so getting rid of auth_code for next vaults


        _BraintreeManager["default"].reset();

        flow.nextOrAbort(vaultError);
      });
    }
  }, {
    key: "_buildRequestHeaders",
    value: function _buildRequestHeaders() {
      var headers = {
        'Content-Type': 'application/json'
      };
      return headers;
    }
  }, {
    key: "_buildRequest",
    value: function _buildRequest() {
      var request = {};

      if (this.context.paymentType === _TransactionBeginOptions.PaymentTypes.card) {
        request = retailSDKUtil.hereVaultAPICardDataFromCard(this.instrument);
      } else {
        throw _sdkErrors.transaction.cardTypeMismatch.withDevMessage('Expected paymentType to be of type card');
      }

      var str = this.context.paymentOptions.vaultProvider.toString();

      var provider = _TransactionBeginOptions.VaultProvider.toString[str].toUpperCase();

      request.provider_data = {
        provider: provider,
        customer_id: this.context.paymentOptions.vaultCustomerId
      };

      if (_BraintreeManager["default"] && _BraintreeManager["default"].authCode) {
        request.provider_data.auth_info = {
          type: 'AUTH_CODE',
          value: _BraintreeManager["default"].authCode
        };
      }

      return request;
    }
  }]);
  return VaultStep;
}(_FlowStep2["default"]);

exports["default"] = VaultStep;

},{"../../common/BraintreeManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/BraintreeManager.js","../../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../../transaction/TransactionBeginOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionBeginOptions.js","../../transaction/VaultRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/VaultRecord.js","./FlowStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/steps/FlowStep.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/index.js":[function(require,module,exports){
(function (global){(function (){
"use strict"; // Note that the node-jose library requires either global `window` or `self`
// to exist in our environment - US1425704
// The following line should be the FIRST line and NOT to move the location

global.self = global;
/* eslint-disable global-require */

var Log = require('@paypalcorp/manticore-log')["default"]('root'); // TODO configure logging


var m = require('manticore');

var SDK = require('./sdk');

Log.debug(function () {
  return "".concat(SDK);
});

require('./EventSink');

try {
  Log.debug('Beginning SDK initialization.');
  m["export"](require('@paypalcorp/retail-payment-device'));
  m["export"](require('./paymentDevice'));
  m["export"](require('./transaction'));
  m["export"](require('@paypalcorp/paypal-invoicing'));
  m["export"](require('@paypalcorp/manticore-paypalerror'));
  m["export"](require('./common'));
  m["export"](require('./simulator'));
  m.ready(SDK);
  Log.debug('SDK initialization complete.');
} catch (error) {
  Log.error('completeInitializationFailed', {
    msg: error.message,
    stack: error.stack
  });
}

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./EventSink":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/EventSink.js","./common":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/index.js","./paymentDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/index.js","./sdk":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/sdk.js","./simulator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/index.js","./transaction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/manticore-paypalerror":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-paypalerror/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/CardStatus.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _sliceInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/values"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.split.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _pphSdkEnums = require("@paypalcorp/pph-sdk-enums");

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context2;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty2(_context2 = Object.prototype.toString.call(o)).call(_context2, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Log = (0, _manticoreLog["default"])('ingenico.cardStatus');
/**
 * Contain the details of card events on the Ingenico terminal such as insertion,
 * swipe, removal, etc.
 */

var CardStatus = /*#__PURE__*/function () {
  function CardStatus(response) {
    var _context,
        _this = this;

    (0, _classCallCheck2["default"])(this, CardStatus);
    this.response = response;
    this.isSignatureRequired = false;
    var statusBuf = this.response.getStatus();

    if (statusBuf === 0x91 || statusBuf === 0x90) {
      // 0x90 is for contact refund decline
      this.formFactor = _retailPaymentDevice.FormFactor.Chip;
    } else if (statusBuf === 0x94 || statusBuf === 0x93) {
      // 0x93 is for contactless refunds
      this.formFactor = _retailPaymentDevice.FormFactor.EmvCertifiedContactless;
    } else if (statusBuf === 0x95) {
      this.formFactor = _retailPaymentDevice.FormFactor.MagneticCardSwipe;
    }

    var _iterator = _createForOfIteratorHelper((0, _values["default"])(this.response.apdu.tlvs)),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var v = _step.value;

        if (v.tagNumber === 0x9f39) {
          (function () {
            var contactlessInfoByte = v.parse();
            Log.debug(function () {
              return "contactlessInfoByte = ".concat(contactlessInfoByte);
            });
            _this.emv = contactlessInfoByte === 0x07;
          })();
        } else if ((v.tagNumber === 0x5f20 || v.tagNumber === 0x9f0b) && !Buffer.isBuffer(v.parse())) {
          this.cardholderName = v.value.toString();
        } else if (v.tagNumber === 0xdf8225) {
          Log.debug('parsing ksn (tag 0xdf8225)');
          this.ksn = v.parse();
          Log.debug(function () {
            return "ksn (tag 0xdf8225) = ".concat(_this.ksn.toString('hex'));
          });
        } else if (v.tagNumber === 0xdf8223) {
          this.sredData = v.parse();
        } else if (v.tagNumber === 0xdf8256) {
          this.maskedTrack1 = v.bytes;
        } else if (v.tagNumber === 0xdf8257) {
          this.maskedTrack2 = v.bytes;
        } else if (v.tagNumber === 0xdfae03) {
          Log.debug('parsing ksn (tag 0xdfae03)');
          this.ksn = v.parse();
          Log.debug(function () {
            return "ksn (tag 0xdfae03) = ".concat(_this.ksn.toString('hex'));
          });
        } else if (v.tagNumber === 0xdfae02) {
          this.sredData = v.parse();
        } else if (v.tagNumber === 0x9f34 && this.formFactor === _retailPaymentDevice.FormFactor.Chip) {
          (function () {
            // Contact cvm
            var contactCvmVal = v.parse();
            Log.debug(function () {
              return "tag 0x9f34 = ".concat(contactCvmVal.toString('hex'));
            });
            _this.isSignatureRequired = (contactCvmVal[0] & 0x3f) === 0x1e;
            Log.debug(function () {
              return "tag 0x9f34 isSignatureRequired= ".concat(_this.isSignatureRequired);
            });
          })();
        } else if (v.tagNumber === 0xdf6f && this.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless) {
          (function () {
            // Contactless cvm
            var contactlessCvmVal = v.parse();
            Log.debug(function () {
              return "tag 0xdf6f = ".concat(contactlessCvmVal.toString('hex'));
            });
            _this.isSignatureRequired = (contactlessCvmVal[1] & 0x01) === 0x01;
            Log.debug(function () {
              return "tag 0xdf6f isSignatureRequired= ".concat(_this.isSignatureRequired);
            });
          })();
        }
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }

    this.p2pe = (0, _slice["default"])(_context = this.response.apdu.data).call(_context, 1).toString('hex');
  }

  (0, _createClass2["default"])(CardStatus, [{
    key: "getPresentedCard",
    value: function getPresentedCard(reader) {
      var _this2 = this;

      var card;
      Log.debug('getPresentedCard');

      if (this.formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
        Log.debug('Card Swiped');
        return this._magstripe(reader);
      }

      var _iterator2 = _createForOfIteratorHelper((0, _values["default"])(this.response.apdu.tlvs)),
          _step2;

      try {
        for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
          var v = _step2.value;

          if (v.tagNumber === 0x50) {
            var cardIssuer = v.parse();

            if (typeof cardIssuer === 'string' && /^[a-zA-Z\s]+$/.test(cardIssuer)) {
              this.cardIssuer = _retailPaymentDevice.CardDataUtil.getCardIssuerFromEmvAppLabel(cardIssuer);
            }
          }

          if (v.tagNumber === 0x57) {
            var maskedCard = v.parse();
            maskedCard = maskedCard.toString('hex');
            var maskedPanNumbers = maskedCard.substr(0, (0, _indexOf["default"])(maskedCard).call(maskedCard, 'd'));
            this.lastFour = maskedPanNumbers.substr(maskedPanNumbers.length - 4);
            this.firstFour = maskedPanNumbers.substr(0, 4);
          }

          if (v.tagNumber === 0x82) {
            this.appInterchangeProfile = v.parse().toString('hex');
          }

          if (v.tagNumber === 0x95) {
            this.terminalVerificationResults = v.parse().toString('hex');
          }

          if (v.tagNumber === 0x9f06) {
            this.aid = v.parse().toString('hex').toUpperCase();

            if (!this.cardIssuer || this.cardIssuer === _pphSdkEnums.CardIssuer.Unknown) {
              this.cardIssuer = _retailPaymentDevice.CardDataUtil.getCardIssuerFromEmvAID(this.aid);
            }
          }

          if (v.tagNumber === 0x9b) {
            this.txStatusInfo = v.parse().toString('hex');
          }
        }
      } catch (err) {
        _iterator2.e(err);
      } finally {
        _iterator2.f();
      }

      if (this.formFactor === _retailPaymentDevice.FormFactor.Chip) {
        card = new _retailPaymentDevice.Card();
        card.formFactor = _retailPaymentDevice.FormFactor.Chip;
        card.reader = reader;
        card.emvData = this.response;
        card.cardIssuer = this.cardIssuer;
        card.lastFourDigits = this.lastFour;
        card.firstFourDigits = this.firstFour;
        card.isSignatureRequired = this.isSignatureRequired;
        card.cardholderName = this.cardholderName || '';

        this._setEmvResponseInfo(card);

        Log.debug('EMV Card Inserted');
        return card;
      }

      if (this.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless) {
        Log.debug('EMV Card Contactless');
        card = new _retailPaymentDevice.Card();
        card.formFactor = _retailPaymentDevice.FormFactor.EmvCertifiedContactless;
        card.emvData = this.response;
        card.reader = reader;
        card.isContactlessMSD = !this.emv;
        card.cardIssuer = this.cardIssuer;
        card.lastFourDigits = this.lastFour;
        card.firstFourDigits = this.firstFour;
        card.isSignatureRequired = this.isSignatureRequired;
        card.cardholderName = this.cardholderName;

        this._setEmvResponseInfo(card);

        return card;
      }

      Log.debug(function () {
        return "Unknown formFactor ".concat(_this2.formFactor);
      });
      return null;
    }
  }, {
    key: "_setEmvResponseInfo",
    value: function _setEmvResponseInfo(card) {
      var _card$emvData;

      card.emvResponseInfo = {
        appInterchangeProfile: this.appInterchangeProfile,
        terminalVerificationResults: this.terminalVerificationResults,
        aid: this.aid,
        txStatusInfo: this.txStatusInfo,
        length: (_card$emvData = card.emvData) === null || _card$emvData === void 0 ? void 0 : _card$emvData.length
      };
      Log.track('EMV ResponseInfo', card.emvResponseInfo);
    }
  }, {
    key: "_magstripe",
    value: function _magstripe(reader) {
      var card = new _retailPaymentDevice.MagneticCard();
      card.formFactor = _retailPaymentDevice.FormFactor.MagneticCardSwipe;
      card.ksn = this.ksn ? this.ksn.toString('hex') : '';
      card.reader = reader;
      card.track2 = this.response.apdu.data.toString('hex');
      var maskedTrack = this.maskedTrack2 || this.maskedTrack1;

      if (!maskedTrack || !maskedTrack.length) {
        Log.error('MissingMaskedTrack1And2FromCardSwipeData');
        card.failed = true;
        return card;
      }

      if (this.maskedTrack1) {
        var clearTextValues = this.maskedTrack1.toString().split('^');
        card.cardholderName = clearTextValues && clearTextValues.length > 1 ? clearTextValues[1] : '';
      } else {
        card.cardholderName = '';
      }

      var maskedTrackHex = maskedTrack.toString(); // Buffer.from(maskedTrack, 'hex').toString();

      var separatorIndex = (0, _indexOf["default"])(maskedTrackHex).call(maskedTrackHex, '='); // https://en.m.wikipedia.org/wiki/ISO/IEC_7813#Track_2

      if (!this.maskedTrack2 || !this.maskedTrack2.length || separatorIndex < 0) {
        Log.error('MissingMaskedTrack2FromCardSwipeData');
        card.failed = true;
        return card;
      }

      var pan = maskedTrackHex.substring(1, separatorIndex);
      card.cardIssuer = _retailPaymentDevice.CardDataUtil.getCardIssuerFromCardNumber(pan.substr(0, 6));
      card.lastFourDigits = pan.substr(pan.length - 4);
      card.firstFourDigits = pan.substr(0, 4);
      var serviceCode = maskedTrackHex.substring(separatorIndex + 5, separatorIndex + 6);

      if (serviceCode === '2' || serviceCode === '6') {
        Log.debug('Chip card was swiped');
        card.chipCard = true;
      }

      return card;
    }
  }, {
    key: "toString",
    value: function toString() {
      var parts = [];

      if (this.ksn) {
        parts.push('\nKSN: ');
        parts.push(this.ksn.toString('hex'));
      }

      if (this.track2) {
        parts.push('\nTrack 2: ');
        parts.push(this.track2.toString('hex'));
      }

      if (this.maskedTrack1) {
        parts.push('\nMasked Track 1: ');
        parts.push(this.maskedTrack1.toString('hex'));
      }

      if (this.maskedTrack2) {
        parts.push('\nMasked Track 2: ');
        parts.push(this.maskedTrack2.toString('hex'));
      }

      if (this.sredData) {
        parts.push('\nSRED: ');
        parts.push(this.sredData.toString('hex'));
      }

      return parts.join('');
    }
  }]);
  return CardStatus;
}();

exports["default"] = CardStatus;

}).call(this)}).call(this,{"isBuffer":require("../../node_modules/is-buffer/index.js")})
},{"../../node_modules/is-buffer/index.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-buffer/index.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/pph-sdk-enums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.split.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/ConnectionFlow.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticoreUtil = require("manticore-util");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _BaseFlowAsync2 = _interopRequireDefault(require("../flows/BaseFlowAsync"));

var _IngenicoDeviceUpdate = _interopRequireDefault(require("./SoftwareUpdate/IngenicoDeviceUpdate"));

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('ingenico.connectionFlow');

var ConnectionFlow = /*#__PURE__*/function (_BaseFlowAsync) {
  (0, _inherits2["default"])(ConnectionFlow, _BaseFlowAsync);

  var _super = _createSuper(ConnectionFlow);

  function ConnectionFlow(device, callback) {
    var _this;

    (0, _classCallCheck2["default"])(this, ConnectionFlow);
    _this = _super.call(this);
    _this.device = device;
    _this.completionCallback = callback;
    return _this;
  }

  (0, _createClass2["default"])(ConnectionFlow, [{
    key: "start",
    value: function () {
      var _start = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
        var _this2 = this;

        return _regenerator["default"].wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                _context.next = 2;
                return (0, _get2["default"])((0, _getPrototypeOf2["default"])(ConnectionFlow.prototype), "setFlowSteps", this).call(this, 'Ingenico Connection', [this._getBatteryLevel, this._tryQuickConnect, this._retrieveVersionInfo, this._retrieveDeviceCapabilities, this._checkFirmwareUpdate]);

              case 2:
                (0, _get2["default"])((0, _getPrototypeOf2["default"])(ConnectionFlow.prototype), "addFlowEndedHandler", this).call(this, function (data) {
                  if (!data.error) {
                    _this2.device.performQuickConnect = true;
                  }

                  _this2.completionCallback(data.error);
                });
                Log.debug(function () {
                  return "Starting the connection flow for ".concat(_this2.device.id);
                });
                _context.next = 6;
                return (0, _get2["default"])((0, _getPrototypeOf2["default"])(ConnectionFlow.prototype), "startFlow", this).call(this);

              case 6:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function start() {
        return _start.apply(this, arguments);
      }

      return start;
    }()
  }, {
    key: "_tryQuickConnect",
    value: function _tryQuickConnect(flow) {
      var _this3 = this;

      if (this.device.performQuickConnect) {
        Log.debug(function () {
          return "Performing quick connect on ".concat(_this3.device.id);
        });
        flow.completeFlow();
        return;
      }

      flow.next();
    }
  }, {
    key: "_checkFirmwareUpdate",
    value: function _checkFirmwareUpdate(flow) {
      var _this4 = this;

      if (this.device.pendingUpdate && this.device.pendingUpdate.updateInProgress) {
        Log.debug(function () {
          return "Skipping firmware check as firmware update is in progress on ".concat(_this4.device.id);
        });
        flow.next();
        return;
      }

      this.device.terminal.getConfigVersion(function (err) {
        if (err) {
          Log.warn('updatesQueryingErrorRetryOnTheNextConnect', {
            crId: _this4.device.id
          });
          flow.next();
        } else {
          _this4._fetchSWInfoFromServer(flow);
        }
      });
    }
  }, {
    key: "_retrieveVersionInfo",
    value: function () {
      var _retrieveVersionInfo2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(flow) {
        var vInfoResponse;
        return _regenerator["default"].wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                _context2.prev = 0;
                _context2.next = 3;
                return this.device.terminal.getFirmwareVersionInfoAsync();

              case 3:
                vInfoResponse = _context2.sent;
                this.setDeviceModel(vInfoResponse);
                _context2.next = 12;
                break;

              case 7:
                _context2.prev = 7;
                _context2.t0 = _context2["catch"](0);
                _context2.next = 11;
                return flow.abortFlow(_context2.t0);

              case 11:
                return _context2.abrupt("return");

              case 12:
                _context2.next = 14;
                return flow.next();

              case 14:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this, [[0, 7]]);
      }));

      function _retrieveVersionInfo(_x) {
        return _retrieveVersionInfo2.apply(this, arguments);
      }

      return _retrieveVersionInfo;
    }()
  }, {
    key: "setDeviceModel",
    value: function setDeviceModel(vInfoResponse) {
      var viBuf = Buffer.from(vInfoResponse, 'hex');
      var versionInfoStr = viBuf.toString();
      var versionFirst3 = versionInfoStr.substr(0, 3).toLowerCase();
      Log.debug(function () {
        return "versionInfo string : ".concat(versionInfoStr);
      });
      this.device.isMoby = versionFirst3 === 'mob';

      if (this.device.isMoby) {
        this.device.model = _retailPaymentDevice.ReaderModel.Moby3000;
      }

      Log.info('DeviceModelIdentified', {
        crId: this.device.id,
        model: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.ReaderModel, this.device.model)
      });
    }
  }, {
    key: "_retrieveFirmwareChecksum",
    value: function () {
      var _retrieveFirmwareChecksum2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(flow) {
        var _this5 = this;

        return _regenerator["default"].wrap(function _callee3$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                if (!(this.device.pendingUpdate && this.device.pendingUpdate.updateInProgress)) {
                  _context3.next = 4;
                  break;
                }

                Log.debug(function () {
                  return "Skipping firmware check as firmware update is in progress on ".concat(_this5.device.id);
                });
                flow.completeFlow();
                return _context3.abrupt("return");

              case 4:
                _context3.prev = 4;
                _context3.next = 7;
                return this.device.terminal.getFirmwareChecksumAsync();

              case 7:
                _context3.next = 14;
                break;

              case 9:
                _context3.prev = 9;
                _context3.t0 = _context3["catch"](4);
                _context3.next = 13;
                return flow.abort(_context3.t0);

              case 13:
                return _context3.abrupt("return");

              case 14:
                _context3.next = 16;
                return flow.next();

              case 16:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee3, this, [[4, 9]]);
      }));

      function _retrieveFirmwareChecksum(_x2) {
        return _retrieveFirmwareChecksum2.apply(this, arguments);
      }

      return _retrieveFirmwareChecksum;
    }()
  }, {
    key: "_retrieveConfigVersion",
    value: function () {
      var _retrieveConfigVersion2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(flow) {
        return _regenerator["default"].wrap(function _callee4$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                _context4.prev = 0;
                _context4.next = 3;
                return this.device.terminal.getConfigVersionAsync();

              case 3:
                _context4.next = 10;
                break;

              case 5:
                _context4.prev = 5;
                _context4.t0 = _context4["catch"](0);
                _context4.next = 9;
                return flow.abort(_context4.t0);

              case 9:
                return _context4.abrupt("return");

              case 10:
                _context4.next = 12;
                return flow.next();

              case 12:
              case "end":
                return _context4.stop();
            }
          }
        }, _callee4, this, [[0, 5]]);
      }));

      function _retrieveConfigVersion(_x3) {
        return _retrieveConfigVersion2.apply(this, arguments);
      }

      return _retrieveConfigVersion;
    }()
  }, {
    key: "_retrieveDeviceCapabilities",
    value: function () {
      var _retrieveDeviceCapabilities2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(flow) {
        var _this6 = this;

        var response, capabilities, startIndex, serialNumber;
        return _regenerator["default"].wrap(function _callee5$(_context5) {
          while (1) {
            switch (_context5.prev = _context5.next) {
              case 0:
                _context5.prev = 0;
                _context5.next = 3;
                return this.device.terminal.getDeviceCapabilitiesAsync();

              case 3:
                response = _context5.sent;
                _context5.next = 11;
                break;

              case 6:
                _context5.prev = 6;
                _context5.t0 = _context5["catch"](0);
                _context5.next = 10;
                return flow.abortFlow(_context5.t0);

              case 10:
                return _context5.abrupt("return");

              case 11:
                Log.debug(function () {
                  return "Device Capabilities response : ".concat(response);
                });
                capabilities = Buffer.from(response, 'hex');
                capabilities = capabilities.toString();
                Log.debug(function () {
                  return "Device Capabilities response string: ".concat(capabilities);
                });
                startIndex = (0, _indexOf["default"])(capabilities).call(capabilities, 'RP');
                serialNumber = capabilities.substring(startIndex + 2, startIndex + 10);

                if (serialNumber) {
                  _context5.next = 22;
                  break;
                }

                _context5.next = 20;
                return flow.abortFlow();

              case 20:
                _context5.next = 27;
                break;

              case 22:
                this.device.serialNumber = serialNumber;
                this.device.setCardReaderToMerchant(serialNumber);
                Log.debug(function () {
                  return "Reader Serial Number : ".concat(_this6.device.serialNumber);
                });
                _context5.next = 27;
                return flow.next();

              case 27:
              case "end":
                return _context5.stop();
            }
          }
        }, _callee5, this, [[0, 6]]);
      }));

      function _retrieveDeviceCapabilities(_x4) {
        return _retrieveDeviceCapabilities2.apply(this, arguments);
      }

      return _retrieveDeviceCapabilities;
    }()
  }, {
    key: "_generateUpdateRequest",
    value: function _generateUpdateRequest(d) {
      var configVersion = d.terminal.firmwareCustomVersion & 0xffff;
      var capkeysVersion = d.terminal.firmwareCustomVersion >> 16 & 0xffff;
      var components = [{
        name: 'ingenico_firmware',
        version: "".concat(d.terminal.firmwareChecksum)
      }, {
        name: 'ingenico_config',
        version: "".concat(configVersion)
      }, {
        name: 'ingenico_capkeys',
        version: "".concat(capkeysVersion)
      }];
      return {
        components: components
      };
    }
  }, {
    key: "_fetchSWInfoFromServer",
    value: function _fetchSWInfoFromServer(flow) {
      var _this7 = this;

      var body = this._generateUpdateRequest(this.device);

      this.device.app.getFirmwareUpdates(body, this.device.manufacturer, this.device.model, function (err, rz) {
        if (err || !rz || !rz.body) {
          Log.error('firmwareUpdateInfoRetrieveFail', {
            err: err
          });

          if (rz && rz.body) {
            Log.warn('ResponseBody', {
              resp: (0, _stringify["default"])(rz.body, null, '\t')
            });
          }

          flow.next();
          return;
        }

        _this7.serverSwInfo = rz;
        Log.debug(function () {
          return "Received firmware update response for this.device: ".concat(_this7.device);
        });

        if (!rz || !rz.body) {
          Log.warn('firmwareUpdateInfoRetrieveFailDueToRz');

          if (rz.body) {
            Log.warn('ResponseBody', {
              resp: (0, _stringify["default"])(rz.body, null, '\t')
            });
          }

          flow.next();
          return;
        }

        if (rz.statusCode === 304) {
          Log.debug(function () {
            return "".concat(_this7.device.id, " Software update not needed");
          });
          flow.next();
          return;
        }

        _this7._checkUpdate(rz.body.modules, flow);
      });
    }
  }, {
    key: "_checkUpdate",
    value: function _checkUpdate(modules, flow) {
      Log.debug('Checking update');

      if (_IngenicoDeviceUpdate["default"].needsUpdate(this.device, modules)) {
        this.device.updates = modules;
        this.updateRequired = true;

        this._notifyReaderUpdateRequired();
      }

      flow.next();
    }
  }, {
    key: "_notifyReaderUpdateRequired",
    value: function _notifyReaderUpdateRequired() {
      var _this8 = this;

      Log.debug(function () {
        return "notifying reader status for ".concat(_this8.device.id);
      });

      if (this.device.updates) {
        Log.info('DeviceUpdateNeeded', {
          crId: this.device.id,
          updateLen: this.device.updates ? this.device.updates.length : 0,
          update: (0, _stringify["default"])(this.device.updates)
        });
        this.device.updateRequired(new _IngenicoDeviceUpdate["default"](this.device));
      }
    }
  }, {
    key: "_getBatteryLevel",
    value: function _getBatteryLevel(flow) {
      var _this9 = this;

      this.device.getBatteryInfo(function (e, batteryInfo) {
        if (!e) {
          _this9.device.lastKnownBatteryInfo = batteryInfo;
        }

        flow.nextOrAbort(e);
      });
    }
  }]);
  return ConnectionFlow;
}(_BaseFlowAsync2["default"]);

exports["default"] = ConnectionFlow;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../flows/BaseFlowAsync":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/BaseFlowAsync.js","./SoftwareUpdate/IngenicoDeviceUpdate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/SoftwareUpdate/IngenicoDeviceUpdate.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/FirmwareUpdateFlow.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/values"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _crc = require("crc");

var _flow = _interopRequireDefault(require("../common/flow"));

var _ingenicoFirmwareUpdateCommands = _interopRequireDefault(require("./ingenicoFirmwareUpdateCommands.json"));

var Log = (0, _manticoreLog["default"])('uns-update-flow');

function createToInt(size) {
  if (size < 2) {
    throw new Error('Minimum size is 2');
  } else if (size > 64) {
    throw new Error('Maximum size is 64');
  } // Determine value range


  var maxValue = (1 << size - 1) - 1;
  var minValue = -maxValue - 1;
  return function (value) {
    if (value > maxValue || value < minValue) {
      throw new Error("Int".concat(size, " overflow"));
    }

    return value < 0 ? (1 << size) + value : value;
  };
}

function crc8XOR(data) {
  return (0, _reduce["default"])(data).call(data, function (acc, _byte, i, buf) {
    return acc ^ buf.readInt8(i);
  }, 0);
}

function toHexBuffer(command) {
  return Buffer.from(command, 'hex');
}

function splitBuffer(buffer, groupSize) {
  return (0, _from["default"])({
    length: Math.ceil(buffer.length / groupSize)
  }, function (v, i) {
    return (0, _slice["default"])(buffer).call(buffer, groupSize * i, groupSize * i + groupSize);
  });
}

function addHeader(page, index) {
  var frameLength = 0x8000 | page.length + 4;
  return (0, _concat["default"])(Buffer).call(Buffer, [Buffer.from([0xff & index >> 8, 0xff & index, 0xff & frameLength >> 8, 0xff & frameLength]), page]);
}

function generateCRC(pageWithHeader) {
  return createToInt(8)(crc8XOR(pageWithHeader));
}

function addCRC(pageWithHeader) {
  var crc = generateCRC(pageWithHeader);
  var crcBuffer = Buffer.alloc(1);
  crcBuffer.writeUInt8(crc, 0);
  return (0, _concat["default"])(Buffer).call(Buffer, [pageWithHeader, crcBuffer]);
}

var PAGE_SIZE = 4096;

var FirmwareUpdateFlow = /*#__PURE__*/function () {
  function FirmwareUpdateFlow(file, nativeShim, progressCallback, callback) {
    var _this = this,
        _context2,
        _context3;

    (0, _classCallCheck2["default"])(this, FirmwareUpdateFlow);
    this.progressNotifier = progressCallback;
    this.callback = callback;
    this.nativeShim = nativeShim;
    this.flow = new _flow["default"](this, [this._enableFirmwareUpdateMode, this._confirmProtocol, this._clearFirmwareCache, this._sendInfoFrame(file), this._clearCommunicationBuffer, this._setCommunicationBuffer, this._unsTransfer(file)]);
    this.flow.name = 'UNS Firmware Update';
    this.flow.totalPages = Math.ceil(file.length / PAGE_SIZE);
    this.flow.on('ended', function (flow) {
      var _context;

      progressCallback((0, _concat["default"])(_context = "".concat(_this.flow.steps.length, "/")).call(_context, _this.flow.steps.length));

      _this.nativeShim.send('UNS-Firmware-Update-Flow-Command', toHexBuffer(_ingenicoFirmwareUpdateCommands["default"].disableFirmareUpdateMode.request), function (err, resp) {
        return callback(flow.error || err, resp);
      });
    });
    this._expectedFirmwareResponse = (0, _filter["default"])(_context2 = (0, _map["default"])(_context3 = (0, _values["default"])(_ingenicoFirmwareUpdateCommands["default"])).call(_context3, function (_ref) {
      var response = _ref.response;
      return response;
    })).call(_context2, function (response) {
      return !!response;
    });
    this.nativeShim.setExpectedFirmwareResponses(this._expectedFirmwareResponse);
  }

  (0, _createClass2["default"])(FirmwareUpdateFlow, [{
    key: "updateProgressAndSend",
    value: function updateProgressAndSend(flow, command, cb) {
      var _context4;

      this.progressNotifier((0, _concat["default"])(_context4 = "".concat(flow.flow.stepIndex, "/")).call(_context4, flow.flow.steps.length + flow.flow.totalPages));

      var sendCB = cb || function (err) {
        if (err) {
          Log.error('Error', {
            err: err
          });
        }

        flow.nextOrAbort(err);
      };

      this.nativeShim.send('UNS-Firmware-Update-Flow-Command', toHexBuffer(command), sendCB);
    }
  }, {
    key: "_confirmProtocol",
    value: function _confirmProtocol(flow) {
      this.updateProgressAndSend(flow, _ingenicoFirmwareUpdateCommands["default"].confirmProtocol.request);
    }
  }, {
    key: "_clearFirmwareCache",
    value: function _clearFirmwareCache(flow) {
      // 'clearFirmwareCache',
      this.updateProgressAndSend(flow, _ingenicoFirmwareUpdateCommands["default"].clearFirmwareCache.request);
    }
  }, {
    key: "_sendInfoFrame",
    value: function _sendInfoFrame(unsBuffer) {
      var _this2 = this;

      return function (flow) {
        var crc = (0, _crc.crc16ccitt)(unsBuffer);
        var infoFrame = Buffer.alloc(7);
        infoFrame[0] = 0x70;
        infoFrame[1] = 0Xff & crc >> 8;
        infoFrame[2] = 0Xff & crc;
        infoFrame[3] = 0Xff & unsBuffer.length >> 24;
        infoFrame[4] = 0Xff & unsBuffer.length >> 16;
        infoFrame[5] = 0Xff & unsBuffer.length >> 8;
        infoFrame[6] = 0Xff & unsBuffer.length;

        _this2._expectedFirmwareResponse.push((0, _slice["default"])(infoFrame).call(infoFrame, 0, 2).toString('hex'));

        _this2.nativeShim.setExpectedFirmwareResponses(_this2._expectedFirmwareResponse);

        _this2.updateProgressAndSend(flow, infoFrame);
      };
    }
  }, {
    key: "_clearCommunicationBuffer",
    value: function _clearCommunicationBuffer(flow) {
      this.updateProgressAndSend(flow, _ingenicoFirmwareUpdateCommands["default"].settingCommunicationBuffer.request);
    }
  }, {
    key: "_setCommunicationBuffer",
    value: function _setCommunicationBuffer(flow) {
      this.updateProgressAndSend(flow, _ingenicoFirmwareUpdateCommands["default"].confirmCommunicationBuffer.request);
    }
  }, {
    key: "_unsTransfer",
    value: function _unsTransfer(unsBuffer) {
      var _context5,
          _this3 = this;

      var pages = splitBuffer(unsBuffer, PAGE_SIZE);
      var firmwareUpdatePackets = (0, _map["default"])(_context5 = (0, _map["default"])(pages).call(pages, addHeader)).call(_context5, addCRC);

      var isUNSTransferComplete = function isUNSTransferComplete(index) {
        return index === firmwareUpdatePackets.length - 1;
      };

      var sendPageUntil = function sendPageUntil(indexToBeSent) {
        return function (flow) {
          return _this3.updateProgressAndSend(flow, firmwareUpdatePackets[indexToBeSent], function (err) {
            if (err) {
              Log.error('Errored while sending page', {
                err: err
              });
              flow.nextOrAbort(err);
            } else if (isUNSTransferComplete(indexToBeSent)) {
              Log.debug('UNSTransferComplete');
              flow.nextOrAbort();
            } else {
              Log.debug('Sent Page', {
                indexToBeSent: indexToBeSent,
                totalPages: flow.flow.totalPages
              });
              sendPageUntil(indexToBeSent + 1)(flow);
            }
          });
        };
      };

      return sendPageUntil(0);
    }
  }, {
    key: "_enableFirmwareUpdateMode",
    value: function _enableFirmwareUpdateMode(flow) {
      var _context6;

      this.progressNotifier((0, _concat["default"])(_context6 = "".concat(flow.flow.stepIndex, "/")).call(_context6, flow.flow.steps.length + flow.flow.totalPages));

      var sendCB = function sendCB(err) {
        return flow.nextOrAbort(err);
      };

      this.nativeShim.send('enableFirmwareUpdateMode', toHexBuffer(_ingenicoFirmwareUpdateCommands["default"].enableFirmwareUpdateMode.request), sendCB);
    }
  }, {
    key: "start",
    value: function start() {
      this.flow.start();
    }
  }]);
  return FirmwareUpdateFlow;
}();

exports["default"] = FirmwareUpdateFlow;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../common/flow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/flow.js","./ingenicoFirmwareUpdateCommands.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/ingenicoFirmwareUpdateCommands.json","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/values.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/IngenicoCommand.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = exports.EnqueueAction = void 0;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _uniqueId = 0;
var EnqueueAction = {
  cons: 0,
  push: 1
};
exports.EnqueueAction = EnqueueAction;

var IngenicoCommand = /*#__PURE__*/function () {
  function IngenicoCommand(name, apduCommand) {
    (0, _classCallCheck2["default"])(this, IngenicoCommand);
    _uniqueId += 1;
    this.id = _uniqueId;
    this.name = name;
    this.apduCommand = apduCommand;
    this.callbacks = [];
    this.nativeCommand = null;
    this.sendAttempt = 0;
    this.enqueueAction = EnqueueAction.push;
    this.awaiting = false;
    this._timeout = undefined;
    this._timeoutHandle = undefined;
  }

  (0, _createClass2["default"])(IngenicoCommand, [{
    key: "clearTimeout",
    value: function (_clearTimeout) {
      function clearTimeout() {
        return _clearTimeout.apply(this, arguments);
      }

      clearTimeout.toString = function () {
        return _clearTimeout.toString();
      };

      return clearTimeout;
    }(function () {
      if (this._timeoutHandle !== undefined) {
        clearTimeout(this._timeoutHandle);
        this._timeoutHandle = undefined;
      }
    })
  }, {
    key: "timeoutHandle",
    set: function set(value) {
      this._timeoutHandle = value;
    }
  }, {
    key: "timeout",
    get: function get() {
      return this._timeout;
    },
    set: function set(value) {
      this._timeout = value;
    }
  }, {
    key: "rawHexCommand",
    get: function get() {
      return this._rawHex;
    },
    set: function set(value) {
      this._rawHex = value;
    }
  }, {
    key: "responseEventName",
    get: function get() {
      return "".concat(this.name, "-response");
    }
  }, {
    key: "nameWithId",
    get: function get() {
      var _context;

      return (0, _concat["default"])(_context = "".concat(this.name, "-")).call(_context, this.id);
    }
    /**
     * If an existing command is in the command pipeline to be sent/awaiting response, the command writer will append the
     * provided callback to the response of the existing command. This command will not be resent
     * @param value
     */

  }, {
    key: "reuseIfQueued",
    get: function get() {
      return this._reuseIfQueued;
    },
    set: function set(value) {
      this._reuseIfQueued = value;
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        id: this.id,
        name: this.name,
        apduCommand: this.apduCommand ? this.apduCommand.toString('hex') : this._rawHex,
        isRawHex: !!this._rawHex,
        reuseIfQueued: this._reuseIfQueued,
        callbacks: this.callbacks.length,
        nativeCommandName: this.nativeCommand && this.nativeCommand.name,
        isAwaiting: this.awaiting,
        timeout: this.timeout
      };
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }]);
  return IngenicoCommand;
}();

exports["default"] = IngenicoCommand;

},{"@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/IngenicoDevice.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.exec.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var Util = _interopRequireWildcard(require("manticore-util"));

var _ConnectionFlow = _interopRequireDefault(require("./ConnectionFlow"));

var _Terminal = _interopRequireDefault(require("./Terminal"));

var _eventType = _interopRequireDefault(require("./eventType"));

var _ingenicoReaderError = _interopRequireDefault(require("./ingenicoReaderError"));

var _CardStatus = _interopRequireDefault(require("./CardStatus"));

var _transactionEvent = _interopRequireDefault(require("../transaction/transactionEvent"));

var _sdkErrors = require("../common/sdkErrors");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context13;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context13 = Object.prototype.toString.call(o)).call(_context13, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('ingenico');

var IngenicoDevice = /*#__PURE__*/function (_PaymentDevice) {
  (0, _inherits2["default"])(IngenicoDevice, _PaymentDevice);

  var _super = _createSuper(IngenicoDevice);

  function IngenicoDevice(uniqueId, nativeInterface, appInterface, connectionType, hardwareAddress, requestTimeout) {
    var _this;

    (0, _classCallCheck2["default"])(this, IngenicoDevice);
    _this = _super.call(this, uniqueId, nativeInterface, appInterface, connectionType, hardwareAddress, requestTimeout);
    _this.manufacturer = _retailPaymentDevice.deviceManufacturer.ingenico;
    _this.terminal = new _Terminal["default"](_this["native"], (0, _assertThisInitialized2["default"])(_this));
    _this.model = appInterface.model;
    _this.type = _retailPaymentDevice.readerType.Emv;
    _this.performQuickConnect = false;
    return _this;
  }

  (0, _createClass2["default"])(IngenicoDevice, [{
    key: "beginDeviceRemoved",
    value: function beginDeviceRemoved(callback) {
      this["native"].removed(callback);
    }
  }, {
    key: "beginDeviceConnect",
    value: function beginDeviceConnect(callback) {
      var _this2 = this;

      if (this["native"].isConnected()) {
        Log.debug(function () {
          return "Connect called, but ".concat(_this2.id, " is already connected.");
        });
        callback();
        return;
      }

      Log.debug(function () {
        return "Connecting to Ingenico device ".concat(_this2.id);
      });
      var self = this;
      this["native"].connect(function (error) {
        if (error) {
          Log.debug(function () {
            return "Connect response Error ".concat(error);
          });
          callback(error);
          return;
        }

        Log.debug(function () {
          return "Established BT connection with ".concat(_this2.id, ". Will begin the connection flow...");
        });
        self["native"].connectionFlow = new _ConnectionFlow["default"](_this2, callback);
        self["native"].connectionFlow.start().then(function () {
          Log.debug('Connection flow done');
        })["catch"](function (err) {
          Log.error('ConnectionFlowFailed', {
            err: err
          });

          if (callback) {
            callback(err);
          }
        });
      });
    }
  }, {
    key: "listenForCardRemoval",
    value: function listenForCardRemoval(callback) {
      var _this3 = this;

      this.abortTransaction(undefined, function () {
        _this3._waitForCardRemoval(false, callback);
      });
    }
  }, {
    key: "beginDeviceDisconnect",
    value: function beginDeviceDisconnect(callback) {
      var _this4 = this;

      if (this.connectionInProgress && this["native"].cancelConnect) {
        Log.debug(function () {
          return "".concat(_this4.id, " Connection is in progress... Will stop it");
        });
        this["native"].cancelConnect();
      }

      if (!this.isConnected()) {
        Log.debug('Disconnect called, but already disconnected');
        callback(null);
        return;
      }

      this.terminal.disconnect();
      this["native"].disconnect(callback);
    }
  }, {
    key: "formFactors",
    get: function get() {
      var ff = this.isMoby ? [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.MagneticCardSwipe] : [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.EmvCertifiedContactless, _retailPaymentDevice.FormFactor.MagneticCardSwipe];
      return ff;
    }
  }, {
    key: "getFirmwareVersionInfo",
    value: function getFirmwareVersionInfo(callback) {
      this.terminal.getFirmwareVersionInfo(callback);
    }
  }, {
    key: "getVersionInfo",
    value: function getVersionInfo() {
      var os = this.terminal.firmwareChecksum || '';
      var mpi = this.terminal.firmwareCustomVersion || '';
      return {
        os: os,
        mpi: mpi
      };
    }
  }, {
    key: "activateForPayment",
    value: function activateForPayment(context, ffToActivate, showPrompt) {
      var _this5 = this; // eslint-disable-line no-unused-vars


      this.context = context;
      Log.info('DeviceActivateForPayment', {
        crId: this.id,
        context: context,
        ff: Util.getPropertyName(_retailPaymentDevice.FormFactor, ffToActivate),
        showPrompt: showPrompt
      });
      var ff = new _set["default"](ffToActivate);

      if (ff.has(_retailPaymentDevice.FormFactor.EmvCertifiedContactless) && ff.size === 1) {
        // TxContext does incremental activation for Miura but Ingenico does abort first for any formfactor diffs and activate for the incremental formfactor.
        // Because of that, we do activate all if only contactless formfactor requested from tx context.
        ffToActivate = [_retailPaymentDevice.FormFactor.MagneticCardSwipe, _retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.EmvCertifiedContactless]; // eslint-disable-line no-param-reassign

        Log.info('DeviceOnlyEMVCertifiedContactlessRequestedSoHasAllFFs', {
          crId: this.id,
          ff: Util.getPropertyName(_retailPaymentDevice.FormFactor, ffToActivate)
        });
      }

      var invoice = context.invoice;

      var startActivation = function startActivation() {
        // reset cardInSlot before activation
        _this5.cardInSlot = false;
        (0, _get2["default"])((0, _getPrototypeOf2["default"])(IngenicoDevice.prototype), "activateForPayment", _this5).call(_this5, context, ffToActivate, showPrompt);

        if (ff.has(_retailPaymentDevice.FormFactor.EmvCertifiedContactless)) {
          context.emit(_transactionEvent["default"].contactlessReaderActivated);
        }

        var transactionType = context.type === _retailPaymentDevice.TransactionType.Sale || context.type === _retailPaymentDevice.TransactionType.Auth || context.type === _retailPaymentDevice.TransactionType.Vault ? 0 : 20;

        var invoiceTotalCalculator = function invoiceTotalCalculator(inv) {
          var total;

          if (inv) {
            Log.debug(function () {
              var _context;

              return (0, _concat["default"])(_context = "invoiceTotalCalculator invoked with qc=".concat(_this5.context.quickChipEnabled, ", inv.total=")).call(_context, inv.total);
            });
            total = _this5.context.quickChipEnabled && inv.total.isEqualTo(0) ? (0, _paypalInvoicing.$$)(1) : inv.total;
          } else {
            Log.debug(function () {
              return "invoiceTotalCalculator invoked with qc=".concat(_this5.context.quickChipEnabled, ", inv=null");
            });
            total = (0, _paypalInvoicing.$$)(0);
          }

          return total;
        };

        var handleResponse = function handleResponse(err, response) {
          if (err && (context.type === _retailPaymentDevice.TransactionType.Sale || context.type === _retailPaymentDevice.TransactionType.Auth || context.type === _retailPaymentDevice.TransactionType.Vault || context.type === _retailPaymentDevice.TransactionType.Refund && err.code !== _retailPaymentDevice.deviceError.nfcNotAllowed.code)) {
            // Essentially, in case of refunds, treat the decline as a success and move on.
            Log.info('IngenicoDeviceHandlingErr', {
              crId: _this5.id,
              code: err.code
            });

            if (err.code === _ingenicoReaderError["default"].batteryTooLowError) {
              Log.debug(function () {
                var _context2;

                return (0, _concat["default"])(_context2 = "".concat(_this5.id, "  IngenicoDevice low battery err: ")).call(_context2, err.code);
              });

              _this5.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _retailPaymentDevice.deviceError.lowOnBattery, null, _retailPaymentDevice.FormFactor.Chip);

              return;
            }

            if (!context.isPaymentInRetryOrProgress() && (err.code === _ingenicoReaderError["default"].cardReaderNotConnected || err.code === _ingenicoReaderError["default"].cardReaderConnectionLost || err === _retailPaymentDevice.deviceError.deviceNotConnected)) {
              Log.debug(function () {
                var _context3;

                return (0, _concat["default"])(_context3 = "".concat(_this5.id, "  IngenicoDevice NO emit any cardPresented for err: ")).call(_context3, err.code);
              });

              _this5.abortTransaction(context, function () {
                Log.debug(function () {
                  var _context4;

                  return (0, _concat["default"])(_context4 = "".concat(_this5.id, " IngenicoDevice ")).call(_context4, err.code, " aborted...");
                });
              });

              return;
            }

            if (err.code === _ingenicoReaderError["default"].transactionCancelled) {
              _this5.emit(_retailPaymentDevice.PaymentDevice.Event.cancelled);

              return;
            }

            if (err.code === _ingenicoReaderError["default"].noMutuallySupportedAIDs) {
              Log.info('IngenicoDeviceNoMutuallySupportedAIDsAbortAndEmitCardPresentedTryDifferentInterface', {
                crId: _this5.id
              });

              _this5.abortTransaction(context, function () {
                Log.info('IngenicoDeviceNoMutuallySupportedAIDsAbortAndEmitCardPresentedTryDifferentInterface', {
                  crId: _this5.id
                });

                _this5.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _sdkErrors.transaction.tryDifferentInterface, null, _retailPaymentDevice.FormFactor.EmvCertifiedContactless);
              });

              return;
            }

            if (err.code === _ingenicoReaderError["default"].applicationBlocked) {
              Log.info('IngenicoDeviceApplicationBlockedAbortAndEmitCardPresentedSoCardBlocked', {
                crId: _this5.id
              });

              if (_this5.cardInSlot) {
                _this5._waitForCardRemoval(false, function () {
                  Log.info('waitForCardRemovalComplete', {
                    crId: _this5.id
                  });
                });
              } // ApplicationBlocked error is for chip only


              _this5.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _retailPaymentDevice.deviceError.cardBlocked, null, _retailPaymentDevice.FormFactor.Chip);

              return;
            }

            if (err.code === _retailPaymentDevice.deviceError.nfcNotAllowed.code) {
              Log.info('IngenicoDeviceOfflineDecline', {
                crId: _this5.id
              });

              _this5.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _retailPaymentDevice.deviceError.nfcNotAllowed, null, _retailPaymentDevice.FormFactor.EmvCertifiedContactless);

              return;
            }

            _this5.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, err, _retailPaymentDevice.CardPresentEvent.cardDataRead, _retailPaymentDevice.FormFactor.Chip);

            return;
          }

          if (response instanceof _retailPaymentDevice.AvailableApplications) {
            _this5.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.appSelectionRequired, _retailPaymentDevice.FormFactor.Chip, {
              card: null,
              availableApps: response
            });

            return;
          }

          var card = new _CardStatus["default"](response).getPresentedCard(_this5);
          Log.debug(function () {
            var _context5, _context6;

            return (0, _concat["default"])(_context5 = (0, _concat["default"])(_context6 = "Received ICC response from '".concat(Util.getPropertyName(_retailPaymentDevice.FormFactor, card.formFactor), "'\n")).call(_context6, response, "\nCard: ")).call(_context5, card);
          });

          _this5.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, card.failed ? _retailPaymentDevice.deviceError.badSwipeData : null, _retailPaymentDevice.CardPresentEvent.cardDataRead, card.formFactor, {
            card: card
          });
        };

        _this5.terminal.startTransaction(transactionType, invoice, invoiceTotalCalculator, ffToActivate, handleResponse);
      }; // Ingenico device does not allow activation without aborting the previous activation.


      if (this.isActivated) {
        Log.info('AbortAndReActivateWithFFs', {
          crId: this.id,
          ff: ffToActivate
        });
        this.abortTransaction(context, startActivation);
      } else {
        startActivation();
      }
    }
  }, {
    key: "completeTransaction",
    value: function completeTransaction(authCode, callback) {
      if (!this.isConnected()) {
        if (callback) {
          callback(_retailPaymentDevice.deviceError.deviceNotConnected);
        }

        return;
      }

      this.terminal.completeTransaction(authCode, function (err, rz) {
        Log.debug(function () {
          return "Auth code sent. Response : ".concat(rz);
        });

        if (callback) {
          callback(err, rz);
        }
      });
    }
  }, {
    key: "deactivateFormFactors",
    value: function deactivateFormFactors(formFactors) {
      var _this6 = this;

      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

      if (!formFactors || formFactors.length === 0 || !this.isActivated) {
        Log.debug(function () {
          return "No form factors to deactivate. WasActivated? ".concat(_this6.isActivated);
        });
        callback();
        return;
      }

      var sPrevFF = this.getSetOfActiveFormFactors();
      (0, _get2["default"])((0, _getPrototypeOf2["default"])(IngenicoDevice.prototype), "deactivateFormFactors", this).call(this, [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.MagneticCardSwipe, _retailPaymentDevice.FormFactor.EmvCertifiedContactless]);
      Log.debug(function () {
        var _context7, _context8;

        return (0, _concat["default"])(_context7 = "Deactivating form factors '".concat(Util.getPropertyName(_retailPaymentDevice.FormFactor, formFactors), "' on '")).call(_context7, _this6.id, "'. ") + (0, _concat["default"])(_context8 = "Previously active: '".concat(Util.getPropertyName(_retailPaymentDevice.FormFactor, (0, _toConsumableArray2["default"])(sPrevFF)), "', Currently active: '")).call(_context8, Util.getPropertyName(_retailPaymentDevice.FormFactor, (0, _toConsumableArray2["default"])(_this6.getSetOfActiveFormFactors())), "'");
      });
      this.terminal.stopTransaction(function () {
        var _iterator = _createForOfIteratorHelper(formFactors),
            _step;

        try {
          for (_iterator.s(); !(_step = _iterator.n()).done;) {
            var ff = _step.value;
            sPrevFF["delete"](ff);
          }
        } catch (err) {
          _iterator.e(err);
        } finally {
          _iterator.f();
        }

        Log.debug(function () {
          var _context9;

          return (0, _concat["default"])(_context9 = "Deactivated all formFactors on ".concat(_this6.id, ". Will reactivate '")).call(_context9, Util.getPropertyName(_retailPaymentDevice.FormFactor, (0, _toConsumableArray2["default"])(sPrevFF)), "'");
        });

        if (sPrevFF.size > 0) {
          _this6.activateForPayment(_this6.context, (0, _toConsumableArray2["default"])(sPrevFF));
        }

        callback();
      });
    }
  }, {
    key: "abortTransaction",
    value: function abortTransaction(context, callback) {
      var _this7 = this;

      Log.debug(function () {
        return "Aborting tx on '".concat(_this7.id, "'");
      });
      this.terminal.stopTransaction(function () {
        (0, _get2["default"])((0, _getPrototypeOf2["default"])(IngenicoDevice.prototype), "abortTransaction", _this7).call(_this7, context, callback);
      });
    }
  }, {
    key: "postTransactionCleanup",
    value: function postTransactionCleanup(callback) {
      var _this8 = this;

      Log.debug(function () {
        return "postTransactionCleanup on '".concat(_this8.id, "'");
      });
      this.cardInSlot = false;
      this.terminal.postTransactionCleanup(callback);
    }
  }, {
    key: "display",
    value: function display(opt, callback) {
      if (callback) {
        callback();
      }
    }
  }, {
    key: "received",
    value: function received(args) {
      var _this9 = this;

      try {
        this.lastError = null;

        if (!args) {
          Log.warn('emptyUnsolicitedMsgReceived');
          return;
        }

        if (!args.event) {
          Log.warn('unsolicitedMsgReceivedWithoutEventType');
          return;
        }

        var err = args.error;
        var eventName = Util.getPropertyName(_eventType["default"], args.event);

        if (!err) {
          Log.debug(function () {
            var _context10;

            return (0, _concat["default"])(_context10 = "UNSOLICITED Message received for event:'".concat(eventName, "', raw data: ")).call(_context10, args.data);
          });
        } else {
          this.lastError = err;
          Log.error('UNSOLICITEDEvent', {
            name: eventName,
            msg: err.message,
            code: err.code
          });
        }

        if (args.event === _eventType["default"].cardInserted) {
          Log.debug(function () {
            return "Card insert detected on ".concat(_this9.id);
          });
          this.cardInSlot = true;
          this.canAbortTx = true;

          if (!err) {
            this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.insertDetected, _retailPaymentDevice.FormFactor.Chip);
            return;
          }

          if (err.code === _ingenicoReaderError["default"].invalidChip) {
            this.canAbortTx = false;
            this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _retailPaymentDevice.deviceError.invalidChip, null, _retailPaymentDevice.FormFactor.Chip);
            return;
          }

          if (err.code === _ingenicoReaderError["default"].invalidChipSwipeCard) {
            this.canAbortTx = false;
            this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _retailPaymentDevice.deviceError.mustSwipeCard, null, _retailPaymentDevice.FormFactor.Chip);
            return;
          }
        }

        if (args.event === _eventType["default"].cardRemoved) {
          Log.debug(function () {
            return "Card remove detected on ".concat(_this9.id);
          });
          this.cardInSlot = false;

          if (this.isActivated && this.canAbortTx) {
            Log.debug(function () {
              return "cardRemoved detected but startTxInProgress TRUE on ".concat(_this9.id, " so aborting it!");
            });
            this.abortTransaction(this.context, function () {
              Log.debug(function () {
                return "".concat(_this9.id, " IngenicoDevice aborted transaction due to cardRemoved event...");
              });
            });
          }

          this.emit(_retailPaymentDevice.PaymentDevice.Event.cardRemoved);
          return;
        }

        if (args.event === _eventType["default"].cardSwiped) {
          if (err.code === _ingenicoReaderError["default"].pleaseInsertCard) {
            this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _sdkErrors.transaction.cannotSwipeChipCard, _retailPaymentDevice.CardPresentEvent.insertDetected, _retailPaymentDevice.FormFactor.MagneticCardSwipe);
            return;
          }
        }

        if (args.event === _eventType["default"].cardTapped) {
          if (err.code === _ingenicoReaderError["default"].multipleContactlessCardsDetected) {
            this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _sdkErrors.transaction.multipleContactlessCardsDetected, _retailPaymentDevice.CardPresentEvent.insertDetected, _retailPaymentDevice.FormFactor.EmvCertifiedContactless);
          }

          if (err.code === _ingenicoReaderError["default"].contactlessInterfaceFailedTryContact) {
            this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _retailPaymentDevice.deviceError.nfcNotAllowed, null, _retailPaymentDevice.FormFactor.EmvCertifiedContactless);
          }

          if (err.code === _ingenicoReaderError["default"].pleaseSeePhone) {
            this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _retailPaymentDevice.deviceError.seePhone, null, _retailPaymentDevice.FormFactor.EmvCertifiedContactless);
          }
        }
      } catch (x) {
        Log.error('ErrHandlingUnsolicitedMsg', {
          args: args,
          err: x
        });
        throw x;
      }
    }
  }, {
    key: "getBatteryInfo",
    value: function getBatteryInfo(callback) {
      this.terminal.getBatteryLevel(true, callback);
    }
  }, {
    key: "getBatteryInfoAsync",
    value: function () {
      var _getBatteryInfoAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
        var _context11;

        return _regenerator["default"].wrap(function _callee$(_context12) {
          while (1) {
            switch (_context12.prev = _context12.next) {
              case 0:
                return _context12.abrupt("return", Util.callbackToPromise((0, _bind["default"])(_context11 = this.getBatteryInfo).call(_context11, this)));

              case 1:
              case "end":
                return _context12.stop();
            }
          }
        }, _callee, this);
      }));

      function getBatteryInfoAsync() {
        return _getBatteryInfoAsync.apply(this, arguments);
      }

      return getBatteryInfoAsync;
    }()
  }, {
    key: "_waitForCardRemoval",
    value: function _waitForCardRemoval(useTimeout, callback) {
      this.terminal.waitForCardRemoval(useTimeout, callback);
    }
  }, {
    key: "selectPaymentApplication",
    value: function selectPaymentApplication(appId) {
      var _this10 = this;

      this.terminal.selectApplication(appId, function (err, rz) {
        if (err) {
          _this10.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, err, _retailPaymentDevice.CardPresentEvent.cardDataRead, _retailPaymentDevice.FormFactor.Chip);

          return;
        }

        Log.debug(function () {
          return "Received ICC card data from Application select: ".concat(rz);
        });
        var card = new _CardStatus["default"](rz).getPresentedCard(_this10);

        _this10.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.cardDataRead, card.formFactor, {
          card: card
        });
      });
    }
  }, {
    key: "doesHaveCapability",
    value: function doesHaveCapability(capability) {
      switch (capability) {
        case _retailPaymentDevice.deviceCapabilityType.contactless:
          return this.model === _retailPaymentDevice.ReaderModel.RP450;

        default:
          return false;
      }
    }
  }]);
  return IngenicoDevice;
}(_retailPaymentDevice.PaymentDevice);

exports["default"] = IngenicoDevice;

},{"../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../transaction/transactionEvent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionEvent.js","./CardStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/CardStatus.js","./ConnectionFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/ConnectionFlow.js","./Terminal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/Terminal.js","./eventType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/eventType.js","./ingenicoReaderError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/ingenicoReaderError.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/IngenicoTags.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _tlvlib = require("tlvlib");
/* eslint max-len: "off" */


var IngenicoTags = {
  // Amount DOL
  ApplicationEffectiveDate: new _tlvlib.DefinedTag('ApplicationEffectiveDate', 0x5F25, _tlvlib.ValueFormat.Binary, 3),
  ApplicationLabel: new _tlvlib.DefinedTag('ApplicationLabel', 0x50, _tlvlib.ValueFormat.Binary, 16),
  CardHolderName: new _tlvlib.DefinedTag('CardHolderName', 0x5F20, _tlvlib.ValueFormat.Binary, 26),
  ApplicationPreferredName: new _tlvlib.DefinedTag('ApplicationPreferredName', 0x9F12, _tlvlib.ValueFormat.Binary, 16),
  ApplicationExpirationDate: new _tlvlib.DefinedTag('ApplicationExpirationDate', 0x5F24, _tlvlib.ValueFormat.Binary, 3),
  CertificationVerificationValue: new _tlvlib.DefinedTag('CertificationVerificationValue', 0xDF50, _tlvlib.ValueFormat.Binary, 12),
  PAN: new _tlvlib.DefinedTag('PAN', 0x5A, _tlvlib.ValueFormat.Binary, 10),
  PANSequenceNumber: new _tlvlib.DefinedTag('PANSequenceNumber', 0x5F34, _tlvlib.ValueFormat.Binary, 1),
  TerminalApplicationIdentifier: new _tlvlib.DefinedTag('TerminalApplicationIdentifier', 0x9F06, _tlvlib.ValueFormat.Binary),
  // Online DOL
  TerminalVerificationResults: new _tlvlib.DefinedTag('TerminalVerificationResults', 0x95, _tlvlib.ValueFormat.Binary, 5),
  ApplicationCryptogram: new _tlvlib.DefinedTag('ApplicationCryptogram', 0x9F26, _tlvlib.ValueFormat.Binary, 8),
  ApplicationTransactionCounter: new _tlvlib.DefinedTag('ApplicationTransactionCounter', 0x9F36, _tlvlib.ValueFormat.Binary, 2),
  CardholderVerificationMethodResult: new _tlvlib.DefinedTag('CardholderVerificationMethodResult', 0x9F34, _tlvlib.ValueFormat.Binary, 3),
  CryptogramInformationData: new _tlvlib.DefinedTag('CryptogramInformationData', 0x9F27, _tlvlib.ValueFormat.Binary, 1),
  IssuerApplicationData: new _tlvlib.DefinedTag('IssuerApplicationData', 0x9F10, _tlvlib.ValueFormat.Binary, 32),
  TransactionStatusInformation: new _tlvlib.DefinedTag('TransactionStatusInformation', 0x9B, _tlvlib.ValueFormat.Binary, 2),
  UnpredictableNumber: new _tlvlib.DefinedTag('UnpredictableNumber', 0x9F37, _tlvlib.ValueFormat.Binary, 4),
  // Command Tags
  AmountAuthorizedBinary: new _tlvlib.DefinedTag('AmountAuthorizedBinary', 0x81, _tlvlib.ValueFormat.CompressedNumeric, 4),
  AmountOtherBinary: new _tlvlib.DefinedTag('AmountOtherBinary', 0x9F04, _tlvlib.ValueFormat.CompressedNumeric, 4),
  TransactionCurrencyExponent: new _tlvlib.DefinedTag('TransactionCurrencyExponent', 0x5F36, _tlvlib.ValueFormat.Numeric, 1),
  OverallContactlessTransactionLimit: new _tlvlib.DefinedTag('OverallContactlessTransactionLimit', 0xDF65, _tlvlib.ValueFormat.CompressedAlpha, 4),
  AuthorizationResponseCodeList: new _tlvlib.DefinedTag('AuthorizationResponseCodeList', 0xDF16, _tlvlib.ValueFormat.CompressedAlpha),
  POSEntryMode: new _tlvlib.DefinedTag('POSEntryMode', 0x9F39, _tlvlib.ValueFormat.CompressedNumeric, 1),
  DOLAnswerFormat: new _tlvlib.DefinedTag('DOLAnswerFormat', 0xDF8229, _tlvlib.ValueFormat.CompressedAlpha),
  TerminalCountryCode: new _tlvlib.DefinedTag('TerminalCountryCode', 0x9F1A, _tlvlib.ValueFormat.CompressedNumeric, 2),
  TerminalCapabilities: new _tlvlib.DefinedTag('TerminalCapabilities', 0x9F33, _tlvlib.ValueFormat.CompressedAlpha, 3),
  AdditionalTerminalCapabilities: new _tlvlib.DefinedTag('AdditionalTerminalCapabilities', 0x9F40, _tlvlib.ValueFormat.CompressedAlpha, 5),
  TerminalIdentification: new _tlvlib.DefinedTag('TerminalIdentification', 0x9F1C, _tlvlib.ValueFormat.CompressedNumeric, 8),
  ExtraProgressMessageFlag: new _tlvlib.DefinedTag('ExtraProgressMessageFlag', 0xDF68, _tlvlib.ValueFormat.CompressedNumeric, 1),
  TerminalApplicationVersionNumber: new _tlvlib.DefinedTag('TerminalApplicationVersionNumber', 0x9F09, _tlvlib.ValueFormat.CompressedNumeric, 2),
  GenerateACControl: new _tlvlib.DefinedTag('GenerateACControl', 0xDF72, _tlvlib.ValueFormat.CompressedNumeric, 1),
  TerminalType: new _tlvlib.DefinedTag('TerminalType', 0x9F35, _tlvlib.ValueFormat.CompressedNumeric, 1),
  TransactionCategoryCode: new _tlvlib.DefinedTag('TransactionCategoryCode', 0x9F53, _tlvlib.ValueFormat.CompressedNumeric, 1),
  ContactlessInformationOut: new _tlvlib.DefinedTag('ContactlessInformationOut', 0xDF6F, _tlvlib.ValueFormat.Binary, 2),
  BatteryLevelThreshold: new _tlvlib.DefinedTag('BatteryLevelThreshold', 0xDF8239, _tlvlib.ValueFormat.CompressedNumeric, 1),
  MaskedTrack2: new _tlvlib.DefinedTag('MaskedTrack2', 0xDF8257, _tlvlib.ValueFormat.Alpha),
  MaskedTrack1: new _tlvlib.DefinedTag('MaskedTrack1', 0xDF8256, _tlvlib.ValueFormat.Alpha),
  // Others
  AcquirerExclusionList: new _tlvlib.DefinedTag('AcquirerExclusionList', 0xFF7F, _tlvlib.ValueFormat.Binary),
  RFParam: new _tlvlib.DefinedTag('RFParam', 0xDF8240, _tlvlib.ValueFormat.CompressedNumeric, 2),
  AcquirerIdentifier: 0x9F01,
  AlternateMessageForRemoveCardPrompt: 0xDF73,
  AmexExpresspayPseudoTrack1Data: 0xDF45,
  AmexExpresspayPseudoTrack2Data: 0xDF46,
  DiscoverDPASPseudoTrack1Data: 0xDF56,
  DiscoverDPASPseudoTrack2Data: 0xDF57,
  AmexExpresspayUnpredictableNumberRange: 0xDF44,
  DefaultValueForDDOL: 0xDF15,
  AmountAuthorizedNumeric: 0x9F02,
  AmountOfLasttransactionWithSameCard: 0xDF25,
  AmountOtherNumeric: 0x9F03,
  AmountReferenceCurrency: 0x9F3A,
  ApplicationCurrencyExponent: 0x9F44,
  ApplicationCurrencyCode: 0x9F42,
  ApplicationDiscretionaryData: 0x9F05,
  ServiceCode: 0x5F30,
  ApplicationFileLocator: 0x94,
  ApplicationIdentifier: 0x4F,
  ApplicationInterchangeProfile: 0x82,
  ApplicationPriorityIndicator: 0x87,
  ApplicationTemplate: 0x61,
  ApplicationUsageControl: 0x9F07,
  ApplicationVersionNumber: 0x9F08,
  AuthorizationCode: 0x89,
  AuthorizationResponseCode: 0x8A,
  BankIndentifierCode: 0x5F54,
  CanadianFlag: 0xDF8222,
  CardAdditionalProcesses: 0x9F68,
  CardholderLanguage: 0xDF12,
  CardholderVerificationMethodList: 0x8E,
  CardIsInTheHotlist: 0xDF26,
  CardRiskManagementDataObjectList1: 0x8C,
  CardRiskManagementDataObjectList2: 0x8D,
  CertificationAuthorityPublicKeyIndex: 0x8F,
  ContactlessKernelIdentifier: 0xDF6C,
  ContactlessSignatureCheckResult: 0xDF6E,
  CustomerExclusiveData: 0x9F7C,
  CVMOUTresult: 0xDF38,
  DedicatedFileName: 84,
  DefaultValueForTDOL: 0xDF18,
  DirectoryDefinitionFile: 0x9D,
  DirectoryDiscretionaryTemplate: 0x73,
  DynamicDataAuthenticationDataObjectList: 0x9F49,
  FileControlInformationIssuerDiscretionaryData: 0xBF0C,
  FileControlInformationTemplate: 0xA5,
  FDDAVersion: 0x9F69,
  FormFactorIndicator: 0x9F6E,
  HandOverCardFlag: 0xDF71,
  ICCDynamicNumber: 0x9F4C,
  ICCPINEnciphermentPublicKeyCertificate: 0x9F2D,
  ICCPINEnciphermentPublicKeyExponent: 0x9F2E,
  ICCPINEnciphermentPublicKeyRemainder: 0x9F2F,
  ICCPublicKeyCertificate: 0x9F46,
  ICCPublicKeyExponent: 0x9F47,
  ICCPublicKeyRemainder: 0x9F48,
  InterfaceDeviceSerialNumber: 0x9F1E,
  InternationalBankAccountNumber: 0x5F53,
  IssuerAuthenticationData: 0x91,
  IssuerCountryCode: 0x5F28,
  IssuerCountryCodeAlpha2: 0x5F55,
  IssuerCountryCodeAlpha3: 0x5F56,
  IssuerIdentificationNumber: 42,
  IssuerPublicKeyExponent: 0x9F32,
  IssuerPublicKeyRemainder: 0x92,
  IssuerScript1: 0x71,
  IssuerScript2: 0x72,
  IssuerScriptCommand: 0x86,
  IssuerScriptResults: 0xDF11,
  IssuerScriptResultsForProcessor: 0x9F5B,
  KSN: 0xDF8225,
  ListOfTransactionTypesUsedByTheApplication: 0xDF3A,
  LanguagePreference: 0x5F2D,
  LogFormat: 0x9F4F,
  MACData: 0xDF8205,
  MACDOL: 0xDF8204,
  MACInitialisationVector: 0xDF8206,
  MasterSessionKeyLocator: 0xDF8220,
  Maximumtargetpercentage: 0xDF09,
  MerchantCategoryCode: 0x9F15,
  MerchantIdentifier: 0x9F16,
  OnlinePINBlock: 0xDF4F,
  OnlinePINBlockFormat: 0xDF8202,
  OnlinePINBlockKeyLocator: 0xDF8200,
  OnlinePINSMID: 0xDF4E,
  PayPassThirdPartyData: 0x9F6E,
  PayPassTransactionOutcome: 0xDF6D,
  PINEntryDisplayPromptString: 0xDF69,
  ProcessingOptionsDataObjectList: 0x9F38,
  ReaderRiskParameterRecord: 0xDF6B,
  ResponseMessageTemplateFormat1: 80,
  ResponseMessageTemplateFormat2: 77,
  ResultofOnlineProcess: 0xDF39,
  RetryConfigurationFlag: 0xDF74,
  RoamEncryptedEMVdata: 0xDF8223,
  EncryptedTrack: 0xDF8223,
  ManuallyEnteredPAN: 0xDF8226,
  ManuallyEnteredExpiryDate: 0xDF8227,
  SignedDynamicApplicationData: 0x9F4B,
  SignedStaticApplicationData: 0x93,
  StaticDataAuthenticationTagList: 0x9F4A,
  TargetPercentage: 0xDF08,
  TerminalActionCodeDefault: 0xDF03,
  TerminalActionCodeDenial: 0xDF04,
  TerminalActionCodeOnline: 0xDF05,
  TerminalConfiguration: 0xDF3D,
  TerminalDecisionafterGenerateAC: 0xDF31,
  TerminalFloorLimit: 0x9F1B,
  TerminalOptions: 0xDF0B,
  TerminalRiskManagementData: 0x9F1D,
  ThresholdValue: 0xDF07,
  Track1Data: 0x56,
  Track2DataMasterCard: 0x9F6B,
  Track2EquivalentData: 57,
  TransactionCertificateDataObjectList: 0x97,
  TransactionCertificateHashValue: 0x98,
  TransactionClass: 0xDF4D,
  TransactionCurrencyCode: 0x5F2A,
  TransactionDate: 0x9A,
  TransactionForcedOnline: 0xDF1C,
  TransactionPersonalIdentificationNumberData: 0x99,
  TransactionReferenceCurrency: 0x9F3C,
  TransactionReferenceCurrencyExponent: 0x9F3D,
  TransactionSequenceCounter: 0x9F41,
  TransactionTime: 0x9F21,
  TransactionType: 0x9C,
  TransactionTypeDescription: 0xDF70,
  VerificationonlyTransactionFlag: 0xDF75,
  VisaContactlessOfflineAvailableSpendingAmount: 0x9F5D,
  VisaDebitOptOut: 0xDF8221,
  VisaTerminalEntryCapability: 0xDF6A,
  WrapperforIssuerScriptTagWithIncorrectLength: 0xDF0C,
  ApplicationReferenceCurrency: 0x9F3B,
  ApplicationReferenceCurrencyExponent: 0x9F43,
  CardholderNameExtended: 0x9F0B,
  DataAuthenticationCode: 0x9F45,
  FCITemplate: 0x6F,
  IssuerActionCodeDefault: 0x9F0D,
  IssuerActionCodeDenial: 0x9F0E,
  IssuerActionCodeOnline: 0x9F0F,
  IssuerCodeTableIndex: 0x9F11,
  IssuerPublicKeyCertificate: 0x90,
  LowerConsecutiveOfflineLimit: 0x9F14,
  PersonalIdentificationNumberTryCounter: 0x9F17,
  ShortFileIndicator: 0x88,
  Track1DiscretionaryData: 0x9F1F,
  Track2DiscretionaryData: 0x9F20,
  UpperConsecutiveOfflineLimit: 0x9F23,
  CVC3: 0x9F61,
  PCVC3: 0x9F62,
  LogEntry: 0x9F4D,
  IssuerURL: 0x5F50,
  VLPAvailableFunds: 0x9F79,
  VLPFundsLimit: 0x9F77,
  VLPIssuerAuthorisationCode: 0x9F74,
  VLPSingleTransactionLimit: 0x9F78,
  TerminalCompatibilityIndicator: 0x9F52,
  VLPResetThreshold: 0x9F6D,
  VLPTerminalTransactionLimit: 0x9F7B,
  LastOnlineApplicationTransactionCounterRegister: 0x9F13,
  PUNATCTrack1: 0x9F63,
  NATCTrack2: 0x9F67,
  CVC3Track1: 0x9F60,
  NATCTrack1: 0x9F64,
  PCVC3rack2: 0x9F65,
  Track2DataContactless: 0x9F6B,
  CertificationAuthorityPKI: 0x9F22,
  IssuerScriptIdentifier: 0x9F18,
  MerchantNameLocation: 0x9F4E,
  VLPTerminalSupportIndicator: 0x9F7A,
  AccountType: 0x5F57,
  PUNATCTrack2: 0x9F66,
  CardTransactionQualifiers: 0x9F6C,
  ApplicationProgramIdentifier: 0x9F5A,
  OutcomeParameterSet: 0xDF8129
};
var _default = IngenicoTags;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/Parser.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.parseCardData = parseCardData;
exports.parseStatus = parseStatus;

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _TransactionDataResponse = _interopRequireDefault(require("./TransactionDataResponse"));

var Log = (0, _manticoreLog["default"])('ingenico.parser');

function parseStatus(data) {
  try {
    var status = (0, _slice["default"])(data).call(data, 0, 2);
    status = Buffer.from(status, 'hex');
    return status[0];
  } catch (x) {
    Log.error('cardStatusParseFailed', {
      data: data,
      err: x,
      msg: x.message,
      stack: x.stack
    });
    throw x;
  }
}

function parseCardData(data) {
  try {
    // TODO Check for unsolicited events here.
    var status = parseStatus(data);
    var raw = (0, _slice["default"])(data).call(data, 2, data.length);
    raw = Buffer.from(raw, 'hex');
    return new _TransactionDataResponse["default"](status, raw, false);
  } catch (x) {
    Log.error('ingenicoPacketParseFailed', {
      data: data,
      err: x,
      msg: x.message,
      stack: x.stack
    });
    throw x;
  }
}

}).call(this)}).call(this,require("buffer").Buffer)
},{"./TransactionDataResponse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/TransactionDataResponse.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/SoftwareUpdate/IngenicoDeviceUpdate.js":[function(require,module,exports){
"use strict";

require("core-js/modules/es.object.to-string.js");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.split.js");

require("core-js/modules/es.string.replace.js");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _async = _interopRequireDefault(require("async"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreUtil = require("manticore-util");

var _moment = _interopRequireDefault(require("moment"));

var _flow = _interopRequireDefault(require("../../common/flow"));

var _saveReader = require("../../common/saveReader");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context18;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context18 = Object.prototype.toString.call(o)).call(_context18, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Log = (0, _manticoreLog["default"])('ingenico.fwUpdate');
var blobDecodedStorage = 'BD';
var maxAttempts = 2;
var INGENICO_CONNECTION_RETRY_LIMIT = 10;
var INGENICO_CONNECTION_RETRY_TIMEOUT = 20000;
var lastIngenicoLogState;
var switchedOff;
var isProgressFileFetches = {};
/**
 * Shut off the Ingenico debug logs except our own component,
 * then reset them to where they were when done.
 * @param on
 */

function ingenicoLogs(on) {
  var exl = require('@paypalcorp/manticore-log')["default"]('paymentDevice.ingenicoDevice'); // eslint-disable-line global-require


  if (on && switchedOff) {
    switchedOff = false;

    if (lastIngenicoLogState) {
      exl.Config.level = lastIngenicoLogState;
    } else {
      delete exl.Config.level;
    }

    delete Log.Config.level;
    Log.debug('Re-enabled logs.');
  } else if (!on && !switchedOff) {
    Log.debug('Squelching Ingenico debug logs.');
    lastIngenicoLogState = exl.Config.level;
    switchedOff = true;
    exl.Config.level = 'INFO';
    Log.Config.level = 'DEBUG';
  }
}

function getNameFromUrl(url) {
  var finalName = url.split('/');
  finalName = finalName[finalName.length - 1];
  return finalName;
}

function pushModules(requiredUrlArray, urls, version) {
  if (requiredUrlArray) {
    var _iterator = _createForOfIteratorHelper(urls),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var url = _step.value;
        requiredUrlArray.push({
          url: url,
          version: version
        });
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }
  }
}

function _addObjectToRemoteConfig(remoteConfig, newConfig) {
  var combinedConfig = remoteConfig;

  if (combinedConfig) {
    for (var key in newConfig) {
      if (Object.prototype.hasOwnProperty.call(newConfig, key)) {
        combinedConfig[key] = newConfig[key];
      }
    }
  } else {
    combinedConfig = newConfig;
  }

  return combinedConfig;
}

function getOne(iDeviceUpdate, fileInfo, cb) {
  var retryCount = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
  var url = fileInfo.url;
  var itemNameUrl = fileInfo.url + fileInfo.version; // Add version to the file name to ensure that we get a new file when available

  _manticore["default"].getItem(itemNameUrl, blobDecodedStorage, function (error, item) {
    if (item) {
      Log.debug(function () {
        return "Retrieved from CACHE ".concat(url);
      });

      _manticore["default"].setTimeout(function () {
        return cb(null, item);
      }, 0);

      return;
    } // If a fetch is already in progress, and we're not it, don't do it twice.


    if (retryCount === 0) {
      if (isProgressFileFetches[url]) {
        Log.debug(function () {
          return "Waiting for existing fetch of ".concat(url);
        });
        isProgressFileFetches[url].push(cb);
        return;
      }

      isProgressFileFetches[url] = [cb];
    }

    Log.debug(function () {
      return "Fetching firmware update file ".concat(url);
    });
    var start = (0, _moment["default"])();
    var fileName = getNameFromUrl(url).toLowerCase();
    Log.debug(function () {
      return "fileName: ".concat(fileName);
    });
    var format = fileName.substr(-5) === '.json' ? 'json' : 'binary';
    Log.debug(function () {
      var _context;

      return (0, _concat["default"])(_context = "fileName: ".concat(fileName, " format: ")).call(_context, format);
    });

    _manticore["default"].http({
      url: url,
      format: format
    }, function (err, rz) {
      var timeDiff = iDeviceUpdate.device.terminal.getTimeDiff(start);

      if (err) {
        Log.error('DeviceUpdateAttemptFailed', {
          updateAttempt: retryCount || 0,
          maxAttempts: maxAttempts,
          timeDiff: timeDiff,
          url: url,
          err: err
        });
      } else {
        Log.debug(function () {
          var _context2;

          return (0, _concat["default"])(_context2 = "Download duration: ".concat(timeDiff, ". Done with ")).call(_context2, url);
        });
      }

      if (!err && format === 'json') {
        var remoteConfig = iDeviceUpdate.device.terminal.remoteConfig;
        iDeviceUpdate.device.terminal.remoteConfig = _addObjectToRemoteConfig(remoteConfig, rz.body); // When we have only one config update, retain the version number of the other one
        // So default = firmwareCustomVersion

        iDeviceUpdate.device.terminal.remoteConfig.version = iDeviceUpdate.device.terminal.remoteConfig.version || iDeviceUpdate.device.terminal.firmwareCustomVersion;
        var fileInfoVersion = (0, _parseInt2["default"])(fileInfo.version, 10);
        Log.debug(function () {
          var _context3;

          return (0, _concat["default"])(_context3 = "file ".concat(fileName, " fileInfoVersion: ")).call(_context3, fileInfoVersion);
        });

        if (fileName === 'ingenico_capkeys.json') {
          fileInfoVersion = (0, _parseInt2["default"])(fileInfo.version, 10) << 16;
          iDeviceUpdate.device.terminal.remoteConfig.version &= 0xffff; // Clear bytes of the old capKeys version

          Log.debug(function () {
            var _context4;

            return (0, _concat["default"])(_context4 = "file ".concat(fileName, " fileInfoVersion: ")).call(_context4, fileInfoVersion);
          });
          Log.debug(function () {
            var _context5;

            return (0, _concat["default"])(_context5 = "".concat(fileName, " remote.Configversion: ")).call(_context5, iDeviceUpdate.device.terminal.remoteConfig.version);
          });
        } else {
          iDeviceUpdate.device.terminal.remoteConfig.version &= 0xffff0000; // Clear bytes of the old config version

          Log.debug(function () {
            var _context6;

            return (0, _concat["default"])(_context6 = "".concat(fileName, " remote.Configversion: ")).call(_context6, iDeviceUpdate.device.terminal.remoteConfig.version);
          });
        }

        iDeviceUpdate.device.terminal.remoteConfig.version |= fileInfoVersion;
        Log.debug(function () {
          return "remoteConfig.version: ".concat(iDeviceUpdate.device.terminal.remoteConfig.version);
        });
      } else if (!err) {
        // Add version to the file name to ensure that we get a new file when available
        _manticore["default"].setItem(itemNameUrl, blobDecodedStorage, rz.body, function () {});
      } else if (retryCount < maxAttempts) {
        Log.warn('FetchFailedStartRetry.', {
          url: url
        });
        getOne(iDeviceUpdate, fileInfo, cb, (retryCount || 0) + 1);
        return;
      }

      var _iterator2 = _createForOfIteratorHelper(isProgressFileFetches[url]),
          _step2;

      try {
        for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
          var callback = _step2.value;
          callback(err, rz);
        }
      } catch (err) {
        _iterator2.e(err);
      } finally {
        _iterator2.f();
      }

      delete isProgressFileFetches[url];
    });
  });
}

var IngenicoDeviceUpdate = /*#__PURE__*/function (_DeviceUpdate) {
  (0, _inherits2["default"])(IngenicoDeviceUpdate, _DeviceUpdate);

  var _super = _createSuper(IngenicoDeviceUpdate);

  function IngenicoDeviceUpdate(device) {
    var _this;

    (0, _classCallCheck2["default"])(this, IngenicoDeviceUpdate);
    _this = _super.call(this, device);
    _this.files = {};
    _this.updates = {};
    return _this;
  }

  (0, _createClass2["default"])(IngenicoDeviceUpdate, [{
    key: "beginDeviceUpdate",
    value: function beginDeviceUpdate(callback) {
      var _this2 = this; // TODO Move transactionErrors to retail-payment-device when we rebase with the latest develop branch


      Log.info('BeginningSWUpdate', {
        crId: this.device.id
      });
      isProgressFileFetches = {};
      var updateSteps = [];

      if (this.device.updates) {
        Log.debug(function () {
          return "Found ".concat(_this2.device.updates.length, " module updates");
        });
        updateSteps.push(this.updateSWModules);
      }

      var flow = new _flow["default"](this, updateSteps);
      flow.name = 'Firmware Update';
      flow.on('ended', function (data) {
        var err = data.error;

        var timeDiff = _this2.device.terminal.getTimeDiff(_this2.startTime);

        if (err) {
          Log.error('SoftwareUpdateFailed', {
            deviceId: _this2.device.id,
            err: err,
            timeDiff: timeDiff
          });

          if (err.domain === _retailPaymentDevice.deviceError.corruptFirmware.domain && err.code === _retailPaymentDevice.deviceError.corruptFirmware.code) {
            _this2.isRequired = false;
            Log.info('MarkingUpdateAsOptionalAsDownloadFileWasCorrupt', {
              crId: _this2.device.id
            });
          }
        } else {
          // TODO Add total time taken
          Log.info('FirmwareUpdateComplete', {
            crId: _this2.device.id,
            timeDiff: timeDiff
          });
        }

        if (_this2.appAlert) {
          _this2.appAlert.dismiss();
        }

        callback(err, !err);
      });
      this.startTime = (0, _moment["default"])();
      flow.start();
    }
  }, {
    key: "validateUpdateEligibility",
    value: function validateUpdateEligibility(callback) {
      var canUpdate = !(this.device.batteryInfo && this.device.batteryInfo.isLevelUpdateCritical);

      if (canUpdate) {
        callback();
      }
    }
  }, {
    key: "_disableLogs",
    value: function _disableLogs(flow) {
      Log.debug('Disabling ingenico logs');
      ingenicoLogs(false);
      flow.next(null);
    }
  }, {
    key: "_enableLogs",
    value: function _enableLogs(flow) {
      Log.debug('Enabling logs');
      ingenicoLogs(true);
      flow.next(null);
    }
  }, {
    key: "updateSWModules",
    value: function updateSWModules(flow) {
      var _this3 = this;

      var moduleUpdateFlow = new _flow["default"](this, this._gatherFiles, this._calculateUpdateSteps, this._updateOs, this._tryReconnect, this._retrieveVersionInfo, this._updateConfig, this._verifyUpdate, this._setConfigVersion, this._updateDeviceName);
      moduleUpdateFlow.name = 'Software Module Update Flow';
      moduleUpdateFlow.on('ended', function (data) {
        Log.info('SoftwareModulesUpdateEnded', {
          crId: _this3.device.id,
          err: data.error
        });

        _this3._alertProgress(moduleUpdateFlow, 'Configuration', true);

        if (_this3.appAlert) {
          _this3.appAlert.dismiss();
        }

        flow.nextOrAbort(data.error);
      });
      this.appAlert = this.device.app.display({
        title: _retailPaymentDevice.appMessage.SwUpdateInProgress.title,
        message: _retailPaymentDevice.appMessage.SwUpdateInProgress.message,
        showActivity: true
      });
      moduleUpdateFlow.start();
    }
  }, {
    key: "_generateSteps",
    value: function _generateSteps(module) {
      var steps = [];

      if (module.urls) {
        var _iterator3 = _createForOfIteratorHelper(module.urls),
            _step3;

        try {
          for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
            var url = _step3.value;
            steps.push({
              name: getNameFromUrl(url),
              url: url,
              version: module.version,
              reload: module.reload
            });
          }
        } catch (err) {
          _iterator3.e(err);
        } finally {
          _iterator3.f();
        }
      }

      if (module.subcomponents) {
        var _iterator4 = _createForOfIteratorHelper(module.subcomponents),
            _step4;

        try {
          for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
            var component = _step4.value;
            steps.push.apply(steps, (0, _toConsumableArray2["default"])(this._generateSteps(component)));
          }
        } catch (err) {
          _iterator4.e(err);
        } finally {
          _iterator4.f();
        }
      }

      return steps;
    }
  }, {
    key: "_gatherFiles",
    value: function _gatherFiles(flow) {
      var _this4 = this;

      var _iterator5 = _createForOfIteratorHelper(this.device.updates),
          _step5;

      try {
        var _loop = function _loop() {
          var u = _step5.value;

          var steps = _this4._generateSteps(u);

          _this4.updates[u.name] = steps;
          Log.debug(function () {
            var _context7;

            return (0, _concat["default"])(_context7 = "Gathered update ".concat(u.name, "\n")).call(_context7, (0, _stringify["default"])(steps));
          });
        };

        for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
          _loop();
        }
      } catch (err) {
        _iterator5.e(err);
      } finally {
        _iterator5.f();
      }

      this._fetchFiles(this.device, function (e) {
        Log.debug('Ready for software update.');
        flow.nextOrAbort(e);
      });
    }
  }, {
    key: "_fetchFiles",
    value: function _fetchFiles(device, callback) {
      var _this5 = this;

      var filesToFetch = []; // let fetchCtr = 0;

      IngenicoDeviceUpdate.needsUpdate(device, device.updates, filesToFetch);
      Log.debug(function () {
        return "Preparing to download ".concat(filesToFetch.length, " files");
      });

      _async["default"].eachSeries(filesToFetch, function (fileInfo, cb) {
        getOne(_this5, fileInfo, cb);
      }, callback);
    }
  }, {
    key: "_calculateUpdateSteps",
    value: function _calculateUpdateSteps(flow) {
      var pkLen = this.device.terminal.remoteConfig.PublicKeys ? this.device.terminal.remoteConfig.PublicKeys.length : 0; // If FW update is required, the number of steps will be known on the first progress message

      flow.data.configUpdateStepCount = pkLen + 16; // FW update steps will be added later, if required

      flow.data.fwUpdateStepCount = 1;
      flow.data.currentStepNumber = 0;
      flow.next(); // Count and add public keys to updateSteps
    }
  }, {
    key: "_fWUpdateProgressHandler",
    value: function _fWUpdateProgressHandler(flow, updateProgressMessage) {
      var _updateProgressMessage = updateProgressMessage || '0/0';

      var updateProgressParts = _updateProgressMessage.split('/');

      flow.data.fwUpdateStepCount = (0, _parseInt2["default"])(updateProgressParts[1], 10) + 1;
      flow.data.currentStepNumber = (0, _parseInt2["default"])(updateProgressParts[0], 10);

      this._alertProgress(flow, 'OS');
    }
  }, {
    key: "_addAndAlertProgress",
    value: function _addAndAlertProgress(flow, stageId, updateCount) {
      var _this6 = this;

      Log.debug(function () {
        var _context8, _context9;

        return (0, _concat["default"])(_context8 = (0, _concat["default"])(_context9 = "".concat(_this6.device.id, " _addAndAlertProgress ")).call(_context9, stageId, " updateCount: ")).call(_context8, updateCount);
      });
      flow.data.currentStepNumber += updateCount;
      Log.debug(function () {
        return "_addAndAlertProgress currentStepNumber: ".concat(flow.data.currentStepNumber);
      });

      this._alertProgress(flow, stageId);
    }
  }, {
    key: "_alertProgress",
    value: function _alertProgress(flow, stageId, complete) {
      var _this7 = this;

      var totalSteps = flow.data.fwUpdateStepCount + flow.data.configUpdateStepCount;
      var currentStep = complete ? totalSteps : flow.data.currentStepNumber;
      var prevProgressPercent = flow.data.progressPercent;
      flow.data.progressPercent = (0, _parseInt2["default"])(currentStep * 100 / totalSteps, 10);
      var updateApp = prevProgressPercent !== flow.data.progressPercent;
      Log.debug(function () {
        var _context10, _context11, _context12, _context13, _context14;

        return (0, _concat["default"])(_context10 = (0, _concat["default"])(_context11 = (0, _concat["default"])(_context12 = (0, _concat["default"])(_context13 = (0, _concat["default"])(_context14 = "".concat(_this7.device.id, " Total steps: ")).call(_context14, totalSteps, ", current step: ")).call(_context13, currentStep, ", prevProgressPercent: ")).call(_context12, prevProgressPercent, " progressPercent: ")).call(_context11, flow.data.progressPercent, ", updateApp: ")).call(_context10, updateApp);
      });

      if (updateApp) {
        this.appAlert = this.device.app.display({
          title: _retailPaymentDevice.appMessage.SwUpdateInProgressWithDetails.title,
          message: {
            id: _retailPaymentDevice.appMessage.SwUpdateInProgressWithDetails.message,
            substitutions: {
              stage: stageId,
              progress: flow.data.progressPercent
            }
          },
          showActivity: true
        });
      }
    }
  }, {
    key: "_updateOs",
    value: function _updateOs(flow) {
      var _this8 = this;

      var osUpdates = this.updates.ingenico_firmware;

      if (!osUpdates || osUpdates.length === 0) {
        Log.debug('OS update not needed.');
        flow.data.restartRequired = false;
        flow.next(null);
        return;
      } // Add version to the file name to ensure that we get a new file when available


      var url = osUpdates[0].url + osUpdates[0].version;
      this.device.terminal.updateFirmware(url, function (updateProgressMessage) {
        // Pass the current flow to the progress handler
        _this8._fWUpdateProgressHandler(flow, updateProgressMessage);
      }, function (err) {
        flow.data.restartRequired = true;

        _this8._addAndAlertProgress(flow, 'OS', 1);

        flow.nextOrAbort(err);
      });
    }
  }, {
    key: "_retrieveVersionInfo",
    value: function _retrieveVersionInfo(flow) {
      this._addAndAlertProgress(flow, 'Configuration', 1);

      this.device.terminal.getFirmwareVersionInfo(function (err) {
        return flow.nextOrAbort(err);
      });
    }
  }, {
    key: "_tryReconnect",
    value: function _tryReconnect(flow) {
      var _this9 = this;

      if (!flow.data.restartRequired) {
        Log.debug('Restart not required');

        this._addAndAlertProgress(flow, 'Configuration', 1);

        flow.next();
        return;
      }

      this.appAlert = this.device.app.display({
        title: this.device.isMoby ? _retailPaymentDevice.appMessage.SwUpdateRestartInstruction.title : _retailPaymentDevice.appMessage.SwUpdateReconnecting.title,
        message: this.device.isMoby ? _retailPaymentDevice.appMessage.SwUpdateRestartInstruction.message : _retailPaymentDevice.appMessage.SwUpdateReconnecting.message,
        showActivity: true
      });

      this._pollUntilConnect(INGENICO_CONNECTION_RETRY_LIMIT, INGENICO_CONNECTION_RETRY_TIMEOUT, function (err) {
        _this9._addAndAlertProgress(flow, 'OS', 1);

        flow.nextOrAbort(err);
      });
    }
  }, {
    key: "_pollUntilConnect",
    value: function _pollUntilConnect(remainingAttempts, msWaitTime, cb) {
      var _this10 = this;

      Log.debug(function () {
        return "Disconnecting ".concat(_this10.device.id, " as part of reconnection");
      });
      this.device.forceDisconnect(function () {
        Log.debug(function () {
          return "Disconnected ".concat(_this10.device.id, "!. Proceeding to reconnect");
        });

        _manticore["default"].setTimeout(function () {
          Log.debug(function () {
            var _context15;

            return (0, _concat["default"])(_context15 = "Attempting reconnect to ".concat(_this10.device.id, ". Remaining attempts: ")).call(_context15, remainingAttempts);
          });

          _this10.device.connect(function (e) {
            if (e) {
              Log.warn('ReconnectFailed', {
                e: e,
                remainingAttempts: remainingAttempts
              });
              var newCount = remainingAttempts - 1;

              if (newCount <= 0) {
                Log.error('GivingUpDeviceConnectionAsAllRetryAttemptsWereExhausted', {
                  deviceId: _this10.device.id
                });
                cb(e);
              } else {
                _this10._pollUntilConnect(newCount, msWaitTime, cb);
              }
            } else {
              Log.info('DeviceSuccessfullyConnectedAfterRestart', {
                crId: _this10.device.id,
                remainingAttempts: remainingAttempts
              });
              cb(null);
            }
          });
        }, msWaitTime);
      });
    }
  }, {
    key: "_configUpdateProgressCallback",
    value: function _configUpdateProgressCallback(flow, err, nextOrAbort) {
      this._addAndAlertProgress(flow.data.updateFlow, 'Configuration', 1);

      if (nextOrAbort) {
        flow.nextOrAbort(err);
      } else {
        flow.next();
      }
    }
  }, {
    key: "_verifyUpdate",
    value: function _verifyUpdate(flow) {
      var _this11 = this;

      if (!this.device._expectedFirmwareChecksum) {
        Log.info('WillNotValidateFirmwareChecksumAsUNSFileUpdateNotAvailable', {
          crId: this.device.id
        });
        flow.next();
        return;
      }

      this.device.terminal.getFirmwareChecksum(function (err) {
        Log.info('FirmwareChecksum', {
          firmwareBefore: _this11.device._expectedFirmwareChecksum,
          firmwareAfter: _this11.device.terminal.firmwareChecksum
        });

        if (_this11.device._expectedFirmwareChecksum !== _this11.device.terminal.firmwareChecksum) {
          var _context16;

          flow.nextOrAbort(_retailPaymentDevice.deviceError.swUpdateFailed.withDevMessage((0, _concat["default"])(_context16 = "Checksum did not match after firmware update. Expected '".concat(_this11.device._expectedFirmwareChecksum, "', Actual: '")).call(_context16, _this11.device.terminal.firmwareChecksum, "'")));
        } else {
          flow.nextOrAbort(err);
        }
      });
    }
  }, {
    key: "_updateConfig",
    value: function _updateConfig(flow) {
      var cfgUpdates = this.updates.Ingenico_CONFIG;

      if (!cfgUpdates || cfgUpdates.length === 0) {
        Log.debug('Config update not needed.');
        flow.next();
        return;
      }

      var configFlow = new _flow["default"](this, this._clearAidList, this._clearPublicKeys, this._configureContactAidList, this._configureContactlessAidList, this._configurePublicKeys, this._configureAmountDol, this._configureOnlineDol, this._configureResponseDol, this._configureContactlessOnlineResponseDol, this._configureContactlessResponseDol, this._configureMagstripeDol, this._configureContactlessOptions, this._sendConfigCommands);
      configFlow.name = 'Ingenico config';
      configFlow.data.restartRequired = true;
      configFlow.data.updateFlow = flow;
      configFlow.on('completed', function (data) {
        Log.debug(function () {
          return "Config flow completed. Error: ".concat(data.error);
        });
        flow.next();
      });
      configFlow.on('aborted', function (data) {
        Log.debug(function () {
          return "Config flow aborted. Error: ".concat(data.error);
        });
        flow.abort(data.error);
      });
      Log.debug('Starting the config flow');

      this._addAndAlertProgress(flow, 'Configuration', 1);

      configFlow.start();
    }
  }, {
    key: "_configureOnlineDol",
    value: function _configureOnlineDol(flow) {
      var _this12 = this;

      this.device.terminal.configureOnlineDol(function (err) {
        return _this12._configUpdateProgressCallback(flow, err, true);
      });
    }
  }, {
    key: "_configureAmountDol",
    value: function _configureAmountDol(flow) {
      var _this13 = this;

      this.device.terminal.configureAmountDol(function (err) {
        return _this13._configUpdateProgressCallback(flow, err, true);
      });
    }
  }, {
    key: "_configureResponseDol",
    value: function _configureResponseDol(flow) {
      var _this14 = this;

      this.device.terminal.configureResponseDol(function (err) {
        return _this14._configUpdateProgressCallback(flow, err, true);
      });
    }
  }, {
    key: "_configureContactlessResponseDol",
    value: function _configureContactlessResponseDol(flow) {
      var _this15 = this;

      if (this.device.model === _retailPaymentDevice.ReaderModel.Moby3000) {
        Log.debug('Not configuring contactless DOL.');

        this._configUpdateProgressCallback(flow, null, false);
      } else {
        this.device.terminal.configureContactlessResponseDol(function (err) {
          return _this15._configUpdateProgressCallback(flow, err, true);
        });
      }
    }
  }, {
    key: "_configureContactlessOnlineResponseDol",
    value: function _configureContactlessOnlineResponseDol(flow) {
      var _this16 = this;

      if (this.device.model === _retailPaymentDevice.ReaderModel.Moby3000) {
        Log.debug('Not configuring contactless response DOL');

        this._configUpdateProgressCallback(flow, null, false);
      } else {
        this.device.terminal.configureContactlessOnlineDol(function (err) {
          return _this16._configUpdateProgressCallback(flow, err, true);
        });
      }
    }
  }, {
    key: "_configureMagstripeDol",
    value: function _configureMagstripeDol(flow) {
      var _this17 = this;

      this.device.terminal.configureMagstripeDol(function (err) {
        return _this17._configUpdateProgressCallback(flow, err, true);
      });
    }
  }, {
    key: "_clearAidList",
    value: function _clearAidList(flow) {
      var _this18 = this;

      this.device.terminal.clearAidList(function (err) {
        return _this18._configUpdateProgressCallback(flow, err, true);
      });
    }
  }, {
    key: "_clearPublicKeys",
    value: function _clearPublicKeys(flow) {
      var _this19 = this;

      this.device.terminal.clearPublicKeys(function (err) {
        return _this19._configUpdateProgressCallback(flow, err, true);
      });
    }
  }, {
    key: "_configurePublicKeys",
    value: function _configurePublicKeys(flow) {
      var _this20 = this;

      this.device.terminal.configurePublicKeys(function () {
        _this20._addAndAlertProgress(flow.data.updateFlow, 'Configuration', 1);
      }, function (err) {
        return _this20._configUpdateProgressCallback(flow, err, true);
      });
    }
  }, {
    key: "_configureContactAidList",
    value: function _configureContactAidList(flow) {
      var _this21 = this;

      this.device.terminal.configureContactAidList(function (err) {
        return _this21._configUpdateProgressCallback(flow, err, true);
      });
    }
  }, {
    key: "_configureContactlessAidList",
    value: function _configureContactlessAidList(flow) {
      var _this22 = this;

      if (this.device.model === _retailPaymentDevice.ReaderModel.Moby3000) {
        Log.debug('Not configuring contactless AidList');

        this._configUpdateProgressCallback(flow, null, false);
      } else {
        this.device.terminal.configureContactlessAidList(function (err) {
          return _this22._configUpdateProgressCallback(flow, err, true);
        });
      }
    }
  }, {
    key: "_configureContactlessOptions",
    value: function _configureContactlessOptions(flow) {
      var _this23 = this;

      if (this.device.model === _retailPaymentDevice.ReaderModel.Moby3000) {
        Log.debug('Not configuring contactless options');

        this._configUpdateProgressCallback(flow, null, false);
      } else {
        this.device.terminal.configureContactlessOptions(function (err) {
          return _this23._configUpdateProgressCallback(flow, err, true);
        });
      }
    }
  }, {
    key: "_sendConfigCommands",
    value: function _sendConfigCommands(flow) {
      var _this24 = this;

      this.device.terminal.sendConfigCommands(function (err) {
        return _this24._configUpdateProgressCallback(flow, err, true);
      });
    }
  }, {
    key: "_setConfigVersion",
    value: function _setConfigVersion(flow) {
      var _this25 = this;

      this.device.terminal.setConfigVersion(function (err, response) {
        Log[err ? 'error' : 'info']('versionInfoDeviceSetCustomVersion ', {
          deviceId: _this25.device.id,
          response: response
        });

        _this25.device.terminal.getConfigVersion(function () {
          flow.nextOrAbort(err);
        });
      });
    }
  }, {
    key: "_updateDeviceName",
    value: function _updateDeviceName(flow) {
      var _context17;

      if (this.device.model === _retailPaymentDevice.ReaderModel.RP450 && (0, _indexOf["default"])(_context17 = this.device.id).call(_context17, 'PayPal-') === 0) {
        var oldId = this.device.id;
        this.device.id = this.device.id.replace('PayPal-', 'PPHere-');
        Log.info('_updateDeviceNameDeviceIdChanged', {
          model: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.ReaderModel, this.device.model),
          address: this.device.address,
          oldId: oldId,
          newId: this.device.id
        });
        (0, _saveReader.saveLastActiveReader)(this.device, function () {
          flow.next();
        });
      } else {
        flow.next();
      }
    }
  }, {
    key: "_getCachedFile",
    value: function _getCachedFile(url, cb) {
      _manticore["default"].getItem(url, blobDecodedStorage, function (e, file) {
        cb(file ? null : _retailPaymentDevice.deviceError.swUpdateFailed.withDevMessage("File with url: ".concat(url, " was not found on the device")), file);
      });
    }
  }], [{
    key: "needsUpdate",
    value: function needsUpdate(device, modules, requiredUrlArray) {
      var hasUpdate = false;

      var _iterator6 = _createForOfIteratorHelper(modules),
          _step6;

      try {
        for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
          var module = _step6.value;

          if (module.name === 'ingenico_firmware') {
            hasUpdate = true;
            device._expectedFirmwareChecksum = module.version;
            Log.info('OSWillBeUpdatedToNewModule', {
              crId: device.id,
              firmwareChecksum: device.terminal.firmwareChecksum,
              newFirmwareVer: module.version
            });
            pushModules(requiredUrlArray, module.urls, module.version);
          } else if (module.name === 'Ingenico_CONFIG' && module.subcomponents) {
            hasUpdate = true;
            Log.info('CFGWillBeUpdatedWithSubComponenets', {
              crId: device.id,
              subComponentLength: module.subcomponents.length
            });

            var _iterator7 = _createForOfIteratorHelper(module.subcomponents),
                _step7;

            try {
              for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
                var component = _step7.value;
                Log.info('SubComponentVersion', {
                  crId: device.id,
                  subComponentVersion: component.version
                });
                pushModules(requiredUrlArray, component.urls, component.version);
              }
            } catch (err) {
              _iterator7.e(err);
            } finally {
              _iterator7.f();
            }
          }
        }
      } catch (err) {
        _iterator6.e(err);
      } finally {
        _iterator6.f();
      }

      if (!hasUpdate) {
        Log.debug(function () {
          return "".concat(device.id, " does not need an upgrade.");
        });
      } else {
        device.terminal.remoteConfig = {};
      }

      return hasUpdate;
    }
  }]);
  return IngenicoDeviceUpdate;
}(_retailPaymentDevice.DeviceUpdate);

exports["default"] = IngenicoDeviceUpdate;

},{"../../common/flow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/flow.js","../../common/saveReader":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/saveReader.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/async/lib/async.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.string.replace.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","core-js/modules/es.string.split.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/Terminal.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

require("core-js/modules/es.regexp.exec.js");

var _sliceInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/values"));

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _padStart = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/pad-start"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _events = require("events");

var _tlvlib = require("tlvlib");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreUtil = require("manticore-util");

var _moment = _interopRequireDefault(require("moment"));

var _async = _interopRequireDefault(require("async"));

var _eventType = _interopRequireDefault(require("./eventType"));

var _IngenicoTags = _interopRequireDefault(require("./IngenicoTags"));

var _Parser = require("./Parser");

var _Writer = _interopRequireDefault(require("./Writer"));

var _IngenicoCommand = _interopRequireDefault(require("./IngenicoCommand"));

var _FirmwareUpdateFlow = _interopRequireDefault(require("./FirmwareUpdateFlow"));

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context28;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty2(_context28 = Object.prototype.toString.call(o)).call(_context28, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var defaultConfiguration = require('./ingenico_config.json');

var Log = (0, _manticoreLog["default"])('ingenico.terminal');
var TransactionTypeRefund = 20;
var blobDecodedStorage = 'BD';
var disableChip = 0x01;
var disableEmvCertifiedContactless = 0x02;
var disableMagneticCardSwipe = 0x04;

function createApduCommand(cls, ins, p1, p2, len, data) {
  return new _tlvlib.ApduCommand(cls, ins, p1, p2, len, data, true);
}

function buildTlvListForTx(txType, amount, currencyCode, formFactors) {
  var tlvList = new _tlvlib.TlvList();
  var now = new Date(); // Transaction data

  tlvList.add(_tlvlib.Tags.TransactionCurrencyCode, currencyCode); // 5f2a

  tlvList.add(_IngenicoTags["default"].AmountAuthorizedBinary, _IngenicoTags["default"].AmountAuthorizedBinary.format.toBytes(amount, _IngenicoTags["default"].AmountAuthorizedBinary.length)); // 81

  tlvList.add(_tlvlib.Tags.TransactionType, txType); // 9c

  tlvList.add(_tlvlib.Tags.AmountAuthorized, _tlvlib.Tags.AmountAuthorized.format.toBytes(amount, 6)); // 9f02

  tlvList.add(_tlvlib.Tags.AmountOther, _tlvlib.Tags.AmountOther.format.toBytes(0, 6)); // 9f03

  tlvList.add(_IngenicoTags["default"].AmountOtherBinary, _IngenicoTags["default"].AmountOtherBinary.format.toBytes(0, _IngenicoTags["default"].AmountOtherBinary.length)); // 9f04
  // Application data

  tlvList.add(_IngenicoTags["default"].TransactionCurrencyExponent, 2); // 5f36

  tlvList.add(_tlvlib.Tags.TransactionDate, now); // 9a

  tlvList.add(_IngenicoTags["default"].TerminalCountryCode, currencyCode); // 9f1a

  tlvList.add(_IngenicoTags["default"].TerminalIdentification, '3132333435363738'); // 9f1c

  tlvList.add(_tlvlib.Tags.TransactionTime, now); // 9f21

  tlvList.add(_IngenicoTags["default"].POSEntryMode, 0); // 9f39

  tlvList.add(_IngenicoTags["default"].AuthorizationResponseCodeList, '59315A3159325A3259335A333030303530313034'); // df16

  tlvList.add(_IngenicoTags["default"].ExtraProgressMessageFlag, '01'); // DF68

  tlvList.add(_IngenicoTags["default"].TerminalApplicationVersionNumber, '0020'); // 9F09
  // the battery level threshold is used to decide the battery level under which the start transaction does not execute
  // it is 12 by default. Setting it to 0 makes it behave like Miura device

  tlvList.add(_IngenicoTags["default"].BatteryLevelThreshold, '00'); // DF8239
  // GenerateACControl

  tlvList.add(_tlvlib.Tags.GenerateACControl, txType === TransactionTypeRefund ? 0x02 : 0x00); // df72

  if (formFactors.has(_retailPaymentDevice.FormFactor.EmvCertifiedContactless)) {
    tlvList.add(_IngenicoTags["default"].OverallContactlessTransactionLimit, 'FFFFFFFF'); // df65
  }

  if (formFactors.has(_retailPaymentDevice.FormFactor.Chip)) {
    tlvList.add(_IngenicoTags["default"].TerminalCapabilities, 'E028C8'); // 9F33

    tlvList.add(_IngenicoTags["default"].AdditionalTerminalCapabilities, 'F000F0A001'); // 9F40

    tlvList.add(_IngenicoTags["default"].TerminalType, 22); // 9F35

    tlvList.add(_IngenicoTags["default"].TransactionCategoryCode, 52); // 9F53
  }

  tlvList.add(_IngenicoTags["default"].RFParam, '0400'); // DF8240

  return tlvList;
}

function getCurrencyIso(currency) {
  switch (currency) {
    case 'AUD':
      return 36;

    case 'GBP':
      return 826;

    case 'USD':
      return 840;

    case 'HKD':
      return 344;

    case 'EUR':
      return 978;

    case 'CAD':
      return 124;

    default:
      return null;
  }
}

function buildAidApps(dr, response) {
  var appId;
  var appLabel = null;
  var respTlvList = new _tlvlib.TlvList(response);

  var _iterator = _createForOfIteratorHelper((0, _values["default"])(respTlvList)),
      _step;

  try {
    for (_iterator.s(); !(_step = _iterator.n()).done;) {
      var v = _step.value;
      var parsed = v.parse();

      if (v.tag === _tlvlib.Tags.TerminalApplicationIdentifier) {
        if (appId) {
          dr.apps.push([appId, appLabel]);
          appLabel = null;
        }

        appId = parsed;
      } else if (v.tag === _tlvlib.Tags.ApplicationLabel) {
        if (appLabel && appId) {
          dr.apps.push([appId, appLabel]);
          appId = null;
        }

        appLabel = parsed;
      }
    }
  } catch (err) {
    _iterator.e(err);
  } finally {
    _iterator.f();
  }

  if (appId) {
    dr.apps.push([appId, appLabel.toString()]);
  }
}

function buildApps(dr, response) {
  var _iterator2 = _createForOfIteratorHelper((0, _values["default"])(response.apdu.tlvs)),
      _step2;

  try {
    for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
      var v = _step2.value;

      if (v.tag === _tlvlib.Tags.ApplicationTemplate) {
        var aidResp = v.parse();
        buildAidApps(dr, aidResp);
      }
    }
  } catch (err) {
    _iterator2.e(err);
  } finally {
    _iterator2.f();
  }
}

function toHex(value, padLength) {
  var padLengthOrDefault = 2;

  if (padLength !== undefined) {
    padLengthOrDefault = padLength;
  }

  var hexStr = value.toString(16);

  while (hexStr.length < padLengthOrDefault) {
    hexStr = "0".concat(hexStr);
  }

  return hexStr;
}

function getTlvData(aid) {
  var tlv = aid.tlvData;
  var tlvData = '';

  for (var key in tlv) {
    if (Object.prototype.hasOwnProperty.call(tlv, key)) {
      tlvData += key;
      var curTlv = tlv[key];
      var curTlvLength = curTlv.length / 2;
      tlvData += toHex(curTlvLength);
      tlvData += curTlv;
    }
  }

  var tlvDataLength = tlvData.length / 2;
  tlvData = toHex(tlvDataLength, 4) + tlvData;
  return tlvData;
}

function getContactlessData(aid) {
  var aidData = aid.FloorLimit;
  aidData += aid.CVMLimit;
  aidData += aid.TxnLimit;
  aidData += aid.TermCaps;
  aidData += getTlvData(aid);
  return aidData;
}

var TerminalStatus = {
  Contact: {
    Decline: function Decline(status) {
      return status === 0x00 || status === 0x90;
    },
    OnlineDol: function OnlineDol(status) {
      return status === 0x01 || status === 0x91;
    },
    DecisionRequired: function DecisionRequired(status) {
      return status === 0x91;
    }
  },
  Contactless: {
    OfflineDecline: function OfflineDecline(status) {
      return status === 0x03 || status === 0x93;
    },
    OnlineDol: function OnlineDol(status) {
      return status === 0x04 || status === 0x94;
    },
    DecisionRequired: function DecisionRequired(status) {
      return status === 0x01;
    },
    Magstripe: function Magstripe(status) {
      return status === 0x02;
    }
  },
  AmountDol: function AmountDol(status) {
    return status === 0x00 || status === 0x90;
  }
};
/* eslint max-len: "off" */

var Terminal = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(Terminal, _EventEmitter);

  var _super = _createSuper(Terminal);

  function Terminal(sendFn, reader) {
    var _this;

    (0, _classCallCheck2["default"])(this, Terminal);
    _this = _super.call(this);
    _this.nativeShim = sendFn;
    _this.reader = reader;
    _this.remoteConfig = {};
    _this.firmwareChecksum = '';
    _this.writer = new _Writer["default"](reader);
    return _this;
  }

  (0, _createClass2["default"])(Terminal, [{
    key: "disconnect",
    value: function disconnect() {
      Log.debug('Clearing the writer queue and re-creating it');
      this.writer.clear();
      this.writer = new _Writer["default"](this.reader);
    }
  }, {
    key: "getFirmwareVersionInfo",
    value: function getFirmwareVersionInfo(callback) {
      var apdu = createApduCommand(0xff, 0x00, 0x01, 0);
      this.writer.send(new _IngenicoCommand["default"]('get-firmware-version', apdu), callback);
    }
  }, {
    key: "getFirmwareVersionInfoAsync",
    value: function () {
      var _getFirmwareVersionInfoAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
        var _context;

        return _regenerator["default"].wrap(function _callee$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                return _context2.abrupt("return", (0, _manticoreUtil.callbackToPromise)((0, _bind["default"])(_context = this.getFirmwareVersionInfo).call(_context, this)));

              case 1:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee, this);
      }));

      function getFirmwareVersionInfoAsync() {
        return _getFirmwareVersionInfoAsync.apply(this, arguments);
      }

      return getFirmwareVersionInfoAsync;
    }() // Expensive operation on Moby, ~ 5.5 seconds.

  }, {
    key: "getFirmwareChecksum",
    value: function getFirmwareChecksum(callback) {
      var _this2 = this;

      var apdu = createApduCommand(0xff, 0x88, 0x09, 0x06);
      this.writer.send(new _IngenicoCommand["default"]('get-firmware-checksum', apdu), function (err, rz) {
        if (err) {
          callback(err);
          return;
        }

        var rzBuf = Buffer.from(rz, 'hex');
        var checksumInfo = JSON.parse(rzBuf.toString());

        if (checksumInfo && checksumInfo.FW) {
          _this2.firmwareChecksum = checksumInfo.FW.Chk;
        }

        Log.debug('getFirmwareChecksum', {
          crId: _this2.reader.id,
          fwChecksum: _this2.firmwareChecksum,
          resp: rzBuf.toString()
        });
        callback(err, rz);
      });
    }
  }, {
    key: "getFirmwareChecksumAsync",
    value: function () {
      var _getFirmwareChecksumAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
        var _context3;

        return _regenerator["default"].wrap(function _callee2$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                return _context4.abrupt("return", (0, _manticoreUtil.callbackToPromise)((0, _bind["default"])(_context3 = this.getFirmwareChecksum).call(_context3, this)));

              case 1:
              case "end":
                return _context4.stop();
            }
          }
        }, _callee2, this);
      }));

      function getFirmwareChecksumAsync() {
        return _getFirmwareChecksumAsync.apply(this, arguments);
      }

      return getFirmwareChecksumAsync;
    }()
  }, {
    key: "getConfigVersion",
    value: function getConfigVersion(callback) {
      var _this3 = this;

      var apdu = createApduCommand(0xff, 0x88, 0x09, 0x04);
      this.writer.send(new _IngenicoCommand["default"]('get-config-version', apdu), function (err, rz) {
        if (err) {
          callback(err);
          return;
        }

        var rzBuf = Buffer.from(rz, 'hex');
        var versionInfo = JSON.parse(rzBuf.toString());

        if (versionInfo && versionInfo.SW) {
          var _context5, _context6;

          _this3.firmwareChecksum = (0, _slice["default"])(_context5 = versionInfo.SW.name).call(_context5, 4, 12);
          _this3.firmwareCustomVersion = (0, _parseInt2["default"])((0, _slice["default"])(_context6 = versionInfo.SW.name).call(_context6, 12), 16);
        }

        Log.info('versionInfoConfigInformation', {
          crId: _this3.reader.id,
          config: _this3.firmwareCustomVersion & 0xffff,
          capKeys: _this3.firmwareCustomVersion >> 16 & 0xffff,
          firmware: _this3.firmwareCustomVersion,
          verInfo: (0, _stringify["default"])(versionInfo),
          resp: rzBuf.toString()
        });

        if (_this3.firmwareChecksum === '00000000') {
          _this3.getFirmwareChecksum(function (firmwareChecksumRetrievalError) {
            _this3.setConfigVersion(function (settingConfigVersionError) {
              callback(firmwareChecksumRetrievalError || settingConfigVersionError, rz);
            });
          });
        } else {
          callback(err, rz);
        }
      });
    }
  }, {
    key: "getConfigVersionAsync",
    value: function () {
      var _getConfigVersionAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
        var _context7;

        return _regenerator["default"].wrap(function _callee3$(_context8) {
          while (1) {
            switch (_context8.prev = _context8.next) {
              case 0:
                return _context8.abrupt("return", (0, _manticoreUtil.callbackToPromise)((0, _bind["default"])(_context7 = this.getConfigVersion).call(_context7, this)));

              case 1:
              case "end":
                return _context8.stop();
            }
          }
        }, _callee3, this);
      }));

      function getConfigVersionAsync() {
        return _getConfigVersionAsync.apply(this, arguments);
      }

      return getConfigVersionAsync;
    }()
  }, {
    key: "setConfigVersion",
    value: function setConfigVersion(callback) {
      var _context9,
          _context10,
          _this4 = this;

      var customVersion = this.remoteConfig.version || this.firmwareCustomVersion || 0;
      var firmwareChecksum = (0, _padStart["default"])(_context9 = this.firmwareChecksum || '').call(_context9, 8, '0');
      var terminalCustomVersion = (0, _concat["default"])(_context10 = "0000".concat(firmwareChecksum)).call(_context10, toHex(customVersion, 8));
      var terminalCustomVersionCommand = "ff8809010a".concat(terminalCustomVersion, "00");
      var ingenicoCommand = new _IngenicoCommand["default"]('set-config-version');
      ingenicoCommand.rawHexCommand = terminalCustomVersionCommand;
      Log.info('versionInfo: SettingConfigVersionToRemoteVersion', {
        crId: this.reader.id,
        remoteConfig: this.remoteConfig.version,
        terminalVer: terminalCustomVersion,
        terminalCustomCmd: terminalCustomVersionCommand
      });
      this.writer.send(ingenicoCommand, function (err, rz) {
        Log[err ? 'error' : 'debug']('versionInfoSetConfigVersionResponse', {
          crId: _this4.reader.id,
          customVer: customVersion,
          err: err,
          resp: rz
        });
        _this4.firmwareCustomVersion = customVersion;
        callback(err, terminalCustomVersion);
      });
    }
  }, {
    key: "updateFirmware",
    value: function updateFirmware(url, progressCallback, callback) {
      var _this5 = this;

      Log.debug(function () {
        return "Firmware update file ".concat(url);
      });
      var uStart = (0, _moment["default"])();

      _manticore["default"].getItemPath(url, blobDecodedStorage, function (fErr, fwFileLocation) {
        function deleteFirmwareFile() {
          var deleteFileCB = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

          var deleteFirmwareFileCB = function deleteFirmwareFileCB(delErr, delResponse) {
            Log.debug('Delete update file', {
              error: delErr,
              response: delResponse
            });
            deleteFileCB(delErr, delResponse);
          };

          _manticore["default"].deleteItem(url, blobDecodedStorage, deleteFirmwareFileCB);
        }

        Log.debug(function () {
          var _context11;

          return (0, _concat["default"])(_context11 = "File path: ".concat(fwFileLocation, ", error: ")).call(_context11, fErr);
        });

        if (fErr) {
          callback(fErr);
          return;
        }

        if (!_this5.reader["native"].isUnsFileValid(fwFileLocation)) {
          deleteFirmwareFile(function () {
            return callback(_retailPaymentDevice.deviceError.corruptFirmware);
          });
          return;
        }

        if (_this5.reader.connectionType === _retailPaymentDevice.readerConnectionType.usb) {
          _manticore["default"].getItem(url, blobDecodedStorage, function (err, file) {
            if (err) {
              callback(_retailPaymentDevice.deviceError.dataRetrievalFailed.withDevMessage('Unable to read UNS file'));
            } else {
              new _FirmwareUpdateFlow["default"](Buffer.from(file, 'base64'), _this5.reader["native"], progressCallback, function (flowError, flowResp) {
                deleteFirmwareFile();
                callback(flowError, flowResp);
              }).start();
            }
          });
        } else {
          var cmdEnableFWUpdate = new _IngenicoCommand["default"]('enableFirmwareUpdateMode');
          cmdEnableFWUpdate.nativeCommand = true;

          _this5.writer.send(cmdEnableFWUpdate, function (fwmErr, fwmResponse) {
            Log.debug('Enabled firmware update mode', {
              err: fwmErr,
              response: fwmResponse
            });

            if (fwmErr) {
              callback(fwmErr);
              return;
            }

            Log.debug(function () {
              return "fwFileLocation = ".concat(fwFileLocation, " this.nativeShim.updateFirmware");
            });
            var cmdUpdateFirmware = new _IngenicoCommand["default"]('updateFirmware');
            cmdUpdateFirmware.nativeCommand = {
              fwFileLocation: fwFileLocation,
              progressCallback: progressCallback
            };

            _this5.writer.send(cmdUpdateFirmware, function (uErr, uRz) {
              Log.debug('Update firmware complete', {
                duration: _this5.getTimeDiff(uStart),
                error: uErr,
                response: uRz
              });
              deleteFirmwareFile(function () {
                return callback(uErr, uRz);
              });
            });
          });
        }
      });
    }
  }, {
    key: "getTimeDiff",
    value: function getTimeDiff(then) {
      var now = (0, _moment["default"])();
      var diff = now.diff(then);
      return _moment["default"].utc(diff).format('HH:mm:ss:SSS');
    }
  }, {
    key: "getCardInsertionStatus",
    value: function getCardInsertionStatus(callback) {
      var apdu = createApduCommand(0xff, 0x01, 0x00, 0);
      this.writer.send(new _IngenicoCommand["default"]('get-card-insertion-status', apdu), callback);
    } // TODO

  }, {
    key: "waitForCardRemoval",
    value: function waitForCardRemoval(useTimeout, callback) {
      var _this6 = this; // ea60 = One minute timeout, ffff = infinite timeout


      var waitTimeout = useTimeout ? 'ea60' : 'ffff';
      var waitForCardRemovalCommand = "ff01020002".concat(waitTimeout, "00");
      var ingenicoCommand = new _IngenicoCommand["default"]('wait-for-card-removal');
      ingenicoCommand.rawHexCommand = waitForCardRemovalCommand;
      this.writer.send(ingenicoCommand, function (err, rz) {
        Log.debug(function () {
          var _context12;

          return (0, _concat["default"])(_context12 = "Received response to waitForCardRemoval with Error : ".concat((0, _stringify["default"])(err), " \n and response : ")).call(_context12, rz);
        });

        _this6.reader.received({
          event: _eventType["default"].cardRemoved
        });

        callback(err, rz);
      });
    }
  }, {
    key: "getDeviceCapabilities",
    value: function getDeviceCapabilities(callback) {
      var apdu = createApduCommand(0xff, 0x00, 0x02, 0);
      this.writer.send(new _IngenicoCommand["default"]('get-device-capabilities', apdu), callback);
    }
  }, {
    key: "getDeviceCapabilitiesAsync",
    value: function () {
      var _getDeviceCapabilitiesAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
        var _context13;

        return _regenerator["default"].wrap(function _callee4$(_context14) {
          while (1) {
            switch (_context14.prev = _context14.next) {
              case 0:
                return _context14.abrupt("return", (0, _manticoreUtil.callbackToPromise)((0, _bind["default"])(_context13 = this.getDeviceCapabilities).call(_context13, this)));

              case 1:
              case "end":
                return _context14.stop();
            }
          }
        }, _callee4, this);
      }));

      function getDeviceCapabilitiesAsync() {
        return _getDeviceCapabilitiesAsync.apply(this, arguments);
      }

      return getDeviceCapabilitiesAsync;
    }()
  }, {
    key: "_configurationHasKey",
    value: function _configurationHasKey(key) {
      return this.remoteConfig && key in this.remoteConfig;
    }
  }, {
    key: "_getConfigurationTagsForKey",
    value: function _getConfigurationTagsForKey(key) {
      var _this7 = this;

      if (this.remoteConfig && key in this.remoteConfig) {
        Log.debug(function () {
          var _context15;

          return (0, _concat["default"])(_context15 = "Got the tags for key : ".concat(key, " ")).call(_context15, (0, _stringify["default"])(_this7.remoteConfig[key]));
        });
        return this.remoteConfig[key];
      }

      Log.debug(function () {
        return "Returning null for key : ".concat(key);
      });
      return null;
    }
  }, {
    key: "configureOnlineDol",
    value: function configureOnlineDol(callback) {
      if (this._configurationHasKey('OnlineDol')) {
        var apdu = createApduCommand(0xff, 0x81, 0x07, 0x01);

        var config = this._getConfigurationTagsForKey('OnlineDol', defaultConfiguration.OnlineDol);

        apdu.appendBytes(Buffer.from(config, 'hex'));
        this.writer.send(new _IngenicoCommand["default"]('configure-online-dol', apdu), callback);
      } else {
        Log.warn('Skip_ConfigOnlineDolNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "configureResponseDol",
    value: function configureResponseDol(callback) {
      if (this._configurationHasKey('ResponseDol')) {
        var apdu = createApduCommand(0xff, 0x81, 0x07, 0x02);

        var config = this._getConfigurationTagsForKey('ResponseDol', defaultConfiguration.ResponseDol);

        apdu.appendBytes(Buffer.from(config, 'hex'));
        this.writer.send(new _IngenicoCommand["default"]('configure-response-dol', apdu), callback);
      } else {
        Log.warn('Skip_ResponseDolNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "configureContactlessResponseDol",
    value: function configureContactlessResponseDol(callback) {
      if (this._configurationHasKey('ContactlessResponseDol')) {
        var apdu = createApduCommand(0xff, 0x81, 0x07, 0x03);

        var config = this._getConfigurationTagsForKey('ContactlessResponseDol', defaultConfiguration.ContactlessResponseDol);

        apdu.appendBytes(Buffer.from(config, 'hex'));
        this.writer.send(new _IngenicoCommand["default"]('configure-contactless-response-dol', apdu), callback);
      } else {
        Log.warn('Skip_ContactlessResponseDolNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "configureContactlessOnlineDol",
    value: function configureContactlessOnlineDol(callback) {
      if (this._configurationHasKey('ContactlessOnlineDol')) {
        var apdu = createApduCommand(0xff, 0x81, 0x07, 0x04);

        var config = this._getConfigurationTagsForKey('ContactlessOnlineDol', defaultConfiguration.ContactlessOnlineDol);

        apdu.appendBytes(Buffer.from(config, 'hex'));
        this.writer.send(new _IngenicoCommand["default"]('configure-contactless-online-dol', apdu), callback);
      } else {
        Log.warn('Skip_ContactlessOnlineDolNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "clearAidList",
    value: function clearAidList(callback) {
      if (this._configurationHasKey('aidList')) {
        var apdu = createApduCommand(0xff, 0x81, 0x01, 0x00);
        apdu.appendBytes(Buffer.from('', 'hex'));
        this.writer.send(new _IngenicoCommand["default"]('clear-aid-list', apdu), callback);
      } else {
        Log.warn('Skip_ClearAidListNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "configureContactAidList",
    value: function configureContactAidList(callback) {
      var config = this._getConfigurationTagsForKey('aidList', defaultConfiguration.aidList);

      if (config && config.Contact) {
        var aidData = this._getCommonAidData(config.Contact, getTlvData);

        var apdu = createApduCommand(0xff, 0x81, 0x00, config.Contact.P2 || 0x03);
        apdu.appendBytes(Buffer.from(aidData, 'hex'));
        this.writer.send(new _IngenicoCommand["default"]('configure-contact-aid-list', apdu), callback);
      } else {
        Log.warn('Skip_ContactAidListNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "configureContactlessAidList",
    value: function configureContactlessAidList(callback) {
      var config = this._getConfigurationTagsForKey('aidList', defaultConfiguration.aidList);

      if (config && config.Contactless) {
        var aidData = this._getCommonAidData(config.Contactless, getContactlessData);

        var apdu = createApduCommand(0xff, 0x81, 0x00, config.Contactless.P2 || 0x02);
        apdu.appendBytes(Buffer.from(aidData, 'hex'));
        this.writer.send(new _IngenicoCommand["default"]('configure-contactless-aid-list', apdu), callback);
      } else {
        Log.warn('Skip_ContactlessAidListNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "clearPublicKeys",
    value: function clearPublicKeys(callback) {
      if (this._configurationHasKey('PublicKeys')) {
        var apdu = createApduCommand(0xff, 0x81, 0x04, 0x00);
        apdu.appendBytes(Buffer.from('', 'hex'));
        this.writer.send(new _IngenicoCommand["default"]('clear-public-keys', apdu), callback);
      } else {
        Log.warn('Skip_ClearPublicKeysNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "configurePublicKeys",
    value: function configurePublicKeys(progressCallback, callback) {
      var _this8 = this;

      if (this._configurationHasKey('PublicKeys')) {
        var config = this._getConfigurationTagsForKey('PublicKeys', defaultConfiguration.PublicKeys);

        var errorList = [];
        var publicKeyCmdList = [];

        var _iterator3 = _createForOfIteratorHelper(config),
            _step3;

        try {
          var _loop = function _loop() {
            var pKey = _step3.value;
            Log.debug(function () {
              return "Add key ".concat((0, _stringify["default"])(pKey));
            });
            var pKeyData = pKey.RID + pKey.CAPublicKeyIndex + toHex(pKey.PublicKey.length / 2) + pKey.PublicKey + pKey.ExponentOfPublicKey + pKey.Checksum;
            var cmd = createApduCommand(0xff, 0x81, 0x02, 0x00);
            cmd.appendBytes(Buffer.from(pKeyData, 'hex'));
            publicKeyCmdList.push({
              pKey: pKey,
              cmd: cmd,
              pKeyData: pKeyData
            });
          };

          for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
            _loop();
          }
        } catch (err) {
          _iterator3.e(err);
        } finally {
          _iterator3.f();
        }

        Log.debug(function () {
          return "publicKeyCmdList length: ".concat(publicKeyCmdList.length);
        });

        _async["default"].eachSeries(publicKeyCmdList, function (cmdData, cb) {
          _this8.writer.send(new _IngenicoCommand["default"]('configure-public-keys', cmdData.cmd), function (err, response) {
            progressCallback();
            Log.debug(function () {
              var _context16, _context17, _context18;

              return (0, _concat["default"])(_context16 = (0, _concat["default"])(_context17 = (0, _concat["default"])(_context18 = "configurePublicKeys key: ".concat((0, _stringify["default"])(cmdData.pKey), " pKeyData: ")).call(_context18, cmdData.pKeyData, " error: ")).call(_context17, err, ", response: ")).call(_context16, response);
            });

            if (err) {
              errorList.push(err);
            }

            if (cb) {
              cb(err);
            }
          });
        }, function () {
          _this8._callbackFromPublicKeyList(errorList, callback);
        });
      } else {
        Log.warn('Skip_ConfigPublicKeysNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "_callbackFromPublicKeyList",
    value: function _callbackFromPublicKeyList(errorList, callback) {
      Log.debug('Done from _callbackFromPublicKeyList async.eachSeries');
      var callbackError = null;

      if (errorList.length > 0) {
        Log.warn('configurePublicKeysErr', {
          crId: this.reader.id
        });
        callbackError = errorList;
      }

      callback(callbackError, null);
    }
  }, {
    key: "_getCommonAidData",
    value: function _getCommonAidData(aidRoot, currentAidProcessor) {
      var aidData = '';
      var aid = aidRoot.AID;
      var noAid = 0;

      for (var key in aid) {
        if (Object.prototype.hasOwnProperty.call(aid, key)) {
          if (key.length > 0 && key.length % 2 === 0) {
            noAid += 1;
            var aidLen = toHex(key.length / 2);
            var curAid = aid[key];
            aidData += aidLen;
            aidData += key;
            aidData += curAid.TermAppVer;
            aidData += curAid.LowestAppVer;
            aidData += curAid.Priority;
            aidData += curAid.AppSelect;

            if (currentAidProcessor) {
              aidData += currentAidProcessor(curAid);
            }
          } else {
            Log.error('InvalidAidLength', {
              crId: this.reader.id,
              aidLength: key.length
            });
          }
        }
      }

      return toHex(noAid) + aidData;
    }
  }, {
    key: "configureMagstripeDol",
    value: function configureMagstripeDol(callback) {
      if (this._configurationHasKey('MagstripeDol')) {
        var apdu = createApduCommand(0xff, 0x81, 0x07, 0x05);

        var config = this._getConfigurationTagsForKey('MagstripeDol', defaultConfiguration.MagstripeDol);

        apdu.appendBytes(Buffer.from(config, 'hex'));
        this.writer.send(new _IngenicoCommand["default"]('configure-magstripe-dol', apdu), callback);
      } else {
        Log.warn('Skip_MagstripeDolNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "configureAmountDol",
    value: function configureAmountDol(callback) {
      if (this._configurationHasKey('AmountDol')) {
        var apdu = createApduCommand(0xff, 0x81, 0x07, 0x00);

        var config = this._getConfigurationTagsForKey('AmountDol', defaultConfiguration.AmountDol);

        apdu.appendBytes(Buffer.from(config, 'hex'));
        this.writer.send(new _IngenicoCommand["default"]('configure-amount-dol', apdu), callback);
      } else {
        Log.warn('Skip_AmountDolNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "configureContactlessOptions",
    value: function configureContactlessOptions(callback) {
      if (this._configurationHasKey('ContactlessOptions')) {
        var configCmd = new _IngenicoCommand["default"]('contactless-options');
        configCmd.rawHexCommand = this._getConfigurationTagsForKey('ContactlessOptions', defaultConfiguration.ContactlessOptions);
        this.writer.send(configCmd, callback);
      } else {
        Log.warn('Skip_ContactlessOptionsNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "sendConfigCommands",
    value: function sendConfigCommands(callback) {
      var _this9 = this;

      if (this._configurationHasKey('ReaderCommands')) {
        var configCmds = this._getConfigurationTagsForKey('ReaderCommands', defaultConfiguration.ReaderCommands);

        Log.debug(function () {
          var _context19;

          return (0, _concat["default"])(_context19 = "sendConfigCommands to ".concat(_this9.reader.id, ": ")).call(_context19, (0, _stringify["default"])(configCmds));
        });

        _async["default"].eachSeries(configCmds, function (configCmd, cb) {
          if (configCmd.Command) {
            var cmd = new _IngenicoCommand["default"](configCmd.Description);
            cmd.rawHexCommand = configCmd.Command;

            _this9.writer.send(cmd, cb);
          } else {
            cb();
          }
        }, callback);
      } else {
        Log.warn('ReaderCommandsConfNotFound', {
          crId: this.reader.id
        });
        callback();
      }
    }
  }, {
    key: "stopTransaction",
    value: function stopTransaction(callback) {
      Log.debug('Stop transaction', {
        hasActiveTransactionType: this._activeTxType !== undefined
      });

      if (this._activeTxType === undefined) {
        callback();
        return;
      }

      delete this._activeTxType;
      this.writer.deactivateReader(callback);
    }
  }, {
    key: "postTransactionCleanup",
    value: function postTransactionCleanup(callback) {
      Log.debug('postTransactionCleanup');
      this.stopTransaction(callback);
    }
  }, {
    key: "startTransaction",
    value: function startTransaction(txType, invoice, invoiceTotalCalculator, stFormFactors, callback) {
      var _this10 = this;

      this.invoiceTotalCalculator = invoiceTotalCalculator;

      var amount = _paypalInvoicing.Currency.toCents(invoice.currency, invoiceTotalCalculator(invoice));

      var currencyCode = getCurrencyIso(invoice.currency);
      this.invoice = invoice;
      this._activeTxType = txType;
      var ffSet = new _set["default"](stFormFactors);
      var cmdP2 = 0x00;

      if (!ffSet.size) {
        Log.warn('startTxCmdInvokedWithEmptyFFListDefaultToChipNSwipeToAvoidTxCancels');
        ffSet.add(_retailPaymentDevice.FormFactor.MagneticCardSwipe);
        ffSet.add(_retailPaymentDevice.FormFactor.Chip);
      } // disable interfaces


      if (!ffSet.has(_retailPaymentDevice.FormFactor.Chip)) {
        cmdP2 |= disableChip;
      }

      if (!ffSet.has(_retailPaymentDevice.FormFactor.EmvCertifiedContactless)) {
        cmdP2 |= disableEmvCertifiedContactless;
      }

      if (!ffSet.has(_retailPaymentDevice.FormFactor.MagneticCardSwipe)) {
        cmdP2 |= disableMagneticCardSwipe;
      }

      Log.debug(function () {
        var _context20;

        return (0, _concat["default"])(_context20 = "startTransaction P2 = ".concat(cmdP2, " for ")).call(_context20, _this10.reader.id);
      });
      var tlvList = buildTlvListForTx(txType, amount, currencyCode, ffSet);
      var apdu = createApduCommand(0xff, 0x81, 0x10, cmdP2);
      apdu.appendBytes(tlvList.toBytes());
      Log.debug(function () {
        return "Sending TLV ".concat(tlvList);
      });

      if (ffSet.has(_retailPaymentDevice.FormFactor.Chip)) {
        apdu.appendBytes(Buffer.from('DF15039F3704DF8229010100DF82000400010001DF82020100DF0B0101DF3A050000090220', 'hex'));
      } else {
        apdu.appendBytes(Buffer.from('DF8229010100', 'hex'));
      }

      var cmd = new _IngenicoCommand["default"](_Writer["default"].cmdName.startTx, apdu);
      this.writer.send(cmd, function (err, response) {
        _this10._parseResponseForTxStart(err, response, callback);
      });
    }
  }, {
    key: "_parseResponseForTxStart",
    value: function _parseResponseForTxStart(err, response, callback) {
      var _this11 = this;

      var txType = this._activeTxType;
      Log.debug(function () {
        var _context21;

        return (0, _concat["default"])(_context21 = "Received response for startTransaction command. Error: ".concat((0, _stringify["default"])(err), " rz: ")).call(_context21, response);
      });

      if (err) {
        callback(err);
        return;
      }

      var rzStatus = (0, _Parser.parseStatus)(response);
      Log.debug(function () {
        return "Transaction response status from presenting card: 0x".concat(rzStatus ? rzStatus.toString(16) : 'undefined');
      });

      if (TerminalStatus.AmountDol(rzStatus)) {
        Log.debug('Amount DOL detected in the transaction response... Will request for transaction data');

        if (this.reader.cardInsertedHandler) {
          Log.debug(function () {
            return "Invoke CardInsertHandler for chip insert: ".concat(_this11.reader.context.id);
          });
          this.reader.cardInsertedHandler(new _retailPaymentDevice.CardInsertedHandler(function () {
            _this11.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.insertDetected, _retailPaymentDevice.FormFactor.Chip);

            Log.debug(function () {
              return "Continue CardDataRead: ".concat(_this11.reader.context.id);
            });

            _this11._sendTransactionData(function (e, rz) {
              _this11._parseResponseForTxComplete(e, rz, callback);
            });
          }));
        } else {
          Log.debug(function () {
            return "Continue CardDataRead without cardInsertedHandler: ".concat(_this11.reader.context.id);
          });

          this._sendTransactionData(function (e, rz) {
            _this11._parseResponseForTxComplete(e, rz, callback);
          });
        }

        return;
      }

      if (TerminalStatus.Contact.DecisionRequired(rzStatus)) {
        this.buildAppActivation = function () {
          var aidResp = (0, _Parser.parseCardData)(response);
          var dr = new _retailPaymentDevice.AvailableApplications(response);
          buildApps(dr, aidResp);
          Log.debug(function () {
            return "dr : ".concat((0, _stringify["default"])(dr));
          });
          callback(null, dr);
        };

        if (this.reader.cardInsertedHandler) {
          Log.debug(function () {
            return "Invoke CardInsertHandler for multi-app: ".concat(_this11.reader.context.id);
          });
          this.reader.cardInsertedHandler(new _retailPaymentDevice.CardInsertedHandler(function () {
            Log.debug(function () {
              return "Multi app card with cardInsertedHandler: ".concat(_this11.reader.context.id);
            });

            _this11.buildAppActivation();
          }));
        } else {
          Log.debug(function () {
            return "Multi app card without cardInsertedHandler: ".concat(_this11.reader.context.id);
          });
          this.buildAppActivation();
        }

        return;
      }

      if (TerminalStatus.Contactless.OfflineDecline(rzStatus) && txType !== TransactionTypeRefund) {
        Log.debug('Contactless Offline Decline.');
        callback(_retailPaymentDevice.deviceError.nfcNotAllowed);
        return;
      }

      if (!response) {
        callback(_retailPaymentDevice.deviceError.invalidCardData);
        return;
      }

      var cardData;

      try {
        cardData = (0, _Parser.parseCardData)(response);
      } catch (x) {
        Log.error('cardDataParseFailed', {
          err: x
        });
        callback(_retailPaymentDevice.deviceError.dataRetrievalFailed.withDevMessage(x.message));
        return;
      }

      callback(null, cardData);
    }
  }, {
    key: "_parseResponseForTxComplete",
    value: function _parseResponseForTxComplete(e, raw, callback) {
      var txType = this._activeTxType;

      if (e) {
        callback(e);
        return;
      }

      if (!raw) {
        callback(_retailPaymentDevice.deviceError.invalidCardData);
        return;
      }

      try {
        var _ret = function () {
          var cardData = (0, _Parser.parseCardData)(raw);

          if (txType !== TransactionTypeRefund) {
            var decisionFound = false;

            var _iterator4 = _createForOfIteratorHelper((0, _values["default"])(cardData.apdu.tlvs)),
                _step4;

            try {
              for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
                var _v = _step4.value;

                if (_v.tagNumber === 0xdf31) {
                  var _ret3 = function () {
                    decisionFound = true;

                    var status = _v.parse();

                    if (status[0] === 0x00) {
                      Log.debug(function () {
                        var _context25;

                        return (0, _concat["default"])(_context25 = "Decline for status: 0x".concat(cardData.getStatus().toString(16), " and tag (0xDF31) status  = 0x")).call(_context25, status.toString('hex'));
                      });
                      callback(_retailPaymentDevice.deviceError.contactIssuer, cardData);
                      return {
                        v: {
                          v: void 0
                        }
                      };
                    }

                    if (status[0] === 0x01) {
                      Log.debug(function () {
                        var _context26;

                        return (0, _concat["default"])(_context26 = "online approval for status: 0x".concat(cardData.getStatus().toString(16), " and tag (0xDF31) status  = 0x")).call(_context26, status.toString('hex'));
                      });
                    } else {
                      Log.debug(function () {
                        var _context27;

                        return (0, _concat["default"])(_context27 = "unexpected tag (0xDF31) status  = 0x".concat(status.toString('hex'), " for status: 0x")).call(_context27, cardData.getStatus().toString(16));
                      });
                    }
                  }();

                  if ((0, _typeof2["default"])(_ret3) === "object") return _ret3.v;
                }
              }
            } catch (err) {
              _iterator4.e(err);
            } finally {
              _iterator4.f();
            }

            if (!decisionFound) {
              var _iterator5 = _createForOfIteratorHelper((0, _values["default"])(cardData.apdu.tlvs)),
                  _step5;

              try {
                for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
                  var v = _step5.value;

                  if (v.tagNumber === 0x9f27) {
                    var _ret2 = function () {
                      var status = v.parse();

                      if (status[0] === 0x00) {
                        Log.debug(function () {
                          var _context22;

                          return (0, _concat["default"])(_context22 = "Decline for status: 0x".concat(cardData.getStatus().toString(16), " and tag (0x9F27) status  = 0x")).call(_context22, status.toString('hex'));
                        });
                        callback(_retailPaymentDevice.deviceError.contactIssuer, cardData);
                        return {
                          v: {
                            v: void 0
                          }
                        };
                      }

                      if (status[0] === 0x40) {
                        Log.debug(function () {
                          var _context23;

                          return (0, _concat["default"])(_context23 = "online approval for status: 0x".concat(cardData.getStatus().toString(16), " and tag (0x9F27) status  = 0x")).call(_context23, status.toString('hex'));
                        });
                      } else {
                        Log.debug(function () {
                          var _context24;

                          return (0, _concat["default"])(_context24 = "unexpected tag (0x9F27) status  = 0x".concat(status.toString('hex'), " for status: 0x")).call(_context24, cardData.getStatus().toString(16));
                        });
                      }
                    }();

                    if ((0, _typeof2["default"])(_ret2) === "object") return _ret2.v;
                  }
                }
              } catch (err) {
                _iterator5.e(err);
              } finally {
                _iterator5.f();
              }
            }
          }

          callback(null, cardData);
        }();

        if ((0, _typeof2["default"])(_ret) === "object") return _ret.v;
      } catch (x) {
        Log.error('cardDataParseFailed', {
          err: x
        });
        callback(x);
      }
    }
  }, {
    key: "completeTransaction",
    value: function completeTransaction(authCode, callback) {
      var _this$reader$context,
          _this12 = this;

      var apdu = createApduCommand(0xff, 0x81, 0x15, 0);
      var tlvData = new _tlvlib.TlvList();
      tlvData.add(0xdf39, Buffer.from('01', 'hex'));
      apdu.appendBytes(tlvData.toBytes());
      apdu.appendHex(authCode.toString('hex'));
      var command = new _IngenicoCommand["default"]('complete-transaction', apdu);
      command.timeout = this.reader.requestTimeout;
      command.ignoreResponse = (_this$reader$context = this.reader.context) === null || _this$reader$context === void 0 ? void 0 : _this$reader$context.shouldSimulateError53();
      this.writer.send(command, function (err, rz) {
        _this12._parseResponseForTxComplete(err, rz, callback);
      });
    }
  }, {
    key: "_sendTransactionData",
    value: function _sendTransactionData(callback) {
      var apdu = createApduCommand(0xff, 0x81, 0x13, 0);
      var tlvData = new _tlvlib.TlvList();
      tlvData.add(0x9f1b, Buffer.from('00000000', 'hex'));
      tlvData.add(0xdf07, Buffer.from('00000000', 'hex'));
      tlvData.add(0xdf08, Buffer.from('00', 'hex'));
      tlvData.add(0xdf09, Buffer.from('00', 'hex'));
      tlvData.add(0xdf03, Buffer.from('00000000', 'hex'));
      tlvData.add(0xdf04, Buffer.from('00000000', 'hex'));
      tlvData.add(0xdf05, Buffer.from('00000000', 'hex'));

      if (this.invoice) {
        var amount = _paypalInvoicing.Currency.toCents(this.invoice.currency, this.invoiceTotalCalculator(this.invoice));

        Log.debug(function () {
          return "in the TransactionData command, finalizing the invoice amount = ".concat(amount);
        });
        tlvData.add(_tlvlib.Tags.AmountAuthorized, _tlvlib.Tags.AmountAuthorized.format.toBytes(amount, 6)); // 0x9f02
      }

      apdu.appendBytes(tlvData.toBytes());
      this.writer.send(new _IngenicoCommand["default"]('transaction-data', apdu), callback);
    }
  }, {
    key: "getBatteryLevel",
    value: function getBatteryLevel(reuseIfQueued, callback) {
      var _this13 = this; // This command returns battery level/isCharging flag. So when the card reader is charging, we make a second call to retrieve battery information.


      var apduBatteryLevelOrChargingStatus = createApduCommand(0xff, 0x88, 0, 0x01);
      var cmd = new _IngenicoCommand["default"]('get-battery-or-charging-status', apduBatteryLevelOrChargingStatus);
      cmd.reuseIfQueued = reuseIfQueued;
      this.writer.send(cmd, function (err, hexBatteryOrChargingStatus) {
        if (err) {
          Log.error('UnableToRetrieveBatteryLevel+chargingStatus', {
            crId: _this13.reader.id,
            err: err
          });
          callback(err, null);
          return;
        }

        var level = (0, _parseInt2["default"])(hexBatteryOrChargingStatus, 16);

        if (level === 255) {
          var apduBatteryLevelOnly = createApduCommand(0xff, 0x88, 0, 0);
          apduBatteryLevelOnly.reuseIfQueued = reuseIfQueued;

          _this13.writer.send(new _IngenicoCommand["default"]('get-battery-level', apduBatteryLevelOnly), function (errLevel, hexBatteryLevel) {
            if (errLevel) {
              Log.error('batteryLevelRetrievalFailed', {
                crId: _this13.reader.id,
                err: err
              });
              callback(err, null);
              return;
            }

            level = (0, _parseInt2["default"])(hexBatteryLevel, 16);
            Log.debug(function () {
              return "charging battery level ".concat(level);
            });
            var batteryInfo = new _retailPaymentDevice.BatteryInfo(level, new Date(), _retailPaymentDevice.batteryStatus.charging);
            callback(null, batteryInfo);
          });
        } else {
          Log.debug(function () {
            return "draining battery level ".concat(level);
          });
          var batteryInfo = new _retailPaymentDevice.BatteryInfo(level, new Date(), _retailPaymentDevice.batteryStatus.draining);
          callback(null, batteryInfo);
        }
      });
    }
  }, {
    key: "selectApplication",
    value: function selectApplication(aid, callback) {
      var _this14 = this;

      Log.debug(function () {
        return "Selected AID to be sent : ".concat(aid);
      });
      var apdu = createApduCommand(0xff, 0x81, 0x12, 0);
      apdu.appendHex(aid);
      this.writer.send(new _IngenicoCommand["default"]('select-app', apdu), function (err, rz) {
        _this14._parseResponseForTxStart(err, rz, callback);
      });
    }
  }]);
  return Terminal;
}(_events.EventEmitter);

exports["default"] = Terminal;

}).call(this)}).call(this,require("buffer").Buffer)
},{"./FirmwareUpdateFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/FirmwareUpdateFlow.js","./IngenicoCommand":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/IngenicoCommand.js","./IngenicoTags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/IngenicoTags.js","./Parser":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/Parser.js","./Writer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/Writer.js","./eventType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/eventType.js","./ingenico_config.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/ingenico_config.json","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/pad-start":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-start.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/async/lib/async.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/TransactionDataResponse.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _tlvlib = require("tlvlib");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('ingenico.TransactionDataResponse');

var TransactionDataResponse = /*#__PURE__*/function (_CardReaderResponse) {
  (0, _inherits2["default"])(TransactionDataResponse, _CardReaderResponse);

  var _super = _createSuper(TransactionDataResponse);

  function TransactionDataResponse(status, dataBuffer, unsolicited) {
    var _this;

    (0, _classCallCheck2["default"])(this, TransactionDataResponse);
    _this = _super.call(this, dataBuffer, dataBuffer.length, unsolicited);
    _this.status = status;
    var tlvList = new _tlvlib.TlvList(dataBuffer);

    try {
      _this.apdu = new _tlvlib.ApduResponse(tlvList); // parsing from tlvList creates duplicate tags, so replace the raw data

      _this.apdu.data = dataBuffer;
      Log.debug(function () {
        var _context, _context2, _context3;

        return (0, _concat["default"])(_context = (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = "Ingenico response template: ".concat(_this.apdu.template ? _this.apdu.template.toString(16) : '<empty>', " SW1: ")).call(_context3, _this.apdu.sw1.toString(16), " SW2: ")).call(_context2, _this.apdu.sw2.toString(16), " Raw: ")).call(_context, dataBuffer.toString('hex'));
      });
    } catch (x) {
      Log.error('FailedToParseAPDUFromRawResp', {
        resp: dataBuffer.toString('hex'),
        err: x.message
      });
    }

    return _this;
  }

  (0, _createClass2["default"])(TransactionDataResponse, [{
    key: "getStatus",
    value: function getStatus() {
      return this.status;
    }
  }]);
  return TransactionDataResponse;
}(_retailPaymentDevice.CardReaderResponse);

exports["default"] = TransactionDataResponse;

},{"@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/Writer.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

require("core-js/modules/es.regexp.exec.js");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _splice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/splice"));

var _findIndex = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find-index"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-timeout"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _machina = _interopRequireDefault(require("machina"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _events = require("events");

var _manticore = _interopRequireDefault(require("manticore"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticorePaypalerror = require("@paypalcorp/manticore-paypalerror");

var _IngenicoCommand = _interopRequireWildcard(require("./IngenicoCommand"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context14;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context14 = Object.prototype.toString.call(o)).call(_context14, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Log = (0, _manticoreLog["default"])('ingenico.writer');
var maxRetry = 3;
var msRetryPause = 300;
var errCardReaderBusy = 'CardReaderBusy';

var Writer = /*#__PURE__*/function () {
  function Writer(device) {
    var _this = this;

    (0, _classCallCheck2["default"])(this, Writer);
    this.device = device;
    this.channel = new _machina["default"].Fsm({
      namespace: 'ingenico-command-queue',
      initialState: 'idle',
      initialize: function initialize() {
        _this._queue = [];

        _this._isAwaiting = function () {
          var _context;

          return (0, _some["default"])(_context = _this._queue).call(_context, function (cmd) {
            return cmd.awaiting;
          });
        };

        _this._isAwaitingOn = function (cmdName) {
          var _context2;

          return (0, _some["default"])(_context2 = _this._queue).call(_context2, function (cmd) {
            return cmd.awaiting && cmd.name === cmdName;
          });
        };

        _this._queueToString = function () {
          var _context3;

          return "Q = [".concat(_this._queue.length ? (0, _map["default"])(_context3 = _this._queue).call(_context3, function (c) {
            var _context4, _context5;

            return (0, _concat["default"])(_context4 = (0, _concat["default"])(_context5 = "".concat(c.awaiting ? '<AWAIT>' : '')).call(_context5, c.name, "-")).call(_context4, c.id);
          }).join(',') : '<none>', "]");
        };

        _this._consCommandToQueue = function (cmd) {
          var _this$_queue$;

          if (cmd.reuseIfQueued && ((_this$_queue$ = _this._queue[0]) === null || _this$_queue$ === void 0 ? void 0 : _this$_queue$.name) === cmd.name) {
            var _this$_queue$0$callba;

            (_this$_queue$0$callba = _this._queue[0].callbacks).push.apply(_this$_queue$0$callba, (0, _toConsumableArray2["default"])(cmd.callbacks));

            return;
          }

          _this._queue.unshift(cmd);

          Log.debug('Cons command', function () {
            return {
              channelState: _this.channel.state,
              queue: _this._queueToString(),
              cmd: cmd.nameWithId
            };
          });
        };

        _this._addCommandToQueue = function (cmd) {
          if (cmd.reuseIfQueued) {
            var _iterator = _createForOfIteratorHelper(_this._queue),
                _step;

            try {
              var _loop = function _loop() {
                var qCmd = _step.value;

                if (qCmd.name === cmd.name) {
                  var _qCmd$callbacks;

                  (_qCmd$callbacks = qCmd.callbacks).push.apply(_qCmd$callbacks, (0, _toConsumableArray2["default"])(cmd.callbacks));

                  Log.debug('Reusing already queued command', function () {
                    return {
                      channelState: _this.channel.state,
                      discardingCmd: cmd,
                      reusingCmd: qCmd,
                      queue: _this._queueToString()
                    };
                  });
                  return {
                    v: void 0
                  };
                }
              };

              for (_iterator.s(); !(_step = _iterator.n()).done;) {
                var _ret = _loop();

                if ((0, _typeof2["default"])(_ret) === "object") return _ret.v;
              }
            } catch (err) {
              _iterator.e(err);
            } finally {
              _iterator.f();
            }
          }

          if (cmd.name === Writer.cmdName.startTx) {
            if (_this._isAwaitingOn(Writer.cmdName.startTx)) {
              Log.warn('DiscardingCmdAsDeviceIsCurrentlyActiveWithCmd', {
                state: _this.channel.state,
                cmd: cmd,
                activeCmd: _this._queue[0]
              });
              return;
            }

            var _loop2 = function _loop2(i) {
              if (_this._queue[i].name === cmd.name) {
                Log.debug('Replacing existing unsent command', function () {
                  return {
                    channelState: _this.channel.state,
                    replacingCmd: _this._queue[i],
                    replacedCmdPosition: i,
                    newCmd: cmd
                  };
                });
                _this._queue[i] = cmd;
                return {
                  v: void 0
                };
              }
            };

            for (var i = 1; i < _this._queue.length; i++) {
              var _ret2 = _loop2(i);

              if ((0, _typeof2["default"])(_ret2) === "object") return _ret2.v;
            }
          } else if (cmd.name === Writer.cmdName.stopTx) {
            var _loop3 = function _loop3(_i) {
              var qCmd = _this._queue[_i];

              if (qCmd.name === Writer.cmdName.startTx && !qCmd.awaiting) {
                var _context8;

                Log.debug('Discarding unsent command on response to a similar sent command', function () {
                  return {
                    channelState: _this.channel.state,
                    unsentCmd: qCmd,
                    sentCmd: cmd
                  };
                });
                Log.debug(function () {
                  var _context6, _context7;

                  return (0, _concat["default"])(_context6 = (0, _concat["default"])(_context7 = "[".concat(_this.channel.state, "] Discarding unsent ")).call(_context7, qCmd.nameWithId, " in response to ")).call(_context6, cmd.nameWithId);
                });
                (0, _splice["default"])(_context8 = _this._queue).call(_context8, _i, 1);
              }
            }; // Remove all non awaiting start transaction commands


            for (var _i = _this._queue.length - 1; _i > 0; _i--) {
              _loop3(_i);
            }
          }

          if (cmd.enqueueAction === _IngenicoCommand.EnqueueAction.cons) {
            _this._consCommandToQueue(cmd);
          } else {
            _this._queue.push(cmd);

            Log.debug('Enqueue command', function () {
              return {
                channelState: _this.channel.state,
                queue: _this._queueToString(),
                cmd: cmd.nameWithId
              };
            });
          }
        };

        _this._dequeueAndInvokeCallback = function (err, rz, eCmd, cb) {
          var _context9, _context10; // index, splice, and log added for DTPPHMM-531


          var index = !eCmd ? 0 : (0, _findIndex["default"])(_context9 = _this._queue).call(_context9, function (c) {
            return c.name === eCmd.name;
          });

          if (index < 0) {
            // ignore response if cmd not found
            Log.error('CommandThatEmittedResponseNotFoundInQueue', {
              eCmd: eCmd,
              err: err
            });
            Writer.Events.removeAllListeners([eCmd.responseEventName]);
            return;
          }

          var ignoreCmd = _this._queue[index];

          if (ignoreCmd !== null && ignoreCmd !== void 0 && ignoreCmd.ignoreResponse) {
            Log.error('Ignore the response to simulate errors', {
              eCmd: eCmd,
              err: err
            });
            delete ignoreCmd.ignoreResponse;
            return;
          }

          var _this$_queue$splice = (0, _splice["default"])(_context10 = _this._queue).call(_context10, index, 1),
              _this$_queue$splice2 = (0, _slicedToArray2["default"])(_this$_queue$splice, 1),
              cmd = _this$_queue$splice2[0];

          if (cmd.name === Writer.cmdName.cancelTx) {
            var _context11; // Pop the previously awaiting command on response of cancel tx command


            var i = (0, _findIndex["default"])(_context11 = _this._queue).call(_context11, function (c) {
              return c.awaiting;
            });

            if (i >= 0) {
              var _context12;

              var _this$_queue$splice3 = (0, _splice["default"])(_context12 = _this._queue).call(_context12, i, 1),
                  _this$_queue$splice4 = (0, _slicedToArray2["default"])(_this$_queue$splice3, 1),
                  awaitingCmd = _this$_queue$splice4[0];

              awaitingCmd.clearTimeout();
            }
          }

          cmd.clearTimeout();

          if (err && err.code === errCardReaderBusy) {
            Log.warn('Card reader Error', {
              state: _this.channel.state,
              nameWithId: cmd.nameWithId,
              errorCode: err.code
            });

            if (cmd.sendAttempt > maxRetry) {
              Log.error('Maxed retries for command', {
                state: _this.channel.state,
                attempt: cmd.sendAttempt,
                nameWithId: cmd.nameWithId
              });
            } else {
              Log.warn('Retrying command', {
                state: _this.channel.state,
                nameWithId: cmd.nameWithId,
                msRetryPause: msRetryPause,
                attempt: cmd.sendAttempt,
                maxRetry: maxRetry
              });
              cmd.awaiting = false;

              _this._removeListeners(cmd);

              _this._queue.unshift(cmd);

              _manticore["default"].setTimeout(function () {
                Log.debug('Retrying after timeout', function () {
                  return {
                    channelState: _this.channel.state,
                    timeout: msRetryPause
                  };
                });
                cb('sendCommand');
              }, msRetryPause);

              return; // return here so that we do not get back to idle state immediately
            }
          } else {
            var shouldLogAsDebug = function shouldLogAsDebug(error) {
              return !error || _retailPaymentDevice.deviceError.deviceNotConnected.equals(error) || error.code === 'CommandCancelledUponReceiptOfACancelWaitCommand';
            };

            Log[shouldLogAsDebug(err) ? 'debug' : 'error']('Response', {
              channelState: _this.channel.state,
              error: err instanceof _manticorePaypalerror.PayPalError ? err : "Error: ".concat(err ? (0, _stringify["default"])(err) : ''),
              errorHandleCommand: cmd.nameWithId,
              callbackCount: cmd.callbacks.length,
              response: (0, _stringify["default"])(rz)
            });
          }

          Writer.Events.removeAllListeners([cmd.responseEventName]);
          _this.device.lastError = err;

          var _iterator2 = _createForOfIteratorHelper(cmd.callbacks),
              _step2;

          try {
            var _loop4 = function _loop4() {
              var callback = _step2.value;

              if (callback) {
                // Invoking the callback asynchronously in order to avoid state transitions from within the callback
                _manticore["default"].setTimeout(function () {
                  try {
                    cmd.clearTimeout();
                    callback(err, rz);
                  } catch (e) {
                    Log.error('ErrInvokingCallbackForACommand', {
                      state: _this.channel.state,
                      nameWithId: cmd.nameWithId,
                      rz: rz,
                      cb: callback,
                      stack: e.stack,
                      msg: e.msg || e.message
                    });
                  }
                }, 0);
              }
            };

            for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
              _loop4();
            }
          } catch (err) {
            _iterator2.e(err);
          } finally {
            _iterator2.f();
          }

          cb('idle');
        };

        _this._deviceRemovedHandler = function (cmd) {
          Writer.Events.emit(cmd.responseEventName, _retailPaymentDevice.deviceError.deviceNotConnected);
        };

        _this._addListeners = function (cmd) {
          Writer.Events.once(cmd.responseEventName, _this._deviceResponseHandler);

          _this.device.once(_retailPaymentDevice.PaymentDevice.Event.disconnected, _this._deviceRemovedHandler);

          _this.device.once(_retailPaymentDevice.PaymentDevice.Event.deviceRemoved, _this._deviceRemovedHandler);
        };

        _this._deviceResponseHandler = function (err, rz, cmd) {
          _this._dequeueAndInvokeCallback(err, rz, cmd, function (transitionTo) {
            _this._removeListeners(cmd);

            _this.channel.transition(transitionTo);
          });
        };

        _this._removeListeners = function (cmd) {
          if (cmd) {
            Writer.Events.removeAllListeners([cmd.responseEventName]);
          }

          _this.device.removeListener(_retailPaymentDevice.PaymentDevice.Event.disconnected, _this._deviceRemovedHandler);

          _this.device.removeListener(_retailPaymentDevice.PaymentDevice.Event.deviceRemoved, _this._deviceRemovedHandler);
        };

        Log.debug('Command channel queue initialized', function () {
          return {
            deviceId: _this.device.id
          };
        });
      },
      states: {
        idle: {
          _onEnter: function _onEnter() {
            Log.debug('onEnter', function () {
              return {
                channelState: _this.channel.state,
                queue: _this._queueToString(),
                queueLength: _this._queue.length
              };
            });

            if (_this._queue.length > 0) {
              _this.channel.transition('sendCommand');
            }
          },
          enqueue: function enqueue(cmd) {
            _this._addCommandToQueue(cmd);

            _this.channel.transition('sendCommand');
          }
        },
        sendCommand: {
          _onEnter: function _onEnter() {
            Log.debug('onEnter', function () {
              return {
                channelState: _this.channel.state,
                queue: _this._queueToString(),
                queueLength: _this._queue.length
              };
            });

            if (!_this._queue.length) {
              _this.channel.transition('idle');

              return;
            }

            _this.channel.handle('send');
          },
          send: function send() {
            if (!_this.device.isConnected()) {
              _this._dequeueAndInvokeCallback(_retailPaymentDevice.deviceError.deviceNotConnected, null, null, function (transitionTo) {
                _this.channel.transition(transitionTo);
              });

              return;
            }

            var cmd = _this._queue[0];

            if (!_this._isAwaitingOn(cmd.name)) {
              // Push the command to card reader
              var cb = function cb(err, rz) {
                _manticore["default"].setTimeout(function () {
                  return Writer.Events.emit(cmd.responseEventName, err, rz, cmd);
                }, 0);
              };

              _this.device.lastError = null;
              cmd.awaiting = true;

              _this._addListeners(cmd);

              cmd.sendAttempt += 1;

              if (cmd.nativeCommand) {
                _this.device["native"][cmd.name](cmd.nativeCommand, cb);
              } else {
                var _context13;

                var apduHex = cmd.apduCommand ? cmd.apduCommand.toBytes().toString('hex') : cmd.rawHexCommand;

                _this.device["native"].send((0, _concat["default"])(_context13 = "".concat(cmd.name, ":")).call(_context13, cmd.id), apduHex, cb);
              }

              if (cmd.timeout) {
                cmd.timeoutHandle = (0, _setTimeout2["default"])(function () {
                  Log.error('Command timed out awaiting response', {
                    cmd: cmd
                  });

                  _this._dequeueAndInvokeCallback(_retailPaymentDevice.deviceError.timeout, undefined, cmd, function (transitionTo) {
                    _this._removeListeners(cmd);

                    _this.channel.transition(transitionTo);
                  });
                }, cmd.timeout);
              }

              Log.debug('Sent command', function () {
                return {
                  cmd: cmd,
                  channelState: _this.channel.state
                };
              });
            }

            _this.channel.transition('wait', cmd);
          },
          enqueue: function enqueue(cmd) {
            _this._addCommandToQueue(cmd);
          }
        },
        wait: {
          _onEnter: function _onEnter(cmd) {
            Log.debug('Entering wait state', function () {
              return {
                channelState: _this.channel.state,
                queue: _this._queueToString(),
                cmd: cmd
              };
            });
          },
          enqueue: function enqueue(cmd) {
            _this._addCommandToQueue(cmd);
          }
        }
      },
      enqueue: function enqueue(cmd) {
        _this.channel.handle('enqueue', cmd);
      },
      deactivateReader: function deactivateReader(callback) {
        Log.debug('Reader de-activate requested', function () {
          return {
            channelState: _this.channel.state,
            queue: _this._queueToString()
          };
        });

        _this._removeListeners();

        var stopTxCommand = new _IngenicoCommand["default"](Writer.cmdName.stopTx);
        stopTxCommand.rawHexCommand = 'FF811600000000';
        stopTxCommand.callbacks.push(callback);
        stopTxCommand.reuseIfQueued = true;
        stopTxCommand.enqueueAction = _IngenicoCommand.EnqueueAction.cons;

        _this.channel.handle('enqueue', stopTxCommand);

        if (_this._isAwaiting() && !_this._isAwaitingOn(Writer.cmdName.stopTx)) {
          var cancelCommand = new _IngenicoCommand["default"]('cancel-last-command');
          cancelCommand.rawHexCommand = 'ff0b000000';
          cancelCommand.reuseIfQueued = true;
          cancelCommand.timeout = _this.device.requestTimeout;
          cancelCommand.enqueueAction = _IngenicoCommand.EnqueueAction.cons;

          _this.channel.handle('enqueue', cancelCommand);
        }

        _this.channel.transition('sendCommand');
      }
    });
  }

  (0, _createClass2["default"])(Writer, [{
    key: "send",
    value: function send(ingenicoCommand, callback) {
      if (ingenicoCommand instanceof _IngenicoCommand["default"]) {
        ingenicoCommand.callbacks.push(callback);
        this.channel.enqueue(ingenicoCommand);
      } else {
        Log.error('ReceivedCmdThatIsNotOfTypeIngenicoCmd', {
          cmd: ingenicoCommand
        });

        if (callback) {
          callback(_retailPaymentDevice.deviceError.unexpectedRequest);
        }
      }
    }
  }, {
    key: "clear",
    value: function clear() {
      Log.info('ResetQueueOfSize', {
        length: this._queue.length
      });
      this._queue = [];

      this._removeListeners();
    }
  }, {
    key: "commandQueue",
    get: function get() {
      return this._queue;
    }
  }, {
    key: "deactivateReader",
    value: function deactivateReader(callback) {
      this.channel.deactivateReader(callback);
    }
  }]);
  return Writer;
}();

exports["default"] = Writer;
Writer.cmdName = {
  stopTx: 'stop-transaction',
  startTx: 'start-transaction',
  cancelTx: 'cancel-last-command'
};
Writer.Events = new _events.EventEmitter();

},{"./IngenicoCommand":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/IngenicoCommand.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/find-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find-index.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js","@babel/runtime-corejs3/core-js-stable/instance/splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/set-timeout":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/manticore-paypalerror":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-paypalerror/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","machina":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/machina/lib/machina.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/eventType.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
var eventType = {
  cardInserted: 'cardInserted',
  cardRemoved: 'cardRemoved',
  cardSwiped: 'cardSwiped',
  cardTapped: 'cardTapped',
  commandSent: 'commandSent'
};
var _default = eventType;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/index.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

_Object$defineProperty(exports, "default", {
  enumerable: true,
  get: function get() {
    return _IngenicoDevice["default"];
  }
});

var _IngenicoDevice = _interopRequireDefault(require("./IngenicoDevice"));

},{"./IngenicoDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/IngenicoDevice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/ingenicoFirmwareUpdateCommands.json":[function(require,module,exports){
module.exports={
  "enableFirmwareUpdateMode":{
    "request": "FF89020000",
    "response": "9000"
  },
  "confirmProtocol": {
    "request": "80",
    "response": "8001"
  },
  "clearFirmwareCache": {
    "request": "30",
    "response": "3005"
  },
  "settingCommunicationBuffer": {
    "request": "06461004",
    "response": "064605"
  },
  "confirmCommunicationBuffer": {
    "request": "0642",
    "response": "0642"
  },
  "disableFirmareUpdateMode": {
    "request": "6055555555",
    "response": "6005"
  },
  "pauseFirmareUpdate": {
    "request": "FFFFFFFFS"
  },
  "successfulPageSend": {
    "response": "0605"
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/ingenicoReaderError.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
var ingenicoReaderError = {
  invalidChip: 'C009',
  invalidChipSwipeCard: 'C00A',
  pleaseInsertCard: 'C00C',
  multipleContactlessCardsDetected: 'C00E',
  pleaseSeePhone: 'C01A',
  contactlessInterfaceFailedTryContact: 'C017',
  transactionCancelled: 'CommandCancelledUponReceiptOfACancelWaitCommand',
  mandatoryEMVTLVDataMissing: 'MandatoryEMVTLVDataMissing',
  noMutuallySupportedAIDs: 'NoMutuallySupportedAIDs',
  applicationBlocked: 'ApplicationBlocked',
  cardReaderNotConnected: 'CardReaderNotConnected',
  cardReaderConnectionLost: 'ConnectionLost',
  batteryTooLowError: 'BatteryTooLowError'
};
var _default = ingenicoReaderError;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/ingenico_config.json":[function(require,module,exports){
module.exports={
  "AmountDol": "9F02065F25035F24034F1050109F121087019F36025A0A5F3401950557139B02",
  "OnlineDol": "5F24039F09025F30029F02069F03069F26084F10820250109F36029F07029F34039F270184109F1E089F10205F28025F34019F39019F06109F33039F1A029F350195059F53015F2A029A039F41049B029C019F37045713DF822520DF8223F0",
  "ResponseDol": "5F24039F09029F02069F03069F26084F10820250109F36029F07029F34039F270184109F1E089F10205F28025F34019F39019F06109F33039F1A029F350195059F53015F2A029A039F41049B029C019F37045713DF822520DF8223F0",
  "ContactlessResponseDol": "9F63069F64019F62069F65029F7C209F6B139F67019F66049F60028202841095059A039C015F34019F02069F03069F09029F10209F1A029F1E089F26089F27019F33039F34039F35019F36029F37049F41049F53019F6E205F24039F61025F201ADF31015713DF822520DF8223F0DF6F02DFDF413EDFDF4227",
  "ContactlessOnlineDol": "9F63069F64019F62069F65029F7C209F6B139F67019F66049F60029F07029F39019F06105F28025F30024F1050108202841095059A039C015F2A025F34019F02069F03069F09029F10209F1A029F1E089F26089F27019F33039F34039F35019F36029F37049F41049F53019F6E205F24039F61025F201A5713DF822520DF8223F0DF6F02DFDF413EDFDF4227",
  "MagstripeDol": "DF822520DF8223F0DF82564CDF82574CDF82584CDF82604C00",
  "ContactlessOptions": "ff8124000002df9d00",
  "ReaderCommands":
  [
    {
      "Description": "buzzerCmd",
      "Command": "ff880700010200"
    },
    {
      "Description": "indefiniteWait",
      "Command": "FF8106000006FFFF656e010100"
    },
    {
      "Description": "savingModeCmd",
      "Command": "ff88040002000a00"
    },
    {
      "Description": "shutDownTimeoutCmd",
      "Command": "ff88040102007800"
    }
  ],
  "aidList": {
    "Contact": {
      "AID": {
        "A0000000031010": {
          "TermAppVer": "0096",
          "LowestAppVer": "0096",
          "Priority": "00",
          "AppSelect": "01",
          "tlvData": {
            "DF03": "DC4000A800",
            "DF04": "0010000000",
            "DF05": "DC4004F800",
            "9F01": "000000000000",
            "9F40": "600000A001",
            "9F35": "22",
            "9F33": "6028C8"
          }
        },
        "A0000000032010": {
          "TermAppVer": "0096",
          "LowestAppVer": "0096",
          "Priority": "00",
          "AppSelect": "01",
          "tlvData": {
            "DF03": "DC4000A800",
            "DF04": "0010000000",
            "DF05": "DC4004F800",
            "9F01": "000000000000",
            "9F40": "600000A001",
            "9F35": "22",
            "9F33": "6028C8"
          }
        },
        "A0000000041010": {
          "TermAppVer": "0002",
          "LowestAppVer": "0002",
          "Priority": "00",
          "AppSelect": "01",
          "tlvData": {
            "DF03": "FE5080F800",
            "DF04": "0000000000",
            "DF05": "FE5080F800",
            "9F01": "000000000000",
            "9F40": "600000A001",
            "9F35": "22",
            "9F33": "6028C8"
          }
        },
        "A0000001523010": {
          "TermAppVer": "0001",
          "LowestAppVer": "0001",
          "Priority": "00",
          "AppSelect": "01",
          "tlvData": {
            "DF03": "DC00002000",
            "DF04": "0010000000",
            "DF05": "FCE09CF800",
            "9F01": "000000000000",
            "9F40": "600000A001",
            "9F35": "22",
            "9F33": "6028C8"
          }
        },
        "A00000002501": {
          "TermAppVer": "0001",
          "LowestAppVer": "0001",
          "Priority": "00",
          "AppSelect": "01",
          "tlvData": {
            "DF03": "C800000000",
            "DF04": "0000000000",
            "DF05": "C800000000",
            "9F01": "000000000000",
            "9F40": "600000A001",
            "9F35": "22",
            "9F33": "6028C8"
          }
        }
      }
    },
    "Contactless": {
      "AID": {
        "A0000000031010": {
          "TermAppVer": "0096",
          "LowestAppVer": "0096",
          "Priority": "00",
          "AppSelect": "01",
          "FloorLimit": "00000000",
          "CVMLimit": "00001388",
          "TxnLimit": "000F4240",
          "TermCaps": "6028C8",
          "tlvData": {
            "DF03": "0000000000",
            "DF04": "0000000000",
            "DF05": "0000000000",
            "DF07": "00000000",
            "DF08": "00",
            "DF09": "00",
            "DF15": "9F37049F02065F2A029F6905",
            "DF18": "9F0206",
            "9F40": "600000A001",
            "9F6D": "0001",
            "9F35": "22"
          }
        },
        "A0000000032010": {
          "TermAppVer": "0096",
          "LowestAppVer": "0096",
          "Priority": "00",
          "AppSelect": "01",
          "FloorLimit": "00000000",
          "CVMLimit": "00001388",
          "TxnLimit": "000F4240",
          "TermCaps": "6028C8",
          "tlvData": {
            "DF03": "0000000000",
            "DF04": "0000000000",
            "DF05": "0000000000",
            "DF07": "00000000",
            "DF08": "00",
            "DF09": "00",
            "DF15": "9F37049F02065F2A029F6905",
            "DF18": "9F0206",
            "9F40": "600000A001",
            "9F6D": "0001",
            "9F35": "22"
          }
        },
        "A0000000041010": {
          "TermAppVer": "0002",
          "LowestAppVer": "0002",
          "Priority": "00",
          "AppSelect": "01",
          "FloorLimit": "00000000",
          "CVMLimit": "00001388",
          "TxnLimit": "000F4240",
          "TermCaps": "6028C8",
          "tlvData": {
            "DF07": "00000000",
            "DF08": "00",
            "DF09": "00",
            "DF03": "FC50808800",
            "DF04": "0000000000",
            "DF05": "FC50808800",
            "9F40": "600000A001",
            "9F6D": "0001",
            "9F35": "22",
            "9F1D": "2C28000000000000",
            "DF15": "9F37049F02065F2A029F6905",
            "DF18": "9F02065F2A029A039C0195059F3704",
            "DF54": "9F6A04",
            "DF811E": "10",
            "DF811B": "20",
            "DF812C": "00",
            "DF8118": "20",
            "DF8119": "08",
            "DF8124": "000001000000",
            "DF8125": "000001000000",
            "DF8126": "000000005000",
            "DF811C": "003C",
            "DF811D": "01"
          }
        },
        "A0000001523010": {
          "TermAppVer": "0100",
          "LowestAppVer": "0100",
          "Priority": "00",
          "AppSelect": "01",
          "FloorLimit": "00000000",
          "CVMLimit": "00001388",
          "TxnLimit": "000F4240",
          "TermCaps": "6028C8",
          "tlvData": {
            "DF03": "0000000000",
            "DF04": "0000000000",
            "DF05": "0000000000",
            "DF07": "00000000",
            "DF08": "00",
            "DF09": "00",
            "DF15": "9F37049F02065F2A029F6905",
            "9F40": "600000A001",
            "9F6D": "0001",
            "9F35": "22"
          }
        },
        "A0000003241010": {
          "TermAppVer": "0100",
          "LowestAppVer": "0100",
          "Priority": "00",
          "AppSelect": "01",
          "FloorLimit": "00000000",
          "CVMLimit": "00001388",
          "TxnLimit": "000F4240",
          "TermCaps": "6028C8",
          "tlvData": {
            "DF03": "0000000000",
            "DF04": "0000000000",
            "DF05": "0000000000",
            "DF07": "00000000",
            "DF08": "00",
            "DF09": "00",
            "DF15": "9F37049F02065F2A029F6905",
            "9F6D": "0001",
            "9F40": "600000A001",
            "9F35": "22"
          }
        },
        "A00000002501": {
          "TermAppVer": "0001",
          "LowestAppVer": "0001",
          "Priority": "00",
          "AppSelect": "01",
          "FloorLimit": "00000000",
          "CVMLimit": "00001388",
          "TxnLimit": "000F4240",
          "TermCaps": "6028C8",
          "tlvData": {
            "DF07": "00000000",
            "DF08": "00",
            "DF09": "00",
            "DF03": "DC50840000",
            "DF04": "0000000000",
            "DF05": "C400000000",
            "9F40": "600000A001",
            "DF15": "9F37049F02065F2A029F6905",
            "DF44": "003C",
            "9F6D": "0001",
            "9F35": "22",
            "9F6E": "D8A00000"
          }
        }
      }
    }
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/CardReaderDisplayController.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var Log = (0, _manticoreLog["default"])('paymentDevice.displayController');

var CardReaderDisplayController = /*#__PURE__*/function () {
  function CardReaderDisplayController() {
    (0, _classCallCheck2["default"])(this, CardReaderDisplayController);
    this._lastDisplayCommand = {};
  }
  /**
   * Updates the card reader display only when the provided priority is greater than the priority of the most recent
   * display command that was pushed to the card reader
   * @param {int} priority
   * @param {PaymentDevice} cardReader
   * @param {object} displayArgs
   * @param {function} [cb]
   */


  (0, _createClass2["default"])(CardReaderDisplayController, [{
    key: "display",
    value: function display(priority, cardReader, displayArgs, cb) {
      var _this = this;

      var needsUpdate = false;
      var lastCommand = this._lastDisplayCommand[cardReader.id];

      if (!lastCommand) {
        Log.debug(function () {
          var _context;

          return (0, _concat["default"])(_context = "Will push ".concat(displayArgs.id, " to ")).call(_context, cardReader.id, " as no previous commands were found");
        }); // If the device disconnects at a later point, clear the prevailing state during the disconnect

        cardReader.once(_retailPaymentDevice.PaymentDevice.Event.disconnected, function () {
          return delete _this._lastDisplayCommand[cardReader.id];
        });
        needsUpdate = true;
      } else if (lastCommand.priority > priority) {
        Log.debug(function () {
          var _context2, _context3, _context4, _context5;

          return (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = (0, _concat["default"])(_context4 = (0, _concat["default"])(_context5 = "Will NOT push ".concat(priority, ":")).call(_context5, displayArgs.id, " to ")).call(_context4, cardReader.id, " as last pushed command ")).call(_context3, lastCommand.priority, ":")).call(_context2, lastCommand.displayArgs.id, " was higher in priority");
        });
        needsUpdate = false;
      } else {
        Log.debug(function () {
          var _context6, _context7, _context8, _context9;

          return (0, _concat["default"])(_context6 = (0, _concat["default"])(_context7 = (0, _concat["default"])(_context8 = (0, _concat["default"])(_context9 = "Will push ".concat(priority, ":")).call(_context9, displayArgs.id, " to ")).call(_context8, cardReader.id, " as last pushed command ")).call(_context7, lastCommand.priority, ":")).call(_context6, lastCommand.displayArgs.id, " was lower in priority");
        });
        needsUpdate = true;
      }

      if (needsUpdate) {
        this._lastDisplayCommand[cardReader.id] = {
          priority: priority,
          displayArgs: displayArgs
        };
        cardReader.display(displayArgs, function (err) {
          if (err) {
            delete _this._lastDisplayCommand[cardReader.id];
          }

          if (cb) {
            cb(err);
          }
        });
      }
    }
  }, {
    key: "resetAll",
    value: function resetAll() {
      this._lastDisplayCommand = {};
    }
  }]);
  return CardReaderDisplayController;
}();

var displayController = new CardReaderDisplayController();
var _default = displayController;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/CardReaderScanAndDiscoverOptions.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _events = require("events");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}
/**
 * Card Reader Scan and Discover options to send it over to native side
 * @class
 */


var CardReaderScanAndDiscoverOptions = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(CardReaderScanAndDiscoverOptions, _EventEmitter);

  var _super = _createSuper(CardReaderScanAndDiscoverOptions);

  function CardReaderScanAndDiscoverOptions() {
    (0, _classCallCheck2["default"])(this, CardReaderScanAndDiscoverOptions);
    return _super.apply(this, arguments);
  }

  (0, _createClass2["default"])(CardReaderScanAndDiscoverOptions, [{
    key: "connectToCardReader",
    value:
    /**
     * Select to the card reader with this id
     * @param {string} id the id of the card reader to be connected
     */
    function connectToCardReader(id) {// eslint-disable-line no-unused-vars
    } // TODO This should definitely change... We should not expect the integrating an listener to notify the SDK after adding listeners. This breaks how event emitter works on other parts of SDK

    /**
     * let the DeviceScanner know after the observers added
     */

  }, {
    key: "onAddedObserver",
    value: function onAddedObserver() {// eslint-disable-line no-unused-vars
    }
  }]);
  return CardReaderScanAndDiscoverOptions;
}(_events.EventEmitter);
/**
 * A Card Reader has been discovered.
 * @event CardReaderScanAndDiscoverOptions#onCardReaderDiscovered
 * @param {DiscoveredCardReader} device The device info that has been discovered
 */

/**
 * The procedure for scaning and discovering card readers is ended.
 * @event CardReaderScanAndDiscoverOptions#onScanComplete
 * @param {error} error Error from Scan and Discover
 */

/**
 * A PaymentDevice has been discovered. For further events, such as device readiness, removal or the
 * need for a software upgrade, your application should subscribe to the relevant events on the device
 * parameter. Please note that this doesn't always mean the device is present. In certain cases (e.g. Bluetooth)
 * we may know about the device independently of whether it's currently connected or available.
 * @event CardReaderScanAndDiscoverOptions#onConnectionStatus
 * @param {error} error Error from connection
 * @param {DiscoveredCardReader} device The device that has been connected
 */


exports["default"] = CardReaderScanAndDiscoverOptions;
CardReaderScanAndDiscoverOptions.Events = {
  onCardReaderDiscovered: 'onCardReaderDiscovered',
  onScanComplete: 'onScanComplete',
  onConnectionStatus: 'onConnectionStatus'
};

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceBuilder.js":[function(require,module,exports){
"use strict";

require("core-js/modules/es.object.to-string.js");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.replace.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticore = _interopRequireDefault(require("manticore"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _l10n = _interopRequireDefault(require("../common/l10n"));

var _retailSDKUtil = require("../common/retailSDKUtil");

var _sdkErrors = require("../common/sdkErrors");

var _DeviceProviders = _interopRequireDefault(require("./DeviceProviders"));

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context6;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context6 = Object.prototype.toString.call(o)).call(_context6, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context4, _context5;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context4 = ownKeys(Object(source), !0)).call(_context4, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context5 = ownKeys(Object(source))).call(_context5, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}

var Log = (0, _manticoreLog["default"])('sdk.deviceBuilder');

function generateSwUpdateUrl(env) {
  return "".concat((0, _retailSDKUtil.getHost)(env), "/v2/retail/validate-config");
}

function generateRKIUrl(env) {
  return "".concat((0, _retailSDKUtil.getHost)(env), "/v2/retail/secure-terminal-configs");
}

function getRemoteKeys(rqBody, deviceVendor, model, callback) {
  var url = generateRKIUrl(_Merchant["default"].active.environment);
  var body = rqBody || {};
  body.vendor = deviceVendor;
  body.model = (0, _retailSDKUtil.getDeviceModelName)(model).toLowerCase();
  Log.debug(function () {
    var _context;

    return (0, _concat["default"])(_context = "Checking for RKI info from ".concat(url, "\n")).call(_context, (0, _stringify["default"])(body, null, 4));
  });

  _Merchant["default"].active.request({
    url: url,
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: (0, _stringify["default"])(body),
    format: 'json'
  }, function (err, rz) {
    Log.debug('Received response for RKI update request');

    if (err) {
      Log.error('firmwareUpdateReqErr', {
        url: url,
        err: err,
        resp: (0, _stringify["default"])(rz)
      });
    } else {
      Log.debug(function () {
        return "Received firmware update response ".concat((0, _stringify["default"])(rz, null, 4));
      });
    }

    callback(err, rz);
  });
}

function checkForUpdates(rqBody, deviceVendor, model, callback) {
  var _getPartnerData = (0, _retailSDKUtil.getPartnerData)(_Merchant["default"]),
      firmwareImageClientType = _getPartnerData.firmwareImageClientType;

  var url = generateSwUpdateUrl(_Merchant["default"].active.environment);

  var body = _objectSpread(_objectSpread({}, rqBody), {}, {
    country_code: _Merchant["default"].active.country.toLowerCase(),
    vendor: deviceVendor,
    model: (0, _retailSDKUtil.getDeviceModelName)(model).toLowerCase(),
    environment: _Merchant["default"].active.repository,
    client_type: firmwareImageClientType
  });

  Log.debug('versionInfo> Checking for firmware updates', {
    url: url,
    body: body
  });

  _Merchant["default"].active.request({
    url: url,
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: (0, _stringify["default"])(body),
    format: 'json'
  }, function (err, rz) {
    if (err) {
      Log.error('firmwareUpdateReqVersionInfoErr', {
        url: url,
        err: err,
        resp: (0, _stringify["default"])(rz)
      });
    } else {
      Log.debug('versionInfo> Received firmware update response', rz);
    }

    callback(err, rz);
  });
}

function displayParse(val) {
  if (!val) {
    return '';
  }

  return val.id ? (0, _l10n["default"])(val.id, val.substitutions) : (0, _l10n["default"])(val);
}
/**
 * This class is intended to be used by the Native layers to create an
 * instance of payment device as soon as one is discovered
 */


var DeviceBuilder = /*#__PURE__*/function () {
  function DeviceBuilder() {
    (0, _classCallCheck2["default"])(this, DeviceBuilder);
  }

  (0, _createClass2["default"])(DeviceBuilder, [{
    key: "build",
    value: function build(manufacturer, id, connectionType, _native, model, hardwareAddress) {
      Log.info('buildingDeviceWithManufacturer', {
        manufacturer: manufacturer,
        id: id,
        connectionType: connectionType,
        model: model,
        hardwareAddress: hardwareAddress,
        numCRs: _retailPaymentDevice.PaymentDevice.devices.length
      });

      var builtPaymentDevice = _DeviceProviders["default"].create({
        id: id,
        connectionType: connectionType,
        "native": _native,
        hardwareAddress: hardwareAddress,
        manufacturer: manufacturer,
        deviceBuilderRef: this,
        model: model
      });

      return _retailPaymentDevice.PaymentDevice.discovered(builtPaymentDevice);
    }
  }, {
    key: "getRemoteCardReaderKeys",
    value: function getRemoteCardReaderKeys(rqBody, deviceVendor, model, callback) {
      var crManufacturer = _retailPaymentDevice.deviceManufacturer.keyFromValue[deviceVendor];
      Log.debug(function () {
        var _context2;

        return (0, _concat["default"])(_context2 = "Received card reader remote keys request for '".concat(crManufacturer, "-")).call(_context2, model, "'");
      });

      if (_Merchant["default"].active) {
        getRemoteKeys(rqBody, crManufacturer, model, callback);
        return;
      }

      _Merchant["default"].events.once('initialized', function (e) {
        if (e) {
          Log.warn('WillNotCheckForRKIAsMerchantInitializeFailed', {
            model: model,
            err: e
          });
          callback(e);
          return;
        }

        getRemoteKeys(rqBody, crManufacturer, model, callback);
      });
    }
  }, {
    key: "getFirmwareUpdates",
    value: function getFirmwareUpdates(rqBody, deviceVendor, model, callback) {
      var crManufacturer = _retailPaymentDevice.deviceManufacturer.keyFromValue[deviceVendor];
      Log.debug(function () {
        var _context3;

        return (0, _concat["default"])(_context3 = "Received firmware update check request for '".concat(crManufacturer, "-")).call(_context3, model, "'");
      });

      if (_Merchant["default"].active) {
        checkForUpdates(rqBody, crManufacturer, model, callback);
      } else {
        callback(_sdkErrors.merchant.notInitialized);
      }
    }
  }, {
    key: "getMerchant",
    value: function getMerchant() {
      return _Merchant["default"].active;
    }
  }, {
    key: "display",
    value: function display(args) {
      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      Log.debug('Card reader wants to display an alert on App:', {
        args: args
      });
      var alertOptions = {
        title: displayParse(args.title),
        message: displayParse(args.message),
        cancel: displayParse(args.cancel),
        showActivity: args.showActivity,
        audio: args.audio,
        replace: args.replace,
        setCancellable: args.setCancellable
      };

      if (args.buttons) {
        alertOptions.buttons = [];

        var _iterator = _createForOfIteratorHelper(args.buttons),
            _step;

        try {
          for (_iterator.s(); !(_step = _iterator.n()).done;) {
            var button = _step.value;
            alertOptions.buttons.push(displayParse(button));
          }
        } catch (err) {
          _iterator.e(err);
        } finally {
          _iterator.f();
        }
      }

      return _manticore["default"].alert(alertOptions, callback);
    }
  }]);
  return DeviceBuilder;
}();

exports["default"] = DeviceBuilder;

},{"../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./DeviceProviders":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceProviders.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.string.replace.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceConnector.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _l10n = _interopRequireDefault(require("../common/l10n"));

var _retailSDKUtil = require("../common/retailSDKUtil");

var _saveReader = require("../common/saveReader");

var _DeviceConnectorOptions = _interopRequireDefault(require("./DeviceConnectorOptions"));

var _DeviceManager = _interopRequireDefault(require("../transaction/DeviceManager"));

var _ReaderConfiguration = _interopRequireDefault(require("./ReaderConfiguration")); // eslint-disable-line import/no-cycle


var Log = (0, _manticoreLog["default"])('deviceConnector');
/**
 * Purpose of this class is to provide APIs to connect to last active card reader and the actual connection flow
 */

var DeviceConnector = /*#__PURE__*/function () {
  /**
   * Construct a new DeviceScanner
   */
  function DeviceConnector() {
    (0, _classCallCheck2["default"])(this, DeviceConnector);
    this._reportedAutoConnectLogs = new _set["default"]();
  }

  (0, _createClass2["default"])(DeviceConnector, [{
    key: "isInProgress",
    get: function get() {
      return this._promptInProgress;
    },
    set: function set(value) {
      throw new Error("The readOnly _promptInProgress property cannot be written. ".concat(value, " was passed."));
    }
  }, {
    key: "_getLastActiveReader",
    value: function _getLastActiveReader(cb) {
      (0, _saveReader.getLastActiveReader)(function (lastActiveReader) {
        return cb(lastActiveReader !== undefined && !(0, _retailSDKUtil.isRoamSwiper)(lastActiveReader.id) && lastActiveReader || undefined);
      });
    }
  }, {
    key: "connectToLastActiveReaderOrFindAnother",
    value: function connectToLastActiveReaderOrFindAnother(cb) {
      var _this = this;

      this._promptInProgress = true;
      this._createdCardReader = null;

      this._getLastActiveReader(function (activeReader) {
        var _scanner$connectedDev;

        Log.debug(function () {
          return "Last Active reader id: ".concat(activeReader === null || activeReader === void 0 ? void 0 : activeReader.id);
        });

        var scanner = _DeviceManager["default"].getDeviceScanner();

        if (activeReader && (scanner === null || scanner === void 0 ? void 0 : (_scanner$connectedDev = scanner.connectedDevice) === null || _scanner$connectedDev === void 0 ? void 0 : _scanner$connectedDev.id) === activeReader.id) {
          Log.debug(function () {
            return "Last Active reader id: ".concat(scanner.connectedDevice.id, " is already connected! Do NOT show the dialog!");
          });
          cb(null, scanner.connectedDevice);
          _this._promptInProgress = false;
          return;
        }

        if (!activeReader) {
          if (scanner) {
            scanner.updateLastActiveIfBTPaired(function (firstBTReader) {
              _this._connectToLastActiveReaderOrFindAnother(firstBTReader, cb);
            });
            return;
          }
        }

        _this._connectToLastActiveReaderOrFindAnother(activeReader, cb);
      });
    }
  }, {
    key: "assignDeviceConnectorOptionsStrings",
    value: function assignDeviceConnectorOptionsStrings() {
      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new _DeviceConnectorOptions["default"]();
      options.titleLastReaderUsed = (0, _l10n["default"])('Device.LastReaderUsed.titleLastReaderUsed');
      options.titleConnected = (0, _l10n["default"])('Device.LastReaderUsed.titleConnected');
      options.msgConnecting = (0, _l10n["default"])('Device.LastReaderUsed.msgConnecting');
      options.msgConnectionFailed = (0, _l10n["default"])('Device.LastReaderUsed.msgConnectionFailed');
      options.msgFindFailed = (0, _l10n["default"])('Device.LastReaderUsed.msgFindFailed');
      options.msgCheckReader = (0, _l10n["default"])('Device.LastReaderUsed.msgCheckReader');
      options.msgTurnOnBlueTooth = (0, _l10n["default"])('Device.LastReaderUsed.msgTurnOnBlueTooth');
      options.btnConnect = (0, _l10n["default"])('Device.LastReaderUsed.btnConnect');
      options.btnFindAnother = (0, _l10n["default"])('Device.LastReaderUsed.btnFindAnother');
      options.btnDone = (0, _l10n["default"])('Device.LastReaderUsed.btnDone');
      options.btnSwitchCardReader = (0, _l10n["default"])('Device.LastReaderUsed.btnSwitchCardReader');
      options.btnTryAgain = (0, _l10n["default"])('Device.LastReaderUsed.btnTryAgain');
      options.btnCancel = (0, _l10n["default"])('Device.LastReaderUsed.btnCancel');
      return options;
    }
  }, {
    key: "_connectToLastActiveReaderOrFindAnother",
    value: function _connectToLastActiveReaderOrFindAnother(reader) {
      var _this2 = this;

      var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

      if (!reader) {
        cb(_retailPaymentDevice.deviceError.lastActiveReaderNotFound);
        this._promptInProgress = false;
        return;
      }

      var id = reader.id,
          address = reader.address;

      var readerConfig = _ReaderConfiguration["default"].forOne(reader);

      var opt = this.assignDeviceConnectorOptionsStrings();
      opt.readerId = id;
      opt.readerDescription = (0, _retailSDKUtil.getCardReaderDescription)(id);
      opt.readerImgId = (0, _retailSDKUtil.getCardReaderIcon)(id);
      opt.errorImgId = 'ic_critical';
      opt.hardwareAddress = address;

      opt.connectToLastReader = function () {
        _DeviceManager["default"].searchAndConnectWithConfig(readerConfig, function (error, pd) {
          Log.debug('searchAndConnectWithConfig Result', {
            error: error,
            pd: pd
          });

          if (pd) {
            opt.emit(_DeviceConnectorOptions["default"].Events.connectionResult, error, pd);
          } else {
            Log.info('WillNotPromptUserToConnectToDeviceAsItIsNotAvailable', {
              error: error,
              pd: pd
            });
            opt.emit(_DeviceConnectorOptions["default"].Events.connectionResult, _retailPaymentDevice.deviceError.cardReaderNotAvailable);
          }
        });
      };

      _manticore["default"].connectLastReaderPrompt(opt, function (action) {
        Log.debug(function () {
          return "Completed 'connectLastReaderPrompt' with action='".concat(action, "'");
        });
        _this2._promptInProgress = false;

        if (action === 'cancel') {
          var _this2$_createdCardRe;

          (_this2$_createdCardRe = _this2._createdCardReader) === null || _this2$_createdCardRe === void 0 ? void 0 : _this2$_createdCardRe.disconnect(function (errDisc) {
            return Log.debug('Disconnected on user cancel', {
              crId: _this2._createdCardReader.id,
              error: errDisc
            });
          }, _retailPaymentDevice.deviceError.userCancelled // Used in PaymentDevice#connect beginDeviceConnectCB
          );
          cb(_retailPaymentDevice.deviceError.actionCancelled);
        } else if (action === 'scan') {
          try {
            _DeviceManager["default"].searchAndConnect(cb);
          } catch (err) {
            Log.debug('Error selecting devices:', {
              err: err
            });
            cb(_retailPaymentDevice.deviceError.dataRetrievalFailed);
          }
        } else {
          var activeReader = _DeviceManager["default"].getActiveReader();

          if (!activeReader) {
            cb();
            return;
          }

          Log.info('SetActiveReader', {
            crId: activeReader.id,
            updateRequired: activeReader.isUpdateRequired()
          });
          cb(null, activeReader);
        }
      });
    }
  }, {
    key: "createAndConnect",
    value: function createAndConnect(readerConfig) {
      var _this3 = this;

      var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      Log.debug('Create and Connect', {
        readerConfig: readerConfig
      });
      var shouldLogConnectionFailureAtLowLogLevel = readerConfig.shouldAutoConnect();

      _manticore["default"].createCardReader(readerConfig, function (errCreate, cardReader) {
        if (errCreate) {
          Log.debug('Error provisioning card reader', {
            readerConfig: readerConfig,
            errCreate: errCreate
          });
          cb(errCreate);
          return;
        }

        _this3._createdCardReader = cardReader;
        Log.debug('Successfully created card reader. Will attempt to connect to it', {
          cardReader: cardReader
        });
        cardReader.connect(function (err) {
          if (err) {
            if (!_this3._reportedAutoConnectLogs.has(cardReader.id)) {
              Log[shouldLogConnectionFailureAtLowLogLevel && cardReader.isConnectionErrorCommon() ? 'info' : 'debug']('cardReaderConnectionFailure', {
                crId: cardReader.id,
                err: err
              });

              _this3._reportedAutoConnectLogs.add(cardReader.id);
            }
          } else {
            Log.info('cardReaderConnectionSuccess', {
              crId: cardReader.id
            });
            _this3._reportedAutoConnectLogs = new _set["default"]();
          }

          cb(err, cardReader);
        }, {
          shouldLogConnectionFailureAtLowLogLevel: shouldLogConnectionFailureAtLowLogLevel
        });
      });
    }
  }]);
  return DeviceConnector;
}();

var deviceConnector = new DeviceConnector();
var _default = deviceConnector;
exports["default"] = _default;

},{"../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/saveReader":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/saveReader.js","../transaction/DeviceManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/DeviceManager.js","./DeviceConnectorOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceConnectorOptions.js","./ReaderConfiguration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/ReaderConfiguration.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceConnectorOptions.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _events = require("events");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}
/**
 * Device connector options to send it over to native side
 * @class
 * @property {string} readerId Card reader name as it shows up in the bluetooth settings page
 * @property {string} readerDescription Card reader description
 * @property {string} readerImgId Image identifier
 * @property {string} hardwareAddress Bluetooth card reader hardware mac address
 * @property {string} titleLastReaderUsed Title for last reader used prompt
 * @property {string} titleConnected Title for connected prompt
 * @property {string} msgConnecting Connecting message
 * @property {string} msgCheckReader Check Reader message
 * @property {string} msgTurnOnBlueTooth Turn On BlueTooth message
 * @property {string} msgConnectionFailed Connection failed message
 * @property {string} msgFindFailed Find Failed message
 * @property {string} btnConnect Connect button text
 * @property {string} btnFindAnother Find another button text
 * @property {string} btnDone Done button text
 * @property {string} btnSwitchCardReader Switch card reader button text
 * @property {string} btnTryAgain Try again button text
 * @property {string} btnCancel Cancel button text
 */


var DeviceConnectorOptions = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(DeviceConnectorOptions, _EventEmitter);

  var _super = _createSuper(DeviceConnectorOptions);

  function DeviceConnectorOptions() {
    (0, _classCallCheck2["default"])(this, DeviceConnectorOptions);
    return _super.apply(this, arguments);
  }

  (0, _createClass2["default"])(DeviceConnectorOptions, [{
    key: "connectToLastReader",
    value:
    /**
     * Connect to the last active reader
     */
    function connectToLastReader() {}
  }]);
  return DeviceConnectorOptions;
}(_events.EventEmitter);
/**
 * A PaymentDevice has been discovered. For further events, such as device readiness, removal or the
 * need for a software upgrade, your application should subscribe to the relevant events on the device
 * parameter. Please note that this doesn't always mean the device is present. In certain cases (e.g. Bluetooth)
 * we may know about the device independently of whether it's currently connected or available.
 * @event DeviceConnectorOptions#onConnectionResult
 * @param {error} Error Error from connection
 * @param {PaymentDevice} device The device that has been connected
 */


exports["default"] = DeviceConnectorOptions;
DeviceConnectorOptions.Events = {
  connectionResult: 'onConnectionResult'
};

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceProviders.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _defineProperty2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/values"));

require("core-js/modules/es.object.values.js");

var _verifonePaymentDevice = _interopRequireDefault(require("@paypalcorp/verifone-payment-device"));

var _miuraEmv = _interopRequireDefault(require("@paypalcorp/miura-emv"));

var _pipe = _interopRequireDefault(require("ramda/src/pipe"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _l10n = _interopRequireDefault(require("../common/l10n"));

var _RoamSwiperDevice = _interopRequireDefault(require("./RoamSwiperDevice"));

var _IngenicoDevice = _interopRequireDefault(require("../ingenico-emv/IngenicoDevice"));

Object.values = function (obj) {
  var _context;

  return (0, _map["default"])(_context = (0, _keys["default"])(obj)).call(_context, function (key) {
    return obj[key];
  });
};

var _is = function _is(condition, initialArg, modelName) {
  return condition ? {
    name: initialArg.name,
    model: modelName
  } : initialArg;
};

var isVerifoneRecognizable = function isVerifoneRecognizable(nameModel) {
  var _context2;

  return _is((0, _includes["default"])(_context2 = nameModel.name.toLowerCase()).call(_context2, 'verifone'), nameModel, _retailPaymentDevice.ReaderModel.Verifone);
};

var isE285Recognizable = function isE285Recognizable(nameModel) {
  var _context3;

  return _is((0, _includes["default"])(_context3 = nameModel.name.toLowerCase()).call(_context3, 'e285'), nameModel, _retailPaymentDevice.ReaderModel.E285);
};

var isP400Recognizable = function isP400Recognizable(nameModel) {
  var _context4;

  return _is((0, _includes["default"])(_context4 = nameModel.name.toLowerCase()).call(_context4, 'p400'), nameModel, _retailPaymentDevice.ReaderModel.P400);
};

var isSwiperRecognizable = function isSwiperRecognizable(nameModel) {
  var _context5;

  return _is(nameModel.name === 'PayPal Audio Reader' || (0, _indexOf["default"])(_context5 = nameModel.name).call(_context5, 'Roam') === 0, nameModel, _retailPaymentDevice.ReaderModel.Swiper);
};

var isM010Recognizable = function isM010Recognizable(nameModel) {
  var _context6;

  return _is((0, _indexOf["default"])(_context6 = nameModel.name).call(_context6, 'PayPal ') === 0, nameModel, _retailPaymentDevice.ReaderModel.M010);
};

var isMobyRecognizable = function isMobyRecognizable(nameModel) {
  var _context7, _context8;

  return _is((0, _indexOf["default"])(_context7 = nameModel.name).call(_context7, 'PayPal-') === 0 || (0, _indexOf["default"])(_context8 = nameModel.name).call(_context8, 'MOB') === 0, nameModel, _retailPaymentDevice.ReaderModel.Moby3000);
};

var isRP450Recognizable = function isRP450Recognizable(nameModel) {
  var _context9, _context10;

  return _is((0, _indexOf["default"])(_context9 = nameModel.name).call(_context9, 'PPHere-') === 0 || (0, _indexOf["default"])(_context10 = nameModel.name).call(_context10, 'RP') === 0, nameModel, _retailPaymentDevice.ReaderModel.RP450);
};

var DeviceProviders = /*#__PURE__*/function () {
  function DeviceProviders() {
    var _this$deviceProviderM;

    var _this = this;

    (0, _classCallCheck2["default"])(this, DeviceProviders);
    this.deviceProviderModule = (_this$deviceProviderM = {}, (0, _defineProperty2["default"])(_this$deviceProviderM, _retailPaymentDevice.ReaderModel.Verifone, {
      getReaderModel: function getReaderModel() {
        return _retailPaymentDevice.ReaderModel.Verifone;
      },
      getReaderManufacturer: function getReaderManufacturer() {
        return _this.getManufacturerName(_retailPaymentDevice.deviceManufacturer.verifone);
      },
      getReaderIcon: function getReaderIcon() {
        return 'chip_emv_chippin';
      },
      getReaderDescription: function getReaderDescription() {
        return (0, _l10n["default"])('Device.Verifone');
      }
    }), (0, _defineProperty2["default"])(_this$deviceProviderM, _retailPaymentDevice.ReaderModel.E285, {
      getReaderModel: function getReaderModel() {
        return _retailPaymentDevice.ReaderModel.E285;
      },
      getReaderManufacturer: function getReaderManufacturer() {
        return _this.getManufacturerName(_retailPaymentDevice.deviceManufacturer.verifone);
      },
      getReaderIcon: function getReaderIcon() {
        return 'chip_emv_chippin';
      },
      getReaderDescription: function getReaderDescription() {
        return (0, _l10n["default"])('Device.VerifoneE285');
      }
    }), (0, _defineProperty2["default"])(_this$deviceProviderM, _retailPaymentDevice.ReaderModel.P400, {
      getReaderModel: function getReaderModel() {
        return _retailPaymentDevice.ReaderModel.P400;
      },
      getReaderManufacturer: function getReaderManufacturer() {
        return _this.getManufacturerName(_retailPaymentDevice.deviceManufacturer.verifone);
      },
      getReaderIcon: function getReaderIcon() {
        return 'chip_emv_chippin';
      },
      getReaderDescription: function getReaderDescription() {
        return (0, _l10n["default"])('Device.VerifoneP400');
      }
    }), (0, _defineProperty2["default"])(_this$deviceProviderM, _retailPaymentDevice.ReaderModel.RP450, {
      getReaderModel: function getReaderModel() {
        return _retailPaymentDevice.ReaderModel.RP450;
      },
      getReaderManufacturer: function getReaderManufacturer() {
        return _this.getManufacturerName(_retailPaymentDevice.deviceManufacturer.ingenico);
      },
      getReaderIcon: function getReaderIcon() {
        return 'ic_chipntap_waves';
      },
      getReaderDescription: function getReaderDescription() {
        return (0, _l10n["default"])('Device.ChipAndTap');
      }
    }), (0, _defineProperty2["default"])(_this$deviceProviderM, _retailPaymentDevice.ReaderModel.Moby3000, {
      getReaderModel: function getReaderModel() {
        return _retailPaymentDevice.ReaderModel.Moby3000;
      },
      getReaderManufacturer: function getReaderManufacturer() {
        return _this.getManufacturerName(_retailPaymentDevice.deviceManufacturer.ingenico);
      },
      getReaderIcon: function getReaderIcon() {
        return 'ic_chipnswipe';
      },
      getReaderDescription: function getReaderDescription() {
        return (0, _l10n["default"])('Device.ChipAndSwipe');
      }
    }), (0, _defineProperty2["default"])(_this$deviceProviderM, _retailPaymentDevice.ReaderModel.M010, {
      getReaderModel: function getReaderModel() {
        return _retailPaymentDevice.ReaderModel.Moby3000;
      },
      getReaderManufacturer: function getReaderManufacturer() {
        return _this.getManufacturerName(_retailPaymentDevice.deviceManufacturer.miura);
      },
      getReaderIcon: function getReaderIcon() {
        return 'chip_emv_chippin';
      },
      getReaderDescription: function getReaderDescription() {
        return (0, _l10n["default"])('Device.Chip');
      }
    }), (0, _defineProperty2["default"])(_this$deviceProviderM, _retailPaymentDevice.ReaderModel.Swiper, {
      getReaderModel: function getReaderModel() {
        return _retailPaymentDevice.ReaderModel.Swiper;
      },
      getReaderManufacturer: function getReaderManufacturer() {
        return _this.getManufacturerName(_retailPaymentDevice.deviceManufacturer.roam);
      },
      getReaderIcon: function getReaderIcon() {
        return 'triangle_swiper';
      },
      getReaderDescription: function getReaderDescription() {
        return (0, _l10n["default"])('Device.Swipe');
      }
    }), _this$deviceProviderM);
    this._providers = {};
  }

  (0, _createClass2["default"])(DeviceProviders, [{
    key: "register",
    value: function register(provider) {
      this._providers = provider;
    }
  }, {
    key: "create",
    value: function create(_ref) {
      var id = _ref.id,
          connectionType = _ref.connectionType,
          _native = _ref["native"],
          hardwareAddress = _ref.hardwareAddress,
          manufacturer = _ref.manufacturer,
          deviceBuilderRef = _ref.deviceBuilderRef,
          model = _ref.model;

      if (_retailPaymentDevice.deviceManufacturer[manufacturer] === _retailPaymentDevice.deviceManufacturer.verifone) {
        this._providers[id] = new _verifonePaymentDevice["default"](id, _native, connectionType, hardwareAddress);
      }

      if (_retailPaymentDevice.deviceManufacturer[manufacturer] === _retailPaymentDevice.deviceManufacturer.miura) {
        this._providers[id] = new _miuraEmv["default"](id, _native, {
          display: deviceBuilderRef.display,
          getFirmwareUpdates: deviceBuilderRef.getFirmwareUpdates,
          getRemoteCardReaderKeys: deviceBuilderRef.getRemoteCardReaderKeys,
          getMerchant: deviceBuilderRef.getMerchant
        }, connectionType, hardwareAddress);
      }

      if (_retailPaymentDevice.deviceManufacturer[manufacturer] === _retailPaymentDevice.deviceManufacturer.roam) {
        this._providers[id] = new _RoamSwiperDevice["default"](id, _native, {
          display: deviceBuilderRef.display,
          getMerchant: deviceBuilderRef.getMerchant
        }, connectionType);
      }

      if (_retailPaymentDevice.deviceManufacturer[manufacturer] === _retailPaymentDevice.deviceManufacturer.ingenico) {
        // TODO See if we can consolidate getSwUpdateUrl and getConfigUrl when we implement Sw Update for Ingenico
        var params = {
          display: deviceBuilderRef.display,
          getFirmwareUpdates: deviceBuilderRef.getFirmwareUpdates,
          getMerchant: deviceBuilderRef.getMerchant
        };

        if (model.toUpperCase() === 'MOBY3000') {
          // Any Moby 3000 related params could be added here
          params.model = _retailPaymentDevice.ReaderModel.Moby3000;
        } else if (model.toUpperCase() === 'RP450') {
          // Any RP 450 related params could be added here
          params.contactlessEnabled = true;
          params.model = _retailPaymentDevice.ReaderModel.RP450;
        }

        this._providers[id] = new _IngenicoDevice["default"](id, _native, params, connectionType, hardwareAddress, 2500);
      }

      return this._providers[id];
    }
  }, {
    key: "getProviderByName",
    value: function getProviderByName(name) {
      return this.deviceProviderModule[this.getReaderModel(name).model];
    }
  }, {
    key: "getReaderModel",
    value: function getReaderModel() {
      var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
      return (0, _pipe["default"])(isVerifoneRecognizable, isE285Recognizable, isP400Recognizable, isM010Recognizable, isSwiperRecognizable, isMobyRecognizable, isRP450Recognizable)({
        name: name,
        model: _retailPaymentDevice.ReaderModel.Unknown
      });
    }
  }, {
    key: "getManufacturerName",
    value: function getManufacturerName(enumInt) {
      return _retailPaymentDevice.deviceManufacturer.keyFromValue[enumInt];
    }
  }, {
    key: "provider",
    value: function provider(name) {
      return this._providers[name];
    }
  }, {
    key: "providers",
    value: function providers() {
      return (0, _values["default"])(this._providers);
    }
  }]);
  return DeviceProviders;
}();

var deviceProviders = new DeviceProviders();
var _default = deviceProviders;
exports["default"] = _default;

},{"../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../ingenico-emv/IngenicoDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/IngenicoDevice.js","./RoamSwiperDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/RoamSwiperDevice.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/object/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/values.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/miura-emv":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","@paypalcorp/verifone-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/index.js","core-js/modules/es.object.values.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.values.js","ramda/src/pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceScanner.js":[function(require,module,exports){
"use strict";

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.exec.js");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-timeout"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _events = require("events");

var _retailSDKUtil = require("../common/retailSDKUtil");

var _saveReader = require("../common/saveReader");

var _DeviceConnector = _interopRequireDefault(require("./DeviceConnector"));

var _DiscoveredCardReader = _interopRequireDefault(require("./DiscoveredCardReader"));

var _CardReaderScanAndDiscoverOptions = _interopRequireDefault(require("./CardReaderScanAndDiscoverOptions"));

var _sdkErrors = require("../common/sdkErrors");

var _ReaderConfiguration = _interopRequireDefault(require("./ReaderConfiguration"));

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context7;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context7 = Object.prototype.toString.call(o)).call(_context7, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty2(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context5, _context6;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context5 = ownKeys(Object(source), !0)).call(_context5, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context6 = ownKeys(Object(source))).call(_context6, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}

var Log = (0, _manticoreLog["default"])('DeviceScanner');
/**
 * DeviceScanner is responsible for searching the available devices and
 * managing the connected device
 * When user selects one, it emits the connected event.
 * When the connected device gets disconnected, it emits disconnected event.
 * At any given time, one device is connected from DeviceScanner
 * @class
 * @protected
 */

var DeviceScanner = /*#__PURE__*/function () {
  /**
   * Construct a new DeviceScanner
   */
  function DeviceScanner(nativeInterface) {
    var _this = this;

    (0, _classCallCheck2["default"])(this, DeviceScanner);
    this["native"] = nativeInterface;
    this._connectedPaymentDevice = null;
    this._readerConfiguration = new _ReaderConfiguration["default"]();
    this.opt = new _CardReaderScanAndDiscoverOptions["default"]();

    this._stopScanning = function (error) {
      return Log.warn('A scan has not started yet', {
        error: error
      });
    };

    this._nativeScanTimeout = 30000;

    _retailPaymentDevice.PaymentDevice.Events.on(_retailPaymentDevice.PaymentDevice.Event.deviceDiscovered, function (pd) {
      return _this.discovered(pd);
    });

    this._discoveredDevices = [];
    this._setDiscovered = new _set["default"]();
    this._setUnknownDiscovered = new _set["default"]();
    this._reportedAutoConnectLogs = new _set["default"]();

    this._getLastActiveReader();

    DeviceScanner.Events.emit(DeviceScanner.Event.constructor, this);
  }
  /**
   * @private
   * @param {PaymentDevice} pd An instance of PaymentDevice that has been discovered
   */


  (0, _createClass2["default"])(DeviceScanner, [{
    key: "discovered",
    value: function discovered(pd) {
      var _this$_readerConfigur,
          _this2 = this;

      Log.debug('newDeviceDiscoveredByDeviceScanner', {
        crId: pd.id,
        selectionInProgress: this._selectionInProgress,
        scanInProgress: this._scanInProgress,
        readerConfiguration: this._readerConfiguration,
        shouldAutoConnect: (_this$_readerConfigur = this._readerConfiguration) === null || _this$_readerConfigur === void 0 ? void 0 : _this$_readerConfigur.shouldAutoConnect()
      });
      pd.once(_retailPaymentDevice.PaymentDevice.Event.deviceRemoved, function (device) {
        return _this2._removedDevice(device);
      });
      pd.on(_retailPaymentDevice.PaymentDevice.Event.disconnected, function () {
        return _this2._disconnectedDevice(pd);
      });
      pd.on(_retailPaymentDevice.PaymentDevice.Event.connected, function () {
        return _this2._connectedDevice(pd);
      });

      if ((0, _retailSDKUtil.isRoamSwiper)(pd.id)) {
        var discoveredDevice = {
          id: pd.id,
          address: 'RoamSwiper',
          manufacturer: _retailPaymentDevice.deviceManufacturer.keyFromValue[_retailPaymentDevice.deviceManufacturer.roam],
          connectionType: _retailPaymentDevice.readerConnectionType.audioJack
        };

        if (this._connectedPaymentDevice) {
          // if already connected to a device, the swiper plugin triggers the MCR!
          Log.debug('Roam swiper plugged in. Triggering MCR.', {
            connectedDevice: this._connectedPaymentDevice
          });
          DeviceScanner.Events.emit(DeviceScanner.Event.launchMCR);
        } else if (this._selectionInProgress && this._scanInProgress && !this._readerConfiguration.shouldAutoConnect()) {
          Log.debug('Roam swiper just plugged during scan in Progress. This will update the MCR list');
          this.onDiscovered(_objectSpread(_objectSpread({}, discoveredDevice), {}, {
            isConnected: false
          }));
        } else {
          Log.debug(function () {
            return "connecting to ".concat(pd.id, " without searchAndConnectWithUI");
          });

          if (!_DeviceConnector["default"].isInProgress) {
            DeviceScanner.Events.emit(DeviceScanner.Event.connectToDiscoveredDevice, _objectSpread(_objectSpread({}, discoveredDevice), {}, {
              manufacturer: _retailPaymentDevice.deviceManufacturer.roam
            }));
          } else {
            Log.debug(function () {
              return "Due to in-progress connection prompt, NOT connecting to ".concat(pd.id);
            });
          }
        }
      }
    }
  }, {
    key: "connectedDevice",
    get: function get() {
      return this._connectedPaymentDevice;
    },
    set: function set(value) {
      throw new Error("The readOnly connectedPaymentDevice property cannot be written. ".concat(value, " was passed."));
    }
  }, {
    key: "_removedDevice",
    value: function _removedDevice(pd) {
      Log.info('deviceRemovedByDeviceScanner', {
        crId: pd === null || pd === void 0 ? void 0 : pd.id
      }); // For ingenico devices, removed happens before disconnected event.
      // Here the idea is that if we receive the 'removed' event before 'disconnected',
      // we handle it same way.

      this._disconnectedDevice(pd);
    }
  }, {
    key: "_disconnectedDevice",
    value: function _disconnectedDevice(pd) {
      this._isConnectedPaymentDeviceUpdating = false;

      if (pd && this._connectedPaymentDevice === pd) {
        Log.debug(function () {
          return "unsetting connected device '".concat(pd.id, "' to null");
        });
        this._connectedPaymentDevice = null;
        DeviceScanner.Events.emit(DeviceScanner.Event.disconnected, pd);
      } else {
        Log.debug(function () {
          return "the device '".concat(pd && pd.id, "' is not connected device anymore!");
        });
      }
    }
  }, {
    key: "_connectedDevice",
    value: function _connectedDevice(pd) {
      var _this3 = this;

      if (!this._connectedPaymentDevice) {
        this._setConnectedDevice(pd);

        return;
      }

      if (pd && this._connectedPaymentDevice !== pd) {
        Log.debug('Disconnecting the connected device:', {
          device: this._connectedPaymentDevice
        });

        this._connectedPaymentDevice.disconnect(function () {
          return _this3._setConnectedDevice(pd);
        });
      } else {
        Log.debug(function () {
          return "SAME device '".concat(pd && pd.id, "' connected!");
        });
      }
    }
  }, {
    key: "_setConnectedDevice",
    value: function _setConnectedDevice(pd) {
      this._connectedPaymentDevice = pd;
      Log.debug('Setting connected device', {
        device: pd
      });
      DeviceScanner.Events.emit(DeviceScanner.Event.connected, pd);

      this._saveAndEmitLastActiveReader(pd);
    }
    /**
     * Saves the First BT reader found, as last active reader
     */

  }, {
    key: "updateLastActiveIfBTPaired",
    value: function updateLastActiveIfBTPaired() {
      var _this4 = this;

      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      var isDeviceBT = function isDeviceBT(_ref) {
        var id = _ref.id;
        return !((0, _retailSDKUtil.getCardReaderModel)(id) === _retailPaymentDevice.ReaderModel.Unknown || (0, _retailSDKUtil.getCardReaderModel)(id) === _retailPaymentDevice.ReaderModel.Swiper);
      };

      var saveFirstBTDevice = function saveFirstBTDevice(readers) {
        var _readers$filter = (0, _filter["default"])(readers).call(readers, isDeviceBT),
            _readers$filter2 = (0, _slicedToArray2["default"])(_readers$filter, 1),
            firstBTDevice = _readers$filter2[0];

        if (firstBTDevice) {
          _this4._saveAndEmitLastActiveReader(firstBTDevice, cb);

          return true;
        }

        cb(undefined);
        return false;
      };

      saveFirstBTDevice(_retailPaymentDevice.PaymentDevice.devices) || this["native"].getBTList(saveFirstBTDevice); // eslint-disable-line babel/no-unused-expressions
    }
  }, {
    key: "_saveAndEmitLastActiveReader",
    value: function _saveAndEmitLastActiveReader(pd) {
      var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

      if ((pd === null || pd === void 0 ? void 0 : pd.manufacturer) !== _retailPaymentDevice.deviceManufacturer.roam) {
        (0, _saveReader.saveLastActiveReader)(pd, cb);
        DeviceScanner.Events.emit(DeviceScanner.Event.lastActiveReaderFound, pd.id);
      }
    }
  }, {
    key: "stopScanning",
    value: function stopScanning() {
      var error = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _sdkErrors.sdk.userCancelled;
      this.stopIssued = true;

      if (this._scanInProgress) {
        this._stopScanning(error);
      }
    }
  }, {
    key: "onDiscovered",
    value: function onDiscovered(device) {
      if (!device || !device.id || !device.address) {
        Log.warn('ReceivedEmptyArgsMessage');
        return;
      }

      Log.debug('ON Discovered args', {
        device: device,
        deviceDiscoverable: this._readerConfiguration.allows(device)
      });
      var id = device.id,
          address = device.address,
          manufacturer = device.manufacturer,
          connectionType = device.connectionType;

      if ((0, _retailSDKUtil.getCardReaderModel)(id) === _retailPaymentDevice.ReaderModel.Unknown) {
        if (!this._setUnknownDiscovered.has(id)) {
          Log.debug(function () {
            return "unknown device model discovered: ".concat(id);
          });

          this._setUnknownDiscovered.add(id);
        }

        return;
      }

      if (this._scanInProgress && this._selectionInProgress && this._readerConfiguration.allows(device)) {
        if (!this._setDiscovered.has(address)) {
          this._setDiscovered.add(address);

          this._discoveredDevices.push({
            id: id,
            address: address,
            manufacturer: _retailPaymentDevice.deviceManufacturer[manufacturer],
            connectionType: connectionType
          });

          var discoveredReader = new _DiscoveredCardReader["default"](id, !!device.isConnected);
          Log.debug('Emitting onCardReaderDiscovered event');
          this.opt.emit(_CardReaderScanAndDiscoverOptions["default"].Events.onCardReaderDiscovered, discoveredReader);
          Log.debug('onDiscovered conditions', {
            deviceId: id,
            deviceAddress: address,
            isScanning: this._scanInProgress,
            isSelecting: this._selectionInProgress,
            isAlreadyDiscovered: this._setDiscovered.has(address),
            manufacturer: manufacturer,
            readerModel: (0, _retailSDKUtil.getCardReaderModel)(id)
          });

          if (this._readerConfiguration.isPointingToOneReader() || this._readerConfiguration.shouldAutoConnect()) {
            // For searchAndConnectWithNoUI
            this._stopScanning();
          }
        }
      }
    }
    /**
     * @package
     * @param {ReaderConfiguration} readerConfig
     * @param {DeviceManager~connection} callback
     */

  }, {
    key: "searchAndConnect",
    value: function searchAndConnect(_ref2) {
      var _this$_connectedPayme,
          _this$_connectedPayme2,
          _this$_connectedPayme3,
          _this$_connectedPayme4,
          _this$_connectedPayme5,
          _this5 = this;

      var _ref2$readerConfig = _ref2.readerConfig,
          readerConfig = _ref2$readerConfig === void 0 ? new _ReaderConfiguration["default"]() : _ref2$readerConfig,
          callback = _ref2.callback;
      Log.info('searchAndConnect', {
        currentDevice: this._connectedPaymentDevice,
        readerConfig: readerConfig,
        cardPresented: (_this$_connectedPayme = this._connectedPaymentDevice) === null || _this$_connectedPayme === void 0 ? void 0 : _this$_connectedPayme.cardPresented,
        inProgress: this._searchAndConnectInProgress,
        cardReaderUpdating: (_this$_connectedPayme2 = this._connectedPaymentDevice) === null || _this$_connectedPayme2 === void 0 ? void 0 : _this$_connectedPayme2._isFirmwareUpdateInProgress
      });

      if ((_this$_connectedPayme3 = this._connectedPaymentDevice) !== null && _this$_connectedPayme3 !== void 0 && _this$_connectedPayme3._isFirmwareUpdateInProgress) {
        callback(_retailPaymentDevice.deviceError.swUpdateInProgress);
        return;
      }

      if ((_this$_connectedPayme4 = this._connectedPaymentDevice) !== null && _this$_connectedPayme4 !== void 0 && _this$_connectedPayme4.isConnected() && readerConfig.shouldAutoConnect()) {
        callback(_sdkErrors.sdk.readerAlreadyConnected);
        return;
      }

      if (this._searchAndConnectInProgress) {
        callback(_sdkErrors.sdk.selectionInProgress);
        return;
      }

      if ((_this$_connectedPayme5 = this._connectedPaymentDevice) !== null && _this$_connectedPayme5 !== void 0 && _this$_connectedPayme5.cardPresented) {
        callback(_retailPaymentDevice.deviceError.activeTransaction);
        return;
      }

      this.stopIssued = false;
      this._searchAndConnectCallback = callback;
      this._readerConfiguration = readerConfig; // If no readerConfiguration was passed or is not pointing to one reader and it is not an auto connect request

      if (!readerConfig.isPointingToOneReader() && !readerConfig.shouldAutoConnect()) {
        this._searchAndConnect();
      } else {
        this.searchAndConnectWithNoUI(function (error, readerConfiguration) {
          if (error) {
            _this5._invokeSearchAndConnectCallback(error);

            return;
          }

          if (readerConfiguration && !_this5.stopIssued) {
            var _context;

            _DeviceConnector["default"].createAndConnect(readerConfiguration, (0, _bind["default"])(_context = _this5._invokeSearchAndConnectCallback).call(_context, _this5));
          }
        });
      }
    }
  }, {
    key: "canStopScanningOnError",
    value: function canStopScanningOnError(error) {
      var _context2;

      return (0, _some["default"])(_context2 = [_sdkErrors.sdk.userCancelled, _sdkErrors.sdk.selectionInProgress, _sdkErrors.sdk.readerAlreadyConnected, _sdkErrors.sdk.stoppingAutoConnect]).call(_context2, function (_error) {
        return _error.equals(error);
      });
    }
  }, {
    key: "searchAndConnectWithNoUI",
    value: function searchAndConnectWithNoUI(callback) {
      var _this6 = this;

      this._searchAndConnectInProgress = true;
      this._selectionInProgress = true;
      this._discoveredDevices = [];

      this._setDiscovered.clear();

      this._stopScanning = this._startNativeScanUntilTimeout(function (err) {
        var _this6$_connectedPaym; // scan is complete


        Log.debug('UILess scan complete', {
          err: err,
          stopIssued: _this6.stopIssued,
          discoveredDeviceCount: _this6._discoveredDevices.length,
          isDeviceConnected: (_this6$_connectedPaym = _this6._connectedPaymentDevice) === null || _this6$_connectedPaym === void 0 ? void 0 : _this6$_connectedPaym.isConnected()
        });
        _this6._scanInProgress = false;
        _this6._selectionInProgress = false;

        if (_this6.canStopScanningOnError(err)) {
          callback(err);
        } else if (_this6._discoveredDevices.length <= 0) {
          // BT disabled error should crop up only when no devices were discovered as this error can still come up if the
          // audio reader is inserted with BT disabled.
          if (_sdkErrors.sdk.bluetoothDisabled.equals(err)) {
            callback(_sdkErrors.sdk.bluetoothDisabled);
          } else {
            callback(_sdkErrors.sdk.noReaderFound.withDevMessage("Error Code: ".concat((err === null || err === void 0 ? void 0 : err.code) || 'No reader found')));
          }
        } else if (_this6._discoveredDevices.length === 1) {
          var _this6$_discoveredDev = (0, _slicedToArray2["default"])(_this6._discoveredDevices, 1),
              _this6$_discoveredDev2 = _this6$_discoveredDev[0],
              id = _this6$_discoveredDev2.id,
              address = _this6$_discoveredDev2.address,
              manufacturer = _this6$_discoveredDev2.manufacturer;

          var newReaderConfig = _ReaderConfiguration["default"].forOne({
            name: id,
            address: address,
            manufacturer: manufacturer
          }).setAutoConnect(_this6._readerConfiguration.shouldAutoConnect());

          if (!_this6._connectedPaymentDevice) {
            callback(undefined, newReaderConfig);
          } else {
            _this6._connectedPaymentDevice.disconnect(function (_disconnectError) {
              return callback(_disconnectError, newReaderConfig);
            });
          }
        } else {
          // Because readerConfig now checks the discovered devices, this condition should never happen
          callback(_sdkErrors.sdk.multipleReaders);
        }
      });
    }
  }, {
    key: "_searchAndConnect",
    value: function _searchAndConnect() {
      var _this7 = this;

      this._searchAndConnectInProgress = true;
      this._selectionInProgress = true;
      this._discoveredDevices = [];

      this._setDiscovered.clear();

      var deviceConnectorOptions = _DeviceConnector["default"].assignDeviceConnectorOptionsStrings();

      var opt = new _CardReaderScanAndDiscoverOptions["default"]();
      this.opt = opt;

      opt.connectToCardReader = function (id) {
        var _this7$_connectedPaym;

        if (!_this7._selectionInProgress) {
          Log.warn('connectToCardReaderCalledForEvenThoughSelectionIsOVER!', {
            id: id
          });
          return;
        }

        Log.debug(function () {
          return "connectToCardReader called for ".concat(id);
        });
        var connectToReader;

        var _iterator = _createForOfIteratorHelper(_this7._discoveredDevices),
            _step;

        try {
          for (_iterator.s(); !(_step = _iterator.n()).done;) {
            var pd = _step.value;

            if (pd.id === id) {
              connectToReader = pd;
              Log.debug(function () {
                return "Found matching device ".concat(connectToReader.id, ". Will connect it");
              }); // eslint-disable-line no-loop-func
            }
          }
        } catch (err) {
          _iterator.e(err);
        } finally {
          _iterator.f();
        }

        Log.debug('ConnectToReader', {
          connectToReader: (0, _stringify["default"])(connectToReader, null, 4),
          connectedReader: (0, _stringify["default"])(_this7._connectedPaymentDevice, null, 4),
          id: id
        });

        if ( // If corresponding device to the selected id either has not been discovered OR is already connected
        (!connectToReader || ((_this7$_connectedPaym = _this7._connectedPaymentDevice) === null || _this7$_connectedPaym === void 0 ? void 0 : _this7$_connectedPaym.id) === id) && _this7._connectedPaymentDevice) {
          Log.debug('Emit connected:', {
            pd: _this7._connectedPaymentDevice
          });

          _this7._invokeSearchAndConnectCallback(undefined, _this7._connectedPaymentDevice);

          return;
        }

        if (!connectToReader) {
          _this7._selectionInProgress = true; // allow "try again" button after the failure

          _this7._stopScanning();

          _this7._invokeSearchAndConnectCallback(_sdkErrors.sdk.selectedReaderUnavailable);

          return;
        }

        var createAndConnect = function createAndConnect() {
          Log.debug(function () {
            return "connecting to ".concat(connectToReader.id);
          });
          var _connectToReader = connectToReader,
              name = _connectToReader.id,
              address = _connectToReader.address,
              manufacturer = _connectToReader.manufacturer,
              connectionType = _connectToReader.connectionType;
          _this7._connectionInProgress = connectToReader; // eslint-disable-next-line object-curly-newline

          var newReaderConfig = _ReaderConfiguration["default"].forOne({
            name: name,
            address: address,
            manufacturer: manufacturer,
            connectionType: connectionType
          });

          _DeviceConnector["default"].createAndConnect(newReaderConfig, function (errCreate, pd) {
            // setTimeout to ensure that we invoke this callback asynchronously if createAndConnect returns immediately
            _manticore["default"].setTimeout(function () {
              _this7._connectionInProgress = undefined;

              if (errCreate) {
                Log.debug('Error for card reader', {
                  newReaderConfig: newReaderConfig,
                  errCreate: errCreate
                });
                _this7._selectionInProgress = true; // allow "try again" button after the failure

                _this7._invokeSearchAndConnectCallback(errCreate, pd);

                return;
              }

              _this7._invokeSearchAndConnectCallback(null, pd);
            }, 0);
          });
        };

        if (!_this7._connectedPaymentDevice) {
          createAndConnect();
        } else if (_this7._connectedPaymentDevice.id !== connectToReader.id) {
          Log.debug('UI -> disconnecting the connected device', {
            connectedCR: _this7._connectedPaymentDevice
          });

          _this7._connectedPaymentDevice.disconnect(function () {
            return createAndConnect();
          });
        } else {
          Log.info('sameDeviceSelectedByUser', {
            crId: _this7._connectedPaymentDevice.id,
            isConnected: _this7._connectedPaymentDevice.isConnected()
          });

          var onConnected = function onConnected(err) {
            _this7._invokeSearchAndConnectCallback(err, _this7._connectedPaymentDevice);
          };

          if (_this7._connectedPaymentDevice.isConnected()) {
            onConnected(null);
          } else {
            _this7._connectedPaymentDevice.connect(function (errConnect) {
              return onConnected(errConnect);
            });
          }
        }

        if (_this7._scanInProgress) {
          if (connectToReader) {
            Log.debug(function () {
              return "stopping scanAndDiscover since the user selected ".concat(connectToReader.id);
            });
          }

          _this7._stopScanning();
        }

        _this7._selectionInProgress = false;
      };

      opt.onAddedObserver = function () {
        Log.debug('Native side added the observers so we can start scanning');
        _this7._stopScanning = _this7._startNativeScanUntilTimeout(function (err) {
          var _emitError; // scan is complete


          Log.debug('scan complete');
          var emitError = null;

          if (_this7._discoveredDevices.length <= 0) {
            emitError = _sdkErrors.sdk.noReaderFound;
          } // BT disabled error should crop up only when no devices were discovered as this error can still come up if the
          // audio reader is inserted with BT disabled.


          if (((_emitError = emitError) === null || _emitError === void 0 ? void 0 : _emitError.message) === _sdkErrors.sdk.noReaderFound.message && err) {
            if (!_this7._reportedAutoConnectLogs.has('scanningEndedWithError')) {
              Log.error('scanningEndedWithError', {
                error: (0, _stringify["default"])(err, null, 2)
              });

              _this7._reportedAutoConnectLogs.add('scanningEndedWithError');
            }

            if (_sdkErrors.sdk.bluetoothDisabled.equals(err)) {
              emitError = _sdkErrors.sdk.bluetoothDisabled;
            } else {
              emitError = err.code ? new Error(err.code) : new Error('error');
            }
          }

          _this7.opt.emit(_CardReaderScanAndDiscoverOptions["default"].Events.onScanComplete, emitError);
        });

        if (_this7._connectedPaymentDevice) {
          // first update UI about connected Card Reader
          Log.debug('Adding connected device to list: ', {
            connectedDevice: (0, _stringify["default"])(_this7._connectedPaymentDevice)
          });

          _this7.onDiscovered({
            id: _this7._connectedPaymentDevice.id,
            address: _this7._connectedPaymentDevice.address,
            manufacturer: _retailPaymentDevice.deviceManufacturer.keyFromValue[_this7._connectedPaymentDevice.manufacturer],
            connectionType: _this7._connectedPaymentDevice.connectionType,
            isConnected: true
          });
        }
      };

      Log.debug('Invoking searchAndConnectWithUI');

      _manticore["default"].scanAndDiscover(opt, deviceConnectorOptions, function (action) {
        if (action === 'cancel') {
          // Try canceling an in-progress connection
          if (_this7._connectionInProgress) {
            Log.debug('Attempting in-progress connection cancellation.', {
              crId: _this7._connectionInProgress.id,
              devicesDiscovered: _retailPaymentDevice.PaymentDevice.devices.length
            });

            var _iterator2 = _createForOfIteratorHelper(_retailPaymentDevice.PaymentDevice.devices),
                _step2;

            try {
              var _loop = function _loop() {
                var pd = _step2.value;

                if (pd.id === _this7._connectionInProgress.id) {
                  if (pd.manufacturer === _retailPaymentDevice.deviceManufacturer.ingenico) {
                    Log.debug(function () {
                      return "Will stop connection to ".concat(pd.id);
                    });
                    pd.disconnect(function () {
                      return Log.debug(function () {
                        return "Disconnected from ".concat(pd.id);
                      });
                    });
                  }
                }
              };

              for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
                _loop();
              }
            } catch (err) {
              _iterator2.e(err);
            } finally {
              _iterator2.f();
            }
          }

          _this7._invokeSearchAndConnectCallback(_retailPaymentDevice.deviceError.actionCancelled);

          if (_this7._scanInProgress) {
            Log.info('Cancelling scan and discover.');

            _this7._stopScanning();
          }

          _this7._selectionInProgress = false;
        } else if (action === 'scan') {
          _this7._searchAndConnect({
            callback: _this7._searchAndConnectCallback
          });
        } else if (action === 'bluetoothDisabled') {
          _this7._invokeSearchAndConnectCallback(_sdkErrors.sdk.bluetoothDisabled);
        } else {
          var _this7$_connectedPaym2, _this7$_connectedPaym3; // For action == 'done', the callback is called within connectToCardReader


          Log.debug('Discover and connect flow completed. SelectedDevice:', {
            crId: (_this7$_connectedPaym2 = _this7._connectedPaymentDevice) === null || _this7$_connectedPaym2 === void 0 ? void 0 : _this7$_connectedPaym2.id,
            firmwareUpdate: (_this7$_connectedPaym3 = _this7._connectedPaymentDevice) === null || _this7$_connectedPaym3 === void 0 ? void 0 : _this7$_connectedPaym3.isUpdateRequired()
          });
        }
      });
    }
  }, {
    key: "_invokeSearchAndConnectCallback",
    value: function _invokeSearchAndConnectCallback(error) {
      var _this8 = this;

      var pd = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
      this._searchAndConnectInProgress = false;

      this._emitConnected(error, pd);

      Log.info('searchAndConnect complete', {
        searchAndConnectCallback: !!this._searchAndConnectCallback
      });

      if (this._searchAndConnectCallback) {
        /*
         * Some searchAndConnect APIs are invoked again, on error, from within their result callbacks forming an infinite
         * loop. In this case when the native methods return immediately, the stack overflows after a few invocations.
         * To prevent the stack from overflowing the result callback is invoked in a separate thread.
         */
        (0, _setTimeout2["default"])(function () {
          _this8._searchAndConnectCallback(error, pd);
        }, 0);
      }
    }
  }, {
    key: "_emitConnected",
    value: function _emitConnected(err, pd) {
      var connectedReader;

      if (pd) {
        connectedReader = new _DiscoveredCardReader["default"](pd.id, !err);
      }

      var logMessage = "Emitting onConnectionStatus: ".concat((0, _stringify["default"])(connectedReader, null, 2));

      if (!this._reportedAutoConnectLogs.has(logMessage)) {
        Log.debug(logMessage);

        this._reportedAutoConnectLogs.add(logMessage);
      }

      this.opt.emit(_CardReaderScanAndDiscoverOptions["default"].Events.onConnectionStatus, err, connectedReader);
    }
  }, {
    key: "_getDeviceFromDiscoveredDeviceList",
    value: function _getDeviceFromDiscoveredDeviceList(name) {
      var _context3;

      return (0, _filter["default"])(_context3 = this._discoveredDevices).call(_context3, function (pd) {
        return pd.id === name;
      });
    }
  }, {
    key: "getPairedBluetoothDevices",
    value: function getPairedBluetoothDevices() {
      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      this["native"].getBTList(function (readers) {
        var _context4;

        return cb(readers === null || readers === void 0 ? void 0 : (0, _filter["default"])(_context4 = (0, _map["default"])(readers).call(readers, function (pd) {
          return _objectSpread(_objectSpread({}, pd), {}, {
            model: (0, _retailSDKUtil.getCardReaderModel)(pd.id)
          });
        })).call(_context4, function (pd) {
          return pd.model !== _retailPaymentDevice.ReaderModel.Unknown && pd.model !== _retailPaymentDevice.ReaderModel.Swiper;
        }));
      });
    }
  }, {
    key: "_startNativeScanUntilTimeout",
    value: function _startNativeScanUntilTimeout() {
      var _this9 = this;

      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._nativeScanTimeout;

      var _scanning;

      this._scanInProgress = true;

      var stopScanning = function stopScanning(error) {
        Log.debug('Stopping native scan', {
          error: error
        });

        if (_this9._scanInProgress) {
          _this9["native"].stop(error); // Stop can be called multiple times. It won't trigger the start's cb more than once.


          _this9._scanInProgress = false;
          clearTimeout(_scanning);
        }
      };

      _scanning = (0, _setTimeout2["default"])(stopScanning, timeout);
      /*
       * There are instances where the onDiscovered is called before the stopScanning can be returned from here.
       * Hence using setTimeout to make sure that return happens before the start.
       */

      (0, _setTimeout2["default"])(function () {
        return _this9["native"].start(_this9._readerConfiguration, cb);
      }, 5);
      return stopScanning;
    }
    /**
     * Get the name of last active reader
     */

  }, {
    key: "_getLastActiveReader",
    value: function _getLastActiveReader() {
      var _this10 = this;

      (0, _saveReader.getLastActiveReader)(function (lastActiveReader) {
        Log.info('LastActiveReader', {
          lastActiveReader: lastActiveReader
        });
        _this10._lastActiveReaderName = lastActiveReader === null || lastActiveReader === void 0 ? void 0 : lastActiveReader.id;
        DeviceScanner.Events.emit(DeviceScanner.Event.lastActiveReaderFound, _this10._lastActiveReaderName);
      });
    }
  }]);
  return DeviceScanner;
}();

exports["default"] = DeviceScanner;
DeviceScanner.Event = {
  constructor: 'constructor',
  connected: 'connected',
  disconnected: 'disconnected',
  lastActiveReaderFound: 'lastActiveReaderFound',
  launchMCR: 'launchMCR',
  connectToDiscoveredDevice: 'connectToDiscoveredDevice'
};
DeviceScanner.Events = new _events.EventEmitter();

},{"../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/saveReader":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/saveReader.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./CardReaderScanAndDiscoverOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/CardReaderScanAndDiscoverOptions.js","./DeviceConnector":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceConnector.js","./DiscoveredCardReader":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DiscoveredCardReader.js","./ReaderConfiguration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/ReaderConfiguration.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/core-js-stable/set-timeout":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceSelector.js":[function(require,module,exports){
"use strict";

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.exec.js");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _CardReaderDisplayController = _interopRequireDefault(require("./CardReaderDisplayController"));

var _displayPriority = _interopRequireDefault(require("./displayPriority"));

var _retailSDKUtil = require("../common/retailSDKUtil");

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context3;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context3 = Object.prototype.toString.call(o)).call(_context3, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Log = (0, _manticoreLog["default"])('DeviceSelector');
/**
 * DeviceSelector is responsible for deciding the device used in a transaction.
 * It tracks the 'deviceDiscovered' and 'deviceRemoved' events to make a decision
 * for the selected device. If more than 1 devices available, it prompts user to
 * decide it. It also provides an API 'selectDevice(id) to select the device
 * based on the id
 * Note that if any device is discovered during an active transaction, selection
 * will be postponed by the next event.
 * Note that If the selected device is removed and it has an active transaction,
 * it will postpone the selection to the next event.
 */

var DeviceSelector = /*#__PURE__*/function () {
  function DeviceSelector() {
    var _this = this;

    (0, _classCallCheck2["default"])(this, DeviceSelector);
    this._selectedPaymentDevice = null;

    _retailPaymentDevice.PaymentDevice.Events.on(_retailPaymentDevice.PaymentDevice.Event.deviceDiscovered, function (pd) {
      return _this.discovered(pd);
    });
  }

  (0, _createClass2["default"])(DeviceSelector, [{
    key: "selectedDevice",
    get: function get() {
      return this._selectedPaymentDevice;
    },
    set: function set(value) {
      throw new Error("The readOnly selectedPaymentDevice property cannot be written. ".concat(value, " was passed."));
    }
  }, {
    key: "_setSelectedDevice",
    value: function _setSelectedDevice(pd) {
      var _this$_selectedPaymen;

      Log.debug(function () {
        return "Setting selected device to '".concat(pd && pd.id, "'");
      });

      if ((_this$_selectedPaymen = this._selectedPaymentDevice) !== null && _this$_selectedPaymen !== void 0 && _this$_selectedPaymen.isConnected() && this._selectedPaymentDevice !== pd) {
        this._selectedPaymentDevice.abortTransaction();
      }

      this._selectedPaymentDevice = pd;

      if (pd) {
        _retailPaymentDevice.PaymentDevice.Events.emit(_retailPaymentDevice.PaymentDevice.Event.selected, pd);
      }
    }
  }, {
    key: "discovered",
    value: function discovered(pd) {
      var _this2 = this;

      Log.debug('newDeviceDiscoveredByDeviceSelector', {
        crId: pd.id
      });
      pd.once(_retailPaymentDevice.PaymentDevice.Event.deviceRemoved, function (device) {
        return _this2.removed(device);
      });
      pd.on(_retailPaymentDevice.PaymentDevice.Event.disconnected, function () {
        return _this2._startDeviceSelection();
      });
      pd.on(_retailPaymentDevice.PaymentDevice.Event.connected, function () {
        return _this2._startDeviceSelection();
      });
    }
  }, {
    key: "removed",
    value: function removed(pd) {
      Log.debug('newDeviceRemovedByDeviceSelector', {
        crId: pd.id
      });

      if (pd === this._selectedPaymentDevice && pd.cardPresented) {
        // Corner case: don't bother the current transaction.
        this._setSelectedDevice(null);

        Log.debug(function () {
          return "The selected device:".concat(pd.id, " having active transaction is removed!");
        });
        return;
      }

      if (!this._selectedPaymentDevice || pd === this._selectedPaymentDevice || this._selectionInProgress) {
        Log.debug('a new device removed and to be select new one -->>>>');

        this._promptForDeviceSelection();
      }
    }
  }, {
    key: "isConnectedToMiura",
    value: function isConnectedToMiura() {
      var _iterator = _createForOfIteratorHelper(_retailPaymentDevice.PaymentDevice.devices),
          _step;

      try {
        for (_iterator.s(); !(_step = _iterator.n()).done;) {
          var device = _step.value;

          if (device.manufacturer.toUpperCase() === _retailPaymentDevice.deviceManufacturer.miura) {
            return true;
          }
        }
      } catch (err) {
        _iterator.e(err);
      } finally {
        _iterator.f();
      }

      return false;
    }
  }, {
    key: "promptDevicesToSelect",
    value: function promptDevicesToSelect() {
      this._promptForDeviceSelection(function () {});
    }
  }, {
    key: "_startDeviceSelection",
    value: function _startDeviceSelection() {
      Log.debug('DeviceSelection started', {
        currentDevice: this._selectedPaymentDevice
      });

      if (!this._selectedPaymentDevice || // whenever it is null, go for selection step.
      !this._selectedPaymentDevice.cardPresented || !this._selectedPaymentDevice.isConnected()) {
        this._promptForDeviceSelection();
      } else {
        var _this$_selectedPaymen2, _this$_selectedPaymen3;

        this._setSelectedDevice(this._selectedPaymentDevice);

        Log.debug('WillNotPromptForDeviceSelectionDueToOneOfTheFollowingReasons', {
          alreadySelectedCR: !!this._selectedPaymentDevice,
          paymentInProgress: (_this$_selectedPaymen2 = this._selectedPaymentDevice) === null || _this$_selectedPaymen2 === void 0 ? void 0 : _this$_selectedPaymen2.cardPresented,
          isConnected: (_this$_selectedPaymen3 = this._selectedPaymentDevice) === null || _this$_selectedPaymen3 === void 0 ? void 0 : _this$_selectedPaymen3.isConnected()
        });
      }
    }
  }, {
    key: "selectDevice",
    value: function () {
      var _selectDevice = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(id) {
        var found, _iterator2, _step2, device;

        return _regenerator["default"].wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                if (id) {
                  _context.next = 4;
                  break;
                }

                _context.next = 3;
                return this._promptForDeviceSelection();

              case 3:
                return _context.abrupt("return");

              case 4:
                found = false;
                _iterator2 = _createForOfIteratorHelper(_retailPaymentDevice.PaymentDevice.devices);

                try {
                  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
                    device = _step2.value; // In case of MCR, call abort on the all other devices and update the display for each of them.

                    if (device.id === id && device.isConnected()) {
                      found = true;

                      this._setSelectedDevice(device);

                      this._selectedPaymentDevice.emit(_retailPaymentDevice.PaymentDevice.Event.selected, this._selectedPaymentDevice);

                      Log.debug('selectedDeviceWithId', {
                        crId: this._selectedPaymentDevice.id
                      });
                    } else {
                      device.abortTransaction();
                    }

                    this._displayReadyMsg();
                  }
                } catch (err) {
                  _iterator2.e(err);
                } finally {
                  _iterator2.f();
                }

                if (!found) {
                  Log.debug('NoDeviceFoundWithIdOrIsDisconnected', {
                    id: id
                  });
                }

              case 8:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function selectDevice(_x) {
        return _selectDevice.apply(this, arguments);
      }

      return selectDevice;
    }()
  }, {
    key: "_promptForDeviceSelection",
    value: function () {
      var _promptForDeviceSelection2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
        var _this3 = this;

        var connectedDevices, _iterator3, _step3, _loop;

        return _regenerator["default"].wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                Log.debug(function () {
                  return "total number of devices is  ".concat(_retailPaymentDevice.PaymentDevice.devices.length);
                });

                if (this.alert) {
                  this.alert.dismiss();
                }

                connectedDevices = [];
                _iterator3 = _createForOfIteratorHelper(_retailPaymentDevice.PaymentDevice.devices);

                try {
                  _loop = function _loop() {
                    var device = _step3.value;

                    if (device.isConnected()) {
                      Log.debug(function () {
                        return "connected device:".concat(device.id);
                      });
                      connectedDevices.push(device);
                    }
                  };

                  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
                    _loop();
                  }
                } catch (err) {
                  _iterator3.e(err);
                } finally {
                  _iterator3.f();
                }

                Log.debug(function () {
                  return "total number of connected devices is  ".concat(connectedDevices.length);
                });

                if (connectedDevices.length <= 0) {
                  this._setSelectedDevice(null);

                  Log.debug('NoDeviceIsSelectedSinceThereIsNoAvailableDevice');
                } else if (connectedDevices.length === 1) {
                  if (this._selectedPaymentDevice !== connectedDevices[0]) {
                    this._setSelectedDevice(connectedDevices[0]);

                    Log.debug('selectedDeviceSet', {
                      crId: this._selectedPaymentDevice.id
                    });

                    _manticore["default"].setTimeout(function () {
                      if (_this3._selectedPaymentDevice) {
                        _this3._selectedPaymentDevice.emit(_retailPaymentDevice.PaymentDevice.Event.selected);
                      }
                    }, 0);

                    this._displayReadyMsg();
                  } else {
                    Log.debug('SameDeviceSelectedByDefault', {
                      crId: this._selectedPaymentDevice.id
                    });

                    this._setSelectedDevice(this._selectedPaymentDevice);
                  }
                } else if (connectedDevices.length > 1) {
                  Log.error('moreThanOneConnectedDevicesNotAllowed', {
                    deviceCount: connectedDevices.length
                  });
                }

              case 7:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function _promptForDeviceSelection() {
        return _promptForDeviceSelection2.apply(this, arguments);
      }

      return _promptForDeviceSelection;
    }()
  }, {
    key: "_displayReadyMsg",
    value: function _displayReadyMsg() {
      var _iterator4 = _createForOfIteratorHelper(_retailPaymentDevice.PaymentDevice.devices),
          _step4;

      try {
        for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
          var device = _step4.value;

          if (device.model === _retailPaymentDevice.ReaderModel.M010) {
            var displayParams = {
              id: _retailPaymentDevice.PaymentDevice.Message.NotReady,
              displaySystemIcons: true
            };

            if (device !== this._selectedPaymentDevice) {
              device.display(displayParams);
            } else {
              var _getDeviceErrorWithId = (0, _retailSDKUtil.getDeviceErrorWithId)(device),
                  opt = _getDeviceErrorWithId.opt;

              _CardReaderDisplayController["default"].display(_displayPriority["default"].low, device, opt);
            }
          }
        }
      } catch (err) {
        _iterator4.e(err);
      } finally {
        _iterator4.f();
      }
    }
  }]);
  return DeviceSelector;
}();

var deviceSelector = new DeviceSelector();
var _default = deviceSelector;
exports["default"] = _default;

},{"../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","./CardReaderDisplayController":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/CardReaderDisplayController.js","./displayPriority":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/displayPriority.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DiscoveredCardReader.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _retailSDKUtil = require("../common/retailSDKUtil");
/**
 * DiscoveredCardReader class contains the device info discovered from DeviceScanner to be shown on the UI
 * @class
 * @property {string} readerId Card reader name as it shows up in the bluetooth settings page
 * @property {string} readerDescription Card reader description
 * @property {string} readerImgId Image identifier
 * @property {bool} isConnected status of the device
 */


var DiscoveredCardReader = /*#__PURE__*/function () {
  /**
   * @constructor
   */
  function DiscoveredCardReader(id, isConnected) {
    (0, _classCallCheck2["default"])(this, DiscoveredCardReader);
    this.isConnected = isConnected;
    this.readerId = id;
    this.readerDescription = (0, _retailSDKUtil.getCardReaderDescription)(id);
    this.readerImgId = (0, _retailSDKUtil.getCardReaderIcon)(id);
  }

  (0, _createClass2["default"])(DiscoveredCardReader, [{
    key: "toJSON",
    value: function toJSON() {
      return {
        isConnected: this.isConnected,
        readerId: this.readerId,
        readerDescription: this.readerDescription,
        readerImgId: this.readerImgId
      };
    }
  }, {
    key: "toString",
    value: function toString() {
      return "DiscoveredCardReader: ".concat((0, _stringify["default"])(this, null, '\t'));
    }
  }]);
  return DiscoveredCardReader;
}();

exports["default"] = DiscoveredCardReader;

},{"../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/MagtekRawUsbReaderDevice.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('paymentDevice.magtekRawUsbReaderDevice');

function getMagnetPrint(swipe, buf) {
  swipe.magneprint = {
    status: (0, _slice["default"])(buf).call(buf, 344, 347).toString('hex'),
    length: buf[348]
  };

  if (swipe.magneprint.length) {
    swipe.magneprint.data = (0, _slice["default"])(buf).call(buf, 349, 349 + swipe.magneprint.length).toString('hex');
  }
}

function getTracks(swipe, buf) {
  var track1ok = (buf[0] & 0x1) === 0;
  var track2ok = (buf[1] & 0x1) === 0;
  var track3ok = (buf[2] & 0x1) === 0;
  var track1length = buf[3];
  var track2length = buf[4];
  var track3length = buf[5];

  if (track1ok && track1length) {
    swipe.track1 = (0, _slice["default"])(buf).call(buf, 7, 7 + track1length).toString('hex');
  }

  if (track2ok && track2length) {
    swipe.track2 = (0, _slice["default"])(buf).call(buf, 119, 119 + track2length).toString('hex');
  }

  if (track3ok && track3length) {
    swipe.track3 = (0, _slice["default"])(buf).call(buf, 231, 231 + track3length).toString('hex');
  }
}

function magtekVersion1(swipe, buf) {
  // http://www.magtek.com/documentation/public/99875338-3.01.pdf
  swipe.counter = (0, _slice["default"])(buf).call(buf, 493, 500).toString('hex');
  swipe.crypto = {
    enabled: (buf[501] & 0x1) === 0x1,
    keyInjected: (buf[501] & 0x2) === 0x2
  };

  if (buf[501] & 0x4) {
    swipe.crypto.keysExhausted = true;
    Log.error('DUKPTKeysExhaustedOnMagtekReader.');
  }

  swipe.ksn = (0, _slice["default"])(buf).call(buf, 555, 565).toString('hex');
}

function magtekVersion2(swipe, buf) {
  // http://www.magtek.com/documentation/public/99875474-10.01.pdf, except it's not up
  swipe.counter = (0, _slice["default"])(buf).call(buf, 856, 858).toString('hex');
  swipe.crypto = {
    enabled: (buf[494] & 0x4) === 0x4,
    keyInjected: (buf[494] & 0x2) === 0x2
  };

  if (buf[494] & 0x1) {
    swipe.crypto.keysExhausted = true;
    Log.error('DUKPTKeysExhaustedOnMagtekReader');
  }

  swipe.ksn = (0, _slice["default"])(buf).call(buf, 495, 505).toString('hex');
  swipe.counter = (0, _slice["default"])(buf).call(buf, 856, 858).toString('hex');
  var maskedLen = buf[505];

  if (maskedLen) {
    swipe.track1masked = (0, _slice["default"])(buf).call(buf, 508, 508 + maskedLen).toString('ascii');
  }

  maskedLen = buf[506]; // eslint-disable-line prefer-destructuring

  if (maskedLen) {
    swipe.track2masked = (0, _slice["default"])(buf).call(buf, 620, 620 + maskedLen).toString('ascii');
  }

  maskedLen = buf[507]; // eslint-disable-line prefer-destructuring

  if (maskedLen) {
    swipe.track3masked = (0, _slice["default"])(buf).call(buf, 732, 732 + maskedLen).toString('ascii');
  }
}
/**
 * Specialization of card reader that does its own interpretation of USB data
 */


var MagtekRawUsbReaderDevice = /*#__PURE__*/function (_MagneticReaderDevice) {
  (0, _inherits2["default"])(MagtekRawUsbReaderDevice, _MagneticReaderDevice);

  var _super = _createSuper(MagtekRawUsbReaderDevice);

  function MagtekRawUsbReaderDevice(uniqueName, _native) {
    var _this;

    (0, _classCallCheck2["default"])(this, MagtekRawUsbReaderDevice);
    _this = _super.call(this, uniqueName, _native);
    _this.manufacturer = 'Magtek';
    return _this;
  }

  (0, _createClass2["default"])(MagtekRawUsbReaderDevice, [{
    key: "received",
    value: function received(event) {
      try {
        var buf = Buffer.from(event, 'base64');

        if (buf.length < 565) {
          Log.error('InvalidMagTekDataLength', {
            length: buf.length
          });
          return;
        }

        var card = new _retailPaymentDevice.MagneticCard();
        card.formFactor = _retailPaymentDevice.FormFactor.MagneticCardSwipe;
        card.reader = this;
        getTracks(card, buf);
        getMagnetPrint(card, buf);

        if (this.productId === 0x0E || buf.length === 565) {
          magtekVersion1(card, buf);
        } else if (this.productId === 0x11 || buf.length === 887) {
          magtekVersion2(card, buf);
        }

        if (!this.serialNumber && card.ksn) {
          // Magtek serial is first 14 of ksn. For some reason this doesn't match serial
          // reported in the packet.
          this.serialNumber = card.ksn.substring(0, 14);
        }

        (0, _get2["default"])((0, _getPrototypeOf2["default"])(MagtekRawUsbReaderDevice.prototype), "received", this).call(this, card);
      } catch (x) {
        Log.error('MagTekCardEventFailedToParse', {
          msg: x.message,
          stack: x.stack
        });
      }
    }
  }]);
  return MagtekRawUsbReaderDevice;
}(_retailPaymentDevice.MagneticReaderDevice);

exports["default"] = MagtekRawUsbReaderDevice;

}).call(this)}).call(this,require("buffer").Buffer)
},{"@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/ReaderConfiguration.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _every = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/every"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

function unEqualTo(value) {
  return function (_value) {
    return _value !== value;
  };
}

function equalTo(value) {
  return function (_value) {
    return _value === value;
  };
}

function addOnce(array, value) {
  if (value !== null && value !== undefined && !(0, _some["default"])(array).call(array, equalTo(value))) {
    array.push(value);
  }

  return array;
}

function arrayToString() {
  var array = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  return "[".concat(array.join(','), "]");
}
/**
 * @class
 * @property {[string]} name
 * @property {[string]} address
 * @property {[deviceManufacturer]} manufacturer
 * @property {[readerConnectionType]} connectionType
 * @property {[string]} manufacturerName @readonly
 * @property {[string]} connectionTypeValue @readonly
 */


var ReaderConfiguration = /*#__PURE__*/function () {
  /**
   * @constructor
   * @param {[deviceManufacturer]} manufacturer
   */
  function ReaderConfiguration() {
    var manufacturers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
    (0, _classCallCheck2["default"])(this, ReaderConfiguration);
    this._names = [''];
    this._addresses = [''];
    this._connectionTypes = [_retailPaymentDevice.readerConnectionType.unknown];
    this._manufacturers = [];
    this.manufacturer = manufacturers;
    this.autoConnect = false;
  }

  (0, _createClass2["default"])(ReaderConfiguration, [{
    key: "manufacturer",
    get: function get() {
      return this._manufacturers;
    },
    set: function set(manufacturers) {
      var _this = this;

      if (manufacturers && (0, _isArray["default"])(manufacturers)) {
        (0, _forEach["default"])(manufacturers).call(manufacturers, function (manufacturer) {
          return _this.addManufacturer(manufacturer);
        });
      }
    }
  }, {
    key: "connectionType",
    get: function get() {
      return this._connectionTypes;
    },
    set: function set(connectionTypes) {
      var _this2 = this;

      if (connectionTypes && (0, _isArray["default"])(connectionTypes)) {
        (0, _forEach["default"])(connectionTypes).call(connectionTypes, function (connectionType) {
          return _this2.addConnectionType(connectionType);
        });
      }
    }
  }, {
    key: "name",
    get: function get() {
      return this._names;
    },
    set: function set(names) {
      var _this3 = this;

      if (names && (0, _isArray["default"])(names)) {
        (0, _forEach["default"])(names).call(names, function (name) {
          return _this3.addName(name);
        });
      }
    }
  }, {
    key: "address",
    get: function get() {
      return this._addresses;
    },
    set: function set(addresses) {
      var _this4 = this;

      if (addresses && (0, _isArray["default"])(addresses)) {
        (0, _forEach["default"])(addresses).call(addresses, function (address) {
          return _this4.addAddress(address);
        });
      }
    }
  }, {
    key: "manufacturerName",
    get: function get() {
      var _context;

      return (0, _map["default"])(_context = this.manufacturer).call(_context, function (value) {
        return value !== null && value !== undefined ? _retailPaymentDevice.deviceManufacturer.keyFromValue[value] : '';
      });
    }
  }, {
    key: "connectionTypeValue",
    get: function get() {
      var _context2;

      return (0, _map["default"])(_context2 = this.connectionType).call(_context2, function (value) {
        return value !== null && value !== undefined ? _retailPaymentDevice.readerConnectionType.keyFromValue[value] : _retailPaymentDevice.readerConnectionType.keyFromValue[_retailPaymentDevice.readerConnectionType.unknown];
      });
    }
  }, {
    key: "isPointingToOneReader",
    value: function isPointingToOneReader() {
      var _this$connectionType, _this$connectionType2, _this$connectionType3, _this$address, _this$connectionType4, _this$name;

      return ((_this$connectionType = this.connectionType) === null || _this$connectionType === void 0 ? void 0 : (0, _includes["default"])(_this$connectionType).call(_this$connectionType, _retailPaymentDevice.readerConnectionType.usb)) || ((_this$connectionType2 = this.connectionType) === null || _this$connectionType2 === void 0 ? void 0 : (0, _includes["default"])(_this$connectionType2).call(_this$connectionType2, _retailPaymentDevice.readerConnectionType.audioJack)) || // For network the search is done based on IP address, the name will be ignored
      ((_this$connectionType3 = this.connectionType) === null || _this$connectionType3 === void 0 ? void 0 : (0, _includes["default"])(_this$connectionType3).call(_this$connectionType3, _retailPaymentDevice.readerConnectionType.network)) && ((_this$address = this.address) === null || _this$address === void 0 ? void 0 : _this$address.length) === 1 && this.address[0] || // For bluetooth the search is done based on names, the address field will be ignored
      ((_this$connectionType4 = this.connectionType) === null || _this$connectionType4 === void 0 ? void 0 : (0, _includes["default"])(_this$connectionType4).call(_this$connectionType4, _retailPaymentDevice.readerConnectionType.bluetooth)) && ((_this$name = this.name) === null || _this$name === void 0 ? void 0 : _this$name.length) === 1 && this.name[0];
    }
    /**
     * @package
     * @param {deviceManufacturer} manufacturer
     * @returns {ReaderConfiguration}
     */

  }, {
    key: "addManufacturer",
    value: function addManufacturer(manufacturer) {
      addOnce(this.manufacturer, manufacturer);
      return this;
    }
    /**
     * @package
     * @param {deviceManufacturer} manufacturer
     * @returns {ReaderConfiguration}
     */

  }, {
    key: "removeManufacturer",
    value: function removeManufacturer(manufacturer) {
      var _context3;

      this._manufacturers = (0, _filter["default"])(_context3 = this.manufacturer).call(_context3, unEqualTo(manufacturer));
      return this;
    }
    /**
     * @package
     * @param {readerConnectionType} connectionType
     * @returns {ReaderConfiguration}
     */

  }, {
    key: "addConnectionType",
    value: function addConnectionType(connectionType) {
      addOnce(this.connectionType, connectionType);

      if (this.connectionType.length > 1) {
        this.removeConnectionType(_retailPaymentDevice.readerConnectionType.unknown);
      }

      return this;
    }
    /**
     * @package
     * @param {readerConnectionType} connectionType
     * @returns {ReaderConfiguration}
     */

  }, {
    key: "removeConnectionType",
    value: function removeConnectionType(connectionType) {
      var _context4;

      this._connectionTypes = (0, _filter["default"])(_context4 = this.connectionType).call(_context4, unEqualTo(connectionType));

      if (this.connectionType.length === 0) {
        this.addConnectionType(_retailPaymentDevice.readerConnectionType.unknown);
      }

      return this;
    }
    /**
     * @package
     * @param {string} name
     * @returns {ReaderConfiguration}
     */

  }, {
    key: "addName",
    value: function addName(name) {
      // With a name we should be able to determine the manufacturer of the reader.
      addOnce(this.name, name);

      if (this.name.length > 1) {
        this.removeName('');
      }

      return this;
    }
    /**
     * @package
     * @param {string} name
     * @returns {ReaderConfiguration}
     */

  }, {
    key: "removeName",
    value: function removeName(name) {
      var _context5;

      this._names = (0, _filter["default"])(_context5 = this.name).call(_context5, unEqualTo(name));

      if (this.name.length === 0) {
        this.addName('');
      }

      return this;
    }
    /**
     * @package
     * @param {string} address
     * @returns {ReaderConfiguration}
     */

  }, {
    key: "addAddress",
    value: function addAddress(address) {
      addOnce(this.address, address);

      if (this.address.length > 1) {
        this.removeAddress('');
      }

      return this;
    }
    /**
     * @package
     * @param {string} address
     * @returns {ReaderConfiguration}
     */

  }, {
    key: "removeAddress",
    value: function removeAddress(address) {
      var _context6;

      this._addresses = (0, _filter["default"])(_context6 = this.address).call(_context6, unEqualTo(address));

      if (this.address.length === 0) {
        this.addAddress('');
      }

      return this;
    }
    /**
     * Method to set auto-connect
     * @param {bool} value
     * @returns {ReaderConfiguration}
     */

  }, {
    key: "setAutoConnect",
    value: function setAutoConnect(value) {
      this.autoConnect = value;
      return this;
    }
  }, {
    key: "shouldAutoConnect",
    value: function shouldAutoConnect() {
      return this.autoConnect;
    }
  }, {
    key: "pointsToSpecificName",
    value: function pointsToSpecificName() {
      var _context7;

      return !(0, _includes["default"])(_context7 = this.name).call(_context7, '');
    }
  }, {
    key: "pointsToSpecificAddress",
    value: function pointsToSpecificAddress() {
      var _context8;

      return !(0, _includes["default"])(_context8 = this.address).call(_context8, '');
    }
  }, {
    key: "pointsToSpecificConnectionType",
    value: function pointsToSpecificConnectionType() {
      var _context9;

      return !(0, _includes["default"])(_context9 = this.connectionType).call(_context9, _retailPaymentDevice.readerConnectionType.unknown);
    }
  }, {
    key: "pointsToSpecificDeviceManufacturer",
    value: function pointsToSpecificDeviceManufacturer() {
      return this.manufacturer.length !== 0;
    }
    /**
     * @package
     * @param {{ id: string, address: string, manufacturer: string, connectionType: readerConnectionType }} discoveredDevice
     * @returns {boolean}
     */

  }, {
    key: "allows",
    value: function allows(discoveredDevice) {
      var _context10, _context11, _context12, _context13, _context14; // Native must send an object with all keys populated


      var _manufacturer = _retailPaymentDevice.deviceManufacturer[discoveredDevice.manufacturer];

      if (_manufacturer === undefined) {
        return false;
      }

      return (0, _every["default"])(_context10 = [[(0, _includes["default"])(_context11 = this.name).call(_context11, discoveredDevice.id), this.pointsToSpecificName()], [(0, _includes["default"])(_context12 = this.address).call(_context12, discoveredDevice.address), this.pointsToSpecificAddress()], [(0, _includes["default"])(_context13 = this.connectionType).call(_context13, discoveredDevice.connectionType), this.pointsToSpecificConnectionType()], [(0, _includes["default"])(_context14 = this.manufacturer).call(_context14, _manufacturer), this.pointsToSpecificDeviceManufacturer()]]).call(_context10, function (_ref) {
        var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
            x0 = _ref2[0],
            x1 = _ref2[1];

        return x0 === x1;
      });
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        name: arrayToString(this.name),
        address: arrayToString(this.address),
        manufacturerName: arrayToString(this.manufacturerName),
        connectionTypeValue: arrayToString(this.connectionTypeValue),
        shouldAutoConnect: this.autoConnect,
        isPointingToOneReader: this.isPointingToOneReader()
      };
    }
  }], [{
    key: "forOne",
    value: function forOne() {
      var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
          _ref3$id = _ref3.id,
          id = _ref3$id === void 0 ? '' : _ref3$id,
          _ref3$name = _ref3.name,
          name = _ref3$name === void 0 ? '' : _ref3$name,
          _ref3$address = _ref3.address,
          address = _ref3$address === void 0 ? '' : _ref3$address,
          manufacturer = _ref3.manufacturer,
          _ref3$connectionType = _ref3.connectionType,
          connectionType = _ref3$connectionType === void 0 ? _retailPaymentDevice.readerConnectionType.unknown : _ref3$connectionType;

      var readerConfiguration = new ReaderConfiguration().addName(name || id).addAddress(address).addManufacturer(manufacturer);

      if (connectionType !== _retailPaymentDevice.readerConnectionType.unknown) {
        readerConfiguration.addConnectionType(connectionType);
      }

      return readerConfiguration;
    }
  }]);
  return ReaderConfiguration;
}();

exports["default"] = ReaderConfiguration;

},{"@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/every":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/every.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/RoamSwiper/CardStatus.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var Log = (0, _manticoreLog["default"])('RoamSwiper.cardStatus');
/**
 * Contain the details of card events on the Roam swiper such as
 * swipe, etc.
 */

var CardStatus = /*#__PURE__*/function () {
  function CardStatus(cardResponse) {
    (0, _classCallCheck2["default"])(this, CardStatus);
    this.response = cardResponse;

    try {
      var secureData = this.response.secureData;
      this.track1 = secureData.track1;
      this.track2 = secureData.track2;
      this.ksn = secureData.ksn;
      this.type = secureData.type;
      this.lastFour = secureData.lastFour;
      this.firstFour = secureData.firstFour;
    } catch (err) {
      Log.error('RoamSwiperSecureDataJsonParseFail', {
        err: err
      });
    }
  }

  (0, _createClass2["default"])(CardStatus, [{
    key: "getPresentedCard",
    value: function getPresentedCard(reader) {
      var card = new _retailPaymentDevice.MagneticCard();
      var track = this.track1 || this.track2;
      card.formFactor = _retailPaymentDevice.FormFactor.MagneticCardSwipe;
      card.ksn = this.ksn ? this.ksn.toString('hex') : '';
      card.reader = reader;

      if (!track || !track.length) {
        Log.error('MissingTrackFromRoamCardSwipeData');
        card.failed = true;
        return card;
      }

      card.track1 = this.track1;
      card.track2 = this.track2;
      card.lastFourDigits = this.lastFour;
      card.firstFourDigits = this.firstFour;
      card.cardIssuer = this.response.CardIssuer;
      card.isSignatureRequired = false;

      if (this.response.IsSignatureRequired === 'true') {
        card.isSignatureRequired = true;
      }

      card.cardholderName = this.response.CardHolderName;
      return card;
    }
  }, {
    key: "toString",
    value: function toString() {
      var parts = [this.response.toString(), '\nChip flags ', this.chipFlags.toString(16), ' Magstripe flags ', this.magstripeFlags.toString(16)];

      if (this.ksn) {
        parts.push('\nKSN: ');
        parts.push(this.ksn.toString('hex'));
      }

      if (this.track1) {
        parts.push('\nTrack 1: ');
        parts.push(this.track1.toString('hex'));
      }

      if (this.track2) {
        parts.push('\nTrack 2: ');
        parts.push(this.track2.toString('hex'));
      }

      if (this.maskedTrack2) {
        parts.push('\nMasked Track 2: ');
        parts.push(this.maskedTrack2);
      }

      if (this.sredData) {
        parts.push('\nSRED: ');
        parts.push(this.sredData.toString('hex'));
      }

      return parts.join('');
    }
  }]);
  return CardStatus;
}();

exports["default"] = CardStatus;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/RoamSwiper/Parser.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.split.js");

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var Log = (0, _manticoreLog["default"])('RoamSwiper.Parser');
/**
 * Contain the details of card events on the Roam swiper such as
 * swipe, etc.
 */

var Parser = /*#__PURE__*/function () {
  function Parser() {
    (0, _classCallCheck2["default"])(this, Parser);
  }

  (0, _createClass2["default"])(Parser, [{
    key: "getCardInfo",
    value: function getCardInfo(rawData) {
      var cardInfo = {};

      try {
        var _context, _context2;

        var data = rawData.decodeData;
        var decodeData = Buffer.isBuffer(data) ? data : Buffer.from(data, 'base64');
        var decodeJsonData = JSON.parse(decodeData.toString('ascii'));
        cardInfo.secureData = {};
        cardInfo.secureData.track1 = rawData.track1;
        cardInfo.secureData.serial = decodeJsonData.ksn;
        cardInfo.secureData.ksn = decodeJsonData.ksn;
        cardInfo.secureData.type = 'ROAM';
        cardInfo.secureData.firstFour = null;
        cardInfo.secureData.lastFour = null;

        if (typeof decodeJsonData.maskedPAN === 'string' || decodeJsonData.maskedPAN instanceof String) {
          var len = decodeJsonData.maskedPAN.length;
          cardInfo.secureData.firstFour = decodeJsonData.maskedPAN.substring(0, 4);
          cardInfo.secureData.lastFour = decodeJsonData.maskedPAN.substring(len - 4, len);
          cardInfo.firstFour = cardInfo.secureData.firstFour;
          cardInfo.lastFour = cardInfo.secureData.lastFour;
        }

        cardInfo.CVV = null;
        cardInfo.ExpiryDate = null;
        cardInfo.PostalCode = null;
        cardInfo.IsSignatureRequired = false;
        cardInfo.WasPinRequired = false; // The cardholderName has the format : lastname/firstname

        var firstName = '';
        var lastName = '';

        if (decodeJsonData.cardholderName && (0, _indexOf["default"])(_context = decodeJsonData.cardholderName).call(_context, '/') > -1) {
          var name = decodeJsonData.cardholderName.split('/');

          var _name = (0, _slicedToArray2["default"])(name, 2);

          lastName = _name[0];
          firstName = _name[1];
        } else {
          firstName = decodeJsonData.cardholderName;
        }

        cardInfo.CardHolderName = (0, _concat["default"])(_context2 = "".concat(firstName, " ")).call(_context2, lastName);
        cardInfo.CardIssuer = _retailPaymentDevice.CardDataUtil.getCardIssuerFromCardNumber(cardInfo.firstFour);
        Log.debug('parsed cardInfo from raw data');
        Log.developer(function () {
          return "cardInfo : ".concat((0, _stringify["default"])(cardInfo, null, 2));
        });
      } catch (err) {
        Log.error('RoamSwiperParserError', {
          err: err
        });
      }

      return cardInfo;
    }
  }]);
  return Parser;
}();

exports["default"] = Parser;

}).call(this)}).call(this,require("buffer").Buffer)
},{"@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.split.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/RoamSwiperDevice.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _Parser = _interopRequireDefault(require("./RoamSwiper/Parser"));

var _CardStatus = _interopRequireDefault(require("./RoamSwiper/CardStatus"));

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('roamSwiperDevice');
/**
 * Represents a payment swiper device manufactured by Roam for PayPal
 * @class
 * @protected
 */

var RoamSwiperDevice = /*#__PURE__*/function (_PaymentDevice) {
  (0, _inherits2["default"])(RoamSwiperDevice, _PaymentDevice);

  var _super = _createSuper(RoamSwiperDevice);
  /**
   * Construct a new PaymentDevice given a native function capable of sending data to the device
   */


  function RoamSwiperDevice(uniqueId, nativeInterface, appInterface, connectionType) {
    var _this;

    var address = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'RoamSwiper';
    (0, _classCallCheck2["default"])(this, RoamSwiperDevice);
    _this = _super.call(this, uniqueId, nativeInterface, appInterface, connectionType, address);
    _this.manufacturer = _retailPaymentDevice.deviceManufacturer.roam;
    _this.model = _retailPaymentDevice.ReaderModel.Swiper;
    _this.parser = new _Parser["default"]();
    _this.type = _retailPaymentDevice.readerType.Magstripe;
    return _this;
  }

  (0, _createClass2["default"])(RoamSwiperDevice, [{
    key: "beginDeviceRemoved",
    value: function beginDeviceRemoved(callback) {
      this["native"].removed(callback);
    }
  }, {
    key: "beginDeviceConnect",
    value: function beginDeviceConnect(callback) {
      var _this2 = this;

      if (this["native"].isConnected()) {
        Log.debug(function () {
          return "Connect called, but ".concat(_this2.id, " is already connected.");
        });
        callback();
        return;
      }

      Log.debug(function () {
        return "Connecting to Roam swiper device ".concat(_this2.id);
      });
      this["native"].connect(function (error) {
        if (error) {
          callback(error);
          return;
        }

        callback();
      });
    }
  }, {
    key: "isBatteryInfoSupported",
    value: function isBatteryInfoSupported() {
      // Audio readers don't support battery info
      return false;
    }
  }, {
    key: "listenForCardRemoval",
    value: function listenForCardRemoval(callback) {
      callback();
    }
  }, {
    key: "beginDeviceDisconnect",
    value: function beginDeviceDisconnect(callback) {
      if (!this.isConnected()) {
        Log.debug('Device already disconnected. Will not attempt to invoke native.disconnect');

        if (callback) {
          callback(null);
        }

        return;
      }

      this["native"].disconnect(callback);
    }
  }, {
    key: "formFactors",
    get: function get() {
      return _retailPaymentDevice.FormFactor.MagneticCardSwipe;
    }
  }, {
    key: "receivedKsn",
    value: function receivedKsn(ksn) {
      Log.info('ReceivedKSNInformation', {
        crId: this.id,
        ksn: ksn
      });
      this.setCardReaderToMerchant(ksn);
    }
  }, {
    key: "received",
    value: function received(rawData) {
      try {
        var cardInfo = this.parser.getCardInfo(rawData);

        if (!this.serialNumber && cardInfo.secureData && cardInfo.secureData.ksn && cardInfo.secureData.ksn.length > 6) {
          // if serialNumber does not exist, update it here using ksn.
          this.serialNumber = cardInfo.secureData.ksn.substring(0, cardInfo.secureData.ksn.length - 6);
        }

        var card = new _CardStatus["default"](cardInfo).getPresentedCard(this);
        this.transactionActive = true;
        Log.debug(function () {
          return "RoamSwiper received ".concat(card);
        });
        this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.cardDataRead, _retailPaymentDevice.FormFactor.MagneticCardSwipe, {
          card: card
        });
      } catch (err) {
        Log.error('RoamSwiperReceivedErr', {
          err: err
        });
      }
    }
  }, {
    key: "send",
    value: function send(data, cb) {
      this["native"].send(data, cb);
    }
  }, {
    key: "display",
    value: function display(opt, callback) {
      if (!this.isConnected()) {
        if (callback) {
          callback(_retailPaymentDevice.deviceError.deviceNotConnected);
        }

        return;
      }

      if (callback) {
        callback();
      }
    }
  }, {
    key: "getFirmwareVersionInfo",
    value: function getFirmwareVersionInfo(callback) {
      Log.warn('firmwareVersionRoamSwiperNotKnown!');

      if (callback) {
        callback();
      }
    }
  }, {
    key: "activateForPayment",
    value: function activateForPayment(context) {
      Log.debug('activate roam swiper for payment');
      (0, _get2["default"])((0, _getPrototypeOf2["default"])(RoamSwiperDevice.prototype), "activateForPayment", this).call(this, context, [_retailPaymentDevice.FormFactor.MagneticCardSwipe]);
      this.send('listenForCardEvents', function (err) {
        if (err) {
          Log.error('registerForRoamKeyboardEventsFailed', {
            err: err.message
          });
        } else {
          Log.debug('Sent listenForCardEvents');
        }
      });
    }
  }, {
    key: "getBatteryInfo",
    value: function getBatteryInfo() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      callback(null, new _retailPaymentDevice.BatteryInfo(100, new Date(), _retailPaymentDevice.batteryStatus.unknown));
    }
  }, {
    key: "deactivateFormFactors",
    value: function deactivateFormFactors(formFactors, callback) {
      var _this3 = this;

      Log.debug(function () {
        var _context;

        return (0, _concat["default"])(_context = "Deactivating form factors [".concat(formFactors, "] on '")).call(_context, _this3.id, "'");
      });

      if (!formFactors || formFactors.length === 0) {
        if (callback) {
          callback();
        }

        return;
      }

      (0, _get2["default"])((0, _getPrototypeOf2["default"])(RoamSwiperDevice.prototype), "deactivateFormFactors", this).call(this, formFactors);
      var sFormFactors = new _set["default"](formFactors);

      if (sFormFactors.has(_retailPaymentDevice.FormFactor.MagneticCardSwipe)) {
        this.send('stopListeningForCardEvents', function (err) {
          if (err) {
            Log.error('RoamSwiperEventsListeningFailedToStop', {
              err: err.message
            });
          } else {
            Log.debug('Sent stopListeningForCardEvents');
          }

          if (callback) {
            callback(err);
          }
        });
        return;
      }

      Log.debug('Ignoring deactivate request as supported form factor not received');

      if (callback) {
        callback();
      }
    }
  }, {
    key: "abortTransaction",
    value: function abortTransaction(context, cb) {
      Log.info('TxAbortedSoDeactivatingDevice', {
        crId: this.id,
        cardPresented: this.cardPresented ? 'an active transaction.' : 'NO active transaction.'
      });
      (0, _get2["default"])((0, _getPrototypeOf2["default"])(RoamSwiperDevice.prototype), "abortTransaction", this).call(this, context);

      if (cb) {
        cb();
      }
    }
  }, {
    key: "completeTransaction",
    value: function completeTransaction(authCode, cb) {
      this.transactionActive = false;
      Log.debug(function () {
        return 'Roam swiper completeTransaction';
      });

      if (cb) {
        cb();
      }
    }
  }, {
    key: "postTransactionCleanup",
    value: function postTransactionCleanup(callback) {
      Log.debug(function () {
        return 'Roam swiper postTransactionCleanup';
      });

      if (callback) {
        callback();
      }
    }
  }]);
  return RoamSwiperDevice;
}(_retailPaymentDevice.PaymentDevice);

exports["default"] = RoamSwiperDevice;

},{"./RoamSwiper/CardStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/RoamSwiper/CardStatus.js","./RoamSwiper/Parser":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/RoamSwiper/Parser.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/displayPriority.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
/**
 * Display priority. Currently, the following three priorities are sufficient, but rework on the enum scheme if more
 * enum values are required
 * @type {{low: number, medium: number, high: number}}
 */

var displayPriority = {
  low: 1,
  medium: 2,
  high: 3
};
var _default = displayPriority;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/index.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _miuraEmv = _interopRequireDefault(require("@paypalcorp/miura-emv"));

var _DeviceBuilder = _interopRequireDefault(require("./DeviceBuilder"));

var _RoamSwiperDevice = _interopRequireDefault(require("./RoamSwiperDevice"));

var _DeviceScanner = _interopRequireDefault(require("./DeviceScanner"));

var _DiscoveredCardReader = _interopRequireDefault(require("./DiscoveredCardReader"));

var _CardReaderScanAndDiscoverOptions = _interopRequireDefault(require("./CardReaderScanAndDiscoverOptions"));

var _MagtekRawUsbReaderDevice = _interopRequireDefault(require("./MagtekRawUsbReaderDevice"));

var _ingenicoEmv = _interopRequireDefault(require("../ingenico-emv"));

var _ReaderConfiguration = _interopRequireDefault(require("./ReaderConfiguration"));

module.exports = {
  DeviceBuilder: _DeviceBuilder["default"],
  MiuraDevice: _miuraEmv["default"],
  MagtekRawUsbReaderDevice: _MagtekRawUsbReaderDevice["default"],
  ReaderConfiguration: _ReaderConfiguration["default"],
  RoamSwiperDevice: _RoamSwiperDevice["default"],
  IngenicoDevice: _ingenicoEmv["default"],
  DeviceScanner: _DeviceScanner["default"],
  DiscoveredCardReader: _DiscoveredCardReader["default"],
  CardReaderScanAndDiscoverOptions: _CardReaderScanAndDiscoverOptions["default"]
};

},{"../ingenico-emv":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/ingenico-emv/index.js","./CardReaderScanAndDiscoverOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/CardReaderScanAndDiscoverOptions.js","./DeviceBuilder":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceBuilder.js","./DeviceScanner":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceScanner.js","./DiscoveredCardReader":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DiscoveredCardReader.js","./MagtekRawUsbReaderDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/MagtekRawUsbReaderDevice.js","./ReaderConfiguration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/ReaderConfiguration.js","./RoamSwiperDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/RoamSwiperDevice.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/miura-emv":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/sdk.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.replace.js");

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _now = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/date/now"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _events = require("events");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticore = _interopRequireDefault(require("manticore"));

var _retailPageTracker = require("retail-page-tracker");

var _paypalrestManticore = require("@paypalcorp/paypalrest-manticore");

var _sdkErrors = require("./common/sdkErrors");

var _TransactionContext = _interopRequireDefault(require("./transaction/TransactionContext"));

var _Merchant = _interopRequireDefault(require("./common/Merchant"));

var _BraintreeManager = _interopRequireDefault(require("./common/BraintreeManager"));

var _MerchantManager = _interopRequireDefault(require("./common/MerchantManager"));

var _SimulationManager = _interopRequireDefault(require("./common/SimulationManager"));

var _PayPalErrorGenerator = _interopRequireDefault(require("./common/PayPalErrorGenerator"));

var Cal = _interopRequireWildcard(require("./common/cal"));

var _networkInterceptor = _interopRequireDefault(require("./common/NetworkHandler/networkInterceptor"));

var _DeviceSimulator = _interopRequireDefault(require("./simulator/devices/DeviceSimulator"));

var _DeviceManager = _interopRequireDefault(require("./transaction/DeviceManager"));

var _TransactionManager = _interopRequireDefault(require("./transaction/TransactionManager"));

var _UITheme = _interopRequireDefault(require("./common/UITheme"));

var _logLevel = _interopRequireDefault(require("./common/logLevel"));

var _package = _interopRequireDefault(require("../package.json"));

var _CardReaderDisplayController = _interopRequireDefault(require("./paymentDevice/CardReaderDisplayController"));

var _EventSink = require("./EventSink");

var _cachedLog = require("./common/cachedLog");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context17;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context17 = Object.prototype.toString.call(o)).call(_context17, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('sdk');
var publicKeyExists = false;
var ppPublicKey = '';

try {
  ppPublicKey = require('../ppPublicKey'); // eslint-disable-line global-require

  publicKeyExists = true;
} catch (e) {
  Log.error('PublicKeyFileNotFound');
  publicKeyExists = false;
}
/**
 * The PayPal Here SDK object is the main entry point for all SDK operations. Because we provide
 * native-specific versions of the highest level interface, this class is essentially used
 * as a helper for binding top level events (such as a new card reader) to the native partner objects.
 * @protected
 * @class
 * @property {ReceiptScreenOrientation} receiptScreenOrientation
 * @property {BraintreeManager} braintreeManager @readonly
 * @property {SimulationManager} simulationManager @readonly
 * @property {TransactionManager} transactionManager @readonly
 * @property {MerchantManager} merchantManager @readonly
 * @property {DeviceManager} deviceManager @readonly
 */


var SDK = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(SDK, _EventEmitter);

  var _super = _createSuper(SDK);

  function SDK() {
    var _this;

    (0, _classCallCheck2["default"])(this, SDK);
    _this = _super.call(this);

    _retailPageTracker.Tracker.events.on('pageViewed', function (err, page) {
      return _this.emit(SDK.Event.pageViewed, err, page);
    });

    _this.sdkObservableSubscription = _EventSink.paypalRestSDK$.subscribe({
      next: function next(event) {
        if (event === _paypalrestManticore.events.untrustedNetwork) {
          _this.emit(SDK.Event.untrustedNetwork, _sdkErrors.network.sslHandshakeFailed);
        }
      }
    });

    _this.certificatePinner();

    _this.validateNetwork();

    _this.braintreeManager = _BraintreeManager["default"];
    _this.simulationManager = _SimulationManager["default"];
    _this.transactionManager = _TransactionManager["default"];
    _this.merchantManager = _MerchantManager["default"];
    _this.deviceManager = _DeviceManager["default"];
    _this.payPalErrorGenerator = _PayPalErrorGenerator["default"];

    _this.setupConsoleLogging();

    _this.setupCalLogging();

    (0, _cachedLog.attachCachedLogger)();
    (0, _cachedLog.startCachedLogging)();
    return _this;
  }

  (0, _createClass2["default"])(SDK, [{
    key: "certificatePinner",
    value: function certificatePinner() {
      if (publicKeyExists) {
        try {
          _manticore["default"].certificatePinner(ppPublicKey.KEY_HASHES);
        } catch (err) {
          this.emit(SDK.Event.untrustedNetwork, err);
        }
      }
    }
  }, {
    key: "validateNetwork",
    value: function validateNetwork() {
      var _this2 = this;

      _manticore["default"].http({
        url: 'https://www.paypal.com'
      }, function (error, response) {
        if (error && error.code === _sdkErrors.network.sslHandshakeFailed.code) {
          _this2.emit(SDK.Event.untrustedNetwork, error);
        }

        Log.developer(function () {
          var _context;

          return (0, _concat["default"])(_context = "got these in the response ".concat(error, "\n")).call(_context, response);
        });
      });

      _manticore["default"].http({
        url: 'https://www.paypalobjects.com'
      }, function (error, response) {
        if (error && error.code === _sdkErrors.network.sslHandshakeFailed.code) {
          _this2.emit(SDK.Event.untrustedNetwork, error);
        }

        Log.developer(function () {
          var _context2;

          return (0, _concat["default"])(_context2 = "got these in the response ".concat(error, "\n")).call(_context2, response);
        });
      });
    }
  }, {
    key: "setupConsoleLogging",
    value: function setupConsoleLogging() {
      this._removeConsoleLogFn = _manticoreLog["default"].addLogger(function (level, component, message, extraData) {
        return _manticore["default"].log(level, component.name, message, extraData);
      });
    }
  }, {
    key: "error",
    value: function error(message) {
      return new Error(message);
    }
    /**
     * Log a message via the Javascript logging framework (called by native to get all the side benefits of JS logging, like CAL)
     * @param {string} level
     * @param {string} component
     * @param {string} message
     * @param {object} extraData
     */

  }, {
    key: "logViaJs",
    value: function logViaJs(level, component, message, extraData) {
      // eslint-disable-line no-unused-vars
      try {
        (0, _manticoreLog["default"])(component)[level](message, extraData);
      } catch (x) {
        Log.debug(function () {
          var _context3, _context4, _context5;

          return (0, _concat["default"])(_context3 = (0, _concat["default"])(_context4 = (0, _concat["default"])(_context5 = "Failed to log native message: ".concat(level, " ")).call(_context5, component, " ")).call(_context4, message, " ")).call(_context3, (0, _stringify["default"])(extraData, null, 2));
        });
      }
    }
    /**
     * set the UI theme
     * @param {UITheme} theme of the sdk native component
     */

  }, {
    key: "setUITheme",
    value: function setUITheme(theme) {
      this.UITheme = theme;
    }
    /**
     * get the UI theme
     * @returns {UITheme} theme
     */

  }, {
    key: "getUITheme",
    value: function getUITheme() {
      return typeof this.UITheme === 'undefined' ? _UITheme["default"].blue : this.UITheme;
    }
  }, {
    key: "_flushLogs",
    value: function _flushLogs() {
      if (_Merchant["default"].active && !this.transactionManager.getOfflinePaymentEnabled()) {
        var _context6;

        Cal.flush((0, _bind["default"])(_context6 = this._calFlushCallback).call(_context6, this));
      } else if (typeof this._flushLogs === 'function') {
        var _context7;

        _manticore["default"].setTimeout((0, _bind["default"])(_context7 = this._flushLogs).call(_context7, this), 10 * 1000);
      }
    }
  }, {
    key: "_calFlushCallback",
    value: function _calFlushCallback(err, count) {
      if (count || err) {
        Log.debug('Flushed cal log messages', {
          count: count,
          err: err
        });
      }

      if (typeof this._flushLogs === 'function') {
        var _context8;

        _manticore["default"].setTimeout((0, _bind["default"])(_context8 = this._flushLogs).call(_context8, this), 10 * 1000);
      }
    }
  }, {
    key: "setupCalLogging",
    value: function setupCalLogging() {
      var _context9;

      Cal.newGroup((0, _now["default"])());
      Cal.attach((0, _bind["default"])(_context9 = this._flushLogs).call(_context9, this));
    }
    /**
     * Information that represents the executing platform
     * @param {SdkEnvironmentInfo} sdkEnvInfo Executing environment info
     */

  }, {
    key: "setExecutingEnvironment",
    value: function setExecutingEnvironment(sdkEnvInfo) {
      var _sdkEnvInfo$environme, _context10, _context11, _context12, _context13, _context14;

      if (((_sdkEnvInfo$environme = sdkEnvInfo.environment) === null || _sdkEnvInfo$environme === void 0 ? void 0 : _sdkEnvInfo$environme.toLowerCase()) === 'live') {
        _manticoreLog["default"].Root.level = _manticoreLog["default"].Level.INFO;
      } else {
        _manticoreLog["default"].Root.level = _manticoreLog["default"].Level.DEVELOPER;
      }

      _Merchant["default"].sdkEnvironment = sdkEnvInfo;
      this.envInfo = (0, _concat["default"])(_context10 = (0, _concat["default"])(_context11 = (0, _concat["default"])(_context12 = (0, _concat["default"])(_context13 = (0, _concat["default"])(_context14 = "".concat(sdkEnvInfo.osName, "-")).call(_context14, sdkEnvInfo.osVersion, ";app-")).call(_context13, sdkEnvInfo.appVersion, "-")).call(_context12, sdkEnvInfo.appBuild, ";.sdk-")).call(_context11, sdkEnvInfo.retailSDKVersion, ".m-")).call(_context10, sdkEnvInfo.merchantId).replace(/\s+/g, '');
      Cal.setRequestSourceId(this.envInfo);
    }
    /**
     * SDK Version
     * @returns {string} version
     */

  }, {
    key: "getSdkVersion",
    value: function getSdkVersion() {
      var _context15;

      return (0, _concat["default"])(_context15 = "".concat(_package["default"].version, "J")).call(_context15, _package["default"].mobileVersion);
    }
    /*
     * Perform cleanup before shutting down the host application
     */

  }, {
    key: "logout",
    value: function logout() {
      this.sdkObservableSubscription.unsubscribe();

      try {
        Log.info('SDKLogoutInvoked', {
          id: _TransactionContext["default"].active ? _TransactionContext["default"].active.id : '<none>',
          CRs: _retailPaymentDevice.PaymentDevice.devices
        });

        _CardReaderDisplayController["default"].resetAll();

        if (_TransactionContext["default"].active) {
          Log.info('SDKlogoutEndTx', {
            id: _TransactionContext["default"].active.id
          });

          _TransactionContext["default"].active.end(_sdkErrors.sdk.logout, null, false);
        }

        if (_Merchant["default"].active) {
          Log.developer('SDKlogoutEndMerchant', {
            merchantActive: _Merchant["default"].active
          });
          Log.info('SDKlogoutEndMerchant');
          _Merchant["default"].active = null;
        }

        var _iterator = _createForOfIteratorHelper(_retailPaymentDevice.PaymentDevice.devices),
            _step;

        try {
          var _loop = function _loop() {
            var pd = _step.value;

            if (pd.disconnectUsb) {
              Log.debug(function () {
                return "Disconnecting USB from ".concat(pd.id);
              });
              pd.disconnectUsb(function () {});
            }

            Log.debug(function () {
              return "Removing ".concat(pd.id);
            });
            pd.removed();
          };

          for (_iterator.s(); !(_step = _iterator.n()).done;) {
            _loop();
          }
        } catch (err) {
          _iterator.e(err);
        } finally {
          _iterator.f();
        }

        (0, _cachedLog.stopCachedLogging)();
        (0, _cachedLog.detachCachedLogger)();
        this.merchantManager.logOut();

        this._removeConsoleLogFn();
      } catch (x) {
        Log.error('ErrLoggingOut', {
          err: x
        });
      }
    }
    /**
     * Set the log level for SDK
     * @param {logLevel} level
     */

  }, {
    key: "setLogLevel",
    value: function setLogLevel(level) {
      var manticoreLogLevel = _manticoreLog["default"].Level.DEBUG;

      if (level === _logLevel["default"].quiet) {
        manticoreLogLevel = 'QUIET';
      } else if (level === _logLevel["default"].error) {
        manticoreLogLevel = _manticoreLog["default"].Level.ERROR;
      } else if (level === _logLevel["default"].warn) {
        manticoreLogLevel = _manticoreLog["default"].Level.WARN;
      } else if (level === _logLevel["default"].info) {
        manticoreLogLevel = _manticoreLog["default"].Level.INFO;
      } else if (level === _logLevel["default"].debug) {
        manticoreLogLevel = _manticoreLog["default"].Level.DEBUG;
      }

      Log.debug(function () {
        return "Set SDK log level to ".concat(manticoreLogLevel);
      });
      require('@paypalcorp/manticore-log')["default"].Root.level = manticoreLogLevel; // eslint-disable-line global-require
    }
    /**
     * Provide an interceptor for all HTTP calls made by the SDK
     * @param {SDK~intercept} interceptor
     */

  }, {
    key: "setNetworkInterceptor",
    value: function setNetworkInterceptor(interceptor) {
      Log.info("".concat(interceptor ? 'AddingCustomInterceptor' : 'NoInterceptorAdded'));
      (0, _networkInterceptor["default"])(interceptor);
    }
    /**
     * Provide fake devices. If fake is enable, no actual devices will work.
     * @param {DeviceSimulatorType} devices
     * @param {SimulatorUseCase} usecase (SWIPE, CHIP, CONTACTLESS)
     * @param {string} jsonResponseData
     */

  }, {
    key: "simulateDevice",
    value: function simulateDevice(device, usecase, responseData) {
      var _context16;

      Log.info((0, _concat["default"])(_context16 = "startingSimulatorFor:".concat(device, "-")).call(_context16, usecase));

      _DeviceSimulator["default"].start(device, usecase, responseData);
    }
  }, {
    key: "updateNetworkState",
    value: function updateNetworkState(isConnected) {
      Log.info("NetworkConnection: ".concat(isConnected ? 'Connected' : 'Disconnected')); // Warning: The native layer can generate this event multiple times for one state change. Idempotent functions
      // should be used with this.

      this.emit(SDK.Event.networkConnectivityChanged, isConnected);
    }
    /**
     * Method to transform DeviceError code to PayPalError
     * @param {DeviceError} code One of the error codes exposed by DeviceError enum
     * @returns {PayPalError} A PayPalError object
     */

  }, {
    key: "getDeviceError",
    value: function getDeviceError(code) {
      return this.payPalErrorGenerator.getPayPalErrorForDeviceError(code);
    }
    /**
     * Method to transform SdkError code to PayPalError
     * @param {SdkError} code One of the error codes exposed by SdkError enum
     * @returns {PayPalError} A PayPalError object
     */

  }, {
    key: "getSdkError",
    value: function getSdkError(code) {
      return this.payPalErrorGenerator.getPayPalErrorForSdkError(code);
    }
    /**
     * Method to transform TransactionError code to PayPalError
     * @param {TransactionError} code One of the error codes exposed by TransactionError enum
     * @returns {PayPalError} A PayPalError object
     */

  }, {
    key: "getTransactionError",
    value: function getTransactionError(code) {
      return this.payPalErrorGenerator.getPayPalErrorForTransactionError(code);
    }
    /**
     * Method to transform MerchantError code to PayPalError
     * @param {MerchantError} code One of the error codes exposed by MerchantError enum
     * @returns {PayPalError} A PayPalError object
     */

  }, {
    key: "getMerchantError",
    value: function getMerchantError(code) {
      return this.payPalErrorGenerator.getPayPalErrorForMerchantError(code);
    }
  }]);
  return SDK;
}(_events.EventEmitter);

SDK.Event = {
  pageViewed: 'pageViewed',
  untrustedNetwork: 'untrustedNetwork',
  networkConnectivityChanged: 'networkConnectivityChanged'
};
/**
 * A page has been viewed
 * @event SDK#pageViewed
 * @param {error} error Error reported on the page
 * @param {Page} page Page that was viewed
 */

/**
 * Untrusted Network Event
 * @event SDK#untrustedNetwork
 * @param {error} error Error reported for untrustedNetwork
 */

/**
 * This callback will be invoked every time the SDK wants to do a HTTP Request, the listener could intercept this call
 * and provide
 * @callback SDK~intercept
 * @param {NetworkRequest} request HTTP Network request
 */

var sdk = new SDK();
module.exports = sdk;

},{"../package.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/package.json","../ppPublicKey":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/ppPublicKey.js","./EventSink":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/EventSink.js","./common/BraintreeManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/BraintreeManager.js","./common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","./common/MerchantManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/MerchantManager.js","./common/NetworkHandler/networkInterceptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/NetworkHandler/networkInterceptor.js","./common/PayPalErrorGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/PayPalErrorGenerator.js","./common/SimulationManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/SimulationManager.js","./common/UITheme":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/UITheme.js","./common/cachedLog":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/cachedLog.js","./common/cal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/cal.js","./common/logLevel":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/logLevel.js","./common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./paymentDevice/CardReaderDisplayController":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/CardReaderDisplayController.js","./simulator/devices/DeviceSimulator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/DeviceSimulator.js","./transaction/DeviceManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/DeviceManager.js","./transaction/TransactionContext":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionContext.js","./transaction/TransactionManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionManager.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/date/now":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/date/now.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypalrest-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.string.replace.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","retail-page-tracker":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/retail-page-tracker/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/DeviceSimulator.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _MessageResponseProvider = _interopRequireDefault(require("./miura/messages/MessageResponseProvider"));

var _DeviceSimulatorType = _interopRequireDefault(require("./DeviceSimulatorType"));

var Log = (0, _manticoreLog["default"])('DeviceSimulator');
/**
 *
 * Provide Device Simulations
 */

var DeviceSimulator = /*#__PURE__*/function () {
  function DeviceSimulator() {
    (0, _classCallCheck2["default"])(this, DeviceSimulator);
  }

  (0, _createClass2["default"])(DeviceSimulator, [{
    key: "start",
    value: function start(device, usecase, responseData) {
      Log.info('start Device Simulator');

      if (device === _DeviceSimulatorType["default"].Miura) {
        Log.info('start Device Simulator for Miura');
        _MessageResponseProvider["default"].usecase = usecase;

        _MessageResponseProvider["default"].setUserResponseData(JSON.parse(responseData));
      } else {
        Log.info("we don't support ".concat(device));
      }
    }
  }]);
  return DeviceSimulator;
}();

var deviceSimulator = new DeviceSimulator();
var _default = deviceSimulator;
exports["default"] = _default;

},{"./DeviceSimulatorType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/DeviceSimulatorType.js","./miura/messages/MessageResponseProvider":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/miura/messages/MessageResponseProvider.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/DeviceSimulatorType.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
/**
 * Device Simulator Types
 * @enum {int}
 */

var DeviceSimulatorType = {
  /**
   * ROAM Audio reader
   */
  Swiper: 0,

  /**
   * Miura
   */
  Miura: 1,

  /**
   * Ingenico
   */
  Ingenico: 2
};
var _default = DeviceSimulatorType;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/SimulationOptions.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _DeviceSimulatorType = _interopRequireDefault(require("./DeviceSimulatorType"));

var _SimulatorUseCase = _interopRequireDefault(require("./SimulatorUseCase"));
/**
 * SimulationOptions provides the list of customizations for a simulation mode
 * @class
 * @property {bool} enableDeviceSimulator It enables to have a device simulator for the simulator.
 * The default value is true.
 * @property {bool} enableServerSimulator It enables to have a fake server.
 * The default value is true.
 * @property {bool} enableMerchantSimulator It enables to initialize the SDK with a fake merchant.
 * The default value is true.
 * @property {DeviceSimulatorType} deviceSimulatorType the type of the device simulator to be used in simulation mode.
 * The default value is Miura
 * @property {SimulatorUseCase} simulatorUseCase the use case for the simulator like chip, swipe, fallback swipe
 * or contactless. The default value is swipe
 * @property {string} userResponseData Response JSON data chosen by the user
 * @property {string} tag Reserved for restricted use
 */


var SimulationOptions = /*#__PURE__*/function () {
  /**
   * Create simulation options object
   * @constructor
   */
  function SimulationOptions() {
    (0, _classCallCheck2["default"])(this, SimulationOptions);
    this.enableDeviceSimulator = true;
    this.enableServerSimulator = true;
    this.deviceSimulatorType = _DeviceSimulatorType["default"].Miura;
    this.simulatorUseCase = _SimulatorUseCase["default"].SWIPE;
    this.userResponseData = null;
    this.tag = '';
  }

  (0, _createClass2["default"])(SimulationOptions, [{
    key: "toJSON",
    value: function toJSON() {
      return {
        enableDeviceSimulator: this.enableDeviceSimulator,
        enableServerSimulator: this.enableServerSimulator,
        deviceSimulatorType: this.deviceSimulatorType,
        simulatorUseCase: this.simulatorUseCase,
        userResponseData: this.userResponseData
      };
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this);
    }
  }]);
  return SimulationOptions;
}();

exports["default"] = SimulationOptions;

},{"./DeviceSimulatorType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/DeviceSimulatorType.js","./SimulatorUseCase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/SimulatorUseCase.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/SimulatorUseCase.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
/**
 * Device Simulator Types
 * @enum {int}
 */

var SimulatorUseCase = {
  /**
   * Chip use case
   */
  CHIP: 0,

  /**
   * Swipe use case
   */
  SWIPE: 1,

  /**
   * Fallback swipe use case
   */
  FB_SWIPE: 2,

  /**
   * Contactless use case
   */
  CONTACTLESS: 3
};
var _default = SimulatorUseCase;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/miura/messages/MessageInterperter.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.exec.js");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray2 = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

require("core-js/modules/es.object.values.js");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _response_messages = _interopRequireDefault(require("./response_messages.json"));

var _MessageResponseProvider = _interopRequireDefault(require("./MessageResponseProvider"));

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray2(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context4;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context4 = Object.prototype.toString.call(o)).call(_context4, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Log = (0, _manticoreLog["default"])('MessageInterperter');

Object.values = function (obj) {
  var _context;

  return (0, _map["default"])(_context = (0, _keys["default"])(obj)).call(_context, function (key) {
    return obj[key];
  });
};

var keys = (0, _keys["default"])(_response_messages["default"]);

var MessageInterperter = /*#__PURE__*/function () {
  function MessageInterperter() {
    (0, _classCallCheck2["default"])(this, MessageInterperter);
  }

  (0, _createClass2["default"])(MessageInterperter, [{
    key: "interpret",
    value: // eslint-disable-line import/prefer-default-export
    function interpret(binary) {
      var maxInstructionIndetifier = 2;
      var instructionIndetifierStart = 3;

      var _iterator = _createForOfIteratorHelper(keys),
          _step;

      try {
        var _loop = function _loop() {
          var key = _step.value;
          var index = 0;
          var value = _response_messages["default"][key];

          for (; index < maxInstructionIndetifier; index++) {
            if (value !== null && value !== void 0 && value.identifiers && binary[instructionIndetifierStart + index] !== (0, _parseInt2["default"])(value.identifiers[index], 16)) {
              break;
            }
          }

          if (index === maxInstructionIndetifier) {
            Log.debug(function () {
              return "Found message ".concat((0, _stringify["default"])(value));
            });
            value.name = key;
            return {
              v: value
            };
          }
        };

        for (_iterator.s(); !(_step = _iterator.n()).done;) {
          var _ret = _loop();

          if ((0, _typeof2["default"])(_ret) === "object") return _ret.v;
        }
      } catch (err) {
        _iterator.e(err);
      } finally {
        _iterator.f();
      }

      return null;
    }
  }, {
    key: "process",
    value: function process(request) {
      var binary = Buffer.from(request, 'base64');
      var message = this.interpret(binary);
      if (message == null) return null;
      if (message.name === 'softReset') this.id = -1;
      this.id += 1;

      try {
        var commandId = this.id;

        var response = _MessageResponseProvider["default"][message.name](commandId, binary, message);

        if (response.result) {
          if (!(0, _isArray["default"])(response.result)) {
            response.result = [response.result]; // Convert to array for native v8
          }

          Log.debug(function () {
            var _context2, _context3;

            return (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = "Processed request ".concat(message.name, "(")).call(_context3, commandId, ") with ")).call(_context2, response.result);
          });
          return response.result;
        }
      } catch (error) {
        Log.error(error);
      }

      this.processing = false;
      return null;
    }
  }]);
  return MessageInterperter;
}();

exports["default"] = MessageInterperter;

}).call(this)}).call(this,require("buffer").Buffer)
},{"./MessageResponseProvider":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/miura/messages/MessageResponseProvider.js","./response_messages.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/miura/messages/response_messages.json","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.object.values.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.values.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/miura/messages/MessageResponseProvider.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

require("core-js/modules/es.regexp.exec.js");

var _sliceInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray2 = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _tlvlib = require("tlvlib");

var _miuraEmv = require("@paypalcorp/miura-emv");

var _response_messages = _interopRequireDefault(require("./response_messages.json"));

var _SimulatorUseCase = _interopRequireDefault(require("../../SimulatorUseCase"));

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray2(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context2;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty2(_context2 = Object.prototype.toString.call(o)).call(_context2, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Log = (0, _manticoreLog["default"])('MessageResponseProvider');
var E1Tag = new _tlvlib.DefinedTag('MiuraRespCommandDataE1', 0xE1, _tlvlib.ValueFormat.TypeLengthValueList);
var E4Tag = new _tlvlib.DefinedTag('ChipData', 0xE4, _tlvlib.ValueFormat.TypeLengthValueList);
var E3Tag = new _tlvlib.DefinedTag('ContinueChipData', 0xE3, _tlvlib.ValueFormat.TypeLengthValueList);
var EDTag = new _tlvlib.DefinedTag('MiuraRespCommandDataED', 0xED, _tlvlib.ValueFormat.TypeLengthValueList);
var BatteryPercentage = new _tlvlib.DefinedTag('BatteryPercentage', 0xdfa20a, _tlvlib.ValueFormat.Binary, 1);
var ApplicationEffectiveDate = new _tlvlib.DefinedTag('ApplicationEffectiveDate', 0x5f25, _tlvlib.ValueFormat.Date);

var MessageResponseProvider = /*#__PURE__*/function () {
  function MessageResponseProvider() {
    (0, _classCallCheck2["default"])(this, MessageResponseProvider);
  }

  (0, _createClass2["default"])(MessageResponseProvider, [{
    key: "isObject",
    value: function isObject(value) {
      return value && (0, _typeof2["default"])(value) === 'object' && value.constructor === Object;
    }
  }, {
    key: "_mergeResponseDataInternal",
    value: function _mergeResponseDataInternal(userResponseData, preDefindedResponseData, responseDataNode) {
      for (var _i = 0, _Object$keys = (0, _keys["default"])(preDefindedResponseData); _i < _Object$keys.length; _i++) {
        var key = _Object$keys[_i];
        var userdata = userResponseData[key];

        if (userdata) {
          if ((0, _isArray["default"])(userdata)) {
            responseDataNode[key] = [];

            for (var index = 0; index < preDefindedResponseData[key].length; index++) {
              responseDataNode[key][index] = {};

              this._mergeResponseDataInternal(userdata[index], preDefindedResponseData[key][index], responseDataNode[key][index]);
            }
          } else if (this.isObject(userdata)) {
            responseDataNode[key] = {};

            this._mergeResponseDataInternal(userdata, preDefindedResponseData[key], responseDataNode[key]);
          } else {
            responseDataNode[key] = userdata;
          }
        } else {
          responseDataNode[key] = preDefindedResponseData[key];
        }
      }
    }
  }, {
    key: "mergeResponseData",
    value: function mergeResponseData(userResponseData) {
      for (var _i2 = 0, _Object$keys3 = (0, _keys["default"])(_response_messages["default"]); _i2 < _Object$keys3.length; _i2++) {
        var key = _Object$keys3[_i2];

        if (_response_messages["default"][key].response) {
          this.responseData[key] = {};

          if (userResponseData[key] && userResponseData[key].response) {
            this._mergeResponseDataInternal(userResponseData[key].response, _response_messages["default"][key].response, this.responseData[key]);
          } else {
            this.responseData[key] = _response_messages["default"][key].response;
          }
        }
      }
    } // called from Device Simulator

  }, {
    key: "setUserResponseData",
    value: function setUserResponseData(userResponseData) {
      var _this = this;

      this.responseData = {};
      this.mergeResponseData(userResponseData);
      Log.debug(function () {
        return "merged Response Data: ".concat((0, _stringify["default"])(_this.responseData));
      });
    }
  }, {
    key: "createDefinedTag",
    value: function createDefinedTag(tag) {
      return new _tlvlib.DefinedTag(tag.name, tag.number, tag.format, tag.length);
    }
  }, {
    key: "numberToBuffer",
    value: function numberToBuffer(number, lengthInBytes) {
      var buf = Buffer.alloc(lengthInBytes);
      buf.writeUIntBE(number, 0, lengthInBytes);
      return buf;
    }
  }, {
    key: "_buildResponseInternal",
    value: function _buildResponseInternal(buffer, extras) {
      var lrc = 0;
      var preamble = Buffer.alloc(3);
      preamble.writeUInt8(1, 0); // NAD always 1

      lrc ^= 1;
      var response = buffer;

      if (extras.isPartial) {
        preamble.writeUInt8(1, 1);
        lrc ^= 1;
      } else {
        if (extras.isUnsolicited) {
          preamble.writeUInt8(0x40, 1);
          lrc ^= 0x40;
        } else {
          preamble.writeUInt8(0, 1);
        }

        var trailerBuf = Buffer.allocUnsafe(2);
        trailerBuf.writeUInt8(extras.sw1 || 0x90, 0);
        trailerBuf.writeUInt8(extras.sw2 || 0, 1);
        response = (0, _concat["default"])(Buffer).call(Buffer, [buffer, trailerBuf]);
      }

      preamble.writeUInt8(response.length, 2);
      lrc ^= response.length;

      for (var i = 0; i < response.length; i++) {
        lrc ^= response[i];
      }

      var epilogue = Buffer.alloc(1);
      epilogue.writeUInt8(lrc & 0xFF, 0);
      return (0, _concat["default"])(Buffer).call(Buffer, [preamble, response, epilogue]).toString('base64');
    }
  }, {
    key: "buildResponse",
    value: function buildResponse(tlvlist, extrasValues) {
      var extras = extrasValues || {};
      var response = tlvlist.toBytes();
      var start = 0;
      var length = response.length;
      var end = length;
      var partials = [];

      while (length > 255) {
        end = start + 254;
        partials.push(this._buildResponseInternal((0, _slice["default"])(response).call(response, start, end), {
          isPartial: true,
          sw1: extras.sw1,
          sw2: extras.sw2,
          isUnsolicited: extras.isUnsolicited
        }));
        start = end;
        length -= 254;
      }

      end = start + length;
      partials.push(this._buildResponseInternal((0, _slice["default"])(response).call(response, start, end), {
        isPartial: false,
        sw1: extras.sw1,
        sw2: extras.sw2,
        isUnsolicited: extras.isUnsolicited
      }));
      return partials;
    }
  }, {
    key: "_constructRequestData",
    value: function _constructRequestData(command) {
      var _this2 = this;

      var len = command[7];
      this.request = new _tlvlib.TlvList(command, 8 + 2, len - 2); // skip tag and length

      Log.debug(function () {
        return "Requested Data - ".concat(_this2.request);
      });
    }
  }, {
    key: "_addRequestDataValue",
    value: function _addRequestDataValue(eTags, tag, responseValue, tagToAdd) {
      if (responseValue) {
        eTags.add(tag, new Date(responseValue));
      } else {
        var _context;

        var tlv = (0, _find["default"])(_context = this.request).call(_context, tag);
        eTags.add(tagToAdd || tag, Buffer.from(tlv.bytes, 'hex'));
      }
    }
  }, {
    key: "_addOverriddenRequestData",
    value: function _addOverriddenRequestData(eTags, responseObj) {
      this._addRequestDataValue(eTags, _tlvlib.Tags.TransactionDate, responseObj.transactionDate);

      this._addRequestDataValue(eTags, _tlvlib.Tags.TransactionType, responseObj.transactionType);

      this._addRequestDataValue(eTags, _tlvlib.Tags.AmountAuthorized, responseObj.amountAuthorized); // Need Transaction Time?

    }
  }, {
    key: "_addCommonChipResponse",
    value: function _addCommonChipResponse(eTags) {
      var responseObj = this.responseData.startChipTx;

      this._addOverriddenRequestData(eTags, responseObj);

      eTags.add(_tlvlib.Tags.ApplicationInterchangeProfile, Buffer.from(responseObj.AIP, 'hex'));
      eTags.add(_tlvlib.Tags.ApplicationLabel, Buffer.from(responseObj.AppLabel));
      eTags.add(_tlvlib.Tags.TerminalIdentification, Buffer.from(responseObj.terminalId));
      eTags.add(_tlvlib.Tags.TerminalApplicationIdentifier, Buffer.from(responseObj.AppId, 'hex'));
      eTags.add(_tlvlib.Tags.TerminalCountryCode, responseObj.terminalCountryCode);
      eTags.add(_tlvlib.Tags.IssuerCountryCode, Buffer.from(responseObj.IssuerCountryCode, 'hex'));
      eTags.add(_tlvlib.Tags.ApplicationPanSequenceCode, Buffer.from(responseObj.PANSeqNumber, 'hex'));

      var cardExpiry = _tlvlib.ValueFormat.Date.toBytes(new Date(responseObj.cardExpiry));

      eTags.add(_tlvlib.Tags.ApplicationExpirationDate, cardExpiry);
      eTags.add(_tlvlib.Tags.DfNameAscii, Buffer.from(responseObj.dedicatedFileName, 'hex'));
      eTags.add(_tlvlib.Tags.TerminalVerificationResults, Buffer.from(responseObj.tvr, 'hex'));
      eTags.add(_tlvlib.Tags.AmountOther, Buffer.from(responseObj.amountOther, 'hex'));
      eTags.add(_tlvlib.Tags.ApplicationVersionNumber, Buffer.from(responseObj.terminalApplicationVersionNumber, 'hex'));
      eTags.add(_tlvlib.Tags.IssuerApplicationData, Buffer.from(responseObj.issuerApplicationData, 'hex'));
      eTags.add(_tlvlib.Tags.InterfaceDeviceSerialNumber, responseObj.terminalSerialNumber);
      eTags.add(_tlvlib.Tags.TerminalCapabilities, Buffer.from(responseObj.terminalCapabilities, 'hex'));
      eTags.add(_tlvlib.Tags.CardholderVerificationMethodResults, Buffer.from(responseObj.CardholderVerificationResults, 'hex'));
      eTags.add(_tlvlib.Tags.TerminalType, responseObj.terminalType);
      eTags.add(_tlvlib.Tags.ApplicationTransactionCounter, this.numberToBuffer(responseObj.ATC, 2)); // make it dynamic?

      eTags.add(_tlvlib.Tags.UnpredictableNumber, Buffer.from(responseObj.unpredictableNumber, 'hex')); // make it random?

      eTags.add(_tlvlib.Tags.TransactionSequenceCounter, Buffer.from(responseObj.transactionSequenceCounter, 'hex'));
      eTags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraSREDData), Buffer.from(responseObj.SREDData, 'hex'));
      eTags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraKSN), Buffer.from(responseObj.KSN, 'hex'));
      eTags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraMaskedICCTrack2), Buffer.from(responseObj.MaskedICCTrack2, 'hex'));
      eTags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraMaskedPan), Buffer.from(responseObj.MaskedPan, 'hex'));
    }
  }, {
    key: "_cardInserted",
    value: function _cardInserted() {
      return 'AUAa4RZIAgMAYxDoAACBMf5FSkNPUFYyNDGUkAAG';
    }
  }, {
    key: "_invalidChipCard",
    value: function _invalidChipCard() {
      this.invalidChipCard += 1;
      return 'AUAI4QRIAgEAkAB3';
    }
  }, {
    key: "_cardSwiped",
    value: function _cardSwiped(status, key) {
      var rd = this.responseData[key || 'cardSwiped'];
      var cstatus = status || rd.CardStatus;
      var e1Tags = new _tlvlib.TlvList();
      e1Tags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraCardStatusInfo), Buffer.from(cstatus, 'hex'));
      e1Tags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraSREDData), Buffer.from(rd.SREDData, 'hex'));
      e1Tags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraKSN), Buffer.from(rd.KSN, 'hex'));
      e1Tags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraMaskedTrack2), rd.MaskedTrack2);
      var e1 = new _tlvlib.TlvList();
      e1.add(E1Tag, e1Tags);
      return this.buildResponse(e1, {
        isUnsolicited: true
      });
    }
  }, {
    key: "_cardTapped",
    value: function _cardTapped(command, responseTemplate) {
      this._constructRequestData(command);

      var e4Tags = new _tlvlib.TlvList();
      var responseObj = this.responseData[responseTemplate.name];

      this._addRequestDataValue(e4Tags, _tlvlib.Tags.TransactionCurrencyCode, responseObj.currencyCode);

      e4Tags.add(_tlvlib.Tags.CardholderName, Buffer.from(responseObj.CardholderName));
      e4Tags.add(_tlvlib.Tags.ApplicationCryptogram, Buffer.from(responseObj.applicationCryptogram, 'hex')); // make it dynamic?

      e4Tags.add(_tlvlib.Tags.CryptogramInformationData, Buffer.from(responseObj.cryptogramInformationData, 'hex')); // make it dynamic?

      e4Tags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraMaskedPan), Buffer.from(responseObj.MaskedPan, 'hex'));
      e4Tags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraCardholderVerificationStatus), Buffer.from(responseObj.MiuraCardholderVerificationStatus, 'hex'));
      e4Tags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraContactlessType), Buffer.from(responseObj.MiuraContactlessType, 'hex'));

      this._addCommonChipResponse(e4Tags);

      var e4 = new _tlvlib.TlvList();
      e4.add(E4Tag, e4Tags);
      return this.buildResponse(e4);
    }
  }, {
    key: "_contactLessTimedOut",
    value: function _contactLessTimedOut() {
      return 'AQACn0Le';
    }
  }, {
    key: "_cardRemoved",
    value: function _cardRemoved() {
      return this.responseData.cardRemoved.base64;
    }
  }, {
    key: "_cardStatusChanged",
    value: function _cardStatusChanged(status) {
      var e1Tags = new _tlvlib.TlvList();
      e1Tags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraCardStatusInfo), Buffer.from(status || this.responseData.cardStatusChanged.MiuraCardStatusInfo, 'hex'));
      var e1 = new _tlvlib.TlvList();
      e1.add(E1Tag, e1Tags);
      return this.buildResponse(e1, {
        isUnsolicited: true
      });
    }
  }, {
    key: "_abortNFC",
    value: function _abortNFC(SW1, SW2) {
      return this.buildResponse(new _tlvlib.TlvList(), {
        sw1: SW1,
        sw2: SW2
      });
    }
  }, {
    key: "softReset",
    value: function softReset(id, command, responseTemplate) {
      Log.debug(function () {
        return 'Invoked softReset';
      });
      this.invalidChipCard = 0;
      var e1Tags = new _tlvlib.TlvList();
      e1Tags.add(_tlvlib.Tags.InterfaceDeviceSerialNumber, this.responseData[responseTemplate.name].serialNumber);

      var _iterator = _createForOfIteratorHelper(this.responseData[responseTemplate.name].softwareInformation),
          _step;

      try {
        for (_iterator.s(); !(_step = _iterator.n()).done;) {
          var sInfo = _step.value;
          var eFTagsData = new _tlvlib.TlvList();
          eFTagsData.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraIdentifier), sInfo.miuraIdentifier);
          eFTagsData.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraVersionInformation), sInfo.miuraVersionInformation);
          e1Tags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraSoftwareInformation), eFTagsData);
        }
      } catch (err) {
        _iterator.e(err);
      } finally {
        _iterator.f();
      }

      var e1 = new _tlvlib.TlvList();
      e1.add(E1Tag, e1Tags);
      return {
        commandId: id,
        result: this.buildResponse(e1)
      };
    }
  }, {
    key: "displayTextMessage",
    value: function displayTextMessage(id, command, responseTemplate) {
      var lresult = this.responseData[responseTemplate.name].base64;

      if ((0, _includes["default"])(command).call(command, 'Please remove card')) {
        lresult = [this._cardRemoved(), lresult];
      }

      return {
        commandId: id,
        result: lresult
      };
    }
  }, {
    key: "_addDataForFallback",
    value: function _addDataForFallback(r) {
      r.push(this._cardStatusChanged()[0]);

      if (this.invalidChipCard === 3) {
        // 3 tries
        r.push(this._cardSwiped('0007', 'chipCardSwiped')[0]);
      } else {
        r.push(this._invalidChipCard());
      }

      r.push(this._cardStatusChanged('0100')[0]);
    }
  }, {
    key: "displayImageAndTextMessage",
    value: function displayImageAndTextMessage(id, command, responseTemplate) {
      var r = [this.responseData[responseTemplate.name].base64];

      if (this.usecase === _SimulatorUseCase["default"].FB_SWIPE) {
        this._addDataForFallback(r);
      }

      return {
        commandId: id,
        result: r // for fallback

      };
    }
  }, {
    key: "deviceCapabilities",
    value: function deviceCapabilities(id, command, responseTemplate) {
      Log.debug(function () {
        return 'Invoked deviceCapabilities';
      });
      var edTags = new _tlvlib.TlvList();
      var capabilities = this.responseData[responseTemplate.name].capabilities;

      for (var _i3 = 0, _Object$keys4 = (0, _keys["default"])(capabilities); _i3 < _Object$keys4.length; _i3++) {
        var capaKey = _Object$keys4[_i3];
        var edTagsData = new _tlvlib.TlvList();

        if (this.responseData[responseTemplate.name].capabilities[capaKey] !== false) {
          edTagsData.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraIdentifier), capaKey);

          if (this.responseData[responseTemplate.name].capabilities[capaKey] !== true) {
            edTagsData.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraVersionInformation), this.responseData[responseTemplate.name].capabilities[capaKey]);
          }

          edTags.add(EDTag, edTagsData);
        }
      }

      var e1 = new _tlvlib.TlvList();
      e1.add(E1Tag, edTags);
      return {
        commandId: id,
        result: this.buildResponse(e1)
      };
    }
  }, {
    key: "config",
    value: function config(id, command, responseTemplate) {
      Log.debug(function () {
        return 'Invoked config';
      });
      var edTags = new _tlvlib.TlvList();
      var softwareInfo = this.responseData[responseTemplate.name].softwareInfo;

      for (var _i4 = 0, _Object$keys5 = (0, _keys["default"])(softwareInfo); _i4 < _Object$keys5.length; _i4++) {
        var siKey = _Object$keys5[_i4];
        var edTagsData = new _tlvlib.TlvList();
        edTagsData.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraIdentifier), siKey);
        edTagsData.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraVersionInformation), this.responseData[responseTemplate.name].softwareInfo[siKey]);
        edTags.add(EDTag, edTagsData);
      }

      var e1 = new _tlvlib.TlvList();
      e1.add(E1Tag, edTags);
      return {
        commandId: id,
        result: this.buildResponse(e1)
      };
    }
  }, {
    key: "P2PEStatus",
    value: function P2PEStatus(id, command, responseTemplate) {
      Log.debug(function () {
        return 'Invoked P2PEStatus';
      });
      var status = this.responseData[responseTemplate.name].status;
      var edTagsData = new _tlvlib.TlvList();
      edTagsData.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraP2PEStatus), Buffer.from(status, 'hex'));
      var e1 = new _tlvlib.TlvList();
      e1.add(E1Tag, edTagsData);
      return {
        commandId: id,
        result: this.buildResponse(e1)
      };
    }
  }, {
    key: "batteryLevel",
    value: function batteryLevel(id, command, responseTemplate) {
      Log.debug(function () {
        return 'Invoked batteryLevel';
      });
      var status = this.numberToBuffer(this.responseData[responseTemplate.name].status.value, 1);
      var percentage = this.numberToBuffer(this.responseData[responseTemplate.name].percentage, 1);
      var e1Tags = new _tlvlib.TlvList();
      e1Tags.add(this.createDefinedTag(_miuraEmv.MiuraTags.MiuraBatteryData), status);
      e1Tags.add(BatteryPercentage, percentage);
      var e1 = new _tlvlib.TlvList();
      e1.add(E1Tag, e1Tags);
      return {
        commandId: id,
        result: this.buildResponse(e1)
      };
    }
  }, {
    key: "cardStatusChanged",
    value: function cardStatusChanged(id, command, responseTemplate) {
      // eslint-disable-line no-unused-vars
      Log.debug(function () {
        return 'Invoked cardStatusChanged';
      });

      var r = this._cardStatusChanged(); // returns array
      // ToDo: which use case to use for 'SWIPE_ONLY'. Ask Biju!!!


      if (this.usecase === _SimulatorUseCase["default"].SWIPE) {
        // for Offline SWIPE ONLY
        r.push(this._cardSwiped()[0]);
      }

      return {
        commandId: id,
        result: r
      };
    }
  }, {
    key: "cardStatus",
    value: function cardStatus(id, command, responseTemplate) {
      // eslint-disable-line no-unused-vars
      this.cardStatusRequested = true;
      Log.debug(function () {
        return 'Invoked cardStatus';
      });

      var r = this._cardStatusChanged(); // returns array
      // ToDo: which use case to use for 'SWIPE_ONLY'. Ask Biju!!!


      if (this.usecase === _SimulatorUseCase["default"].SWIPE) {
        // for Offline SWIPE ONLY
        r.push(this._cardSwiped()[0]);
      }

      return {
        commandId: id,
        result: r
      };
    }
  }, {
    key: "keyboardStatus",
    value: function keyboardStatus(id, command, responseTemplate) {
      Log.debug(function () {
        return 'Invoked keyboardStatus';
      });
      return {
        commandId: id,
        result: this.responseData[responseTemplate.name].base64
      };
    }
  }, {
    key: "startNFCTx",
    value: function startNFCTx(id, command, responseTemplate) {
      var _this3 = this; // eslint-disable-line no-unused-vars


      Log.debug(function () {
        return "Invoked startNFCTx with usecase ".concat(_this3.usecase);
      });
      var response = {
        commandId: id
      };

      if (this.usecase === _SimulatorUseCase["default"].CHIP) {
        response.result = [this._abortNFC(0x9f, 0x43)[0], this._cardInserted()];
      } else if (this.usecase === _SimulatorUseCase["default"].SWIPE) {
        response.result = [this._abortNFC(0x9f, 0x44)[0], this._cardSwiped()[0]];
      } else if (this.usecase === _SimulatorUseCase["default"].FB_SWIPE) {
        response.result = [this._abortNFC(0x9f, 0x43)[0], this._invalidChipCard()];
      } else {
        // Contacless usecase
        response.result = this._cardTapped(command, responseTemplate);
      }

      return response;
    }
  }, {
    key: "startChipTx",
    value: function startChipTx(id, command, responseTemplate) {
      Log.debug(function () {
        return 'Invoked startChipTx';
      });

      this._constructRequestData(command);

      var e4Tags = new _tlvlib.TlvList();
      var responseObj = this.responseData[responseTemplate.name];

      this._addRequestDataValue(e4Tags, _tlvlib.Tags.TransactionCurrencyCode, responseObj.currencyCode);

      e4Tags.add(_tlvlib.Tags.TransactionStatusInformation, Buffer.from(responseObj.tsi, 'hex'));
      e4Tags.add(_tlvlib.Tags.ApplicationCryptogram, Buffer.from(responseObj.applicationCryptogram, 'hex')); // make it dynamic?

      e4Tags.add(_tlvlib.Tags.CryptogramInformationData, Buffer.from(responseObj.cryptogramInformationData, 'hex')); // make it dynamic?

      this._addCommonChipResponse(e4Tags);

      var e4 = new _tlvlib.TlvList();
      e4.add(E4Tag, e4Tags);
      return {
        commandId: id,
        result: this.buildResponse(e4)
      };
    }
  }, {
    key: "continueTx",
    value: function continueTx(id, command, responseTemplate) {
      // get auth code from & validate
      Log.debug(function () {
        return 'Invoked continueTx';
      });
      var e3Tags = new _tlvlib.TlvList();
      var responseObj = this.responseData[responseTemplate.name];
      e3Tags.add(ApplicationEffectiveDate, Buffer.from(responseObj.applicationEffectiveDate, 'hex'));
      e3Tags.add(_tlvlib.Tags.ApplicationCryptogram, Buffer.from(responseObj.applicationCryptogram, 'hex')); // make it dynamic?

      e3Tags.add(_tlvlib.Tags.CryptogramInformationData, Buffer.from(responseObj.cryptogramInformationData, 'hex')); // make it dynamic?

      this._addCommonChipResponse(e3Tags);

      var e3 = new _tlvlib.TlvList();
      e3.add(E3Tag, e3Tags);
      return {
        commandId: id,
        result: this.buildResponse(e3)
      };
    }
  }, {
    key: "unRegisterForCardEvents",
    value: function unRegisterForCardEvents(id, command, responseTemplate) {
      // eslint-disable-line no-unused-vars
      Log.debug(function () {
        return 'Invoked unRegisterForCardEvents';
      });
      this.dmCount = 0;
      var r = null;

      if (this.usecase === _SimulatorUseCase["default"].FB_SWIPE) {
        r = this._cardStatusChanged('0100');
      }

      return {
        commandId: id,
        result: r
      };
    }
  }]);
  return MessageResponseProvider;
}();

var messageResponseProvider = new MessageResponseProvider();
var _default = messageResponseProvider;
exports["default"] = _default;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../../SimulatorUseCase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/SimulatorUseCase.js","./response_messages.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/miura/messages/response_messages.json","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/miura-emv":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/miura/messages/response_messages.json":[function(require,module,exports){
module.exports={
    "softReset": {
        "miura_spec_ref" : "11.3",
        "identifiers": ["0xD0", "0x00"],
        "response" : {
            "serialNumber": "10008360",
            "softwareInformation": [
                {
                    "miuraIdentifier": "M000-MPI",
                    "miuraVersionInformation" : "1-45"
                },{
                    "miuraIdentifier": "M000-TESTOS",
                    "miuraVersionInformation" : "7-7"
                }

            ]
        }
    },
    "displayTextMessage": {
        "miura_spec_ref" : "6.14",
        "identifiers": ["0xD2", "0x01"],
        "response" : {
            "base64": "AQACkACT"
        } 
    },
    "displayImageAndTextMessage": {
        "miura_spec_ref" : "6.14",
        "identifiers": ["0xD2", "0x20"],
        "response" : {
            "base64": "AQACkACT"
        } 
    },
    "deviceCapabilities":{
        "miura_spec_ref" : "6.3",
        "identifiers": ["0xD0", "0x02"],
        "response" : {
            "capabilities": {
                "Charge_cradle": true,
                "Smartcard": true,
                "Contactless": true,
                "Hardware": "M010-TEST01-V2-3",
                "USB_Bluetooth": "V4.0",
                "Serial": "010-008360",
                "USB_OTG": true,
                "Display": "128x64",
                "Keyboard": true,
                "MFi": true,
                "LEDs": "M010",
                "Mag": "1,2,3"
            }
        }
    },
    "config": {
        "miura_spec_ref" : "6.2",
        "identifiers": ["0xD0", "0x01"],
        "response" : {
            "softwareInfo" : {
                "ARQCDOL.CFG": "1.31",
                "AACDOL.CFG": "1.14",
                "emv.cfg": "13.0",
                "contactless.cfg": "14.7",
                "P2PEDOL.CFG": "Miura-1-2",
                "emv-fallback.cfg": "PayPal-V-1-08",
                "OPDOL.CFG": "Miura-V1-0",
                "TCDOL.CFG": "1.15",
                "TDOL.CFG": "1.12",
                "TRMDOL.CFG": "Miura-V1-01",
                "capkeys.cfg": "TESTCAPK-V2-16",
                "tip-templates.cfg": "1.00",
                "12x32.bdf": "1.4",
                "6x12.bdf": "1.0",
                "lcd-std.bdf": "1.9",
                "prompts.txt": "Miura-1-16",
                "emv-pinbypass.cfg": "Miura-V1-0",
                "acc-data-prompts.txt": "1.03",
                "Sazanami-Mincho-Regular-10.bdf": "1.0",
                "Sazanami-Mincho-Regular-20.bdf": "1.0",
                "9x18.bdf": "1.0",
                "sred-mag.cfg": "0.1",
                "emv-data-validation.cfg": "Miura-V1-2",
                "14x28.bdf": "1.2",
                "emv-arc.cfg": "Miura-V1-4",
                "numeric-entry.cfg": "Miura-V1-0",
                "ctls-prompts.txt": "Paypal-V1-11",
                "MPI-Dynamic.cfg": "PayPal-V-1-08",
                "bitmaps.cfg": "2.8",
                "MPI-Production.cfg": "5.4"
            }
        }
    },
    "P2PEStatus": {
        "miura_spec_ref" : "11.3",
        "identifiers": ["0xee", "0xe0"],
        "response" : {
            "status": "06"
        } 
    },
    "batteryLevel":{
        "miura_spec_ref" : "6.12",
        "identifiers": ["0xd0", "0x62"],
        "response" : {
            "status": {
                "possible_values": "0 (notcharging), 1 (charging), and 2 (fully charged)",
                "value": 2
            },
            "percentage": 100
        } 
    },
    "cardStatus":{
        "miura_spec_ref" : "6.10",
        "identifiers": ["0xd0", "0x60"]
    },
    "keyboardStatus":{
        "miura_spec_ref" : "6.11",
        "identifiers": ["0xd0", "0x61"],
        "response" :{
            "base64" : "AQACkACT"
        }
    },
    "startNFCTx": {
        "miura_spec_ref" : "6.28",
        "identifiers": ["0xde", "0xc1"],
        "response" : {
            "AIP": "5900",
            "AppLabel" : "PPC MAP 08 v2 2",
            "terminalId" : "12345678",
            "AppId":"A0000000041010",
            "CardholderName": "ETEC/PAYPASS",
            "IssuerCountryCode":"0056",
            "PANSeqNumber" : "00",
            "cardExpiry": "12/31/25",
            "dedicatedFileName":"A0000000041010",
            "tvr" : "0400008000",
            "amountOther": "000000000000",
            "terminalApplicationVersionNumber": "0002",
            "issuerApplicationData":"0110A00009240000000000000000000000FF",
            "terminalCountryCode":"0840",
            "terminalSerialNumber":"10008360",
            "applicationCryptogram":"3F19A0A5D4B92BC0",
            "cryptogramInformationData":"80",
            "terminalCapabilities":"000808",
            "CardholderVerificationResults":"1F0302",
            "terminalType":"22",
            "ATC":"651",
            "unpredictableNumber":"27080C10",
            "transactionSequenceCounter":"00001494",
            "MiuraCardholderVerificationStatus": "00",
            "MiuraContactlessType": "0201",
            "SREDData":"87F572FAF2E15FDC74500B1DDD5C8B9FE12D1E8DCE101B36E4B8FC47E8F77716",
            "KSN":"FFFF980262DCA000010A",
            "MaskedICCTrack2":"541333FFFFFF1018D2512220FFFFFFFFFF",
            "MaskedPan":"541333FFFFFF1018"
        }
    },
    "startChipTx": {
        "miura_spec_ref" : "6.26",
        "identifiers": ["0xde", "0xd1"],
        "response" : {
            "AIP": "5900",
            "AppLabel" : "PPC MAP 08 v2 2",
            "terminalId" : "10008360",
            "AppId":"A0000000041010",
            "IssuerCountryCode":"0056",
            "PANSeqNumber" : "01",
            "cardExpiry": "12/31/25",
            "dedicatedFileName":"A0000000041010",
            "tvr" : "0400008000",
            "tsi": "E800",
            "amountOther": "000000000000",
            "terminalApplicationVersionNumber": "0002",
            "issuerApplicationData":"0110A00009240000000000000000000000FF",
            "terminalCountryCode":"0840",
            "terminalSerialNumber":"10008360",
            "applicationCryptogram":"60C936A164C059B2",
            "cryptogramInformationData":"80",
            "terminalCapabilities":"E028C8",
            "CardholderVerificationResults":"5E0300",
            "terminalType":"22",
            "ATC":"651",
            "unpredictableNumber":"27080C10",
            "transactionSequenceCounter":"00001494",
            "SREDData":"9919D9A7A09837406976BEDFEA9D8248C568FA69D0D0A99B0B0EA6F79B9B8BE7",
            "KSN":"FFFF980262DCA0000104",
            "MaskedICCTrack2":"541333FFFFFF1083D2512220FFFFFFFFFF",
            "MaskedPan":"541333FFFFFF1083"
        } 
    },
    "continueTx": {
        "miura_spec_ref" : "6.27",
        "identifiers": ["0xde", "0xd2"],
        "response" : {
            "applicationCryptogram":"B6433677FCBDAE7D",
            "cryptogramInformationData":"40",
            "applicationEffectiveDate": "040101"
        } 
    },
    "cardStatusChanged" : {
        "miura_spec_ref" : "6.10",
        "type" : "unsolicited",
        "response": {
            "MiuraCardStatusInfo" : "0000"
        }
    },
    "cardRemoved": {
        "type" : "unsolicited",
        "response": {
            "base64": "AUAI4QRIAgAAkAB2"
        }
    },
    "cardSwiped": {
        "type" : "unsolicited",
        "response": {
            "CardStatus": "0005",
            "SREDData": "0BD3890A736F92BBE636CD0D5DBA842A8136C53D02447590C8878B63A76CA35DF360F40B99DA199E",
            "KSN": "FFFF980262DCA000010C",
            "MaskedTrack2": ";541333******0037=2512101*********?*"
        }
    },
    "chipCardSwiped": {
        "type" : "unsolicited",
        "response": {
            "CardStatus": "0007",
            "SREDData": "d843e9d8c30e43282555226fe0ecfd062ce8511a254ef5d016c989867c41287d99737e91470a0ab5924a48fc4473f2ac5fad421c9dec990bd892e0ad5f1d9ded3a93199939fd8edc5d28e2bee2f503476b78b1f1e8f9ba2150ada3c9961a30d5",
            "KSN": "ffff980262dca0000110",
            "MaskedTrack2": ";541333******1083=2512220**********?*"
        }
    }
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/index.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _SimulationOptions = _interopRequireDefault(require("./devices/SimulationOptions"));

var _MessageInterperter = _interopRequireDefault(require("./devices/miura/messages/MessageInterperter"));

module.exports = {
  MessageInterperter: _MessageInterperter["default"],
  SimulationOptions: _SimulationOptions["default"]
};

},{"./devices/SimulationOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/SimulationOptions.js","./devices/miura/messages/MessageInterperter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/simulator/devices/miura/messages/MessageInterperter.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/AuthStatus.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
/**
 * This enum represents the state of the auth transaction
 * @enum {int}
 */

var AuthStatus = {
  /**
   * Authorization is still pending. Yet to capture
   */
  pending: 0,

  /**
   * Authorization has been cancelled
   */
  canceled: 1
};
var _default = AuthStatus;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/AuthorizedTransaction.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _moment = _interopRequireDefault(require("moment"));

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _voidManager = _interopRequireDefault(require("./voidManager"));

var _captureManager = _interopRequireDefault(require("./captureManager"));
/**
 * Information about a completed capture
 * @class
 * @property {string} authorizationId The PayPal transaction reference number for this authorization @readonly
 * @property {string} invoiceId The PayPal invoice id for this authorization @readonly
 * @property {Date} timeCreated Time at which this authorization activity was created
 * @property {decimal} authorizedAmount Amount authorized for this transaction
 * @property {string} currency Currency in which the net amount was authorized @readonly
 * @property {string} status Status of the current authorization
 */


var AuthorizedTransaction = /*#__PURE__*/function () {
  /**
   * Create an authorized transaction
   * @constructor
   * @param {string} authorizationId the authorizationId to be captured.
   * @param {string} invoiceId the invoice id associated with the authorization.
   * @param {string} currency the currency in which authorization was placed.
   */
  function AuthorizedTransaction(authorizationId, invoiceId, currency) {
    (0, _classCallCheck2["default"])(this, AuthorizedTransaction);
    this.authorizationId = authorizationId;
    this.invoiceId = invoiceId;
    this.currency = currency;
  }

  (0, _createClass2["default"])(AuthorizedTransaction, [{
    key: "toJSON",
    value: function toJSON() {
      return {
        authorizationId: this.authorizationId,
        invoiceId: this.invoiceId,
        timeCreated: this.timeCreated,
        authorizedAmount: this.authorizedAmount,
        currency: this.currency,
        status: this.status
      };
    }
    /**
     * Void this authorized transaction
     * @param {AuthorizedTransaction~voidComplete} callback
     */

  }, {
    key: "voidTransaction",
    value: function voidTransaction(callback) {
      (0, _voidManager["default"])(this.authorizationId, callback);
    }
    /**
     * Capture this authorized transaction
     * @param {decimal} totalAmount the total amount that has to be captured.
     * @param {decimal} gratuityAmount (optional) the gratuity amount that is also part of the totalAmount. If present, should be less than total Amount.
     * @param {AuthorizedTransaction~captureComplete} callback
     */

  }, {
    key: "captureTransaction",
    value: function captureTransaction(totalAmount, gratuityAmount, callback) {
      (0, _captureManager["default"])(this.authorizationId, this.invoiceId, totalAmount, gratuityAmount, this.currency, null, callback);
    }
    /**
     * Capture this authorized transaction
     * @nativeName captureTransaction
     * @param {decimal} totalAmount the total amount that has to be captured.
     * @param {decimal} gratuityAmount (optional) the gratuity amount that is also part of the totalAmount. If present, should be less than total Amount.
     * @param {string} base64SignatureJpeg The signature as a base64 encoded JPEG image. Try to keep it under 100k
     * @param {AuthorizedTransaction~captureComplete} callback
     */

  }, {
    key: "captureTransactionWithSig",
    value: function captureTransactionWithSig(totalAmount, gratuityAmount, base64SignatureJpeg, callback) {
      (0, _captureManager["default"])(this.authorizationId, this.invoiceId, totalAmount, gratuityAmount, this.currency, base64SignatureJpeg, callback);
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }], [{
    key: "fromJSON",
    value: function fromJSON(response) {
      var _response$extension, _response$extensions, _response$gross;

      var invoiceNumber = (response === null || response === void 0 ? void 0 : (_response$extension = response.extension) === null || _response$extension === void 0 ? void 0 : _response$extension.invoice_number) || (response === null || response === void 0 ? void 0 : (_response$extensions = response.extensions) === null || _response$extensions === void 0 ? void 0 : _response$extensions.invoice_number); // eslint-disable-line camelcase

      var auth = new AuthorizedTransaction(response.id, invoiceNumber, (_response$gross = response.gross) === null || _response$gross === void 0 ? void 0 : _response$gross.currency_code); // eslint-disable-line camelcase

      auth.timeCreated = (0, _moment["default"])(response.time_created).toDate();
      auth.authorizedAmount = (0, _paypalInvoicing.$$)(response.gross.value);
      auth.status = response.status;
      return auth;
    }
  }]);
  return AuthorizedTransaction;
}();
/**
 * @callback AuthorizedTransaction~voidComplete
 * @param {error} error Error (if any)
 */

/**
 * @callback AuthorizedTransaction~captureComplete
 * @param {error} error Error (if any)
 * @param {string} captureId Id after a successful capture
 */


exports["default"] = AuthorizedTransaction;

},{"./captureManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/captureManager.js","./voidManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/voidManager.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/CardPresentedHandler.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

require("core-js/modules/es.regexp.exec.js");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/values"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var Util = _interopRequireWildcard(require("manticore-util"));

var _tlvlib = require("tlvlib");

var _events = require("events");

var _miuraEmv = require("@paypalcorp/miura-emv");

var _transactionEvent = _interopRequireDefault(require("./transactionEvent"));

var _PaymentErrorHandler = _interopRequireDefault(require("../flows/PaymentErrorHandler"));

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _QuickChipAction = _interopRequireDefault(require("./QuickChipAction"));

var messageHelper = _interopRequireWildcard(require("../flows/messageHelper"));

var _sdkErrors = require("../common/sdkErrors");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context16;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context16 = Object.prototype.toString.call(o)).call(_context16, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Log = (0, _manticoreLog["default"])('tx.cardPresentedHandler');

var CardPresentedHandler = /*#__PURE__*/function () {
  function CardPresentedHandler(tx) {
    var _context, _context2;

    (0, _classCallCheck2["default"])(this, CardPresentedHandler);
    this.context = tx;
    this.eventHandler = new _events.EventEmitter();
    this.eventHandler.on(CardPresentedHandler.Event.error, (0, _bind["default"])(_context = this._handleError).call(_context, this));
    this.eventHandler.on(CardPresentedHandler.Event.subtype, (0, _bind["default"])(_context2 = this._handleCardPresentSubtype).call(_context2, this));
    this._lastEvent = 'none';
    this.l10n = messageHelper.l10nDefault(this.context);
  }

  (0, _createClass2["default"])(CardPresentedHandler, [{
    key: "handleCardPresent",
    value: function handleCardPresent(err, subType, ff, result, device) {
      if (err) {
        // this.context.setPaymentInProgress();
        this.eventHandler.emit(CardPresentedHandler.Event.error, err, ff, device); // Note that this setPaymentInProgress() is needed here when offline decline happens

        return;
      }

      this.eventHandler.emit(CardPresentedHandler.Event.subtype, subType, ff, result, device);
    }
  }, {
    key: "_handleCardPresentSubtype",
    value: function _handleCardPresentSubtype(subType, ff, result, device) {
      this._lastEvent = subType;
      Log.track('ReceivedCardPresentEvent', {
        subType: Util.getPropertyName(_retailPaymentDevice.CardPresentEvent, subType),
        ff: Util.getPropertyName(_retailPaymentDevice.FormFactor, ff),
        context: this.context
      });

      if (subType === _retailPaymentDevice.CardPresentEvent.cardDataRead) {
        this._handleCardData(result);
      } else if (subType === _retailPaymentDevice.CardPresentEvent.pinEvent) {
        this._handlePinEvent(result);
      } else if (subType === _retailPaymentDevice.CardPresentEvent.appSelectionRequired) {
        this._handleApplicationSelect(device, ff, result);
      } else if (subType === _retailPaymentDevice.CardPresentEvent.insertDetected) {
        this._handleCardInsertDetectedEvent(device);
      } else {
        Log.error('UnknownCardPresentedEvent', {
          type: subType,
          crId: device.id,
          ff: ff,
          result: result
        });
      }
    }
  }, {
    key: "handleTxCancelled",
    value: function handleTxCancelled(device) {
      var _this = this;

      Log.warn('TxCancelledListenerInvoked', {
        crId: device.id
      });
      var substitutions = messageHelper.getSubstitutions(this.context);
      var transactionTypeFlagName = this.context.getTransactionTypeFlagName();
      device.display({
        id: _retailPaymentDevice.PaymentDevice.Message[transactionTypeFlagName].Cancelled,
        substitutions: substitutions
      }, function () {
        _this.context.alert = _manticore["default"].alert({
          title: _this.l10n('Tx.Alert.Cancelled.Title'),
          message: _this.l10n('Tx.Alert.Cancelled.Msg'),
          cancel: _this.l10n('Done')
        }, function () {
          _this.context.alert.dismiss();

          _this.context.end(_sdkErrors.transaction.genericCancel);
        });
      });
    }
  }, {
    key: "handleContactlessReaderDeactivated",
    value: function handleContactlessReaderDeactivated(device) {
      var _this2 = this;

      Log.debug(function () {
        return "Contactless reader was deactivated on ".concat(device.id);
      });
      this.context.deviceController.syncOnce(device);
      Log.debug(function () {
        return "Emitting contactlessReaderDeactivated event for ".concat(_this2.context);
      });
      this.context.emit(_transactionEvent["default"].contactlessReaderDeactivated);
    }
  }, {
    key: "_handleCardInsertDetectedEvent",
    value: function _handleCardInsertDetectedEvent(device) {
      this.context.timeoutManager.startTimeoutMonitor('CardInserted');
      Log.debug(function () {
        return "Card insert detected on ".concat(device.id);
      });
      this.context.alert = _manticore["default"].alert({
        title: this.l10n('EMV.DoNotRemove'),
        message: this.l10n('EMV.Processing'),
        showActivity: true,
        replace: true
      }, function () {});

      var messageId = _retailPaymentDevice.PaymentDevice.Message[this.context.getTransactionTypeFlagName()].ProcessingContact;

      device.display({
        id: messageId,
        substitutions: messageHelper.getSubstitutions(this.context)
      }, function () {});
    }
  }, {
    key: "_validateFormFactor",
    value: function _validateFormFactor(card, allowFallbackSwipe) {
      // Only allow fallback swipes for chip cards
      var sActiveFormFactors = this.context.getSetOfActiveFormFactors();

      if (!allowFallbackSwipe && card.chipCard && card.formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
        if (sActiveFormFactors.has(_retailPaymentDevice.FormFactor.Chip)) {
          // TODO Temporary provision that must be removed post certification
          return _sdkErrors.transaction.cannotSwipeChipCard;
        }

        Log.info('AllowFallbackSwipesOnChipCard');
      } // Do not accept card inserts if Chip form factor was not enabled


      if (card.formFactor === _retailPaymentDevice.FormFactor.Chip && !sActiveFormFactors.has(_retailPaymentDevice.FormFactor.Chip)) {
        return _sdkErrors.transaction.mustSwipeCard;
      }

      return null;
    }
  }, {
    key: "_checkAndHandleCardError",
    value: function _checkAndHandleCardError(error, card) {
      if (error) {
        this._handleError(error, card.formFactor, card.reader);

        return true;
      }

      return false;
    }
  }, {
    key: "_handleCardData",
    value: function _handleCardData(cardData) {
      var _this3 = this;

      this.context.timeoutManager.startTimeoutMonitor('CardDataEvent');
      var card = cardData.card;
      Log.debug(function () {
        return "Card presented using form factor: '".concat(Util.getPropertyName(_retailPaymentDevice.FormFactor, card.formFactor), "'");
      });
      this.context.card = card;

      var error = this._validateFormFactor(card, this.context.allowFallBackSwipe);

      if (this._checkAndHandleCardError(error, card)) {
        return;
      }

      (0, _QuickChipAction["default"])(this.context, function (err) {
        var removeQuickChipCard = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

        if (_this3._checkAndHandleCardError(err, card)) {
          return;
        }

        if (card.chipCard && card.formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
          Log.info('AllowingFallbackSwipeOnChipCard');
          card.isMSRFallbackAllowed = true;
        }

        if (card.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless && _this3._isMerchantFromUK()) {
          Log.info('AllowingFallbackSwipesOnChipCard');
          error = _this3._validateNFCContactlessLimit(card.emvData);

          if (error) {
            _this3._handleError(error, card.formFactor, card.reader);

            return;
          }
        } // ToDo: The _isOnlinePINVerificationRequired should be moved to PaymentDevice, so that this calculation's result
        // is already a part of the card object returned by the PaymentDevice implementation.


        if (_this3._isOnlinePINVerificationRequired(card.emvData)) {
          Log.debug('Online PIN authorization required. Will set pinPresent to true');
          _this3.context.pinPresent = true;
        }

        if (!card) {
          Log.error('presented card object is null');
        }

        Log.debug('_handleCardData will start processing card data... remove CardPresentedHandler listeners');

        _this3._removeListeners();

        removeQuickChipCard();

        if (_this3.context.cardPresentedHandler) {
          var _this3$context$alert;

          (_this3$context$alert = _this3.context.alert) === null || _this3$context$alert === void 0 ? void 0 : _this3$context$alert.dismiss();
          delete _this3.context.alert;

          _this3.context.cardPresentedHandler(card);
        } else {
          // Because there are no listeners, we assume you want to just proceed with the
          // transaction and be notified on completion.
          _this3.context.continueWithCard(card);
        }
      });
    }
  }, {
    key: "_isMerchantFromUK",
    value: function _isMerchantFromUK() {
      var merchantCurrency = _Merchant["default"].active.currency;
      return merchantCurrency === 'GBP';
    }
  }, {
    key: "_handlePinEvent",
    value: function _handlePinEvent(pinEvent) {
      var _this4 = this;

      this.context.timeoutManager.startTimeoutMonitor('PinEvent', true);
      Log.debug(function () {
        return "Received PinEvent ".concat((0, _stringify["default"])(pinEvent));
      });

      var promptForPin = function promptForPin() {
        _this4.context.alert = _manticore["default"].alert({
          title: _this4.l10n('Tx.Alert.EnterPin.Title'),
          message: _this4.l10n('Tx.Alert.EnterPin.Message')
        }, function () {});
      };

      if (pinEvent.correct) {
        this.context.pinPresent = true;
      } else if (pinEvent.digits === 0) {
        this.context.pinRequired = true;

        if (this._incorrectPin) {
          this._incorrectPin = false;
          return;
        }

        promptForPin();
      } else if (pinEvent.failureReason) {
        this._incorrectPin = true;
        this.context.alert = _manticore["default"].alert({
          title: this.l10n('Tx.Alert.IncorrectPin.Title'),
          message: this.l10n('Tx.Alert.IncorrectPin.Message'),
          cancel: this.l10n('OK')
        }, promptForPin);
      }
    }
  }, {
    key: "_isOnlinePINVerificationRequired",
    value: function _isOnlinePINVerificationRequired(emvData) {
      var _context3;

      if (!this.context.pinRequired || !emvData.tlvs) {
        return false;
      }

      var cvmResult = (0, _find["default"])(_context3 = emvData.tlvs).call(_context3, _tlvlib.Tags.CardholderVerificationMethodResults);

      if (!cvmResult || !cvmResult.bytes[0]) {
        return false;
      }

      Log.debug(function () {
        return "Checking for online PIN Authorization... Value of bytes[0] for CVM tag is ".concat(cvmResult.bytes[0]);
      }); // CVM codes value for left most byte of 010000 indicates 'Enciphered PIN verified online' event

      return (cvmResult.bytes[0] & 63) === 2;
    }
  }, {
    key: "_validateNFCContactlessLimit",
    value: function _validateNFCContactlessLimit(emvData) {
      var _context4,
          _context5,
          _this5 = this,
          _context8,
          _context9;

      if (!emvData.tlvs) {
        return null;
      }

      Log.debug(function () {
        return "emvData is ".concat(emvData);
      });
      var appResult = (0, _find["default"])(_context4 = emvData.tlvs).call(_context4, _tlvlib.Tags.TerminalApplicationIdentifier);

      if (!appResult || !appResult.bytes) {
        return this._checkNFCLimit();
      }

      var app = appResult.parse().toString('hex');
      Log.info('CheckingAppIdentifier', {
        app: app
      });
      var nfcLimit = null;
      var isMobileWalletTxn = false;

      if ((0, _includes["default"])(_context5 = app.toUpperCase()).call(_context5, 'A00000002501')) {
        var _context6, _context7;

        Log.debug(function () {
          return "UK contactless AMEX: Invoice total ".concat(_this5.context.invoice.total, ".");
        });
        var mctResult = (0, _find["default"])(_context6 = emvData.tlvs).call(_context6, _miuraEmv.MiuraTags.MiuraContactlessType);

        if (!mctResult || !mctResult.bytes) {
          return this._checkNFCLimit();
        }

        var mct = mctResult.parse().toString('hex');

        if (mct === '0403' || mct === '0402') {
          // Mobile EMV or Mobile Mag
          isMobileWalletTxn = true;
        }

        var aipResult = (0, _find["default"])(_context7 = emvData.tlvs).call(_context7, _tlvlib.Tags.ApplicationInterchangeProfile);

        if (aipResult && aipResult.bytes) {
          var aip = aipResult.parse().toString('hex');
          Log.info('UKContactlessAMEX', {
            mct: mct,
            aip: aip
          });
        } else {
          Log.info('UKContactlessAMEXNoAIPTag', {
            mct: mct
          });
        }
      } else if ((0, _includes["default"])(_context8 = app.toUpperCase()).call(_context8, 'A0000000031010') || (0, _includes["default"])(_context9 = app.toUpperCase()).call(_context9, 'A0000000032010')) {
        var _context10; // if visa mobile contactless txns


        var cvmResult = (0, _find["default"])(_context10 = emvData.tlvs).call(_context10, _miuraEmv.MiuraTags.MiuraCardholderVerificationStatus);

        if (!cvmResult || !cvmResult.bytes[0]) {
          return this._checkNFCLimit();
        }

        Log.info('UKContactlessVisa', {
          DF28Tag: cvmResult.bytes[0]
        });

        if (cvmResult.bytes[0] & 0x03) {
          // mobile wallet tx
          isMobileWalletTxn = true;
        }
      } else {
        // Note that the validation logic does not apply to other card types.
        // For MasterCard & Maestro, there is separate config (DF8125) which will handle this. No code/config change needed.
        Log.debug(function () {
          return 'UK contactless non-AMEX nor non-Visa so relying on the device configuration';
        });
        return null;
      }

      Log.debug(function () {
        return "isMobileWalletTxn is ".concat(isMobileWalletTxn);
      });

      if (isMobileWalletTxn) {
        var merchant = _Merchant["default"].active;

        if (!merchant.cardSettings || !merchant.cardSettings.maximum) {
          nfcLimit = merchant.isCertificationMode ? '*' : 5500;
        } else {
          nfcLimit = merchant.isCertificationMode ? '*' : Math.min(5500, _Merchant["default"].active.cardSettings.maximum);
        }
      }

      return this._checkNFCLimit(nfcLimit);
    }
  }, {
    key: "_checkNFCLimit",
    value: function _checkNFCLimit() {
      var _this6 = this;

      var nfcLimit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
      Log.debug(function () {
        var _context11;

        return (0, _concat["default"])(_context11 = "_checkNFCLimit. Invoice total ".concat(_this6.context.invoice.total, ". contactless limit of ")).call(_context11, nfcLimit);
      });
      var merchant = _Merchant["default"].active;

      if (!nfcLimit && merchant.featureMap) {
        nfcLimit = merchant.isCertificationMode ? '*' : merchant.featureMap.CONTACTLESS_LIMIT; // eslint-disable-line no-param-reassign
      }

      var nfcContactlessLogInformation = {
        invoiceTotal: this.context.invoice.total,
        nfcTotalLimit: nfcLimit
      };

      if (nfcLimit !== '*' && this.context.invoice.total.isGreaterThan((0, _paypalInvoicing.$$)(nfcLimit) || 0)) {
        this.context.nfcLimit = nfcLimit;
        Log.error('UKContactlessFailedNFCDueToBeingOverLimit', nfcContactlessLogInformation);
        return _sdkErrors.transaction.nfcContactlessLimitReached;
      }

      Log.info('UKContactlessSuccessfulNFC.', nfcContactlessLogInformation);
      return null;
    }
  }, {
    key: "_handleApplicationSelect",
    value: function _handleApplicationSelect(device, ff, data) {
      var _this7 = this;

      this.context.timeoutManager.startTimeoutMonitor('ApplicationSelect');
      var buttons = [];
      var availableApps = data.availableApps;

      var _iterator = _createForOfIteratorHelper(availableApps.apps),
          _step;

      try {
        for (_iterator.s(); !(_step = _iterator.n()).done;) {
          var app = _step.value;
          buttons.push(Buffer.from(app[1] || app[0]).toString());
        }
      } catch (err) {
        _iterator.e(err);
      } finally {
        _iterator.f();
      }

      var onCardRemoved = function onCardRemoved() {
        return _this7._handleError(_retailPaymentDevice.deviceError.smartCardNotInSlot, _retailPaymentDevice.FormFactor.Chip, device);
      };

      device.once(_retailPaymentDevice.PaymentDevice.Event.cardRemoved, onCardRemoved);
      this.context.alert = _manticore["default"].alert({
        title: this.l10n('EMV.Select'),
        buttons: buttons,
        replace: true
      }, function (error, ix) {
        var applicationId = availableApps.apps[ix][0];
        var applicationName = availableApps.apps[ix][1];
        Log.info('UserSelectedApp', {
          id: _this7.context.id,
          appId: applicationId,
          name: applicationName
        });
        _this7.context.alert = _manticore["default"].alert({
          title: _this7.l10n('EMV.DoNotRemove'),
          message: _this7.l10n('EMV.Processing'),
          showActivity: true,
          replace: true
        }, function () {});
        device.removeListener(_retailPaymentDevice.PaymentDevice.Event.cardRemoved, onCardRemoved);
        device.selectPaymentApplication(applicationId, data.card);
      });
    }
  }, {
    key: "_handleError",
    value: function _handleError(error, ff, pd) {
      var _this8 = this;

      Log.debug('Handling error', {
        error: error
      });
      this._lastEvent = error;

      if (!(_retailPaymentDevice.deviceError.contactlessPaymentAbortedByCardInsert.equals(error) || _retailPaymentDevice.deviceError.contactlessPaymentAbortedByCardSwipe.equals(error) || _sdkErrors.transaction.cannotSwipeChipCard.equals(error) || _retailPaymentDevice.deviceError.seePhone.equals(error))) {
        this._removeListeners();

        Log.error('TxFailed', {
          error: error
        });
      }

      if (_sdkErrors.transaction.cardRemovedBeforeRead.equals(error) && pd) {
        Log.debug('Reset card presented for cardRemovedBeforeRead', function () {
          return {
            cardPresented: pd.cardPresented
          };
        });
        pd.cardPresented = false;
      }

      var errorHandler = new _PaymentErrorHandler["default"](this.context);
      errorHandler.handle(error, ff, pd, function (action, opt) {
        return _this8.context.processErrorHandlerResponse(error, action, ff, opt);
      });
    }
  }, {
    key: "_logErrorEventHandler",
    value: function _logErrorEventHandler(error, ff, device) {
      if (_sdkErrors.transaction.cardRemovedBeforeRead.equals(error)) {
        // We do not want to track this expected event
        Log.developer('Ignore cardRemovedBeforeRead after listeners removed');
        return;
      }

      Log.track('ErrorEventAfterListenersRemoved', {
        err: (0, _stringify["default"])(error),
        ff: Util.getPropertyName(_retailPaymentDevice.FormFactor, ff),
        context: this.context,
        lastEvent: this._lastEvent,
        deviceModel: (device === null || device === void 0 ? void 0 : device.model) || 'None'
      });
    }
  }, {
    key: "_logSubtypeEventHandler",
    value: function _logSubtypeEventHandler(subType, ff, result, device) {
      Log.track('SubtypeEventAfterListenersRemoved', {
        subType: Util.getPropertyName(_retailPaymentDevice.CardPresentEvent, subType),
        ff: Util.getPropertyName(_retailPaymentDevice.FormFactor, ff),
        context: this.context,
        lastEvent: this._lastEvent,
        deviceModel: (device === null || device === void 0 ? void 0 : device.model) || 'None'
      });
    }
  }, {
    key: "_removeListeners",
    value: function _removeListeners() {
      var _context12,
          _this9 = this,
          _context14,
          _context15;

      (0, _forEach["default"])(_context12 = (0, _values["default"])(CardPresentedHandler.Event)).call(_context12, function (event) {
        var _context13;

        return (0, _forEach["default"])(_context13 = _this9.eventHandler.listeners(event)).call(_context13, function (listener) {
          Log.debug(function () {
            return "Removing listener for event ".concat(event);
          });

          _this9.eventHandler.removeListener(event, listener);
        });
      });
      this.eventHandler.on(CardPresentedHandler.Event.error, (0, _bind["default"])(_context14 = this._logErrorEventHandler).call(_context14, this));
      this.eventHandler.on(CardPresentedHandler.Event.subtype, (0, _bind["default"])(_context15 = this._logSubtypeEventHandler).call(_context15, this));
    }
  }]);
  return CardPresentedHandler;
}();

exports["default"] = CardPresentedHandler;
CardPresentedHandler.Event = {
  error: 'error',
  subtype: 'subtype'
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../flows/PaymentErrorHandler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/PaymentErrorHandler.js","../flows/messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./QuickChipAction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/QuickChipAction.js","./transactionEvent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionEvent.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/values.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/miura-emv":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/DeviceController.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.exec.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _flatMap = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/flat-map"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _events = require("events");

var _manticoreUtil = require("manticore-util");

var _CardPresentedHandler = _interopRequireDefault(require("./CardPresentedHandler"));

var _DeviceSelector = _interopRequireDefault(require("../paymentDevice/DeviceSelector"));

var _InvoiceSynchronizer = _interopRequireDefault(require("./InvoiceSynchronizer"));

var _sdkErrors = require("../common/sdkErrors");

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _messageHelper = require("../flows/messageHelper");

var _retailSDKUtil = require("../common/retailSDKUtil");

var _transactionStates = require("./transactionStates");

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context4;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context4 = Object.prototype.toString.call(o)).call(_context4, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty2(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context2, _context3;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(source), !0)).call(_context2, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context3 = ownKeys(Object(source))).call(_context3, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('transactionContext.deviceController');
/**
 * DeviceController is responsible for maintaining the state of devices used in a transaction.
 * It tracks the state of each device, form factors and provides methods to
 * activate/deactivate the devices
 */

var DeviceController = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(DeviceController, _EventEmitter);

  var _super = _createSuper(DeviceController);

  function DeviceController(context) {
    var _this;

    (0, _classCallCheck2["default"])(this, DeviceController);
    _this = _super.call(this);
    _this.context = context;
    _this.activeDevices = new _set["default"]();
    _this._invoiceSynchronizer = new _InvoiceSynchronizer["default"](context, (0, _assertThisInitialized2["default"])(_this));

    _this._invoiceSynchronizer.start();

    _this.listenerIds = [];
    return _this;
  }
  /**
   * List of all devices that are available for the transaction.
   * (Not all available devices will be approved for the transaction.
   * The filter criteria to determine an approved device is defined in
   * `DeviceManager.availabilityFilter` )
   */


  (0, _createClass2["default"])(DeviceController, [{
    key: "devices",
    get: function get() {
      return this.context.paymentDevices || _retailPaymentDevice.PaymentDevice.devices;
    }
    /**
     * Returns a set of form factors approved for the current transaction
     * @param {[FormFactor]} preferredFormFactors List of form factors preferred for the given transaction
     * @returns {[FormFactor]} List of form factors approved for this transaction
     */

  }, {
    key: "getApprovedFormFactors",
    value: function getApprovedFormFactors(preferredFormFactors) {
      var _context;

      var availableDevices = (0, _filter["default"])(_context = this.devices).call(_context, function (pd) {
        return pd.isReadyForTransaction().isReady;
      });
      var sAvailableFormFactors = new _set["default"]((0, _flatMap["default"])(availableDevices).call(availableDevices, function (pd) {
        return pd.formFactors;
      }));

      if (sAvailableFormFactors.has(_retailPaymentDevice.FormFactor.EmvCertifiedContactless)) {
        if (this._isNFCContactlessLimitReached()) {
          sAvailableFormFactors["delete"](_retailPaymentDevice.FormFactor.EmvCertifiedContactless);
        }
      }

      return (preferredFormFactors === null || preferredFormFactors === void 0 ? void 0 : preferredFormFactors.length) > 0 ? (0, _filter["default"])(preferredFormFactors).call(preferredFormFactors, function (ff) {
        return sAvailableFormFactors.has(ff);
      }) : (0, _toConsumableArray2["default"])(sAvailableFormFactors);
    }
  }, {
    key: "_isNFCContactlessLimitReached",
    value: function _isNFCContactlessLimitReached() {
      if (this._isMerchantFromUK()) {
        // for UK merchants, the check will be after getting card info in CardPresentedHandler._validateNFCContactlessLimit
        // the contactless limit for mobile txns is set to be 5500
        return false;
      }

      var merchant = _Merchant["default"].active;

      if (merchant.featureMap) {
        var nfcLimit = merchant.isCertificationMode ? '*' : merchant.featureMap.CONTACTLESS_LIMIT;

        if (nfcLimit !== '*' && this.context.invoice.total.isGreaterThan((0, _paypalInvoicing.$$)(nfcLimit) || 0)) {
          Log.debug('Cannot perform NFC:', {
            total: this.context.invoice.total,
            nfcLimit: nfcLimit
          });
          return true;
        }
      }

      return false;
    }
  }, {
    key: "_isMerchantFromUK",
    value: function _isMerchantFromUK() {
      var merchantCurrency = _Merchant["default"].active.currency;
      return merchantCurrency === 'GBP';
    }
    /**
     * Gets the selected device
     */

  }, {
    key: "selectedDevice",
    get: function get() {
      return _DeviceSelector["default"].selectedDevice;
    }
  }, {
    key: "cardInsertDetected",
    value: function cardInsertDetected() {
      if (_DeviceSelector["default"].selectedDevice) {
        this._cardPresentedHandlers.handleCardPresent(null, _retailPaymentDevice.CardPresentEvent.insertDetected, _retailPaymentDevice.FormFactor.Chip, null, _DeviceSelector["default"].selectedDevice);
      }
    }
    /**
     * Activates the devices that are available for payment. The provided callback
     * will be invoked with the activated devices. The devices that failed activation
     * would be notified.
     * @param {object} opt Configuration options with following properties
     *   showPrompt    - true to show payment prompt on card reader display (if available)
     *    formFactors   - List of payment form factors that needs to be activated.
     *                    Will be defaulted to `this.formFactors`
     *    syncInvoiceTotal - true to synchronize invoice total on card reader display
     *    03/11/2019 - DE117228 - got rid of syncInvoiceTotal
     *    There is no need to start InvoiceSynchronizer since it is started already in the constructor
     */

  }, {
    key: "activate",
    value: function activate(opt) {
      var _this2 = this;

      var showPrompt = opt.showPrompt,
          formFactors = opt.formFactors;
      var device = _DeviceSelector["default"].selectedDevice;
      Log.debug('Begin device activation', function () {
        return {
          contextId: _this2.context.id,
          amount: _this2.context.invoice.total
        };
      });

      if (!device) {
        Log.warn('ExitingDeviceActivationAsDeviceNotSet', function () {
          return {
            contextId: _this2.context.id
          };
        });
        return {
          error: _sdkErrors.transaction.noFunctionalDevices
        };
      }

      Log.debug('Continue device activation', function () {
        return {
          contextId: _this2.context.id,
          amount: _this2.context.invoice.total,
          deviceId: device.id
        };
      });
      var approvedFormFactors = this.getApprovedFormFactors(formFactors);
      var error = this.updateDeviceDisplay(!(0, _includes["default"])(approvedFormFactors).call(approvedFormFactors, _retailPaymentDevice.FormFactor.EmvCertifiedContactless) && showPrompt, function () {}, new _set["default"](approvedFormFactors));

      if (error) {
        Log.error('Error in updateDeviceDisplay on activate', {
          error: error
        });
        return {
          error: error
        };
      }

      device.stopPollForBattery(); // Will restart battery poll on tx.end();

      this.removeListenerOnDevice(device);
      this._cardPresentedHandlers = new _CardPresentedHandler["default"](this.context);

      this._addListener(device, _retailPaymentDevice.PaymentDevice.Event.cardPresented, function (err, subType, ff, result) {
        device.cardPresented = true;

        if (!err) {
          // The invoice synchronization should be stopped so that the 'Processing...' display message on the card reader is not replaced with invoice amount
          // This is specifically needed for in-app tipping for M010. Without this, the 'Processing...' message gets replaced with invoice total
          _this2._invoiceSynchronizer.stop();
        }

        _this2._cardPresentedHandlers.handleCardPresent(err, subType, ff, result, device);
      }); // Card removed between insert and read card data


      this._addListener(device, _retailPaymentDevice.PaymentDevice.Event.cardRemoved, function () {
        _this2._cardPresentedHandlers.handleCardPresent(_sdkErrors.transaction.cardRemovedBeforeRead, undefined, undefined, undefined, device);
      });

      this._addListener(device, _retailPaymentDevice.PaymentDevice.Event.cancelled, function () {
        return _this2._cardPresentedHandlers.handleTxCancelled(device);
      });

      this._addListener(device, _retailPaymentDevice.PaymentDevice.Event.contactlessReaderDeactivated, function () {
        return _this2._cardPresentedHandlers.handleContactlessReaderDeactivated(device);
      });

      this._addListener(device, _retailPaymentDevice.PaymentDevice.Event.deviceRemoved, function () {
        if (_this2.context.getPaymentState() === _transactionStates.PaymentState.inProgress || _this2.context.getPaymentState() === _transactionStates.PaymentState.retry) {
          Log.debug('deviceRemoved, handle error', {
            paymentState: _this2.context.getPaymentState()
          });

          _this2._cardPresentedHandlers._handleError(_retailPaymentDevice.deviceError.deviceNotConnected, _retailPaymentDevice.FormFactor.None, device);
        } else {
          Log.debug('deviceRemoved, do nothing', {
            paymentState: _this2.context.getPaymentState()
          });
        }
      });

      if (device.cardPresented === false || this.context.getPaymentState() === _transactionStates.PaymentState.retry) {
        Log.info('ActivatingDevice', function () {
          return {
            contextId: _this2.context.id,
            deviceId: device.id,
            formFactors: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, approvedFormFactors),
            showPrompt: showPrompt
          };
        });
        device.cardInsertedHandler = this.context.cardInsertedHandler;
        device.activateForPayment(this.context, approvedFormFactors, showPrompt);
        this.activeDevices.add(device);
        Log.debug('Device activated', function () {
          return {
            deviceId: device.id,
            formFactors: approvedFormFactors
          };
        });
      }

      return {
        device: device,
        formFactors: approvedFormFactors
      };
    }
  }, {
    key: "updateDeviceDisplay",
    value: function updateDeviceDisplay(showPrompt) {
      var displayCb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      var approvedFormFactors = arguments.length > 2 ? arguments[2] : undefined;

      var _getDeviceErrorWithId = (0, _retailSDKUtil.getDeviceErrorWithId)(_DeviceSelector["default"].selectedDevice, showPrompt, approvedFormFactors),
          error = _getDeviceErrorWithId.error,
          opt = _getDeviceErrorWithId.opt;

      var transactionAmount = this.context.transactionAmount;
      Log.debug('error', {
        error: error,
        transactionAmount: transactionAmount,
        opt: opt,
        showPrompt: showPrompt
      });

      if (error || showPrompt) {
        opt.substitutions = _objectSpread(_objectSpread({}, opt.substitutions), (0, _messageHelper.getSubstitutions)(this.context));

        _DeviceSelector["default"].selectedDevice.display(opt, displayCb);

        Log.debug('updateDeviceDisplay', {
          transactionAmount: transactionAmount
        });
      } else {
        Log.debug('skip updateDeviceDisplay', {
          transactionAmount: transactionAmount
        });
      }

      return error;
    }
  }, {
    key: "syncOnce",
    value: function syncOnce(device) {
      this._invoiceSynchronizer.pushOnce(device || _DeviceSelector["default"].selectedDevice, this.context.invoice.total, function () {});
    }
  }, {
    key: "abort",
    value: function abort() {
      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      this._invoiceSynchronizer.stop();

      this.removeListeners();
      var pd = _DeviceSelector["default"].selectedDevice;

      if (!pd) {
        Log.debug('AbortingTx', {
          id: this.context.id
        });
        cb();
        return;
      }

      Log.debug('AbortingTx', {
        id: this.context.id,
        crId: pd.id,
        ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, (0, _toConsumableArray2["default"])(pd.getSetOfActiveFormFactors()))
      });
      pd.abortTransaction(this.context, function () {
        var _getDeviceErrorWithId2 = (0, _retailSDKUtil.getDeviceErrorWithId)(pd),
            opt = _getDeviceErrorWithId2.opt;

        Log.debug('abortTransaction display options', opt);
        pd.display(opt, function () {
          cb(pd);
        });
        Log.debug('abortTransaction display options sent');
      });
    }
  }, {
    key: "deactivateFormFactors",
    value: function deactivateFormFactors(formFactors) {
      var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

      if (_DeviceSelector["default"].selectedDevice) {
        _DeviceSelector["default"].selectedDevice.deactivateFormFactors(formFactors, function () {
          return cb(_DeviceSelector["default"].selectedDevice);
        });
      } else {
        Log.debug('Will not deactivate tx as no device selected! Will immediately invoke callback');
        cb();
      }
    }
  }, {
    key: "syncInvoice",
    value: function syncInvoice() {
      this._invoiceSynchronizer.start();
    }
  }, {
    key: "stopInvoiceSync",
    value: function stopInvoiceSync() {
      this._invoiceSynchronizer.stop();
    }
  }, {
    key: "_addListener",
    value: function _addListener(pd, event, listener) {
      listener.id = this.context.id;
      this.listenerIds.push([event, listener]);
      pd.on(event, listener);
    }
    /**
     * Removes transaction context listeners on the payment device
     * @param devices
     */

  }, {
    key: "removeListeners",
    value: function removeListeners() {
      var devices = _retailPaymentDevice.PaymentDevice.devices;

      var _iterator = _createForOfIteratorHelper(devices),
          _step;

      try {
        for (_iterator.s(); !(_step = _iterator.n()).done;) {
          var pd = _step.value;
          this.removeListenerOnDevice(pd);
        }
      } catch (err) {
        _iterator.e(err);
      } finally {
        _iterator.f();
      }

      this.listenersAddedTo = null;
    }
  }, {
    key: "removeListenerOnDevice",
    value: function removeListenerOnDevice(pd) {
      pd.removeGroupedListeners(this.listenerIds);
    }
  }]);
  return DeviceController;
}(_events.EventEmitter);
/**
 * Enumeration indicating possible device availability filter criterias
 * @type {{BatteryStatus: number, SoftwareUpdate: number}}
 */


exports["default"] = DeviceController;
DeviceController.FilterCriteria = {
  Ready: 'Ready',
  BatteryStatus: 'BatteryStatus',
  SoftwareUpdate: 'SoftwareUpdate'
};

},{"../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../flows/messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","../paymentDevice/DeviceSelector":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceSelector.js","./CardPresentedHandler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/CardPresentedHandler.js","./InvoiceSynchronizer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/InvoiceSynchronizer.js","./transactionStates":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionStates.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/flat-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flat-map.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/DeviceManager.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-timeout"));

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _moment = _interopRequireDefault(require("moment"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _events = require("events");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _DeviceSelector = _interopRequireDefault(require("../paymentDevice/DeviceSelector"));

var _DeviceScanner = _interopRequireDefault(require("../paymentDevice/DeviceScanner"));

var _DeviceConnector = _interopRequireDefault(require("../paymentDevice/DeviceConnector"));

var _ReaderConfiguration = _interopRequireDefault(require("../paymentDevice/ReaderConfiguration"));

var _sdkErrors = require("../common/sdkErrors");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('DeviceManager');
/**
 * DeviceManager is responsible for exposing APIs regarding the devices.
 * Currently, you can use DeviceManager to prompt the List to select the device
 * or set/get the active device.
 * @class
 */

var DeviceManager = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(DeviceManager, _EventEmitter);

  var _super = _createSuper(DeviceManager);
  /**
   * Construct a new DeviceManger
   * @private
   */


  function DeviceManager() {
    var _this;

    (0, _classCallCheck2["default"])(this, DeviceManager);
    _this = _super.call(this);

    _DeviceScanner["default"].Events.on(_DeviceScanner["default"].Event.lastActiveReaderFound, function (lastActiveReaderName) {
      Log.debug(function () {
        return "Last active reader id: ".concat(lastActiveReaderName);
      });
      _this._lastActiveBluetoothReaderId = lastActiveReaderName;
    });

    _DeviceScanner["default"].Events.once(_DeviceScanner["default"].Event.constructor, function (scanner) {
      _this.scanner = scanner;
    });

    _DeviceScanner["default"].Events.on(_DeviceScanner["default"].Event.launchMCR, function () {
      return _this.searchAndConnect();
    });

    _DeviceScanner["default"].Events.on(_DeviceScanner["default"].Event.connectToDiscoveredDevice, function (discoveredDevice) {
      return _this.searchAndConnectWithConfig(_ReaderConfiguration["default"].forOne(discoveredDevice), function (error) {
        return Log.debug('Connected to discovered device', {
          error: error
        });
      });
    });

    _retailPaymentDevice.PaymentDevice.Events.on(_retailPaymentDevice.PaymentDevice.Event.deviceDiscovered, function (device) {
      return _this.emit(_retailPaymentDevice.PaymentDevice.Event.deviceDiscovered, device);
    });

    _this._searchAndConnectLastCalledAt = (0, _moment["default"])('2001-01-13T11:11:10.000Z');
    _this._successiveCallGap = 700;
    _this._autoConnectCB = undefined;
    return _this;
  }

  (0, _createClass2["default"])(DeviceManager, [{
    key: "_isAutoConnectInProgress",
    value: function _isAutoConnectInProgress() {
      return !!this._autoConnectCB;
    }
    /**
     * @private
     * @param {moment.Moment} lastCalledAt
     * @param {number} successiveCallGap
     * @returns {{error: (*|PayPalError), lastCalledAt: moment.Moment}}
     */

  }, {
    key: "_getTiming",
    value: function _getTiming(lastCalledAt, successiveCallGap) {
      var _duration = (0, _moment["default"])().diff(lastCalledAt, 'ms', true);

      if (_duration < successiveCallGap) {
        return {
          error: _sdkErrors.sdk.rapidSuccessiveCall.withDevMessage(successiveCallGap - _duration),
          lastCalledAt: lastCalledAt
        };
      }

      return {
        lastCalledAt: (0, _moment["default"])()
      };
    }
  }, {
    key: "_checkTimeToCall",
    value: function _checkTimeToCall(f) {
      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

      var _this$_getTiming = this._getTiming(this._searchAndConnectLastCalledAt, this._successiveCallGap),
          error = _this$_getTiming.error,
          lastCalledAt = _this$_getTiming.lastCalledAt;

      if (error) {
        callback(error);
        return;
      }

      this._searchAndConnectLastCalledAt = lastCalledAt;
      f();
    }
  }, {
    key: "getDeviceScanner",
    value: function getDeviceScanner() {
      return this.scanner;
    }
    /**
     * Utility method to check if search and connect APIs should be invoked again if an error is returned on previous
     * invocation.
     * @param {error} error Error returned by DeviceManager APIs
     * @returns {bool}
     */

  }, {
    key: "shouldStopScanning",
    value: function shouldStopScanning(error) {
      return this.getDeviceScanner() ? this.getDeviceScanner().canStopScanningOnError(error) : true;
    }
    /**
     * Method to help auto-connect with retries
     * @private
     * @param {ReaderConfiguration} readerConfig
     * @param {number} _retries
     * @param {DeviceManager~connection} callback
     */

  }, {
    key: "_searchAndConnectWithRetries",
    value: function _searchAndConnectWithRetries(readerConfig, _retries, callback) {
      var _this2 = this,
          _context; // Step 1: Store the original callback while no connection attempts have been made.


      if (_retries === 3) {
        this._autoConnectCB = callback;
      } // Step 3: If unsuccessful in connecting then retry.


      var _callback = function _callback(error, paymentDevice) {
        var shouldRetry = !(_this2.shouldStopScanning(error) || _this2.scanner.stopIssued); // Calling it asynchronously so as to not stack the calls

        (0, _setTimeout2["default"])(function () {
          if (error && shouldRetry && _retries > 1) {
            _this2._searchAndConnectWithRetries(readerConfig, _retries - 1, _this2._autoConnectCB);

            return;
          }

          Log.info('Invoking IA provided callback');
          var cb = _this2._autoConnectCB;
          _this2._autoConnectCB = undefined;
          cb(error, paymentDevice);
        }, 0);
      }; // If timing isn't good (Step 2), then call again at a good time.


      var _checkTimeToCallCB = function _checkTimeToCallCB(error) {
        if (_sdkErrors.sdk.rapidSuccessiveCall.equals(error)) {
          _this2._scheduledAutoConnect = (0, _setTimeout2["default"])(function () {
            return _this2._searchAndConnectWithRetries(readerConfig, _retries, _this2._autoConnectCB);
          }, error.developerMessage + 1);
        }
      }; // Step 2: Check last call time. If timing is good then call searchAndConnect.


      this._checkTimeToCall((0, _bind["default"])(_context = this.scanner.searchAndConnect).call(_context, this.scanner, {
        readerConfig: readerConfig,
        callback: _callback
      }), _checkTimeToCallCB);
    }
  }, {
    key: "_defaultEndScanningCb",
    value: function _defaultEndScanningCb() {
      Log.debug('Default _endScanningCb');
    }
    /**
     * Search for readers according to the passed reader configuration
     * @nativeName searchAndConnect
     * @param {ReaderConfiguration} readerConfig
     * @param {DeviceManager~connection} callback
     */

  }, {
    key: "searchAndConnectWithConfig",
    value: function searchAndConnectWithConfig(readerConfig) {
      var _this3 = this;

      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

      if (this.scanner) {
        var cbWithEndScan = function cbWithEndScan(error, reader) {
          Log.debug('cbWithEndScan');
          var endScanningCb = _this3._endScanningCb || _this3._defaultEndScanningCb;
          delete _this3._endScanningCb;
          endScanningCb();
          callback(error, reader);
        };

        Log.debug('searchAndConnectWithConfig', {
          shouldAutoConnect: readerConfig === null || readerConfig === void 0 ? void 0 : readerConfig.shouldAutoConnect(),
          isAutoConnectInProgress: this._isAutoConnectInProgress(),
          scanStopped: !!this._scanStopped
        });

        if (readerConfig !== null && readerConfig !== void 0 && readerConfig.shouldAutoConnect() && !this._isAutoConnectInProgress()) {
          this._searchAndConnectWithRetries(readerConfig, 3, cbWithEndScan);
        } else if (readerConfig !== null && readerConfig !== void 0 && readerConfig.shouldAutoConnect() && this._isAutoConnectInProgress()) {
          // Implement Queueing of callbacks here
          cbWithEndScan(_sdkErrors.sdk.selectionInProgress, undefined);
        } else if (this._isAutoConnectInProgress()) {
          this._endScanningCb = function () {
            Log.debug('searchAndConnectWithConfig after stop scan');

            _this3.searchAndConnectWithConfig(readerConfig, callback);
          };

          Log.debug('stop scanning', {
            inProgress: this.scanner._searchAndConnectInProgress,
            scheduledAutoConnect: !!this._scheduledAutoConnect,
            autoConnectCB: !!this._autoConnectCB
          });

          if (this.scanner._searchAndConnectInProgress) {
            this._stopScanning(_sdkErrors.sdk.stoppingAutoConnect); // Stop any active auto-connect

          } else {
            if (this._scheduledAutoConnect !== undefined && this._scheduledAutoConnect !== null) {
              clearTimeout(this._scheduledAutoConnect); // Clear any pending auto-connect call
            }

            var endScanningCb = this._endScanningCb;
            var autoConnectCB = this._autoConnectCB;
            this._autoConnectCB = undefined;
            this._endScanningCb = undefined; // Possibly start the search first from endScanningCB, followed by autoConnectCB.

            endScanningCb();
            autoConnectCB(_sdkErrors.sdk.stoppingAutoConnect);
          }
        } else {
          this.scanner.searchAndConnect({
            readerConfig: readerConfig,
            callback: cbWithEndScan
          });
        }
      } else {
        callback(_sdkErrors.sdk.cardReaderScannerNotInitialized, undefined);
      }
    }
    /**
    * Show a list of connected credit card readers.
    * If there is more than 1 devices. Select one of them to use it
    * for transaction.
    * @param {DeviceManager~connection} callback
    */

  }, {
    key: "searchAndConnect",
    value: function searchAndConnect() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      this.searchAndConnectWithConfig(new _ReaderConfiguration["default"](), callback);
    }
    /**
     * Show a list of connected credit card readers.
     * If there is more than 1 devices. Select one of them to use it
     * for transaction.
     */

  }, {
    key: "searchAndConnectWithoutCallback",
    value: function searchAndConnectWithoutCallback() {
      // Can the IA instead use searchAndConnect without passing a callback?
      this.searchAndConnect(undefined);
    }
    /**
     * Try connecting to the last active credit card reader
     * @param {DeviceManager~connection} callback
     */

  }, {
    key: "connectToLastActiveReader",
    value: function connectToLastActiveReader() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      _DeviceConnector["default"].connectToLastActiveReaderOrFindAnother(callback);
    }
    /**
     * Tries to connect to the Bluetooth reader with the specified name. If no name is passed then connection to first
     * discovered bluetooth reader is attempted.
     * To check if this API should be invoked again on receiving an error use {@link #shouldStopScanning}
     * To stop an ongoing scan use {@link #stopScanningForBluetoothReaders}
     * @param {string} readerName The name of the Bluetooth reader that the app last successfully connected to.
     * @param {DeviceManager~connection} callback
     */

  }, {
    key: "scanAndAutoConnectToBluetoothReader",
    value: function scanAndAutoConnectToBluetoothReader(readerName) {
      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

      var readerConfig = _ReaderConfiguration["default"].forOne({
        name: readerName,
        connectionType: _retailPaymentDevice.readerConnectionType.bluetooth
      }).setAutoConnect(true);

      this.searchAndConnectWithConfig(readerConfig, callback);
    }
    /**
     * Sets the active reader
     * @param {PaymentDevice} pd The device that is to be set to Active
     */

  }, {
    key: "setActiveReader",
    value: function setActiveReader(pd) {
      if (pd) {
        _DeviceSelector["default"].selectDevice(pd.id);
      } else {
        Log.warn('paymentDeviceCannotBeNull');
      }
    }
    /**
     * checks if any Miura device is connected
     * @returns {bool} Returns the bool if any miura device connected
     */

  }, {
    key: "isConnectedToMiura",
    value: function isConnectedToMiura() {
      return _DeviceSelector["default"].isConnectedToMiura();
    }
    /**
     * Returns the selected device
     * @returns {PaymentDevice} Returns the payment device that is selected
     */

  }, {
    key: "getActiveReader",
    value: function getActiveReader() {
      return _DeviceSelector["default"].selectedDevice;
    }
    /**
     * Get a list of paired/discovered devices
     * @returns {[PaymentDevice]} Devices list
     */

  }, {
    key: "getDiscoveredDevices",
    value: function getDiscoveredDevices() {
      return _retailPaymentDevice.PaymentDevice.devices;
    }
    /**
     * Get the name of last active reader
     * @returns {string} Device name
     */

  }, {
    key: "getLastActiveBluetoothReader",
    value: function getLastActiveBluetoothReader() {
      return this._lastActiveBluetoothReaderId;
    }
    /**
     * Get a list of paired devices
     * @param {DeviceManager~pairedBTDevices} callback
     */

  }, {
    key: "getPairedBluetoothDevices",
    value: function getPairedBluetoothDevices(callback) {
      if (this.getDeviceScanner()) {
        this.getDeviceScanner().getPairedBluetoothDevices(callback);
      }
    }
    /**
    * Stop scanning for Bluetooth devices
    * Use this API in conjunction with {@link #scanAndAutoConnectToBluetoothReader}
    */

  }, {
    key: "stopScanningForBluetoothReaders",
    value: function stopScanningForBluetoothReaders() {
      this._stopScanning();
    }
  }, {
    key: "_stopScanning",
    value: function _stopScanning(error) {
      var _this$getDeviceScanne;

      (_this$getDeviceScanne = this.getDeviceScanner()) === null || _this$getDeviceScanne === void 0 ? void 0 : _this$getDeviceScanne.stopScanning(error);
    }
  }]);
  return DeviceManager;
}(_events.EventEmitter);
/**
 * A constructed PaymentDevice instance on which a connection will be attempted. For further events,
 * such as device readiness, removal or the need for a software upgrade, your application should subscribe
 * to the relevant events on the device parameter. Please note that this doesn't always mean the device is present.
 * In certain cases (e.g. Bluetooth) we may know about the device independently of whether it's currently connected or available.
 * @event DeviceManager#deviceDiscovered
 * @param {PaymentDevice} device The device that has been discovered.
 */

/**
 * The callback invoked while connecting to the last active card reader
 * @callback DeviceManager~connection
 * @param {error} error Error reported while connecting to a card reader
 * @param {PaymentDevice} cardReader Card reader which was successfully connected to
 */

/**
 * The callback invoked while getting the list of paired devices
 * @callback DeviceManager~pairedBTDevices
 * @param {[PaymentDevice]} pairedDevices List of Bluetooth paired devices
 */


var deviceManager = new DeviceManager(); // eslint-disable-line no-unused-vars

var _default = deviceManager;
exports["default"] = _default;

},{"../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../paymentDevice/DeviceConnector":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceConnector.js","../paymentDevice/DeviceScanner":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceScanner.js","../paymentDevice/DeviceSelector":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceSelector.js","../paymentDevice/ReaderConfiguration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/ReaderConfiguration.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/set-timeout":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/DigitalCardInfo.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var util = _interopRequireWildcard(require("manticore-util"));

var _retailSDKUtil = require("../common/retailSDKUtil");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}
/**
 * Information about the Digital Card that was used for this transaction
 * @class
 * @property {string} code Holds the actual code that was used for this digital card transaction  @readonly
 * @property {string} currency Currency of the digital card transaction  @readonly
 * @property {decimal} redeemedAmount Amount that was successfully redeemed from the code used @readonly
 * @property {decimal} balanceAmount Balance amount that is available after redemption @readonly
 */


var DigitalCardInfo = /*#__PURE__*/(0, _createClass2["default"])(function DigitalCardInfo(data) {
  (0, _classCallCheck2["default"])(this, DigitalCardInfo);

  if (data) {
    util.assignSome(this, data, ['code']);
  }

  if (data.redeemedAmount) {
    // redeemedAmount will not present for invalid offer
    this.currency = data.redeemedAmount.currency_code;
    this.redeemedAmount = (0, _retailSDKUtil.asBigNumber)(data.redeemedAmount.value);
    this.balanceAmount = (0, _retailSDKUtil.asBigNumber)(data.balanceAmount.value);
  }
});
exports["default"] = DigitalCardInfo;

},{"../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/InvoiceSynchronizer.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.exec.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _splice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/splice"));

var _is = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/is"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticore = _interopRequireDefault(require("manticore"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _events = require("events");

var _transactionEvent = _interopRequireDefault(require("./transactionEvent"));

var _CardReaderDisplayController = _interopRequireDefault(require("../paymentDevice/CardReaderDisplayController"));

var _displayPriority = _interopRequireDefault(require("../paymentDevice/displayPriority"));

var _retailSDKUtil = require("../common/retailSDKUtil");

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e2) {
          throw _e2;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e3) {
      didErr = true;
      err = _e3;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context13;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context13 = Object.prototype.toString.call(o)).call(_context13, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var InvoiceEvent = _paypalInvoicing.Invoice.event;
var Log = (0, _manticoreLog["default"])('transactionContext.invoiceSynchronizer');
var syncInvoice = true; // TODO: This is just hack for now. Need to come up with a better strategy.

/**
 * InvoiceSynchronizer is responsible for synchoronizing the invoice with the transaction.
 * Whenever the invoice total changes, it will trigger the total changed event which will
 * eventually update the device display
 */

var InvoiceSynchronizer = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(InvoiceSynchronizer, _EventEmitter);

  var _super = _createSuper(InvoiceSynchronizer);

  function InvoiceSynchronizer(context, deviceController) {
    var _this;

    (0, _classCallCheck2["default"])(this, InvoiceSynchronizer);
    _this = _super.call(this);
    _this.context = context;
    _this.invoice = context.invoice;
    _this.deviceController = deviceController;
    _this._preferredFormFactors = new _set["default"]();
    return _this;
  }
  /**
   * Begin syncing invoice.total with the device display
   */


  (0, _createClass2["default"])(InvoiceSynchronizer, [{
    key: "start",
    value: function start() {
      var _this2 = this;

      if (!this.invoice) {
        Log.error('InvoiceSyncFailedAsNoInvoice.', {
          id: this.context.id,
          crId: this.deviceController.selectedDevice ? this.deviceController.selectedDevice.id : '(no device selected)'
        });
        return;
      }

      if (this.context.isTransactionVaultOnly) {
        Log.info('InvoiceSyncFailedForVaultOnly', {
          id: this.context.id,
          crId: this.deviceController.selectedDevice ? this.deviceController.selectedDevice.id : '(no device selected)'
        });
        return;
      }

      syncInvoice = true;

      try {
        Log.debug(function () {
          var _context, _context2;

          return (0, _concat["default"])(_context = (0, _concat["default"])(_context2 = "Starting invoice sync on ".concat(_this2.deviceController.selectedDevice ? _this2.deviceController.selectedDevice.id : '(no device selected)', " for invoice total ")).call(_context2, _this2.invoice.total, ". context.id: ")).call(_context, _this2.context.id);
        });
        var amount = this.context.isRefund() ? this.context.refundAmount : this.invoice.total;

        if (this._q) {
          this._q.push(amount);

          return;
        }

        this._q = {
          tasks: [],
          invoiceSyncInProgress: false,
          amountSent: -1.0,
          kill: function kill() {
            _this2._q.tasks = [];
          },
          process: function process() {
            var _context3;

            if (!_this2._q || !_this2._q.tasks.length || !syncInvoice) {
              return;
            }

            var tasks = (0, _splice["default"])(_context3 = _this2._q.tasks).call(_context3, 0, _this2._q.tasks.length);
            var mostRecentTotal = tasks.pop();
            var pd = _this2.deviceController.selectedDevice;

            if (!pd) {
              return;
            }

            _this2._q.invoiceSyncInProgress = true;
            _this2._q.amountSent = mostRecentTotal;

            _this2.pushOnce(pd, mostRecentTotal, function () {
              _this2.emit('onTaskComplete');

              if (!_this2._q) {
                return;
              }

              _this2._q.invoiceSyncInProgress = false;

              if (_this2._q.tasks.length > 0) {
                _manticore["default"].setTimeout(function () {
                  Log.debug(function () {
                    return "manticore timeout syncInvoice: ".concat(syncInvoice);
                  });

                  _this2._q.process();
                }, 0);
              }
            });
          },
          push: function push() {
            var _this2$_q$amountSent;

            var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.0; // Error log added to investigate DTPPHMM-163. Expect no context type when first created. It has not been set yet.

            if (!_this2._q.amountSent) {
              var txnData = {
                context: _this2.context || 'none',
                'Reader Type': _this2.deviceController.selectedDevice || 'none',
                'SDK Version': _Merchant["default"].sdkEnvironment && _Merchant["default"].sdkEnvironment.retailSDKVersion
              };
              Log.error('undefined amountSent in InvoiceSynchronizer. Jira DTPPHMM-163', txnData);
            } // Optional amountSent covers cases where undefined. DTPPHMM-163.


            if (_this2._q.invoiceSyncInProgress && (_this2$_q$amountSent = _this2._q.amountSent) !== null && _this2$_q$amountSent !== void 0 && _this2$_q$amountSent.isEqualTo(data)) {
              var _context4;

              Log.debug((0, _concat["default"])(_context4 = "invoiceSync NOT processed for invoice total ".concat(data, " since the same amount is still in PROGRESS. context.id: ")).call(_context4, _this2.context.id));
              return;
            }

            _this2._q.tasks.push(data);

            if (!_this2._q.invoiceSyncInProgress) {
              Log.debug(function () {
                return "push syncInvoice: ".concat(syncInvoice);
              });

              _this2._q.process();
            }
          }
        };

        var listener = function listener() {
          return _this2._q.push(_this2.invoice.total);
        };

        var refundListener = function refundListener(refundAmount) {
          return _this2._q.push(refundAmount);
        };

        listener.txContext = this.context;
        this.invoice.on(InvoiceEvent.totalMayHaveChanged, listener);
        this.context.on(_transactionEvent["default"].invoiceDisplayFooterUpdated, listener);
        this.context.on(_transactionEvent["default"].refundAmountEntered, refundListener);

        this._q.push(this.invoice.total);
      } catch (x) {
        Log.error('InvoiceSynchronizerFailed', {
          err: x
        });
      }
    }
  }, {
    key: "pushOnce",
    value: function pushOnce(pd, invoiceTotal) {
      var _pd$pendingUpdate,
          _this3 = this;

      var cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};

      if (!pd) {
        cb();
        return;
      }

      var deviceStatus = pd.isReadyForTransaction();

      if (!deviceStatus.isReady) {
        Log.debug(function () {
          var _context5, _context6;

          return (0, _concat["default"])(_context5 = (0, _concat["default"])(_context6 = "Cannot push ".concat(invoiceTotal, " to ")).call(_context6, pd.id, " as card reader is not ready. Error: ")).call(_context5, deviceStatus.error);
        });
        cb();
        return;
      }

      if ((_pd$pendingUpdate = pd.pendingUpdate) !== null && _pd$pendingUpdate !== void 0 && _pd$pendingUpdate.isRequired && !pd.pendingUpdate.wasInstalled) {
        pd.display({
          id: _retailPaymentDevice.PaymentDevice.Message.SoftwareUpdateRequired,
          displaySystemIcons: true
        }, cb);
        return;
      }

      var isAmountValid = invoiceTotal.isGreaterThan(0.0);
      Log.debug(function () {
        var _context7;

        return (0, _concat["default"])(_context7 = "InvoiceSync display for invoice total ".concat(_this3.invoice.total, ". context.id: ")).call(_context7, _this3.context.id);
      });

      _CardReaderDisplayController["default"].display(_displayPriority["default"].medium, pd, {
        id: isAmountValid ? _retailPaymentDevice.PaymentDevice.Message.InvoiceTotal : _retailPaymentDevice.PaymentDevice.Message.ReadyWithId,
        substitutions: {
          amount: this.context.isTransactionVaultOnly ? '' : (0, _retailSDKUtil.getAmountWithCurrencySymbol)(this.invoice.currency, invoiceTotal),
          footer: this.context.totalDisplayFooter,
          id: pd.id
        },
        displaySystemIcons: !isAmountValid
      }, cb);
    }
    /**
     * Stops syncing the device display with the invoice total
     */

  }, {
    key: "stop",
    value: function stop() {
      var _this4 = this;

      if (!this.invoice) {
        Log.error('StoppingInvoiceSyncFailed.', {
          id: this.context.id,
          crId: this.deviceController.selectedDevice ? this.deviceController.selectedDevice.id : '(no device selected)'
        });
        return;
      }

      syncInvoice = false;

      try {
        Log.debug(function () {
          var _context8, _context9, _context10;

          return (0, _concat["default"])(_context8 = (0, _concat["default"])(_context9 = (0, _concat["default"])(_context10 = "Stopping invoice sync on ".concat(_this4.deviceController.selectedDevice ? _this4.deviceController.selectedDevice.id : ', ', ", this.shouldSync: ")).call(_context10, syncInvoice, " for invoice total ")).call(_context9, _this4.invoice.total, ". context.id: ")).call(_context8, _this4.context.id);
        });
        var invoiceEvents = [InvoiceEvent.totalMayHaveChanged];
        var transactionEvents = [_transactionEvent["default"].invoiceDisplayFooterUpdated, _transactionEvent["default"].refundAmountEntered];

        for (var _i = 0, _invoiceEvents = invoiceEvents; _i < _invoiceEvents.length; _i++) {
          var e = _invoiceEvents[_i];

          var _iterator = _createForOfIteratorHelper(this.invoice.listeners(e)),
              _step;

          try {
            var _loop = function _loop() {
              var l = _step.value;

              if ((0, _is["default"])(l.txContext, _this4.context)) {
                _this4.invoice.removeListener(e, l);
              } else {
                Log.debug(function () {
                  var _context11, _context12;

                  return (0, _concat["default"])(_context11 = (0, _concat["default"])(_context12 = "Skip remove of listener for invoice total ".concat(_this4.invoice.total, " this.context.id: ")).call(_context12, _this4.context.id, ", listener.txContext: ")).call(_context11, l.txContext.id);
                });
              }
            };

            for (_iterator.s(); !(_step = _iterator.n()).done;) {
              _loop();
            }
          } catch (err) {
            _iterator.e(err);
          } finally {
            _iterator.f();
          }
        }

        for (var _i2 = 0, _transactionEvents = transactionEvents; _i2 < _transactionEvents.length; _i2++) {
          var _e = _transactionEvents[_i2];

          var _iterator2 = _createForOfIteratorHelper(this.context.listeners(_e)),
              _step2;

          try {
            for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
              var l = _step2.value;
              this.context.removeListener(_e, l);
            }
          } catch (err) {
            _iterator2.e(err);
          } finally {
            _iterator2.f();
          }
        }

        if (!this._q) {
          return;
        }

        this._q = null;
      } catch (x) {
        Log.error('InvoiceSynchronizerFailed', {
          err: x
        });
      }
    }
  }]);
  return InvoiceSynchronizer;
}(_events.EventEmitter);

exports["default"] = InvoiceSynchronizer;

},{"../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../paymentDevice/CardReaderDisplayController":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/CardReaderDisplayController.js","../paymentDevice/displayPriority":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/displayPriority.js","./transactionEvent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionEvent.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/is.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/OfflinePaymentInfo.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");
/**
 * TransactionOptions provides the list of customizations for a given transaction
 * @class
 * @property {decimal} total Shows total payment volume of all offline payments which are going to be replayed
 * @property {[OfflinePaymentStatus]} statusList List of status infos after replaying the offline payment
 */


var OfflinePaymentInfo = /*#__PURE__*/function () {
  /**
   * Create transaction options object
   * @constructor
   */
  function OfflinePaymentInfo(statusList) {
    (0, _classCallCheck2["default"])(this, OfflinePaymentInfo);
    this.statusList = statusList;
    this.total = (0, _paypalInvoicing.$$)(this.calculateTPV());
  }

  (0, _createClass2["default"])(OfflinePaymentInfo, [{
    key: "calculateTPV",
    value: function calculateTPV() {
      var _context;

      return (0, _reduce["default"])(_context = this.statusList).call(_context, function (total, txn) {
        return txn.isActive() ? total + txn.amount.toNumber() : total;
      }, 0.0);
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        total: this.total,
        statusList: this.statusList
      };
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this);
    }
  }]);
  return OfflinePaymentInfo;
}();

exports["default"] = OfflinePaymentInfo;

},{"@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/OfflinePaymentManager.js":[function(require,module,exports){
"use strict";

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.exec.js");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _machina = _interopRequireDefault(require("machina"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _moment = _interopRequireDefault(require("moment"));

var _manticoreUtil = require("manticore-util");

var _paypalrestManticore = require("@paypalcorp/paypalrest-manticore");

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _retailSDKUtil = require("../common/retailSDKUtil");

var _OfflinePaymentReplayFlow = _interopRequireDefault(require("../flows/OfflinePaymentReplayFlow"));

var _OfflinePaymentStatus = _interopRequireDefault(require("./OfflinePaymentStatus"));

var _sdkErrors = require("../common/sdkErrors");

var _OfflinePaymentInfo = _interopRequireDefault(require("./OfflinePaymentInfo"));

var _InstLogger = require("../common/InstLogger");

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context20, _context21;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context20 = ownKeys(Object(source), !0)).call(_context20, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context21 = ownKeys(Object(source))).call(_context21, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context19;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context19 = Object.prototype.toString.call(o)).call(_context19, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Log = (0, _manticoreLog["default"])('offlinePaymentMgr');

var OfflinePaymentManager = /*#__PURE__*/function () {
  function OfflinePaymentManager() {
    var _this = this;

    (0, _classCallCheck2["default"])(this, OfflinePaymentManager);
    this._offlineDeletedTxns = [];
    this.fsm = new _machina["default"].Fsm({
      // this fsm is for replay offline txns.
      namespace: 'offline-payment-mgr',
      initialState: 'offline',
      initialize: function initialize() {
        Log.debug('fsm initialize started');
      },
      states: {
        offline: {
          _onEnter: function _onEnter() {
            Log.debug('fsm offline _onEnter');
            _this._offlineFailedTxns = [];
            _this._offlineCompleteTxns = [];
            _this._offlineTxns = [];
          },
          start: function start() {
            Log.debug('fsm offline start');
            _this.sessionId = "op-mgr-sid-".concat((0, _retailSDKUtil.getRandomId)());
            _this.isStopped = false;
            _this.isSessionTimeout = false;
            _this.doRemoveDeletedTxnsFromStorage = false;

            _this.fsm.transition('online');
          },
          stop: function stop() {
            Log.debug('fsm offline stop');

            _this._updateStatus(null, []);
          }
        },
        online: {
          _onEnter: function _onEnter() {
            Log.debug('fsm online _onEnter');

            var getTxnsForStatus = function getTxnsForStatus() {
              var _context, _context2, _context3;

              var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
              return (0, _concat["default"])(_context = (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = _this._offlineCompleteTxns).call(_context3, _this._offlineFailedTxns)).call(_context2, _this._offlineDeletedTxns)).call(_context, arr);
            };

            if (_this.isStopped || _this.isSessionTimeout) {
              Log.debug(function () {
                var _context4;

                return (0, _concat["default"])(_context4 = "fsm online _onEnter isStopped ".concat(_this.isStopped, " isSessionTimeout ")).call(_context4, _this.isSessionTimeout);
              });
              var error = _this.isStopped ? _sdkErrors.transaction.offlinePaymentStopped : _paypalrestManticore.restError.unauthorized;

              _this._updateStatus(error, getTxnsForStatus(_this._offlineTxns));

              return;
            }

            (0, _retailSDKUtil.getOfflinePaymentListFromStorage)(_Merchant["default"].active).then(function (txns) {
              Log.debug(function () {
                var _context5;

                return (0, _concat["default"])(_context5 = "offline txn: ".concat((0, _stringify["default"])(txns, null, 2), " with length ")).call(_context5, txns.length);
              });

              if (txns.length === 0) {
                Log.debug(function () {
                  return "offlineFailedTxns: ".concat((0, _stringify["default"])(_this._offlineFailedTxns, null, 2));
                });

                _this._updateStatus(null, getTxnsForStatus());

                _this.fsm.transition('offline');
              } else {
                var _iterator = _createForOfIteratorHelper(txns),
                    _step;

                try {
                  var _loop = function _loop() {
                    var txn = _step.value;
                    txn.retry = txn.offlinePaymentManagerSessionId !== _this.sessionId ? 0 : txn.retry;
                    var newTxn = new _OfflinePaymentStatus["default"]().readJSON(txn);
                    newTxn.offlinePaymentManagerSessionId = _this.sessionId;

                    if (newTxn.shouldRetry() && !newTxn.isExpired()) {
                      _this._offlineTxns.push(newTxn);
                    } else if (newTxn.isExpired()) {
                      var _context8;

                      Log.info(function () {
                        var _context6, _context7;

                        return (0, _concat["default"])(_context6 = (0, _concat["default"])(_context7 = "OfflinePayment transaction ".concat((0, _stringify["default"])(txn.id), " has been deleted with amount expiredOfflineTransactionAmount ")).call(_context7, txn.amount, ". Due to reaching the end of it's life span. It was ")).call(_context6, (0, _moment["default"])().diff((0, _moment["default"])(txn.timestamp), 'hours', true), " hours old.");
                      });
                      _this._offlineDeletedTxns = (0, _concat["default"])(_context8 = _this._offlineDeletedTxns).call(_context8, newTxn);
                      _this.doRemoveDeletedTxnsFromStorage = true;
                    } else {
                      _this._offlineFailedTxns.push(newTxn);

                      Log.debug(function () {
                        return "online filtered txn: ".concat(newTxn);
                      });
                    }
                  };

                  for (_iterator.s(); !(_step = _iterator.n()).done;) {
                    _loop();
                  }
                } catch (err) {
                  _iterator.e(err);
                } finally {
                  _iterator.f();
                }

                Log.debug(function () {
                  return "online _offlineTxns: ".concat((0, _stringify["default"])(_this._offlineTxns, null, 2));
                });

                if (_this._offlineTxns.length > 0 || _this.doRemoveDeletedTxnsFromStorage && _this._offlineDeletedTxns.length > 0 && txns.length > 0) {
                  _this.doRemoveDeletedTxnsFromStorage = false;

                  _this.fsm.transition('replay');
                } else {
                  _this._updateStatus(null, getTxnsForStatus());

                  _this.fsm.transition('offline');
                }
              }
            })["catch"](function (error) {
              Log.error("error happened during getting offline payment list: ".concat(error));

              _this._updateStatus(error, getTxnsForStatus(_this._offlineTxns));

              _this.fsm.transition('offline');
            });
          },
          stop: 'offline',
          sessionTimeout: 'offline'
        },
        replay: {
          _onEnter: function _onEnter() {
            Log.debug(function () {
              var _context9, _context10, _context11;

              return (0, _concat["default"])(_context9 = (0, _concat["default"])(_context10 = (0, _concat["default"])(_context11 = "[".concat(_this.fsm.state, "] - _onEnter: offline txns length: ")).call(_context11, _this._offlineTxns.length, " or isStopped: ")).call(_context10, _this.isStopped, " or isSessionTimeout: ")).call(_context9, _this.isSessionTimeout);
            });

            if (!_this._offlineTxns.length || _this.isStopped || _this.isSessionTimeout) {
              var _context15;

              Log.debug(function () {
                var _context12, _context13;

                return (0, _concat["default"])(_context12 = (0, _concat["default"])(_context13 = "".concat(_this._offlineTxns.length, " No txn or ")).call(_context13, _this.isStopped, " isStopped  or ")).call(_context12, _this.isSessionTimeout, " sessionTimeout to replay ,Transitioning to 'online'");
              });
              Log.debug(function () {
                var _context14;

                return (0, _concat["default"])(_context14 = "failed Txns: ".concat(_this._offlineFailedTxns, " \ndeleted Txns: ")).call(_context14, _this._offlineDeletedTxns);
              }); // before transitioning to online, we should update the list to the storage

              (0, _retailSDKUtil.saveOfflinePaymentListToStorage)((0, _concat["default"])(_context15 = _this._offlineTxns).call(_context15, _this._offlineFailedTxns), _Merchant["default"].active).then(function () {
                _this._offlineFailedTxns = [];

                _this.fsm.transition('online');
              })["catch"](function (error) {
                Log.error("saveOfflinePaymentListToStorage failed with ".concat(error));

                _this.fsm.transition('online');
              });
            } else {
              Log.debug(function () {
                return "[".concat(_this.fsm.state, "] - _onEnter: going to processOfflineTxn");
              });

              _this.fsm.handle('processOfflineTxn');
            }
          },
          processOfflineTxn: function processOfflineTxn() {
            var txn = _this._offlineTxns.shift();

            Log.debug(function () {
              return "offline txn: ".concat((0, _stringify["default"])(txn, null, 2));
            });
            _this.flow = new _OfflinePaymentReplayFlow["default"](txn.increment(), function (error, record) {
              txn.invoiceId = (record === null || record === void 0 ? void 0 : record.invoiceId) || txn.invoiceId;
              Log.debug(function () {
                var _context16;

                return (0, _concat["default"])(_context16 = "OfflinePayment transaction ".concat((0, _stringify["default"])(txn.id), " has amount: offlineTransactionAmount ")).call(_context16, txn.amount, ".");
              });
              var trackingInfo = {
                offlineId: txn.id,
                amount: txn.amount,
                retryCount: txn.retry,
                replayCount: txn.replay,
                age: (0, _moment["default"])().diff((0, _moment["default"])(txn.timestamp), 'hours', true),
                invoiceNumber: txn.invoiceNumber
              };

              if (error) {
                if (error.code === _paypalrestManticore.restError.unauthorized.code) {
                  Log.debug('session timeout occurred so stop replay!!!');

                  _this.fsm.handle('sessionTimeout');
                }

                trackingInfo.error = error;
                Log.debug(function () {
                  return "offline payment flow completed with error: ".concat(error);
                });

                if (_this._hardDecline(error)) {
                  Log.track('OfflineTxFailed', _objectSpread(_objectSpread({}, trackingInfo), {}, {
                    errName: (0, _retailSDKUtil.getErrorName)(error),
                    errDomain: error.domain || 'None',
                    errCode: error.code || 'None',
                    err: (0, _stringify["default"])(error),
                    errType: 'hard_declined'
                  }));

                  _this._offlineDeletedTxns.push(txn.declined(error));
                } else {
                  Log.track('OfflineTxFailed', _objectSpread(_objectSpread({}, trackingInfo), {}, {
                    errName: (0, _retailSDKUtil.getErrorName)(error),
                    errDomain: error.domain || 'None',
                    errCode: error.code || 'None',
                    err: (0, _stringify["default"])(error),
                    errType: 'soft_declined'
                  }));

                  _this._offlineFailedTxns.push(txn.failed(error));
                }
              } else {
                txn.invoiceId = record === null || record === void 0 ? void 0 : record.invoiceId;
                txn.transactionNumber = record === null || record === void 0 ? void 0 : record.transactionNumber;
                Log.track('OfflineTxSuccess', _objectSpread(_objectSpread({}, trackingInfo), {}, {
                  invoiceId: txn.invoiceId,
                  transactionNumber: txn.transactionNumber
                }));

                _this._offlineCompleteTxns.push(txn.completed());
              }

              _this.fsm.handle('_onEnter');
            });

            _this.flow.start().then(function () {
              Log.debug('offline payment flow ended...');
            })["catch"](function (error) {
              Log.error('OfflinePaymentFlowFailed', {
                error: error
              }); // save the failed txn

              if (error.code === _paypalrestManticore.restError.unauthorized.code) {
                Log.debug('session timeout occurred so stop replay!!!');

                _this.fsm.handle('sessionTimeout');
              }

              if (_this._hardDecline(error)) {
                _this._offlineDeletedTxns.push(txn.declined(error));
              } else {
                _this._offlineFailedTxns.push(txn.failed(error));
              }

              _this.fsm.handle('_onEnter');
            });
          },
          stop: function stop() {
            Log.debug('offline payment stop called...');
            _this.isStopped = true;

            _this.fsm.deferUntilTransition('online');
          },
          sessionTimeout: function sessionTimeout() {
            Log.debug('Session timeout occurred during offline payment replay...');
            _this.isSessionTimeout = true;

            _this.fsm.deferUntilTransition('online');
          }
        }
      }
    });
  }

  (0, _createClass2["default"])(OfflinePaymentManager, [{
    key: "_hardDecline",
    value: function _hardDecline(error) {
      return (0, _includes["default"])(_sdkErrors.hardDeclineForOffline).call(_sdkErrors.hardDeclineForOffline, error.code);
    }
  }, {
    key: "_updateStatus",
    value: function _updateStatus(error, allStatus) {
      Log.debug(function () {
        return "OfflinePayment: ReplaySummary ".concat(allStatus);
      });

      this._updateInstrumentation(allStatus);

      if (this._callback) {
        this._callback(error, new _OfflinePaymentInfo["default"](allStatus));
      }
    }
  }, {
    key: "_updateInstrumentation",
    value: function _updateInstrumentation(allStatus) {
      if ((allStatus === null || allStatus === void 0 ? void 0 : allStatus.length) !== 0) {
        var _iterator2 = _createForOfIteratorHelper(allStatus),
            _step2;

        try {
          for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
            var status = _step2.value;
            Log.instrument('OfflineReplayEnd', (0, _InstLogger.offlineReplayEndEvent)(status));
          }
        } catch (err) {
          _iterator2.e(err);
        } finally {
          _iterator2.f();
        }
      }
    }
  }, {
    key: "startReplay",
    value: function startReplay(cb) {
      if (!_Merchant["default"].active) {
        cb(_sdkErrors.merchant.notInitialized);
        return;
      }

      Log.info('OfflinePayment: The merchant has initialized a replay transaction. Call BeginReplayTransactionCalled.');
      this._callback = cb;
      this.fsm.handle('start');
    }
  }, {
    key: "stopReplay",
    value: function stopReplay() {
      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;

      if (cb) {
        this._callback = cb;
      }

      this.fsm.handle('stop');
    }
  }, {
    key: "getStatus",
    value: function getStatus() {
      var _this2 = this;

      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      if (!_Merchant["default"].active) {
        cb(_sdkErrors.merchant.notInitialized);
        return;
      }

      (0, _retailSDKUtil.getOfflinePaymentListFromStorage)(_Merchant["default"].active).then(function (txns) {
        var _context17, _context18;

        Log.debug(function () {
          return "getStatus -> offline txn: ".concat((0, _stringify["default"])(txns, null, 2));
        });
        var storedTxns = (0, _map["default"])(txns).call(txns, function (txn) {
          return new _OfflinePaymentStatus["default"]().readJSON(txn);
        });
        var offlineTxns = (0, _concat["default"])(_context17 = []).call(_context17, (0, _toConsumableArray2["default"])(_this2._offlineDeletedTxns), (0, _toConsumableArray2["default"])(storedTxns)); // when getStatus called repeatedly, the multiple invoice item shows up in the deleted txns
        // To prevent it, we get rid of the references to txn and create deep copy of it.
        // TODO: find out the root cause!

        _this2._offlineDeletedTxns = (0, _map["default"])(_context18 = _this2._offlineDeletedTxns).call(_context18, function (txn) {
          return new _OfflinePaymentStatus["default"]().readJSON((0, _manticoreUtil.deepToJSON)(txn));
        });
        cb(undefined, new _OfflinePaymentInfo["default"](offlineTxns));
      })["catch"](function (error) {
        Log.error("getStatus: error happened during getting offline payment list: ".concat(error));
        cb(error);
      });
    }
  }]);
  return OfflinePaymentManager;
}();

var offlinePaymentMgr = new OfflinePaymentManager(); // eslint-disable-line no-unused-vars

var _default = offlinePaymentMgr;
exports["default"] = _default;

},{"../common/InstLogger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/InstLogger.js","../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../flows/OfflinePaymentReplayFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/OfflinePaymentReplayFlow.js","./OfflinePaymentInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/OfflinePaymentInfo.js","./OfflinePaymentStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/OfflinePaymentStatus.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypalrest-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","machina":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/machina/lib/machina.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/OfflinePaymentStatus.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = exports.OfflineTransactionState = exports.OfflinePaymentInstrumentationStatus = void 0;

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

var _moment = _interopRequireDefault(require("moment"));

var _manticoreUtil = require("manticore-util");

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _invoicing = require("../common/invoicing");

var _retailSDKUtil = require("../common/retailSDKUtil");
/**
 * Possible status of the Offline Transactions
 * @enum {int}
 */


var OfflineTransactionState = {
  /**
   * Deleted
   */
  Deleted: 0,

  /**
   * Completed
   */
  Completed: 1,

  /**
   * Failed
   */
  Failed: 2,

  /**
   * Active
   */
  Active: 3,

  /**
   * Declined
   */
  Declined: 4
};
exports.OfflineTransactionState = OfflineTransactionState;
OfflineTransactionState.toString = (0, _manticoreUtil.reverseKeysAndValues)(OfflineTransactionState);
var OfflinePaymentInstrumentationStatus = {
  Deleted: 'Payment Expired',
  Completed: 'Payment Successful',
  Failed: 'Payment Failed',
  Active: 'Payment Active',
  Declined: 'Payment Declined'
};
/**
 * OfflinePaymentStatus provides the status info for a given offline payment transaction
 * @class
 * @property {string} id the id of the offline txn @readonly
 * @property {Date} createTime Show the create time of the offline txn @readonly
 * @property {decimal} amount the total amount of the offline txn @readonly
 * @property {CardIssuer|int} cardIssuer the card issuer of the card used for the txn @readonly
 * @property {int} retry the retry counter of the offline txn @readonly
 * @property {int} replay the replay counter of the offline txn @readonly
 * @property {int} errNo the error no of the offline txn after replaying it @readonly
 * @property {string} errMessage the error message of the offline txn after replaying if failed @readonly
 * @property {bool} isDeclined the flag showing if the txn is declined during replay @readonly
 * @property {Date} expiry Show the expiry time of the offline txn @readonly
 * @property {OfflineTransactionState} state of this transaction @readonly
 * @property {string} invoiceNumber The invoice number of the offline tx @readonly
 * @property {string} invoiceId The invoice id of the offline tx @readonly
 * @property {string} transactionNumber The transaction number of the offline tx @readonly
 * @property {string} latitude The latitude of the offline tx @readonly
 * @property {string} longitude The longitude of the offline tx @readonly
 * @property {TransactionBeginOptions.PaymentTypes} paymentType of the offline tx @readonly
 * @property {Card} card card details of the card used for the offline tx @readonly
 * @property {RetailInvoice} invoice The invoice of the offline tx @readonly
 */

exports.OfflinePaymentInstrumentationStatus = OfflinePaymentInstrumentationStatus;

var OfflinePaymentStatus = /*#__PURE__*/function () {
  /**
   * Create offline payment status object
   * @constructor
   */
  function OfflinePaymentStatus(id) {
    var _context$merchant;

    var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
    var mtpRq = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
    (0, _classCallCheck2["default"])(this, OfflinePaymentStatus);
    var _context$invoice = context.invoice,
        invoice = _context$invoice === void 0 ? {} : _context$invoice,
        paymentType = context.paymentType,
        _context$card = context.card,
        card = _context$card === void 0 ? {} : _context$card;
    this.id = id;
    this.createTime = new Date(mtpRq.dateTime);
    this.amount = (0, _paypalInvoicing.$$)(invoice.total);
    this.cardIssuer = card.cardIssuer;
    this.retry = 0;
    this.replay = 0;
    this.errNo = 0;
    this.errMessage = '';
    this.isDeclined = false;
    this.expiry = (0, _moment["default"])(mtpRq.dateTime).add((_context$merchant = context.merchant) === null || _context$merchant === void 0 ? void 0 : _context$merchant.offlinePaymentExpiration, 'hours').toDate();
    this.offlinePaymentManagerSessionId = '';
    this.state = this._getState();
    this.invoiceNumber = invoice.number;
    this.invoiceId = '';
    this.transactionNumber = '';
    this.latitude = mtpRq.latitude;
    this.longitude = mtpRq.longitude;
    this.card = new _retailPaymentDevice.Card();
    (0, _manticoreUtil.extend)(this.card, {
      cardIssuer: card.cardIssuer,
      lastFourDigits: card.lastFourDigits
    }, true);
    this.invoice = new _invoicing.RetailInvoice(invoice.currency);
    this.invoice.readJSON(typeof invoice.toJSON === 'function' ? (0, _manticoreUtil.deepToJSON)(invoice.toFullJSON()) : invoice, true);
    this.invoice.sanitize();
    this.paymentType = paymentType;
    this.instrumentation = this._getInsFields(context);
  }

  (0, _createClass2["default"])(OfflinePaymentStatus, [{
    key: "_getInsFields",
    value: function _getInsFields(context) {
      var tx = (0, _retailSDKUtil.getTxEndData)(context);
      return {
        readerType: tx.readerType(),
        cvm: tx.cvm(),
        paymentType: tx.paymentType(),
        saleType: tx.transactionType(),
        quickChip: context.quickChipEnabled ? 'Yes' : 'No'
      };
    }
  }, {
    key: "_getState",
    value: function _getState() {
      if (this.isExpired()) {
        return OfflineTransactionState.Deleted;
      }

      if (this.retry > 0 && !this.isDeclined) {
        return OfflineTransactionState.Failed;
      }

      if (this.isDeclined) {
        return OfflineTransactionState.Declined;
      }

      return OfflineTransactionState.Active;
    }
  }, {
    key: "isActive",
    value: function isActive() {
      return this.state === OfflineTransactionState.Active || this.state === OfflineTransactionState.Failed;
    }
  }, {
    key: "shouldRetry",
    value: function shouldRetry() {
      return this.retry < 4;
    }
  }, {
    key: "isExpired",
    value: function isExpired() {
      return (0, _moment["default"])().isAfter((0, _moment["default"])(this.expiry));
    }
  }, {
    key: "completed",
    value: function completed() {
      this.errNo = 0;
      this.errMessage = '';
      this.isDeclined = false;
      this.state = OfflineTransactionState.Completed;
      return this;
    }
  }, {
    key: "failed",
    value: function failed(error) {
      this.errNo = (0, _parseInt2["default"])(error.code, 10);
      this.errMessage = error.message || '';
      this.isDeclined = false;
      this.state = OfflineTransactionState.Failed;
      return this;
    }
  }, {
    key: "_getInvoiceInfo",
    value: function _getInvoiceInfo(_ref) {
      var gratuity = _ref.gratuity,
          items = _ref.items,
          discount = _ref.discount;
      return {
        gratuity: gratuity,
        items: items,
        discount: discount
      };
    }
  }, {
    key: "declined",
    value: function declined(error) {
      this.errNo = (0, _parseInt2["default"])(error.code, 10);
      this.errMessage = error.message || '';
      this.isDeclined = true;
      this.state = OfflineTransactionState.Declined;
      return this;
    }
  }, {
    key: "increment",
    value: function increment() {
      this.retry += 1;

      if (this.retry === 1) {
        // at every replay attempt, retry is set to 0.
        // when retry is 1, that means the replay has started
        this.replay += 1;
      }

      return this;
    }
  }, {
    key: "readJSON",
    value: function readJSON(json) {
      var _json$invoice;

      this.id = json.id;
      this.createTime = new Date(json.createTime);
      this.amount = (0, _paypalInvoicing.$$)(json.amount);
      this.cardIssuer = json.cardIssuer;
      this.retry = json.retry ? json.retry : 0;
      this.replay = json.replay ? json.replay : 0;
      this.errNo = json.errNo;
      this.errMessage = json.errMessage || '';
      this.isDeclined = json.isDeclined;
      this.expiry = new Date(json.expiry);
      this.offlinePaymentManagerSessionId = json.offlinePaymentManagerSessionId;
      this.state = this._getState();
      this.invoiceNumber = json.invoiceNumber;
      this.invoiceId = json.invoiceId;
      this.transactionNumber = json.transactionNumber;
      this.latitude = json.latitude;
      this.longitude = json.longitude;
      this.paymentType = json.paymentType;
      this.card = new _retailPaymentDevice.Card().readJSON(json.card);
      this.invoice = new _invoicing.RetailInvoice((_json$invoice = json.invoice) === null || _json$invoice === void 0 ? void 0 : _json$invoice.currency);
      this.invoice.readJSON((0, _manticoreUtil.deepToJSON)(json.invoice), true);
      this.invoice.sanitize();
      this.instrumentation = json.instrumentation;
      return this;
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        id: this.id,
        createTime: (0, _moment["default"])(this.createTime).format(),
        cardIssuer: this.cardIssuer,
        amount: this.amount,
        retry: this.retry,
        replay: this.replay,
        errNo: this.errNo,
        errMessage: this.errMessage,
        isDeclined: this.isDeclined,
        expiry: (0, _moment["default"])(this.expiry).format(),
        offlinePaymentManagerSessionId: this.offlinePaymentManagerSessionId,
        invoiceNumber: this.invoiceNumber,
        invoiceId: this.invoiceId,
        transactionNumber: this.transactionNumber,
        latitude: this.latitude,
        longitude: this.longitude,
        paymentType: this.paymentType,
        invoice: this.invoice.toJSON(),
        card: this.card.toJSON(),
        instrumentation: (0, _manticoreUtil.deepToJSON)(this.instrumentation)
      };
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this);
    }
  }]);
  return OfflinePaymentStatus;
}();

exports["default"] = OfflinePaymentStatus;

},{"../common/invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/invoicing/index.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/OfflineTransactionRecord.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _moment = _interopRequireDefault(require("moment"));

var _Record2 = _interopRequireDefault(require("./Record"));

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}
/**
 * Information about a completed offline transaction addition
 * @class
 * @extends Record
 * @property {string} id The Offline Transaction id @readonly
 * @property {int} amount The Offline Transaction amount @readonly
 * @property {Date} validUntil The offline transaction is valid until this value @readonly
 * @property {string} invoiceNumber The invoice number associated with this offline transaction record @readonly
 */


var OfflineTransactionRecord = /*#__PURE__*/function (_Record) {
  (0, _inherits2["default"])(OfflineTransactionRecord, _Record);

  var _super = _createSuper(OfflineTransactionRecord);

  function OfflineTransactionRecord() {
    (0, _classCallCheck2["default"])(this, OfflineTransactionRecord);
    return _super.apply(this, arguments);
  }

  (0, _createClass2["default"])(OfflineTransactionRecord, [{
    key: "toJSON",
    value: function toJSON() {
      return {
        id: this.id,
        amount: this.amount,
        validUntil: (0, _moment["default"])(this.validUntil).format(),
        invoiceNumber: this.invoiceNumber
      };
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this);
    }
  }]);
  return OfflineTransactionRecord;
}(_Record2["default"]);

exports["default"] = OfflineTransactionRecord;

},{"./Record":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/Record.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/Payer.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var util = _interopRequireWildcard(require("manticore-util"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}
/**
 * Information about the payer of a transaction, including saved receipt information if
 * available
 * @class
 * @property {string} customerId An identifier for this customer that is specific to your merchant account @readonly
 * @property {string} receiptPreferenceToken A token used to send receipts and save/use previously used email address or phone number @readonly
 * @property {string} maskedEmail An email address previously used for this payment instrument, with portions masked for privacy @readonly
 * @property {string} maskedPhone A masked phone number previously used for this payment instrument @readonly
 */


var Payer = /*#__PURE__*/(0, _createClass2["default"])(function Payer(response) {
  (0, _classCallCheck2["default"])(this, Payer);

  if (response) {
    util.assignSome(this, response, ['customerId', 'receiptPreferenceToken', 'maskedEmail', 'maskedPhone']);
  }
});
exports["default"] = Payer;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/QuickChipAction.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = tryQuickChipAction;

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _isNil = _interopRequireDefault(require("ramda/src/isNil"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var messageHelper = _interopRequireWildcard(require("../flows/messageHelper"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

var Log = (0, _manticoreLog["default"])('qc.action');
var AuthCode = _retailPaymentDevice.PaymentDevice.authCode;
/*
 * Handles Quick Chip Steps,
 * . Send 'Z3' auth code to reader
 * . Send "Remove card" message to the reader
 * . Remove cardRemoved listener
 */

function _pushAuthCode(authCode, card, cb) {
  Log.debug('Pushing authCode:', {
    authCode: authCode,
    crId: card.reader.id
  });
  card.reader.completeTransaction(authCode, function (error, rz) {
    Log.debug('Pushed authCode:', {
      error: error
    });

    if (!(0, _isNil["default"])(error) && !_retailPaymentDevice.deviceError.contactIssuer.equals(error)) {
      card.qcAuthSend = false;
      cb(error, rz);
    } else {
      card.qcAuthSend = true;
      cb(undefined, rz);
    }
  });
}

function tryQuickChipAction(context, cb) {
  if (!context.quickChipEnabled) {
    cb();
    return;
  }

  Log.info('QChipActionInvoked');

  var cbStepComplete = function cbStepComplete(error) {
    if (error) {
      Log.info('cbStepCompleteInvoked', {
        error: error
      });
      cb(error);
      return;
    }

    Log.info('cbStepCompleteInvokedWithNoErr');
    cb(undefined, function () {
      var _context$alert; // Dismiss any alert before we transfer control to the app for iOS


      (_context$alert = context.alert) === null || _context$alert === void 0 ? void 0 : _context$alert.dismiss();
      messageHelper.showQCRemoveCard(context, {}, function () {});
    });
  };

  _pushAuthCode(AuthCode.NoNetwork, context.card, cbStepComplete);
}

},{"../flows/messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","ramda/src/isNil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isNil.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/ReceiptDestination.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.ReceiptDestinationTypeStr = exports.ReceiptDestinationType = exports.ReceiptDestination = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));
/**
* List of possible receipt destination options, as selected by the user.
* @enum {int}
*/


var ReceiptDestinationType = {
  /**
   * User chose the no receipt option.
   */
  none: 0,

  /**
   * User chose the email option and sent the receipt to the email provided.
   */
  email: 1,

  /**
   * User chose the text option and sent the receipt to the provided phone number.
   */
  text: 2
};
exports.ReceiptDestinationType = ReceiptDestinationType;
var ReceiptDestinationTypeStr = {
  0: 'none',
  1: 'email',
  2: 'phone'
};
/**
 * Contains information about the receipt status.
 * @class
 * @property {ReceiptDestinationType} type Indicates whether an email or a text
 * @property {string} email email address of the receipt is sent @readonly
 * receipt was sent or not. @readonly
 */

exports.ReceiptDestinationTypeStr = ReceiptDestinationTypeStr;
var ReceiptDestination = /*#__PURE__*/(0, _createClass2["default"])(function ReceiptDestination(type, email) {
  (0, _classCallCheck2["default"])(this, ReceiptDestination);
  this.type = type || ReceiptDestinationType.none;
  this.email = email || null;
});
exports.ReceiptDestination = ReceiptDestination;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/ReceiptViewContent.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.ReceiptViewContent = exports.ReceiptSMSEntryViewContent = exports.ReceiptOptionsViewContent = exports.ReceiptEmailEntryViewContent = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _l10n2 = _interopRequireDefault(require("../common/l10n"));

var _retailSDKUtil = require("../common/retailSDKUtil");

var _messageHelper = require("../flows/messageHelper");

var _sdkErrors = require("../common/sdkErrors"); // eslint-disable-next-line max-classes-per-file


var Log = (0, _manticoreLog["default"])('receiptViewContent');
/**
 * The content to be presented natively in the receipt options screen.
 * @class
 * @property {string} title
 * @property {string} message
 * @property {string} prompt
 * @property {string} titleIconFilename
 * @property {string} maskedEmail
 * @property {string} maskedPhone
 * @property {string} disclaimer
 * @property {string} emailButtonTitle
 * @property {string} smsButtonTitle
 * @property {string} noThanksButtonTitle
 * @property {[string]} additionalReceiptOptions
 */

var ReceiptOptionsViewContent = /*#__PURE__*/(0, _createClass2["default"])(function ReceiptOptionsViewContent(context, error, maskedEmail, maskedPhone, switchToLightTheme) {
  (0, _classCallCheck2["default"])(this, ReceiptOptionsViewContent);

  var _l10n = (0, _messageHelper.l10nDefault)(context);

  if (context.offlinePaymentEnabled) {
    this.message = _l10n('Tx.OfflineComplete');
  } else if (error) {
    var _getMsgsByError = (0, _retailSDKUtil.getMsgsByError)(context, error),
        rcptMsg = _getMsgsByError.rcptMsg;

    this.message = rcptMsg;
  } else {
    this.message = _l10n('Tx.TransactionSuccessful');
  }

  this.title = _l10n('Rcpt.Title');
  this.maskedEmail = maskedEmail;
  this.maskedPhone = maskedPhone;
  this.disclaimer = _l10n('Rcpt.Disclaimer');
  this.emailButtonTitle = _l10n('Rcpt.EmailButtonTitle');
  this.smsButtonTitle = _l10n('Rcpt.SMSButtonTitle');
  this.noThanksButtonTitle = _l10n('Rcpt.NoThanksButtonTitle');
  this.additionalReceiptOptions = context.additionalReceiptOptions;
  this.prompt = _l10n('Rcpt.Prompt');
  Log.track('ReceiptStatus', {
    message: this.message
  });

  if ((error === null || error === void 0 ? void 0 : error.code) === _sdkErrors.network.networkOffline.code || (error === null || error === void 0 ? void 0 : error.code) === _sdkErrors.network.sslHandshakeFailed.code) {
    this.titleIconFilename = 'ic_attention';
    this.prompt = _l10n('Rcpt.PromptDueToNetworkError');
  } else if (error) {
    this.titleIconFilename = switchToLightTheme ? 'ic_x_declined_red' : 'ic_x_declined';
  } else {
    this.titleIconFilename = 'check_icon_green';
  }
});
/**
 * The content to be presented natively in the receipt email entry screen.
 * @class
 * @property {string} title
 * @property {string} placeholder
 * @property {string} disclaimer
 * @property {string} sendButtonTitle
 */

exports.ReceiptOptionsViewContent = ReceiptOptionsViewContent;
var ReceiptEmailEntryViewContent = /*#__PURE__*/(0, _createClass2["default"])(function ReceiptEmailEntryViewContent() {
  (0, _classCallCheck2["default"])(this, ReceiptEmailEntryViewContent);
  this.title = (0, _l10n2["default"])('Rcpt.Email.Title');
  this.placeholder = (0, _l10n2["default"])('Rcpt.Email.Placeholder');
  this.disclaimer = (0, _l10n2["default"])('Rcpt.Email.Disclaimer');
  this.sendButtonTitle = (0, _l10n2["default"])('Rcpt.Email.SendButtonTitle');
});
/**
 * The content to be presented natively in the receipt sms entry screen.
 * @class
 * @property {string} title
 * @property {string} placeholder
 * @property {string} disclaimer
 * @property {string} sendButtonTitle
 */

exports.ReceiptEmailEntryViewContent = ReceiptEmailEntryViewContent;
var ReceiptSMSEntryViewContent = /*#__PURE__*/(0, _createClass2["default"])(function ReceiptSMSEntryViewContent() {
  (0, _classCallCheck2["default"])(this, ReceiptSMSEntryViewContent);
  this.title = (0, _l10n2["default"])('Rcpt.SMS.Title');
  this.placeholder = (0, _l10n2["default"])('Rcpt.SMS.Placeholder');
  this.disclaimer = (0, _l10n2["default"])('Rcpt.SMS.Disclaimer');
  this.sendButtonTitle = (0, _l10n2["default"])('Rcpt.SMS.SendButtonTitle');
});
/**
 * All the content to be displayed in the native receipt flow
 * @class
 * @property {ReceiptOptionsViewContent} receiptOptionsViewContent
 * @property {ReceiptEmailEntryViewContent} receiptEmailEntryViewContent
 * @property {ReceiptSMSEntryViewContent} receiptSMSEntryViewContent
 */

exports.ReceiptSMSEntryViewContent = ReceiptSMSEntryViewContent;
var ReceiptViewContent = /*#__PURE__*/(0, _createClass2["default"])(function ReceiptViewContent(context, error, maskedEmail, maskedPhone, switchToLightTheme) {
  (0, _classCallCheck2["default"])(this, ReceiptViewContent);
  this.receiptOptionsViewContent = new ReceiptOptionsViewContent(context, error, maskedEmail, maskedPhone, switchToLightTheme);
  this.receiptEmailEntryViewContent = new ReceiptEmailEntryViewContent();
  this.receiptSMSEntryViewContent = new ReceiptSMSEntryViewContent();
});
exports.ReceiptViewContent = ReceiptViewContent;

},{"../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../flows/messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/Record.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
/**
 * @protected
 * @class
 * @property {Card} card card that was presented by the consumer for this transaction @readonly
 */


var Record = /*#__PURE__*/function () {
  function Record() {
    (0, _classCallCheck2["default"])(this, Record);
  }

  (0, _createClass2["default"])(Record, [{
    key: "isPaymentIncomplete",
    value: function isPaymentIncomplete() {
      return false;
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        card: this.card
      };
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this);
    }
  }]);
  return Record;
}();

exports["default"] = Record;

},{"@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/SignatureReceiver.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticore = _interopRequireDefault(require("manticore"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _retailPageTracker = require("retail-page-tracker");

var _events = require("events");

var _l10n = _interopRequireDefault(require("../common/l10n"));

var messageHelper = _interopRequireWildcard(require("../flows/messageHelper"));

var _transactionEvent = _interopRequireDefault(require("./transactionEvent"));

var _sdkErrors = require("../common/sdkErrors");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}
/**
 * When signature is collected by external code, it will be passed a SignatureReceiver object
 * @class
 * @property {TransactionContext} context @readonly
 */


var SignatureReceiver = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(SignatureReceiver, _EventEmitter);

  var _super = _createSuper(SignatureReceiver);
  /**
   * @package
   */


  function SignatureReceiver(context, cb) {
    var _this;

    (0, _classCallCheck2["default"])(this, SignatureReceiver);
    _this = _super.call(this);
    _this.context = context;
    _this.cb = cb;
    return _this;
  }
  /**
   * Continue processing the transaction with the supplied signature.
   * @param {string} base64SignatureJpeg The signature as a base64 encoded JPEG image. Try to keep it under 100k
   */


  (0, _createClass2["default"])(SignatureReceiver, [{
    key: "continueWithSignature",
    value: function continueWithSignature(base64SignatureJpeg) {
      this.context.emit(_transactionEvent["default"].didCompleteSignature, null);
      this.cb(null, base64SignatureJpeg);
    }
    /**
     * Acquire signature using the normal PayPal Retail SDK mechanism (i.e. on screen signing)
     */

  }, {
    key: "acquireSignature",
    value: function acquireSignature() {
      var _this2 = this;

      var formattedValues = messageHelper.getSubstitutions(this.context);
      var titleSubstitutions = {
        amount: formattedValues.amount,
        cardIssuer: this.context.card.cardIssuer && this.context.card.cardIssuer !== _retailPaymentDevice.CardIssuer.Unknown ? _retailPaymentDevice.CardDataUtil.getCardIssuerDisplayName(this.context.card.cardIssuer) : '',
        lastFour: this.context.card.lastFourDigits
      };
      this.sigHandle = _manticore["default"].collectSignature({
        done: (0, _l10n["default"])('Done'),
        footer: (0, _l10n["default"])('Sig.Footer'),
        title: (0, _l10n["default"])('Sig.Title', titleSubstitutions),
        signHere: (0, _l10n["default"])('Sig.Here'),
        cancel: this.context.allowInProgressPaymentCancel ? (0, _l10n["default"])('Cancel') : null
      }, function (error, signature, cancel) {
        if (error) {
          _this2.cb(error);

          return;
        }

        if (cancel) {
          // TODO Use flow.data.alert
          _this2.alert = _manticore["default"].alert({
            title: (0, _l10n["default"])('Tx.Alert.Cancel.Title'),
            message: (0, _l10n["default"])('Tx.Alert.Cancel.Msg', formattedValues),
            buttons: [(0, _l10n["default"])('Yes')],
            cancel: (0, _l10n["default"])('No')
          }, function (a, ix) {
            a.dismiss();

            if (ix === 0) {
              _this2.cancel();
            }
          });
          return;
        }

        _retailPageTracker.Tracker.publishPageView(null, _retailPageTracker.pages.signature.withAction(_retailPageTracker.action.acquire));

        _this2.continueWithSignature(signature);
      });
    }
    /**
     * Cancel the transaction because of a signature failure.
     */

  }, {
    key: "cancel",
    value: function cancel() {
      _retailPageTracker.Tracker.publishPageView(null, _retailPageTracker.pages.signature.withAction(_retailPageTracker.action.cancel));

      var error = _sdkErrors.transaction.customerCancel;
      this.context.emit(_transactionEvent["default"].didCompleteSignature, error);
      this.cb(error);
      this.dismiss();
    }
    /**
     * Dismiss any open alert windows and emit 'cancelled' in order to notify custom signature collectors to dismiss their
     * signature collection display
     * @package
     */

  }, {
    key: "dismiss",
    value: function dismiss() {
      this.emit(SignatureReceiver.event.cancelled);

      if (this.sigHandle) {
        this.sigHandle.dismiss();
      }
    }
    /**
     * Called when the transaction is cancelled while waiting to collect the signature
     * @event SignatureReceiver#cancelled
     */

  }]);
  return SignatureReceiver;
}(_events.EventEmitter);

exports["default"] = SignatureReceiver;
SignatureReceiver.event = {
  cancelled: 'cancelled'
};

},{"../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../flows/messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./transactionEvent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionEvent.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","retail-page-tracker":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/retail-page-tracker/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TimeCard.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _moment = _interopRequireDefault(require("moment"));

var TimeCard = /*#__PURE__*/function () {
  function TimeCard() {
    (0, _classCallCheck2["default"])(this, TimeCard);
    this.timeStamps = {};
  }

  (0, _createClass2["default"])(TimeCard, [{
    key: "timeStamp",
    value: function timeStamp() {
      return (0, _moment["default"])().format('x');
    }
  }, {
    key: "clearTimestamps",
    value: function clearTimestamps() {
      this.timeStamps = {};
    }
  }, {
    key: "startTime",
    value: function startTime(name) {
      this.timeStamps["".concat(name, " Start")] = this.timeStamp();
    }
  }, {
    key: "stopTime",
    value: function stopTime(name) {
      this.timeStamps["".concat(name, " Stop")] = this.timeStamp();
      this.timeStamps["".concat(name, " Duration")] = this.timeStamps["".concat(name, " Stop")] - this.timeStamps["".concat(name, " Start")];
    }
  }]);
  return TimeCard;
}();

exports["default"] = TimeCard;
TimeCard.Events = {
  invoiceSaveStep: 'Save Invoice Step',
  invoiceSaveCall: 'Save Invoice Call',
  mtpStep: 'MTP Step',
  mtpCall: 'MTP Call',
  mftStep: 'MFT Step',
  mftCall: 'MFT Call',
  signatureStep: 'Signature Step',
  receiptStep: 'Receipt Step',
  receiptCall: 'Receipt Call',
  transaction: 'Transaction',
  voidCall: 'Void Call'
};

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionBeginOptions.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = exports.VaultType = exports.VaultProvider = exports.QRCProvider = exports.PaymentTypes = void 0;

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.replace.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreUtil = require("manticore-util");
/**
 * TransactionOptions provides the list of customizations for a given transaction
 * @class
 * @property {bool} showPromptInCardReader Show a payment prompt on the card reader's screen (if available) to
 * indicate that the customer/cashier should insert, swipe or tap a card
 * @property {bool} showPromptInApp Show a payment prompt in-app to indicate that the customer/cahsier should
 * insert, swipe or tap a card
 * @property {[FormFactor]} preferredFormFactors Use this property to set the preferred list of form factors for the
 * transaction. The actual list of form factors that will be used for a transaction will be an intersection of
 * available form factors and preferred list
 * @property {bool} tippingOnReaderEnabled Set the flag if the tipping on the reader is enabled
 * @property {bool} quickChipEnabled Set the flag if you want to enable quickChip option
 * @property {TransactionBeginOptions.PaymentTypes} paymentType Set the type of payment, default value is card
 * @property {Card} manualCard manually entered card details
 * @property {DigitalCard} digitalCard Digital Card information
 * @property {bool} amountBasedTipping Set the flag if the amount based tipping type used, otherwise, percentage based used
 * @property {bool} isAuthCapture Setting this to true will only authorize the transaction and a payment will NOT be taken.
 * The money will be moved only when a capture call is made on an authorized transaction.
 * @property {TransactionBeginOptions.VaultProvider} vaultProvider Vaulting service provider
 * @property {string} paypalOrderId Order Id provided by PayPal Order creation API
 * @property {TransactionBeginOptions.VaultType} vaultType Vaulting action to take
 * @property {string} vaultCustomerId The customer id with the specified Vaulting Service Provider
 * @property {string} tag Reserved for restricted use
 * @property {string} qrcProvider QRC payment service provider
 * @property {bool} qrcPromptEnabled Set the flag if you want to enable qrc payment with UIs for Paypal and Venmo providers
 * @property {bool} signatureOnCardReader Set the flag to take signature on eligible card readers
 */


var TransactionBeginOptions = /*#__PURE__*/function () {
  /**
   * Create transaction options object
   * @constructor
   */
  function TransactionBeginOptions() {
    (0, _classCallCheck2["default"])(this, TransactionBeginOptions);
    this.showPromptInCardReader = true;
    this.showPromptInApp = true;
    this.paymentType = TransactionBeginOptions.PaymentTypes.card;
    this.vaultType = TransactionBeginOptions.VaultType.PayOnly;
    this.tag = '';
    this.qrcPromptEnabled = false;
    this.signatureOnCardReader = true;
  }

  (0, _createClass2["default"])(TransactionBeginOptions, [{
    key: "toJSON",
    value: function toJSON() {
      return {
        showPromptInCardReader: this.showPromptInCardReader,
        showPromptInApp: this.showPromptInApp,
        preferredFormFactors: this.preferredFormFactors,
        tippingOnReaderEnabled: this.tippingOnReaderEnabled,
        amountBasedTipping: this.amountBasedTipping,
        isAuthCapture: this.isAuthCapture,
        paymentType: this.paymentType,
        quickChipEnabled: this.quickChipEnabled,
        vaultType: this.vaultType,
        tag: this.tag,
        qrcProvider: this.qrcProvider,
        qrcPromptEnabled: this.qrcPromptEnabled,
        signatureOnCardReader: this.signatureOnCardReader
      };
    }
  }, {
    key: "charityEnabled",
    get: function get() {
      var _context;

      return this.tag && (0, _includes["default"])(_context = this.tag).call(_context, 'charityEnabled');
    }
  }, {
    key: "skipReceipt",
    get: function get() {
      var _context2;

      return this.tag && (0, _includes["default"])(_context2 = this.tag).call(_context2, 'skipReceipt');
    }
  }, {
    key: "showReceiptForAuth",
    get: function get() {
      var _context3;

      return this.tag && (0, _includes["default"])(_context3 = this.tag).call(_context3, 'showReceiptForAuth');
    }
  }, {
    key: "switchToLightTheme",
    get: function get() {
      var _context4;

      return this.tag && (0, _includes["default"])(_context4 = this.tag).call(_context4, 'switchToLightTheme');
    }
  }, {
    key: "skipSignature",
    get: function get() {
      var _context5;

      return this.tag && (0, _includes["default"])(_context5 = this.tag).call(_context5, 'skipSignature');
    }
    /**
     * @returns {string} allTags return string with all tags
     */

  }, {
    key: "getAllTags",
    value: function getAllTags() {
      return this.tag;
    }
    /**
     * Add a tag if not present to the list of tags
     * @param {string} newTag add tag given as string
     */

  }, {
    key: "addTag",
    value: function addTag(newTag) {
      var _context6;

      if (!(0, _includes["default"])(_context6 = this.tag).call(_context6, newTag)) {
        this.tag += newTag;
      }
    }
    /**
     * Remove tag from the list of tags
     * @param {string} removeTag
     */

  }, {
    key: "removeTag",
    value: function removeTag(_removeTag) {
      this.tag.replace(_removeTag, '');
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this);
    }
  }]);
  return TransactionBeginOptions;
}(); // Values are from InvoiceEnums.PaymentMethod

/**
 * Payment Methods enum for Transaction Begin Options
 * @enum {int}
 */


exports["default"] = TransactionBeginOptions;
TransactionBeginOptions.PaymentTypes = {
  /**
   * Payment type for card (credit / debit)
   */
  card: 4,

  /**
   * Payment type for Keyed In Card
   */
  keyIn: 10,

  /**
   * Payment type for cash
   */
  cash: 2,

  /**
   * Payment type for check
   */
  check: 3,

  /**
   * Payment type for Digital Card
   */
  digitalCard: 9,

  /**
   * Payment type for QRC
   */
  qrc: 11
};
/**
 * Vault Type
 * @enum {int}
 */

TransactionBeginOptions.VaultType = {
  /**
   * Use card for payment alone
   */
  PayOnly: 0,

  /**
   * Tokenize the card with the provided vault provider
   */
  VaultOnly: 1,

  /**
   * Use the card for payment and then tokenize it with the supplied vault provider
   */
  PayAndVault: 2
};
/**
 * Vault Provider
 * @enum {int}
 */

TransactionBeginOptions.VaultProvider = {
  /**
   * Braintree vault provider
   */
  Braintree: 0
};
/**
 * QRC Provider
 * @enum {int}
 */

TransactionBeginOptions.QRCProvider = {
  /**
   * Paypal QRC provider
   */
  Paypal: 0,

  /**
   * Venmo QRC provider
   */
  Venmo: 1
};
TransactionBeginOptions.PaymentTypes.toString = (0, _manticoreUtil.reverseKeysAndValues)(TransactionBeginOptions.PaymentTypes);
TransactionBeginOptions.VaultType.toString = (0, _manticoreUtil.reverseKeysAndValues)(TransactionBeginOptions.VaultType);
TransactionBeginOptions.VaultProvider.toString = (0, _manticoreUtil.reverseKeysAndValues)(TransactionBeginOptions.VaultProvider);
TransactionBeginOptions.QRCProvider.toString = (0, _manticoreUtil.reverseKeysAndValues)(TransactionBeginOptions.QRCProvider);
var PaymentTypes = TransactionBeginOptions.PaymentTypes,
    VaultType = TransactionBeginOptions.VaultType,
    VaultProvider = TransactionBeginOptions.VaultProvider,
    QRCProvider = TransactionBeginOptions.QRCProvider;
exports.QRCProvider = QRCProvider;
exports.VaultProvider = VaultProvider;
exports.VaultType = VaultType;
exports.PaymentTypes = PaymentTypes;

},{"@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.replace.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionContext.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _sliceInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _splice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/splice"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.match.js");

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _get3 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticore = _interopRequireDefault(require("manticore"));

var _isNil = _interopRequireDefault(require("ramda/src/isNil"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _pphSdkEnums = require("@paypalcorp/pph-sdk-enums");

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _retailPageTracker = require("retail-page-tracker");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreUtil = require("manticore-util");

var _events2 = require("events");

var _async = _interopRequireDefault(require("async"));

var _l10n = _interopRequireDefault(require("../common/l10n"));

var _sdkErrors = require("../common/sdkErrors");

var _TransactionStateManager = _interopRequireDefault(require("./TransactionStateManager"));

var _transactionStates = require("./transactionStates");

var _PaymentErrorHandler = _interopRequireDefault(require("../flows/PaymentErrorHandler"));

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _PPObjects = _interopRequireDefault(require("../common/PPObjects"));

var messageHelper = _interopRequireWildcard(require("../flows/messageHelper"));

var _DeviceController = _interopRequireDefault(require("./DeviceController"));

var _DeviceSelector = _interopRequireDefault(require("../paymentDevice/DeviceSelector"));

var _transactionEvent = _interopRequireDefault(require("./transactionEvent"));

var _OfflineDeclineFlow = _interopRequireDefault(require("../flows/OfflineDeclineFlow"));

var _OfferReceiptFlow = _interopRequireDefault(require("../flows/OfferReceiptFlow"));

var _retailSDKUtil = require("../common/retailSDKUtil");

var _SimulationManager = _interopRequireDefault(require("../common/SimulationManager"));

var _TransactionBeginOptions = _interopRequireWildcard(require("./TransactionBeginOptions"));

var _InstLogger = require("../common/InstLogger");

var _TimeCard = _interopRequireDefault(require("./TimeCard"));

var _TimeoutManager = _interopRequireDefault(require("../common/TimeoutManager"));

var _QRCContext = _interopRequireDefault(require("./qrc/QRCContext"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"];

  if (!it) {
    if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = it.call(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context18;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty2(_context18 = Object.prototype.toString.call(o)).call(_context18, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context16, _context17;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context16 = ownKeys(Object(source), !0)).call(_context16, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context17 = ownKeys(Object(source))).call(_context17, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('transactionContext');
var ErrorAction = _PaymentErrorHandler["default"].action;

var _events = require('../common/eventTracking').tracking; // eslint-disable-line global-require
// We can add non-card PaymentTypes here that need validation in _continuePayment


var _paymentFlowAmountValidationPaymentTypes = [];
/**
 * The TransactionContext class is returned by RetailSDK.getTransactionManager().createTransaction and allows
 * you to control many aspects of the payment or refund flow and observe events that
 * occur during the flows. Simply creating a TransactionContext will not kick off any behaviors,
 * so that you have a chance to configure the transaction context as you wish (enable on-reader tipping
 * , specify transaction options, etc). When you're ready to proceed with the payment flow,
 * call beginPayment()
 * @class
 * @property {RetailInvoice} invoice The invoice being processed for this transaction @readonly
 * @property {TransactionType} type The type of transaction being attempted
 *  (defaults to Sale if the invoice is not already paid, Refund if it is already paid)
 * @property {bool} isSignatureRequired Given the current state of the invoice and transaction,
 *  is a signature required to secure payment? @readonly
 * @property {DigitalCard} digitalCard Digital Card information
 * @property {string} orderId id of the PP order for payment
 * @property {string} totalDisplayFooter While building your invoice, the running total
 *  will be displayed on PaymentDevices capable of displaying messages. If you set
 *  totalDisplayFooter, that will be displayed (centered) after the total
 *  amount. Note that once the payment flow starts, EMV certification requires that the display
 *  just show the total and iconography corresponding to expected payment types. Your message
 *  will not be on that screen.
 */

var TransactionContext = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(TransactionContext, _EventEmitter);

  var _super = _createSuper(TransactionContext);
  /**
   * Only JS constructs this
   * @package
   * @param {RetailInvoice} invoice The invoice for this transaction
   * @param {Merchant} merchant The merchant to use for this transaction
   * @param {bool} offlinePaymentEnabled the flag showing the offline payment mode
   */


  function TransactionContext(invoice, merchant) {
    var _this;

    var offlinePaymentEnabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
    var enableForVaultOnlyFlow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
    (0, _classCallCheck2["default"])(this, TransactionContext);
    _this = _super.call(this);
    _this.invoice = invoice;
    _this.merchant = merchant;
    _this.offlinePaymentEnabled = offlinePaymentEnabled;
    _this.enabledForVaultOnlyFlow = enableForVaultOnlyFlow;
    _this.id = "tx-".concat((0, _retailSDKUtil.getRandomId)());
    _Merchant["default"].sdkContextId = _this.id;
    _this.log = Log.withContext(function () {
      return {
        contextId: _this.id
      };
    });
    _this._state = new _TransactionStateManager["default"]((0, _assertThisInitialized2["default"])(_this));
    _this.deviceController = new _DeviceController["default"]((0, _assertThisInitialized2["default"])(_this));
    _this.timeCard = new _TimeCard["default"]();
    _this.timeoutManager = new _TimeoutManager["default"](function (message) {
      var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

      _this.log.error(message, _objectSpread(_objectSpread({}, data), {}, {
        transactionContext: _this.toJSON()
      }));
    }, function (message) {
      var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

      _this.log.debug(message, _objectSpread(_objectSpread({}, data), {}, {
        transactionContext: _this.toJSON()
      }));
    });
    _this.waitForCardRemovalIds = [];

    if (invoice.status === _paypalInvoicing.InvoiceEnums.Status.PAID || invoice.status === _paypalInvoicing.InvoiceEnums.Status.MARKED_AS_PAID || invoice.status === _paypalInvoicing.InvoiceEnums.Status.PARTIALLY_REFUNDED) {
      _this.type = _retailPaymentDevice.TransactionType.Refund;
    } else if (enableForVaultOnlyFlow) {
      _this.type = _retailPaymentDevice.TransactionType.Vault;
    } else {
      _this.type = _retailPaymentDevice.TransactionType.Sale;
    }

    _this.logDigitalCardState('CREATE transaction invoice info');

    _this.log.debug('Create transaction context', function () {
      return {
        total: _this.invoice.total,
        type: _this.type
      };
    });

    _this.offlineTransactionAdditionHandler = function () {
      return _this.log.info('Offline Transaction Addition Completed Handler not set');
    };

    _this._deferredBeginHandler = function () {
      if (!_DeviceSelector["default"].selectedDevice) {
        _this.log.error('deferredBeginHandlerInvokedWithoutConnectedCR');

        return;
      }

      if (!_this._deferredActivateOptions) {
        _this.log.debug('Deferred transaction begin invoked but options are missing');

        return;
      }

      _this.log.info('deferredBeginHandlerInvoked', function () {
        return {
          deviceId: _DeviceSelector["default"].selectedDevice.id
        };
      });

      _this.beginPayment(_this._deferredActivateOptions);
    };

    return _this;
  }

  (0, _createClass2["default"])(TransactionContext, [{
    key: "logDigitalCardState",
    value: function logDigitalCardState(logTitle) {
      var _this$invoice, _this$invoice2, _this$invoice3, _this$invoice4, _this$invoice5, _this$invoice6, _this$invoice7, _this$invoice8, _this$invoice9, _this$invoice10;

      this.log.debug(logTitle, {
        invoiceId: (_this$invoice = this.invoice) === null || _this$invoice === void 0 ? void 0 : _this$invoice.payPalId,
        total: (_this$invoice2 = this.invoice) === null || _this$invoice2 === void 0 ? void 0 : _this$invoice2.total,
        originalTotal: (_this$invoice3 = this.invoice) === null || _this$invoice3 === void 0 ? void 0 : _this$invoice3.originalTotal,
        digitalCardTotal: (_this$invoice4 = this.invoice) === null || _this$invoice4 === void 0 ? void 0 : _this$invoice4.digitalCardTotal,
        payments: (_this$invoice5 = this.invoice) === null || _this$invoice5 === void 0 ? void 0 : _this$invoice5.payments,
        items: (_this$invoice6 = this.invoice) === null || _this$invoice6 === void 0 ? void 0 : _this$invoice6.items,
        status: (_this$invoice7 = this.invoice) === null || _this$invoice7 === void 0 ? void 0 : _this$invoice7.status,
        tax: (_this$invoice8 = this.invoice) === null || _this$invoice8 === void 0 ? void 0 : _this$invoice8.itemTax,
        tip: ((_this$invoice9 = this.invoice) === null || _this$invoice9 === void 0 ? void 0 : _this$invoice9.gratuityAmount) || 0,
        discount: (_this$invoice10 = this.invoice) === null || _this$invoice10 === void 0 ? void 0 : _this$invoice10.totalDiscount,
        hasDigitalGiftCardPayment: this.invoice.hasDigitalGiftCardPayment
      });
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      var _this$flow, _this$flow$flow, _this$invoice11, _this$invoice12, _this$invoice13, _this$card;

      return {
        contextId: this.id,
        flowStep: (_this$flow = this.flow) === null || _this$flow === void 0 ? void 0 : (_this$flow$flow = _this$flow.flow) === null || _this$flow$flow === void 0 ? void 0 : _this$flow$flow.stepName,
        invoiceId: (_this$invoice11 = this.invoice) === null || _this$invoice11 === void 0 ? void 0 : _this$invoice11.payPalId,
        type: this.type,
        currency: (_this$invoice12 = this.invoice) === null || _this$invoice12 === void 0 ? void 0 : _this$invoice12.currency,
        total: (_this$invoice13 = this.invoice) === null || _this$invoice13 === void 0 ? void 0 : _this$invoice13.total,
        state: this._state.toJSON(),
        cardEmvInfo: (_this$card = this.card) === null || _this$card === void 0 ? void 0 : _this$card.emvResponseInfo
      };
    }
  }, {
    key: "totalDisplayFooter",
    get: function get() {
      return this._totalDisplayFooter;
    },
    set: function set(value) {
      this._totalDisplayFooter = value;
      this.emit(_transactionEvent["default"].invoiceDisplayFooterUpdated);
    }
  }, {
    key: "processErrorHandlerResponse",
    value: function processErrorHandlerResponse(error, errAction, ff, opt) {
      var _this2 = this,
          _opt$showPrompt,
          _opt$syncInvoiceTotal;

      this.log.info('errHandlerResponse', function () {
        return {
          error: error,
          ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, ff),
          errorAction: (0, _manticoreUtil.getPropertyName)(ErrorAction, errAction)
        };
      });

      if (!errAction) {
        return;
      }

      if (errAction === ErrorAction.offlineDecline) {
        var returnError = error.code === _retailPaymentDevice.deviceError.cancelReadCardData.code || error.code === _retailPaymentDevice.deviceError.smartCardNotInSlot.code ? _sdkErrors.transaction.customerCancel : _retailPaymentDevice.deviceError.contactIssuer;
        var offlineDeclineFlow = new _OfflineDeclineFlow["default"](returnError, this, function (data) {
          _this2.end(data.error, data.tx);
        });
        offlineDeclineFlow.startFlow();
        return;
      }

      if (errAction === ErrorAction.abort) {
        var _returnError = error || _sdkErrors.transaction.genericCancel;

        if (error.code === _retailPaymentDevice.deviceError.paymentCancelled.code) {
          _returnError = _sdkErrors.transaction.customerCancel;
        }

        this.end(_returnError);
        return;
      } // Setting the payment state to 'retry' to re-ask for tipping when on-reader tipping is enabled


      this._state.setPaymentState(_transactionStates.PaymentState.retry);

      var deactivateFF = [];
      var activateFF = [];

      if (this.offlinePaymentEnabled) {
        deactivateFF = [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.EmvCertifiedContactless];
        activateFF = [_retailPaymentDevice.FormFactor.MagneticCardSwipe];
      } else if (errAction === ErrorAction.retry) {
        activateFF = [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.MagneticCardSwipe, _retailPaymentDevice.FormFactor.EmvCertifiedContactless];
      } else if (errAction === ErrorAction.retryWithDeactivation) {
        deactivateFF = [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.MagneticCardSwipe, _retailPaymentDevice.FormFactor.EmvCertifiedContactless];
        activateFF = [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.MagneticCardSwipe, _retailPaymentDevice.FormFactor.EmvCertifiedContactless];
      } else if (errAction === ErrorAction.retryWithInsertOrSwipe) {
        deactivateFF = [_retailPaymentDevice.FormFactor.EmvCertifiedContactless];
        activateFF = [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.MagneticCardSwipe];
      } else if (errAction === ErrorAction.retryWithSwipe) {
        deactivateFF = [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.EmvCertifiedContactless];
        activateFF = [_retailPaymentDevice.FormFactor.MagneticCardSwipe];
      } else if (errAction === ErrorAction.retryWithInsert) {
        deactivateFF = [_retailPaymentDevice.FormFactor.MagneticCardSwipe, _retailPaymentDevice.FormFactor.EmvCertifiedContactless];
        activateFF = [_retailPaymentDevice.FormFactor.Chip];
      } else if (errAction === ErrorAction.retryWithNoChange) {
        this.promptForPaymentInstrument(undefined, undefined, opt);
        return;
      }

      var showPrompt = (_opt$showPrompt = opt === null || opt === void 0 ? void 0 : opt.showPrompt) !== null && _opt$showPrompt !== void 0 ? _opt$showPrompt : true;
      var syncInvoiceTotal = (_opt$syncInvoiceTotal = opt === null || opt === void 0 ? void 0 : opt.syncInvoiceTotal) !== null && _opt$syncInvoiceTotal !== void 0 ? _opt$syncInvoiceTotal : true;
      this.deviceController.selectedDevice.deactivateFormFactors(deactivateFF, function () {
        _this2.deviceController.activate({
          showPrompt: showPrompt,
          syncInvoiceTotal: syncInvoiceTotal,
          formFactors: activateFF
        });

        _this2.promptForPaymentInstrument(undefined, activateFF, opt);
      });
    }
  }, {
    key: "getSetOfActiveFormFactors",
    value: function getSetOfActiveFormFactors() {
      return this._state.getSetOfActiveFormFactors();
    }
    /**
     * Returns the current state of payment
     * @returns {PaymentState} Payment state of current transaction
     */

  }, {
    key: "getPaymentState",
    value: function getPaymentState() {
      return this._state.getPaymentState();
    }
    /**
     * Returns the current state of tipping
     * @returns {TippingState} Tipping state of current transaction
     */

  }, {
    key: "getTippingState",
    value: function getTippingState() {
      return this._state.getTippingState();
    }
  }, {
    key: "setPaymentState",
    value: function setPaymentState(state) {
      this._state.setPaymentState(state);
    }
    /**
     * Clear the on-reader tip that was acquired for this transaction
     */

  }, {
    key: "clearOnReaderTip",
    value: function clearOnReaderTip() {
      var _this3 = this;

      this.log.debug('Clearing tip', function () {
        return {
          gratuity: _this3.invoice.gratuityAmount
        };
      });

      this._state.setTippingState(_transactionStates.TippingState.notStarted);

      this.invoice.gratuityAmount = 0;
    }
  }, {
    key: "quickChipEnabled",
    get: function get() {
      var _this$paymentOptions, _this$card2;

      return _Merchant["default"].active.country === 'US' && ((_this$paymentOptions = this.paymentOptions) === null || _this$paymentOptions === void 0 ? void 0 : _this$paymentOptions.quickChipEnabled) && ((0, _isNil["default"])((_this$card2 = this.card) === null || _this$card2 === void 0 ? void 0 : _this$card2.formFactor) || this.card.formFactor === _retailPaymentDevice.FormFactor.Chip);
    }
  }, {
    key: "isQuickChipAmountKnown",
    get: function get() {
      return this.quickChipEnabled && this.invoice.total.isGreaterThan(0);
    }
    /**
     * Begin the payment flow (activate payment devices, listen for relevant events from devices)
     * @param {TransactionBeginOptions} paymentOptions Custom options for the transaction
     * @returns {TransactionContext} Returns this object just to make chaining easier
     */

  }, {
    key: "beginPayment",
    value: function beginPayment(paymentOptions) {
      var _this$paymentOptions2,
          _this4 = this;

      if (this._state.isCompletionInvoked()) {
        this.log.error('Cannot begin payment on transaction context that was already ended.');
        return this;
      }

      this.logDigitalCardState('beginPayment invoice info'); // Make a copy of options as some values may be altered during method execution

      this.paymentOptions = (0, _assign["default"])(new _TransactionBeginOptions["default"](), paymentOptions);
      var options = this.paymentOptions;
      this.timeCard.clearTimestamps();
      this.timeCard.startTime(_TimeCard["default"].Events.transaction);

      if (!this._isInvoiceItemValid()) {
        this.end(_sdkErrors.transaction.invalidInvoiceItem);
        return this;
      }

      this.qrcPromptEnabled = _Merchant["default"].active.country === 'US' && ((_this$paymentOptions2 = this.paymentOptions) === null || _this$paymentOptions2 === void 0 ? void 0 : _this$paymentOptions2.qrcPromptEnabled); // TODO - Remove me after AUTH/CAPTURE is certified for UK & AU

      if (options.isAuthCapture && !new _set["default"](['US', 'GB']).has(_Merchant["default"].active.country)) {
        this.end(_sdkErrors.transaction.notSupported.withDevMessage("Auth/Capture not supported for merchant country '".concat(_Merchant["default"].active.country, "'")));
        return this;
      }

      if ((this.isTransactionVaultOnly || this.isTransactionPayAndVault) && !new _set["default"](['US', 'GB', 'AU']).has(_Merchant["default"].active.country)) {
        this.end(_sdkErrors.transaction.notSupported.withDevMessage("Vault is not supported for merchant country '".concat(_Merchant["default"].active.country, "'")));
        return this;
      }

      this.log.debug('Starting payment', function () {
        return {
          options: options,
          PaymentState: (0, _manticoreUtil.getPropertyName)(_transactionStates.PaymentState, _this4.getPaymentState())
        };
      });

      if (this._state.getPaymentState() !== _transactionStates.PaymentState.idle && this._state.getPaymentState() !== _transactionStates.PaymentState.complete) {
        this.log.warn('PaymentInProgressSoWillNotBeginPayment.', function () {
          return {
            state: (0, _manticoreUtil.getPropertyName)(_transactionStates.PaymentState, _this4.getPaymentState())
          };
        });
        return this;
      }

      _retailPageTracker.Tracker.publishPageView(null, _retailPageTracker.pages.transaction);

      if (this.type !== _retailPaymentDevice.TransactionType.Sale && this.type !== _retailPaymentDevice.TransactionType.Auth && this.type !== _retailPaymentDevice.TransactionType.Vault) {
        this.end(_sdkErrors.transaction.invoiceStatusMismatch);
        return this;
      }

      if ((this.isTransactionVaultOnly || this.isTransactionPayAndVault) && this.paymentOptions.paymentType !== _TransactionBeginOptions.PaymentTypes.card) {
        this.end(_sdkErrors.transaction.notSupported.withDevMessage("Vault is not supported with this payment type '".concat(this.paymentOptions.paymentType, "'")));
        return this;
      }

      if (options.isAuthCapture) {
        this.type = _retailPaymentDevice.TransactionType.Auth;
      } else if (this.enabledForVaultOnlyFlow) {
        this.type = _retailPaymentDevice.TransactionType.Vault;
      } else {
        this.type = _retailPaymentDevice.TransactionType.Sale;
      } // eslint-disable-next-line consistent-return


      var continueStartingPayment = function continueStartingPayment() {
        switch (options.paymentType) {
          case _TransactionBeginOptions.PaymentTypes.cash:
            _this4.continueWithCash();

            return _this4;

          case _TransactionBeginOptions.PaymentTypes.check:
            _this4.continueWithCheck();

            return _this4;

          case _TransactionBeginOptions.PaymentTypes.keyIn:
            _this4.continueWithCard(options.manualCard);

            return _this4;

          case _TransactionBeginOptions.PaymentTypes.qrc:
            _this4.continueWithQRC();

            return _this4;

          case _TransactionBeginOptions.PaymentTypes.digitalCard:
            if (options.showPromptInCardReader && options.tippingOnReaderEnabled) {
              _this4._beginTippingOnReader(options.amountBasedTipping, true, function () {
                _this4.continueWithDigitalCard(options.digitalCard);
              });
            } else {
              _this4.continueWithDigitalCard(options.digitalCard);
            }

            return _this4;

          default:
            break;
        } // If a device is not connected by the time the begin is invoked, defer the invoke to until after the device is connected


        if (!_DeviceSelector["default"].selectedDevice || !_DeviceSelector["default"].selectedDevice.isConnected()) {
          _this4.log.warn('Deferring payment, check reader:', {
            selectedCR: _DeviceSelector["default"].selectedDevice
          });

          _this4._deferredActivateOptions = options;

          _retailPaymentDevice.PaymentDevice.Events.removeListener(_retailPaymentDevice.PaymentDevice.Event.connected, _this4._deferredBeginHandler);

          _retailPaymentDevice.PaymentDevice.Events.once(_retailPaymentDevice.PaymentDevice.Event.connected, _this4._deferredBeginHandler);

          return _this4;
        }

        _retailPaymentDevice.PaymentDevice.Events.removeListener(_retailPaymentDevice.PaymentDevice.Event.connected, _this4._deferredBeginHandler);

        if (_this4.quickChipEnabled) {
          options.preferredFormFactors = [_retailPaymentDevice.FormFactor.MagneticCardSwipe, _retailPaymentDevice.FormFactor.Chip];
        }

        if (options.showPromptInCardReader && options.tippingOnReaderEnabled) {
          _this4._beginTippingOnReader(options.amountBasedTipping, true, function () {
            _this4.log.debug('PostOnReaderTipping Reader Activation:', function () {
              var _PaymentDevice$device;

              return {
                numberOfDevices: _retailPaymentDevice.PaymentDevice === null || _retailPaymentDevice.PaymentDevice === void 0 ? void 0 : (_PaymentDevice$device = _retailPaymentDevice.PaymentDevice.devices) === null || _PaymentDevice$device === void 0 ? void 0 : _PaymentDevice$device.length
              };
            });

            _this4._activateReaders({
              showPromptInCardReader: options.showPromptInCardReader,
              showPromptInApp: options.showPromptInApp,
              formFactors: options.preferredFormFactors,
              syncInvoiceTotal: !options.showPromptInCardReader
            });
          });
        } else {
          _this4.log.debug('ActivatingConnectedReaders:', function () {
            var _PaymentDevice$device2;

            return {
              numberOfDevices: _retailPaymentDevice.PaymentDevice === null || _retailPaymentDevice.PaymentDevice === void 0 ? void 0 : (_PaymentDevice$device2 = _retailPaymentDevice.PaymentDevice.devices) === null || _PaymentDevice$device2 === void 0 ? void 0 : _PaymentDevice$device2.length,
              approvedFormFactors: _this4.deviceController.getApprovedFormFactors(options.preferredFormFactors)
            };
          });

          _this4._activateReaders({
            showPromptInCardReader: options.showPromptInCardReader,
            showPromptInApp: options.showPromptInApp,
            formFactors: _this4.deviceController.getApprovedFormFactors(options.preferredFormFactors)
          });
        }
      };

      continueStartingPayment();
      return this;
    }
  }, {
    key: "_isInvoiceItemValid",
    value: function _isInvoiceItemValid() {
      var _iterator = _createForOfIteratorHelper(this.invoice.items),
          _step;

      try {
        for (_iterator.s(); !(_step = _iterator.n()).done;) {
          var item = _step.value;

          if (item.taxRate < 0 || item.quantity < 0 || item.unitPrice.isLessThan(0) && item.taxRate > 0) {
            this.log.error('InvoiceItemHasNegativeTaxOrQuantityValue', {
              item: (0, _stringify["default"])(item, null, 4)
            });
            return false;
          }
        }
      } catch (err) {
        _iterator.e(err);
      } finally {
        _iterator.f();
      }

      return true;
    }
  }, {
    key: "shouldSimulateError53",
    value: function shouldSimulateError53() {
      // return true if sandbox and simulation requested
      var env = _Merchant["default"].active.api.env;
      return _retailPaymentDevice.deviceError.timeout.equals(_SimulationManager["default"].errorToSimulate) && env === 'sandbox';
    }
  }, {
    key: "_beginTippingOnReader",
    value: function _beginTippingOnReader(amountBasedTip) {
      var _this5 = this;

      var deactivateNeeded = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
      var cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};

      var tipState = this._state.getTippingState();

      var paymentState = this._state.getPaymentState();

      var doTipping = true;
      this.log.debug('InitiatingOnReaderTipping: ', function () {
        return {
          tippingState: _this5.getTippingState(),
          paymentState: _this5.getPaymentState()
        };
      });

      if (tipState === _transactionStates.TippingState.inProgress || paymentState === _transactionStates.PaymentState.inProgress) {
        this.log.debug('Will not start tipping flow as either tipping or payment is in progress');
        doTipping = false;
      } else if (tipState === _transactionStates.TippingState.complete) {
        // Re-acquire tip while retrying a payment
        if (paymentState === _transactionStates.PaymentState.retry && !this.card.isMSRFallbackAllowed) {
          this.log.debug('Tipping was complete, but will restart tipping as payment is being retried');
          doTipping = true;
        } else {
          this.log.debug('Will not start tipping flow as tipping flow is complete');
          doTipping = false;
        }
      }

      if (!doTipping) {
        this.log.debug('Bypassing tipping as it cannot be performed in current transaction state');
        cb();
        return;
      }

      var activeReader = this.deviceController.selectedDevice;

      if (!activeReader || !activeReader.doesHaveCapability(_retailPaymentDevice.deviceCapabilityType.display)) {
        if (!activeReader) {
          this.log.debug('Bypassing tipping, no active reader');
        } else {
          this.log.debug('Bypassing tipping, no reader display', function () {
            return {
              deviceId: activeReader.id
            };
          });
        }

        cb();
        return;
      }

      this.log.info('BeginTippingOnReader', {
        amountBasedTip: amountBasedTip,
        state: this._state
      });

      this._state.setTippingState(_transactionStates.TippingState.inProgress);

      var TipFlow = require('../flows/ReaderTippingFlow')["default"]; // eslint-disable-line global-require


      this.tippingFlow = new TipFlow(activeReader, amountBasedTip, this.invoice, function () {
        _this5.log.debug('Tipping on Reader flow completed');

        _this5._state.setTippingState(_transactionStates.TippingState.complete);

        _this5.emit(_transactionEvent["default"].readerTippingCompleted, _this5.invoice.gratuityAmount);

        _this5.timeoutManager.startTimeoutMonitor('TippingFlowComplete');

        cb();
      });

      var flowStart = function flowStart() {
        _this5._stopInvoiceSync();

        _this5.timeoutManager.startTimeoutMonitor('TippingFlowStart', true);

        _this5.tippingFlow.start().then(function () {
          return _this5.log.debug('Tipping on Reader flow done');
        })["catch"](function (error) {
          _this5._state.setTippingState(_transactionStates.TippingState.complete);

          _this5.log.error('TippingFlowFailed', {
            err: error
          });

          cb();
        });
      }; // We don't want card swipes or inserts to be processed during tipping flow
      // That's the reason we do deactivate form factors before starting the tipping flow


      if (deactivateNeeded) {
        this.deactivateFormFactors((0, _toConsumableArray2["default"])(this.getSetOfActiveFormFactors()), flowStart);
      } else {
        flowStart();
      }
    }
    /**
     * Begin the flow to issue a refund on the current invoice.
     * @param {bool} promptForCardOptions true to ask whether the refund is with or without card, false for without card
     * method originally used on the invoice
     * @param {decimal} amount the amount to refund
     * @returns {TransactionContext} Returns this object just to make chaining easier
     */

  }, {
    key: "beginRefund",
    value: function beginRefund(promptForCardOptions, amount) {
      return this.beginRefundWithTag(promptForCardOptions, amount, '');
    }
    /**
     * Begin the flow to issue a refund on the current invoice.
     * @nativeName beginRefund
     * @param {bool} promptForCardOptions true to ask whether the refund is with or without card, false for without card
     * method originally used on the invoice
     * @param {decimal} amount the amount to refund
     * @param {string} refundTag Reserved for restricted use
     * @returns {TransactionContext} Returns this object just to make chaining easier
     */

  }, {
    key: "beginRefundWithTag",
    value: function beginRefundWithTag(promptForCardOptions, amount, refundTag) {
      var _this6 = this;

      this.log.debug('BeginRefund', function () {
        return {
          refundTag: refundTag,
          promptForCardOptions: promptForCardOptions
        };
      });

      if (this.type !== _retailPaymentDevice.TransactionType.Refund) {
        this.end(_sdkErrors.transaction.invoiceStatusMismatch);
        return this;
      }

      this.refundTheme = refundTag && (0, _includes["default"])(refundTag).call(refundTag, 'switchToLightTheme');
      this.refundSkipReceipt = refundTag && (0, _includes["default"])(refundTag).call(refundTag, 'skipReceipt');

      _retailPageTracker.Tracker.publishPageView(null, _retailPageTracker.pages.refund);

      this._reset();

      this.refundAmount = _paypalInvoicing.Currency.serverRound(this.invoice.currency, amount);

      if (promptForCardOptions && this.deviceController.selectedDevice) {
        this.emit(_transactionEvent["default"].refundAmountEntered, this.refundAmount);
        var alertOpts = {
          title: (0, _l10n["default"])('Tx.Alert.Refund.Title'),
          message: (0, _l10n["default"])('Tx.Alert.Refund.Msg'),
          buttons: [(0, _l10n["default"])('Tx.Alert.Refund.Buttons.WithCard'), (0, _l10n["default"])('Tx.Alert.Refund.Buttons.WithoutCard')],
          cancel: (0, _l10n["default"])('Cancel')
        };
        this.alert = _manticore["default"].alert(alertOpts, function (a, ix) {
          if (_this6.alert) {
            _this6.alert.dismiss();
          }

          if (ix === 2) {
            // Cancel
            _this6.end(_sdkErrors.transaction.customerCancel);

            return;
          }

          var event = {
            event: _events.REFUND_OPTION,
            key: _events.REFUND_OPTION_KEY
          };

          if (ix === 0) {
            // Refund with Card
            _manticore["default"].trackingEvent(_objectSpread(_objectSpread({}, event), {}, {
              attribute: _events.REFUND_OPTION_WITHCARD
            }));

            if (_this6.deviceController.selectedDevice) {
              _this6._activateReaders({
                showPromptInCardReader: true,
                showPromptInApp: true
              });
            } else {
              _this6.continueWithCard(null);
            }
          }

          if (ix === 1) {
            // Refund without Card
            _manticore["default"].trackingEvent(_objectSpread(_objectSpread({}, event), {}, {
              attribute: _events.REFUND_OPTION_WITHOUTCARD
            }));

            _this6.continueWithCard(null);
          }
        });
        return this;
      } // beginRefund was called with card not present, so continue with null card


      this.continueWithCard(null);
      return this;
    }
  }, {
    key: "isInvoiceAmountBelowAllowedMinimum",
    value: function isInvoiceAmountBelowAllowedMinimum() {
      var _Merchant$active$card;

      if (this.isRefund() || !((_Merchant$active$card = _Merchant["default"].active.cardSettings) !== null && _Merchant$active$card !== void 0 && _Merchant$active$card.minimum)) {
        return false;
      }

      var amount = this.isRefund() ? this.refundAmount : this.invoice.total;
      return amount.isLessThan(_Merchant["default"].active.cardSettings.minimum);
    }
  }, {
    key: "isInvoiceAmountAboveAllowedMaximum",
    value: function isInvoiceAmountAboveAllowedMaximum() {
      var _Merchant$active$card2;

      if (!((_Merchant$active$card2 = _Merchant["default"].active.cardSettings) !== null && _Merchant$active$card2 !== void 0 && _Merchant$active$card2.maximum)) {
        return false;
      }

      var amount = this.isRefund() ? this.refundAmount : this.invoice.total;
      return amount.isGreaterThan(_Merchant["default"].active.cardSettings.maximum);
    }
  }, {
    key: "getInvoiceAmountValidationError",
    value: function getInvoiceAmountValidationError() {
      if (this.isInvoiceAmountBelowAllowedMinimum()) {
        return _sdkErrors.transaction.amountTooLow;
      }

      if (this.isInvoiceAmountAboveAllowedMaximum()) {
        return _sdkErrors.transaction.amountTooHigh;
      }

      return null;
    }
  }, {
    key: "processAmountError",
    value: function processAmountError(amountError, card) {
      var _this7 = this;

      var errorHandlerCb = function errorHandlerCb() {
        return _this7.processErrorHandlerResponse(amountError, _PaymentErrorHandler["default"].action.abort, card === null || card === void 0 ? void 0 : card.formFactor);
      };

      var errorHandler = new _PaymentErrorHandler["default"](this);
      errorHandler.handle(amountError, card === null || card === void 0 ? void 0 : card.formFactor, this.deviceController.selectedDevice, (0, _bind["default"])(errorHandlerCb).call(errorHandlerCb, this));
    }
  }, {
    key: "_activateReaders",
    value: function _activateReaders(opt) {
      var _this8 = this;

      var showPromptInCardReader = opt.showPromptInCardReader,
          showPromptInApp = opt.showPromptInApp;
      this.showPromptInApp = showPromptInApp;
      var preferredFormFactors = opt.formFactors;
      var activeReader = this.deviceController.selectedDevice;
      var deviceId = activeReader ? activeReader.id : '<no reader>';
      this.log.debug('Activate reader', function () {
        return {
          deviceId: deviceId,
          formFactors: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, preferredFormFactors)
        };
      });

      if (!preferredFormFactors || preferredFormFactors.length === 0) {
        preferredFormFactors = [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.EmvCertifiedContactless, _retailPaymentDevice.FormFactor.MagneticCardSwipe];
      }

      if (this.offlinePaymentEnabled && activeReader.manufacturer === _retailPaymentDevice.deviceManufacturer.roam) {
        this.alert = _manticore["default"].alert({
          title: (0, _l10n["default"])('OfflinePayment.NoAudioReader'),
          message: (0, _l10n["default"])(''),
          cancel: (0, _l10n["default"])('Ok')
        }, function () {
          _this8.end(_sdkErrors.transaction.noAudioReaderWhenOffline);
        });
        return;
      }

      if (this.offlinePaymentEnabled) {
        preferredFormFactors = [_retailPaymentDevice.FormFactor.MagneticCardSwipe];
      }

      if (this._state.getPaymentState() === _transactionStates.PaymentState.inProgress || this._state.getTippingState() === _transactionStates.TippingState.inProgress) {
        this.log.debug('Will not activate reader', function () {
          return {
            state: _this8._state
          };
        });
        return;
      }

      var sActiveFormFactors = this._state.getSetOfActiveFormFactors();

      var ffToActivate = [];

      var _iterator2 = _createForOfIteratorHelper(preferredFormFactors),
          _step2;

      try {
        var _loop = function _loop() {
          var ff = _step2.value;

          if (!sActiveFormFactors.has(ff)) {
            _this8.log.debug('Activate', function () {
              return {
                deviceId: deviceId,
                ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, ff)
              };
            });

            ffToActivate.push(ff);
          } else {
            _this8.log.debug('Already active, won\'t activate', function () {
              return {
                deviceId: deviceId,
                ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, ff)
              };
            });
          }
        };

        for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
          _loop();
        }
      } catch (err) {
        _iterator2.e(err);
      } finally {
        _iterator2.f();
      }

      if (ffToActivate.length === 0) {
        this.log.info('WillNotActivateFFAllFFsAlreadyActive', {
          ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, preferredFormFactors)
        });
        var _pd = _DeviceSelector["default"].selectedDevice;
        this.promptForPaymentInstrument(_pd);
        this.deviceController.updateDeviceDisplay(showPromptInCardReader);
        return;
      }

      this._reset();

      var active = this.deviceController.activate({
        showPrompt: showPromptInCardReader,
        formFactors: ffToActivate,
        syncInvoiceTotal: opt.syncInvoiceTotal
      });

      if (active.error) {
        this.end(active.error);
        return;
      }

      var pd = active.device;
      this.log.info('ActivatedCRForInvoice', function () {
        return {
          deviceId: pd.id,
          currency: _this8.invoice.currency,
          total: _this8.invoice.total,
          ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, active.formFactors),
          showPromptInApp: showPromptInApp
        };
      });
      this.promptForPaymentInstrument(pd, ffToActivate);
    }
    /**
     * Is the transaction a type of refund?
     * @returns {bool}
     */

  }, {
    key: "isRefund",
    value: function isRefund() {
      return this.type === _retailPaymentDevice.TransactionType.Refund || this.type === _retailPaymentDevice.TransactionType.PartialRefund;
    }
    /**
     * Display an alert on the app prompting for payment
     * @package
     * @param {PaymentDevice} selectedDevice Payment device that was selected for this transaction
     * @param {[FormFactor]} sFormFactors (optional) Array of form factors to include in the payment prompt.
     *  Default value will be the form factors approved on the connected devices
     * @param {object} opt Alert options
     */

  }, {
    key: "promptForPaymentInstrument",
    value: function promptForPaymentInstrument(selectedDevice, sFormFactors, opt) {
      var _this9 = this,
          _opt$title,
          _opt$message;

      this.log.debug('Prompt for payment instrument', function () {
        return {
          selectedDeviceActiveFF: _this9._state.getSetOfActiveFormFactors(),
          opt: opt,
          showPromptInApp: _this9.showPromptInApp
        };
      });
      var showPrompt = (opt === null || opt === void 0 ? void 0 : opt.overrideShowPromptInApp) || this.showPromptInApp;

      if (!showPrompt) {
        return;
      }

      var ff = this.deviceController.getApprovedFormFactors(sFormFactors || this.paymentOptions.preferredFormFactors);
      var alertId;
      var imageId;

      if ((selectedDevice === null || selectedDevice === void 0 ? void 0 : selectedDevice.model) === _retailPaymentDevice.ReaderModel.Swiper) {
        // Roam device
        if ((0, _includes["default"])(ff).call(ff, _retailPaymentDevice.FormFactor.MagneticCardSwipe)) {
          alertId = 'ReadyForSwipeOnly';
          imageId = 'img_reader_status_connected_160';
        }
      } else if ((0, _includes["default"])(ff).call(ff, _retailPaymentDevice.FormFactor.EmvCertifiedContactless) && (0, _includes["default"])(ff).call(ff, _retailPaymentDevice.FormFactor.MagneticCardSwipe) && (0, _includes["default"])(ff).call(ff, _retailPaymentDevice.FormFactor.Chip)) {
        // must be MIURA device
        alertId = 'Ready';
        imageId = 'img_emv_insert_tap_swipe';
      } else if ((0, _includes["default"])(ff).call(ff, _retailPaymentDevice.FormFactor.MagneticCardSwipe) && (0, _includes["default"])(ff).call(ff, _retailPaymentDevice.FormFactor.Chip)) {
        alertId = 'ReadyForInsertOrSwipeOnly';
        imageId = 'img_emv_insert_swipe';
      } else if ((0, _includes["default"])(ff).call(ff, _retailPaymentDevice.FormFactor.MagneticCardSwipe)) {
        alertId = 'ReadyForSwipeOnly';
        imageId = 'img_emv_swipe';
      } else if ((0, _includes["default"])(ff).call(ff, _retailPaymentDevice.FormFactor.Chip)) {
        alertId = 'ReadyForInsertOnly';
        imageId = 'img_emv_insert';
      }

      if (this.qrcPromptEnabled) {
        if (!alertId) {
          // no FF but qrc is enabled
          alertId = 'ReadyForQRCOnly';
        }

        var _message = (0, _l10n["default"])("Tx.Alert.".concat(alertId, ".Msg"));

        var supportedProviders = this._getSupportedQRCProviders();

        var buttons = (0, _map["default"])(supportedProviders).call(supportedProviders, function (provider) {
          return "".concat(provider[0].toUpperCase() + (0, _slice["default"])(provider).call(provider, 1).toLocaleLowerCase());
        });
        this.log.debug('qrc supported provider buttons', {
          buttons: buttons
        });
        this.alert = _manticore["default"].alert({
          message: _message,
          imageIcon: imageId,
          qrcDialog: true,
          buttons: buttons
        }, function (alert, index) {
          var _this9$alert; // -1: cancel, index is from the array


          _this9.log.debug(function () {
            return "index selected: ".concat(index);
          });

          (_this9$alert = _this9.alert) === null || _this9$alert === void 0 ? void 0 : _this9$alert.dismiss();

          if (index === -1) {
            // cancel is -1
            _this9.end(_sdkErrors.sdk.userCancelled);
          } else if (index >= 0 && index < supportedProviders.length) {
            _this9.paymentOptions.qrcProvider = supportedProviders[index];

            _this9.log.debug('qrc provider selected:', {
              provider: _this9.paymentOptions.qrcProvider
            });

            _this9.continueWithQRC();
          } else {
            _this9.log.error('wrong index chosen for QRC payment:', {
              index: index
            });
          }
        });
        return;
      }

      this.log.debug(function () {
        return "promptForPaymentInstrument alertId ".concat(alertId);
      });

      if (!alertId) {
        return;
      }

      var title = (_opt$title = opt === null || opt === void 0 ? void 0 : opt.title) !== null && _opt$title !== void 0 ? _opt$title : (0, _l10n["default"])("Tx.Alert.".concat(alertId, ".Title"), messageHelper.getSubstitutions(this));
      var message = (_opt$message = opt === null || opt === void 0 ? void 0 : opt.message) !== null && _opt$message !== void 0 ? _opt$message : (0, _l10n["default"])("Tx.Alert.".concat(alertId, ".Msg"), messageHelper.getSubstitutions(this));
      this.log.debug('promptForPaymentInstrument manticore alert');
      this.alert = _manticore["default"].alert({
        title: title,
        message: message,
        cancel: (0, _l10n["default"])('Cancel'),
        imageIcon: imageId
      }, function () {
        var _this9$card;

        _this9.alert.dismiss();

        delete _this9.alert;

        if ((_this9$card = _this9.card) !== null && _this9$card !== void 0 && _this9$card.emvData && _this9.invoice.payPalId) {
          if (!_this9.skipReceipt) {
            var offerReceiptFlow = new _OfferReceiptFlow["default"]((opt === null || opt === void 0 ? void 0 : opt.error) || _sdkErrors.transaction.customerCancel, _this9, function (data) {
              return _this9.end(data.error, data.tx);
            });
            offerReceiptFlow.startFlow();
          }

          return;
        }

        _this9.end(_sdkErrors.sdk.userCancelled);
      });
    }
    /**
     * Deactivate form factors without ending the transaction. Once deactivated, you should re-begin the transaction to
     * start taking payments
     * @param {[FormFactor]} formFactors Form factors to deactivate
     * @param {TransactionContext~complete} callback
     */

  }, {
    key: "deactivateFormFactors",
    value: function deactivateFormFactors(formFactors) {
      var _this10 = this;

      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      this.log.debug('Deactivate form factors', function () {
        return {
          ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, formFactors)
        };
      });

      if (this._deferredActivateOptions && this._deferredActivateOptions.preferredFormFactors) {
        var _iterator3 = _createForOfIteratorHelper(formFactors),
            _step3;

        try {
          for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
            var _context;

            var ff = _step3.value;
            var i = (0, _indexOf["default"])(_context = this._deferredActivateOptions.preferredFormFactors).call(_context, ff);

            if (i !== -1) {
              var _context2;

              (0, _splice["default"])(_context2 = this._deferredActivateOptions.preferredFormFactors).call(_context2, i, 1);
            }
          }
        } catch (err) {
          _iterator3.e(err);
        } finally {
          _iterator3.f();
        }
      }

      this.deviceController.deactivateFormFactors(formFactors, function (pd) {
        _this10.log.debug('Deactivated', function () {
          return {
            deviceId: pd ? pd.id : '<no device>',
            ff: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, formFactors)
          };
        });

        callback(null);
      });
    }
    /**
     * Obtain all loggly related log data
     * @private
     */

  }, {
    key: "_getTxnCompleteLogData",
    value: function _getTxnCompleteLogData() {
      var _this11 = this,
          _this$deviceControlle;

      var txEnd = (0, _retailSDKUtil.getTxEndData)(this);

      var getVaultType = function getVaultType() {
        if (_this11.isTransactionVaultOnly) {
          return 'vaultOnly';
        }

        return _this11.isTransactionPayAndVault ? 'payAndVault' : 'pay';
      };

      var gcData = this.invoice.hasDigitalGiftCardPayment ? {
        totalAfterGiftCard: this.invoice.total,
        amountPaidWithGiftCard: this.invoice.digitalCardTotal
      } : {};
      return _objectSpread(_objectSpread(_objectSpread({}, (0, _retailSDKUtil.getSdkEnvironmentData)(_Merchant["default"])), (0, _retailSDKUtil.getPartnerData)(_Merchant["default"])), {}, {
        invoiceId: this.invoice.payPalId,
        invoiceNumber: this.invoice.number,
        currency: this.invoice.currency,
        total: this.transactionAmount,
        tip: this.invoice.gratuityAmount || 0,
        discount: this.invoice.totalDiscount,
        tax: this.invoice.itemTax,
        charityEnabled: this.charityEnabled,
        skipReceipt: this.skipReceipt,
        isRefund: this.isRefund(),
        qChipEnabled: this.quickChipEnabled,
        toLightTheme: this.switchToLightTheme,
        refundType: txEnd.refundType(),
        readerType: txEnd.readerTypeForLoggly(),
        cvm: txEnd.cvm(),
        paymentType: txEnd.paymentType(),
        saleType: txEnd.transactionType(),
        vaultType: getVaultType(),
        swipeChipCardIssue: this.flagForSwipeChipCardIssueOccuredForIngenico,
        id: this.id,
        state: this._state.toJSON(),
        activeCRs: (_this$deviceControlle = this.deviceController.activeDevices) === null || _this$deviceControlle === void 0 ? void 0 : _this$deviceControlle.size,
        hasDigitalGiftCard: this.invoice.hasDigitalGiftCardPayment,
        orderId: this.orderId
      }, gcData);
    }
  }, {
    key: "_trackEnd",
    value: function _trackEnd(error, record, invokeHandler) {
      Log[error ? 'error' : 'track'](this._state.isCompletionInvoked() ? 'endOnCompletedTx' : 'txEnd', {
        currentEndData: this._getEndLogData(error, record, invokeHandler),
        initialEndData: this._endLog
      });
    }
  }, {
    key: "trackGiftCardVoid",
    value: function trackGiftCardVoid(error, record) {
      this.log.error('txGiftCardVoid', {
        currentEndData: this._getEndLogData(error, record, true),
        initialEndData: this._endLog
      });
    }
  }, {
    key: "_getEndLogData",
    value: function _getEndLogData(error, record, invokeHandler) {
      var logData = _objectSpread(_objectSpread({}, this._getTxnCompleteLogData()), {}, {
        invokeHandler: invokeHandler,
        error: error,
        responseCode: record === null || record === void 0 ? void 0 : record.responseCode
      });

      if (error) {
        var txOrOfflineFailure = this.offlinePaymentEnabled ? 'OfflineTxAdditionFailed' : 'CompletedTxDueToFailure';
        return {
          title: txOrOfflineFailure,
          logData: logData
        };
      }

      return {
        title: this.offlinePaymentEnabled ? 'OfflineTxAddedSuccessfully' : 'CompletedTxSuccessfully',
        logData: logData
      };
    }
    /**
     * A transaction is not complete until the end function is called. This function
     * takes care of de-registering various event listeners and clears variables that
     * track transaction state.
     * @package
     */

  }, {
    key: "end",
    value: function end(error, record) {
      var _this$alert,
          _this12 = this;

      var invokeHandler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;

      this._trackEnd(error, record, invokeHandler);

      this.timeoutManager.clearTimeoutMonitor();

      if (this._state.isCompletionInvoked()) {
        return;
      }

      this._state.setEndStateInProgress();

      this.timeCard.stopTime(_TimeCard["default"].Events.transaction);
      this.log.debug('END');
      this._signatureCollector = null;
      this._endLog = this._getEndLogData(error, record, invokeHandler); // Skip instrumentation events for QRC and incomplete Gift Card payments

      if (this.paymentType !== _TransactionBeginOptions.PaymentTypes.qrc && (error || !record.isPaymentIncomplete())) {
        this.log.instrument('Logging benchmark event', (0, _InstLogger.getTxContextBenchmarkInstrumentationEvent)(this, error));
        this.log.instrument('TransactionCompleted', (0, _InstLogger.getTxContextTxEndInstrumentationEvent)(this, error));
      }

      (_this$alert = this.alert) === null || _this$alert === void 0 ? void 0 : _this$alert.dismiss();

      this._reset();

      if (TransactionContext.active === this) {
        this.log.debug('TransactionContext is no longer active');
        delete TransactionContext.active;
      }

      this.log.debug('Ended, Invoking cancel');

      this._cancel(function () {
        _this12._state.setPaymentState(_transactionStates.PaymentState.complete);

        _this12._state.setPaymentFlowStartedState(false);

        _this12.logDigitalCardState('Tx end invoice info');

        if (_this12.isTransactionVaultOnly) {
          if (_this12.vaultCompletedHandler && invokeHandler) {
            _this12.log.debug(function () {
              return "Invoking vault completed handler '".concat(_this12.vaultCompletedHandler.id, "'");
            });

            _this12.vaultCompletedHandler(error, record);
          } else {
            _this12.log.debug('VaultOnly -> Cannot invoke completion handler as it was not set or removed');
          }
        } else if (_this12.offlinePaymentEnabled && invokeHandler) {
          _this12.log.debug(function () {
            return "Invoking offline transaction addition handler '".concat(_this12.offlineTransactionAdditionHandler.id, "'");
          });

          _this12.offlineTransactionAdditionHandler(error, record);
        } else if (_this12.completedHandler && invokeHandler) {
          _this12.log.debug(function () {
            return "Invoking completed handler '".concat(_this12.completedHandler.id, "'");
          });

          _this12.completedHandler(error, record);
        } else {
          _this12.log.debug('Cannot invoke completion handler as it was not set or removed');
        }

        _this12.dropHandlers();

        _this12.deviceController.removeListeners();

        _this12._state.setEndStateComplete();

        _Merchant["default"].sdkContextId = '';
      });
    }
    /**
     * Determines if the card is contactless
     * @package
     */

  }, {
    key: "isCardContactless",
    get: function get() {
      return this.card && this.card.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless;
    }
    /**
     * Determines if an in-progress payment could be cancelled
     * @package
     */

  }, {
    key: "allowInProgressPaymentCancel",
    get: function get() {
      return this.card && this.card.formFactor !== _retailPaymentDevice.FormFactor.MagneticCardSwipe && !this.card.isContactlessMSD;
    }
    /**
     * check if charity flag is enabled in the payment options
     * @package
     */

  }, {
    key: "charityEnabled",
    get: function get() {
      return this.paymentOptions && !!this.paymentOptions.charityEnabled;
    }
    /**
     * Check if Receipt should be sent for Authorization flow
     * @private
     */

  }, {
    key: "skipReceiptForAuth",
    get: function get() {
      return this.type === _retailPaymentDevice.TransactionType.Auth && this.paymentOptions && !this.paymentOptions.showReceiptForAuth;
    }
  }, {
    key: "transactionTypeFlag",
    get: function get() {
      var typeGroup = 0;
      typeGroup |= this.type === _retailPaymentDevice.TransactionType.Auth ? _pphSdkEnums.TransactionTypeFlag.auth : 0;
      typeGroup |= this.type === _retailPaymentDevice.TransactionType.Sale ? _pphSdkEnums.TransactionTypeFlag.sale : 0;
      typeGroup |= this.type === _retailPaymentDevice.TransactionType.Refund ? _pphSdkEnums.TransactionTypeFlag.refund : 0;
      typeGroup |= this.isTransactionVaultOnly || this.isTransactionPayAndVault ? _pphSdkEnums.TransactionTypeFlag.vault : 0;
      typeGroup |= this.quickChipEnabled ? _pphSdkEnums.TransactionTypeFlag.quickChip : 0;
      return typeGroup;
    }
  }, {
    key: "getTransactionTypeFlagName",
    value: function getTransactionTypeFlagName() {
      var _transactionTypeFlag = this.transactionTypeFlag;
      return [_transactionTypeFlag & _pphSdkEnums.TransactionTypeFlag.quickChip ? 'QuickChip' : '', _transactionTypeFlag & _pphSdkEnums.TransactionTypeFlag.sale ? 'Sale' : '', _transactionTypeFlag & _pphSdkEnums.TransactionTypeFlag.auth ? 'Auth' : '', _transactionTypeFlag & _pphSdkEnums.TransactionTypeFlag.refund ? 'Refund' : '', _transactionTypeFlag & _pphSdkEnums.TransactionTypeFlag.vault ? 'Vault' : ''].join('');
    }
    /**
     * check if skip receipt flag is enabled in the payment options
     * @package
     */

  }, {
    key: "skipReceipt",
    get: function get() {
      var _this$paymentOptions3,
          _this13 = this;

      var skip = this.charityEnabled || this.refundSkipReceipt || ((_this$paymentOptions3 = this.paymentOptions) === null || _this$paymentOptions3 === void 0 ? void 0 : _this$paymentOptions3.skipReceipt) || this.skipReceiptForAuth;
      this.log.debug('skipReceipt Booleans', function () {
        return {
          skipping: skip,
          charityEnabled: _this13.charityEnabled,
          refundSkipReceipt: _this13.refundSkipReceipt
        };
      });
      return skip;
    }
    /**
     * check if skip signature flag is enabled in the payment options
     * @package
     */

  }, {
    key: "skipSignature",
    get: function get() {
      return this.paymentOptions && this.paymentOptions.skipSignature;
    }
    /**
     * the refund or total amount for the current transaction
     * @package
     */

  }, {
    key: "transactionAmount",
    get: function get() {
      return this.isRefund() ? this.refundAmount : this.invoice.total;
    }
  }, {
    key: "_reset",
    value: function _reset() {
      this.log.debug('Resetting state');
      this.retryCountInvalidChip = 0;
      this.pinPresent = false;
      this.pinRequired = false;
      this.allowFallBackSwipe = false;

      if (this.card) {
        this.card.isMSRFallbackAllowed = false;
      }
    }
  }, {
    key: "on",
    value: function on(eventName, listener) {
      var _this14 = this;

      listener.id = "tx-listener-".concat((0, _retailSDKUtil.getRandomId)());
      (0, _get3["default"])((0, _getPrototypeOf2["default"])(TransactionContext.prototype), "on", this).call(this, eventName, listener);
      this.log.debug(function () {
        var _context3, _context4;

        return (0, _concat["default"])(_context3 = (0, _concat["default"])(_context4 = "Listener Added '".concat(listener.id, "' for '")).call(_context4, eventName, "'. ListenerCount: ")).call(_context3, _this14.listenerCount(eventName));
      });
    }
  }, {
    key: "emit",
    value: function emit(eventName) {
      var _this15 = this,
          _get2,
          _context6;

      this.log.debug(function () {
        var _context5;

        return (0, _concat["default"])(_context5 = "Listener Emitting '".concat(eventName, "' event to ")).call(_context5, _this15.listenerCount(eventName), " listener(s)");
      });

      var _iterator4 = _createForOfIteratorHelper(this.listeners(eventName)),
          _step4;

      try {
        var _loop2 = function _loop2() {
          var listener = _step4.value;

          _this15.log.debug(function () {
            return "Emitting to '".concat(listener.id, "' listener");
          });
        };

        for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
          _loop2();
        }
      } catch (err) {
        _iterator4.e(err);
      } finally {
        _iterator4.f();
      }

      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
        args[_key - 1] = arguments[_key];
      }

      (_get2 = (0, _get3["default"])((0, _getPrototypeOf2["default"])(TransactionContext.prototype), "emit", this)).call.apply(_get2, (0, _concat["default"])(_context6 = [this, eventName]).call(_context6, args));
    }
  }, {
    key: "removeListener",
    value: function removeListener(eventName, listener) {
      var _this16 = this;

      (0, _get3["default"])((0, _getPrototypeOf2["default"])(TransactionContext.prototype), "removeListener", this).call(this, eventName, listener);
      this.log.debug(function () {
        var _context7, _context8;

        return (0, _concat["default"])(_context7 = (0, _concat["default"])(_context8 = "Listener removed '".concat(listener.id, "' for '")).call(_context8, eventName, "'. Remaining listeners: ")).call(_context7, _this16.listenerCount(eventName));
      });
    }
    /**
     * Abort an idle transaction abandoning activated readers and all event listeners. The completed event
     * will NOT be fired for this TransactionContext given that you have explicitly abandoned it
     * @param {TransactionContext~complete} callback Callback to invoke after clearing the context
     */

  }, {
    key: "clear",
    value: function clear() {
      var _this17 = this;

      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      if (this._state.getPaymentState() === _transactionStates.PaymentState.inProgress) {
        if (this.paymentType === _TransactionBeginOptions.PaymentTypes.qrc) {
          this.flow.cancel(function (error) {
            if (error) {
              _this17.log.error('clearExistingQRCTxFailed', {
                id: _this17.id,
                error: error
              });
            }

            callback(error);
          });
          return;
        }

        this.log.debug('Cannot CLEAR transaction as card was presented');
        callback(_sdkErrors.transaction.cannotClearActiveTransaction);
        return;
      }

      this.deviceController.removeListeners();
      this.log.debug('CLEAR. Will drop all listeners');

      this._cancel(function () {
        var _this17$alert;

        (_this17$alert = _this17.alert) === null || _this17$alert === void 0 ? void 0 : _this17$alert.dismiss();

        _this17.dropHandlers();

        callback();
      });
    }
    /**
     * Check to see if payment is in 'retry' state. This check helps with
     * disconnection/connection logic when the app goes in the background.
     * @returns {bool} True if the payment is in retry, false otherwise
     */

  }, {
    key: "isPaymentInRetryOrProgress",
    value: function isPaymentInRetryOrProgress() {
      return this._state.getPaymentState() === _transactionStates.PaymentState.retry || this._state.getPaymentState() === _transactionStates.PaymentState.inProgress;
    }
  }, {
    key: "_handleDigitalCardVoid",
    value: function _handleDigitalCardVoid(voidError) {
      var _this18 = this;

      this.log.debug(function () {
        return "Invoice for VOID ".concat((0, _stringify["default"])(_this18.invoice));
      });

      if (this.isPaymentInRetryOrProgress()) {
        voidError.message = 'Payment is in Retry or Progress State';
        return;
      }

      if (!(this.invoice.isInvoiceStatusPartial && this.invoice.hasDigitalGiftCardPayment)) {
        voidError.message = 'Invalid Invoice state or No Digital Payments in invoice';
        return;
      }

      var DigitalCardVoidFlow = require('../flows/DigitalCardVoidFlow')["default"]; // eslint-disable-line global-require


      this.flow = new DigitalCardVoidFlow(this, function (err, action, record) {
        return _this18.voidCompletedHandler(err, record);
      });
    }
  }, {
    key: "_handleCancelBeforeActualPaymentHappend",
    value: function _handleCancelBeforeActualPaymentHappend() {}
    /**
     * Request to cancel a payment. The request will only be accepted if payment is not already in progress.
     * @param {TransactionContext~cancellationHandler} handler to check cancellation success
     */

  }, {
    key: "requestPaymentCancellation",
    value: function requestPaymentCancellation() {
      var _this19 = this;

      var cancellationHandler = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      if (this._state.getPaymentState() === _transactionStates.PaymentState.idle) {
        this.log.debug(function () {
          return "RequestPaymentCancel: Cancelling as transaction '".concat(_this19.id, "' is in idle state");
        });
        this.end(_sdkErrors.transaction.merchantCancel);
        cancellationHandler(undefined, _sdkErrors.transaction.merchantCancel.message);
        return;
      } //
      // if (this._state.getPaymentState() === transactionState.paymentInProgress) {
      //   const cardFormFactor = this.card ? getPropertyName(FormFactor, this.card.formFactor) : null;
      //   if (this.card && this.card.reader && this.allowInProgressPaymentCancel()) {
      //     this.log.debug(() => `RequestPaymentCancel: Emitting cancel requested event for tx '${this.id}' on reader '${this.card.reader.id}'`);
      //     this.card.reader.emit(PaymentDevice.Event.cancelRequested);
      //     return true;
      //   }
      //   this.log.debug(() => `RequestPaymentCancel: Ignoring as transaction '${this.id}' cannot be cancelled. Card presented via ${cardFormFactor}`);
      // }


      this.log.debug('RequestPaymentCancel: Unable to cancel payment');
      cancellationHandler(_sdkErrors.transaction.cancellationFailure);
    }
    /**
     * Request to cancel an ongoing payment.
     * The request will only be accepted if there is a partial digital card payment and payment is not in progress.
     * @param {TransactionContext~voidCompleted} voidCompletedHandler
     */

  }, {
    key: "requestDigitalCardCancellation",
    value: function requestDigitalCardCancellation(voidCompletedHandler) {
      var voidError = {};
      this.setVoidCompletedHandler(voidCompletedHandler);

      this._handleDigitalCardVoid(voidError);

      this._handleCancelBeforeActualPaymentHappend(voidError);

      if (voidError.message) {
        this.log.debug(function () {
          return "invoking voidCompletedHandler with error ".concat((0, _stringify["default"])(voidError));
        });
        voidCompletedHandler(new Error(voidError.message));
      }
    } // TODO Rename once requestPaymentCancellation is implemented

  }, {
    key: "_cancel",
    value: function _cancel(callback) {
      var _this20 = this;

      var activeReader = _DeviceSelector["default"].selectedDevice;
      this.log.debug(function () {
        return "CANCEL for active device '".concat(activeReader ? activeReader.id : '<no device>', "'. Will drop all listeners");
      });

      if (this._state.getTippingState() === _transactionStates.TippingState.inProgress) {
        this.log.debug('The tip flow was cancelled');

        if (this.tippingFlow) {
          this.tippingFlow.abort();
        }
      }

      this._deferredActivateOptions = null;

      _retailPaymentDevice.PaymentDevice.Events.removeListener(_retailPaymentDevice.PaymentDevice.Event.connected, this._deferredBeginHandler);

      this.deviceController.abort(function (pd) {
        var _DeviceSelector$selec;

        _this20.log.debug(function () {
          return "Aborted tx on ".concat(pd ? pd.id : '<no device>');
        });

        (_DeviceSelector$selec = _DeviceSelector["default"].selectedDevice) === null || _DeviceSelector$selec === void 0 ? void 0 : _DeviceSelector$selec.startPollForBattery();
        var ff = [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.EmvCertifiedContactless, _retailPaymentDevice.FormFactor.MagneticCardSwipe];

        _this20.deactivateFormFactors(ff, function () {
          _this20.log.debug(function () {
            return "Successfully cancelled. Active ff: '".concat((0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, (0, _toConsumableArray2["default"])(_this20.getSetOfActiveFormFactors())), "'");
          });

          callback();
        });
      });
    }
    /**
     * Remove all handlers
     */

  }, {
    key: "dropHandlers",
    value: function dropHandlers() {
      this.log.debug('Dropping all response handlers');
      this.completedHandler = null;
      this.vaultCompletedHandler = null;
      this.offlineTransactionAdditionHandler = undefined;
      this.cardPresentedHandler = null;
      this.cardInsertedHandler = null;
      this._signatureCollector = undefined;
      this.receiptHandler = null;

      for (var property in _transactionEvent["default"]) {
        if ({}.hasOwnProperty.call(_transactionEvent["default"], property)) {
          var event = _transactionEvent["default"][property];

          var _iterator5 = _createForOfIteratorHelper(this.listeners(event)),
              _step5;

          try {
            for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
              var l = _step5.value;
              this.removeListener(event, l);
            }
          } catch (err) {
            _iterator5.e(err);
          } finally {
            _iterator5.f();
          }
        }
      }
    }
  }, {
    key: "setPaymentFlowStarted",
    value: function setPaymentFlowStarted() {
      this._state.setPaymentFlowStartedState(true);
    }
  }, {
    key: "getPaymentFlowStarted",
    value: function getPaymentFlowStarted() {
      return this._state.getPaymentFlowStartState();
    }
  }, {
    key: "setPaymentInProgress",
    value: function setPaymentInProgress() {
      this._state.setPaymentState(_transactionStates.PaymentState.inProgress);

      this.log.debug('TransactionContext.active');
      TransactionContext.active = this;
    }
    /**
     * Discard the presented card for non-EMV transactions only
     * @param {Card} card The card that was presented
     */

  }, {
    key: "discardPresentedCard",
    value: function discardPresentedCard(card) {
      if (!card) {
        return;
      }

      if (this._state.getPaymentState() === _transactionStates.PaymentState.inProgress) {
        var error = _sdkErrors.transaction.cannotDiscardCard.withDevMessage('Cannot discard when payment is in progress');

        this.log.error('DiscardPresentedCardFailed', {
          err: error
        });
        throw error;
      }

      if (card.formFactor === _retailPaymentDevice.FormFactor.Chip || card.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless) {
        var _error = _sdkErrors.transaction.cannotDiscardCard.withDevMessage('Can only discard non EMV payments after card data read');

        this.log.error('DiscardPresentedCardFailed', {
          err: _error
        });
        throw _error;
      }

      this.log.debug(function () {
        return "Will discard presented card ".concat(card);
      });
      this.card = null;
    }
    /**
     * Begin the flow to issue a refund on the current invoice.
     * @nativeName continueWithCard
     * @param {Card} card The card, typically received via cardPresented, but in certain
     * regions you can simply provide a card number, address verification (AVS) fields such
     * as postal code, expiration and CVV.
     * @param {string} tag Reserved for restricted use
     */

  }, {
    key: "continueWithCardAndTag",
    value: function continueWithCardAndTag(card, tag) {
      this.cardTheme = tag && (0, _includes["default"])(tag).call(tag, 'switchToLightTheme');
      this.continueWithCard(card);
    }
  }, {
    key: "isTransactionVaultOnly",
    get: function get() {
      var _this$paymentOptions4;

      return this.enabledForVaultOnlyFlow || ((_this$paymentOptions4 = this.paymentOptions) === null || _this$paymentOptions4 === void 0 ? void 0 : _this$paymentOptions4.vaultType) === _TransactionBeginOptions.VaultType.VaultOnly;
    }
  }, {
    key: "paymentAction",
    get: function get() {
      return this.type === _retailPaymentDevice.TransactionType.Auth ? 'authorization' : 'sale';
    }
  }, {
    key: "isTransactionPayAndVault",
    get: function get() {
      var _this$paymentOptions5;

      return !this.enabledForVaultOnlyFlow && ((_this$paymentOptions5 = this.paymentOptions) === null || _this$paymentOptions5 === void 0 ? void 0 : _this$paymentOptions5.vaultType) === _TransactionBeginOptions.VaultType.PayAndVault;
    }
  }, {
    key: "isTransactionPayOnly",
    get: function get() {
      var _this$paymentOptions6;

      return !this.enabledForVaultOnlyFlow && ((_this$paymentOptions6 = this.paymentOptions) === null || _this$paymentOptions6 === void 0 ? void 0 : _this$paymentOptions6.vaultType) === _TransactionBeginOptions.VaultType.PayOnly;
    }
  }, {
    key: "_hardDecline",
    value: function _hardDecline(error) {
      return (0, _includes["default"])(_sdkErrors.hardDecline).call(_sdkErrors.hardDecline, error.code);
    }
  }, {
    key: "_continueVaultOnly",
    value: function _continueVaultOnly(card, withUI, cb) {
      var _this21 = this;

      this.log.debug('VaultOnly with CARD', function () {
        return {
          paymentOptions: _this21.paymentOptions
        };
      });
      this.setPaymentInProgress();
      this.deviceController.removeListeners(); // From this point onwards, the events will be handled by the flow controllers

      var cbFlowComplete = function cbFlowComplete(err, errAction, vaultRecord, opt) {
        Log[err ? 'error' : 'info']('TransactionFlowCompletedHandlerInvoked', {
          errAction: errAction,
          err: err,
          vaultRecord: vaultRecord
        });

        if (errAction && errAction !== ErrorAction.abort) {
          _this21._state.setPaymentFlowStartedState(false); // Allow payment flows to re-start for online retry scenarios


          _this21.processErrorHandlerResponse(err, errAction, card.formFactor, opt);
        } else {
          _this21.end(err, vaultRecord);
        }
      };

      this.card = card;
      this.paymentType = _TransactionBeginOptions.PaymentTypes.card;
      var VaultOnlyFlow = withUI ? require('../flows/VaultOnlyFlow')["default"] // eslint-disable-line global-require
      : require('../flows/VaultOnlyWithoutUiFlow')["default"]; // eslint-disable-line global-require

      this.flow = new VaultOnlyFlow(this, cb || cbFlowComplete);
    }
  }, {
    key: "_continuePayAndVault",
    value: function _continuePayAndVault(card) {
      var _this22 = this;

      this.log.debug('Continue PayAndVault with CARD invoked');

      var cbFlowComplete = function cbFlowComplete(type, cb) {
        return function (err, errAction, record, opt) {
          Log[err ? 'error' : 'info']('TransactionFlowCompletedHandlerInvoked', {
            errAction: errAction,
            err: err,
            type: type
          });

          if (type === _TransactionBeginOptions.VaultType.PayOnly) {
            _this22._state.setPaymentFlowStartedState(false); // Allow payment flows to re-start for online retry scenarios


            _this22.flowCompleteForPay = {
              errAction: errAction,
              err: err,
              record: record,
              opt: opt
            };
          } else {
            _this22.flowCompleteForVault = {
              errAction: errAction,
              err: err,
              record: record
            };
          } // Note that we don't call cb(err) here in purpose to
          // make sure both goWithCard and goWithVault completes until the end of flow
          // if vault fails, both would fail with the error if used cb(err).
          // Also, the error is kept for later use above.


          cb();
        };
      };

      var cbPayAndVaultComplete = function cbPayAndVaultComplete(error) {
        _this22.log.debug(function () {
          return "payAndVault is complete with err: ".concat(error);
        });

        if (_this22.flowCompleteForPay && _this22.flowCompleteForVault) {
          var _this22$flowCompleteF = _this22.flowCompleteForPay,
              errAction = _this22$flowCompleteF.errAction,
              err = _this22$flowCompleteF.err,
              opt = _this22$flowCompleteF.opt;
          var txRecord = _this22.flowCompleteForPay.record || {};
          var errVault = _this22.flowCompleteForVault.err;
          var vaultRecord = _this22.flowCompleteForVault.record || {};

          if (err && _this22._hardDecline(err)) {
            _this22.log.warn('payAndVault failed -> payment hard-declined error:', function () {
              return {
                err: err,
                vaultRecord: vaultRecord
              };
            });

            errVault = err;
            vaultRecord = {};
          }

          if (_this22.vaultCompletedHandler) {
            _this22.log.debug(function () {
              return "payAndVault -> Invoking vault completed handler '".concat(_this22.vaultCompletedHandler.id, "'");
            });

            _this22.vaultCompletedHandler(errVault, vaultRecord);
          } else {
            _this22.log.warn('payAndVault -> Cannot invoke completion handler as it was not set or removed');
          }

          if (errAction && errAction !== ErrorAction.abort) {
            _this22.processErrorHandlerResponse(err, errAction, card.formFactor, opt);
          } else {
            _this22.end(err, txRecord);
          }
        } else {
          var _context9;

          _this22.log.error((0, _concat["default"])(_context9 = "PayAndVault failed: ".concat((0, _stringify["default"])(_this22.flowCompleteForPay, null, 2), " and vault: ")).call(_context9, (0, _stringify["default"])(_this22.flowCompleteForVault, null, 2)));

          _this22.end(_sdkErrors.transaction.payAndVaultFailed);
        }
      };

      var goWithCard = function goWithCard(cb) {
        _this22._continueWithCard(card, cbFlowComplete(_TransactionBeginOptions.VaultType.PayOnly, cb));
      };

      var goWithVault = function goWithVault(cb) {
        _this22._continueVaultOnly(card, false, cbFlowComplete(_TransactionBeginOptions.VaultType.VaultOnly, cb));
      };

      _async["default"].parallel([goWithCard, goWithVault], function (err) {
        cbPayAndVaultComplete(err);
      });
    }
    /**
     * Continue processing transaction with Digital Card/Code information
     * @param {DigitalCard} digitalCard Digital Card information
     */

  }, {
    key: "continueWithDigitalCard",
    value: function continueWithDigitalCard(digitalCard) {
      var _this23 = this;

      this.log.debug(function () {
        return "Continue with Digital Code invoked for ".concat(_this23.id);
      });
      this.digitalCard = digitalCard;

      this._continuePayment(_TransactionBeginOptions.PaymentTypes.digitalCard);
    }
    /**
     * Continue processing a transaction - the behavior of which depends on the presented card.
     * If it's a magnetic card or an NFC tap, payment will be attempted and money will move
     * (if successful). If it's an EMV card insertion, we will start the EMV flow which includes
     * a few calls to the server, potentially asking the user to enter a PIN, etc.
     * @param {Card} card The card, typically received via cardPresented, but in certain
     * regions you can simply provide a card number, address verification (AVS) fields such
     * as postal code, expiration and CVV.
     */

  }, {
    key: "continueWithCard",
    value: function continueWithCard(card) {
      if (this._state.getPaymentFlowStartState()) {
        this.log.warn('continueWithCardWillNotProcessAsAnotherPaymentIsInProcess');
        return;
      }

      if (this.enabledForVaultOnlyFlow && (this.paymentOptions.vaultType === _TransactionBeginOptions.VaultType.PayAndVault || this.paymentOptions.vaultType === _TransactionBeginOptions.VaultType.PayOnly)) {
        this.log.error('continueWithCardWillNotProcessSinceCreatedforVaultOnlyflow');
        this.end(_sdkErrors.transaction.payAndVaultFailed.withDevMessage('this context can only be used for vaultOnly flow!'));
        return;
      }

      this.log.debug('continueWithCard:', {
        card: card
      });

      var cardData = this._prepareSandboxForVault(card);

      this._publishCardPageView(card);

      if (this.isTransactionVaultOnly) {
        this._continueVaultOnly(cardData, true);

        return;
      }

      var amountError = this.getInvoiceAmountValidationError();

      if (amountError) {
        this.processAmountError(amountError, card);
        return;
      }

      if (this.isTransactionPayAndVault) {
        this._continuePayAndVault(cardData);
      } else {
        this._continueWithCard(cardData);
      }
    }
  }, {
    key: "_getSupportedQRCProviders",
    value: function _getSupportedQRCProviders() {
      return this.merchant.qrcUrlTemplateProviders();
    }
  }, {
    key: "_publishCardPageView",
    value: function _publishCardPageView(card) {
      if (!(card !== null && card !== void 0 && card.isContactlessMSD) && ((card === null || card === void 0 ? void 0 : card.formFactor) === _retailPaymentDevice.FormFactor.Chip || (card === null || card === void 0 ? void 0 : card.formFactor) === _retailPaymentDevice.FormFactor.EmvCertifiedContactless)) {
        _retailPageTracker.Tracker.publishPageView(null, _retailPageTracker.pages.emv);
      } else if ((card === null || card === void 0 ? void 0 : card.formFactor) === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
        _retailPageTracker.Tracker.publishPageView(null, _retailPageTracker.pages.swipe);
      } else if ((card === null || card === void 0 ? void 0 : card.formFactor) === _retailPaymentDevice.FormFactor.ManualCardEntry) {
        _retailPageTracker.Tracker.publishPageView(null, _retailPageTracker.pages.keyIn);
      }
    } // Converts hex string emv data to byte array since the original encoded emv data read from the card cannot be stored in json file

  }, {
    key: "_toByteArray",
    value: function _toByteArray(hexString) {
      var _context10;

      return Buffer.from((0, _map["default"])(_context10 = hexString.match(/.{1,2}/g)).call(_context10, function (hexValue) {
        return (0, _parseInt2["default"])(hexValue, 16);
      }));
    }
  }, {
    key: "_prepareSandboxForVault",
    value: function _prepareSandboxForVault(card) {
      var _this$paymentOptions7, _this$paymentOptions8;

      var env = _Merchant["default"].active.api.env;
      var logData = {
        environment: env,
        isTransactionPayAndVault: this.isTransactionPayAndVault,
        isTransactionVaultOnly: this.isTransactionVaultOnly,
        vaultProvider: (_this$paymentOptions7 = this.paymentOptions) === null || _this$paymentOptions7 === void 0 ? void 0 : _this$paymentOptions7.vaultProvider
      }; // The purpose of this method is to replace the whitelisted card when we are processing a vault payment on sandbox
      // Return without making any changes if...
      // We are not in sandbox, or we are not in a vault flow, or the VaultProvider is not Braintree

      if (env !== 'sandbox' || !(this.isTransactionPayAndVault || this.isTransactionVaultOnly) || ((_this$paymentOptions8 = this.paymentOptions) === null || _this$paymentOptions8 === void 0 ? void 0 : _this$paymentOptions8.vaultProvider) !== _TransactionBeginOptions.VaultProvider.Braintree) {
        this.log.debug('Do not replace card data for sandbox', logData);
        return card;
      }

      this.log.debug('Replacing card data for sandbox', logData);
      var readerModel = (0, _retailSDKUtil.getDeviceModelName)(card.reader.model);
      var cardIssuer = _retailPaymentDevice.CardIssuer.keyFromValue[card.cardIssuer];
      var cardFormFactor = _retailPaymentDevice.FormFactor.keyFromValue[card.formFactor];

      if (_PPObjects["default"].braintreeSandboxCards[readerModel]) {
        var readerData = _PPObjects["default"].braintreeSandboxCards[readerModel];

        if (card.isMSRFallbackAllowed) {
          cardFormFactor = 'FallbackSwipe';
        }

        var cardData = cardIssuer !== 'Unknown' && cardFormFactor !== 'None' && readerData[cardIssuer][cardFormFactor] ? readerData[cardIssuer][cardFormFactor].card : undefined;

        if (cardData) {
          card.pinPresent = cardData.pinPresent;
          card.signatureRequired = cardData.signatureRequired;

          if (card.formFactor === _retailPaymentDevice.FormFactor.Chip || card.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless) {
            card.emvData.apdu.data = this._toByteArray(cardData.emvData);
            card.isContactlessMSD = cardData.isContactlessMSD;
          } else if (card.formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
            card.ksn = cardData.ksn;
            card.track2 = cardData.track2;
          }
        }
      }

      return card;
    }
  }, {
    key: "_continueWithCard",
    value: function _continueWithCard(card, cb) {
      var _this24 = this;

      this.log.debug('_continueWithCard invoked');

      if (card) {
        if (card.formFactor === _retailPaymentDevice.FormFactor.ManualCardEntry && this.offlinePaymentEnabled) {
          var errorHandler = new _PaymentErrorHandler["default"](this);
          errorHandler.handle(_sdkErrors.transaction.offlinePaymentKeyinNotAllowed, card.formFactor, this.deviceController.selectedDevice, function () {
            return _this24.processErrorHandlerResponse(_sdkErrors.transaction.offlinePaymentKeyinNotAllowed, ErrorAction.abort, card.formFactor);
          });
          this.log.debug('Transaction flow complete handler invoked. Key-in not allowed for offlinePayment');
          return;
        }

        if (card.formFactor === _retailPaymentDevice.FormFactor.ManualCardEntry) {
          this.card = card;

          this._continuePayment(_TransactionBeginOptions.PaymentTypes.keyIn);

          return;
        }
      } else {
        this.log.debug('No card presented'); // TODO: Why are we not returning when there is no card
      }

      var initializationForFlow = function initializationForFlow() {
        // Note that for sideloader apps, the referrerCode comes from invoice only!
        // here we do update the merchant side before saving the invoice
        // ToDo: there could be better place for this
        _Merchant["default"].active.updateReferrerCode(_this24.invoice);

        _this24.setPaymentInProgress();

        _this24.deviceController.removeListeners();
      }; // From this point onwards, the events will be handled by the flow controllers


      var cbFlowComplete = function cbFlowComplete(err, errAction, txRecord, opt) {
        Log[err ? 'error' : 'info']('TransactionFlowCompletedHandlerInvoked', {
          errAction: errAction,
          err: err
        });

        if (errAction && errAction !== ErrorAction.abort) {
          _this24._state.setPaymentFlowStartedState(false); // Allow payment flows to re-start for online retry scenarios


          _this24.processErrorHandlerResponse(err, errAction, card.formFactor, opt);
        } else {
          _this24.end(err, txRecord);
        }
      };

      if (this.type === _retailPaymentDevice.TransactionType.Sale || this.type === _retailPaymentDevice.TransactionType.Auth) {
        var CCFlow;

        if (this.quickChipEnabled) {
          CCFlow = require('../flows/QuickChipCreditCardFlow')["default"]; // eslint-disable-line global-require
        } else if (this.offlinePaymentEnabled) {
          CCFlow = require('../flows/OfflinePaymentFlow')["default"]; // eslint-disable-line global-require
        } else {
          CCFlow = require('../flows/CreditCardFlow')["default"]; // eslint-disable-line global-require
        }

        this.card = card;

        if (card instanceof _retailPaymentDevice.MagneticCard) {
          this.log.debug(function () {
            return "Magnetic card detected. isMSRFallbackAllowed: ".concat(card.isMSRFallbackAllowed);
          });
          card.isSignatureRequired = card.isMSRFallbackAllowed || this.invoice.total.isGreaterThanOrEqualTo(_Merchant["default"].active.signatureRequiredAbove);
        }

        this.paymentType = _TransactionBeginOptions.PaymentTypes.card; // After reading card data, the tipping amount can be added to the tender only for card swipes

        if (this.type === _retailPaymentDevice.TransactionType.Sale && this.paymentOptions.tippingOnReaderEnabled && (card === null || card === void 0 ? void 0 : card.formFactor) === _retailPaymentDevice.FormFactor.MagneticCardSwipe && (this._state.getPaymentState() === _transactionStates.PaymentState.retry || this._state.getTippingState() === _transactionStates.TippingState.notStarted)) {
          this._beginTippingOnReader(this.paymentOptions.amountBasedTipping, false, function () {
            _this24.log.debug('After tipping, started the credit card flow');

            initializationForFlow();
            _this24.flow = new CCFlow(_this24, cb || cbFlowComplete);
          });
        } else {
          this.log.debug('Will not start tipping flow', function () {
            return {
              tippingOnReaderEnabled: _this24.paymentOptions.tippingOnReaderEnabled,
              state: _this24._state,
              transactionType: _this24.type
            };
          });
          initializationForFlow();
          this.flow = new CCFlow(this, cb || cbFlowComplete);
        }
      } else {
        this.card = card;

        var RefundFlow = require('../flows/refundFlow')["default"]; // eslint-disable-line global-require


        this.flow = new RefundFlow(this, cbFlowComplete);
      }
    }
    /**
     * Sync the Invoice total to the reader display. Use this function to sync
     * invoice amount on the app to the reader. This automatic invoice syncing will stop based on the transaction state.
     * Use 'syncInvoiceOnce' to do an on-demand push invoice total to the card reader display
     */

  }, {
    key: "startInvoiceSync",
    value: function startInvoiceSync() {
      this.deviceController.syncInvoice();
    }
    /**
     * Do a one time sync of invoice total to card reader
     */

  }, {
    key: "syncInvoiceOnce",
    value: function syncInvoiceOnce() {
      this.deviceController.syncOnce();
    }
  }, {
    key: "_stopInvoiceSync",
    value: function _stopInvoiceSync() {
      this.deviceController.stopInvoiceSync();
    }
    /**
     * Continue processing a cash transaction.
     */

  }, {
    key: "continueWithCash",
    value: function continueWithCash() {
      this.log.debug('Continue with CASH invoked');

      if (this.type === _retailPaymentDevice.TransactionType.Auth) {
        this.log.error('CASHNotSupportedForAuth');
        this.end(_sdkErrors.transaction.invalidAuthorization);
        return;
      }

      this._continuePayment(_TransactionBeginOptions.PaymentTypes.cash);
    }
    /**
     * Continue processing a QRC transaction.
     */

  }, {
    key: "continueWithQRC",
    value: function continueWithQRC() {
      var _Merchant$active;

      if (!(_Merchant["default"] !== null && _Merchant["default"] !== void 0 && (_Merchant$active = _Merchant["default"].active) !== null && _Merchant$active !== void 0 && _Merchant$active.storeId)) {
        this.end(_sdkErrors.transaction.notSupported.withDevMessage("storeId is required for QRC (".concat(_Merchant["default"].active.storeId, ")")));
        return;
      }

      this._continuePayment(_TransactionBeginOptions.PaymentTypes.qrc);
    }
    /**
     * Continue processing a check transaction.
     */

  }, {
    key: "continueWithCheck",
    value: function continueWithCheck() {
      this.log.debug(function () {
        return 'Continue with CHECK invoked';
      });

      if (this.type === _retailPaymentDevice.TransactionType.Auth) {
        this.log.error('CHECKNotSupportedForAut');
        this.end(_sdkErrors.transaction.invalidAuthorization);
        return;
      }

      this._continuePayment(_TransactionBeginOptions.PaymentTypes.check);
    }
  }, {
    key: "_continuePayment",
    value: function _continuePayment(paymentType) {
      var _this25 = this;

      if (this._state.getPaymentFlowStartState()) {
        this.log.warn('_continuePaymentWillNotProcessAsAnotherPaymentIsInProgress');
        return;
      }

      if ((0, _includes["default"])(_paymentFlowAmountValidationPaymentTypes).call(_paymentFlowAmountValidationPaymentTypes, paymentType)) {
        var amountError = this.getInvoiceAmountValidationError();

        if (amountError) {
          this.processAmountError(amountError);
          return;
        }
      }

      this.setPaymentInProgress();
      this.deactivateFormFactors([_retailPaymentDevice.FormFactor.EmvCertifiedContactless], function () {
        _this25.deviceController.removeListeners();

        _this25.paymentType = paymentType;

        _this25._stopInvoiceSync();

        _this25.syncInvoiceOnce();

        if (paymentType === _TransactionBeginOptions.PaymentTypes.digitalCard) {
          var DigitalCardFlow = require('../flows/DigitalCardFlow')["default"]; // eslint-disable-line global-require


          _this25.flow = new DigitalCardFlow(_this25, function (err, action, record) {
            return _this25.end(err, record);
          });
        } else if (_this25.paymentType === _TransactionBeginOptions.PaymentTypes.qrc) {
          _this25.flow = new _QRCContext["default"](_this25);

          _this25.flow.start();
        } else {
          var PaymentFlow = require('../flows/PaymentFlow')["default"]; // eslint-disable-line global-require


          _this25.flow = new PaymentFlow(_this25, function (err, action, record) {
            return _this25.end(err, record);
          });
        }
      });
    }
    /**
     * If you acquire signatures yourself, for example from a Topaz Pen Pad or with an external
     * camera, set this property to a handler that will be invoked when signature should be
     * collected. Once you've collected the signature, call the supplied signatureReceiver
     * with a base64 encoded JPG of the signature. Try to keep it under 100k.
     * @param {TransactionContext~signatureCollector} collector The function that will be
     *  called when a signature should be acquired
     */

  }, {
    key: "setSignatureCollector",
    value: function setSignatureCollector(collector) {
      this._signatureCollector = collector;
    }
    /**
     * Provide a token expiration handler if you want to handle token expirations during a transaction
     * @param {TransactionContext~tokenExpirationHandler} expirationHandler
     */

  }, {
    key: "setTokenExpiredHandler",
    value: function setTokenExpiredHandler(expirationHandler) {
      var _Merchant$active2;

      if (!((_Merchant$active2 = _Merchant["default"].active) !== null && _Merchant$active2 !== void 0 && _Merchant$active2.api)) {
        this.log.warn('Expiration handler can\'t be set until merchant initializes');
        return;
      }

      if (!expirationHandler) {
        _Merchant["default"].active.api.tokenExpirationHandler = undefined;
        return;
      }

      if (_Merchant["default"].active.api.tokenExpirationHandler) {
        this.log.info('Expiration handler can not be updated once set');
        return;
      }

      _Merchant["default"].active.api.setTokenExpirationHandler(expirationHandler);
    }
    /**
     * Provide a handler to get notified after chip card insert is detected but before EMV data is read.
     * cardInsertedHandler.continueWithCardDataRead must be invoked to continue with transaction
     * @param {TransactionContext~cardInsertedHandler} cardInsertedHandler
     */

  }, {
    key: "setCardInsertedHandler",
    value: function setCardInsertedHandler(cardInsertedHandler) {
      var _this26 = this;

      if (!cardInsertedHandler) {
        this.cardInsertedHandler = null;
        return;
      }

      var handler = function handler(handle) {
        _this26.log.debug(function () {
          return "Invoking card inserted handler ".concat(handler.id);
        });

        var cardInsertedHandle = new _retailPaymentDevice.CardInsertedHandler(function () {
          _this26.log.debug('Card Inserted Handler : about to read card data.');

          _this26._stopInvoiceSync();

          _this26.deviceController.cardInsertDetected();

          handle.continueWithCardDataRead();
        });

        cardInsertedHandle.dismissSDKUIPrompt = function () {
          if (_this26.alert) {
            _this26.alert.dismiss();
          }
        };

        cardInsertedHandler(cardInsertedHandle);
      };

      handler.id = "cardInserted-".concat((0, _retailSDKUtil.getRandomId)());
      this.cardInsertedHandler = handler;
      this.log.debug(function () {
        return "Set card inserted handler to ".concat(handler.id);
      });
    }
    /**
     * @param {TransactionContext~onAuthComplete} captureHandler
     */

  }, {
    key: "setCaptureHandler",
    value: function setCaptureHandler(onAuthComplete) {
      var _this27 = this;

      if (!onAuthComplete) {
        this.captureHandler = null;
        return;
      }

      this.captureHandler = onAuthComplete;
      this.captureHandler.id = "captureHandled-".concat((0, _retailSDKUtil.getRandomId)());
      this.log.debug('Capture handler', function () {
        return {
          captureHandlerId: _this27.captureHandler.id
        };
      });
    }
    /**
     * Provide a handler to get notified when card was presented and emv/magstripe data was read.
     * TransactionContext.continueWithCard should be invoked to continue the payment
     * @param {TransactionContext~cardPresented} cardPresentedHandler
     */

  }, {
    key: "setCardPresentedHandler",
    value: function setCardPresentedHandler(cardPresentedHandler) {
      var _this28 = this;

      if (!cardPresentedHandler) {
        this.cardPresentedHandler = null;
        return;
      }

      var handler = function handler(card) {
        _this28.log.debug(function () {
          return "Invoking card PRESENTED handler ".concat(handler.id);
        });

        cardPresentedHandler(card);
      };

      handler.id = "cardPresented-".concat((0, _retailSDKUtil.getRandomId)());
      this.cardPresentedHandler = handler;
      this.log.debug(function () {
        var _context11;

        return (0, _concat["default"])(_context11 = "Set card presented handler to ".concat(handler.id, " for ")).call(_context11, _this28.id);
      });
    }
    /**
     * Provide a handler to get notifications for QRC Payment
     * @param {TransactionContext~onQRCStatus} qrcStatusHandler Handler
     */

  }, {
    key: "setQRCStatusHandler",
    value: function setQRCStatusHandler(qrcStatusHandler) {
      this.log.debug('Setting QRC Payment status handler');

      if (!qrcStatusHandler) {
        this.qrcStatusHandler = null;
        return;
      }

      this.qrcStatusHandler = qrcStatusHandler;
    }
    /**
     * Provide a handler to get notified once transaction is complete
     * @param {TransactionContext~transactionCompleted} completedHandler
     */

  }, {
    key: "setCompletedHandler",
    value: function setCompletedHandler(completedHandler) {
      var _this29 = this;

      if (!completedHandler) {
        this.completedHandler = null;
        return;
      }

      var handler = function handler(err, txRecord) {
        _this29.log.debug(function () {
          return "Invoking COMPLETION handler ".concat(handler.id);
        });

        completedHandler(err, txRecord);
      };

      handler.id = "completed-".concat((0, _retailSDKUtil.getRandomId)());
      this.completedHandler = handler;
      this.log.debug(function () {
        return "Set completed handler to ".concat(handler.id);
      });
    }
  }, {
    key: "setVoidCompletedHandler",
    value: function setVoidCompletedHandler(voidCompletedHandler) {
      var _this30 = this;

      if (!voidCompletedHandler) {
        this.voidCompletedHandler = null;
        return;
      }

      var handler = function handler(err, txRecord) {
        _this30.log.debug(function () {
          var _context12;

          return (0, _concat["default"])(_context12 = "Invoking VOID COMPLETION handler ".concat(handler.id, " for ")).call(_context12, _this30.id);
        });

        voidCompletedHandler(err, txRecord);
      };

      handler.id = "void-completed-".concat((0, _retailSDKUtil.getRandomId)());
      this.voidCompletedHandler = handler;
      this.log.debug(function () {
        var _context13;

        return (0, _concat["default"])(_context13 = "Set void completed handler to ".concat(handler.id, " for ")).call(_context13, _this30.id);
      });
    }
    /**
     * Provide a handler to get notified once vault is complete
     * @param {TransactionContext~vaultCompleted} completedHandler
     */

  }, {
    key: "setVaultCompletedHandler",
    value: function setVaultCompletedHandler(completedHandler) {
      var _this31 = this;

      if (!completedHandler) {
        this.vaultCompletedHandler = null;
        return;
      }

      var handler = function handler(err, vaultRecord) {
        _this31.log.debug(function () {
          return "Invoking vault COMPLETION handler ".concat(handler.id);
        });

        completedHandler(err, vaultRecord);
      };

      handler.id = "vault-completed-".concat((0, _retailSDKUtil.getRandomId)());
      this.vaultCompletedHandler = handler;
      this.log.debug(function () {
        return "Set vault completed handler to ".concat(handler.id);
      });
    }
    /**
     * Provide a handler to get offline transaction addition notification
     * @param {TransactionContext~offlineTransactionAdded} addedHandler
     */

  }, {
    key: "setOfflineTransactionAdditionHandler",
    value: function setOfflineTransactionAdditionHandler(addedHandler) {
      var _this32 = this;

      if (!addedHandler) {
        return;
      }

      var handler = function handler(error, offlineTransactionRecord) {
        _this32.log.debug(function () {
          return "Invoking Offline Transaction Addition Completed Handler ".concat(handler.id);
        });

        addedHandler(error, offlineTransactionRecord);
      };

      handler.id = "offline-txn-addition-".concat((0, _retailSDKUtil.getRandomId)());
      this.offlineTransactionAdditionHandler = handler;
      this.log.debug(function () {
        return "Set offline transaction addition completed handler to ".concat(handler.id);
      });
    }
    /**
     * If you would like to display additional receipt options such as print, etc., you can provide them here. These
     * options would be presented on the receipt screen below the Email and Text options.
     * @param {[string]} additionalReceiptOptions Additional options to display on the receipt page
     * @param {TransactionContext~receiptOptionHandler} receiptHandler Provide a handler to get notified when an additional receipt option is selected
     */

  }, {
    key: "setAdditionalReceiptOptions",
    value: function setAdditionalReceiptOptions(additionalReceiptOptions, receiptHandler) {
      var _this33 = this;

      if (!receiptHandler) {
        this.receiptHandler = null;
        return;
      }

      var handler = function handler(index, name, txRecord) {
        _this33.log.debug(function () {
          var _context14, _context15;

          return (0, _concat["default"])(_context14 = (0, _concat["default"])(_context15 = "Invoking additional receipt options handler ".concat(handler.id, " with index: ")).call(_context15, index, ", name: ")).call(_context14, name);
        });

        receiptHandler(index, name, txRecord);
      };

      handler.id = "receiptOptions-".concat((0, _retailSDKUtil.getRandomId)());
      this.receiptHandler = handler;
      this.additionalReceiptOptions = additionalReceiptOptions;
      this.log.debug(function () {
        return "Set additional receipt options handler to ".concat(handler.id);
      });
    }
  }]);
  return TransactionContext;
}(_events2.EventEmitter);
/**
 * Called when either payment completes or fails.
 * Note that other events may be fired in the meantime.
 * @callback TransactionContext~transactionCompleted
 * @param {error} error The error that caused the transaction to fail, if any
 * @param {TransactionRecord} record The transaction record for successful transactions
 *  and failed transactions that reached PayPal.
 */

/**
 * Called when either vault completes or fails.
 * Note that other events may be fired in the meantime.
 * @callback TransactionContext~vaultCompleted
 * @param {error} error The error that caused the vault to fail, if any
 * @param {VaultRecord} record The vault record for successful
 *  and failed vaults that reached PayPal.
 */

/**
 * Called when either offline transaction addition completes or fails.
 * Note that other events may be fired in the meantime.
 * @callback TransactionContext~offlineTransactionAdded
 * @param {error} error The error that caused the addition to fail, if any
 * @param {OfflineTransactionRecord} record The Offline TransactionRecord for successful transaction addition
 *
 */

/**
 * Called to update the IA with QRC Status or error
 * @callback TransactionContext~onQRCStatus
 * @param {error} error The error that caused the transaction to fail, if any
 * @param {QRCRecord} qrcRecord The QRC Payment Record
 */

/**
 * Indicates that the card data was read. Depending on your region and the buyer payment type, this can mean a magnetic
 * card was swiped, an EMV card was inserted, or an NFC card/device was tapped.
 * @callback TransactionContext~cardPresented
 * @param {Card} card Information about the card.
 */

/**
 * Contactless reader was de-activated and the transaction still remains active.
 * @event TransactionContext#contactlessReaderDeactivated
 */

/**
 * Contactless reader was activated and the transaction still remains active.
 * @event TransactionContext#contactlessReaderActivated
 */

/**
 * Called when PIN entry is in progress or complete
 * @protected
 * @event TransactionContext#pinEntry
 * @param {bool} complete The PIN entry is complete
 * @param {bool} correct The PIN entry is correct
 * @param {int} pinDigits The number of digits entered
 * @param {bool} lastAttempt Whether this is the last attempt before pin lockout
 */

/**
 * Called when the signature input interface will be displayed
 * @event TransactionContext#willPresentSignature
 */

/**
 * Called when the tipping on reader flow has been completed
 * @event TransactionContext#readerTippingCompleted
 * @param {decimal} tipAmount The tip amount set in the invoice after tipping on reader flow completes
 */

/**
 * Called when the signature entry is completed
 * @event TransactionContext#didCompleteSignature
 * @param {error} error The error which caused the signature not to be acquired or saved,
 *  or null if it worked
 */

/**
 * @callback TransactionContext~signatureCollector
 * @param {SignatureReceiver} signatureReceiver Call continueWithSignature or
 *  cancel on this object once signature acquisition is complete.
 */

/**
 * @callback TransactionContext~tokenExpirationHandler
 * @param {TokenExpirationHandler} tokenExpirationHandler Call quit to abort the transaction or call continueWithNewToken
 * by providing a valid composite token
 */

/**
 * Called when EMV card inserted was detected. This occurs before card data read.
 * @callback TransactionContext~cardInsertedHandler
 * @param {CardInsertedHandler} cardInsertedHandler Call continue to read EMV data from inserted chip card
 */

/**
 * @callback TransactionContext~onAuthComplete
 * @param {error} Error if any
 * @param {CaptureHandler} captureHandler doCapture to capture, doVoid to void
 * @param {TransactionRecord} record The transaction record for successful transactions
 *  and failed transactions that reached PayPal. @readonly
 */

/**
 * Called when one of the additional receipt option is selected.
 * @callback TransactionContext~receiptOptionHandler
 * @param {int} index The index of the selected receipt option.
 * @param {string} name The name of the selected receipt option.
 * @param {TransactionRecord} record The transaction record for successful transactions
 *  and failed transactions that reached PayPal. @readonly
 */

/**
 * Called when requestPaymentCancellation is complete
 * @callback TransactionContext~cancellationHandler
 * @param {error} error error indicating why we cannot cancel tranasction
 * @param {string} message string indicating cancellation status
 */

/**
 * @callback TransactionContext~complete
 * @param {error} error Error (if any)
 */

/**
 * Called when either void completes or fails.
 * Note that other events may be fired in the meantime.
 * @callback TransactionContext~voidCompleted
 * @param {error} error The error that caused the transaction to fail, if any
 * @param {TransactionRecord} record The transaction record for successful transactions
 *  and failed transactions that reached PayPal.
 */


exports["default"] = TransactionContext;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../common/InstLogger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/InstLogger.js","../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/PPObjects":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/PPObjects.js","../common/SimulationManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/SimulationManager.js","../common/TimeoutManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/TimeoutManager.js","../common/eventTracking":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/eventTracking.js","../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../flows/CreditCardFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/CreditCardFlow.js","../flows/DigitalCardFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/DigitalCardFlow.js","../flows/DigitalCardVoidFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/DigitalCardVoidFlow.js","../flows/OfferReceiptFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/OfferReceiptFlow.js","../flows/OfflineDeclineFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/OfflineDeclineFlow.js","../flows/OfflinePaymentFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/OfflinePaymentFlow.js","../flows/PaymentErrorHandler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/PaymentErrorHandler.js","../flows/PaymentFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/PaymentFlow.js","../flows/QuickChipCreditCardFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/QuickChipCreditCardFlow.js","../flows/ReaderTippingFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/ReaderTippingFlow.js","../flows/VaultOnlyFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/VaultOnlyFlow.js","../flows/VaultOnlyWithoutUiFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/VaultOnlyWithoutUiFlow.js","../flows/messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","../flows/refundFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/refundFlow.js","../paymentDevice/DeviceSelector":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceSelector.js","./DeviceController":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/DeviceController.js","./TimeCard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TimeCard.js","./TransactionBeginOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionBeginOptions.js","./TransactionStateManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionStateManager.js","./qrc/QRCContext":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCContext.js","./transactionEvent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionEvent.js","./transactionStates":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionStates.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/assign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/assign.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/pph-sdk-enums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/async/lib/async.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.string.match.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.match.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js","ramda/src/isNil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isNil.js","retail-page-tracker":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/retail-page-tracker/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionManager.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _sdkErrors = require("../common/sdkErrors");

var _TransactionContext = _interopRequireDefault(require("./TransactionContext"));

var _invoicing = require("../common/invoicing");

var _authManager = _interopRequireDefault(require("./authManager"));

var _voidManager = _interopRequireDefault(require("./voidManager"));

var _AuthorizedTransaction = _interopRequireDefault(require("./AuthorizedTransaction"));

var _OfflinePaymentManager = _interopRequireDefault(require("./OfflinePaymentManager"));

var Log = (0, _manticoreLog["default"])('TxManager');
var notInitializedDevMessage = 'You must have an active merchant to create a transaction. ' + 'Call InitializeMerchant first, and wait for it to complete.';
var offlineInitDevMessage = 'Unable to load offline merchant info. ' + 'You need to call a successful InitializeMerchant on this device before switching to offline mode.';
var activeMerchantForAuthDevMessage = 'You must have an active merchant to retrieve an ' + 'authorized transaction. Call InitializeMerchant first, and wait for it to complete.';
var activeMerchantForVoidDevMessage = 'You must have an active merchant to void an ' + 'authorized transaction. Call InitializeMerchant first, and wait for it to complete.';
var activeMerchantForCaptureDevMessage = 'You must have an active merchant to capture an ' + 'authorized transaction. Call InitializeMerchant first, and wait for it to complete.';
/**
 * TransactionManager is a public facing facade to everything related to a Transaction.
 * @class
 */

var TransactionManager = /*#__PURE__*/function () {
  function TransactionManager() {
    (0, _classCallCheck2["default"])(this, TransactionManager);
  }

  (0, _createClass2["default"])(TransactionManager, [{
    key: "createTransaction",
    value:
    /**
     * Create a transaction using the provided Invoice. An existing transaction will be canceled
     * @param {RetailInvoice} invoice
     * @param {TransactionManager~transaction} callback
     */
    function createTransaction(invoice, callback) {
      var _this = this;

      if (!_Merchant["default"].active) {
        callback(_sdkErrors.merchant.notInitialized.withDevMessage(notInitializedDevMessage), null);
        return;
      }

      this._tryClearCurrentTx(function (err) {
        if (err) {
          Log.error('clearExistingTxFailedCreate', {
            txn: _this._tx,
            err: err
          });
          callback(err);
        } else {
          _this._tx = new _TransactionContext["default"](invoice, _Merchant["default"].active, _this.offlinePaymentEnabled);
          callback(err, _this._tx);
        }
      });
    }
    /**
     * Create a vault.
     * @param {TransactionManager~transaction} callback
     */

  }, {
    key: "createVaultTransaction",
    value: function createVaultTransaction(callback) {
      var _this2 = this;

      if (!_Merchant["default"].active) {
        callback(_sdkErrors.merchant.notInitialized.withDevMessage(notInitializedDevMessage), null);
        return;
      }

      if (this.offlinePaymentEnabled) {
        callback(_sdkErrors.sdk.validationError.withDevMessage('vault is not allowed during offline payment'), null);
        return;
      }

      Log.debug(function () {
        return "creating vault tx with currency: ".concat(_Merchant["default"].active.currency);
      });
      var invoice = new _invoicing.RetailInvoice(_Merchant["default"].active.currency); // we need to add an item with minimum $1.0 to pass the checks, however, it will not be used during vault flow.

      invoice.addItem('item', 1, 1.0, 'itemId', 'detailId');

      this._tryClearCurrentTx(function (err) {
        if (err) {
          Log.error('clearExistingTxFailedVault', {
            txn: _this2._tx,
            err: err
          });
          callback(err);
        } else {
          _this2._tx = new _TransactionContext["default"](invoice, _Merchant["default"].active, _this2.offlinePaymentEnabled, true);
          callback(err, _this2._tx);
        }
      });
    }
    /**
     * Create a refund transaction. An existing transaction will be canceled.
     * Note: Refunds can be performed using invoiceId alone using createRefundTransactionWithInvoiceId.
     * And refunds can also be performed with transactionNumber alone using createRefundTransactionWithTransactionNumber.
     * @param {string} invoiceId
     * @param {string} transactionNumber
     * @param {Invoice.PaymentMethod} paymentMethod
     * @param {TransactionManager~transaction} callback
     */

  }, {
    key: "createRefundTransaction",
    value: function createRefundTransaction(invoiceId, transactionNumber, paymentMethod, callback) {
      Log.info('createRefundTx');

      this._createRefundTransaction(invoiceId, transactionNumber, paymentMethod, callback);
    }
    /**
     * Simplified cash or check refund with invoiceId. An existing transaction will be canceled.
     * @param {string} invoiceId
     * @param {TransactionManager~transaction} callback
     */

  }, {
    key: "createCashOrCheckRefundTransaction",
    value: function createCashOrCheckRefundTransaction(invoiceId, callback) {
      Log.info('createCashOrCheckRefundTx');

      this._createRefundTransaction(invoiceId, null, _paypalInvoicing.InvoiceEnums.PaymentMethod.CASH, callback);
    }
    /**
     * Simplified card refund with invoiceId. An existing transaction will be canceled.
     * @param {string} invoiceId
     * @param {TransactionManager~transaction} callback
     */

  }, {
    key: "createCardRefundTransaction",
    value: function createCardRefundTransaction(invoiceId, callback) {
      Log.info('createCardRefundTx');

      this._createRefundTransaction(invoiceId, null, _paypalInvoicing.InvoiceEnums.PaymentMethod.CREDIT_CARD, callback);
    }
  }, {
    key: "_createRefundTransaction",
    value: function _createRefundTransaction(invoiceId, transactionNumber, paymentMethod, callback) {
      var _this3 = this;

      if (!_Merchant["default"].active) {
        callback(_sdkErrors.merchant.notInitialized.withDevMessage(notInitializedDevMessage), null);
        return;
      }

      if (!transactionNumber && !invoiceId) {
        callback(_sdkErrors.transaction.missingTransactionNumberOrInvoiceId);
        return;
      }

      this._tryClearCurrentTx(function (err) {
        if (err) {
          Log.error('clearExistingTxFailedRefund', {
            txn: _this3._tx,
            err: err
          });
          callback(err);
        } else {
          var payment = new _paypalInvoicing.InvoicePayment();
          payment.transactionID = transactionNumber;
          payment.method = paymentMethod;
          var invoice = new _invoicing.RetailInvoice(_Merchant["default"].active.currency);
          invoice.payPalId = invoiceId;
          invoice.status = _paypalInvoicing.InvoiceEnums.Status.PAID;
          invoice.payments = [payment];
          _this3._tx = new _TransactionContext["default"](invoice, _Merchant["default"].active);
          callback(err, _this3._tx);
        }
      });
    }
    /**
     * Enable the offline payment flag and start the offline payment process if needed
     * @param {TransactionManager~offlinePaymentStatus} callback
     */

  }, {
    key: "startOfflinePayment",
    value: function startOfflinePayment(callback) {
      var _this4 = this;

      if (!_Merchant["default"].active) {
        callback(_sdkErrors.merchant.notInitialized.withDevMessage(notInitializedDevMessage), null);
        return;
      }

      if (!this.getOfflinePaymentEligibility()) {
        callback(_sdkErrors.merchant.offlinePaymentIneligible.withDevMessage('Merchant is not eligible to use offline mode'), null);
        return;
      }

      _Merchant["default"].active.loadOfflineMerchant(false, function (err) {
        if (err || !_Merchant["default"].active.isOffline) {
          callback(_sdkErrors.merchant.failedToLoadOfflineMerchant.withDevMessage(offlineInitDevMessage), null);
          return;
        }

        _this4.stopReplayOfflineTxns(callback);

        Log.info('Offline Payment is enabled!');
      });
    }
    /**
     * Get offline payment eligibility for the merchant
     * @returns {bool} Returns the bool if the merchant is eligible for offline payment
     */

  }, {
    key: "getOfflinePaymentEligibility",
    value: function getOfflinePaymentEligibility() {
      return _Merchant["default"].active && _Merchant["default"].active.offlinePaymentEligibility;
    }
    /**
     * Get QRC payment eligibility for the merchant
     * @returns {bool} Returns the bool if the merchant is eligible for QRC payment
     */

  }, {
    key: "getQRCEligibility",
    value: function getQRCEligibility() {
      return _Merchant["default"].active && _Merchant["default"].active.qrcEligibility;
    }
    /**
     * disable the offline payment flag
     * @param {TransactionManager~offlinePaymentStatus} callback
     */

  }, {
    key: "stopOfflinePayment",
    value: function stopOfflinePayment(callback) {
      var _this5 = this;

      if (_Merchant["default"].active) {
        _Merchant["default"].active.reloadOnlineMerchant(function (err) {
          if (err) {
            if (callback) {
              callback(err);
            }
          } else {
            Log.info('Offline Payment is disabled!');

            _this5.getOfflinePaymentStatus(callback);
          }
        });
      }
    }
    /**
     * start the replay of the offline txns saved
     * @param {TransactionManager~offlinePaymentStatus} callback
     */

  }, {
    key: "startReplayOfflineTxns",
    value: function startReplayOfflineTxns(callback) {
      // ToDo
      var afterStop = function afterStop(err) {
        if (err) {
          callback(err);
        } else {
          _OfflinePaymentManager["default"].startReplay(callback);

          Log.info('Started Replay Offline Txns!');
        }
      };

      this.stopOfflinePayment(afterStop);
    }
    /**
     * stop the replay of the offline txns saved
     * @param {TransactionManager~offlinePaymentStatus} callback
     */

  }, {
    key: "stopReplayOfflineTxns",
    value: function stopReplayOfflineTxns(callback) {
      _OfflinePaymentManager["default"].stopReplay(callback);

      Log.info('Stopped Replay Offline Txns!');
    }
    /**
     * get the status of offline payment txns
     * @param {TransactionManager~offlinePaymentStatus} callback
     */

  }, {
    key: "getOfflinePaymentStatus",
    value: function getOfflinePaymentStatus(callback) {
      _OfflinePaymentManager["default"].getStatus(callback);
    }
    /**
     * Enable the offline payment flag
     * @returns {bool} Returns the bool if the offline payment is enabled
     */

  }, {
    key: "getOfflinePaymentEnabled",
    value: function getOfflinePaymentEnabled() {
      return this.offlinePaymentEnabled;
    }
    /**
     * Returns the list of supported QRC service providers
     * @returns {[string]} The list of the supported QRC providers
     */

  }, {
    key: "getSupportedQRCProviders",
    value: function getSupportedQRCProviders() {
      return _Merchant["default"].active ? _Merchant["default"].active.qrcUrlTemplateProviders() : [];
    }
    /**
     * Get the current transaction context
     * @returns {TransactionContext} Returns the current transaction context
     */

  }, {
    key: "getCurrentTransactionContext",
    value: function getCurrentTransactionContext() {
      return this._tx;
    }
  }, {
    key: "offlinePaymentEnabled",
    get: function get() {
      return _Merchant["default"].active && _Merchant["default"].active.isOffline;
    }
  }, {
    key: "_tryClearCurrentTx",
    value: function _tryClearCurrentTx(cb) {
      if (!this._tx) {
        cb(undefined);
        return;
      }

      this._tx.clear(cb);
    }
    /**
     * Retrieve the list of authorized transactions.
     * @param {Date} startDateTime start date time for listing the authorized transactions. Cannot be greater than endDateTime or current date-time.
     * @param {Date} endDateTime end date time for listing the authorized transactions. Defaults to startDateTime + 5 days.
     * If provided it should be less than or equal to (startDateTime + 5 days)
     * @param {int} pageSize number of authorized transactions to be returned per API call. Has to be greater than 0 and less than 31.
     * @param {[AuthStatus]} status list of status that need to be retrieved. Optional, defaults to all status.
     * @param {TransactionManager~retrieveAuthorizedTransactions} callback
     */

  }, {
    key: "retrieveAuthorization",
    value: function retrieveAuthorization(startDateTime, endDateTime, pageSize, status, callback) {
      if (!_Merchant["default"].active) {
        callback(_sdkErrors.merchant.notInitialized.withDevMessage(activeMerchantForAuthDevMessage), null, null);
        return;
      }

      (0, _authManager["default"])(startDateTime, endDateTime, pageSize, status, null, callback);
    }
    /**
     * Retrieve the next list of authorized transactions using the nextPageToken.
     * @param {string} nextPageToken token to retrive the next page of objects. Cannot be null.
     * @param {TransactionManager~retrieveAuthorizedTransactions} callback
     */

  }, {
    key: "retrieveAuthorizationUsingToken",
    value: function retrieveAuthorizationUsingToken(nextPageToken, callback) {
      if (!_Merchant["default"].active) {
        callback(_sdkErrors.merchant.notInitialized.withDevMessage(activeMerchantForAuthDevMessage), null, null);
        return;
      }

      if (!nextPageToken || nextPageToken === '') {
        callback(_sdkErrors.sdk.validationError.withDevMessage('nextPageToken cannot be null'), null, null);
        return;
      }

      (0, _authManager["default"])(null, null, null, null, nextPageToken, callback);
    }
    /**
     * Void an authorized transaction
     * @param {string} authorizationId The authorization id of the transaction. Cannot be null.
     * @param {TransactionManager~voidAuthorization} callback
     */

  }, {
    key: "voidAuthorization",
    value: function voidAuthorization(authorizationId, callback) {
      if (!_Merchant["default"].active) {
        callback(_sdkErrors.merchant.notInitialized.withDevMessage(activeMerchantForVoidDevMessage));
        return;
      }

      (0, _voidManager["default"])(authorizationId, callback);
    }
    /**
     * Capture a previously authorized transaction.
     * @param {string} authorizationId the authorizationId to be captured.
     * @param {string} invoiceId the invoice id associated with the authorization.
     * @param {decimal} totalAmount the total amount that has to be captured.
     * @param {decimal} gratuityAmount (optional) the gratuity amount that is also part of the totalAmount. If present, should be less than total Amount.
     * @param {string} currency the currency in which authorization was placed.
     * @param {TransactionManager~captureAuthorizedTransaction} callback
     */

  }, {
    key: "captureAuthorization",
    value: function captureAuthorization(authorizationId, invoiceId, totalAmount, gratuityAmount, currency, callback) {
      if (!_Merchant["default"].active) {
        callback(_sdkErrors.merchant.notInitialized.withDevMessage(activeMerchantForCaptureDevMessage), null);
        return;
      }

      var auth = new _AuthorizedTransaction["default"](authorizationId, invoiceId, currency);
      auth.captureTransaction(totalAmount, gratuityAmount, callback);
    }
    /**
     * Capture a previously authorized transaction.
     * @nativeName captureAuthorization
     * @param {string} authorizationId the authorizationId to be captured.
     * @param {string} invoiceId the invoice id associated with the authorization.
     * @param {decimal} totalAmount the total amount that has to be captured.
     * @param {decimal} gratuityAmount (optional) the gratuity amount that is also part of the totalAmount. If present, should be less than total Amount.
     * @param {string} currency the currency in which authorization was placed.
     * @param {string} base64SignatureJpeg The signature as a base64 encoded JPEG image. Try to keep it under 100k
     * @param {TransactionManager~captureAuthorizedTransaction} callback
     */

  }, {
    key: "captureAuthorizationWithSig",
    value: function captureAuthorizationWithSig(authorizationId, invoiceId, totalAmount, gratuityAmount, currency, base64SignatureJpeg, callback) {
      if (!_Merchant["default"].active) {
        callback(_sdkErrors.merchant.notInitialized.withDevMessage(activeMerchantForCaptureDevMessage), null);
        return;
      }

      var auth = new _AuthorizedTransaction["default"](authorizationId, invoiceId, currency);
      auth.captureTransactionWithSig(totalAmount, gratuityAmount, base64SignatureJpeg, callback);
    }
  }]);
  return TransactionManager;
}();
/**
 * The callback for creating a transaction
 * @callback TransactionManager~transaction
 * @param {error} error Error reported while created a transaction
 * @param {TransactionContext} context Transaction context
 */

/**
 * The callback for retrieveAuthorizedTransactions completion
 * @callback TransactionManager~retrieveAuthorizedTransactions
 * @param {error} error Error reported while trying to retrieve list of authorized transactions
 * @param {[AuthorizedTransaction]} listOfAuths list of authorized transactions
 * @param {string} nextPageToken token to retrieve the next page of objects. Will be null if there is no next page.
 * as a object
 */

/**
 * The callback for voidTransaction completion
 * @callback TransactionManager~voidAuthorization
 * @param {error} error Error reported while trying to void an authorized transaction
 */

/**
 * The callback for captureAuthorizedTransaction completion
 * @callback TransactionManager~captureAuthorizedTransaction
 * @param {error} error Error reported while trying to capture the authorized transaction
 * @param {string} captureId Id after a successful capture
 */

/**
 * The callback for replaying offline payment
 * @callback TransactionManager~offlinePaymentStatus
 * @param {error} error Error reported while replaying offline payment
 * @param {OfflinePaymentInfo} info Includes TPV and List of status infos after replaying the offline payment
 */


var transactionManager = new TransactionManager();
var _default = transactionManager;
exports["default"] = _default;

},{"../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/invoicing/index.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./AuthorizedTransaction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/AuthorizedTransaction.js","./OfflinePaymentManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/OfflinePaymentManager.js","./TransactionContext":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionContext.js","./authManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/authManager.js","./voidManager":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/voidManager.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionRecord.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var util = _interopRequireWildcard(require("manticore-util"));

var _lodash = require("lodash");

var _Payer = _interopRequireDefault(require("./Payer"));

var _DigitalCardInfo = _interopRequireDefault(require("./DigitalCardInfo"));

var _Record2 = _interopRequireDefault(require("./Record"));

var _ReceiptDestination = require("./ReceiptDestination");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

function ownKeys(object, enumerableOnly) {
  var keys = _Object$keys(object);

  if (_Object$getOwnPropertySymbols) {
    var symbols = _Object$getOwnPropertySymbols(object);

    enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
    })), keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var _context2, _context3;

    var source = null != arguments[i] ? arguments[i] : {};
    i % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(source), !0)).call(_context2, function (key) {
      (0, _defineProperty2["default"])(target, key, source[key]);
    }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context3 = ownKeys(Object(source))).call(_context3, function (key) {
      _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
    });
  }

  return target;
}

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var ResponseCode = {
  partiallyPaid: '8888',
  noAmountToPay: '7777',
  success: '0000',
  failure: '9999'
};
/**
 * Information about a completed transaction
 * @class
 * @extends Record
 * @property {string} transactionNumber The PayPal transaction reference number @readonly
 * @property {string} invoiceId The PayPal invoice id @readonly
 * @property {string} orderId The PayPal order id @readonly
 * @property {Invoice.PaymentMethod} paymentMethod The payment method used for this payment
 * @property {string} authCode The PayPal authCode @readonly
 * @property {string} paymentAction Payment Mode used for this transaction @readonly
 * @property {string} transactionHandle An identifier available throughout the EMV transaction flow
 * (allocated before the transaction is complete, unlike transactionNumber) @readonly
 * @property {string} responseCode The acquirer response code @readonly
 * @property {DigitalCardInfo}  digitalCardInfo Holds Response information for a digital card payment @readonly
 * @property {Payer} payer Information about the payer, if available @readonly
 * @property {string} correlationId The correlationId used for obtaining additional support
 * from PayPal for this transaction attempt @readonly
 * @property {ReceiptDestination} receiptDestination Indicates whether an email or a text
 * receipt was sent or not. @readonly
 * @property {string} captureId The reference id for the captured authorization @readonly
 */

var TransactionRecord = /*#__PURE__*/function (_Record) {
  (0, _inherits2["default"])(TransactionRecord, _Record);

  var _super = _createSuper(TransactionRecord);
  /**
   * @package
   */


  function TransactionRecord() {
    var _this;

    var response = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
    (0, _classCallCheck2["default"])(this, TransactionRecord);
    _this = _super.call(this); // AuthCode is not an externally accessible value, but we use it internally so we copy it over.

    util.assignSome((0, _assertThisInitialized2["default"])(_this), response, ['correlationId', 'transactionNumber', 'invoiceId', 'transactionHandle', 'responseCode', 'authCode', 'errorCode', 'paymentAction']); // Fill this object for digital card transactions

    if (response.digitalCardInfo) {
      _this.digitalCardInfo = new _DigitalCardInfo["default"](response.digitalCardInfo);
    }

    if (response.payerInfo) {
      _this.payer = new _Payer["default"](response.payerInfo);
    } // In case of refunds, the transaction number is returned as an `id`


    if (response.id) {
      _this.transactionNumber = response.id;
    } // In case of void, success is send back and not response code


    if (!response.responseCode) {
      _this.responseCode = response.success === true ? ResponseCode.success : ResponseCode.failure;
    } // For some reason, in a few of the MTP failures, the transaction handle is returned as `txnHandle` instead of `transactionHandle` :-(


    if (response.txnHandle && !_this.transactionHandle) {
      _this.transactionHandle = response.txnHandle;
    }

    if (response.invoiceId) {
      _this.invoiceId = response.invoiceId;
    }

    if (response.orderId) {
      _this.orderId = response.orderId;
    }

    _this.receiptDestination = new _ReceiptDestination.ReceiptDestination();
    return _this;
  }
  /**
   * @package
   */


  (0, _createClass2["default"])(TransactionRecord, [{
    key: "updateFromFinalize",
    value: function updateFromFinalize(finalize) {
      if (!this.transactionNumber) {
        this.transactionNumber = finalize.transactionNumber;
      }

      if (finalize.correlationId && this.correlationId) {
        var _context;

        this.correlationId = (0, _concat["default"])(_context = "".concat(this.correlationId, ",")).call(_context, finalize.correlationId);
      } else if (finalize.correlationId) {
        this.correlationId = finalize.correlationId;
      }

      if (!_lodash._.isEmpty(finalize.payerInfo)) {
        this.payer = new _Payer["default"](finalize.payerInfo);
      }
    }
  }, {
    key: "isPaymentIncomplete",
    value: function isPaymentIncomplete() {
      return this.responseCode === ResponseCode.partiallyPaid || this.responseCode === ResponseCode.noAmountToPay;
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(TransactionRecord.prototype), "toJSON", this).call(this)), {}, {
        invoiceId: this.invoiceId,
        transactionNumber: this.transactionNumber,
        transactionHandle: this.transactionHandle,
        responseCode: this.responseCode,
        correlationId: this.correlationId,
        paymentAction: this.paymentAction,
        paymentMethod: this.paymentMethod,
        captureId: this.captureId,
        payer: this.payer,
        receiptDestination: this.receiptDestination,
        orderId: this.orderId
      });
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this);
    }
  }]);
  return TransactionRecord;
}(_Record2["default"]);

exports["default"] = TransactionRecord;
TransactionRecord.Error = {
  ContactlessNotAcceptable: 600075,
  IncorrectOnlinePin: 6000164
};

},{"./DigitalCardInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/DigitalCardInfo.js","./Payer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/Payer.js","./ReceiptDestination":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/ReceiptDestination.js","./Record":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/Record.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionStateManager.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticoreUtil = require("manticore-util");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _transactionStates = require("./transactionStates");

var _DeviceSelector = _interopRequireDefault(require("../paymentDevice/DeviceSelector"));

var Log = (0, _manticoreLog["default"])('transaction.State');

var TransactionStateManager = /*#__PURE__*/function () {
  function TransactionStateManager(context) {
    (0, _classCallCheck2["default"])(this, TransactionStateManager);
    this._paymentState = _transactionStates.PaymentState.idle;
    this._tippingState = _transactionStates.TippingState.notStarted;
    this._completionState = _transactionStates.CompletionInvocationState.notInvoked;
    this._sActiveFormFactors = new _set["default"]();
    this._context = context;
  }

  (0, _createClass2["default"])(TransactionStateManager, [{
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        paymentState: (0, _manticoreUtil.getPropertyName)(_transactionStates.PaymentState, this.getPaymentState()),
        tippingState: (0, _manticoreUtil.getPropertyName)(_transactionStates.TippingState, this.getTippingState()),
        endState: (0, _manticoreUtil.getPropertyName)(_transactionStates.CompletionInvocationState, this._getCompletionState()),
        connectedDevices: _retailPaymentDevice.PaymentDevice.devices.length,
        selectedDevice: _DeviceSelector["default"].selectedDevice ? _DeviceSelector["default"].selectedDevice.id : '<none>',
        activeFormFactors: (0, _manticoreUtil.getPropertyName)(_retailPaymentDevice.FormFactor, (0, _toConsumableArray2["default"])(this.getSetOfActiveFormFactors()))
      };
    }
  }, {
    key: "getPaymentState",
    value: function getPaymentState() {
      return this._paymentState;
    }
  }, {
    key: "setPaymentState",
    value: function setPaymentState(value) {
      var _this = this;

      this._paymentState = value;
      Log.debug(function () {
        var _context;

        return (0, _concat["default"])(_context = "Setting PAYMENT state of ".concat(_this._context.id, " to ")).call(_context, (0, _manticoreUtil.getPropertyName)(_transactionStates.PaymentState, value));
      });
    }
  }, {
    key: "getTippingState",
    value: function getTippingState() {
      return this._tippingState;
    }
  }, {
    key: "setTippingState",
    value: function setTippingState(value) {
      var _this2 = this;

      this._tippingState = value;
      Log.debug(function () {
        var _context2;

        return (0, _concat["default"])(_context2 = "Setting TIPPING state of ".concat(_this2._context.id, " to ")).call(_context2, (0, _manticoreUtil.getPropertyName)(_transactionStates.TippingState, value));
      });
    }
  }, {
    key: "setPaymentFlowStartedState",
    value: function setPaymentFlowStartedState(value) {
      var _this3 = this;

      this._paymentFlowStarted = value;
      Log.debug(function () {
        var _context3;

        return (0, _concat["default"])(_context3 = "Setting PaymentFlowStarted state of ".concat(_this3._context.id, " to ")).call(_context3, value);
      });
    }
  }, {
    key: "getPaymentFlowStartState",
    value: function getPaymentFlowStartState() {
      return this._paymentFlowStarted;
    }
  }, {
    key: "_setCompletionState",
    value: function _setCompletionState(value) {
      var _this4 = this;

      this._completionState = value;
      Log.debug(function () {
        var _context4;

        return (0, _concat["default"])(_context4 = "Setting Completion state of ".concat(_this4._context.id, " to ")).call(_context4, (0, _manticoreUtil.getPropertyName)(_transactionStates.CompletionInvocationState, value));
      });
    }
  }, {
    key: "setEndStateInProgress",
    value: function setEndStateInProgress() {
      // This de-couples the end state management from underlying implementation
      // We can merge various states in future without changing the consumer of setEndStateInProgress
      if (this._getCompletionState() === _transactionStates.CompletionInvocationState.notInvoked) {
        // Do not switch back to in progress if we have already completed
        this._setCompletionState(_transactionStates.CompletionInvocationState.invoked);
      }
    }
  }, {
    key: "setEndStateComplete",
    value: function setEndStateComplete() {
      // This encapsulates the end state management from underlying implementation
      // We can merge various states in future without changing the consumer of setEndStateComplete
      this._setCompletionState(_transactionStates.CompletionInvocationState.complete);
    }
  }, {
    key: "_getCompletionState",
    value: function _getCompletionState() {
      return this._completionState;
    }
  }, {
    key: "isCompletionInvoked",
    value: function isCompletionInvoked() {
      // This de-couples the end state management from underlying implementation
      // We can merge various states in future without changing the consumer of isCompletionInvoked
      return this._completionState !== _transactionStates.CompletionInvocationState.notInvoked;
    }
  }, {
    key: "getSetOfActiveFormFactors",
    value: function getSetOfActiveFormFactors() {
      return _DeviceSelector["default"].selectedDevice ? _DeviceSelector["default"].selectedDevice.getSetOfActiveFormFactors() : new _set["default"]();
    }
  }, {
    key: "isFormFactorActive",
    value: function isFormFactorActive(formFactor) {
      return _DeviceSelector["default"].selectedDevice ? _DeviceSelector["default"].selectedDevice.isFormFactorActive(formFactor) : false;
    }
  }]);
  return TransactionStateManager;
}();

exports["default"] = TransactionStateManager;

},{"../paymentDevice/DeviceSelector":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/paymentDevice/DeviceSelector.js","./transactionStates":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionStates.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/VaultRecord.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _Record2 = _interopRequireDefault(require("./Record"));

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}
/**
 * Information about a completed vault
 * @class
 * @extends Record
 * @property {string} vaultId The Vault id @readonly
 */


var VaultRecord = /*#__PURE__*/function (_Record) {
  (0, _inherits2["default"])(VaultRecord, _Record);

  var _super = _createSuper(VaultRecord);
  /**
   * @package
   */


  function VaultRecord(response) {
    var _this;

    (0, _classCallCheck2["default"])(this, VaultRecord);
    _this = _super.call(this);

    if (response) {
      _this.vaultId = response.id;
    }

    return _this;
  }

  (0, _createClass2["default"])(VaultRecord, [{
    key: "toString",
    value: function toString() {
      return "vaultRecord: ".concat((0, _stringify["default"])(this));
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        vaultId: this.vaultId
      };
    }
  }]);
  return VaultRecord;
}(_Record2["default"]);

exports["default"] = VaultRecord;

},{"./Record":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/Record.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/authManager.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = retrieveAuthorizedTransactions;

var _isInteger = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/number/is-integer"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _moment = _interopRequireDefault(require("moment"));

var _retailSDKUtil = require("../common/retailSDKUtil");

var _sdkErrors = require("../common/sdkErrors");

var _authorizedTransactionsRetriever = _interopRequireDefault(require("./authorizedTransactionsRetriever"));

var _AuthStatus = _interopRequireDefault(require("./AuthStatus"));

var Log = (0, _manticoreLog["default"])('authManager');

function _getQueryParams(startDateTime, endDateTime, pageSize, status, nextPageToken, callback) {
  var queryParams = null; // If there is a next page token use that, if not build the queryParam

  if (nextPageToken) {
    queryParams = nextPageToken;
  } else {
    var _context, _context2;

    var validationErrorDeveloperMessage = null; // Start date time is a required field and should be less than current date time

    if (!startDateTime || !(0, _moment["default"])(startDateTime).isValid() || (0, _moment["default"])(startDateTime) > (0, _moment["default"])()) {
      validationErrorDeveloperMessage = 'startDateTime is missing or is invalid';
    } else if (endDateTime && !(0, _moment["default"])(endDateTime).isValid()) {
      validationErrorDeveloperMessage = 'endDateTime is invalid';
    } else if (endDateTime && startDateTime.getTime() > endDateTime.getTime()) {
      validationErrorDeveloperMessage = 'startDateTime should not greater than endDateTime';
    } else if (endDateTime && !(0, _retailSDKUtil.isDatesWithinOffset)(startDateTime, endDateTime, 5)) {
      // We are limiting the difference in days to 5 because of server side limitations
      validationErrorDeveloperMessage = 'endDateTime - startDateTime cannot be greater than 5 days';
    } else if (!(0, _isInteger["default"])(pageSize) || pageSize <= 0 || pageSize > 30) {
      validationErrorDeveloperMessage = 'pageSize is invalid. It should be greater than 0 and less than 31';
    }

    if (validationErrorDeveloperMessage) {
      Log.error('InvalidInput', {
        err: validationErrorDeveloperMessage
      });
      var validationError = _sdkErrors.transaction.authRetrieveValidationFailed;
      validationError.developerMessage = validationErrorDeveloperMessage;
      callback(validationError);
      return undefined;
    } // End date time is optional, if missing set it to startDateTime + 5 days


    var finalEndTime = null;

    if (!endDateTime) {
      finalEndTime = new Date(startDateTime);
      finalEndTime.setDate(finalEndTime.getDate() + 5);
    } else {
      finalEndTime = endDateTime;
    }

    queryParams = "start_time=".concat((0, _moment["default"])(startDateTime).toISOString());
    queryParams = (0, _concat["default"])(_context = "".concat(queryParams, "&end_time=")).call(_context, (0, _moment["default"])(finalEndTime).toISOString());
    queryParams = (0, _concat["default"])(_context2 = "".concat(queryParams, "&page_size=")).call(_context2, pageSize); // status filter is optional, so fill in the list of provided status into queryParams

    if (status && status.length > 0) {
      queryParams = "".concat(queryParams, "&statuses=");
      (0, _forEach["default"])(status).call(status, function (id) {
        switch (id) {
          case _AuthStatus["default"].pending:
            queryParams = "".concat(queryParams, "PENDING,");
            break;

          case _AuthStatus["default"].canceled:
            queryParams = "".concat(queryParams, "CANCELED,");
            break;

          default:
        }
      }); // Remove the extra comma(,) in the end

      queryParams = queryParams.substring(0, queryParams.length - 1);
    }
  }

  Log.debug(function () {
    return "the query params are ".concat(queryParams);
  });
  return queryParams;
}

function retrieveAuthorizedTransactions(startDateTime, endDateTime) {
  var pageSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
  var status = arguments.length > 3 ? arguments[3] : undefined;
  var nextPageToken = arguments.length > 4 ? arguments[4] : undefined;
  var callback = arguments.length > 5 ? arguments[5] : undefined;
  Log.debug(function () {
    var _context3;

    return (0, _concat["default"])(_context3 = "the startTime object is ".concat((0, _stringify["default"])(startDateTime), " and is of the type ")).call(_context3, (0, _typeof2["default"])(startDateTime));
  });
  Log.debug(function () {
    var _context4;

    return (0, _concat["default"])(_context4 = "the endTime object is ".concat((0, _stringify["default"])(endDateTime), " and is of the type ")).call(_context4, (0, _typeof2["default"])(endDateTime));
  });
  Log.debug(function () {
    var _context5;

    return (0, _concat["default"])(_context5 = "the pageSize object is ".concat((0, _stringify["default"])(pageSize), " and is of the type ")).call(_context5, (0, _typeof2["default"])(pageSize));
  });
  Log.debug(function () {
    var _context6;

    return (0, _concat["default"])(_context6 = "the status object is ".concat((0, _stringify["default"])(status), " and is of the type ")).call(_context6, (0, _typeof2["default"])(status));
  });
  Log.debug(function () {
    var _context7;

    return (0, _concat["default"])(_context7 = "the nextPageToken object is ".concat((0, _stringify["default"])(nextPageToken), " and is of the type ")).call(_context7, (0, _typeof2["default"])(nextPageToken));
  });

  var queryParams = _getQueryParams(startDateTime, endDateTime, pageSize, status, nextPageToken, callback);

  if (queryParams) {
    (0, _authorizedTransactionsRetriever["default"])(queryParams, callback);
  }
}

},{"../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./AuthStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/AuthStatus.js","./authorizedTransactionsRetriever":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/authorizedTransactionsRetriever.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/number/is-integer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-integer.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/authorizedTransactionsRetriever.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = retrieveTransactions;

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.split.js");

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _sdkErrors = require("../common/sdkErrors");

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _AuthorizedTransaction = _interopRequireDefault(require("./AuthorizedTransaction"));

var Log = (0, _manticoreLog["default"])('AuthorizedTransactionsRetriever');

function retrieveTransactions(queryParams, callback) {
  var listOfAuths = [];
  var nextPageToken = null;
  Log.debug(function () {
    return "Retrieve list of authorizations with the queryParams: ".concat(queryParams);
  });
  var op = "checkouts?".concat(queryParams);

  _Merchant["default"].active.request({
    service: 'retail',
    op: op,
    format: 'json'
  }, function (error, response) {
    var actualError = null;

    if (error || !response || !response.body) {
      Log.error('ErrRetrievingAutList', {
        err: (0, _stringify["default"])(error)
      });
      actualError = _sdkErrors.transaction.retrieveAuthListFailed;
    } else if (response && response.body) {
      Log.debug(function () {
        return "this is the response object ".concat((0, _stringify["default"])(response));
      }); // Get the list of auth

      if (response.body.items && response.body.items.length > 0) {
        var _context;

        (0, _forEach["default"])(_context = response.body.items).call(_context, function (item) {
          var auth = _AuthorizedTransaction["default"].fromJSON(item);

          listOfAuths.push(auth);
        });
      }

      Log.info('SuccessRetrievingAuthorizedList', {
        length: listOfAuths.length
      }); // Get the next page token from the array of links

      if (response.body.links) {
        var _context2;

        (0, _forEach["default"])(_context2 = response.body.links).call(_context2, function (link) {
          if (link.rel === 'next' && link.method === 'GET') {
            var _link$href$split = link.href.split('?');

            var _link$href$split2 = (0, _slicedToArray2["default"])(_link$href$split, 2);

            nextPageToken = _link$href$split2[1];
          }
        });
      }
    }

    callback(actualError, listOfAuths, nextPageToken);
  });
}

},{"../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./AuthorizedTransaction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/AuthorizedTransaction.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.string.split.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/captureManager.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = captureAuthorization;

var _parseFloat2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-float"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _sdkErrors = require("../common/sdkErrors");

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var _InstLogger = require("../common/InstLogger");

var _l10n = _interopRequireDefault(require("../common/l10n"));

var _retailSDKUtil = require("../common/retailSDKUtil");

var Log = (0, _manticoreLog["default"])('captureManager');

function captureAuthorization(authorizationId, invoiceId, totalAmount, gratuityAmount, currency, signature, callback) {
  var totalAmountInDecimal = (0, _parseFloat2["default"])(totalAmount);
  var gratuityAmountInDecimal = (0, _parseFloat2["default"])(gratuityAmount);
  Log.debug('Capture Manager', {
    authorizationId: authorizationId,
    typeOfAuthId: (0, _typeof2["default"])(authorizationId),
    invoiceId: invoiceId,
    typeOfInvoiceId: (0, _typeof2["default"])(invoiceId),
    totalAmountInDecimal: totalAmountInDecimal,
    typeOfGratuityAmountInDecimal: (0, _typeof2["default"])(gratuityAmountInDecimal)
  });
  var validationErrorDeveloperMessage = null;

  if (!authorizationId) {
    validationErrorDeveloperMessage = 'authorization id is missing';
  } else if (!invoiceId) {
    validationErrorDeveloperMessage = 'invoice id is missing';
  } else if (!totalAmountInDecimal || totalAmountInDecimal < 0) {
    validationErrorDeveloperMessage = 'totalAmount is missing or invalid';
  } else if (gratuityAmountInDecimal && (gratuityAmountInDecimal < 0 || gratuityAmountInDecimal > totalAmountInDecimal)) {
    validationErrorDeveloperMessage = 'gratuity should be greater than 0 and less than totalAmount';
  } else if (!currency) {
    validationErrorDeveloperMessage = 'currency is missing';
  }

  if (validationErrorDeveloperMessage) {
    Log.error('InvalidInput', {
      err: validationErrorDeveloperMessage
    });
    var validationError = _sdkErrors.transaction.captureValidationFailed;
    validationError.developerMessage = validationErrorDeveloperMessage;
    callback(validationError);
    return;
  } // Set the total amount and currency


  var total = {
    currency: currency,
    value: totalAmountInDecimal.toFixed(2)
  };
  var requestBody = {
    totalAmount: total,
    finalCapture: true,
    invoiceId: invoiceId
  };

  if (gratuityAmount) {
    requestBody.gratuity = {
      currency: currency,
      value: gratuityAmountInDecimal.toFixed(2)
    };
  }

  if (signature) {
    requestBody.signature = signature;
  }

  Log.debug(function () {
    return "the capture request is ".concat((0, _stringify["default"])(requestBody));
  });
  var op = "checkouts/".concat(authorizationId, "/capture");

  _Merchant["default"].active.request({
    service: 'retail',
    op: op,
    format: 'json',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: (0, _stringify["default"])(requestBody)
  }, function (error, response) {
    var _response$body, _response$body2;

    Log.developer('Capture Response', {
      response: response,
      error: error
    });
    var captureError = (0, _sdkErrors.retailErrorFromResponse)('CaptureReq', error, response);

    if (captureError || !(response !== null && response !== void 0 && (_response$body = response.body) !== null && _response$body !== void 0 && _response$body.id) || (response === null || response === void 0 ? void 0 : (_response$body2 = response.body) === null || _response$body2 === void 0 ? void 0 : _response$body2.state) !== 'completed') {
      requestBody.message = (0, _l10n["default"])('Tx.TransactionFailed', (0, _retailSDKUtil.getPaymentSubstitutions)());

      if (captureError) {
        callback(captureError, null);
      } else {
        // no error, but !response?.body?.id || response?.body?.state !==
        var devMessage = "Capture response missing id/state: ".concat((0, _stringify["default"])(response ? response.body : {}));
        Log.error('CaptureReqErr', devMessage);
        captureError = _sdkErrors.transaction.captureFailed.withDevMessage(devMessage);
        callback(captureError, null);
      }
    } else {
      requestBody.message = (0, _l10n["default"])('Tx.TransactionSuccessful', (0, _retailSDKUtil.getPaymentSubstitutions)());
      Log.info('SuccessCapturedAuthId', {
        id: authorizationId,
        response: response
      });
      callback(null, response.body.id);
    }

    Log.instrument('CaptureAuthorization', (0, _InstLogger.getCaptureEndInstrumentationEvent)(requestBody, captureError));
  });
}

},{"../common/InstLogger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/InstLogger.js","../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/parse-float":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/index.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Payer = _interopRequireDefault(require("./Payer"));

var _TransactionRecord = _interopRequireDefault(require("./TransactionRecord"));

var _TransactionBeginOptions = _interopRequireDefault(require("./TransactionBeginOptions"));

var _AuthorizedTransaction = _interopRequireDefault(require("./AuthorizedTransaction"));

var _ReceiptDestination = require("./ReceiptDestination");

var _QRCStatusHandler = _interopRequireDefault(require("./qrc/QRCStatusHandler"));

var _QRCRecord = _interopRequireDefault(require("./qrc/QRCRecord"));

var _QRCStatus = _interopRequireDefault(require("./qrc/QRCStatus"));

var _QRCContent = _interopRequireDefault(require("./qrc/QRCContent"));

module.exports = {
  Payer: _Payer["default"],
  ReceiptDestinationType: _ReceiptDestination.ReceiptDestinationType,
  ReceiptDestination: _ReceiptDestination.ReceiptDestination,
  TransactionRecord: _TransactionRecord["default"],
  TransactionBeginOptions: _TransactionBeginOptions["default"],
  AuthorizedTransaction: _AuthorizedTransaction["default"],
  QRCStatusHandler: _QRCStatusHandler["default"],
  QRCRecord: _QRCRecord["default"],
  QRCStatus: _QRCStatus["default"],
  QRCContent: _QRCContent["default"]
};

},{"./AuthorizedTransaction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/AuthorizedTransaction.js","./Payer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/Payer.js","./ReceiptDestination":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/ReceiptDestination.js","./TransactionBeginOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionBeginOptions.js","./TransactionRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionRecord.js","./qrc/QRCContent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCContent.js","./qrc/QRCRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCRecord.js","./qrc/QRCStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatus.js","./qrc/QRCStatusHandler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatusHandler.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCContent.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
/**
 * Vault Provider
 * @enum {int}
 */

var QRCContentType = {
  /**
   * URL type of QRC
   */
  URL: 0,

  /**
   * URL type of QRC
   */
  TEXT: 1
};
var _default = QRCContentType;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCContext.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _machina = _interopRequireDefault(require("machina"));

var _uuid = _interopRequireDefault(require("uuid"));

var _moment = _interopRequireDefault(require("moment"));

var _retailSDKUtil = require("../../common/retailSDKUtil");

var _sdkErrors = require("../../common/sdkErrors");

var _Merchant = _interopRequireDefault(require("../../common/Merchant"));

var _QRCContent = _interopRequireDefault(require("./QRCContent"));

var _QRCStatusHandler = _interopRequireWildcard(require("./QRCStatusHandler"));

var _InstLogger = require("../../common/InstLogger");

var _QRCStatusHandlerWithUI = _interopRequireDefault(require("./QRCStatusHandlerWithUI"));

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

var Log = (0, _manticoreLog["default"])('qrcContext');

function buildRequest(qrcContext, location) {
  var _qrcContext$invoice, _location$latitude, _location$longitude;

  return {
    invoice: (_qrcContext$invoice = qrcContext.invoice) === null || _qrcContext$invoice === void 0 ? void 0 : _qrcContext$invoice.toPaymentJSON(),
    payment_action: qrcContext.txContext.paymentAction,
    payment_metadata: {
      create_time: (0, _moment["default"])().valueOf(),
      location: {
        latitude: (_location$latitude = location.latitude) !== null && _location$latitude !== void 0 ? _location$latitude : 0,
        longitude: (_location$longitude = location.longitude) !== null && _location$longitude !== void 0 ? _location$longitude : 0
      },
      store_id: qrcContext.storeId
    }
  };
}
/**
 * The QRCContext class is returned by RetailSDK.getTransactionManager().createTransaction and allows
 * you to control many aspects of the payment or refund flow and observe events that
 * occur during the flows. Simply creating a TransactionContext will not kick off any behaviors,
 * so that you have a chance to configure the transaction context as you wish (enable on-reader tipping,
 * specify transaction options, etc). When you're ready to proceed with the payment flow,
 * call beginPayment()
 * @class
 */


var QRCContext = /*#__PURE__*/function () {
  /**
   * @param {TransactionContext} transactionContext Transaction Context
   */
  function QRCContext(transactionContext) {
    var _Merchant$active,
        _this$invoice,
        _this = this;

    (0, _classCallCheck2["default"])(this, QRCContext);
    this.txContext = transactionContext;
    this.qrcProvider = transactionContext.paymentOptions.qrcProvider;
    this.invoice = transactionContext.invoice;
    this.merchant = _Merchant["default"].active;
    this.isPPH = (_Merchant$active = _Merchant["default"].active) === null || _Merchant$active === void 0 ? void 0 : _Merchant$active.initWithData;
    this.storeId = this.merchant.storeId;
    this.referrerCode = this.merchant.getReferrerCode();
    this.id = "qrc-tx-".concat((0, _retailSDKUtil.getRandomId)());
    this.sessionId = '';
    this.qrcStatusHandler = transactionContext.qrcPromptEnabled ? new _QRCStatusHandlerWithUI["default"](this, transactionContext) : new _QRCStatusHandler["default"](this, transactionContext);
    Log.debug('CREATE qrc transaction', {
      id: this.id,
      storeId: this.storeId,
      referrerCode: this.referrerCode,
      total: (_this$invoice = this.invoice) === null || _this$invoice === void 0 ? void 0 : _this$invoice.total
    });
    this.fsm = new _machina["default"].Fsm({
      namespace: 'qrc-context',
      initialState: 'begin',
      initialize: function initialize() {
        return Log.debug('fsm initialize started');
      },
      states: {
        begin: {
          _onEnter: function _onEnter() {
            Log.debug('fsm begin _onEnter');

            _this._cancelCB = function () {};
          },
          start: function start() {
            Log.debug('fsm begin start');

            _manticore["default"].getLocation(function (error, location) {
              _this.fsm.transition('qrcGenerate', location);
            });
          },
          cancel: 'cancel'
        },
        qrcGenerate: {
          _onEnter: function _onEnter() {
            var location = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
            Log.debug('fsm qrcGenerate _onEnter');

            if (_this.qrcStatusHandler.isEnded()) {
              Log.debug('fsm - The qrc flow is cancelled so no need for moving on!!!', {
                status: _this.qrcStatusHandler.qrcRecord.qrcStatus
              });
              return;
            }

            if (!_this.merchant.qrcServiceProvider) {
              Log.error('Failed to get the QRC service provider!');

              _this.fsm.transition('end', _sdkErrors.transaction.failedQRCServiceProvider);

              return;
            }

            _this.merchantRefId = _uuid["default"].v1();

            var urlTemplate = _this.merchant.qrcUrlTemplate(_this.qrcProvider, _this.merchantRefId);

            var url = urlTemplate.url,
                error = urlTemplate.error;

            if (error) {
              Log.error('Failed to generate the QRC URL due to empty URL!');

              _this.fsm.transition('end', error);

              return;
            }

            Log.debug('QRC -> generated:', {
              url: url
            });
            Log.debug('QRC -> request:', {
              req: buildRequest(_this, location)
            });

            _this.qrcStatusHandler.handle(undefined, {
              type: _QRCStatusHandler.QRCStatusHandlerType.Url,
              body: {
                urlType: _QRCContent["default"].URL,
                url: url
              }
            });

            var headers = {
              'Content-Type': 'application/json',
              'PAYPAL-REQUEST-ID': _this.merchantRefId,
              Prefer: 'return-invoice'
            };

            if (_this.referrerCode) {
              headers['PayPal-Partner-Attribution-Id'] = _this.referrerCode;
            }

            Log.debug('QRC -> request headers', {
              headers: headers
            });

            _this.merchant.request({
              service: 'payments',
              op: 'qrcode-payment-sessions',
              format: 'json',
              method: 'POST',
              headers: headers,
              body: (0, _stringify["default"])(buildRequest(_this, location))
            }, function (err, qrcRz) {
              Log.debug('fsm qrc call', {
                error: error,
                qrcRz: qrcRz
              });

              if (_this.qrcStatusHandler.isEnded()) {
                Log.debug('fsm - The qrc flow is cancelled so no need for moving on!!!', {
                  status: _this.qrcStatusHandler.qrcRecord.qrcStatus
                });
                return;
              }

              if (err) {
                _this.fsm.transition('end', err);
              } else {
                _this.qrcStatusHandler.handle(undefined, {
                  type: _QRCStatusHandler.QRCStatusHandlerType.Session,
                  body: qrcRz.body,
                  headers: qrcRz.headers
                });

                _this.sessionId = _this.qrcStatusHandler.qrcRecord.sessionId;

                _this.fsm.transition('polling');
              }
            });
          },
          cancel: function cancel() {
            Log.debug('fsm - cancel called during session creation');

            _this.fsm.transition('cancel');
          }
        },
        polling: {
          _onEnter: function _onEnter() {
            Log.debug('fsm polling _onEnter');

            _this.fsm.handle('poll');
          },
          poll: function poll() {
            Log.debug('fsm polling poll');

            if (_this.qrcStatusHandler.isEnded()) {
              Log.debug('fms - The qrc flow is ended so no need for polling!!!', {
                status: _this.qrcStatusHandler.qrcRecord.qrcStatus
              });
              return;
            }

            _this.merchant.request({
              service: 'payments',
              op: "qrcode-payment-sessions/".concat(_this.sessionId),
              format: 'json',
              method: 'GET',
              headers: {
                'Content-Type': 'application/json',
                Accept: 'application/json'
              }
            }, function (error, statusRz) {
              Log.debug('fsm qrc status call', {
                error: error,
                statusRz: statusRz
              });

              if (error) {
                _this.fsm.transition('end', error);
              } else {
                var body = statusRz === null || statusRz === void 0 ? void 0 : statusRz.body;
                Log.debug('body:', {
                  body: body
                }); // eslint-disable-next-line camelcase

                _this.sessionId = body !== null && body !== void 0 && body.isFake ? body === null || body === void 0 ? void 0 : body.session_id : _this.sessionId; // Store session id for api mock

                _this.qrcStatusHandler.handle(undefined, {
                  type: _QRCStatusHandler.QRCStatusHandlerType.Polling,
                  body: body,
                  header: statusRz === null || statusRz === void 0 ? void 0 : statusRz.headers
                });

                if (_this.qrcStatusHandler.isCancelled()) {
                  // If this transaction has already been cancelled by the merchant then cancel & end transitions
                  // would already have been done on this FSM.
                  Log.debug('QRC flow is cancelled, skipping next poll', {
                    status: _this.qrcStatusHandler.qrcRecord.qrcStatus
                  });
                } else if (_this.qrcStatusHandler.shouldEnd()) {
                  _this.fsm.transition('end');
                } else {
                  // until we end this tx, we would be polling the status of the qrc flow
                  _manticore["default"].setTimeout(function () {
                    _this.qrcStatusHandler.qrcRecord.incrementPollTime();

                    _this.fsm.handle('poll');
                  }, _this.merchant.qrcPollingTime);
                }
              }
            });
          },
          cancel: function cancel() {
            Log.debug('fsm qrc payment cancel called...');

            if (_this.qrcStatusHandler.canCancel()) {
              _this.fsm.transition('cancel');
            } else {
              _this._update(_sdkErrors.transaction.cannotCancelActiveQrcTransaction);
            }
          }
        },
        cancel: {
          _onEnter: function _onEnter() {
            Log.debug('fsm qrc cancelled...');

            _this.qrcStatusHandler.handle(undefined, {
              type: _QRCStatusHandler.QRCStatusHandlerType.CancelledByMerchant
            });

            _this.fsm.transition('end');
          }
        },
        end: {
          _onEnter: function _onEnter(error) {
            Log.debug('fsm qrc ended...', {
              error: error
            });

            if (error) {
              var _this$qrcStatusHandle;

              Log.debug('fsm qrc ended with error:', {
                error: error,
                qrcRecord: _this.qrcStatusHandler.qrcRecord
              });
              (_this$qrcStatusHandle = _this.qrcStatusHandler) === null || _this$qrcStatusHandle === void 0 ? void 0 : _this$qrcStatusHandle.handle(error);
            }

            var instData = (0, _InstLogger.getQrcContextInstrumentationData)(_this);
            Log.instrument('QrcTransactionCompleted', (0, _InstLogger.getQrcContextTxEndInstrumentationEvent)(instData));
            Log.track('QrcTransactionCompleted', instData);

            _this._update();
          },
          cancel: function cancel() {
            Log.debug('fsm - it is already ended');

            _this._update();
          }
        }
      }
    });
  }

  (0, _createClass2["default"])(QRCContext, [{
    key: "_update",
    value: function _update() {
      var error = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;

      if (this._callback) {
        this._callback(error);

        this._callback = null;
      }
    }
  }, {
    key: "start",
    value: function start() {
      Log.debug('QRC - start called on FSM');

      if (this.merchant.country !== 'US') {
        var _this$qrcStatusHandle2;

        (_this$qrcStatusHandle2 = this.qrcStatusHandler) === null || _this$qrcStatusHandle2 === void 0 ? void 0 : _this$qrcStatusHandle2.handle(_sdkErrors.transaction.notSupported.withDevMessage("QRC not supported for merchant country '".concat(this.merchant.country, "'")));
        return;
      }

      if (!this.merchant.qrcEligibility) {
        var _this$qrcStatusHandle3;

        (_this$qrcStatusHandle3 = this.qrcStatusHandler) === null || _this$qrcStatusHandle3 === void 0 ? void 0 : _this$qrcStatusHandle3.handle(_sdkErrors.merchant.qrcIneligible.withDevMessage('Merchant ineligible for QRC payment'));
        return;
      }

      this.fsm.handle('start');
    }
  }, {
    key: "cancel",
    value: function cancel() {
      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      Log.debug('QRC - cancel called');
      this._callback = cb;
      this.fsm.handle('cancel');
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      var _this$invoice$currenc, _this$invoice2, _this$invoice$total, _this$invoice3;

      return {
        id: this.id,
        currency: (_this$invoice$currenc = (_this$invoice2 = this.invoice) === null || _this$invoice2 === void 0 ? void 0 : _this$invoice2.currency) !== null && _this$invoice$currenc !== void 0 ? _this$invoice$currenc : '',
        total: (_this$invoice$total = (_this$invoice3 = this.invoice) === null || _this$invoice3 === void 0 ? void 0 : _this$invoice3.total) !== null && _this$invoice$total !== void 0 ? _this$invoice$total : '',
        state: this.fsm.state
      };
    }
  }]);
  return QRCContext;
}();

exports["default"] = QRCContext;

},{"../../common/InstLogger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/InstLogger.js","../../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","./QRCContent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCContent.js","./QRCStatusHandler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatusHandler.js","./QRCStatusHandlerWithUI":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatusHandlerWithUI.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js","machina":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/machina/lib/machina.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js","uuid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCRecord.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _Payer = _interopRequireDefault(require("../Payer"));

var _Merchant = _interopRequireDefault(require("../../common/Merchant"));

var _Record2 = _interopRequireDefault(require("../Record"));

var _QRCStatus = require("./QRCStatus");

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('QRCRecord');
/**
 * Information about a completed transaction
 * @class
 * @extends Record
 * @property {string} transactionNumber The PayPal transaction reference number @readonly
 * @property {QRCStatus} qrcStatus The status of the transaction @readonly
 * @property {string} invoiceId The PayPal invoice id @readonly
 * @property {string} sessionId The PayPal session id @readonly
 * @property {Invoice.PaymentMethod} paymentMethod The payment method used for this payment
 * @property {string} responseCode The acquirer response code @readonly
 * @property {Payer} payer Information about the payer, if available @readonly
 * @property {string} correlationId The correlationId used for obtaining additional support
 * from PayPal for this transaction attempt @readonly
 * @property {QRCContentType} contentType The QRC Content type: URL or text @readonly
 * @property {string} content A URL or text @readonly
 */

var QRCRecord = /*#__PURE__*/function (_Record) {
  (0, _inherits2["default"])(QRCRecord, _Record);

  var _super = _createSuper(QRCRecord);
  /**
   * @package
   */


  function QRCRecord() {
    var _this;

    (0, _classCallCheck2["default"])(this, QRCRecord);
    _this = _super.call(this);
    _this.qrcStatus = _QRCStatus.QRCStatus.draft;
    _this.pollTime = 0;
    _this.pollTimeIncrement = _Merchant["default"].active.qrcPollingTime;
    _this.pollTimeLimit = _Merchant["default"].active.qrcPollingTimeLimit;
    return _this;
  }
  /**
   * @package
   * @param {QRCContentType} type QRC Content Type
   * @param {string} content A URL or text
   * @returns {QRCRecord}
   */


  (0, _createClass2["default"])(QRCRecord, [{
    key: "addURL",
    value: function addURL(type, content) {
      this.contentType = type;
      this.content = content;
      return this;
    }
    /**
     * @package
     * @param {JSON} response
     * @returns {QRCRecord}
     */

  }, {
    key: "addPaymentDetails",
    value: function addPaymentDetails(response) {
      var _this$invoiceId, _ref, _this$transactionNumb, _this$correlationId, _QRCStatus$response$s, _response$status, _this$sessionId, _this$payer;

      Log.debug('addPaymentDetails called with: ', {
        response: response
      }); // AuthCode is not an externally accessible value, but we use it internally so we copy it over.

      this.invoiceId = (_this$invoiceId = this.invoiceId) !== null && _this$invoiceId !== void 0 ? _this$invoiceId : response.invoice_id; // In case of refunds, the transaction number is returned as an `id`

      this.transactionNumber = (_ref = (_this$transactionNumb = this.transactionNumber) !== null && _this$transactionNumb !== void 0 ? _this$transactionNumb : response.id) !== null && _ref !== void 0 ? _ref : response.transaction_id;
      this.correlationId = (_this$correlationId = this.correlationId) !== null && _this$correlationId !== void 0 ? _this$correlationId : response.correlation_id;
      this.qrcStatus = (_QRCStatus$response$s = _QRCStatus.QRCStatus[(_response$status = response.status) === null || _response$status === void 0 ? void 0 : _response$status.toLowerCase()]) !== null && _QRCStatus$response$s !== void 0 ? _QRCStatus$response$s : this.qrcStatus;
      this.sessionId = (_this$sessionId = this.sessionId) !== null && _this$sessionId !== void 0 ? _this$sessionId : response.session_id;
      this.payer = (_this$payer = this.payer) !== null && _this$payer !== void 0 ? _this$payer : new _Payer["default"](response.payerInfo);
      return this;
    }
    /**
     * @package
     */

  }, {
    key: "updateCorrelationId",
    value: function updateCorrelationId() {
      var correlationId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
      this.correlationId = correlationId;
      return this;
    }
    /**
     * @package
     * @param {QRCStatus} status
     * @returns {QRCRecord}
     */

  }, {
    key: "updateStatus",
    value: function updateStatus(status) {
      var _context;

      if (status !== this.qrcStatus && (0, _includes["default"])(_context = [_QRCStatus.QRCStatus.scanned, _QRCStatus.QRCStatus.awaiting_user_input]).call(_context, status)) {
        this.pollTime = this.pollTimeIncrement;
      }

      this.qrcStatus = status;
      return this;
    }
  }, {
    key: "incrementPollTime",
    value: function incrementPollTime() {
      var _context2;

      if ((0, _includes["default"])(_context2 = [_QRCStatus.QRCStatus.scanned, _QRCStatus.QRCStatus.awaiting_user_input, _QRCStatus.QRCStatus.processing]).call(_context2, this.qrcStatus)) {
        this.pollTime += this.pollTimeIncrement;
      }
    }
  }, {
    key: "hasPollingTimedOut",
    value: function hasPollingTimedOut() {
      return this.pollTime > this.pollTimeLimit;
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        qrcStatus: this.qrcStatus,
        invoiceId: this.invoiceId,
        transactionNumber: this.transactionNumber,
        responseCode: this.responseCode,
        sessionId: this.sessionId,
        correlationId: this.correlationId,
        contentType: this.contentType,
        content: this.content,
        pollTime: this.pollTime
      };
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this);
    }
  }]);
  return QRCRecord;
}(_Record2["default"]);

exports["default"] = QRCRecord;

},{"../../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../Payer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/Payer.js","../Record":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/Record.js","./QRCStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatus.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatus.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.QrcPaymentInstrumentationStatus = exports.QRCStatus = void 0;

require("core-js/modules/es.object.to-string.js");

var _manticoreUtil = require("manticore-util");
/**
 * This enum represents the state of the qrc transaction
 * @enum {int}
 */


var QRCStatus = {
  /**
   * qrc payment is being initialized
   */
  draft: 0,

  /**
   * url for the qrc tx created
   */
  url_created: 1,

  /**
   * session for the qrc tx created
   */
  session_created: 2,

  /**
   * qrc url scanned by the user using PP venice app
   */
  scanned: 3,

  /**
   * the user deciding which payment instrument used after scanning
   */
  awaiting_user_input: 4,

  /**
   * qrc url is shown on the UI
   */
  processing: 5,

  /**
   * qrc payment completed
   */
  success: 6,

  /**
   * error occurred during session creation of the qrc
   */
  failed: 7,

  /**
   * qrc payment cancelled
   */
  cancelled: 8,

  /**
   * qrc payment aborted
   */
  aborted: 9,

  /**
   * error occurred during session creation of the qrc
   */
  declined: 10,

  /**
   * qrc payment is being cancelled by merchant
   */
  cancelled_by_merchant: 11
};
exports.QRCStatus = QRCStatus;
QRCStatus.toString = (0, _manticoreUtil.reverseKeysAndValues)(QRCStatus);
var QrcPaymentInstrumentationStatus = {
  session_created: 'Payment Created',
  scanned: 'Payment Scanned',
  awaiting_user_input: 'Awaiting User Input',
  processing: 'Payment Processing',
  success: 'Payment Successful',
  failed: 'Payment Failed',
  cancelled: 'Payment Cancelled',
  aborted: 'Payment Aborted',
  draft: 'Payment Draft',
  cancelled_by_merchant: 'Payment Cancelled by Merchant',
  url_created: 'URL created',
  declined: 'Payment Declined'
};
exports.QrcPaymentInstrumentationStatus = QrcPaymentInstrumentationStatus;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatusHandler.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _defineProperty2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = exports.QRCStatusHandlerType = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _moment = _interopRequireDefault(require("moment"));

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _retailSDKUtil = require("../../common/retailSDKUtil");

var _QRCStatus = require("./QRCStatus");

var _QRCRecord = _interopRequireDefault(require("./QRCRecord"));

var messageHelper = _interopRequireWildcard(require("../../flows/messageHelper"));

var _sdkErrors = require("../../common/sdkErrors");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

var Log = (0, _manticoreLog["default"])('qrcStatusHandler');
/**
 * Possible types between QRCStatusHandler and QRCContext
 */

var QRCStatusHandlerType = {
  /**
   * when Url generated
   */
  Url: 0,

  /**
   * when qrc session response received
   */
  Session: 1,

  /**
   * when qrc polling response received
   */
  Polling: 2,

  /**
   * when qrc polling response received
   */
  CancelledByMerchant: 3
};
exports.QRCStatusHandlerType = QRCStatusHandlerType;

var QRCStatusHandler = /*#__PURE__*/function () {
  /**
   * @param {TransactionContext} transactionContext
   */
  function QRCStatusHandler(qrcContext, transactionContext) {
    (0, _classCallCheck2["default"])(this, QRCStatusHandler);
    this.qrcContext = qrcContext;
    this.merchant = qrcContext.merchant;
    this.handler = transactionContext.qrcStatusHandler;
    this.transactionContext = transactionContext;
    this.qrcRecord = new _QRCRecord["default"]();
    this.id = "status-".concat((0, _retailSDKUtil.getRandomId)());
    this.lastEmittedStatus = null;
    this.lastEmittedStatusTimestamp = (0, _moment["default"])('2001-01-13T11:11:10.000Z');
    this.handlers = this.handlersByType();
  }
  /**
   * Updates the status of the IA
   * @param {payPalError} error
   * @param {QRCRecord} qrcRecord
   */


  (0, _createClass2["default"])(QRCStatusHandler, [{
    key: "onStatus",
    value: function onStatus(error, qrcRecord) {
      Log.debug('onStatus called with: ', {
        error: error,
        qrcRecord: qrcRecord
      });
      this.updateReader(error, qrcRecord.qrcStatus);
      this.onAlert(error, qrcRecord);
      this.handler(error, qrcRecord);
    }
    /**
     * Method to notify transaction context about transaction end
     * @param {payPalError} error An error during the payment
     * @param {QRCRecord} qrcRecord  A QR Code Payment record
     */

  }, {
    key: "onEnded",
    value: function onEnded(error, qrcRecord) {
      var _this = this;

      Log.debug('onEnded called with: ', {
        error: error,
        qrcRecord: qrcRecord
      });
      this.onReceipt(error, qrcRecord, function () {
        _this.transactionContext.end(error, qrcRecord, false);

        _this.updateInvoicePayment();

        _this.onStatus(error, qrcRecord);
      });
    }
  }, {
    key: "onAlert",
    value: function onAlert(error, qrcRecord) {
      // Note that this is only implemented for QRCStatusHandlerWithUI
      Log.debug('onAlert called with: ', {
        error: error,
        qrcRecord: qrcRecord
      });
    }
  }, {
    key: "onReceipt",
    value: function onReceipt(error, qrcRecord) {
      var cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {}; // Note that this is only implemented for QRCStatusHandlerWithUI

      Log.debug('onReceipt called with: ', {
        error: error,
        qrcRecord: qrcRecord
      });
      cb();
    }
  }, {
    key: "onUrlPage",
    value: function onUrlPage(url) {
      // Note that this is only implemented for QRCStatusHandlerWithUI
      Log.debug('onUrlPage called with: ', {
        url: url
      });
    }
  }, {
    key: "shouldHandleStatus",
    value: function shouldHandleStatus(status, timestamp) {
      var _context;

      return this.lastEmittedStatusTimestamp.isBefore(timestamp) && ((0, _includes["default"])(_context = [_QRCStatus.QRCStatus.awaiting_user_input, _QRCStatus.QRCStatus.processing]).call(_context, status) || status !== this.lastEmittedStatus);
    }
  }, {
    key: "shouldEnd",
    value: function shouldEnd() {
      var _context2;

      var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.qrcRecord.qrcStatus;
      return (0, _includes["default"])(_context2 = [_QRCStatus.QRCStatus.success, _QRCStatus.QRCStatus.failed, _QRCStatus.QRCStatus.declined, _QRCStatus.QRCStatus.cancelled, _QRCStatus.QRCStatus.aborted]).call(_context2, status) || this.qrcRecord.hasPollingTimedOut();
    }
  }, {
    key: "isEnded",
    value: function isEnded() {
      var _context3;

      var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.qrcRecord.qrcStatus;
      return (0, _includes["default"])(_context3 = [_QRCStatus.QRCStatus.success, _QRCStatus.QRCStatus.failed, _QRCStatus.QRCStatus.declined, _QRCStatus.QRCStatus.cancelled, _QRCStatus.QRCStatus.aborted, _QRCStatus.QRCStatus.cancelled_by_merchant]).call(_context3, status);
    }
  }, {
    key: "isCancelled",
    value: function isCancelled() {
      var _context4;

      var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.qrcRecord.qrcStatus;
      return (0, _includes["default"])(_context4 = [_QRCStatus.QRCStatus.cancelled_by_merchant]).call(_context4, status);
    }
  }, {
    key: "canCancel",
    value: function canCancel() {
      var _context5;

      var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.qrcRecord.qrcStatus;
      return (0, _includes["default"])(_context5 = [_QRCStatus.QRCStatus.url_created, _QRCStatus.QRCStatus.session_created, _QRCStatus.QRCStatus.draft]).call(_context5, status);
    }
  }, {
    key: "emitStatusList",
    value: function emitStatusList(statusList) {
      var _this2 = this;

      if (this.qrcRecord.hasPollingTimedOut()) {
        this.onEnded(_sdkErrors.transaction.qrcSessionTimeOut, this.qrcRecord);
        return;
      }

      statusList === null || statusList === void 0 ? void 0 : (0, _forEach["default"])(statusList).call(statusList, function (event) {
        var status = _QRCStatus.QRCStatus[event.name.toLowerCase()];

        var time = (0, _moment["default"])(event.create_time);

        if (_this2.shouldHandleStatus(status, time)) {
          _this2.qrcRecord.updateStatus(status);

          _this2.lastEmittedStatus = status;
          _this2.lastEmittedStatusTimestamp = time;

          if (_this2.shouldEnd()) {
            _this2.onEnded(undefined, _this2.qrcRecord);
          } else {
            _this2.onStatus(undefined, _this2.qrcRecord);
          }
        }
      });
    }
  }, {
    key: "updateReader",
    value: function updateReader(error, status) {
      var _context6;

      Log.debug('updateReader:', {
        error: error,
        status: status
      });
      var msgId = _retailPaymentDevice.PaymentDevice.Message.Processing;

      if (error || status === _QRCStatus.QRCStatus.failed) {
        msgId = _retailPaymentDevice.PaymentDevice.Message.Sale.Failed;
      } else if (status === _QRCStatus.QRCStatus.success) {
        msgId = _retailPaymentDevice.PaymentDevice.Message.Sale.Successful;
      } else if ((0, _includes["default"])(_context6 = [_QRCStatus.QRCStatus.cancelled, _QRCStatus.QRCStatus.aborted, _QRCStatus.QRCStatus.cancelled_by_merchant]).call(_context6, status)) {
        msgId = _retailPaymentDevice.PaymentDevice.Message.Sale.Cancelled;
      } else if (status === _QRCStatus.QRCStatus.declined) {
        msgId = _retailPaymentDevice.PaymentDevice.Message.Sale.Declined;
      }

      messageHelper.readerDisplay(this.transactionContext, msgId, messageHelper.getSubstitutions(this.transactionContext), function () {}, null);
      Log.debug('updateReader displayed:', {
        msgId: msgId
      });
    }
  }, {
    key: "updateInvoicePayment",
    value: function updateInvoicePayment() {
      Log.debug('updating invoice payment');

      if (this.canCancel()) {
        // if session is created but not scanned, the invoice should be able to be used by other payments
        // so returning without updating.
        Log.debug('QRC - NOT updating invoice payment since it can be used by other payments');
        return;
      }

      var invoice = this.transactionContext.invoice;

      if (this.qrcRecord.qrcStatus === _QRCStatus.QRCStatus.success) {
        var stubPayment = new _paypalInvoicing.InvoicePayment(this.transactionContext.type, invoice.total, invoice.currency);
        stubPayment.transactionID = this.qrcRecord.transactionNumber;
        invoice.addPayment(stubPayment, this.transactionContext.paymentType);
        invoice.resetFlags();

        if (invoice.isCancelled) {
          invoice.isCancelled = false;
        }
      } else if (this.qrcRecord.qrcStatus === _QRCStatus.QRCStatus.cancelled) {
        invoice.isCancelled = true;
      } else {
        invoice.isFailed = true;
      }
    }
  }, {
    key: "updateInvoice",
    value: function updateInvoice(newInvoice) {
      if (newInvoice) {
        var invoice = this.transactionContext.invoice;
        Log.debug('update invoice - before : ', {
          invoice: invoice,
          total: invoice.total
        });
        invoice.fromPaymentJSON(newInvoice);
        Log.debug('update invoice - after : ', {
          invoice: invoice,
          total: invoice.total
        });
      }
    }
  }, {
    key: "handlersByType",
    value: function handlersByType() {
      var _ref;

      var _this3 = this;

      return _ref = {}, (0, _defineProperty2["default"])(_ref, QRCStatusHandlerType.Url, function (body) {
        Log.debug('handle Url: ', {
          body: body
        });
        var urlType = body.urlType,
            url = body.url;

        _this3.qrcRecord.updateStatus(_QRCStatus.QRCStatus.url_created);

        _this3.qrcRecord.addURL(urlType, url);

        _this3.onUrlPage(url);

        _this3.onStatus(undefined, _this3.qrcRecord);
      }), (0, _defineProperty2["default"])(_ref, QRCStatusHandlerType.Session, function (body) {
        Log.debug('handle Session: ', {
          body: body
        }); // eslint-disable-next-line camelcase

        var qrcode_payment_info = body.qrcode_payment_info,
            invoice = body.invoice;

        _this3.updateInvoice(invoice);

        _this3.qrcRecord.addPaymentDetails(qrcode_payment_info);

        _this3.emitStatusList(qrcode_payment_info.events);
      }), (0, _defineProperty2["default"])(_ref, QRCStatusHandlerType.Polling, function (body) {
        Log.debug('handle Polling: ', {
          body: body
        });
        var events = body.events;

        _this3.emitStatusList(events);
      }), (0, _defineProperty2["default"])(_ref, QRCStatusHandlerType.CancelledByMerchant, function () {
        Log.debug('handle CancelledByMerchant');

        _this3.qrcRecord.updateStatus(_QRCStatus.QRCStatus.cancelled_by_merchant);

        _this3.onStatus(undefined, _this3.qrcRecord);
      }), _ref;
    }
  }, {
    key: "handle",
    value: function handle(error, data) {
      Log.debug('Handling:', {
        error: error,
        data: data,
        status: _QRCStatus.QRCStatus.toString[this.qrcRecord.qrcStatus]
      });

      if (this.isCancelled()) {
        return;
      }

      if (error) {
        Log.error('handle error: ', {
          error: error
        });
        this.qrcRecord.updateStatus(_QRCStatus.QRCStatus.failed);
        this.onEnded(error, this.qrcRecord);
        return;
      }

      var type = data.type,
          body = data.body,
          headers = data.headers;

      if (headers && headers['paypal-debug-id']) {
        Log.debug('updating correlationId: ', {
          correllationId: headers['paypal-debug-id']
        });
        this.qrcRecord.updateCorrelationId(headers['paypal-debug-id']);
      }

      if (this.handlers[type]) {
        var handler = this.handlers[type];

        try {
          handler(body);
          return;
        } catch (err) {
          Log.error('executingHandlerErr', {
            err: err,
            msg: err.message,
            data: data,
            handler: handler
          });
          this.onEnded(err, this.qrcRecord);
          return;
        }
      }

      Log.warn('qrcStatusHandlersUndefined', {
        data: data
      });
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        id: this.id
      };
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this);
    }
  }]);
  return QRCStatusHandler;
}();

exports["default"] = QRCStatusHandler;

},{"../../common/retailSDKUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/retailSDKUtil.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../../flows/messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./QRCRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCRecord.js","./QRCStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatus.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatusHandlerWithUI.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _messageHelper = require("../../flows/messageHelper");

var _QRCStatus = require("./QRCStatus");

var _sdkErrors = require("../../common/sdkErrors");

var _l10n = _interopRequireDefault(require("../../common/l10n"));

var _OfferReceiptFlow = _interopRequireDefault(require("../../flows/OfferReceiptFlow"));

var _QRCStatusHandler2 = _interopRequireDefault(require("./QRCStatusHandler"));

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();

  return function _createSuperInternal() {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (hasNativeReflectConstruct) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = _Reflect$construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
  if (_Reflect$construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('qrcStatusHandlerWithUI');

var getQRCLogoId = function getQRCLogoId(provider) {
  // Note that we need a default logo if not found provider.
  // This could be empty one, too
  // To be decided: for now, let's use the paypal one!
  var logoId = 'paypal_logo_dark_blue';

  if (provider.toLowerCase() === 'paypal') {
    logoId = 'paypal_logo_dark_blue';
  } else if (provider.toLowerCase() === 'venmo') {
    logoId = 'venmo_icon';
  }

  return logoId;
};

var getRcptErrorByStatus = function getRcptErrorByStatus(status) {
  var _context;

  var error = _sdkErrors.transaction.failedQRC;

  if (status === _QRCStatus.QRCStatus.success) {
    error = undefined;
  } else if ((0, _includes["default"])(_context = [_QRCStatus.QRCStatus.cancelled, _QRCStatus.QRCStatus.aborted, _QRCStatus.QRCStatus.cancelled_by_merchant]).call(_context, status)) {
    error = _sdkErrors.transaction.customerCancel;
  } else if (status === _QRCStatus.QRCStatus.declined) {
    error = _sdkErrors.transaction.declinedQRC;
  }

  return error;
};

var QRCStatusHandlerWithUI = /*#__PURE__*/function (_QRCStatusHandler) {
  (0, _inherits2["default"])(QRCStatusHandlerWithUI, _QRCStatusHandler);

  var _super = _createSuper(QRCStatusHandlerWithUI);

  function QRCStatusHandlerWithUI() {
    (0, _classCallCheck2["default"])(this, QRCStatusHandlerWithUI);
    return _super.apply(this, arguments);
  }

  (0, _createClass2["default"])(QRCStatusHandlerWithUI, [{
    key: "onAlert",
    value: function onAlert(error, qrcRecord) {
      var _context2,
          _this$alert,
          _this = this;

      Log.debug('onAlert -> ', {
        status: qrcRecord.qrcStatus,
        error: error
      });

      if (!(0, _includes["default"])(_context2 = [_QRCStatus.QRCStatus.scanned, _QRCStatus.QRCStatus.awaiting_user_input, _QRCStatus.QRCStatus.processing]).call(_context2, qrcRecord.qrcStatus) || this.alertInProgress) {
        return;
      }

      Log.debug('onAlert -> show the Alert');
      (_this$alert = this.alert) === null || _this$alert === void 0 ? void 0 : _this$alert.dismiss();
      this.alertInProgress = true;
      var title = (0, _l10n["default"])('QRC.Scanned.Title');
      var message = (0, _l10n["default"])('QRC.Scanned.Msg');
      this.alert = _manticore["default"].alert({
        title: title,
        message: message
      }, function () {
        var _this$alert2;

        (_this$alert2 = _this.alert) === null || _this$alert2 === void 0 ? void 0 : _this$alert2.dismiss();
        _this.alertInProgress = false;
      });
    }
  }, {
    key: "onReceipt",
    value: function onReceipt(error, qrcRecord) {
      var _this2 = this;

      var cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};

      if (this.transactionContext.skipReceipt) {
        cb();
        return;
      }

      if (!this.receiptInProgress) {
        var _this$alert3;

        this.receiptInProgress = true;
        (_this$alert3 = this.alert) === null || _this$alert3 === void 0 ? void 0 : _this$alert3.dismiss();
        var qrcStatus = qrcRecord.qrcStatus;
        Log.debug('onReceipt -> ', {
          qrcStatus: qrcStatus,
          error: error,
          skipReceipt: this.transactionContext.skipReceipt
        });
        var rcptError = error !== null && error !== void 0 ? error : getRcptErrorByStatus(qrcStatus);
        Log.debug('onReceipt -> ', {
          rcptError: rcptError
        });
        var offerReceiptFlow = new _OfferReceiptFlow["default"](rcptError, this.transactionContext, function () {
          var _this2$alert;

          (_this2$alert = _this2.alert) === null || _this2$alert === void 0 ? void 0 : _this2$alert.dismiss();
          cb();
        });
        offerReceiptFlow.startFlow();
      }
    }
  }, {
    key: "onTermsAndConditions",
    value: function onTermsAndConditions(cb) {
      var _context3,
          _this3 = this;

      Log.debug((0, _concat["default"])(_context3 = "T&C qrcTCenable: ".concat(this.merchant.qrcTCenable, ", qrcTCAccepted: ")).call(_context3, this.merchant.getQrcTcAcceptance()));

      if (this.merchant.qrcTCenable && !this.merchant.getQrcTcAcceptance()) {
        var _this$alert4;

        (_this$alert4 = this.alert) === null || _this$alert4 === void 0 ? void 0 : _this$alert4.dismiss();
        Log.debug('Display T&C');
        this.alert = _manticore["default"].alert({
          htmlMessage: this.merchant.qrcTCcontent,
          exitButtonImageId: 'ic_closeX',
          buttons: ['Agree and Continue'],
          showFullScreen: true
        }, function (alert, index) {
          var _this3$alert; // -1: cancel, index is from the array


          Log.debug("T&C index selected: ".concat(index));
          (_this3$alert = _this3.alert) === null || _this3$alert === void 0 ? void 0 : _this3$alert.dismiss();

          if (index === -1) {
            // cancel is -1
            Log.error('T&C userCancelled');
            cb(new Error('TC userCancelled'));
          } else {
            Log.debug('T&C accepted');

            _this3.merchant.setQrcTcAcceptance(true);

            cb();
          }
        });
      } else {
        cb();
      }
    }
  }, {
    key: "onUrlPage",
    value: function onUrlPage(url) {
      var _this4 = this;

      Log.debug('qrcode generation page called');
      this.onTermsAndConditions(function (err) {
        var _this4$alert;

        (_this4$alert = _this4.alert) === null || _this4$alert === void 0 ? void 0 : _this4$alert.dismiss();

        if (err) {
          _this4.qrcContext.cancel();

          return;
        }

        var amnt = (0, _messageHelper.getSubstitutions)(_this4.transactionContext);
        var title = (0, _l10n["default"])('QRC.UrlPage.Title', amnt);
        var message = (0, _l10n["default"])('QRC.UrlPage.Msg');
        var qrcLogoId = getQRCLogoId(_this4.qrcContext.qrcProvider);
        var linkMessage = _this4.merchant.qrcTClink;
        Log.debug('QRC URL Page corresponding logo for ', {
          provider: _this4.qrcContext.qrcProvider,
          qrcLogoId: qrcLogoId,
          url: url
        });
        _this4.alert = _manticore["default"].alert({
          title: title,
          message: message,
          linkMessage: linkMessage,
          qrcDialog: true,
          qrcLogoId: qrcLogoId,
          qrcContent: url
        }, function (alert, index) {
          var _this4$alert2;

          (_this4$alert2 = _this4.alert) === null || _this4$alert2 === void 0 ? void 0 : _this4$alert2.dismiss();

          if (index === -1) {
            // cancel/back button clicked
            Log.debug('QRC URL page back button called so cancelling qrcContext!');

            _this4.qrcContext.cancel();
          }
        });
      });
    }
  }]);
  return QRCStatusHandlerWithUI;
}(_QRCStatusHandler2["default"]);

exports["default"] = QRCStatusHandlerWithUI;

},{"../../common/l10n":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/l10n.js","../../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","../../flows/OfferReceiptFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/OfferReceiptFlow.js","../../flows/messageHelper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/flows/messageHelper.js","./QRCStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatus.js","./QRCStatusHandler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCStatusHandler.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionEvent.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
/**
 * List of events that could be emitted by the Transaction context
 */

var TransactionEvent = {
  /**
   * Signature collection was completed
   */
  didCompleteSignature: 'didCompleteSignature',

  /**
   * Signature was required for this transaction and the assigned signature collector will be activated
   */
  willPresentSignature: 'willPresentSignature',

  /**
   * A footer was added to invoice total that will be display on the connected reader
   */
  invoiceDisplayFooterUpdated: 'invoiceDisplayFooterUpdated',

  /**
   * A device form factor not previously known was discovered
   */
  formFactorAdded: 'formFactorAdded',

  /**
   * Contactless reader was deactivated
   */
  contactlessReaderDeactivated: 'contactlessReaderDeactivated',

  /**
   * Contactless reader was activated
   */
  contactlessReaderActivated: 'contactlessReaderActivated',

  /**
   * Tipping flow on reader was completed
   */
  readerTippingCompleted: 'readerTippingCompleted',

  /**
   * Amount to be refunded entered
   */
  refundAmountEntered: 'refundAmountEntered'
};
var _default = TransactionEvent;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionStates.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.TippingState = exports.PaymentState = exports.CompletionInvocationState = void 0;
/**
 * This enum represents the state of the current payment
 * @enum {int}
 */

var PaymentState = {
  /**
   * Transaction is in idle state
   */
  idle: 0,

  /**
   * Card is currently presented and payment is in progress
   */
  inProgress: 1,

  /**
   * Payment was retried
   */
  retry: 2,

  /**
   * A payment was completed
   */
  complete: 3
};
/**
 * This enum represents the state of the current tipping
 * @enum {int}
 */

exports.PaymentState = PaymentState;
var TippingState = {
  /**
   * Tipping flow has not started
   */
  notStarted: 0,

  /**
   * Tipping flow is in progress
   */
  inProgress: 1,

  /**
   * Tipping flow is complete
   */
  complete: 2
};
/**
 * This enum represents the state of transaction end
 * @enum {int}
 */

exports.TippingState = TippingState;
var CompletionInvocationState = {
  /**
   * Transaction end has not started
   */
  notInvoked: 0,

  /**
   * Transaction end is in progress
   */
  invoked: 1,

  /**
   * Transaction end is complete
   */
  complete: 2
};
exports.CompletionInvocationState = CompletionInvocationState;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/transactionUtil.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.getDefaultRecord = getDefaultRecord;

var _QRCRecord = _interopRequireDefault(require("./qrc/QRCRecord"));

var _TransactionRecord = _interopRequireDefault(require("./TransactionRecord"));

var _OfflineTransactionRecord = _interopRequireDefault(require("./OfflineTransactionRecord"));

var _VaultRecord = _interopRequireDefault(require("./VaultRecord"));

var _TransactionBeginOptions = require("./TransactionBeginOptions"); // eslint-disable-next-line import/prefer-default-export


function getDefaultRecord(options) {
  if (options.paymentType === _TransactionBeginOptions.PaymentTypes.qrc) {
    return new _QRCRecord["default"]();
  }

  if (options.offlinePaymentEnabled) {
    return new _OfflineTransactionRecord["default"]();
  }

  if (options.enabledForVaultOnlyFlow) {
    return new _VaultRecord["default"]();
  }

  return new _TransactionRecord["default"]();
}

},{"./OfflineTransactionRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/OfflineTransactionRecord.js","./TransactionBeginOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionBeginOptions.js","./TransactionRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/TransactionRecord.js","./VaultRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/VaultRecord.js","./qrc/QRCRecord":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/qrc/QRCRecord.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/transaction/voidManager.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _typeof2 = _interopRequireDefault2(require("@babel/runtime-corejs3/helpers/typeof"));

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = voidAuthorization;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _sdkErrors = require("../common/sdkErrors");

var _Merchant = _interopRequireDefault(require("../common/Merchant"));

var Log = (0, _manticoreLog["default"])('voidManager');

function voidAuthorization(authorizationId, callback) {
  Log.debug(function () {
    var _context;

    return (0, _concat["default"])(_context = "the authorization id is ".concat((0, _stringify["default"])(authorizationId), " and is of the type ")).call(_context, (0, _typeof2["default"])(authorizationId));
  });

  if (!authorizationId) {
    callback(_sdkErrors.sdk.validationError.withDevMessage('authorization id cannot be null'));
    return;
  }

  var op = "checkouts/".concat(authorizationId, "/void");
  var request = {
    paymentAction: 'authorization'
  };

  _Merchant["default"].active.request({
    service: 'retail',
    op: op,
    format: 'json',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: (0, _stringify["default"])(request)
  }, function (error, response) {
    var _response$body, _response$body2;

    if (error || !(response !== null && response !== void 0 && (_response$body = response.body) !== null && _response$body !== void 0 && _response$body.id) || (response === null || response === void 0 ? void 0 : (_response$body2 = response.body) === null || _response$body2 === void 0 ? void 0 : _response$body2.state) !== 'voided') {
      var _response$body3;

      Log.error('voidRequestErr', {
        op: op,
        err: (0, _stringify["default"])(error)
      });
      callback(_sdkErrors.transaction.voidFailed.withDevMessage(response === null || response === void 0 ? void 0 : (_response$body3 = response.body) === null || _response$body3 === void 0 ? void 0 : _response$body3.developerMessage));
    } else {
      Log.info('voidAuthorizationSuccess', {
        id: authorizationId,
        resp: (0, _stringify["default"])(response, null, 4)
      });
      callback(null);
    }
  });
}

},{"../common/Merchant":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/Merchant.js","../common/sdkErrors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/common/sdkErrors.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/array/is-array.js":[function(require,module,exports){
module.exports = require("core-js/library/fn/array/is-array");
},{"core-js/library/fn/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/array/is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/get-iterator.js":[function(require,module,exports){
module.exports = require("core-js/library/fn/get-iterator");
},{"core-js/library/fn/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/get-iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/object/define-property.js":[function(require,module,exports){
module.exports = require("core-js/library/fn/object/define-property");
},{"core-js/library/fn/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/object/keys.js":[function(require,module,exports){
module.exports = require("core-js/library/fn/object/keys");
},{"core-js/library/fn/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/promise.js":[function(require,module,exports){
module.exports = require("core-js/library/fn/promise");
},{"core-js/library/fn/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/promise.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/symbol.js":[function(require,module,exports){
module.exports = require("core-js/library/fn/symbol");
},{"core-js/library/fn/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/symbol/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/symbol/iterator.js":[function(require,module,exports){
module.exports = require("core-js/library/fn/symbol/iterator");
},{"core-js/library/fn/symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/symbol/iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/helpers/interopRequireDefault.js":[function(require,module,exports){
function _interopRequireDefault(obj) {
  return obj && obj.__esModule ? obj : {
    "default": obj
  };
}

module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/helpers/typeof.js":[function(require,module,exports){
var _Symbol = require("@babel/runtime-corejs2/core-js/symbol");

var _Symbol$iterator = require("@babel/runtime-corejs2/core-js/symbol/iterator");

function _typeof(obj) {
  "@babel/helpers - typeof";

  return (module.exports = _typeof = "function" == typeof _Symbol && "symbol" == typeof _Symbol$iterator ? function (obj) {
    return typeof obj;
  } : function (obj) {
    return obj && "function" == typeof _Symbol && obj.constructor === _Symbol && obj !== _Symbol.prototype ? "symbol" : typeof obj;
  }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj);
}

module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"@babel/runtime-corejs2/core-js/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/symbol.js","@babel/runtime-corejs2/core-js/symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/symbol/iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/array/is-array.js":[function(require,module,exports){
require('../../modules/es6.array.is-array');
module.exports = require('../../modules/_core').Array.isArray;

},{"../../modules/_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","../../modules/es6.array.is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/get-iterator.js":[function(require,module,exports){
require('../modules/web.dom.iterable');
require('../modules/es6.string.iterator');
module.exports = require('../modules/core.get-iterator');

},{"../modules/core.get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/core.get-iterator.js","../modules/es6.string.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.string.iterator.js","../modules/web.dom.iterable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/web.dom.iterable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/define-property.js":[function(require,module,exports){
require('../../modules/es6.object.define-property');
var $Object = require('../../modules/_core').Object;
module.exports = function defineProperty(it, key, desc) {
  return $Object.defineProperty(it, key, desc);
};

},{"../../modules/_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","../../modules/es6.object.define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/object/keys.js":[function(require,module,exports){
require('../../modules/es6.object.keys');
module.exports = require('../../modules/_core').Object.keys;

},{"../../modules/_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","../../modules/es6.object.keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/promise.js":[function(require,module,exports){
require('../modules/es6.object.to-string');
require('../modules/es6.string.iterator');
require('../modules/web.dom.iterable');
require('../modules/es6.promise');
require('../modules/es7.promise.finally');
require('../modules/es7.promise.try');
module.exports = require('../modules/_core').Promise;

},{"../modules/_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","../modules/es6.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.to-string.js","../modules/es6.promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.promise.js","../modules/es6.string.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.string.iterator.js","../modules/es7.promise.finally":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.promise.finally.js","../modules/es7.promise.try":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.promise.try.js","../modules/web.dom.iterable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/web.dom.iterable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/symbol/index.js":[function(require,module,exports){
require('../../modules/es6.symbol');
require('../../modules/es6.object.to-string');
require('../../modules/es7.symbol.async-iterator');
require('../../modules/es7.symbol.observable');
module.exports = require('../../modules/_core').Symbol;

},{"../../modules/_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","../../modules/es6.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.to-string.js","../../modules/es6.symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.symbol.js","../../modules/es7.symbol.async-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.symbol.async-iterator.js","../../modules/es7.symbol.observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.symbol.observable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/fn/symbol/iterator.js":[function(require,module,exports){
require('../../modules/es6.string.iterator');
require('../../modules/web.dom.iterable');
module.exports = require('../../modules/_wks-ext').f('iterator');

},{"../../modules/_wks-ext":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-ext.js","../../modules/es6.string.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.string.iterator.js","../../modules/web.dom.iterable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/web.dom.iterable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_a-function.js":[function(require,module,exports){
module.exports = function (it) {
  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
  return it;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_add-to-unscopables.js":[function(require,module,exports){
module.exports = function () { /* empty */ };

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-instance.js":[function(require,module,exports){
module.exports = function (it, Constructor, name, forbiddenField) {
  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
    throw TypeError(name + ': incorrect invocation!');
  } return it;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js":[function(require,module,exports){
var isObject = require('./_is-object');
module.exports = function (it) {
  if (!isObject(it)) throw TypeError(it + ' is not an object!');
  return it;
};

},{"./_is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-includes.js":[function(require,module,exports){
// false -> Array#indexOf
// true  -> Array#includes
var toIObject = require('./_to-iobject');
var toLength = require('./_to-length');
var toAbsoluteIndex = require('./_to-absolute-index');
module.exports = function (IS_INCLUDES) {
  return function ($this, el, fromIndex) {
    var O = toIObject($this);
    var length = toLength(O.length);
    var index = toAbsoluteIndex(fromIndex, length);
    var value;
    // Array#includes uses SameValueZero equality algorithm
    // eslint-disable-next-line no-self-compare
    if (IS_INCLUDES && el != el) while (length > index) {
      value = O[index++];
      // eslint-disable-next-line no-self-compare
      if (value != value) return true;
    // Array#indexOf ignores holes, Array#includes - not
    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
      if (O[index] === el) return IS_INCLUDES || index || 0;
    } return !IS_INCLUDES && -1;
  };
};

},{"./_to-absolute-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-absolute-index.js","./_to-iobject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js","./_to-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-length.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_classof.js":[function(require,module,exports){
// getting tag from 19.1.3.6 Object.prototype.toString()
var cof = require('./_cof');
var TAG = require('./_wks')('toStringTag');
// ES3 wrong here
var ARG = cof(function () { return arguments; }()) == 'Arguments';

// fallback for IE11 Script Access Denied error
var tryGet = function (it, key) {
  try {
    return it[key];
  } catch (e) { /* empty */ }
};

module.exports = function (it) {
  var O, T, B;
  return it === undefined ? 'Undefined' : it === null ? 'Null'
    // @@toStringTag case
    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
    // builtinTag case
    : ARG ? cof(O)
    // ES3 arguments fallback
    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
};

},{"./_cof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_cof.js","./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_cof.js":[function(require,module,exports){
var toString = {}.toString;

module.exports = function (it) {
  return toString.call(it).slice(8, -1);
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js":[function(require,module,exports){
var core = module.exports = { version: '2.6.12' };
if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js":[function(require,module,exports){
// optional / simple context binding
var aFunction = require('./_a-function');
module.exports = function (fn, that, length) {
  aFunction(fn);
  if (that === undefined) return fn;
  switch (length) {
    case 1: return function (a) {
      return fn.call(that, a);
    };
    case 2: return function (a, b) {
      return fn.call(that, a, b);
    };
    case 3: return function (a, b, c) {
      return fn.call(that, a, b, c);
    };
  }
  return function (/* ...args */) {
    return fn.apply(that, arguments);
  };
};

},{"./_a-function":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_a-function.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_defined.js":[function(require,module,exports){
// 7.2.1 RequireObjectCoercible(argument)
module.exports = function (it) {
  if (it == undefined) throw TypeError("Can't call method on  " + it);
  return it;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js":[function(require,module,exports){
// Thank's IE8 for his funny defineProperty
module.exports = !require('./_fails')(function () {
  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
});

},{"./_fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_dom-create.js":[function(require,module,exports){
var isObject = require('./_is-object');
var document = require('./_global').document;
// typeof document.createElement is 'object' in old IE
var is = isObject(document) && isObject(document.createElement);
module.exports = function (it) {
  return is ? document.createElement(it) : {};
};

},{"./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-bug-keys.js":[function(require,module,exports){
// IE 8- don't enum bug keys
module.exports = (
  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
).split(',');

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-keys.js":[function(require,module,exports){
// all enumerable object keys, includes symbols
var getKeys = require('./_object-keys');
var gOPS = require('./_object-gops');
var pIE = require('./_object-pie');
module.exports = function (it) {
  var result = getKeys(it);
  var getSymbols = gOPS.f;
  if (getSymbols) {
    var symbols = getSymbols(it);
    var isEnum = pIE.f;
    var i = 0;
    var key;
    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
  } return result;
};

},{"./_object-gops":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gops.js","./_object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js","./_object-pie":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-pie.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js":[function(require,module,exports){
var global = require('./_global');
var core = require('./_core');
var ctx = require('./_ctx');
var hide = require('./_hide');
var has = require('./_has');
var PROTOTYPE = 'prototype';

var $export = function (type, name, source) {
  var IS_FORCED = type & $export.F;
  var IS_GLOBAL = type & $export.G;
  var IS_STATIC = type & $export.S;
  var IS_PROTO = type & $export.P;
  var IS_BIND = type & $export.B;
  var IS_WRAP = type & $export.W;
  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
  var expProto = exports[PROTOTYPE];
  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
  var key, own, out;
  if (IS_GLOBAL) source = name;
  for (key in source) {
    // contains in native
    own = !IS_FORCED && target && target[key] !== undefined;
    if (own && has(exports, key)) continue;
    // export native or passed
    out = own ? target[key] : source[key];
    // prevent global pollution for namespaces
    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
    // bind timers to global for call from export context
    : IS_BIND && own ? ctx(out, global)
    // wrap global constructors for prevent change them in library
    : IS_WRAP && target[key] == out ? (function (C) {
      var F = function (a, b, c) {
        if (this instanceof C) {
          switch (arguments.length) {
            case 0: return new C();
            case 1: return new C(a);
            case 2: return new C(a, b);
          } return new C(a, b, c);
        } return C.apply(this, arguments);
      };
      F[PROTOTYPE] = C[PROTOTYPE];
      return F;
    // make static versions for prototype methods
    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
    if (IS_PROTO) {
      (exports.virtual || (exports.virtual = {}))[key] = out;
      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
      if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
    }
  }
};
// type bitmap
$export.F = 1;   // forced
$export.G = 2;   // global
$export.S = 4;   // static
$export.P = 8;   // proto
$export.B = 16;  // bind
$export.W = 32;  // wrap
$export.U = 64;  // safe
$export.R = 128; // real proto method for `library`
module.exports = $export;

},{"./_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","./_ctx":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js","./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js","./_hide":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js":[function(require,module,exports){
module.exports = function (exec) {
  try {
    return !!exec();
  } catch (e) {
    return true;
  }
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_for-of.js":[function(require,module,exports){
var ctx = require('./_ctx');
var call = require('./_iter-call');
var isArrayIter = require('./_is-array-iter');
var anObject = require('./_an-object');
var toLength = require('./_to-length');
var getIterFn = require('./core.get-iterator-method');
var BREAK = {};
var RETURN = {};
var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);
  var f = ctx(fn, that, entries ? 2 : 1);
  var index = 0;
  var length, step, iterator, result;
  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
  // fast case for arrays with default iterator
  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
    if (result === BREAK || result === RETURN) return result;
  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
    result = call(iterator, f, step.value, entries);
    if (result === BREAK || result === RETURN) return result;
  }
};
exports.BREAK = BREAK;
exports.RETURN = RETURN;

},{"./_an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js","./_ctx":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js","./_is-array-iter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array-iter.js","./_iter-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-call.js","./_to-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-length.js","./core.get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/core.get-iterator-method.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js":[function(require,module,exports){
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
var global = module.exports = typeof window != 'undefined' && window.Math == Math
  ? window : typeof self != 'undefined' && self.Math == Math ? self
  // eslint-disable-next-line no-new-func
  : Function('return this')();
if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js":[function(require,module,exports){
var hasOwnProperty = {}.hasOwnProperty;
module.exports = function (it, key) {
  return hasOwnProperty.call(it, key);
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js":[function(require,module,exports){
var dP = require('./_object-dp');
var createDesc = require('./_property-desc');
module.exports = require('./_descriptors') ? function (object, key, value) {
  return dP.f(object, key, createDesc(1, value));
} : function (object, key, value) {
  object[key] = value;
  return object;
};

},{"./_descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js","./_object-dp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js","./_property-desc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_html.js":[function(require,module,exports){
var document = require('./_global').document;
module.exports = document && document.documentElement;

},{"./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ie8-dom-define.js":[function(require,module,exports){
module.exports = !require('./_descriptors') && !require('./_fails')(function () {
  return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;
});

},{"./_descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js","./_dom-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_dom-create.js","./_fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_invoke.js":[function(require,module,exports){
// fast apply, http://jsperf.lnkit.com/fast-apply/5
module.exports = function (fn, args, that) {
  var un = that === undefined;
  switch (args.length) {
    case 0: return un ? fn()
                      : fn.call(that);
    case 1: return un ? fn(args[0])
                      : fn.call(that, args[0]);
    case 2: return un ? fn(args[0], args[1])
                      : fn.call(that, args[0], args[1]);
    case 3: return un ? fn(args[0], args[1], args[2])
                      : fn.call(that, args[0], args[1], args[2]);
    case 4: return un ? fn(args[0], args[1], args[2], args[3])
                      : fn.call(that, args[0], args[1], args[2], args[3]);
  } return fn.apply(that, args);
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iobject.js":[function(require,module,exports){
// fallback for non-array-like ES3 and non-enumerable old V8 strings
var cof = require('./_cof');
// eslint-disable-next-line no-prototype-builtins
module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
  return cof(it) == 'String' ? it.split('') : Object(it);
};

},{"./_cof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_cof.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array-iter.js":[function(require,module,exports){
// check on default Array iterator
var Iterators = require('./_iterators');
var ITERATOR = require('./_wks')('iterator');
var ArrayProto = Array.prototype;

module.exports = function (it) {
  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
};

},{"./_iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js","./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array.js":[function(require,module,exports){
// 7.2.2 IsArray(argument)
var cof = require('./_cof');
module.exports = Array.isArray || function isArray(arg) {
  return cof(arg) == 'Array';
};

},{"./_cof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_cof.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js":[function(require,module,exports){
module.exports = function (it) {
  return typeof it === 'object' ? it !== null : typeof it === 'function';
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-call.js":[function(require,module,exports){
// call something on iterator step with safe closing on error
var anObject = require('./_an-object');
module.exports = function (iterator, fn, value, entries) {
  try {
    return entries ? fn(anObject(value)[0], value[1]) : fn(value);
  // 7.4.6 IteratorClose(iterator, completion)
  } catch (e) {
    var ret = iterator['return'];
    if (ret !== undefined) anObject(ret.call(iterator));
    throw e;
  }
};

},{"./_an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-create.js":[function(require,module,exports){
'use strict';
var create = require('./_object-create');
var descriptor = require('./_property-desc');
var setToStringTag = require('./_set-to-string-tag');
var IteratorPrototype = {};

// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
require('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });

module.exports = function (Constructor, NAME, next) {
  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
  setToStringTag(Constructor, NAME + ' Iterator');
};

},{"./_hide":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js","./_object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-create.js","./_property-desc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js","./_set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-to-string-tag.js","./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-define.js":[function(require,module,exports){
'use strict';
var LIBRARY = require('./_library');
var $export = require('./_export');
var redefine = require('./_redefine');
var hide = require('./_hide');
var Iterators = require('./_iterators');
var $iterCreate = require('./_iter-create');
var setToStringTag = require('./_set-to-string-tag');
var getPrototypeOf = require('./_object-gpo');
var ITERATOR = require('./_wks')('iterator');
var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
var FF_ITERATOR = '@@iterator';
var KEYS = 'keys';
var VALUES = 'values';

var returnThis = function () { return this; };

module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
  $iterCreate(Constructor, NAME, next);
  var getMethod = function (kind) {
    if (!BUGGY && kind in proto) return proto[kind];
    switch (kind) {
      case KEYS: return function keys() { return new Constructor(this, kind); };
      case VALUES: return function values() { return new Constructor(this, kind); };
    } return function entries() { return new Constructor(this, kind); };
  };
  var TAG = NAME + ' Iterator';
  var DEF_VALUES = DEFAULT == VALUES;
  var VALUES_BUG = false;
  var proto = Base.prototype;
  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
  var $default = $native || getMethod(DEFAULT);
  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
  var methods, key, IteratorPrototype;
  // Fix native
  if ($anyNative) {
    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
      // Set @@toStringTag to native iterators
      setToStringTag(IteratorPrototype, TAG, true);
      // fix for some old engines
      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
    }
  }
  // fix Array#{values, @@iterator}.name in V8 / FF
  if (DEF_VALUES && $native && $native.name !== VALUES) {
    VALUES_BUG = true;
    $default = function values() { return $native.call(this); };
  }
  // Define iterator
  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
    hide(proto, ITERATOR, $default);
  }
  // Plug for library
  Iterators[NAME] = $default;
  Iterators[TAG] = returnThis;
  if (DEFAULT) {
    methods = {
      values: DEF_VALUES ? $default : getMethod(VALUES),
      keys: IS_SET ? $default : getMethod(KEYS),
      entries: $entries
    };
    if (FORCED) for (key in methods) {
      if (!(key in proto)) redefine(proto, key, methods[key]);
    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
  }
  return methods;
};

},{"./_export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js","./_hide":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js","./_iter-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-create.js","./_iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js","./_library":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js","./_object-gpo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gpo.js","./_redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine.js","./_set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-to-string-tag.js","./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-detect.js":[function(require,module,exports){
var ITERATOR = require('./_wks')('iterator');
var SAFE_CLOSING = false;

try {
  var riter = [7][ITERATOR]();
  riter['return'] = function () { SAFE_CLOSING = true; };
  // eslint-disable-next-line no-throw-literal
  Array.from(riter, function () { throw 2; });
} catch (e) { /* empty */ }

module.exports = function (exec, skipClosing) {
  if (!skipClosing && !SAFE_CLOSING) return false;
  var safe = false;
  try {
    var arr = [7];
    var iter = arr[ITERATOR]();
    iter.next = function () { return { done: safe = true }; };
    arr[ITERATOR] = function () { return iter; };
    exec(arr);
  } catch (e) { /* empty */ }
  return safe;
};

},{"./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-step.js":[function(require,module,exports){
module.exports = function (done, value) {
  return { value: value, done: !!done };
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js":[function(require,module,exports){
module.exports = {};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js":[function(require,module,exports){
module.exports = true;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_meta.js":[function(require,module,exports){
var META = require('./_uid')('meta');
var isObject = require('./_is-object');
var has = require('./_has');
var setDesc = require('./_object-dp').f;
var id = 0;
var isExtensible = Object.isExtensible || function () {
  return true;
};
var FREEZE = !require('./_fails')(function () {
  return isExtensible(Object.preventExtensions({}));
});
var setMeta = function (it) {
  setDesc(it, META, { value: {
    i: 'O' + ++id, // object ID
    w: {}          // weak collections IDs
  } });
};
var fastKey = function (it, create) {
  // return primitive with prefix
  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
  if (!has(it, META)) {
    // can't set metadata to uncaught frozen object
    if (!isExtensible(it)) return 'F';
    // not necessary to add metadata
    if (!create) return 'E';
    // add missing metadata
    setMeta(it);
  // return object ID
  } return it[META].i;
};
var getWeak = function (it, create) {
  if (!has(it, META)) {
    // can't set metadata to uncaught frozen object
    if (!isExtensible(it)) return true;
    // not necessary to add metadata
    if (!create) return false;
    // add missing metadata
    setMeta(it);
  // return hash weak collections IDs
  } return it[META].w;
};
// add metadata on freeze-family methods calling
var onFreeze = function (it) {
  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
  return it;
};
var meta = module.exports = {
  KEY: META,
  NEED: false,
  fastKey: fastKey,
  getWeak: getWeak,
  onFreeze: onFreeze
};

},{"./_fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js","./_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js","./_is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js","./_object-dp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js","./_uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_uid.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_microtask.js":[function(require,module,exports){
var global = require('./_global');
var macrotask = require('./_task').set;
var Observer = global.MutationObserver || global.WebKitMutationObserver;
var process = global.process;
var Promise = global.Promise;
var isNode = require('./_cof')(process) == 'process';

module.exports = function () {
  var head, last, notify;

  var flush = function () {
    var parent, fn;
    if (isNode && (parent = process.domain)) parent.exit();
    while (head) {
      fn = head.fn;
      head = head.next;
      try {
        fn();
      } catch (e) {
        if (head) notify();
        else last = undefined;
        throw e;
      }
    } last = undefined;
    if (parent) parent.enter();
  };

  // Node.js
  if (isNode) {
    notify = function () {
      process.nextTick(flush);
    };
  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
  } else if (Observer && !(global.navigator && global.navigator.standalone)) {
    var toggle = true;
    var node = document.createTextNode('');
    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
    notify = function () {
      node.data = toggle = !toggle;
    };
  // environments with maybe non-completely correct, but existent Promise
  } else if (Promise && Promise.resolve) {
    // Promise.resolve without an argument throws an error in LG WebOS 2
    var promise = Promise.resolve(undefined);
    notify = function () {
      promise.then(flush);
    };
  // for other environments - macrotask based on:
  // - setImmediate
  // - MessageChannel
  // - window.postMessag
  // - onreadystatechange
  // - setTimeout
  } else {
    notify = function () {
      // strange IE + webpack dev server bug - use .call(global)
      macrotask.call(global, flush);
    };
  }

  return function (fn) {
    var task = { fn: fn, next: undefined };
    if (last) last.next = task;
    if (!head) {
      head = task;
      notify();
    } last = task;
  };
};

},{"./_cof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_cof.js","./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_task":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_task.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_new-promise-capability.js":[function(require,module,exports){
'use strict';
// 25.4.1.5 NewPromiseCapability(C)
var aFunction = require('./_a-function');

function PromiseCapability(C) {
  var resolve, reject;
  this.promise = new C(function ($$resolve, $$reject) {
    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
    resolve = $$resolve;
    reject = $$reject;
  });
  this.resolve = aFunction(resolve);
  this.reject = aFunction(reject);
}

module.exports.f = function (C) {
  return new PromiseCapability(C);
};

},{"./_a-function":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_a-function.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-create.js":[function(require,module,exports){
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
var anObject = require('./_an-object');
var dPs = require('./_object-dps');
var enumBugKeys = require('./_enum-bug-keys');
var IE_PROTO = require('./_shared-key')('IE_PROTO');
var Empty = function () { /* empty */ };
var PROTOTYPE = 'prototype';

// Create object with fake `null` prototype: use iframe Object with cleared prototype
var createDict = function () {
  // Thrash, waste and sodomy: IE GC bug
  var iframe = require('./_dom-create')('iframe');
  var i = enumBugKeys.length;
  var lt = '<';
  var gt = '>';
  var iframeDocument;
  iframe.style.display = 'none';
  require('./_html').appendChild(iframe);
  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
  // createDict = iframe.contentWindow.Object;
  // html.removeChild(iframe);
  iframeDocument = iframe.contentWindow.document;
  iframeDocument.open();
  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
  iframeDocument.close();
  createDict = iframeDocument.F;
  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
  return createDict();
};

module.exports = Object.create || function create(O, Properties) {
  var result;
  if (O !== null) {
    Empty[PROTOTYPE] = anObject(O);
    result = new Empty();
    Empty[PROTOTYPE] = null;
    // add "__proto__" for Object.getPrototypeOf polyfill
    result[IE_PROTO] = O;
  } else result = createDict();
  return Properties === undefined ? result : dPs(result, Properties);
};

},{"./_an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js","./_dom-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_dom-create.js","./_enum-bug-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-bug-keys.js","./_html":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_html.js","./_object-dps":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dps.js","./_shared-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared-key.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js":[function(require,module,exports){
var anObject = require('./_an-object');
var IE8_DOM_DEFINE = require('./_ie8-dom-define');
var toPrimitive = require('./_to-primitive');
var dP = Object.defineProperty;

exports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {
  anObject(O);
  P = toPrimitive(P, true);
  anObject(Attributes);
  if (IE8_DOM_DEFINE) try {
    return dP(O, P, Attributes);
  } catch (e) { /* empty */ }
  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
  if ('value' in Attributes) O[P] = Attributes.value;
  return O;
};

},{"./_an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js","./_descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js","./_ie8-dom-define":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ie8-dom-define.js","./_to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-primitive.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dps.js":[function(require,module,exports){
var dP = require('./_object-dp');
var anObject = require('./_an-object');
var getKeys = require('./_object-keys');

module.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {
  anObject(O);
  var keys = getKeys(Properties);
  var length = keys.length;
  var i = 0;
  var P;
  while (length > i) dP.f(O, P = keys[i++], Properties[P]);
  return O;
};

},{"./_an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js","./_descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js","./_object-dp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js","./_object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopd.js":[function(require,module,exports){
var pIE = require('./_object-pie');
var createDesc = require('./_property-desc');
var toIObject = require('./_to-iobject');
var toPrimitive = require('./_to-primitive');
var has = require('./_has');
var IE8_DOM_DEFINE = require('./_ie8-dom-define');
var gOPD = Object.getOwnPropertyDescriptor;

exports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {
  O = toIObject(O);
  P = toPrimitive(P, true);
  if (IE8_DOM_DEFINE) try {
    return gOPD(O, P);
  } catch (e) { /* empty */ }
  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
};

},{"./_descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js","./_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js","./_ie8-dom-define":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ie8-dom-define.js","./_object-pie":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-pie.js","./_property-desc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js","./_to-iobject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js","./_to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-primitive.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn-ext.js":[function(require,module,exports){
// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
var toIObject = require('./_to-iobject');
var gOPN = require('./_object-gopn').f;
var toString = {}.toString;

var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
  ? Object.getOwnPropertyNames(window) : [];

var getWindowNames = function (it) {
  try {
    return gOPN(it);
  } catch (e) {
    return windowNames.slice();
  }
};

module.exports.f = function getOwnPropertyNames(it) {
  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
};

},{"./_object-gopn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn.js","./_to-iobject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn.js":[function(require,module,exports){
// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
var $keys = require('./_object-keys-internal');
var hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');

exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
  return $keys(O, hiddenKeys);
};

},{"./_enum-bug-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-bug-keys.js","./_object-keys-internal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys-internal.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gops.js":[function(require,module,exports){
exports.f = Object.getOwnPropertySymbols;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gpo.js":[function(require,module,exports){
// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
var has = require('./_has');
var toObject = require('./_to-object');
var IE_PROTO = require('./_shared-key')('IE_PROTO');
var ObjectProto = Object.prototype;

module.exports = Object.getPrototypeOf || function (O) {
  O = toObject(O);
  if (has(O, IE_PROTO)) return O[IE_PROTO];
  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
    return O.constructor.prototype;
  } return O instanceof Object ? ObjectProto : null;
};

},{"./_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js","./_shared-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared-key.js","./_to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys-internal.js":[function(require,module,exports){
var has = require('./_has');
var toIObject = require('./_to-iobject');
var arrayIndexOf = require('./_array-includes')(false);
var IE_PROTO = require('./_shared-key')('IE_PROTO');

module.exports = function (object, names) {
  var O = toIObject(object);
  var i = 0;
  var result = [];
  var key;
  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
  // Don't enum bug & hidden keys
  while (names.length > i) if (has(O, key = names[i++])) {
    ~arrayIndexOf(result, key) || result.push(key);
  }
  return result;
};

},{"./_array-includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_array-includes.js","./_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js","./_shared-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared-key.js","./_to-iobject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js":[function(require,module,exports){
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
var $keys = require('./_object-keys-internal');
var enumBugKeys = require('./_enum-bug-keys');

module.exports = Object.keys || function keys(O) {
  return $keys(O, enumBugKeys);
};

},{"./_enum-bug-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-bug-keys.js","./_object-keys-internal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys-internal.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-pie.js":[function(require,module,exports){
exports.f = {}.propertyIsEnumerable;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-sap.js":[function(require,module,exports){
// most Object methods by ES6 should accept primitives
var $export = require('./_export');
var core = require('./_core');
var fails = require('./_fails');
module.exports = function (KEY, exec) {
  var fn = (core.Object || {})[KEY] || Object[KEY];
  var exp = {};
  exp[KEY] = exec(fn);
  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);
};

},{"./_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","./_export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js","./_fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_perform.js":[function(require,module,exports){
module.exports = function (exec) {
  try {
    return { e: false, v: exec() };
  } catch (e) {
    return { e: true, v: e };
  }
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_promise-resolve.js":[function(require,module,exports){
var anObject = require('./_an-object');
var isObject = require('./_is-object');
var newPromiseCapability = require('./_new-promise-capability');

module.exports = function (C, x) {
  anObject(C);
  if (isObject(x) && x.constructor === C) return x;
  var promiseCapability = newPromiseCapability.f(C);
  var resolve = promiseCapability.resolve;
  resolve(x);
  return promiseCapability.promise;
};

},{"./_an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js","./_is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js","./_new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_new-promise-capability.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js":[function(require,module,exports){
module.exports = function (bitmap, value) {
  return {
    enumerable: !(bitmap & 1),
    configurable: !(bitmap & 2),
    writable: !(bitmap & 4),
    value: value
  };
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine-all.js":[function(require,module,exports){
var hide = require('./_hide');
module.exports = function (target, src, safe) {
  for (var key in src) {
    if (safe && target[key]) target[key] = src[key];
    else hide(target, key, src[key]);
  } return target;
};

},{"./_hide":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine.js":[function(require,module,exports){
module.exports = require('./_hide');

},{"./_hide":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-species.js":[function(require,module,exports){
'use strict';
var global = require('./_global');
var core = require('./_core');
var dP = require('./_object-dp');
var DESCRIPTORS = require('./_descriptors');
var SPECIES = require('./_wks')('species');

module.exports = function (KEY) {
  var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];
  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {
    configurable: true,
    get: function () { return this; }
  });
};

},{"./_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","./_descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js","./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_object-dp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js","./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-to-string-tag.js":[function(require,module,exports){
var def = require('./_object-dp').f;
var has = require('./_has');
var TAG = require('./_wks')('toStringTag');

module.exports = function (it, tag, stat) {
  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
};

},{"./_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js","./_object-dp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js","./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared-key.js":[function(require,module,exports){
var shared = require('./_shared')('keys');
var uid = require('./_uid');
module.exports = function (key) {
  return shared[key] || (shared[key] = uid(key));
};

},{"./_shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared.js","./_uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_uid.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared.js":[function(require,module,exports){
var core = require('./_core');
var global = require('./_global');
var SHARED = '__core-js_shared__';
var store = global[SHARED] || (global[SHARED] = {});

(module.exports = function (key, value) {
  return store[key] || (store[key] = value !== undefined ? value : {});
})('versions', []).push({
  version: core.version,
  mode: require('./_library') ? 'pure' : 'global',
  copyright: '© 2020 Denis Pushkarev (zloirock.ru)'
});

},{"./_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_library":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_species-constructor.js":[function(require,module,exports){
// 7.3.20 SpeciesConstructor(O, defaultConstructor)
var anObject = require('./_an-object');
var aFunction = require('./_a-function');
var SPECIES = require('./_wks')('species');
module.exports = function (O, D) {
  var C = anObject(O).constructor;
  var S;
  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
};

},{"./_a-function":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_a-function.js","./_an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js","./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-at.js":[function(require,module,exports){
var toInteger = require('./_to-integer');
var defined = require('./_defined');
// true  -> String#at
// false -> String#codePointAt
module.exports = function (TO_STRING) {
  return function (that, pos) {
    var s = String(defined(that));
    var i = toInteger(pos);
    var l = s.length;
    var a, b;
    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
    a = s.charCodeAt(i);
    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
      ? TO_STRING ? s.charAt(i) : a
      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
  };
};

},{"./_defined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_defined.js","./_to-integer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-integer.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_task.js":[function(require,module,exports){
var ctx = require('./_ctx');
var invoke = require('./_invoke');
var html = require('./_html');
var cel = require('./_dom-create');
var global = require('./_global');
var process = global.process;
var setTask = global.setImmediate;
var clearTask = global.clearImmediate;
var MessageChannel = global.MessageChannel;
var Dispatch = global.Dispatch;
var counter = 0;
var queue = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
var defer, channel, port;
var run = function () {
  var id = +this;
  // eslint-disable-next-line no-prototype-builtins
  if (queue.hasOwnProperty(id)) {
    var fn = queue[id];
    delete queue[id];
    fn();
  }
};
var listener = function (event) {
  run.call(event.data);
};
// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
if (!setTask || !clearTask) {
  setTask = function setImmediate(fn) {
    var args = [];
    var i = 1;
    while (arguments.length > i) args.push(arguments[i++]);
    queue[++counter] = function () {
      // eslint-disable-next-line no-new-func
      invoke(typeof fn == 'function' ? fn : Function(fn), args);
    };
    defer(counter);
    return counter;
  };
  clearTask = function clearImmediate(id) {
    delete queue[id];
  };
  // Node.js 0.8-
  if (require('./_cof')(process) == 'process') {
    defer = function (id) {
      process.nextTick(ctx(run, id, 1));
    };
  // Sphere (JS game engine) Dispatch API
  } else if (Dispatch && Dispatch.now) {
    defer = function (id) {
      Dispatch.now(ctx(run, id, 1));
    };
  // Browsers with MessageChannel, includes WebWorkers
  } else if (MessageChannel) {
    channel = new MessageChannel();
    port = channel.port2;
    channel.port1.onmessage = listener;
    defer = ctx(port.postMessage, port, 1);
  // Browsers with postMessage, skip WebWorkers
  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {
    defer = function (id) {
      global.postMessage(id + '', '*');
    };
    global.addEventListener('message', listener, false);
  // IE8-
  } else if (ONREADYSTATECHANGE in cel('script')) {
    defer = function (id) {
      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
        html.removeChild(this);
        run.call(id);
      };
    };
  // Rest old browsers
  } else {
    defer = function (id) {
      setTimeout(ctx(run, id, 1), 0);
    };
  }
}
module.exports = {
  set: setTask,
  clear: clearTask
};

},{"./_cof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_cof.js","./_ctx":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js","./_dom-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_dom-create.js","./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_html":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_html.js","./_invoke":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_invoke.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-absolute-index.js":[function(require,module,exports){
var toInteger = require('./_to-integer');
var max = Math.max;
var min = Math.min;
module.exports = function (index, length) {
  index = toInteger(index);
  return index < 0 ? max(index + length, 0) : min(index, length);
};

},{"./_to-integer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-integer.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-integer.js":[function(require,module,exports){
// 7.1.4 ToInteger
var ceil = Math.ceil;
var floor = Math.floor;
module.exports = function (it) {
  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js":[function(require,module,exports){
// to indexed object, toObject with fallback for non-array-like ES3 strings
var IObject = require('./_iobject');
var defined = require('./_defined');
module.exports = function (it) {
  return IObject(defined(it));
};

},{"./_defined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_defined.js","./_iobject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iobject.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-length.js":[function(require,module,exports){
// 7.1.15 ToLength
var toInteger = require('./_to-integer');
var min = Math.min;
module.exports = function (it) {
  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
};

},{"./_to-integer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-integer.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js":[function(require,module,exports){
// 7.1.13 ToObject(argument)
var defined = require('./_defined');
module.exports = function (it) {
  return Object(defined(it));
};

},{"./_defined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_defined.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-primitive.js":[function(require,module,exports){
// 7.1.1 ToPrimitive(input [, PreferredType])
var isObject = require('./_is-object');
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
// and the second argument - flag - preferred type is a string
module.exports = function (it, S) {
  if (!isObject(it)) return it;
  var fn, val;
  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
  throw TypeError("Can't convert object to primitive value");
};

},{"./_is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_uid.js":[function(require,module,exports){
var id = 0;
var px = Math.random();
module.exports = function (key) {
  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_user-agent.js":[function(require,module,exports){
var global = require('./_global');
var navigator = global.navigator;

module.exports = navigator && navigator.userAgent || '';

},{"./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-define.js":[function(require,module,exports){
var global = require('./_global');
var core = require('./_core');
var LIBRARY = require('./_library');
var wksExt = require('./_wks-ext');
var defineProperty = require('./_object-dp').f;
module.exports = function (name) {
  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
};

},{"./_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_library":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js","./_object-dp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js","./_wks-ext":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-ext.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-ext.js":[function(require,module,exports){
exports.f = require('./_wks');

},{"./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js":[function(require,module,exports){
var store = require('./_shared')('wks');
var uid = require('./_uid');
var Symbol = require('./_global').Symbol;
var USE_SYMBOL = typeof Symbol == 'function';

var $exports = module.exports = function (name) {
  return store[name] || (store[name] =
    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
};

$exports.store = store;

},{"./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared.js","./_uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_uid.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/core.get-iterator-method.js":[function(require,module,exports){
var classof = require('./_classof');
var ITERATOR = require('./_wks')('iterator');
var Iterators = require('./_iterators');
module.exports = require('./_core').getIteratorMethod = function (it) {
  if (it != undefined) return it[ITERATOR]
    || it['@@iterator']
    || Iterators[classof(it)];
};

},{"./_classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_classof.js","./_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","./_iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js","./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/core.get-iterator.js":[function(require,module,exports){
var anObject = require('./_an-object');
var get = require('./core.get-iterator-method');
module.exports = require('./_core').getIterator = function (it) {
  var iterFn = get(it);
  if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!');
  return anObject(iterFn.call(it));
};

},{"./_an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js","./_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","./core.get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/core.get-iterator-method.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.is-array.js":[function(require,module,exports){
// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)
var $export = require('./_export');

$export($export.S, 'Array', { isArray: require('./_is-array') });

},{"./_export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js","./_is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.iterator.js":[function(require,module,exports){
'use strict';
var addToUnscopables = require('./_add-to-unscopables');
var step = require('./_iter-step');
var Iterators = require('./_iterators');
var toIObject = require('./_to-iobject');

// 22.1.3.4 Array.prototype.entries()
// 22.1.3.13 Array.prototype.keys()
// 22.1.3.29 Array.prototype.values()
// 22.1.3.30 Array.prototype[@@iterator]()
module.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {
  this._t = toIObject(iterated); // target
  this._i = 0;                   // next index
  this._k = kind;                // kind
// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
}, function () {
  var O = this._t;
  var kind = this._k;
  var index = this._i++;
  if (!O || index >= O.length) {
    this._t = undefined;
    return step(1);
  }
  if (kind == 'keys') return step(0, index);
  if (kind == 'values') return step(0, O[index]);
  return step(0, [index, O[index]]);
}, 'values');

// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
Iterators.Arguments = Iterators.Array;

addToUnscopables('keys');
addToUnscopables('values');
addToUnscopables('entries');

},{"./_add-to-unscopables":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_add-to-unscopables.js","./_iter-define":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-define.js","./_iter-step":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-step.js","./_iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js","./_to-iobject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.define-property.js":[function(require,module,exports){
var $export = require('./_export');
// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperty: require('./_object-dp').f });

},{"./_descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js","./_export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js","./_object-dp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.keys.js":[function(require,module,exports){
// 19.1.2.14 Object.keys(O)
var toObject = require('./_to-object');
var $keys = require('./_object-keys');

require('./_object-sap')('keys', function () {
  return function keys(it) {
    return $keys(toObject(it));
  };
});

},{"./_object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js","./_object-sap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-sap.js","./_to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.to-string.js":[function(require,module,exports){

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.promise.js":[function(require,module,exports){
'use strict';
var LIBRARY = require('./_library');
var global = require('./_global');
var ctx = require('./_ctx');
var classof = require('./_classof');
var $export = require('./_export');
var isObject = require('./_is-object');
var aFunction = require('./_a-function');
var anInstance = require('./_an-instance');
var forOf = require('./_for-of');
var speciesConstructor = require('./_species-constructor');
var task = require('./_task').set;
var microtask = require('./_microtask')();
var newPromiseCapabilityModule = require('./_new-promise-capability');
var perform = require('./_perform');
var userAgent = require('./_user-agent');
var promiseResolve = require('./_promise-resolve');
var PROMISE = 'Promise';
var TypeError = global.TypeError;
var process = global.process;
var versions = process && process.versions;
var v8 = versions && versions.v8 || '';
var $Promise = global[PROMISE];
var isNode = classof(process) == 'process';
var empty = function () { /* empty */ };
var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;

var USE_NATIVE = !!function () {
  try {
    // correct subclassing with @@species support
    var promise = $Promise.resolve(1);
    var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {
      exec(empty, empty);
    };
    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test
    return (isNode || typeof PromiseRejectionEvent == 'function')
      && promise.then(empty) instanceof FakePromise
      // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
      // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
      // we can't detect it synchronously, so just check versions
      && v8.indexOf('6.6') !== 0
      && userAgent.indexOf('Chrome/66') === -1;
  } catch (e) { /* empty */ }
}();

// helpers
var isThenable = function (it) {
  var then;
  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
};
var notify = function (promise, isReject) {
  if (promise._n) return;
  promise._n = true;
  var chain = promise._c;
  microtask(function () {
    var value = promise._v;
    var ok = promise._s == 1;
    var i = 0;
    var run = function (reaction) {
      var handler = ok ? reaction.ok : reaction.fail;
      var resolve = reaction.resolve;
      var reject = reaction.reject;
      var domain = reaction.domain;
      var result, then, exited;
      try {
        if (handler) {
          if (!ok) {
            if (promise._h == 2) onHandleUnhandled(promise);
            promise._h = 1;
          }
          if (handler === true) result = value;
          else {
            if (domain) domain.enter();
            result = handler(value); // may throw
            if (domain) {
              domain.exit();
              exited = true;
            }
          }
          if (result === reaction.promise) {
            reject(TypeError('Promise-chain cycle'));
          } else if (then = isThenable(result)) {
            then.call(result, resolve, reject);
          } else resolve(result);
        } else reject(value);
      } catch (e) {
        if (domain && !exited) domain.exit();
        reject(e);
      }
    };
    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach
    promise._c = [];
    promise._n = false;
    if (isReject && !promise._h) onUnhandled(promise);
  });
};
var onUnhandled = function (promise) {
  task.call(global, function () {
    var value = promise._v;
    var unhandled = isUnhandled(promise);
    var result, handler, console;
    if (unhandled) {
      result = perform(function () {
        if (isNode) {
          process.emit('unhandledRejection', value, promise);
        } else if (handler = global.onunhandledrejection) {
          handler({ promise: promise, reason: value });
        } else if ((console = global.console) && console.error) {
          console.error('Unhandled promise rejection', value);
        }
      });
      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
      promise._h = isNode || isUnhandled(promise) ? 2 : 1;
    } promise._a = undefined;
    if (unhandled && result.e) throw result.v;
  });
};
var isUnhandled = function (promise) {
  return promise._h !== 1 && (promise._a || promise._c).length === 0;
};
var onHandleUnhandled = function (promise) {
  task.call(global, function () {
    var handler;
    if (isNode) {
      process.emit('rejectionHandled', promise);
    } else if (handler = global.onrejectionhandled) {
      handler({ promise: promise, reason: promise._v });
    }
  });
};
var $reject = function (value) {
  var promise = this;
  if (promise._d) return;
  promise._d = true;
  promise = promise._w || promise; // unwrap
  promise._v = value;
  promise._s = 2;
  if (!promise._a) promise._a = promise._c.slice();
  notify(promise, true);
};
var $resolve = function (value) {
  var promise = this;
  var then;
  if (promise._d) return;
  promise._d = true;
  promise = promise._w || promise; // unwrap
  try {
    if (promise === value) throw TypeError("Promise can't be resolved itself");
    if (then = isThenable(value)) {
      microtask(function () {
        var wrapper = { _w: promise, _d: false }; // wrap
        try {
          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
        } catch (e) {
          $reject.call(wrapper, e);
        }
      });
    } else {
      promise._v = value;
      promise._s = 1;
      notify(promise, false);
    }
  } catch (e) {
    $reject.call({ _w: promise, _d: false }, e); // wrap
  }
};

// constructor polyfill
if (!USE_NATIVE) {
  // 25.4.3.1 Promise(executor)
  $Promise = function Promise(executor) {
    anInstance(this, $Promise, PROMISE, '_h');
    aFunction(executor);
    Internal.call(this);
    try {
      executor(ctx($resolve, this, 1), ctx($reject, this, 1));
    } catch (err) {
      $reject.call(this, err);
    }
  };
  // eslint-disable-next-line no-unused-vars
  Internal = function Promise(executor) {
    this._c = [];             // <- awaiting reactions
    this._a = undefined;      // <- checked in isUnhandled reactions
    this._s = 0;              // <- state
    this._d = false;          // <- done
    this._v = undefined;      // <- value
    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
    this._n = false;          // <- notify
  };
  Internal.prototype = require('./_redefine-all')($Promise.prototype, {
    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
    then: function then(onFulfilled, onRejected) {
      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
      reaction.fail = typeof onRejected == 'function' && onRejected;
      reaction.domain = isNode ? process.domain : undefined;
      this._c.push(reaction);
      if (this._a) this._a.push(reaction);
      if (this._s) notify(this, false);
      return reaction.promise;
    },
    // 25.4.5.1 Promise.prototype.catch(onRejected)
    'catch': function (onRejected) {
      return this.then(undefined, onRejected);
    }
  });
  OwnPromiseCapability = function () {
    var promise = new Internal();
    this.promise = promise;
    this.resolve = ctx($resolve, promise, 1);
    this.reject = ctx($reject, promise, 1);
  };
  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {
    return C === $Promise || C === Wrapper
      ? new OwnPromiseCapability(C)
      : newGenericPromiseCapability(C);
  };
}

$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });
require('./_set-to-string-tag')($Promise, PROMISE);
require('./_set-species')(PROMISE);
Wrapper = require('./_core')[PROMISE];

// statics
$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
  // 25.4.4.5 Promise.reject(r)
  reject: function reject(r) {
    var capability = newPromiseCapability(this);
    var $$reject = capability.reject;
    $$reject(r);
    return capability.promise;
  }
});
$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
  // 25.4.4.6 Promise.resolve(x)
  resolve: function resolve(x) {
    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);
  }
});
$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {
  $Promise.all(iter)['catch'](empty);
})), PROMISE, {
  // 25.4.4.1 Promise.all(iterable)
  all: function all(iterable) {
    var C = this;
    var capability = newPromiseCapability(C);
    var resolve = capability.resolve;
    var reject = capability.reject;
    var result = perform(function () {
      var values = [];
      var index = 0;
      var remaining = 1;
      forOf(iterable, false, function (promise) {
        var $index = index++;
        var alreadyCalled = false;
        values.push(undefined);
        remaining++;
        C.resolve(promise).then(function (value) {
          if (alreadyCalled) return;
          alreadyCalled = true;
          values[$index] = value;
          --remaining || resolve(values);
        }, reject);
      });
      --remaining || resolve(values);
    });
    if (result.e) reject(result.v);
    return capability.promise;
  },
  // 25.4.4.4 Promise.race(iterable)
  race: function race(iterable) {
    var C = this;
    var capability = newPromiseCapability(C);
    var reject = capability.reject;
    var result = perform(function () {
      forOf(iterable, false, function (promise) {
        C.resolve(promise).then(capability.resolve, reject);
      });
    });
    if (result.e) reject(result.v);
    return capability.promise;
  }
});

},{"./_a-function":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_a-function.js","./_an-instance":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-instance.js","./_classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_classof.js","./_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","./_ctx":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_ctx.js","./_export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js","./_for-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_for-of.js","./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js","./_iter-detect":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-detect.js","./_library":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js","./_microtask":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_microtask.js","./_new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_new-promise-capability.js","./_perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_perform.js","./_promise-resolve":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_promise-resolve.js","./_redefine-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine-all.js","./_set-species":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-species.js","./_set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-to-string-tag.js","./_species-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_species-constructor.js","./_task":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_task.js","./_user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_user-agent.js","./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.string.iterator.js":[function(require,module,exports){
'use strict';
var $at = require('./_string-at')(true);

// 21.1.3.27 String.prototype[@@iterator]()
require('./_iter-define')(String, 'String', function (iterated) {
  this._t = String(iterated); // target
  this._i = 0;                // next index
// 21.1.5.2.1 %StringIteratorPrototype%.next()
}, function () {
  var O = this._t;
  var index = this._i;
  var point;
  if (index >= O.length) return { value: undefined, done: true };
  point = $at(O, index);
  this._i += point.length;
  return { value: point, done: false };
});

},{"./_iter-define":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iter-define.js","./_string-at":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_string-at.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.symbol.js":[function(require,module,exports){
'use strict';
// ECMAScript 6 symbols shim
var global = require('./_global');
var has = require('./_has');
var DESCRIPTORS = require('./_descriptors');
var $export = require('./_export');
var redefine = require('./_redefine');
var META = require('./_meta').KEY;
var $fails = require('./_fails');
var shared = require('./_shared');
var setToStringTag = require('./_set-to-string-tag');
var uid = require('./_uid');
var wks = require('./_wks');
var wksExt = require('./_wks-ext');
var wksDefine = require('./_wks-define');
var enumKeys = require('./_enum-keys');
var isArray = require('./_is-array');
var anObject = require('./_an-object');
var isObject = require('./_is-object');
var toObject = require('./_to-object');
var toIObject = require('./_to-iobject');
var toPrimitive = require('./_to-primitive');
var createDesc = require('./_property-desc');
var _create = require('./_object-create');
var gOPNExt = require('./_object-gopn-ext');
var $GOPD = require('./_object-gopd');
var $GOPS = require('./_object-gops');
var $DP = require('./_object-dp');
var $keys = require('./_object-keys');
var gOPD = $GOPD.f;
var dP = $DP.f;
var gOPN = gOPNExt.f;
var $Symbol = global.Symbol;
var $JSON = global.JSON;
var _stringify = $JSON && $JSON.stringify;
var PROTOTYPE = 'prototype';
var HIDDEN = wks('_hidden');
var TO_PRIMITIVE = wks('toPrimitive');
var isEnum = {}.propertyIsEnumerable;
var SymbolRegistry = shared('symbol-registry');
var AllSymbols = shared('symbols');
var OPSymbols = shared('op-symbols');
var ObjectProto = Object[PROTOTYPE];
var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f;
var QObject = global.QObject;
// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;

// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
var setSymbolDesc = DESCRIPTORS && $fails(function () {
  return _create(dP({}, 'a', {
    get: function () { return dP(this, 'a', { value: 7 }).a; }
  })).a != 7;
}) ? function (it, key, D) {
  var protoDesc = gOPD(ObjectProto, key);
  if (protoDesc) delete ObjectProto[key];
  dP(it, key, D);
  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
} : dP;

var wrap = function (tag) {
  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
  sym._k = tag;
  return sym;
};

var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
  return typeof it == 'symbol';
} : function (it) {
  return it instanceof $Symbol;
};

var $defineProperty = function defineProperty(it, key, D) {
  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
  anObject(it);
  key = toPrimitive(key, true);
  anObject(D);
  if (has(AllSymbols, key)) {
    if (!D.enumerable) {
      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
      it[HIDDEN][key] = true;
    } else {
      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
      D = _create(D, { enumerable: createDesc(0, false) });
    } return setSymbolDesc(it, key, D);
  } return dP(it, key, D);
};
var $defineProperties = function defineProperties(it, P) {
  anObject(it);
  var keys = enumKeys(P = toIObject(P));
  var i = 0;
  var l = keys.length;
  var key;
  while (l > i) $defineProperty(it, key = keys[i++], P[key]);
  return it;
};
var $create = function create(it, P) {
  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
};
var $propertyIsEnumerable = function propertyIsEnumerable(key) {
  var E = isEnum.call(this, key = toPrimitive(key, true));
  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
};
var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
  it = toIObject(it);
  key = toPrimitive(key, true);
  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
  var D = gOPD(it, key);
  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
  return D;
};
var $getOwnPropertyNames = function getOwnPropertyNames(it) {
  var names = gOPN(toIObject(it));
  var result = [];
  var i = 0;
  var key;
  while (names.length > i) {
    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
  } return result;
};
var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
  var IS_OP = it === ObjectProto;
  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
  var result = [];
  var i = 0;
  var key;
  while (names.length > i) {
    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
  } return result;
};

// 19.4.1.1 Symbol([description])
if (!USE_NATIVE) {
  $Symbol = function Symbol() {
    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
    var $set = function (value) {
      if (this === ObjectProto) $set.call(OPSymbols, value);
      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
      setSymbolDesc(this, tag, createDesc(1, value));
    };
    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
    return wrap(tag);
  };
  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
    return this._k;
  });

  $GOPD.f = $getOwnPropertyDescriptor;
  $DP.f = $defineProperty;
  require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;
  require('./_object-pie').f = $propertyIsEnumerable;
  $GOPS.f = $getOwnPropertySymbols;

  if (DESCRIPTORS && !require('./_library')) {
    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
  }

  wksExt.f = function (name) {
    return wrap(wks(name));
  };
}

$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });

for (var es6Symbols = (
  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);

for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);

$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
  // 19.4.2.1 Symbol.for(key)
  'for': function (key) {
    return has(SymbolRegistry, key += '')
      ? SymbolRegistry[key]
      : SymbolRegistry[key] = $Symbol(key);
  },
  // 19.4.2.5 Symbol.keyFor(sym)
  keyFor: function keyFor(sym) {
    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
  },
  useSetter: function () { setter = true; },
  useSimple: function () { setter = false; }
});

$export($export.S + $export.F * !USE_NATIVE, 'Object', {
  // 19.1.2.2 Object.create(O [, Properties])
  create: $create,
  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
  defineProperty: $defineProperty,
  // 19.1.2.3 Object.defineProperties(O, Properties)
  defineProperties: $defineProperties,
  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
  // 19.1.2.7 Object.getOwnPropertyNames(O)
  getOwnPropertyNames: $getOwnPropertyNames,
  // 19.1.2.8 Object.getOwnPropertySymbols(O)
  getOwnPropertySymbols: $getOwnPropertySymbols
});

// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
// https://bugs.chromium.org/p/v8/issues/detail?id=3443
var FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); });

$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', {
  getOwnPropertySymbols: function getOwnPropertySymbols(it) {
    return $GOPS.f(toObject(it));
  }
});

// 24.3.2 JSON.stringify(value [, replacer [, space]])
$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
  var S = $Symbol();
  // MS Edge converts symbol values to JSON as {}
  // WebKit converts symbol values to JSON as null
  // V8 throws on boxed symbols
  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
})), 'JSON', {
  stringify: function stringify(it) {
    var args = [it];
    var i = 1;
    var replacer, $replacer;
    while (arguments.length > i) args.push(arguments[i++]);
    $replacer = replacer = args[1];
    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
    if (!isArray(replacer)) replacer = function (key, value) {
      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
      if (!isSymbol(value)) return value;
    };
    args[1] = replacer;
    return _stringify.apply($JSON, args);
  }
});

// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
// 19.4.3.5 Symbol.prototype[@@toStringTag]
setToStringTag($Symbol, 'Symbol');
// 20.2.1.9 Math[@@toStringTag]
setToStringTag(Math, 'Math', true);
// 24.3.3 JSON[@@toStringTag]
setToStringTag(global.JSON, 'JSON', true);

},{"./_an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_an-object.js","./_descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_descriptors.js","./_enum-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_enum-keys.js","./_export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js","./_fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_fails.js","./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_has.js","./_hide":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js","./_is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-array.js","./_is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_is-object.js","./_library":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js","./_meta":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_meta.js","./_object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-create.js","./_object-dp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-dp.js","./_object-gopd":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopd.js","./_object-gopn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn.js","./_object-gopn-ext":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gopn-ext.js","./_object-gops":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-gops.js","./_object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-keys.js","./_object-pie":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_object-pie.js","./_property-desc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js","./_redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_redefine.js","./_set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_set-to-string-tag.js","./_shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_shared.js","./_to-iobject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-iobject.js","./_to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-object.js","./_to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_to-primitive.js","./_uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_uid.js","./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js","./_wks-define":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-define.js","./_wks-ext":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-ext.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.promise.finally.js":[function(require,module,exports){
// https://github.com/tc39/proposal-promise-finally
'use strict';
var $export = require('./_export');
var core = require('./_core');
var global = require('./_global');
var speciesConstructor = require('./_species-constructor');
var promiseResolve = require('./_promise-resolve');

$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {
  var C = speciesConstructor(this, core.Promise || global.Promise);
  var isFunction = typeof onFinally == 'function';
  return this.then(
    isFunction ? function (x) {
      return promiseResolve(C, onFinally()).then(function () { return x; });
    } : onFinally,
    isFunction ? function (e) {
      return promiseResolve(C, onFinally()).then(function () { throw e; });
    } : onFinally
  );
} });

},{"./_core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_core.js","./_export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js","./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_promise-resolve":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_promise-resolve.js","./_species-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_species-constructor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.promise.try.js":[function(require,module,exports){
'use strict';
// https://github.com/tc39/proposal-promise-try
var $export = require('./_export');
var newPromiseCapability = require('./_new-promise-capability');
var perform = require('./_perform');

$export($export.S, 'Promise', { 'try': function (callbackfn) {
  var promiseCapability = newPromiseCapability.f(this);
  var result = perform(callbackfn);
  (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);
  return promiseCapability.promise;
} });

},{"./_export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_export.js","./_new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_new-promise-capability.js","./_perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_perform.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.symbol.async-iterator.js":[function(require,module,exports){
require('./_wks-define')('asyncIterator');

},{"./_wks-define":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-define.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es7.symbol.observable.js":[function(require,module,exports){
require('./_wks-define')('observable');

},{"./_wks-define":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks-define.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/web.dom.iterable.js":[function(require,module,exports){
require('./es6.array.iterator');
var global = require('./_global');
var hide = require('./_hide');
var Iterators = require('./_iterators');
var TO_STRING_TAG = require('./_wks')('toStringTag');

var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
  'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
  'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
  'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
  'TextTrackList,TouchList').split(',');

for (var i = 0; i < DOMIterables.length; i++) {
  var NAME = DOMIterables[i];
  var Collection = global[NAME];
  var proto = Collection && Collection.prototype;
  if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
  Iterators[NAME] = Iterators.Array;
}

},{"./_global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_global.js","./_hide":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_hide.js","./_iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js","./_wks":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_wks.js","./es6.array.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.array.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/array/from");
},{"core-js-pure/stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/from.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/array/is-array");
},{"core-js-pure/stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/date/now.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/date/now");
},{"core-js-pure/stable/date/now":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/date/now.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/bind");
},{"core-js-pure/stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/bind.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/concat");
},{"core-js-pure/stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/concat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/every.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/every");
},{"core-js-pure/stable/instance/every":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/every.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/filter");
},{"core-js-pure/stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/filter.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find-index.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/find-index");
},{"core-js-pure/stable/instance/find-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/find-index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/find");
},{"core-js-pure/stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/find.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flat-map.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/flat-map");
},{"core-js-pure/stable/instance/flat-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/flat-map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flat.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/flat");
},{"core-js-pure/stable/instance/flat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/flat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/for-each");
},{"core-js-pure/stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/for-each.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/includes");
},{"core-js-pure/stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/includes.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/index-of");
},{"core-js-pure/stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/keys.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/keys");
},{"core-js-pure/stable/instance/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/last-index-of.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/last-index-of");
},{"core-js-pure/stable/instance/last-index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/last-index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/map");
},{"core-js-pure/stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-end.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/pad-end");
},{"core-js-pure/stable/instance/pad-end":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/pad-end.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-start.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/pad-start");
},{"core-js-pure/stable/instance/pad-start":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/pad-start.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/reduce");
},{"core-js-pure/stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reverse.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/reverse");
},{"core-js-pure/stable/instance/reverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/reverse.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/slice");
},{"core-js-pure/stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/some");
},{"core-js-pure/stable/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/some.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/sort.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/sort");
},{"core-js-pure/stable/instance/sort":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/sort.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/splice");
},{"core-js-pure/stable/instance/splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/splice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/starts-with.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/starts-with");
},{"core-js-pure/stable/instance/starts-with":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/starts-with.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/trim");
},{"core-js-pure/stable/instance/trim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/trim.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/instance/values");
},{"core-js-pure/stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/values.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/json/stringify");
},{"core-js-pure/stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/json/stringify.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-integer.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/number/is-integer");
},{"core-js-pure/stable/number/is-integer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/number/is-integer.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/assign.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/assign");
},{"core-js-pure/stable/object/assign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/assign.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/create.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/create");
},{"core-js-pure/stable/object/create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/create.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/define-properties");
},{"core-js-pure/stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/define-properties.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/define-property");
},{"core-js-pure/stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/entries.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/entries");
},{"core-js-pure/stable/object/entries":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/entries.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/freeze.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/freeze");
},{"core-js-pure/stable/object/freeze":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/freeze.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/get-own-property-descriptor");
},{"core-js-pure/stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/get-own-property-descriptor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/get-own-property-descriptors");
},{"core-js-pure/stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/get-own-property-descriptors.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/get-own-property-symbols");
},{"core-js-pure/stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/get-own-property-symbols.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/is.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/is");
},{"core-js-pure/stable/object/is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/is.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/keys");
},{"core-js-pure/stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/values.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/object/values");
},{"core-js-pure/stable/object/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/values.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/parse-float");
},{"core-js-pure/stable/parse-float":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/parse-float.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/parse-int");
},{"core-js-pure/stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/parse-int.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/promise.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/promise");
},{"core-js-pure/stable/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/promise/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/reflect/construct");
},{"core-js-pure/stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/reflect/construct.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-immediate.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/set-immediate");
},{"core-js-pure/stable/set-immediate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/set-immediate.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-interval.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/set-interval");
},{"core-js-pure/stable/set-interval":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/set-interval.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/set-timeout");
},{"core-js-pure/stable/set-timeout":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/set-timeout.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/set");
},{"core-js-pure/stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/set/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/symbol");
},{"core-js-pure/stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/symbol/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/iterator.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/symbol/iterator");
},{"core-js-pure/stable/symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/symbol/iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/replace.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/symbol/replace");
},{"core-js-pure/stable/symbol/replace":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/symbol/replace.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js":[function(require,module,exports){
module.exports = require("core-js-pure/stable/weak-map");
},{"core-js-pure/stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/weak-map/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/array/from.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/array/from");
},{"core-js-pure/features/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/array/from.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/array/is-array.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/array/is-array");
},{"core-js-pure/features/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/array/is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/get-iterator-method");
},{"core-js-pure/features/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/get-iterator-method.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/get-iterator");
},{"core-js-pure/features/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/get-iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/instance/index-of.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/instance/index-of");
},{"core-js-pure/features/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/instance/index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/instance/slice.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/instance/slice");
},{"core-js-pure/features/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/instance/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/create.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/object/create");
},{"core-js-pure/features/object/create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/create.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/define-property.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/object/define-property");
},{"core-js-pure/features/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-descriptor.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/object/get-own-property-descriptor");
},{"core-js-pure/features/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/get-own-property-descriptor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-symbols.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/object/get-own-property-symbols");
},{"core-js-pure/features/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/get-own-property-symbols.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/get-prototype-of.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/object/get-prototype-of");
},{"core-js-pure/features/object/get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/get-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/keys.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/object/keys");
},{"core-js-pure/features/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/set-prototype-of.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/object/set-prototype-of");
},{"core-js-pure/features/object/set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/set-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/promise.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/promise");
},{"core-js-pure/features/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/promise/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/reflect/get.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/reflect/get");
},{"core-js-pure/features/reflect/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/reflect/get.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/symbol.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/symbol");
},{"core-js-pure/features/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/symbol/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/symbol/iterator.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/symbol/iterator");
},{"core-js-pure/features/symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/symbol/iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/weak-map.js":[function(require,module,exports){
module.exports = require("core-js-pure/features/weak-map");
},{"core-js-pure/features/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/weak-map/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/arrayLikeToArray.js":[function(require,module,exports){
function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/arrayWithHoles.js":[function(require,module,exports){
var _Array$isArray = require("@babel/runtime-corejs3/core-js/array/is-array");

function _arrayWithHoles(arr) {
  if (_Array$isArray(arr)) return arr;
}

module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"@babel/runtime-corejs3/core-js/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/array/is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/arrayWithoutHoles.js":[function(require,module,exports){
var _Array$isArray = require("@babel/runtime-corejs3/core-js/array/is-array");

var arrayLikeToArray = require("./arrayLikeToArray.js");

function _arrayWithoutHoles(arr) {
  if (_Array$isArray(arr)) return arrayLikeToArray(arr);
}

module.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"./arrayLikeToArray.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/arrayLikeToArray.js","@babel/runtime-corejs3/core-js/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/array/is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js":[function(require,module,exports){
function _assertThisInitialized(self) {
  if (self === void 0) {
    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  }

  return self;
}

module.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js":[function(require,module,exports){
var _Promise = require("@babel/runtime-corejs3/core-js/promise");

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  try {
    var info = gen[key](arg);
    var value = info.value;
  } catch (error) {
    reject(error);
    return;
  }

  if (info.done) {
    resolve(value);
  } else {
    _Promise.resolve(value).then(_next, _throw);
  }
}

function _asyncToGenerator(fn) {
  return function () {
    var self = this,
        args = arguments;
    return new _Promise(function (resolve, reject) {
      var gen = fn.apply(self, args);

      function _next(value) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
      }

      function _throw(err) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
      }

      _next(undefined);
    });
  };
}

module.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"@babel/runtime-corejs3/core-js/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/promise.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js":[function(require,module,exports){
function _classCallCheck(instance, Constructor) {
  if (!(instance instanceof Constructor)) {
    throw new TypeError("Cannot call a class as a function");
  }
}

module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js":[function(require,module,exports){
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js/object/define-property");

function _defineProperties(target, props) {
  for (var i = 0; i < props.length; i++) {
    var descriptor = props[i];
    descriptor.enumerable = descriptor.enumerable || false;
    descriptor.configurable = true;
    if ("value" in descriptor) descriptor.writable = true;

    _Object$defineProperty(target, descriptor.key, descriptor);
  }
}

function _createClass(Constructor, protoProps, staticProps) {
  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
  if (staticProps) _defineProperties(Constructor, staticProps);

  _Object$defineProperty(Constructor, "prototype", {
    writable: false
  });

  return Constructor;
}

module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"@babel/runtime-corejs3/core-js/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js":[function(require,module,exports){
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js/object/define-property");

function _defineProperty(obj, key, value) {
  if (key in obj) {
    _Object$defineProperty(obj, key, {
      value: value,
      enumerable: true,
      configurable: true,
      writable: true
    });
  } else {
    obj[key] = value;
  }

  return obj;
}

module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"@babel/runtime-corejs3/core-js/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js":[function(require,module,exports){
var _Reflect$get = require("@babel/runtime-corejs3/core-js/reflect/get");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js/object/get-own-property-descriptor");

var superPropBase = require("./superPropBase.js");

function _get() {
  if (typeof Reflect !== "undefined" && _Reflect$get) {
    module.exports = _get = _Reflect$get, module.exports.__esModule = true, module.exports["default"] = module.exports;
  } else {
    module.exports = _get = function _get(target, property, receiver) {
      var base = superPropBase(target, property);
      if (!base) return;

      var desc = _Object$getOwnPropertyDescriptor(base, property);

      if (desc.get) {
        return desc.get.call(arguments.length < 3 ? target : receiver);
      }

      return desc.value;
    }, module.exports.__esModule = true, module.exports["default"] = module.exports;
  }

  return _get.apply(this, arguments);
}

module.exports = _get, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"./superPropBase.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/superPropBase.js","@babel/runtime-corejs3/core-js/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js/reflect/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/reflect/get.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js":[function(require,module,exports){
var _Object$setPrototypeOf = require("@babel/runtime-corejs3/core-js/object/set-prototype-of");

var _Object$getPrototypeOf = require("@babel/runtime-corejs3/core-js/object/get-prototype-of");

function _getPrototypeOf(o) {
  module.exports = _getPrototypeOf = _Object$setPrototypeOf ? _Object$getPrototypeOf : function _getPrototypeOf(o) {
    return o.__proto__ || _Object$getPrototypeOf(o);
  }, module.exports.__esModule = true, module.exports["default"] = module.exports;
  return _getPrototypeOf(o);
}

module.exports = _getPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"@babel/runtime-corejs3/core-js/object/get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/get-prototype-of.js","@babel/runtime-corejs3/core-js/object/set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/set-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js":[function(require,module,exports){
var _Object$create = require("@babel/runtime-corejs3/core-js/object/create");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js/object/define-property");

var setPrototypeOf = require("./setPrototypeOf.js");

function _inherits(subClass, superClass) {
  if (typeof superClass !== "function" && superClass !== null) {
    throw new TypeError("Super expression must either be null or a function");
  }

  subClass.prototype = _Object$create(superClass && superClass.prototype, {
    constructor: {
      value: subClass,
      writable: true,
      configurable: true
    }
  });

  _Object$defineProperty(subClass, "prototype", {
    writable: false
  });

  if (superClass) setPrototypeOf(subClass, superClass);
}

module.exports = _inherits, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"./setPrototypeOf.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/setPrototypeOf.js","@babel/runtime-corejs3/core-js/object/create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/create.js","@babel/runtime-corejs3/core-js/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/helpers/interopRequireDefault.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireWildcard.js":[function(require,module,exports){
var _typeof = require("./typeof.js")["default"];

var _WeakMap = require("@babel/runtime-corejs3/core-js/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js/object/get-own-property-descriptor");

function _getRequireWildcardCache(nodeInterop) {
  if (typeof _WeakMap !== "function") return null;
  var cacheBabelInterop = new _WeakMap();
  var cacheNodeInterop = new _WeakMap();
  return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  })(nodeInterop);
}

function _interopRequireWildcard(obj, nodeInterop) {
  if (!nodeInterop && obj && obj.__esModule) {
    return obj;
  }

  if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") {
    return {
      "default": obj
    };
  }

  var cache = _getRequireWildcardCache(nodeInterop);

  if (cache && cache.has(obj)) {
    return cache.get(obj);
  }

  var newObj = {};
  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;

  for (var key in obj) {
    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;

      if (desc && (desc.get || desc.set)) {
        _Object$defineProperty(newObj, key, desc);
      } else {
        newObj[key] = obj[key];
      }
    }
  }

  newObj["default"] = obj;

  if (cache) {
    cache.set(obj, newObj);
  }

  return newObj;
}

module.exports = _interopRequireWildcard, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"./typeof.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@babel/runtime-corejs3/core-js/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/define-property.js","@babel/runtime-corejs3/core-js/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/weak-map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/iterableToArray.js":[function(require,module,exports){
var _Symbol = require("@babel/runtime-corejs3/core-js/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$from = require("@babel/runtime-corejs3/core-js/array/from");

function _iterableToArray(iter) {
  if (typeof _Symbol !== "undefined" && _getIteratorMethod(iter) != null || iter["@@iterator"] != null) return _Array$from(iter);
}

module.exports = _iterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"@babel/runtime-corejs3/core-js/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/array/from.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/core-js/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/iterableToArrayLimit.js":[function(require,module,exports){
var _Symbol = require("@babel/runtime-corejs3/core-js/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

function _iterableToArrayLimit(arr, i) {
  var _i = arr == null ? null : typeof _Symbol !== "undefined" && _getIteratorMethod(arr) || arr["@@iterator"];

  if (_i == null) return;
  var _arr = [];
  var _n = true;
  var _d = false;

  var _s, _e;

  try {
    for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
      _arr.push(_s.value);

      if (i && _arr.length === i) break;
    }
  } catch (err) {
    _d = true;
    _e = err;
  } finally {
    try {
      if (!_n && _i["return"] != null) _i["return"]();
    } finally {
      if (_d) throw _e;
    }
  }

  return _arr;
}

module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/core-js/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/nonIterableRest.js":[function(require,module,exports){
function _nonIterableRest() {
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}

module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/nonIterableSpread.js":[function(require,module,exports){
function _nonIterableSpread() {
  throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}

module.exports = _nonIterableSpread, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/objectWithoutProperties.js":[function(require,module,exports){
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js/object/get-own-property-symbols");

var _indexOfInstanceProperty = require("@babel/runtime-corejs3/core-js/instance/index-of");

var objectWithoutPropertiesLoose = require("./objectWithoutPropertiesLoose.js");

function _objectWithoutProperties(source, excluded) {
  if (source == null) return {};
  var target = objectWithoutPropertiesLoose(source, excluded);
  var key, i;

  if (_Object$getOwnPropertySymbols) {
    var sourceSymbolKeys = _Object$getOwnPropertySymbols(source);

    for (i = 0; i < sourceSymbolKeys.length; i++) {
      key = sourceSymbolKeys[i];
      if (_indexOfInstanceProperty(excluded).call(excluded, key) >= 0) continue;
      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
      target[key] = source[key];
    }
  }

  return target;
}

module.exports = _objectWithoutProperties, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"./objectWithoutPropertiesLoose.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/objectWithoutPropertiesLoose.js","@babel/runtime-corejs3/core-js/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/instance/index-of.js","@babel/runtime-corejs3/core-js/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-symbols.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/objectWithoutPropertiesLoose.js":[function(require,module,exports){
var _Object$keys = require("@babel/runtime-corejs3/core-js/object/keys");

var _indexOfInstanceProperty = require("@babel/runtime-corejs3/core-js/instance/index-of");

function _objectWithoutPropertiesLoose(source, excluded) {
  if (source == null) return {};
  var target = {};

  var sourceKeys = _Object$keys(source);

  var key, i;

  for (i = 0; i < sourceKeys.length; i++) {
    key = sourceKeys[i];
    if (_indexOfInstanceProperty(excluded).call(excluded, key) >= 0) continue;
    target[key] = source[key];
  }

  return target;
}

module.exports = _objectWithoutPropertiesLoose, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"@babel/runtime-corejs3/core-js/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/instance/index-of.js","@babel/runtime-corejs3/core-js/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js":[function(require,module,exports){
var _typeof = require("./typeof.js")["default"];

var assertThisInitialized = require("./assertThisInitialized.js");

function _possibleConstructorReturn(self, call) {
  if (call && (_typeof(call) === "object" || typeof call === "function")) {
    return call;
  } else if (call !== void 0) {
    throw new TypeError("Derived constructors may only return object or undefined");
  }

  return assertThisInitialized(self);
}

module.exports = _possibleConstructorReturn, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"./assertThisInitialized.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","./typeof.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/setPrototypeOf.js":[function(require,module,exports){
var _Object$setPrototypeOf = require("@babel/runtime-corejs3/core-js/object/set-prototype-of");

function _setPrototypeOf(o, p) {
  module.exports = _setPrototypeOf = _Object$setPrototypeOf || function _setPrototypeOf(o, p) {
    o.__proto__ = p;
    return o;
  }, module.exports.__esModule = true, module.exports["default"] = module.exports;
  return _setPrototypeOf(o, p);
}

module.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"@babel/runtime-corejs3/core-js/object/set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/object/set-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js":[function(require,module,exports){
var arrayWithHoles = require("./arrayWithHoles.js");

var iterableToArrayLimit = require("./iterableToArrayLimit.js");

var unsupportedIterableToArray = require("./unsupportedIterableToArray.js");

var nonIterableRest = require("./nonIterableRest.js");

function _slicedToArray(arr, i) {
  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();
}

module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"./arrayWithHoles.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/arrayWithHoles.js","./iterableToArrayLimit.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/iterableToArrayLimit.js","./nonIterableRest.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/nonIterableRest.js","./unsupportedIterableToArray.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/unsupportedIterableToArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/superPropBase.js":[function(require,module,exports){
var getPrototypeOf = require("./getPrototypeOf.js");

function _superPropBase(object, property) {
  while (!Object.prototype.hasOwnProperty.call(object, property)) {
    object = getPrototypeOf(object);
    if (object === null) break;
  }

  return object;
}

module.exports = _superPropBase, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"./getPrototypeOf.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toArray.js":[function(require,module,exports){
var arrayWithHoles = require("./arrayWithHoles.js");

var iterableToArray = require("./iterableToArray.js");

var unsupportedIterableToArray = require("./unsupportedIterableToArray.js");

var nonIterableRest = require("./nonIterableRest.js");

function _toArray(arr) {
  return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest();
}

module.exports = _toArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"./arrayWithHoles.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/arrayWithHoles.js","./iterableToArray.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/iterableToArray.js","./nonIterableRest.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/nonIterableRest.js","./unsupportedIterableToArray.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/unsupportedIterableToArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js":[function(require,module,exports){
var arrayWithoutHoles = require("./arrayWithoutHoles.js");

var iterableToArray = require("./iterableToArray.js");

var unsupportedIterableToArray = require("./unsupportedIterableToArray.js");

var nonIterableSpread = require("./nonIterableSpread.js");

function _toConsumableArray(arr) {
  return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();
}

module.exports = _toConsumableArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"./arrayWithoutHoles.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/arrayWithoutHoles.js","./iterableToArray.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/iterableToArray.js","./nonIterableSpread.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/nonIterableSpread.js","./unsupportedIterableToArray.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/unsupportedIterableToArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js":[function(require,module,exports){
var _Symbol = require("@babel/runtime-corejs3/core-js/symbol");

var _Symbol$iterator = require("@babel/runtime-corejs3/core-js/symbol/iterator");

function _typeof(obj) {
  "@babel/helpers - typeof";

  return (module.exports = _typeof = "function" == typeof _Symbol && "symbol" == typeof _Symbol$iterator ? function (obj) {
    return typeof obj;
  } : function (obj) {
    return obj && "function" == typeof _Symbol && obj.constructor === _Symbol && obj !== _Symbol.prototype ? "symbol" : typeof obj;
  }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj);
}

module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"@babel/runtime-corejs3/core-js/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/symbol.js","@babel/runtime-corejs3/core-js/symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/symbol/iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/unsupportedIterableToArray.js":[function(require,module,exports){
var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js/array/from");

var arrayLikeToArray = require("./arrayLikeToArray.js");

function _unsupportedIterableToArray(o, minLen) {
  var _context;

  if (!o) return;
  if (typeof o === "string") return arrayLikeToArray(o, minLen);

  var n = _sliceInstanceProperty(_context = Object.prototype.toString.call(o)).call(_context, 8, -1);

  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return _Array$from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);
}

module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
},{"./arrayLikeToArray.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/arrayLikeToArray.js","@babel/runtime-corejs3/core-js/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/array/from.js","@babel/runtime-corejs3/core-js/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/instance/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js":[function(require,module,exports){
module.exports = require("regenerator-runtime");

},{"regenerator-runtime":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regenerator-runtime/runtime.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

require("core-js/modules/es.date.to-string");

require("core-js/modules/es.function.name");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.exec");

require("core-js/modules/es.regexp.to-string");

require("core-js/modules/es.string.split");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = componentLogger;

var _splice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/splice"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _manticore = _interopRequireDefault(require("manticore"));

/**
 * Common logging framework for the SDK. You can pass a string,
 * or use an es6 template INSIDE a function (for best performance).
 * @example
 * // Simple string logging
 * Log.debug('Hello World');
 * @example
 * // Use a template but only evaluate the template when logging is enabled
 * Log.debug(() => `Hello ${world}`);
 * @private
 */
var Level = {
  DEVELOPER: 'DEVELOPER',
  DEBUG: 'DEBUG',
  INFO: 'INFO',
  TRACK: 'TRACK',
  INSTRUMENT: 'INSTRUMENT',
  WARN: 'WARN',
  ERROR: 'ERROR'
};
var Ranks = {
  DEVELOPER: 1,
  DEBUG: 2,
  INFO: 3,
  TRACK: 4,
  INSTRUMENT: 5,
  WARN: 6,
  ERROR: 7,
  QUIET: 8
};
var Names = {
  1: 'DEVELOPER',
  2: 'DEBUG',
  3: 'INFO',
  4: 'TRACK',
  5: 'INSTRUMENT',
  6: 'WARN',
  7: 'ERROR',
  8: 'QUIET'
}; // There's probably a smarter way to do this, but at least this is better
// than rampant strings

var RootLogger = {
  name: '*',
  level: 'DEBUG',
  children: {}
};
var Config = RootLogger;

function extend(dest, src) {
  if (!dest && !src) {
    return null;
  }

  if (!dest || !src) {
    return dest || src;
  }

  for (var prop in src) {
    if (!Object.prototype.hasOwnProperty.call(dest, prop)) {
      dest[prop] = src[prop];
    }
  }

  return dest;
}

function getFromFnOrAny(fnOrAny) {
  return fnOrAny instanceof Function ? fnOrAny() : fnOrAny;
}

function lazy(x) {
  function get() {
    try {
      var evaluated = {
        isOk: true,
        value: getFromFnOrAny(x),
        get: function get() {
          return evaluated;
        }
      };
      return evaluated;
    } catch (err) {
      var _evaluated = {
        isOk: false,
        value: x.toString(),
        get: function get() {
          return _evaluated;
        }
      };
      return _evaluated;
    }
  }

  return {
    get: get,
    isOk: true
  };
}

function errorLogger(level, component, _ref) {
  var message = _ref.message,
      extraData = _ref.extraData;

  if (!message.isOk || !extraData.isOk) {
    _manticore["default"].log(Level.ERROR, component.name, "Log Error: ".concat(message.value), extraData.value);
  }
}

function levelFor(component) {
  // We will walk up the chain and pick the first level we find,
  // which should always terminate at the RootLogger, but just in case you mess with us...
  var c = component;
  var configuredLevel;

  while (c && !(configuredLevel = c.level)) {
    c = c.parent;
  }

  return Ranks[configuredLevel || RootLogger.level] || 0;
}

var LogWriters = [];

function log(level, component, fnOrString, extraDataFn) {
  var configuredLevel = levelFor(component);
  var levelName = Names[level];
  var loggable = (0, _reduce["default"])(LogWriters).call(LogWriters, function (_ref2, logWriter) {
    var message = _ref2.message,
        extraData = _ref2.extraData;
    return logWriter(levelName, component, message, extraData, function () {
      return level >= configuredLevel;
    });
  }, {
    message: lazy(fnOrString),
    extraData: lazy(extraDataFn)
  });
  errorLogger(levelName, component, loggable);
}

function makeContextualLogger(baseLogger, contextFn) {
  var closure = {
    contextFn: contextFn,
    debug: function debug(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      baseLogger.debug(item, function () {
        return extend(getFromFnOrAny(extraDataFn), getFromFnOrAny(contextFn));
      });
    },
    developer: function developer(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      baseLogger.developer(item, function () {
        return extend(getFromFnOrAny(extraDataFn), getFromFnOrAny(contextFn));
      });
    },
    info: function info(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      baseLogger.info(item, function () {
        return extend(getFromFnOrAny(extraDataFn), getFromFnOrAny(contextFn));
      });
    },
    warn: function warn(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      baseLogger.warn(item, function () {
        return extend(getFromFnOrAny(extraDataFn), getFromFnOrAny(contextFn));
      });
    },
    error: function error(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      baseLogger.error(item, function () {
        return extend(getFromFnOrAny(extraDataFn), getFromFnOrAny(contextFn));
      });
    },
    track: function track(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      baseLogger.track(item, function () {
        return extend(getFromFnOrAny(extraDataFn), getFromFnOrAny(contextFn));
      });
    },
    instrument: function track(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      baseLogger.instrument(item, function () {
        return extend(getFromFnOrAny(extraDataFn), getFromFnOrAny(contextFn));
      });
    },
    withContext: function loggerWithBaseData(_contextFn) {
      return makeContextualLogger(closure, function () {
        return extend(getFromFnOrAny(contextFn), getFromFnOrAny(_contextFn));
      });
    },
    Config: baseLogger.Config,
    Root: RootLogger
  };
  return closure;
}
/**
 * Component Logger
 * @param component
 * @returns {{debug: debug, developer: developer, info: info, warn: warn, error: error, track: track, instrument: track, withContext: (function(*=): {contextFn: *, debug: debug, developer: developer, info: info, warn: warn, error: error, track: track, instrument: track, withContext: (function(*=)), Config: (*|RootLogger), Root: {name: string, level: string, children: {}}}), Config: {name: string, level: string, children: {}}, Root: {name: string, level: string, children: {}}}}
 */


function componentLogger(component) {
  var loggers = component.split('.');
  var myComponent = RootLogger;
  var parent = RootLogger;
  var name;

  for (var i = 0; i < loggers.length; i++) {
    if (name) {
      name += ".".concat(loggers[i]);
    } else {
      name = loggers[i];
    }

    if (!myComponent.children[loggers[i]]) {
      myComponent.children[loggers[i]] = {
        name: name,
        children: {},
        parent: parent
      };
    }

    myComponent = myComponent.children[loggers[i]];
    parent = myComponent;
  }

  var closure = {
    debug: function debug(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      log(Ranks.DEBUG, myComponent, item, extraDataFn);
    },
    developer: function developer(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      log(Ranks.DEVELOPER, myComponent, item, extraDataFn);
    },
    info: function info(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      log(Ranks.INFO, myComponent, item, extraDataFn);
    },
    warn: function warn(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      log(Ranks.WARN, myComponent, item, extraDataFn);
    },
    error: function error(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      log(Ranks.ERROR, myComponent, item, extraDataFn);
    },
    track: function track(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      log(Ranks.TRACK, myComponent, item, extraDataFn);
    },
    instrument: function track(item) {
      var extraDataFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      log(Ranks.INSTRUMENT, myComponent, item, extraDataFn);
    },
    withContext: function loggerWithBaseData(_contextFn) {
      return makeContextualLogger(closure, _contextFn);
    },
    Config: myComponent,
    Root: RootLogger
  };
  return closure;
}
/**
 * You can build your own hierarchy by passing some other "Root" object as parent.
 * Otherwise we're configuring from RootLogger and then using levelFor
 * @param json Configuration specification for the log subsystem
 * @param parent Typically null, and we will configure the RootLogger.
 */


function configure(json, parent) {
  parent = parent || RootLogger;

  for (var c in json) {
    var v = json[c];
    var component = parent.children[c];

    if (!component) {
      component = parent.children[c] = {};
    }

    component.name = v.name || c;
    component.parent = parent;
    component.children = component.children || {};

    if (v.level) {
      component.level = v.level;
    } else {
      delete component.level;
    }

    if (v.children) {
      configure(v.children, component);
    }
  }
}

function removeLogger(fn) {
  var ix = (0, _indexOf["default"])(LogWriters).call(LogWriters, fn);

  if (ix >= 0) {
    (0, _splice["default"])(LogWriters).call(LogWriters, ix, 1);
  }
}
/**
 * Add a function that will be "cc'ed" on log messages. Only messages that
 * are configured to be logged will make it to this function (i.e. we still
 * check log levels and such)
 * @param fn (level, component, message, extraData) => {}
 * @param predicate Function to determine if the logger is to be invoked
 */


function addLogger(fn) {
  var predicate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
    return true;
  };

  function wrapped(level, component, message, extraData, logPredicate) {
    if (logPredicate() && predicate()) {
      var evaluatedMessage = message.get();
      var evaluatedExtraData = extraData.get();

      if (evaluatedMessage.isOk && evaluatedExtraData.isOk) {
        fn(level, component, evaluatedMessage.value, evaluatedExtraData.value);
      }

      return {
        message: evaluatedMessage,
        extraData: evaluatedExtraData
      };
    }

    return {
      message: message,
      extraData: extraData
    };
  }

  LogWriters.push(wrapped);
  return function _removeLogger() {
    removeLogger(wrapped);
  };
}

componentLogger.Level = Level;
componentLogger.Ranks = Ranks;
componentLogger.Names = Names;
componentLogger.configure = configure;
componentLogger.Root = RootLogger;
componentLogger.addLogger = addLogger;
componentLogger.levelFor = levelFor;
},{"@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","core-js/modules/es.date.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js","core-js/modules/es.function.name":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.function.name.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.split":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-paypalerror/build/index.js":[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "PayPalError", {
  enumerable: true,
  get: function get() {
    return _PayPalError.default;
  }
});
Object.defineProperty(exports, "PayPalErrorInfo", {
  enumerable: true,
  get: function get() {
    return _PayPalErrorInfo.default;
  }
});

var _PayPalError = _interopRequireDefault(require("./src/PayPalError"));

var _PayPalErrorInfo = _interopRequireDefault(require("./src/PayPalErrorInfo"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
},{"./src/PayPalError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-paypalerror/build/src/PayPalError.js","./src/PayPalErrorInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-paypalerror/build/src/PayPalErrorInfo.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-paypalerror/build/src/PayPalError.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

// SEE README.md for proper usage from JS
/**
 * A common base class for PayPal related errors which includes a debugId and code.
 * This id will be filled out if the error was generated from the PayPal servers.
 * @class
 * @property {string} domain The subsystem responsible for this error, in which the code @readonly
 *  should uniquely identify the type of error that has occurred
 * @property {string} code A non-localized code for this error @readonly
 * @property {string} message The explanation of the error @readonly
 * @property {string} debugId A server-generated identifier used by PayPal to help diagnose the error @readonly
 * @property {string} developerMessage A developer & user unfriendly message giving details about the error
 */
var PayPalError = function () {

  /**
   * Native can't make these
   * @private
   */
  function PayPalError() {
    _classCallCheck(this, PayPalError);

    throw new Error('Do no construct PayPalError.');
  }

  /**
   * Equality comparison
   * @param {PayPalError} paypalError error object
   * @returns {bool}
   */


  _createClass(PayPalError, [{
    key: 'equals',
    value: function equals(paypalError) {
      return paypalError && this.domain === paypalError.domain && this.code === paypalError.code;
    }
  }, {
    key: 'getValueOrDefault',
    value: function getValueOrDefault(key, defaultValue, type) {
      if (!type) {
        throw new Error('type argument is required in getValueOrDefault method');
      }
      var value = this.details[key] || this[key] || defaultValue;
      // eslint-disable-next-line valid-typeof
      return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === type ? value : defaultValue;
    }

    /**
     * Get boolean value or default boolean value
     * @param {string} key
     * @param {bool} defaultBool
     * @returns {bool}
     */

  }, {
    key: 'getValueOrDefaultBool',
    value: function getValueOrDefaultBool(key, defaultBool) {
      return this.getValueOrDefault(key, defaultBool, 'boolean');
    }

    /**
     * Get string value or default string value
     * @param {string} key
     * @param {string} defaultString
     * @returns {string}
     */

  }, {
    key: 'getValueOrDefaultString',
    value: function getValueOrDefaultString(key, defaultString) {
      return this.getValueOrDefault(key, defaultString, 'string');
    }

    /**
     * Get int value or default int value
     * @param {string} key
     * @param {int} defaultInt
     * @returns {int}
     */

  }, {
    key: 'getValueOrDefaultInt',
    value: function getValueOrDefaultInt(key, defaultInt) {
      return this.getValueOrDefault(key, defaultInt, 'number');
    }

    /**
     * Get decimal value or default decimal value
     * @param {string} key
     * @param {decimal} defaultDecimal
     * @returns {decimal}
     */

  }, {
    key: 'getValueOrDefaultDecimal',
    value: function getValueOrDefaultDecimal(key, defaultDecimal) {
      return this.getValueOrDefault(key, defaultDecimal, 'number');
    }

    /**
     * Decorate an error to include code, domain and a localized message
     * @param {PayPalError} error the error to be decorated or null if a new error should be created
     * @param {PayPalErrorInfo} info the error info
     * @returns {PayPalError}
     */

  }, {
    key: 'withDevMessage',
    value: function withDevMessage(msg) {
      this.developerMessage = msg;
      return this;
    }
  }, {
    key: 'withDebugId',
    value: function withDebugId(id) {
      this.debugId = id;
      return this;
    }
  }], [{
    key: 'makeError',
    value: function makeError(error, info) {
      // TODO: localize the error message
      // let error  = new Error(getLocalizedErrorMessage(code, domain));
      var _error = error || new Error(info.message);
      _error.message = info.message || _error.message;
      _error.code = info.code || _error.code;
      _error.domain = info.domain || _error.domain;
      _error.debugId = info.debugId || _error.debugId;
      _error.developerMessage = info.developerMessage || _error.developerMessage;
      _error.details = {};
      _error.withDevMessage = function (msg) {
        _error.developerMessage = msg;
        return _error;
      };
      _error.withDebugId = function (id) {
        _error.debugId = id;
        return _error;
      };
      _error.withDetails = function () {
        var details = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

        _error.details = Object.assign(_error.details, details);
        // Apply the details to _error for easy accessibility on native
        Object.entries(details).forEach(function (_ref) {
          var _ref2 = _slicedToArray(_ref, 2),
              key = _ref2[0],
              value = _ref2[1];

          // Add key value from details only when the key, on error object, doesn't have a value
          if (_error[key] === null || _error[key] === undefined) {
            _error[key] = value;
          }
        });
        return _error;
      };
      _error.getValueOrDefault = function (key, defaultValue) {
        return _error.details[key] || _error[key] || defaultValue;
      };
      _error.equals = function (err) {
        return err && err.domain === _error.domain && err.code === _error.code;
      };
      _error.toJSON = function () {
        return {
          domain: _error.domain,
          code: _error.code,
          message: _error.message,
          developerMessage: _error.developerMessage,
          debugId: _error.debugId,
          details: _error.details
        };
      };
      return _error;
    }
  }]);

  return PayPalError;
}();

exports.default = PayPalError;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-paypalerror/build/src/PayPalErrorInfo.js":[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * A template class for all the properties of the error object
 * @class
 * @property {string} message The error message
 * @property {string} domain The subsystem responsible for this error, in which the code
 *  should uniquely identify the type of error that has occurred
 * @property {string} code A non-localized code for this error
 * @property {string} debugId A server-generated identifier used by PayPal to
 *  help diagnose this error
 * @property {string} developerMessage A developer friendly, user unfriendly
 *  message for log statements to give you as much info as possible.
 */
var PayPalErrorInfo = function PayPalErrorInfo() {
  _classCallCheck(this, PayPalErrorInfo);
};

exports.default = PayPalErrorInfo;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/ConnectionFlow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _now = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/date/now"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _Flow = _interopRequireDefault(require("./common/Flow"));

var _MiuraTags = _interopRequireDefault(require("./MiuraTags"));

var _MiuraDeviceUpdate = _interopRequireDefault(require("./SoftwareUpdate/MiuraDeviceUpdate"));

var Log = (0, _manticoreLog["default"])('paymentDevice.miura.connectionFlow');
var FullConnectValidityDurationMs = 8 * 60 * 60 * 1000;

var ConnectionFlow = /*#__PURE__*/function () {
  function ConnectionFlow(device) {
    (0, _classCallCheck2["default"])(this, ConnectionFlow);
    this.device = device;
  }

  (0, _createClass2["default"])(ConnectionFlow, [{
    key: "start",
    value: function start(callback) {
      var _this = this;

      var flow = new _Flow["default"](this, this._retrieveVersionInfo, this._displayReaderConnectingMessage, this._tryQuickConnect, this._setCardReaderToMerchant, this._getDeviceCapabilities, this._getDeviceConfig, this._queryBackendForSWModules, this._getP2PEStatus, this._getBatteryLevel);
      flow.name = 'Miura Connection';
      flow.on('completed', function (err) {
        if (err) {
          _this.device.display({
            id: _retailPaymentDevice.PaymentDevice.Message.ConnectionFailed
          }, function () {
            callback(err);
          });

          return;
        }

        Log.debug('Completed connection sequence.');
        callback(err);
      });
      flow.start();
    }
  }, {
    key: "_setCardReaderToMerchant",
    value: function _setCardReaderToMerchant(flow) {
      this.device.setCardReaderToMerchant(this.device.serialNumber);
      flow.next();
    }
  }, {
    key: "_retrieveVersionInfo",
    value: function _retrieveVersionInfo(flow) {
      this.device.getFirmwareVersionInfo(function (e) {
        return flow.nextOrAbort(e);
      });
    }
  }, {
    key: "_displayReaderConnectingMessage",
    value: function _displayReaderConnectingMessage(flow) {
      this.device.display({
        id: _retailPaymentDevice.PaymentDevice.Message.Connecting
      }, function () {
        return flow.next();
      });
    }
  }, {
    key: "_tryQuickConnect",
    value: function _tryQuickConnect(flow) {
      if (!this.device.fullConnectionExecutedOn) {
        flow.next();
        return;
      } // Allow quick connect for 8 hours


      var msSinceLastFullConnection = (0, _now["default"])() - this.device.fullConnectionExecutedOn.getTime();

      if (msSinceLastFullConnection < FullConnectValidityDurationMs) {
        Log.info("Skipping the full connection flow. Device was previously fully connected ".concat(msSinceLastFullConnection, "ms ago. Will not check for firmware updates"));
        flow.completeFlow(); // Quit the execution by passing 'true' instead of error

        return;
      }

      Log.info("Redo a full connection as the device was previously fully connected ".concat(msSinceLastFullConnection, "ms ago"));
      this.device.fullConnectionExecutedOn = null;
      flow.next();
    }
  }, {
    key: "_getDeviceCapabilities",
    value: function _getDeviceCapabilities(flow) {
      var _this2 = this;

      this.device.terminal.Config.getDeviceCapabilities(function (e, devCaps) {
        if (devCaps && devCaps.caps) {
          _this2.device.capabilities = devCaps.caps;
          Log.debug(function () {
            return "Device caps: ".concat((0, _stringify["default"])(devCaps.caps, null, '\t'));
          });
        }

        flow.nextOrAbort(e);
      });
    }
  }, {
    key: "_getDeviceConfig",
    value: function _getDeviceConfig(flow) {
      var _this3 = this;

      this.device.terminal.Config.getConfiguration(function (e, config) {
        var error = null;

        if (!e && !config.response.apdu.isSuccess) {
          error = _retailPaymentDevice.deviceError.dataRetrievalFailed.withDevMessage('Failed to get terminal configuration.');
        } else if (config) {
          _this3.device.swInfo = config.caps;
          Log.debug(function () {
            return "Software Info: ".concat((0, _stringify["default"])(_this3.device.swInfo, null, '\t'));
          });
        }

        flow.nextOrAbort(error);
      });
    }
  }, {
    key: "_queryBackendForSWModules",
    value: function _queryBackendForSWModules(flow) {
      // Avoid rechecking for updates on same device during reconnects
      if (this.exSerial !== this.device.serialNumber || !this.serverSwInfo) {
        // We are just kicking off the fetch here, the result will be stored
        // on the flow. So fetchSWInfoFromServer is not really a "part" of the
        // flow.
        this.exSerial = this.device.serialNumber;

        this._fetchSWInfoFromServer(flow);
      } else {
        flow.next();
      }
    }
  }, {
    key: "_getP2PEStatus",
    value: function _getP2PEStatus(flow) {
      var _this4 = this;

      this.device.terminal.Config.getP2PEStatus(function (e, p2peStatus) {
        var _context;

        if (e) {
          flow.abortFlow(e);
          return;
        }

        var miuraP2PEStatus = (0, _find["default"])(_context = p2peStatus.apdu.tlvs).call(_context, _MiuraTags["default"].MiuraP2PEStatus);

        if (!miuraP2PEStatus) {
          var error = _retailPaymentDevice.deviceError.dataRetrievalFailed.withDevMessage('Unable to get encryption status for reader.');

          flow.abortFlow(error);
          return;
        }

        var _miuraP2PEStatus$byte = (0, _slicedToArray2["default"])(miuraP2PEStatus.bytes, 1),
            firstStatusByte = _miuraP2PEStatus$byte[0];

        if (firstStatusByte & 0x80) {
          _this4.device.p2pe = {
            error: _this4._p2peError(firstStatusByte)
          };
        } else {
          _this4.device.p2pe = {
            init: !!(firstStatusByte & 1),
            pin: !!(firstStatusByte & 2),
            sred: !!(firstStatusByte & 4)
          };
        }

        _this4.finishedP2PE = true;

        if (_this4.pendedUpdateInstruction) {
          _this4._checkP2PEWithUpdate(_this4.pendedUpdateInstruction, flow);
        } else {
          flow.next();
        }
      });
    }
  }, {
    key: "_getBatteryLevel",
    value: function _getBatteryLevel(flow) {
      var _this5 = this;

      this.device.getBatteryInfo(function (e, batteryInfo) {
        if (!e) {
          _this5.device.fullConnectionExecutedOn = new Date();
          Log.debug(function () {
            return "Setting fullConnectionExecutedOn to ".concat(_this5.device.fullConnectionExecutedOn);
          });
          _this5.device.lastKnownBatteryInfo = batteryInfo;
        }

        flow.nextOrAbort(e);
      });
    }
  }, {
    key: "_checkP2PEWithUpdate",
    value: function _checkP2PEWithUpdate(modules, flow) {
      Log.debug('Checking P2PE with update instructions');

      if (_MiuraDeviceUpdate["default"].needsUpdate(this.device, modules)) {
        this.device.updates = modules;
        this.updateRequired = true;

        this._notifyReaderUpdateRequired();
      }

      flow.next();
    }
  }, {
    key: "_fetchSWInfoFromServer",
    value: function _fetchSWInfoFromServer(flow) {
      var _this6 = this;

      var body = this._generateUpdateRequest(this.device);

      this.device.app.getFirmwareUpdates(body, this.device.manufacturer, this.device.model, function (err, rz) {
        _this6.serverSwInfo = rz;
        Log.debug(function () {
          return "Received firmware update response for this.device: ".concat(_this6.device);
        });

        if (err || !rz || !rz.body) {
          var _context2, _context3, _context4;

          Log.error((0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = (0, _concat["default"])(_context4 = "Unable to retrieve firmware update information for ".concat(_this6.device.id, ", manufacturer=")).call(_context4, _this6.device.manufacturer, ", model=")).call(_context3, _this6.device.model, ". Error: ")).call(_context2, err));

          if (rz && rz.body) {
            Log.warn((0, _stringify["default"])(rz.body, null, '\t'));
          }

          flow.next();
          return;
        }

        if (!_this6.finishedP2PE) {
          Log.debug('Pending update instruction until P2PE is complete.');
          _this6.pendedUpdateInstruction = rz.body && rz.body.modules;
          flow.next();
          return;
        }

        if (rz.statusCode === 304) {
          Log.debug(function () {
            return "".concat(_this6.device.id, " Software update not needed");
          });
          flow.next();
          return;
        } // TODO this is a bit squirrely because instr.body.phases could be invalid even if status code is !304


        _this6._checkP2PEWithUpdate(rz.body.modules, flow);
      });
    }
  }, {
    key: "_notifyReaderUpdateRequired",
    value: function _notifyReaderUpdateRequired() {
      Log.debug('notifying reader status');

      if (this.device.updates || this.device._isKeyInjectionRequired) {
        var _context5, _context6, _context7;

        Log.info((0, _concat["default"])(_context5 = (0, _concat["default"])(_context6 = (0, _concat["default"])(_context7 = "".concat(this.device.id, " needs update.\nKeyInjectionRequired: ")).call(_context7, this.device._isKeyInjectionRequired, "\nUpdates(Modules: ")).call(_context6, this.device.updates ? this.device.updates.length : 0, ")\n")).call(_context5, (0, _stringify["default"])(this.device.updates)));
        this.device.updateRequired(new _MiuraDeviceUpdate["default"](this.device));
      }
    }
  }, {
    key: "_generateUpdateRequest",
    value: function _generateUpdateRequest(d) {
      var _context8, _context9;

      var components = [{
        name: 'Miura_OS',
        version: (0, _concat["default"])(_context8 = "".concat(d.os.id, "-")).call(_context8, d.os.ver)
      }, {
        name: 'Miura_MPI',
        version: (0, _concat["default"])(_context9 = "".concat(d.mpi.id, "-")).call(_context9, d.mpi.ver)
      }];

      for (var k in d.swInfo) {
        if ({}.hasOwnProperty.call(d.swInfo, k)) {
          var ver = d.forceConfigUpdate ? '0.0' : d.swInfo[k];
          components.push({
            name: k,
            version: ver
          });
        }
      }

      return {
        components: components
      };
    }
  }, {
    key: "_p2peError",
    value: function _p2peError(v) {
      switch (v) {
        case 0x81:
          return 'Root Certificate Error';

        case 0x82:
          return 'Product Certificate Error';

        case 0x83:
          return 'Terminal Certificate Error';

        case 0x84:
          return 'Key Signing Key Error';

        case 0x85:
          return 'Internal Error, Contact PayPal';

        default:
          return "Unknown Error (".concat(v, ")");
      }
    }
  }]);
  return ConnectionFlow;
}();

exports["default"] = ConnectionFlow;

},{"./MiuraTags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraTags.js","./SoftwareUpdate/MiuraDeviceUpdate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/SoftwareUpdate/MiuraDeviceUpdate.js","./common/Flow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/common/Flow.js","@babel/runtime-corejs3/core-js-stable/date/now":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/date/now.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraDevice.js":[function(require,module,exports){
"use strict";

var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.exec");

require("core-js/modules/es.regexp.to-string");

require("core-js/modules/es.string.match");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _getIteratorMethod2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator-method"));

var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));

var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _construct = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/reflect/construct"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/values"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

require("regenerator-runtime/runtime");

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

var Util = _interopRequireWildcard(require("manticore-util"));

var _paypalInvoicing = require("@paypalcorp/paypal-invoicing");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _tlvlib = require("tlvlib");

var _cardMetadataParser = _interopRequireDefault(require("./cardMetadataParser"));

var _deviceState = _interopRequireDefault(require("./deviceState"));

var _ConnectionFlow = _interopRequireDefault(require("./ConnectionFlow"));

var _Terminal = require("./Terminal");

var _TerminalStatus = _interopRequireDefault(require("./messages/TerminalStatus"));

var _MiuraTags = _interopRequireDefault(require("./MiuraTags"));

var _CardStatus = _interopRequireDefault(require("./messages/CardStatus"));

function _createForOfIteratorHelper(o) {
  if (typeof _symbol["default"] === "undefined" || (0, _getIteratorMethod2["default"])(o) == null) {
    if ((0, _isArray["default"])(o) || (o = _unsupportedIterableToArray(o))) {
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var it,
      normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = (0, _getIterator2["default"])(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context22;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  var n = (0, _slice["default"])(_context22 = Object.prototype.toString.call(o)).call(_context22, 8, -1);
  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return (0, _from["default"])(n);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

function _createSuper(Derived) {
  return function () {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (_isNativeReflectConstruct()) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = (0, _construct["default"])(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_construct["default"]) return false;
  if (_construct["default"].sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Date.prototype.toString.call((0, _construct["default"])(Date, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var DeviceMessageId = _retailPaymentDevice.PaymentDevice.Message;
var Log = (0, _manticoreLog["default"])('paymentDevice.miura');

function _parseVersionInfo(id, ver) {
  var parts = ver && ver.match(/(\d+)-(\d+)/);
  var majorVer = parts && (0, _parseInt2["default"])(parts[1], 10);
  var minorVer = parts && (0, _parseInt2["default"])(parts[2], 10);
  return {
    id: id,
    ver: ver,
    majorVer: majorVer,
    minorVer: minorVer
  };
}
/**
 * Represents an EMV payment terminal manufactured by Miura for PayPal
 * @class
 * @protected
 */


var MiuraDevice = /*#__PURE__*/function (_PaymentDevice) {
  (0, _inherits2["default"])(MiuraDevice, _PaymentDevice);

  var _super = _createSuper(MiuraDevice);
  /**
   * Construct a new PaymentDevice given a native function capable of sending data to the device
   */


  function MiuraDevice(uniqueId, nativeInterface, appInterface, _readerConnectionType, hardwareAddress) {
    var _this;

    (0, _classCallCheck2["default"])(this, MiuraDevice);
    _this = _super.call(this, uniqueId, nativeInterface, appInterface, _readerConnectionType, hardwareAddress);
    _this.currencies = {
      AUD: {
        iso4217: 36
      },
      GBP: {
        symbol: '£',
        iso4217: 826
      },
      USD: {
        iso4217: 840
      },
      HKD: {
        iso4217: 344,
        decimals: 1
      },
      EUR: {
        symbol: '€',
        iso4217: 978
      },
      CAD: {
        iso4217: 124
      }
    };
    _this.manufacturer = _retailPaymentDevice.deviceManufacturer.miura;
    _this.terminal = new _Terminal.Terminal(function (name, buf, cb) {
      return _this["native"].send(name, buf, cb);
    }, (0, _assertThisInitialized2["default"])(_this));
    _this.terminal.isUsb = _readerConnectionType === _retailPaymentDevice.readerConnectionType.usb;

    _this.terminal.on(_Terminal.TerminalEvent.deviceEvent, function (m) {
      return _this._deviceEvent(m);
    });

    _this.terminal.on(_Terminal.TerminalEvent.cardPresented, function (card) {
      var ffName = Util.getPropertyName(_retailPaymentDevice.FormFactor, card.formFactor);

      if (!_this.isFormFactorActive(card.formFactor)) {
        Log.warn("Reader not activated for '".concat(ffName, "'. Will ignore presented card event"));
        return;
      }

      Log.debug(function () {
        return "Card presented using form factor: '".concat(ffName, "'");
      });
      card.reader = (0, _assertThisInitialized2["default"])(_this);

      if (card.formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
        _this._inTransactionState = !card.failed && card.lastFourDigits;

        _this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, card.failed ? _retailPaymentDevice.deviceError.badSwipeData : null, _retailPaymentDevice.CardPresentEvent.cardDataRead, _retailPaymentDevice.FormFactor.MagneticCardSwipe, {
          card: card
        });

        return;
      }

      if (card.formFactor === _retailPaymentDevice.FormFactor.Chip) {
        Log.debug(function () {
          return "Card insert detected on ".concat(_this.id, ". Will read EMV data from presented card");
        });
        _this.cardInSlot = true;

        if (_this.cardInsertedHandler) {
          Log.debug(function () {
            return "Invoke CardInsertHandler: ".concat(_this.context.id);
          });

          _this.cardInsertedHandler(new _retailPaymentDevice.CardInsertedHandler(function () {
            _this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.insertDetected, _retailPaymentDevice.FormFactor.Chip);

            Log.debug(function () {
              return "Continue CardDataRead: ".concat(_this.context.id);
            });

            _this._readCardData(card, _this.context);
          }));
        } else {
          Log.debug(function () {
            return "No card inserted handler was registered... Will continue to read card data for ".concat(_this.context.id);
          });

          _this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.insertDetected, _retailPaymentDevice.FormFactor.Chip);

          _this._readCardData(card, _this.context);
        }
      }
    });

    _this.terminal.on(_Terminal.TerminalEvent.cardRemoved, function () {
      _this.cardInSlot = false;

      _this.emit(_retailPaymentDevice.PaymentDevice.Event.cardRemoved);
    });

    _this.terminal.on(_Terminal.TerminalEvent.error, function (err, ff) {
      if (!_this.isFormFactorActive(ff)) {
        Log.warn("Reader not activated for '".concat(Util.getPropertyName(_retailPaymentDevice.FormFactor, ff), "'. Will ignore presented card event"));
        return;
      }

      _this.cardInSlot = _retailPaymentDevice.deviceError.invalidChip.equals(err) && ff === _retailPaymentDevice.FormFactor.Chip;

      _this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, err, _retailPaymentDevice.CardPresentEvent.cardDataRead, ff);
    });

    _this.model = _retailPaymentDevice.ReaderModel.M010;
    _this.type = _retailPaymentDevice.readerType.Emv;
    _this.connectionType = _readerConnectionType;
    return _this;
  }

  (0, _createClass2["default"])(MiuraDevice, [{
    key: "formatAmount",
    value: function formatAmount(invoice) {
      var ibn = (0, _paypalInvoicing.$$)(invoice.total); // All currencies in this.currencies is being rounded to 2. Refer RoundingRules in paypal-invoicing

      return (this.currencies[invoice.currency].symbol || '$') + ibn.toFormat(2, ibn.ROUND_HALF_UP);
    }
  }, {
    key: "listenForCardRemoval",
    value: function listenForCardRemoval(callback) {
      callback();
    }
  }, {
    key: "beginDeviceRemoved",
    value: function beginDeviceRemoved(callback) {
      this["native"].removed(callback);
    }
  }, {
    key: "beginDeviceConnect",
    value: function beginDeviceConnect(callback) {
      var _this2 = this;

      if (this["native"].isConnected()) {
        this.removeState(_deviceState["default"].hardResetting);
        Log.debug(function () {
          return "Connect called, but ".concat(_this2.id, " is already connected.");
        });
        callback();
        return;
      }

      Log.debug(function () {
        return "Connecting to Miura device ".concat(_this2.id);
      });
      this["native"].connect(function (error) {
        if (error) {
          callback(error);
          return;
        }

        _this2.removeState(_deviceState["default"].hardResetting);

        _this2.terminal.didConnect();

        new _ConnectionFlow["default"](_this2).start(callback);
      });
    }
  }, {
    key: "beginDeviceDisconnect",
    value: function beginDeviceDisconnect(callback) {
      var _this3 = this;

      if (!this.isConnected()) {
        Log.debug('Device already disconnected. Will not attempt to invoke native.disconnect');
        callback(null);
        return;
      }

      if (this.isUsb) {
        this.display({
          id: DeviceMessageId.NotConnected
        }, function () {
          _this3["native"].disconnect(callback);
        }, true);
      } else {
        this["native"].disconnect(callback);
      }
    }
  }, {
    key: "getVersionInfo",
    value: function getVersionInfo() {
      var _context, _context2;

      var os = this.os ? (0, _concat["default"])(_context = "".concat(this.os.id, "-")).call(_context, this.os.ver) : '';
      var mpi = this.mpi ? (0, _concat["default"])(_context2 = "".concat(this.mpi.id, "-")).call(_context2, this.mpi.ver) : '';
      return {
        os: os,
        mpi: mpi
      };
    }
  }, {
    key: "received",
    value: function received(data) {
      this.terminal.received(data);
    }
  }, {
    key: "display",
    value: function display(opt, callback) {
      if (!this.isConnected()) {
        if (callback) {
          callback(_retailPaymentDevice.deviceError.deviceNotConnected);
        }

        return;
      }

      if (this.model === _retailPaymentDevice.ReaderModel.M003) {
        if (callback) {
          callback();
          return;
        }
      }

      this.terminal.display(opt.id, opt.substitutions, callback, opt.displaySystemIcons);
    }
  }, {
    key: "displayAsync",
    value: function () {
      var _displayAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(opt) {
        return _regenerator["default"].wrap(function _callee$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                if (this.isConnected()) {
                  _context3.next = 4;
                  break;
                }

                throw _retailPaymentDevice.deviceError.deviceNotConnected;

              case 4:
                if (!(this.model === _retailPaymentDevice.ReaderModel.M003)) {
                  _context3.next = 6;
                  break;
                }

                return _context3.abrupt("return");

              case 6:
                _context3.next = 8;
                return this.terminal.displayAsync(opt.id, opt.substitutions, opt.displaySystemIcons);

              case 8:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee, this);
      }));

      function displayAsync(_x) {
        return _displayAsync.apply(this, arguments);
      }

      return displayAsync;
    }()
  }, {
    key: "requestForTip",
    value: function () {
      var _requestForTip = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(invoice) {
        return _regenerator["default"].wrap(function _callee2$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                _context4.next = 2;
                return this._msgPrompts(_retailPaymentDevice.PaymentDevice.Message.RequestTip, invoice);

              case 2:
              case "end":
                return _context4.stop();
            }
          }
        }, _callee2, this);
      }));

      function requestForTip(_x2) {
        return _requestForTip.apply(this, arguments);
      }

      return requestForTip;
    }()
  }, {
    key: "confirmTip",
    value: function () {
      var _confirmTip = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(invoice) {
        return _regenerator["default"].wrap(function _callee3$(_context5) {
          while (1) {
            switch (_context5.prev = _context5.next) {
              case 0:
                _context5.next = 2;
                return this._msgPrompts(_retailPaymentDevice.PaymentDevice.Message.ConfirmTip, invoice);

              case 2:
              case "end":
                return _context5.stop();
            }
          }
        }, _callee3, this);
      }));

      function confirmTip(_x3) {
        return _confirmTip.apply(this, arguments);
      }

      return confirmTip;
    }()
  }, {
    key: "promptForTip",
    value: function () {
      var _promptForTip = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(amountBasedTip) {
        return _regenerator["default"].wrap(function _callee4$(_context6) {
          while (1) {
            switch (_context6.prev = _context6.next) {
              case 0:
                return _context6.abrupt("return", this.terminal.promptForTipEntry(amountBasedTip));

              case 1:
              case "end":
                return _context6.stop();
            }
          }
        }, _callee4, this);
      }));

      function promptForTip(_x4) {
        return _promptForTip.apply(this, arguments);
      }

      return promptForTip;
    }()
  }, {
    key: "abortTipping",
    value: function () {
      var _abortTipping = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
        return _regenerator["default"].wrap(function _callee5$(_context7) {
          while (1) {
            switch (_context7.prev = _context7.next) {
              case 0:
                _context7.next = 2;
                return this.terminal.abortTransactionAsync();

              case 2:
              case "end":
                return _context7.stop();
            }
          }
        }, _callee5, this);
      }));

      function abortTipping() {
        return _abortTipping.apply(this, arguments);
      }

      return abortTipping;
    }()
  }, {
    key: "_msgPrompts",
    value: function () {
      var _msgPrompts2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(messageId, invoice) {
        return _regenerator["default"].wrap(function _callee6$(_context8) {
          while (1) {
            switch (_context8.prev = _context8.next) {
              case 0:
                _context8.next = 2;
                return this.terminal.registerForKeyboardEventsAsync(true);

              case 2:
                _context8.next = 4;
                return this.displayAsync({
                  id: messageId,
                  substitutions: {
                    amount: this.formatAmount(invoice)
                  }
                });

              case 4:
              case "end":
                return _context8.stop();
            }
          }
        }, _callee6, this);
      }));

      function _msgPrompts(_x5, _x6) {
        return _msgPrompts2.apply(this, arguments);
      }

      return _msgPrompts;
    }()
  }, {
    key: "doesHaveCapability",
    value: function doesHaveCapability(capability) {
      switch (capability) {
        case _retailPaymentDevice.deviceCapabilityType.display:
          return this.model === _retailPaymentDevice.ReaderModel.M010;

        case _retailPaymentDevice.deviceCapabilityType.contactless:
          return this.model === _retailPaymentDevice.ReaderModel.M010;

        default:
          return false;
      }
    }
  }, {
    key: "getFirmwareVersionInfo",
    value: function getFirmwareVersionInfo() {
      var _this4 = this;

      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      this.terminal.softReset(function (e, rz) {
        var _context9, _context10, _context11, _context12, _context13, _context14, _context15;

        if (e) {
          callback(e);
          return;
        }

        var serialNumberTag = rz.tlvs && (0, _find["default"])(_context9 = rz.tlvs).call(_context9, _tlvlib.Tags.InterfaceDeviceSerialNumber);
        var serialNumberValue = serialNumberTag === null || serialNumberTag === void 0 ? void 0 : serialNumberTag.parse();

        if (!serialNumberValue) {
          callback(_retailPaymentDevice.deviceError.dataRetrievalFailed.withDevMessage("Failed to get serial number from ".concat(_this4.id)));
          return;
        }

        _this4.serialNumber = serialNumberValue;

        var firstThree = _this4.serialNumber.substring(0, 3);

        if (firstThree === '130' || firstThree === '030') {
          _this4.model = _retailPaymentDevice.ReaderModel.M003;
        }

        var _iterator = _createForOfIteratorHelper((0, _values["default"])(rz.tlvs)),
            _step;

        try {
          for (_iterator.s(); !(_step = _iterator.n()).done;) {
            var tlv = _step.value;

            if (tlv.tagNumber === _MiuraTags["default"].MiuraSoftwareInformation.number) {
              _this4._readConfigPair(tlv);
            }
          }
        } catch (err) {
          _iterator.e(err);
        } finally {
          _iterator.f();
        }

        _this4.pre76 = _this4.os && (_this4.os.majorVer < 7 || _this4.os.majorVer === 7 && _this4.os.minorVer <= 5);
        Log.info((0, _concat["default"])(_context10 = (0, _concat["default"])(_context11 = (0, _concat["default"])(_context12 = (0, _concat["default"])(_context13 = "Version: ".concat(_this4.id, " Serial #: ")).call(_context13, _this4.serialNumber, " OS: ")).call(_context12, _this4.os && (0, _concat["default"])(_context14 = "".concat(_this4.os.id, ", ")).call(_context14, _this4.os.ver), " MPI: ")).call(_context11, _this4.mpi && (0, _concat["default"])(_context15 = "".concat(_this4.mpi.id, ", ")).call(_context15, _this4.mpi.ver), " pre76: ")).call(_context10, _this4.pre76));
        callback(null, {
          mpi: _this4.mpi,
          os: _this4.os
        });
      });
    }
  }, {
    key: "extractReaderLogs",
    value: function extractReaderLogs() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      Log.debug('Extracting log file from reader');
      this.terminal.Config.getLogFile(function (err, buff) {
        Log[err ? 'error' : 'debug'](function () {
          var _context16;

          return (0, _concat["default"])(_context16 = "Miura log getFile complete. err: ".concat(err, " Logs: ")).call(_context16, buff);
        });
        callback(err);
      });
    }
  }, {
    key: "activateForPayment",
    value: function activateForPayment(context, formFactors, showPrompt) {
      var _this5 = this;

      if (this._inTransactionState) {
        Log.info('Transaction was previously activated/has not ended yet. Will ignore this activate call');
        return;
      }

      Log.debug(function () {
        var _context17, _context18;

        return (0, _concat["default"])(_context17 = (0, _concat["default"])(_context18 = "Activating '".concat(_this5.id, "' for formFactors: ")).call(_context18, formFactors, ". ")).call(_context17, context.id);
      });
      (0, _get2["default"])((0, _getPrototypeOf2["default"])(MiuraDevice.prototype), "activateForPayment", this).call(this, context, formFactors, showPrompt);
      var errCardEvents;
      var errKeyboardEvents;
      this.terminal.cardStatus = _retailPaymentDevice.CardStatus.None;
      this.terminal.registerForCardEvents(true, function (cardError) {
        errCardEvents = cardError;

        if (errCardEvents) {
          Log.error("Failed to register for Miura card events: ".concat(errCardEvents.message));
          (0, _get2["default"])((0, _getPrototypeOf2["default"])(MiuraDevice.prototype), "deactivateFormFactors", _this5).call(_this5, [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.MagneticCardSwipe]);

          _this5.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, errCardEvents, _retailPaymentDevice.CardPresentEvent.cardDataRead);
        } else {
          Log.debug(function () {
            return "".concat(context.id, " Registered for card events");
          });
        }
      });
      this.terminal.registerForKeyboardEvents(true, function (keyboardError) {
        errKeyboardEvents = keyboardError;

        if (errKeyboardEvents) {
          Log.error("Failed to register for Miura keyboard events: ".concat(errKeyboardEvents.message));

          _this5.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, errKeyboardEvents, _retailPaymentDevice.CardPresentEvent.cardDataRead);
        } else {
          Log.debug(function () {
            return "".concat(context.id, " Registered for keyboard events");
          });
        }
      }); // Log.debug(() => `${context.id} Contactless after register`);

      var ff = new _set["default"](formFactors);

      if (ff.has(_retailPaymentDevice.FormFactor.EmvCertifiedContactless)) {
        context.emit(_retailPaymentDevice.PaymentDevice.Event.contactlessReaderActivated);

        this._startContactlessTx(context);
      }
    }
  }, {
    key: "selectPaymentApplication",
    value: function selectPaymentApplication(appId, card) {
      var _this6 = this;

      this.terminal.selectApplication(appId, function (err, rz) {
        if (err) {
          _this6.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, err, _retailPaymentDevice.CardPresentEvent.cardDataRead, _retailPaymentDevice.FormFactor.Chip);

          return;
        }

        Log.debug(function () {
          var _context19;

          return (0, _concat["default"])(_context19 = "Received ICC response from Application select (formFactor: ".concat(Util.getPropertyName(_retailPaymentDevice.FormFactor, card.formFactor), ") ")).call(_context19, rz);
        });
        var cardMetadata = (0, _cardMetadataParser["default"])(card.formFactor, rz);
        Util.extend(card, cardMetadata, true);
        Log.debug(function () {
          return "Card object updated with emv response: ".concat(card);
        });
        _this6._inTransactionState = true;

        _this6.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.cardDataRead, card.formFactor, {
          card: card
        });
      });
    }
  }, {
    key: "completeTransaction",
    value: function completeTransaction(authCode) {
      var _this7 = this;

      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

      if (!this.isConnected()) {
        callback(_retailPaymentDevice.deviceError.deviceNotConnected);
        return;
      }

      this.terminal.continueTransaction(authCode, function (err, rz) {
        _this7._inTransactionState = false;
        callback(err, rz);
      });
    }
  }, {
    key: "deactivateFormFactors",
    value: function deactivateFormFactors(formFactors) {
      var _this8 = this;

      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

      if (!formFactors || formFactors.length === 0) {
        callback();
        return;
      }

      (0, _get2["default"])((0, _getPrototypeOf2["default"])(MiuraDevice.prototype), "deactivateFormFactors", this).call(this, formFactors);
      Log.debug(function () {
        var _context20, _context21;

        return (0, _concat["default"])(_context20 = (0, _concat["default"])(_context21 = "Deactivating form factors [".concat(Util.getPropertyName(_retailPaymentDevice.FormFactor, formFactors), "] on '")).call(_context21, _this8.id, "'. Tx State: ")).call(_context20, _this8._inTransactionState);
      });

      if (this._inTransactionState) {
        this._inTransactionState = false;
        this.terminal.abortTransaction(function () {
          Log.debug(function () {
            return "Aborted contactless tx on ".concat(_this8.id);
          });
        });
        var sFormFactors = new _set["default"](formFactors);

        if (sFormFactors.has(_retailPaymentDevice.FormFactor.MagneticCardSwipe) || sFormFactors.has(_retailPaymentDevice.FormFactor.Chip)) {
          this.terminal.registerForCardEvents(false, function () {
            Log.debug(function () {
              return "Deactivated swipe and chip on ".concat(_this8.id);
            });
          });
        }
      } else {
        Log.debug(function () {
          return "Device not in transaction state... Will not send abort to ".concat(_this8.id);
        });
      }

      callback();
    }
  }, {
    key: "abortTransaction",
    value: function abortTransaction(context) {
      var _this9 = this;

      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      Log.debug(function () {
        return "Aborting tx on '".concat(_this9.id, "'");
      });
      (0, _get2["default"])((0, _getPrototypeOf2["default"])(MiuraDevice.prototype), "abortTransaction", this).call(this, context);

      if (!this.isConnected()) {
        callback();
      } else {
        this.deactivateFormFactors([_retailPaymentDevice.FormFactor.EmvCertifiedContactless], callback);
      }
    }
  }, {
    key: "postTransactionCleanup",
    value: function postTransactionCleanup() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      Log.debug('Soft-resetting the terminal as part of post-transaction cleanup');
      this.terminal.softReset(function (err) {
        callback(err);
      });
    }
  }, {
    key: "getBatteryInfo",
    value: function getBatteryInfo() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      if (this.hasState(_deviceState["default"].softwareUpdate)) {
        callback(_retailPaymentDevice.deviceError.cannotAcceptMessage);
        return;
      } // Do not check if Device is connected as re-establishing a connection after software reset depends on pinging for
      // battery level at all times


      this.terminal.getBatteryLevel(function (err, batteryInfo) {
        if (err) {
          Log.error("Could not retrieve battery info. Error: ".concat(err));
        } else {
          Log.debug(function () {
            return "Received battery information ".concat(batteryInfo);
          });
        }

        callback(err, batteryInfo);
      });
    }
    /**
     * Returns true if the device is in a state to accept commands
     */

  }, {
    key: "canPushCommands",
    value: function canPushCommands() {
      var _this10 = this;

      if (!this.isConnected()) {
        Log.debug(function () {
          return "Cannot push command to ".concat(_this10.id, " as it is not connected");
        });
        return false;
      }

      if (this.hasState(_deviceState["default"].hardResetting)) {
        Log.debug(function () {
          return "Cannot push command to ".concat(_this10.id, " as it is in a hard reset state");
        });
        return false;
      }

      return true;
    }
  }, {
    key: "_startContactlessTx",
    value: function _startContactlessTx(context) {
      var _this11 = this;

      var invoice = context.invoice;
      this._inTransactionState = true;
      var transactionType = context.type === _retailPaymentDevice.TransactionType.Sale || context.type === _retailPaymentDevice.TransactionType.Auth || context.type === _retailPaymentDevice.TransactionType.Vault ? 0 : 20;
      var amount = 0.01;

      if (!context.isTransactionVaultOnly) {
        amount = context.isRefund() ? context.refundAmount : invoice.total;
      }

      this.terminal.startContactlessTransaction(0, transactionType, _paypalInvoicing.Currency.toCents(invoice.currency, amount), this.currencies[context.invoice.currency].iso4217, function (err, clResult) {
        _this11._inTransactionState = false;

        if (err && (err === _retailPaymentDevice.deviceError.paymentCancelled || err === _retailPaymentDevice.deviceError.deviceNotConnected)) {
          Log.debug(function () {
            return "Contactless reader was deactivated on ".concat(_this11.id, ". Card reader is out of transaction state");
          });

          _this11.emit(_retailPaymentDevice.PaymentDevice.Event.contactlessReaderDeactivated, err);

          return;
        }

        if (err && (context.type === _retailPaymentDevice.TransactionType.Sale || context.type === _retailPaymentDevice.TransactionType.Auth || context.type === _retailPaymentDevice.TransactionType.Vault || context.type === _retailPaymentDevice.TransactionType.Refund && err.code !== _retailPaymentDevice.deviceError.nfcNotAllowed.code)) {
          Log.debug(function () {
            return "Error received from starting contactless tx ".concat(err);
          }); // Essentially, in case of refunds, treat the decline as a success and move on.

          _this11.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, err, _retailPaymentDevice.CardPresentEvent.cardDataRead, _retailPaymentDevice.FormFactor.EmvCertifiedContactless);

          return;
        }

        Log.debug(function () {
          return "Received ICC response from card tap: ".concat(clResult);
        });
        var card = new _CardStatus["default"](clResult).getPresentedCard(_this11);
        Log.debug(function () {
          return "Card object updated with emv response: ".concat(card);
        });
        _this11._inTransactionState = true;

        _this11.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.cardDataRead, _retailPaymentDevice.FormFactor.EmvCertifiedContactless, {
          card: card
        });
      });
    }
  }, {
    key: "_readCardData",
    value: function _readCardData(card, context) {
      var _this12 = this;

      var tt = _Terminal.MiuraTransactionType.SALE;
      var amount = context.invoice.total; // TODO not sure SALE is the right type for an auth from the terminal's perspective?

      if (context.type === _retailPaymentDevice.TransactionType.Refund) {
        tt = _Terminal.MiuraTransactionType.REFUND;
        amount = context.refundAmount;
      } else if (context.quickChipEnabled && context.invoice.total.isEqualTo(0)) {
        // SEND $1 to Start Quick Chip Txn
        amount = 1;
      }

      this.terminal.startICCTransaction(0, tt, _paypalInvoicing.Currency.toCents(context.invoice.currency, amount).toString(), this.currencies[context.invoice.currency].iso4217, function (err, clResult) {
        if (err) {
          var error = err;

          if (clResult && clResult.apdu && clResult.apdu.sw2 === 0x41) {
            error = _retailPaymentDevice.deviceError.cancelReadCardData;
          }

          _this12.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, error, _retailPaymentDevice.CardPresentEvent.cardDataRead, _retailPaymentDevice.FormFactor.Chip);

          return;
        }

        if (clResult instanceof _retailPaymentDevice.AvailableApplications) {
          _this12._inTransactionState = true;

          _this12.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.appSelectionRequired, _retailPaymentDevice.FormFactor.Chip, {
            card: card,
            availableApps: clResult
          });

          return;
        }

        Log.debug(function () {
          return "Received ICC response from card insert: ".concat(clResult);
        });
        var cardMetadata = (0, _cardMetadataParser["default"])(card.formFactor, clResult);
        Util.extend(card, cardMetadata, true);
        Log.debug(function () {
          return "Card object updated with emv response: ".concat(card);
        });

        if (clResult.apdu.template === 0xE3) {
          _this12.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.cardDataRead, _retailPaymentDevice.FormFactor.Chip, {
            card: card,
            offlineApproval: true
          });

          return;
        }

        if (clResult.apdu.template === 0xE4) {
          _this12._inTransactionState = true;

          _this12.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.cardDataRead, _retailPaymentDevice.FormFactor.Chip, {
            card: card
          });

          return;
        }

        Log.warn("Contact tx Response from device was not handled ".concat(clResult));

        _this12.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _retailPaymentDevice.deviceError.badEmvData, _retailPaymentDevice.CardPresentEvent.cardDataRead, _retailPaymentDevice.FormFactor.Chip);
      });
    }
  }, {
    key: "_deviceEvent",
    value: function _deviceEvent(m) {
      if (m instanceof _TerminalStatus["default"]) {
        if (m.changeType === _TerminalStatus["default"].Constants.PinEntryStateChange) {
          var pinEvent = new _retailPaymentDevice.PinEvent();
          pinEvent.digits = m.pinDigits;
          pinEvent.complete = m.pinComplete;
          pinEvent.correct = m.pinCorrect;
          pinEvent.isLastAttempt = m.lastPinAttempt;
          pinEvent.failureReason = m.pinFailureReason;
          this.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, null, _retailPaymentDevice.CardPresentEvent.pinEvent, _retailPaymentDevice.FormFactor.Chip, pinEvent);
          return;
        }

        if (m.changeType === _TerminalStatus["default"].Constants.SeePhone) {
          this.app.display({
            message: 'Please ask customer to SEE PHONE',
            cancel: 'done',
            audio: {
              file: 'beep',
              playCount: 2
            }
          }, function () {});
          return;
        }
      } // 'X' button was tapped


      if (m.keyCode === 0x1B) {
        Log.debug('X button on terminal was tapped. Will try to cancel an ongoing payment');
        this.emit(_retailPaymentDevice.PaymentDevice.Event.cancelRequested);
      } else if (m.keyCode === 0x0d) {
        Log.debug('OK button was tapped on the terminal.');
        this.emit(_retailPaymentDevice.PaymentDevice.Event.proceed);
      }
    }
  }, {
    key: "_readConfigPair",
    value: function _readConfigPair(tlv) {
      var key;
      var val = true;

      var _iterator2 = _createForOfIteratorHelper((0, _values["default"])(tlv.parse())),
          _step2;

      try {
        for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
          var v = _step2.value;

          if (v.tagNumber === _MiuraTags["default"].MiuraIdentifier.number) {
            key = v.parse();
          } else if (v.tagNumber === _MiuraTags["default"].MiuraVersionInformation.number) {
            val = v.parse();
          }
        }
      } catch (err) {
        _iterator2.e(err);
      } finally {
        _iterator2.f();
      }

      if ((0, _indexOf["default"])(key).call(key, '-MPI') >= 0) {
        this.mpi = _parseVersionInfo(key, val);
      } else if ((0, _indexOf["default"])(key).call(key, 'OS') >= 0) {
        this.os = _parseVersionInfo(key, val);
      }
    }
  }, {
    key: "formFactors",
    get: function get() {
      return this.terminal.formFactors;
    }
  }, {
    key: "_isKeyInjectionRequired",
    get: function get() {
      if (this.forceRki) {
        return true;
      } // TODO this may happen before the merchant is available, so we need to decide how to change ready events to handle this possibility
      // TODO this should be driven off a config somewhere (feature map)


      if (this.app.getMerchant() && this.app.getMerchant().country === 'AU') {
        return !(this.p2pe.pin && this.p2pe.sred);
      }

      return !(this.p2pe.pin || this.p2pe.sred);
    }
  }]);
  return MiuraDevice;
}(_retailPaymentDevice.PaymentDevice);

exports["default"] = MiuraDevice;

},{"./ConnectionFlow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/ConnectionFlow.js","./MiuraTags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraTags.js","./Terminal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/Terminal.js","./cardMetadataParser":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/cardMetadataParser.js","./deviceState":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/deviceState.js","./messages/CardStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/CardStatus.js","./messages/TerminalStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/TerminalStatus.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/interopRequireWildcard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireWildcard.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/paypal-invoicing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.match":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.match.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js","regenerator-runtime/runtime":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regenerator-runtime/runtime.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraTags.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _tlvlib = require("tlvlib");
/* DO NOT EDIT THIS FILE, IT IS AUTOMATICALLY GENERATED BY gulpfile.js */


var Tags = {
  MiuraFileLength: new _tlvlib.DefinedTag('MiuraFileLength', 0x80, _tlvlib.ValueFormat.Numeric),
  MiuraCommandData: new _tlvlib.DefinedTag('MiuraCommandData', 0xE0, _tlvlib.ValueFormat.TypeLengthValueList),
  MiuraConfigurationInformation: new _tlvlib.DefinedTag('MiuraConfigurationInformation', 0xED, _tlvlib.ValueFormat.TypeLengthValueList),
  MiuraSoftwareInformation: new _tlvlib.DefinedTag('MiuraSoftwareInformation', 0xEF, _tlvlib.ValueFormat.TypeLengthValueList),
  MiuraIdentifier: new _tlvlib.DefinedTag('MiuraIdentifier', 0xDF0D, _tlvlib.ValueFormat.Alpha),
  MiuraVersionInformation: new _tlvlib.DefinedTag('MiuraVersionInformation', 0xDF7F, _tlvlib.ValueFormat.Alpha),
  MiuraStateChangeReason: new _tlvlib.DefinedTag('MiuraStateChangeReason', 0xC3, _tlvlib.ValueFormat.Binary, 1),
  MiuraStateChangeText: new _tlvlib.DefinedTag('MiuraStateChangeText', 0xC4, _tlvlib.ValueFormat.Alpha),
  MiuraCardStatusInfo: new _tlvlib.DefinedTag('MiuraCardStatusInfo', 0x48, _tlvlib.ValueFormat.Binary, 2),
  MiuraSREDData: new _tlvlib.DefinedTag('MiuraSREDData', 0xdfae02, _tlvlib.ValueFormat.Binary),
  MiuraKSN: new _tlvlib.DefinedTag('MiuraKSN', 0xdfae03, _tlvlib.ValueFormat.Binary),
  MiuraMaskedICCTrack2: new _tlvlib.DefinedTag('MiuraMaskedICCTrack2', 0xdfae57, _tlvlib.ValueFormat.CompressedAlpha),
  MiuraMaskedPan: new _tlvlib.DefinedTag('MiuraMaskedPan', 0xdfae5a, _tlvlib.ValueFormat.AlphaNumeric),
  MiuraMaskedTrack1: new _tlvlib.DefinedTag('MiuraMaskedTrack1', 0xdfae21, _tlvlib.ValueFormat.Alpha),
  MiuraMaskedTrack2: new _tlvlib.DefinedTag('MiuraMaskedTrack2', 0xdfae22, _tlvlib.ValueFormat.Alpha),
  MiuraMaskedTrack3: new _tlvlib.DefinedTag('MiuraMaskedTrack3', 0xdfae23, _tlvlib.ValueFormat.Alpha),
  MiuraMaskedContactlessTrack2: new _tlvlib.DefinedTag('MiuraMaskedContactlessTrack2', 0xdfae6b, _tlvlib.ValueFormat.Alpha),
  MiuraKeyboardData: new _tlvlib.DefinedTag('MiuraKeyboardData', 0xdfa205, _tlvlib.ValueFormat.Binary, 1),
  MiuraNumericData: new _tlvlib.DefinedTag('MiuraNumericData', 0xdfa208, _tlvlib.ValueFormat.AlphaNumeric),
  MiuraCardholderVerificationStatus: new _tlvlib.DefinedTag('MiuraCardholderVerificationStatus', 0xdf28, _tlvlib.ValueFormat.Binary, 1),
  MiuraDigitsInPinBuffer: new _tlvlib.DefinedTag('MiuraDigitsInPinBuffer', 0xdfa101, _tlvlib.ValueFormat.Numeric),
  MiuraPinEntryStatus: new _tlvlib.DefinedTag('MiuraPinEntryStatus', 0xdfa102, _tlvlib.ValueFormat.Binary, 1),
  MiuraP2PEStatus: new _tlvlib.DefinedTag('MiuraP2PEStatus', 0xdfae01, _tlvlib.ValueFormat.Binary, 1),
  MiuraFileWriteOffset: new _tlvlib.DefinedTag('MiuraFileWriteOffset', 0xDFA301, _tlvlib.ValueFormat.Binary),
  MiuraFileWriteLength: new _tlvlib.DefinedTag('MiuraFileWriteLength', 0xDFA302, _tlvlib.ValueFormat.Binary),
  MiuraFileWriteTimeout: new _tlvlib.DefinedTag('MiuraFileWriteTimeout', 0xDFA303, _tlvlib.ValueFormat.Binary, 1),
  MiuraFileMD5: new _tlvlib.DefinedTag('MiuraFileMD5', 0xDFA304, _tlvlib.ValueFormat.Binary),
  MiuraContactlessType: new _tlvlib.DefinedTag('MiuraContactlessType', 0xdf30, _tlvlib.ValueFormat.Binary, 2),
  MiuraBatteryData: new _tlvlib.DefinedTag('MiuraBatteryData', 0xdfa209, _tlvlib.ValueFormat.Binary, 1),
  MiuraImageData: new _tlvlib.DefinedTag('MiuraImageData', 0xDFAC03, _tlvlib.ValueFormat.AlphaNumeric),
  MiuraTextData: new _tlvlib.DefinedTag('MiuraTextData', 0xDFAC02, _tlvlib.ValueFormat.AlphaNumeric),
  MiuraMediaCoordinates: new _tlvlib.DefinedTag('MiuraMediaCoordinates', 0xDFAC01, _tlvlib.ValueFormat.Numeric, 2)
};
var _default = Tags;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/Parser.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.to-string");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.MiuraParser = exports.ParserEvent = void 0;

var _construct = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/reflect/construct"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticore = _interopRequireDefault(require("manticore"));

var _events = require("events");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _tlvlib = require("tlvlib");

var _MiuraTags = _interopRequireDefault(require("./MiuraTags"));

function _createSuper(Derived) {
  return function () {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (_isNativeReflectConstruct()) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = (0, _construct["default"])(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_construct["default"]) return false;
  if (_construct["default"].sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Date.prototype.toString.call((0, _construct["default"])(Date, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('miura.parser');
var ParserEvent = {
  unsolicited: 'unsolicited',
  response: 'response'
};
exports.ParserEvent = ParserEvent;

function verifyLrc(buffer) {
  var lrc = 0;

  for (var i = 0; i < buffer.length - 1; i++) {
    lrc ^= buffer[i];
  }

  lrc &= 0xFF;

  if (lrc !== buffer[buffer.length - 1]) {
    Log.warn('LRC mismatch', {
      Expected: lrc.toString(16),
      Actual: buffer[buffer.length - 1].toString(16)
    });
    throw _retailPaymentDevice.deviceError.dataValidationError.withDevMessage('Miura packet error checking failed');
  }
}

var MiuraParser = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(MiuraParser, _EventEmitter);

  var _super = _createSuper(MiuraParser);

  function MiuraParser() {
    var _this;

    (0, _classCallCheck2["default"])(this, MiuraParser);
    _this = _super.call(this);
    _this.partial = null;
    return _this;
  }

  (0, _createClass2["default"])(MiuraParser, [{
    key: "reset",
    value: function reset() {
      this.partial = null;
    }
  }, {
    key: "updateLastResponse",
    value: function updateLastResponse(rz) {
      var _rz$apdu, _rz$tlvs, _rz$apdu5, _rz$apdu6, _rz$apdu6$sw, _rz$apdu7, _rz$apdu7$sw, _rz$raw;

      var isBattery = (rz === null || rz === void 0 ? void 0 : (_rz$apdu = rz.apdu) === null || _rz$apdu === void 0 ? void 0 : _rz$apdu.template) === 0xE1 && !!(rz === null || rz === void 0 ? void 0 : (_rz$tlvs = rz.tlvs) === null || _rz$tlvs === void 0 ? void 0 : (0, _find["default"])(_rz$tlvs).call(_rz$tlvs, _MiuraTags["default"].MiuraBatteryData));

      if (!isBattery) {
        var _rz$apdu2, _rz$apdu3, _rz$apdu3$sw, _rz$apdu4, _rz$apdu4$sw;

        Log.debug('Response', {
          type: (rz === null || rz === void 0 ? void 0 : rz.isUnsolicited) ? 'UNSOLICITED' : 'RESPONSIVE',
          template: (rz === null || rz === void 0 ? void 0 : (_rz$apdu2 = rz.apdu) === null || _rz$apdu2 === void 0 ? void 0 : _rz$apdu2.template) ? rz.apdu.template.toString(16) : 'EMPTY',
          SW1: rz === null || rz === void 0 ? void 0 : (_rz$apdu3 = rz.apdu) === null || _rz$apdu3 === void 0 ? void 0 : (_rz$apdu3$sw = _rz$apdu3.sw1) === null || _rz$apdu3$sw === void 0 ? void 0 : _rz$apdu3$sw.toString(16),
          SW2: rz === null || rz === void 0 ? void 0 : (_rz$apdu4 = rz.apdu) === null || _rz$apdu4 === void 0 ? void 0 : (_rz$apdu4$sw = _rz$apdu4.sw2) === null || _rz$apdu4$sw === void 0 ? void 0 : _rz$apdu4$sw.toString(16)
        });
      }

      Log.developer('Response', {
        type: (rz === null || rz === void 0 ? void 0 : rz.isUnsolicited) ? 'UNSOLICITED' : 'RESPONSIVE',
        template: (rz === null || rz === void 0 ? void 0 : (_rz$apdu5 = rz.apdu) === null || _rz$apdu5 === void 0 ? void 0 : _rz$apdu5.template) ? rz.apdu.template.toString(16) : 'EMPTY',
        SW1: rz === null || rz === void 0 ? void 0 : (_rz$apdu6 = rz.apdu) === null || _rz$apdu6 === void 0 ? void 0 : (_rz$apdu6$sw = _rz$apdu6.sw1) === null || _rz$apdu6$sw === void 0 ? void 0 : _rz$apdu6$sw.toString(16),
        SW2: rz === null || rz === void 0 ? void 0 : (_rz$apdu7 = rz.apdu) === null || _rz$apdu7 === void 0 ? void 0 : (_rz$apdu7$sw = _rz$apdu7.sw2) === null || _rz$apdu7$sw === void 0 ? void 0 : _rz$apdu7$sw.toString(16),
        raw: rz === null || rz === void 0 ? void 0 : (_rz$raw = rz.raw) === null || _rz$raw === void 0 ? void 0 : _rz$raw.toString('hex')
      });
    }
  }, {
    key: "updateLastPartial",
    value: function updateLastPartial() {
      Log.debug('Partial Response');
    }
  }, {
    key: "received",
    value: function received(data) {
      var raw;

      try {
        raw = Buffer.isBuffer(data) ? data : Buffer.from(data, 'base64');

        if (this.incompletePacket) {
          raw = (0, _concat["default"])(Buffer).call(Buffer, [this.incompletePacket, raw]);
          delete this.incompletePacket;
        }

        if (raw.length < 3 || raw.length < raw[2] + 4) {
          this.incompletePacket = raw;
          Log.debug('Incomplete packet received.');
          return;
        }

        this._completePacket(raw);
      } catch (x) {
        var _context, _context2;

        Log.error((0, _concat["default"])(_context = (0, _concat["default"])(_context2 = "Failed processing Miura packet: ".concat(x.message, ", stack: ")).call(_context2, x.stack, ", ")).call(_context, x));
        throw x;
      }
    }
  }, {
    key: "_emitAsync",
    value: function _emitAsync(event, data) {
      var _this2 = this;

      _manticore["default"].setTimeout(function () {
        _this2.emit(event, data);
      }, 0);
    }
  }, {
    key: "_completePacket",
    value: function _completePacket(raw) {
      var rz = null;

      try {
        rz = this._readResponse(raw);
      } catch (x) {
        Log.error(function () {
          var _context3;

          return (0, _concat["default"])(_context3 = "Failed to read terminal response: ".concat(x.message, "\n")).call(_context3, x.stack);
        });
      }

      if (!rz) {
        return; // No message here, likely a partial
      }

      this.updateLastResponse(rz);

      if (rz.isUnsolicited) {
        this._emitAsync(ParserEvent.unsolicited, rz);
      } else {
        this._emitAsync(ParserEvent.response, rz);
      }
    }
  }, {
    key: "_readResponse",
    value: function _readResponse(_buffer) {
      _buffer = this._validateBuffer(_buffer);
      var isUnsolicited = false;

      if (_buffer[1] === 0x40) {
        isUnsolicited = true;
      }

      if (_buffer[1] === 1) {
        // Partial packet.
        this.updateLastPartial();

        this._processPartial(_buffer);

        return null;
      }

      var merged = this._applyPartial(_buffer[2], _buffer);

      var mergedBuffer = merged.buffer;
      var ret = new _retailPaymentDevice.CardReaderResponse(merged.buffer, merged.length, isUnsolicited);

      if (ret.length + 4 !== mergedBuffer.length) {
        Log.warn(function () {
          var _context4;

          return (0, _concat["default"])(_context4 = "Received response packet with non-matching length bytes. Expected ".concat(ret.length + 4, ", got ")).call(_context4, mergedBuffer.length);
        });
      }

      var rawBytes = isUnsolicited ? false : this.expectRawBytes;

      try {
        ret.apdu = new _tlvlib.ApduResponse(mergedBuffer, 3, ret.length, rawBytes);
      } catch (x) {
        var _context5;

        Log.error((0, _concat["default"])(_context5 = "Failed to parse APDU from raw response: ".concat(mergedBuffer.toString('hex'), "\nError: ")).call(_context5, x.message));
      }

      return ret;
    }
  }, {
    key: "_processPartial",
    value: function _processPartial(buffer) {
      Log.debug(function () {
        var _context6;

        return (0, _concat["default"])(_context6 = "Received partial packet of ".concat(buffer.length - 4, " bytes ")).call(_context6, buffer.toString('hex'));
      });

      if (this.partial === null) {
        this.partial = [];
        this.partialLen = 0;
        this.partial.push(Buffer.from('000000', 'hex')); // fake the preamble
      }

      this.partialLen += buffer[2];
      this.partial.push((0, _slice["default"])(buffer).call(buffer, 3, buffer.length - 1));
    }
  }, {
    key: "_applyPartial",
    value: function _applyPartial(length, buffer) {
      if (this.partial) {
        this.partial.push((0, _slice["default"])(buffer).call(buffer, 3, buffer.length - 1));
        this.partial.push(Buffer.from('00', 'hex'));
        Log.debug(function () {
          return "Final packet of partial ".concat(buffer.toString('hex'));
        });
        buffer = (0, _concat["default"])(Buffer).call(Buffer, this.partial);
        length += this.partialLen;
        Log.debug(function () {
          var _context7;

          return (0, _concat["default"])(_context7 = "Reassembled ".concat(buffer.length, " bytes (")).call(_context7, length, ").");
        });
        this.partial = null;
        this.partialLen = 0;
      }

      return {
        buffer: buffer,
        length: length
      };
    }
  }, {
    key: "_validateBuffer",
    value: function _validateBuffer(buffer) {
      var _this3 = this;

      if (buffer[0] !== 0x01) {
        Log.warn(function () {
          return "Received response packet with non-standard NAD byte: ".concat(buffer[0]);
        });
      }

      if (buffer[1] !== 0x00 && buffer[1] !== 0x40 && buffer[1] !== 1) {
        Log.warn(function () {
          return "Received response packet with non-standard PCB byte: ".concat(buffer[1]);
        });
      }

      if (buffer.length > buffer[2] + 4) {
        // Overflow.
        var spill = (0, _slice["default"])(buffer).call(buffer, buffer[2] + 4, buffer.length);
        buffer = (0, _slice["default"])(buffer).call(buffer, 0, buffer[2] + 4);

        _manticore["default"].setTimeout(function () {
          _this3.received(spill);
        }, 0);
      }

      verifyLrc(buffer);
      return buffer;
    }
  }]);
  return MiuraParser;
}(_events.EventEmitter);

exports.MiuraParser = MiuraParser;

}).call(this)}).call(this,require("buffer").Buffer)
},{"./MiuraTags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraTags.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/SoftwareUpdate/MiuraDeviceUpdate.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.exec");

require("core-js/modules/es.regexp.to-string");

require("core-js/modules/es.string.replace");

require("core-js/modules/es.string.split");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _getIteratorMethod2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator-method"));

var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));

var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));

var _construct = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/reflect/construct"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _md = _interopRequireDefault(require("md5"));

var _async = _interopRequireDefault(require("async"));

var _manticore = _interopRequireDefault(require("manticore"));

var _deviceState = _interopRequireDefault(require("../deviceState"));

var _Flow = _interopRequireDefault(require("../common/Flow"));

function _createSuper(Derived) {
  return function () {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (_isNativeReflectConstruct()) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = (0, _construct["default"])(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_construct["default"]) return false;
  if (_construct["default"].sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Date.prototype.toString.call((0, _construct["default"])(Date, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

function _createForOfIteratorHelper(o) {
  if (typeof _symbol["default"] === "undefined" || (0, _getIteratorMethod2["default"])(o) == null) {
    if ((0, _isArray["default"])(o) || (o = _unsupportedIterableToArray(o))) {
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var it,
      normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = (0, _getIterator2["default"])(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context36;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  var n = (0, _slice["default"])(_context36 = Object.prototype.toString.call(o)).call(_context36, 8, -1);
  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return (0, _from["default"])(n);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Log = (0, _manticoreLog["default"])('paymentDevice.miura.firmwareUpdate');
var deviceMessageId = _retailPaymentDevice.PaymentDevice.Message;
var TerminalMessageId = _retailPaymentDevice.PaymentDevice.Message;
var IKSN_BUFFER = Buffer.from('IKSN: ');
var blobStorage = 'B';
var TERMINAL_STREAM_TIMEOUT = 255;
var TERMINAL_CONNECTION_RETRY_LIMIT = 20;
var TERMINAL_CONNECTION_RETRY_TIMEOUT = 20000;
var TERMINAL_CONNECTION_DEFAULT_RETRY_TIMEOUT = 2500;
var MANTICORE_DEFAULT_SET_TIMEOUT = 5000;
var FILE_CHUNK_SIZE = 0x20000;
var maxAttempts = 2;

if (FILE_CHUNK_SIZE % 4) {
  throw new Error('FILE_CHUNK_SIZE MUST BE DIVISIBLE BY 4!!!');
}

var lastMiuraLogState;
var switchedOff;
var isProgressFileFetches = {};
/**
 * Shut off the Miura debug logs except our own component,
 * then reset them to where they were when done.
 * @param on
 */

function miuraLogs(on) {
  var exl = require('@paypalcorp/manticore-log')["default"]('paymentDevice.miuraDevice'); // eslint-disable-line global-require


  if (on && switchedOff) {
    switchedOff = false;

    if (lastMiuraLogState) {
      exl.Config.level = lastMiuraLogState;
    } else {
      delete exl.Config.level;
    }

    delete Log.Config.level;
    Log.debug('Re-enabled logs.');
  } else if (!on && !switchedOff) {
    Log.debug('Squelching Miura debug logs.');
    lastMiuraLogState = exl.Config.level;
    switchedOff = true;
    exl.Config.level = 'INFO';
    Log.Config.level = 'DEBUG';
  }
}
/**
 * While USB is not the default, make sure MPI-Dynamic has it
 * @param rz
 */


function fixMpiDynamic(rz) {
  var mpiDynamic = Buffer.from(rz.body, 'base64').toString();

  if (!(0, _indexOf["default"])(mpiDynamic).call(mpiDynamic, '[USB]')) {
    mpiDynamic = "[USB]\n\tdefault = serial\n".concat(mpiDynamic);
    rz.body = Buffer.from(mpiDynamic).toString('base64');
  }
}

function getNameFromUrl(url) {
  var finalName = url.split('/');
  finalName = finalName[finalName.length - 1];
  return finalName;
}

function pushModules(requiredUrlArray, urls) {
  if (requiredUrlArray) {
    var _iterator = _createForOfIteratorHelper(urls),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var url = _step.value;
        requiredUrlArray.push(url);
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }
  }
}

function getOne(url, cb) {
  var retryCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;

  _manticore["default"].getItem(url, blobStorage, function (error, item) {
    if (item) {
      Log.debug(function () {
        return "Retrieved from CACHE ".concat(url);
      });

      _manticore["default"].setTimeout(function () {
        return cb(null, item);
      }, 0);

      return;
    } // If a fetch is already in progress, and we're not it, don't do it twice.


    if (retryCount === 0) {
      if (isProgressFileFetches[url]) {
        Log.debug(function () {
          return "Waiting for existing fetch of ".concat(url);
        });
        isProgressFileFetches[url].push(cb);
        return;
      }

      isProgressFileFetches[url] = [cb];
    }

    Log.debug(function () {
      return "Fetching firmware update file ".concat(url);
    });
    var start = new Date();

    _manticore["default"].http({
      url: url,
      format: 'binary'
    }, function (err, rz) {
      var timeElapsed = new Date() - start;
      var seconds = Math.round(timeElapsed % 60);

      if (err) {
        var _context, _context2, _context3, _context4;

        Log.error((0, _concat["default"])(_context = (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = (0, _concat["default"])(_context4 = "Attempt ".concat(retryCount || 0, "/")).call(_context4, maxAttempts, ". Duration: ")).call(_context3, seconds, "s. Download failed for ")).call(_context2, url, " with error: ")).call(_context, err, ")"));
      } else {
        Log.debug(function () {
          var _context5;

          return (0, _concat["default"])(_context5 = "Duration: ".concat(seconds, "s. Done with ")).call(_context5, url);
        });
      }

      if (!err && (0, _indexOf["default"])(url).call(url, 'MPI-Dynamic.cfg') > 0) {
        fixMpiDynamic(rz);
      }

      if (!err) {
        _manticore["default"].setItem(url, blobStorage, rz.body, function () {});
      } else if (retryCount < maxAttempts) {
        Log.warn(function () {
          return "Fetch failed for ".concat(url, ". Starting retry #{retryCount+1}");
        });
        getOne(url, cb, (retryCount || 0) + 1);
        return;
      }

      var _iterator2 = _createForOfIteratorHelper(isProgressFileFetches[url]),
          _step2;

      try {
        for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
          var callback = _step2.value;
          callback(err, rz);
        }
      } catch (err) {
        _iterator2.e(err);
      } finally {
        _iterator2.f();
      }

      delete isProgressFileFetches[url];
    });
  });
}

function chunkItOut(options, callback, base64Offset, startTime, isRetry) {
  var actualStartTime = startTime || new Date().getTime();
  var actualBase64offset = base64Offset || 0;
  var binaryOffset = actualBase64offset * (3 / 4);

  if (options.file.length - actualBase64offset > FILE_CHUNK_SIZE) {
    var chunk = options.file.substring(actualBase64offset, actualBase64offset + FILE_CHUNK_SIZE);
    Log.debug(function () {
      var _context6, _context7, _context8;

      return (0, _concat["default"])(_context6 = (0, _concat["default"])(_context7 = (0, _concat["default"])(_context8 = "Pushing chunk of file: ".concat(options.name, " ")).call(_context8, FILE_CHUNK_SIZE * (3 / 4), "@")).call(_context7, binaryOffset, " of ")).call(_context6, options.file.length * (3 / 4));
    });
    options.device.terminal.Config.streamBinary(chunk, binaryOffset, TERMINAL_STREAM_TIMEOUT, false, function (writeError, writeRz) {
      var _writeRz$apdu;

      if (writeError || !(writeRz === null || writeRz === void 0 ? void 0 : (_writeRz$apdu = writeRz.apdu) === null || _writeRz$apdu === void 0 ? void 0 : _writeRz$apdu.isSuccess)) {
        if (isRetry) {
          Log.error('Aborting file send early.');

          if (writeRz) {
            Log.warn(writeRz.toString());
          }

          callback(writeError, writeRz);
        } else {
          var _context9;

          Log.warn((0, _concat["default"])(_context9 = "Failed to push a chunk of file ".concat(options.name, ". Will retry. Response: ")).call(_context9, writeRz)); // Give it a half a second to recover and try the same segment again

          _manticore["default"].setTimeout(function () {
            return chunkItOut(options, callback, actualBase64offset, binaryOffset, actualStartTime, true);
          }, 500);
        }

        return;
      }

      var progress = (0, _parseInt2["default"])((options.done + actualBase64offset + FILE_CHUNK_SIZE) * (100 / options.total), 10);
      options["this"].appAlert = options.device.app.display({
        title: _retailPaymentDevice.appMessage.SwUpdateInProgressWithDetails.title,
        message: {
          id: _retailPaymentDevice.appMessage.SwUpdateInProgressWithDetails.message,
          substitutions: {
            stage: options.stageId,
            progress: progress
          }
        },
        showActivity: true,
        replace: true
      });
      options.device.display({
        id: TerminalMessageId.SoftwareUpdateProgress,
        substitutions: {
          stage: options.stageId,
          progress: progress
        }
      }, function () {
        return chunkItOut(options, callback, actualBase64offset + FILE_CHUNK_SIZE, actualStartTime);
      });
    });
  } else {
    var _chunk = options.file.substring(actualBase64offset);

    Log.debug(function () {
      return "Completing transfer of ".concat(options.name);
    });
    options.device.terminal.Config.streamBinary(_chunk, binaryOffset, TERMINAL_STREAM_TIMEOUT, false, callback);
  }
}

function errorOrFailure(error, response) {
  if (!error && !response.apdu.isSuccess) {
    var _context10;

    return _retailPaymentDevice.deviceError.failureResponse.withDevMessage((0, _concat["default"])(_context10 = "Miura response indicates failure: 0x".concat(response.apdu.sw1.toString(16), " 0x")).call(_context10, response.apdu.sw2.toString(16)));
  }

  return error;
}

var MiuraDeviceUpdate = /*#__PURE__*/function (_DeviceUpdate) {
  (0, _inherits2["default"])(MiuraDeviceUpdate, _DeviceUpdate);

  var _super = _createSuper(MiuraDeviceUpdate);

  function MiuraDeviceUpdate(device) {
    var _this;

    (0, _classCallCheck2["default"])(this, MiuraDeviceUpdate);
    _this = _super.call(this, device);
    _this.files = {};
    _this.updates = {};
    return _this;
  }

  (0, _createClass2["default"])(MiuraDeviceUpdate, [{
    key: "beginDeviceUpdate",
    value: function beginDeviceUpdate(callback) {
      var _this2 = this;

      Log.info("Beginning SW Update on ".concat(this.device.id));
      this._hardResetNeeded = false;
      isProgressFileFetches = {};
      this.appAlert = this.device.app.display({
        title: _retailPaymentDevice.appMessage.SwUpdateInProgress.title,
        message: _retailPaymentDevice.appMessage.SwUpdateInProgress.message,
        showActivity: true
      });
      var updateSteps = [];

      if (this.device._isKeyInjectionRequired) {
        Log.debug('Key injection required');
        updateSteps.push(this.updateP2PE); // TODO Enable this
      }

      if (this.device.updates) {
        Log.debug("Found ".concat(this.device.updates.length, " module updates"));
        updateSteps.push(this.updateSWModules);
      }

      var flow = new _Flow["default"](this, updateSteps);
      flow.name = 'Firmware Update';
      flow.on('completed', function (err) {
        var _context13;

        var endTime = new Date();
        var timeDiff = endTime - _this2.startTime;
        var seconds = Math.round(timeDiff % 60);

        if (err) {
          var _context11, _context12;

          Log.error((0, _concat["default"])(_context11 = (0, _concat["default"])(_context12 = "SW Update on ".concat(_this2.device.id, " failed with error: ")).call(_context12, err, ". Time taken: ")).call(_context11, seconds, "s"));
        }

        Log.info((0, _concat["default"])(_context13 = "Firmware update completed on ".concat(_this2.device.id, ". Time taken: ")).call(_context13, seconds, "s")); // TODO Add total time taken

        if (_this2.appAlert) {
          _this2.appAlert.dismiss();
        }

        _this2.device.display({
          id: TerminalMessageId.SoftwareUpdateComplete
        }, function () {});

        callback(err, !err);
      });
      this.startTime = new Date();
      flow.start();
    }
  }, {
    key: "validateUpdateEligibility",
    value: function validateUpdateEligibility(callback) {
      var _this3 = this;

      var canUpdate = !(this.device.lastKnownBatteryInfo && this.device.lastKnownBatteryInfo.isLevelUpdateCritical);

      if (canUpdate) {
        callback();
        return;
      }

      this.device.display({
        id: deviceMessageId.RechargeNow
      }, function () {
        _this3.appAlert = _this3.device.app.display({
          title: _retailPaymentDevice.appMessage.SwUpdateFailed.title,
          message: _retailPaymentDevice.appMessage.SwUpdateFailed.messageBatteryLow,
          cancel: _retailPaymentDevice.appMessage.SwUpdate.buttons.ok
        }, function (av) {
          av.dismiss();
          callback(_retailPaymentDevice.deviceError.lowOnBattery);
        });
      });
    }
  }, {
    key: "updateP2PE",
    value: function updateP2PE(flow) {
      var p2peFlow = new _Flow["default"](this, this._displayInitMessage, this._initP2PE, this._disableLogs, this._getP2PEFile('initial_ksn', 'suggested-iksn.txt'), this._getP2PEFile('signed_product_signing_cert', 'prod-sign.crt'), this._getP2PEFile('signed_terminal_cert', 'terminal.crt'), this._getP2PEFile('signed_key_loading_cert', 'temp-keyload.crt'), this._enableLogs, this._displayFetchMessage, this._retrieveP2PEFilesFromServer, this._writeP2PEFilesToTerminal, this._importP2PEKeys, this._displayCompleteMessage);
      p2peFlow.name = 'P2PE Update Flow';
      p2peFlow.on('completed', function (err) {
        flow.nextOrAbort(err);
      });
      p2peFlow.start();
    }
  }, {
    key: "_disableLogs",
    value: function _disableLogs(flow) {
      Log.debug('Disabling miura logs');
      miuraLogs(false);
      flow.next(null);
    }
  }, {
    key: "_enableLogs",
    value: function _enableLogs(flow) {
      Log.debug('Enabling logs');
      miuraLogs(true);
      flow.next(null);
    }
  }, {
    key: "_displayInitMessage",
    value: function _displayInitMessage(flow) {
      this.appAlert = this.device.app.display({
        title: _retailPaymentDevice.appMessage.SwUpdateInitializing.title,
        message: _retailPaymentDevice.appMessage.SwUpdateInitializing.message,
        showActivity: true
      });
      this.device.display({
        id: TerminalMessageId.SoftwareUpdateProgress,
        substitutions: {
          stage: 'EncryptInit'
        }
      }, function (err) {
        flow.nextOrAbort(err);
      });
    }
  }, {
    key: "_displayFetchMessage",
    value: function _displayFetchMessage(flow) {
      Log.debug('Displaying Fetch message');
      this.appAlert = this.device.app.display({
        title: _retailPaymentDevice.appMessage.SwUpdateValidatingSecurityKeys.title,
        message: _retailPaymentDevice.appMessage.SwUpdateValidatingSecurityKeys.message,
        showActivity: true
      });
      this.device.display({
        id: TerminalMessageId.SoftwareUpdateProgress,
        substitutions: {
          stage: 'EncryptGet'
        }
      }, function (err) {
        flow.nextOrAbort(err);
      });
    }
  }, {
    key: "_displayCompleteMessage",
    value: function _displayCompleteMessage(flow) {
      Log.debug('Displaying complete message');
      this.appAlert = this.device.app.display({
        title: _retailPaymentDevice.appMessage.SwUpdateSecurityKeysInstalled.title,
        message: _retailPaymentDevice.appMessage.SwUpdateSecurityKeysInstalled.message,
        showActivity: true
      });
      this.device.display({
        id: TerminalMessageId.SoftwareUpdateProgress,
        substitutions: {
          stage: 'EncryptDone'
        }
      }, function (err) {
        flow.nextOrAbort(err);
      });
    }
  }, {
    key: "_initP2PE",
    value: function _initP2PE(flow) {
      Log.debug("Initializing P2PE on ".concat(this.device.id));

      if (this.device.p2pe.init) {
        Log.debug('P2PE already initialized');
        flow.next();
        return;
      }

      this.device.terminal.Config.initializeP2PE(function (err, rz) {
        var formattedErr = null;

        if (!err && !rz.apdu.isSuccess) {
          formattedErr = _retailPaymentDevice.deviceError.initializationFailed.withDevMessage('Failed to initialize device encryption keys.');
        }

        flow.nextOrAbort(formattedErr);
      });
    }
  }, {
    key: "_getP2PEFile",
    value: function _getP2PEFile(key, fileName) {
      var _this4 = this;

      return function (flow) {
        Log.debug(function () {
          var _context14;

          return (0, _concat["default"])(_context14 = "Retrieving file ".concat(fileName, " from ")).call(_context14, _this4.device.id);
        });

        _this4.device.terminal.Config.getFile(fileName, function (err, fileContent) {
          if (err) {
            var _context15, _context16;

            Log.error((0, _concat["default"])(_context15 = (0, _concat["default"])(_context16 = "Error on retrieving P2PE file ".concat(fileName, " from ")).call(_context16, _this4.device.id, ":  ")).call(_context15, err));
            flow.abortFlow(err);
            return;
          }

          _this4.files[key] = fileContent.toString();
          flow.next();
        });
      };
    }
  }, {
    key: "_retrieveP2PEFilesFromServer",
    value: function _retrieveP2PEFilesFromServer(flow) {
      var _this5 = this;

      Log.debug("Retrieving keys from ".concat(this.device.id));
      this.files.initial_ksn = this.files.initial_ksn.replace(/\n/g, '').replace('IKSN: ', '');
      this.device.app.getRemoteCardReaderKeys(this.files, this.device.manufacturer, this.device.model, function (err, keyResponse) {
        Log.debug(function () {
          return "Received RKI update response for this.device: ".concat(_this5.device);
        });

        if (err) {
          flow.abortFlow(err);
          return;
        }

        _this5.filesToWrite = [];
        _this5.fileWriteIndex = 0;

        for (var k in keyResponse.body) {
          if ({}.hasOwnProperty.call(keyResponse.body, k)) {
            _this5.filesToWrite.push(keyResponse.body[k]);
          }
        }

        Log.debug(function () {
          return "RKI Files to write:\n".concat((0, _stringify["default"])(_this5.filesToWrite));
        });
        flow.next();
      });
    }
  }, {
    key: "_writeP2PEFilesToTerminal",
    value: function _writeP2PEFilesToTerminal(flow) {
      var _this6 = this;

      if (this.filesToWrite.length > this.fileWriteIndex) {
        var f = this.filesToWrite[this.fileWriteIndex];
        this.device.terminal.Config.selectFile(f.filename, true, function (e) {
          var _context17;

          if (e) {
            flow.abortFlow(e);
            return;
          }

          var data = Buffer.from(f.content, f.type === 'BASE64' ? 'base64' : 'utf8');

          if ((0, _indexOf["default"])(_context17 = f.filename).call(_context17, '-iksn-') > 0 && (data.length < IKSN_BUFFER.length || !(0, _slice["default"])(data).call(data, 0, IKSN_BUFFER.length).equals(IKSN_BUFFER))) {
            // The content must start with IKSN:
            data = (0, _concat["default"])(Buffer).call(Buffer, [IKSN_BUFFER, data], IKSN_BUFFER.length + data.length);
          }

          var dataMD5 = (0, _md["default"])(data);
          Log.debug(function () {
            var _context18;

            return (0, _concat["default"])(_context18 = "Sending file: ".concat(data.toString('hex'), " \nMD5: ")).call(_context18, dataMD5);
          });

          _this6.device.terminal.Config.streamBinary(data, 0, 0xFF, dataMD5, function (writeError, writeResult) {
            if (writeError) {
              flow.abortFlow(writeError);
              return;
            }

            if (!writeResult.apdu.isSuccess) {
              flow.abortFlow(_retailPaymentDevice.deviceError.initializationFailed.withDevMessage('Failed to update encryption keys.'));
              return;
            }

            _this6.fileWriteIndex += 1;

            _this6._writeP2PEFilesToTerminal(flow);
          });
        });
      } else {
        flow.next();
      }
    }
  }, {
    key: "_importP2PEKeys",
    value: function _importP2PEKeys(flow) {
      Log.debug("Importing keys on ".concat(this.device.id));
      this.device.terminal.Config.importP2PE(function (err, rz) {
        var formattedErr = null;

        if (!err && !rz.apdu.isSuccess) {
          formattedErr = new Error(_retailPaymentDevice.deviceError.fileImportFailed.withDevMessage('Failed to import encryption keys.'));
        }

        flow.nextOrAbort(formattedErr);
      });
    }
  }, {
    key: "updateSWModules",
    value: function updateSWModules(flow) {
      var moduleUpdateFlow = new _Flow["default"](this, this._gatherFiles, this._updateOs, this._hardResetCardReader, this._tryReconnect, this._updateMPI, this._hardResetCardReader, this._tryReconnect, this._updateConfig, this._hardResetCardReader, this._tryReconnect);
      moduleUpdateFlow.name = 'Software Module Update Flow';
      moduleUpdateFlow.on('completed', function (err) {
        flow.nextOrAbort(err);
      });
      moduleUpdateFlow.start();
    }
  }, {
    key: "_generateSteps",
    value: function _generateSteps(module) {
      var steps = [];

      if (module.urls) {
        var _iterator3 = _createForOfIteratorHelper(module.urls),
            _step3;

        try {
          for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
            var url = _step3.value;
            steps.push({
              name: getNameFromUrl(url),
              url: url,
              version: module.version,
              reload: module.reload
            });
          }
        } catch (err) {
          _iterator3.e(err);
        } finally {
          _iterator3.f();
        }
      }

      if (module.subcomponents) {
        var _iterator4 = _createForOfIteratorHelper(module.subcomponents),
            _step4;

        try {
          for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
            var component = _step4.value;
            steps.push.apply(steps, (0, _toConsumableArray2["default"])(this._generateSteps(component)));
          }
        } catch (err) {
          _iterator4.e(err);
        } finally {
          _iterator4.f();
        }
      }

      return steps;
    }
  }, {
    key: "_gatherFiles",
    value: function _gatherFiles(flow) {
      var _this7 = this;

      var _iterator5 = _createForOfIteratorHelper(this.device.updates),
          _step5;

      try {
        var _loop = function _loop() {
          var u = _step5.value;

          var steps = _this7._generateSteps(u);

          _this7.updates[u.name] = steps;
          Log.debug(function () {
            var _context19;

            return (0, _concat["default"])(_context19 = "Gathered update ".concat(u.name, "\n")).call(_context19, (0, _stringify["default"])(steps));
          });
        };

        for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
          _loop();
        }
      } catch (err) {
        _iterator5.e(err);
      } finally {
        _iterator5.f();
      }

      this._fetchFiles(this.device, function (e) {
        Log.debug('Ready for software update.');
        flow.nextOrAbort(e);
      });
    }
  }, {
    key: "_fetchFiles",
    value: function _fetchFiles(device, callback) {
      var _this8 = this;

      var filesToFetch = [];
      var fetchCtr = 0;
      MiuraDeviceUpdate.needsUpdate(device, device.updates, filesToFetch);
      Log.debug(function () {
        return "Preparing to download ".concat(filesToFetch.length, " files");
      });

      _async["default"].eachSeries(filesToFetch, function (file, cb) {
        fetchCtr += 1;
        _this8.appAlert = _this8.device.app.display({
          title: _retailPaymentDevice.appMessage.SwUpdateDownloading.title,
          message: {
            id: _retailPaymentDevice.appMessage.SwUpdateDownloading.message,
            substitutions: {
              count: fetchCtr,
              total: filesToFetch.length
            }
          },
          showActivity: true
        });

        _this8.device.display({
          id: TerminalMessageId.SoftwareUpdateDownloading,
          substitutions: {
            count: fetchCtr,
            total: filesToFetch.length
          }
        }, function () {});

        getOne(file, cb);
      }, callback);
    }
  }, {
    key: "_sizeFiles",
    value: function _sizeFiles(steps, callback) {
      var _this9 = this;

      var size = 0;

      _async["default"].each(steps, function (step, cbFileFetched) {
        var url = step.url;

        _this9._getCachedFile(url, function (err, file) {
          if (file) {
            size += file.length;
          }

          cbFileFetched();
        });
      }, function () {
        return callback(size);
      });
    }
  }, {
    key: "_updateOs",
    value: function _updateOs(flow) {
      var osUpdates = this.updates.Miura_OS;

      if (!osUpdates || osUpdates.length === 0) {
        Log.debug('OS update not needed.');
        this._hardResetNeeded = false;
        flow.next();
        return;
      }

      this._hardResetNeeded = true;

      this._updateModules('OS', osUpdates, flow);
    }
  }, {
    key: "_updateMPI",
    value: function _updateMPI(flow) {
      var mpiUpdates = this.updates.Miura_MPI;

      if (!mpiUpdates || mpiUpdates.length === 0) {
        Log.debug('MPI update not needed.');
        this._hardResetNeeded = false;
        flow.next();
        return;
      }

      this._hardResetNeeded = true;

      this._updateModules('MPI', mpiUpdates, flow);
    }
  }, {
    key: "_updateConfig",
    value: function _updateConfig(flow) {
      var cfgUpdates = this.updates.Miura_CONFIG;

      if (!cfgUpdates || cfgUpdates.length === 0) {
        Log.debug('Config update not needed.');
        this._hardResetNeeded = false;
        flow.next();
        return;
      }

      this._hardResetNeeded = true;

      this._updateModules('Config', cfgUpdates, flow);
    }
  }, {
    key: "_updateModules",
    value: function _updateModules(stageId, steps, flow) {
      var _context20,
          _this10 = this;

      Log.info((0, _concat["default"])(_context20 = "Updating '".concat(stageId, "' with step(s)\n")).call(_context20, (0, _stringify["default"])(steps)));
      this.appAlert = this.device.app.display({
        title: _retailPaymentDevice.appMessage.SwUpdateInProgressWithDetails.title,
        message: {
          id: _retailPaymentDevice.appMessage.SwUpdateInProgressWithDetails.message,
          substitutions: {
            stage: stageId,
            progress: 0
          }
        },
        showActivity: true
      });
      this.device.display({
        id: TerminalMessageId.SoftwareUpdateProgress,
        substitutions: {
          stage: stageId,
          progress: '0'
        }
      }, function () {
        _this10._writeFiles(steps, stageId, flow);
      });
    }
  }, {
    key: "_writeFiles",
    value: function _writeFiles(steps, stageId, flow) {
      var _context21,
          _context22,
          _this11 = this;

      if (steps.length === 0) {
        Log.error('Attempting to write 0 files to device.');
        flow.next();
        return;
      }

      Log.info((0, _concat["default"])(_context21 = (0, _concat["default"])(_context22 = "Writing ".concat(steps.length, " ")).call(_context22, stageId, " firmware update file(s) to ")).call(_context21, this.device.id));
      var ix = 0;
      var totalSize = 0;
      var done = 0;
      var lastWasRetry = false;

      var writer = function writer() {
        var url = steps[ix].url;
        var name = steps[ix].name;
        Log.debug(function () {
          var _context23;

          return (0, _concat["default"])(_context23 = "Retrieving file ".concat(name, " from ")).call(_context23, url);
        });

        _this11._getCachedFile(url, function (err, file) {
          var _context24;

          if (err || !file) {
            flow.abortFlow(err || _retailPaymentDevice.deviceError.swUpdateFailed);
            return;
          }

          Log.info((0, _concat["default"])(_context24 = "Retrieved ".concat(name, " size: ")).call(_context24, file.length, ". Will issue select file command"));

          _this11.device.terminal.Config.selectFile(name, true, function (selError, selRz) {
            if (selError) {
              var formatterSelError = errorOrFailure(selError, selRz);
              Log.error("selectFile command returned an error : ".concat(formatterSelError));
              miuraLogs(true);
              flow.nextOrAbort(formatterSelError);
              return;
            }

            Log.info("Successfully selected ".concat(name, ". Will push it to card reader"));
            miuraLogs(false);
            chunkItOut({
              "this": _this11,
              device: _this11.device,
              file: file,
              name: name,
              total: totalSize,
              done: done,
              stageId: stageId
            }, function (writeError, writeResult) {
              if (writeError) {
                var _context25, _context26, _context27;

                var formattedWriteError = errorOrFailure(writeError, writeResult);
                Log.error((0, _concat["default"])(_context25 = (0, _concat["default"])(_context26 = (0, _concat["default"])(_context27 = "Failed to write ".concat(steps[ix].url, " to ")).call(_context27, name, ": ")).call(_context26, formattedWriteError.message, ". ")).call(_context25, lastWasRetry ? 'Will not retry' : 'Will retry'));

                if (lastWasRetry) {
                  miuraLogs(true);
                  flow.nextOrAbort(formattedWriteError);
                } else {
                  writer();
                }

                return;
              }

              lastWasRetry = false;
              done += file.length;
              ix += 1;

              if (ix >= steps.length) {
                miuraLogs(true);
                flow.nextOrAbort();
              } else {
                writer();
              }
            });
          });
        });
      };

      this._sizeFiles(steps, function (_sz) {
        totalSize = _sz;
        writer();
      });
    }
  }, {
    key: "_tryReconnect",
    value: function _tryReconnect(flow) {
      var _this12 = this;

      if (!this.awaitRestart) {
        flow.next();
        return;
      }

      Log.debug('Waiting for reconnect.');
      this.appAlert = this.device.app.display({
        title: _retailPaymentDevice.appMessage.SwUpdateReconnecting.title,
        message: _retailPaymentDevice.appMessage.SwUpdateReconnecting.message,
        showActivity: true
      });

      _manticore["default"].setTimeout(function () {
        _this12.device.needsRestart = true;

        _this12._retryConnection(TERMINAL_CONNECTION_RETRY_LIMIT, TERMINAL_CONNECTION_RETRY_TIMEOUT, function (e) {
          _this12.device.getFirmwareVersionInfo(function () {
            flow.nextOrAbort(e);
          });
        });
      }, MANTICORE_DEFAULT_SET_TIMEOUT);

      delete this.awaitRestart;
    }
  }, {
    key: "_hardResetCardReader",
    value: function _hardResetCardReader(flow) {
      var _this13 = this;

      if (!this._hardResetNeeded) {
        Log.debug('Will skip hard-reset as it is not needed');
        flow.next();
        return;
      }

      this.appAlert = this.device.app.display({
        title: _retailPaymentDevice.appMessage.SwUpdateRestarting.title,
        message: _retailPaymentDevice.appMessage.SwUpdateRestarting.message,
        showActivity: true
      });
      this.device.terminal.hardReset(function (resetErr) {
        _this13.awaitRestart = true;

        _this13.device.addState(_deviceState["default"].hardResetting);

        Log.debug('Device was hard-reset. Will disconnect from it'); // Disconnect following a hard-reset is required for windows firmware updates to properly work
        // Force Disconnect will be called from the native once the hard reset command is pushed to the reader

        if (_retailPaymentDevice.deviceError.deviceNotConnected.equals(resetErr)) {
          flow.next();
        } else {
          flow.nextOrAbort(resetErr);
        }
      });
    }
  }, {
    key: "_retryConnection",
    value: function _retryConnection(tryCount, waitTime, cb) {
      var _this14 = this;

      if (!this.device.needsRestart) {
        return;
      }

      miuraLogs(false);

      _manticore["default"].setTimeout(function () {
        Log.debug("Attempting connection with remaining retry attempts:  ".concat(tryCount));
        var oldRaw = _this14.device.rawConnect;
        _this14.device.rawConnect = true;

        if (_this14.device.needsRestart) {
          _this14.device.connect(function (e) {
            _this14.device.rawConnect = oldRaw;

            if (e) {
              var _context28;

              Log.warn((0, _concat["default"])(_context28 = "Reconnect failed with error ".concat(e, ". Remaining retry attempts: ")).call(_context28, tryCount));
              var newCount = tryCount - 1;

              if (newCount <= 0) {
                miuraLogs(true);
                Log.debug('Giving up!');
                cb(e);
              } else {
                _this14._retryConnection(newCount, waitTime, cb);
              }
            } else {
              Log.info("".concat(_this14.device.id, " was successfully connected after restart"));
              _this14.appAlert = _this14.device.app.display({
                title: _retailPaymentDevice.appMessage.SwUpdateConnected.title,
                message: _retailPaymentDevice.appMessage.SwUpdateConnected.message,
                showActivity: true
              });
              miuraLogs(true);
              delete _this14.device.needsRestart;
              cb();
            }
          });
        }
      }, waitTime || TERMINAL_CONNECTION_DEFAULT_RETRY_TIMEOUT);
    }
  }, {
    key: "_getCachedFile",
    value: function _getCachedFile(url, cb) {
      _manticore["default"].getItem(url, blobStorage, function (e, file) {
        cb(file ? null : _retailPaymentDevice.deviceError.swUpdateFailed.withDevMessage("File with url: ".concat(url, " was not found on the device")), file);
      });
    }
  }], [{
    key: "needsUpdate",
    value: function needsUpdate(device, modules, requiredUrlArray) {
      var hasUpdate = false;

      var _iterator6 = _createForOfIteratorHelper(modules),
          _step6;

      try {
        for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
          var module = _step6.value;

          if (module.name === 'Miura_OS') {
            var _context29, _context30, _context31;

            hasUpdate = true;
            Log.info((0, _concat["default"])(_context29 = (0, _concat["default"])(_context30 = (0, _concat["default"])(_context31 = "".concat(device.id, " OS will be updated from ")).call(_context31, device.os.id, "-")).call(_context30, device.os.ver, " to ")).call(_context29, module.version));
            pushModules(requiredUrlArray, module.urls);
          } else if (module.name === 'Miura_MPI') {
            var _context32, _context33, _context34;

            hasUpdate = true;
            Log.info((0, _concat["default"])(_context32 = (0, _concat["default"])(_context33 = (0, _concat["default"])(_context34 = "".concat(device.id, " MPI will be updated from ")).call(_context34, device.mpi.id, "-")).call(_context33, device.mpi.ver, " to ")).call(_context32, module.version));
            pushModules(requiredUrlArray, module.urls);
          } else if (module.name === 'Miura_CONFIG' && module.subcomponents) {
            var _context35;

            hasUpdate = true;
            Log.info((0, _concat["default"])(_context35 = "".concat(device.id, " CFG will be updated with ")).call(_context35, module.subcomponents.length, " sub components"));

            var _iterator7 = _createForOfIteratorHelper(module.subcomponents),
                _step7;

            try {
              for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
                var component = _step7.value;
                pushModules(requiredUrlArray, component.urls);
              }
            } catch (err) {
              _iterator7.e(err);
            } finally {
              _iterator7.f();
            }
          }
        }
      } catch (err) {
        _iterator6.e(err);
      } finally {
        _iterator6.f();
      }

      if (!hasUpdate) {
        Log.debug("".concat(device.id, " does not need an upgrade."));
      }

      return hasUpdate;
    }
  }]);
  return MiuraDeviceUpdate;
}(_retailPaymentDevice.DeviceUpdate);

exports["default"] = MiuraDeviceUpdate;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../common/Flow":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/common/Flow.js","../deviceState":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/deviceState.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/async/lib/async.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.replace":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","core-js/modules/es.string.split":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","md5":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/md5/md5.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/Terminal.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.exec");

require("core-js/modules/es.regexp.to-string");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.Terminal = exports.TerminalEvent = exports.MiuraTransactionType = void 0;

var _construct = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/reflect/construct"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

require("regenerator-runtime/runtime");

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/values"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _events = require("events");

var _tlvlib = require("tlvlib");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _MiuraTags = _interopRequireDefault(require("./MiuraTags"));

var _Parser = require("./Parser");

var _Writer = require("./Writer");

var _BatteryStatus = _interopRequireDefault(require("./messages/BatteryStatus"));

var _TerminalStatus = _interopRequireDefault(require("./messages/TerminalStatus"));

var _CardStatus = _interopRequireDefault(require("./messages/CardStatus"));

var _KeyStatus = _interopRequireDefault(require("./messages/KeyStatus"));

var _TerminalConfig = _interopRequireDefault(require("./TerminalConfig"));

var _TerminalDisplay = _interopRequireDefault(require("./TerminalDisplay"));

function _createSuper(Derived) {
  return function () {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (_isNativeReflectConstruct()) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = (0, _construct["default"])(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_construct["default"]) return false;
  if (_construct["default"].sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Date.prototype.toString.call((0, _construct["default"])(Date, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var Log = (0, _manticoreLog["default"])('miura.terminal');
var imageMatcherRegex;

function startTxCommon(txSequenceNumber, txType, amount, currencyCode) {
  var e0Tags = new _tlvlib.TlvList();
  var now = new Date();
  e0Tags.add(_tlvlib.Tags.TransactionDate, now);
  e0Tags.add(_tlvlib.Tags.TransactionTime, now);
  e0Tags.add(_tlvlib.Tags.TransactionType, txType);
  e0Tags.add(_tlvlib.Tags.AmountAuthorized, _tlvlib.Tags.AmountAuthorized.format.toBytes(amount, 6));
  e0Tags.add(_tlvlib.Tags.TransactionCurrencyCode, currencyCode);
  return e0Tags;
}

function buildApps(dr, response) {
  var appId;
  var appLabel;

  for (var i = 0; i < (0, _values["default"])(response.tlvs).length; i++) {
    var t = (0, _values["default"])(response.tlvs)[i];

    if (t.tag === _tlvlib.Tags.TerminalApplicationIdentifier) {
      if (appId) {
        dr.apps.push([appId, appLabel]);
        appLabel = null;
      }

      appId = t.parse();
    } else if (t.tag === _tlvlib.Tags.ApplicationLabel) {
      if (appLabel && appId) {
        dr.apps.push([appId, appLabel]);
        appId = null;
      }

      appLabel = t.parse();
    }
  }

  if (appId) {
    dr.apps.push([appId, appLabel]);
  }
}

var MiuraTransactionType = {
  SALE: 0,
  REFUND: 20
};
exports.MiuraTransactionType = MiuraTransactionType;
var TerminalEvent = {
  unsolicited: _Parser.ParserEvent.unsolicited,
  deviceEvent: 'deviceEvent',
  cardPresented: 'cardPresented',
  cardRemoved: 'cardRemoved',
  error: 'error',
  seePhone: 'seePhone'
};
exports.TerminalEvent = TerminalEvent;

var Terminal = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(Terminal, _EventEmitter);

  var _super = _createSuper(Terminal);

  function Terminal(sendFn, reader) {
    var _this;

    (0, _classCallCheck2["default"])(this, Terminal);
    _this = _super.call(this);
    _this.reader = reader;
    _this.parser = new _Parser.MiuraParser();

    _this.parser.on(TerminalEvent.unsolicited, function (m) {
      _this._emitUnsolicited(m);
    });

    _this.writer = new _Writer.Writer((0, _assertThisInitialized2["default"])(_this), sendFn);
    _this.Config = new _TerminalConfig["default"]((0, _assertThisInitialized2["default"])(_this)); // TODO get real model number from somewhere...

    _this.displayController = new _TerminalDisplay["default"]('M010');
    return _this;
  }

  (0, _createClass2["default"])(Terminal, [{
    key: "didConnect",
    value: function didConnect() {
      this.parser.reset();
    }
  }, {
    key: "received",
    value: function received(data) {
      this.parser.received(data);
    }
    /**
     * Put one or more responders at the front of the chain
     * @param responders
     */

  }, {
    key: "injectResponders",
    value: function injectResponders(responders) {
      this.writer.responders = (0, _concat["default"])(responders).call(responders, this.writer.responders);
    }
  }, {
    key: "_emitUnsolicited",
    value: function _emitUnsolicited(rz) {
      this.emit(TerminalEvent.unsolicited, rz);
      var detailMessage = rz;
      var tmpl = rz.apdu.template;

      if (rz.apdu.template === 0xE6) {
        detailMessage = new _TerminalStatus["default"](rz);
      } else if (rz.apdu.template === 0xE1) {
        var _context, _context2;

        if (rz.tlvs && (0, _find["default"])(_context = rz.tlvs).call(_context, _MiuraTags["default"].MiuraCardStatusInfo)) {
          detailMessage = new _CardStatus["default"](rz);

          this._reflectCardStatus(detailMessage);
        } else if (rz.tlvs && (0, _find["default"])(_context2 = rz.tlvs).call(_context2, _MiuraTags["default"].MiuraKeyboardData)) {
          detailMessage = new _KeyStatus["default"](rz);
        }
      }

      Log.debug(function () {
        return "Unsolicited message: ".concat(detailMessage);
      });
      this.emit(TerminalEvent.deviceEvent, detailMessage);

      if (tmpl) {
        var _context3;

        this.emit((0, _concat["default"])(_context3 = "".concat(TerminalEvent.deviceEvent, ".")).call(_context3, tmpl.toString(16)), detailMessage);
      }

      if (detailMessage instanceof _CardStatus["default"] && (detailMessage.magstripeFlags & 1) === 1) {
        Log.debug(function () {
          return "EMV Card Swiped ".concat(rz.raw.toString('hex'));
        });
        this.emit(TerminalEvent.cardPresented, detailMessage.getPresentedCard(this.reader));
      }
    }
  }, {
    key: "_reflectCardStatus",
    value: function _reflectCardStatus(cardStatus) {
      var _this2 = this;

      var old = this.cardStatus || _retailPaymentDevice.CardStatus.None;

      if ((cardStatus.chipFlags & 0x3) === 0x3) {
        this.cardStatus = _retailPaymentDevice.CardStatus.EmvCard;
      } else if ((cardStatus.chipFlags & 0x1) === 0x1) {
        this.cardStatus = _retailPaymentDevice.CardStatus.NonEmvCard;
      } else {
        this.cardStatus = _retailPaymentDevice.CardStatus.None;
      } // Handle EMV card action here, magstripe happens below for no good reason


      Log.debug(function () {
        var _context4;

        return (0, _concat["default"])(_context4 = "Previous card status ".concat(old, ". New Status ")).call(_context4, _this2.cardStatus);
      });

      if (old !== this.cardStatus && (this.cardStatus & 0x3) > 0) {
        var card = cardStatus.getPresentedCard(this.reader);

        if (card.failed && card.formFactor === _retailPaymentDevice.FormFactor.Chip) {
          this.emit(TerminalEvent.error, _retailPaymentDevice.deviceError.invalidChip, card.formFactor);
          return;
        }

        if (card) {
          this.emit(TerminalEvent.cardPresented, card);
        } else {
          Log.warn('card is null so emitting nothing here!!!');
        }
      } else if (old !== this.cardStatus && this.cardStatus === _retailPaymentDevice.CardStatus.None) {
        this.emit(TerminalEvent.cardRemoved);
      } else {
        Log.debug('Neither cardPresented nor cardRemoved emitted!');
      }
    }
  }, {
    key: "display",
    value: function display(messageId, values, callback, displaySystemIcons) {
      var msg = this.displayController.formatMessage(messageId, values, displaySystemIcons);

      var mediaMsg = this._parseMedia(msg);

      if (!msg) {
        callback(_retailPaymentDevice.deviceError.dataValidationError.withDevMessage('Empty Message'));
        return;
      }

      if (mediaMsg) {
        this.displayImageAndText(mediaMsg.imageId, mediaMsg.msg, callback);
        return;
      }

      this.showMessage(msg, callback, displaySystemIcons);
    }
  }, {
    key: "displayAsync",
    value: function () {
      var _displayAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(messageId, values, displaySystemIcons) {
        var msg, mediaMsg;
        return _regenerator["default"].wrap(function _callee$(_context5) {
          while (1) {
            switch (_context5.prev = _context5.next) {
              case 0:
                msg = this.displayController.formatMessage(messageId, values);
                mediaMsg = this._parseMedia(msg);

                if (msg) {
                  _context5.next = 4;
                  break;
                }

                throw _retailPaymentDevice.deviceError.dataValidationError;

              case 4:
                if (!mediaMsg) {
                  _context5.next = 8;
                  break;
                }

                _context5.next = 7;
                return this.displayImageAndTextAsync(mediaMsg.imageId, mediaMsg.msg);

              case 7:
                return _context5.abrupt("return");

              case 8:
                _context5.next = 10;
                return this.showMessageAsync(msg, displaySystemIcons);

              case 10:
              case "end":
                return _context5.stop();
            }
          }
        }, _callee, this);
      }));

      function displayAsync(_x, _x2, _x3) {
        return _displayAsync.apply(this, arguments);
      }

      return displayAsync;
    }()
  }, {
    key: "_parseMedia",
    value: function _parseMedia(msg) {
      if (!imageMatcherRegex) {
        imageMatcherRegex = /\$image\((.+)\)(?:\n)*(.*)/;
      }

      var match = imageMatcherRegex.exec(msg);

      if (!match) {
        return null;
      }

      return {
        imageId: match[1],
        msg: match[2]
      };
    }
  }, {
    key: "displayImage",
    value: function displayImage(imageId, callback) {
      var responseCheck = this.getDisplayResponseCheck([0x00, 0x0D, 0x10], 'displayImage');
      var cmd = new _tlvlib.ApduCommand(0xD2, 0xD2);
      cmd.appendString(Terminal.Images[imageId]);
      this.writer.sendAndReceive('displayImage', cmd, {
        responseCheck: responseCheck
      }, callback);
    }
  }, {
    key: "displayImageAndText",
    value: function displayImageAndText(image, msg, callback) {
      var xText = 0,
          yText = 50,
          xImage = 0,
          yImage = 0;
      var e0Tags = new _tlvlib.TlvList();
      var responseCheck = this.getDisplayResponseCheck([0x00, 0x0D, 0x10], 'displayImage'); // Display image related tags

      var imagePosition = [_MiuraTags["default"].MiuraMediaCoordinates.valueToBytes(xImage), _MiuraTags["default"].MiuraMediaCoordinates.valueToBytes(yImage)];
      e0Tags.add(_MiuraTags["default"].MiuraMediaCoordinates, (0, _concat["default"])(Buffer).call(Buffer, imagePosition));
      e0Tags.add(_MiuraTags["default"].MiuraImageData, _MiuraTags["default"].MiuraImageData.valueToBytes(image)); // Display text related tags

      var textPosition = [_MiuraTags["default"].MiuraMediaCoordinates.valueToBytes(xText), _MiuraTags["default"].MiuraMediaCoordinates.valueToBytes(yText)];
      e0Tags.add(_MiuraTags["default"].MiuraMediaCoordinates, (0, _concat["default"])(Buffer).call(Buffer, textPosition));
      e0Tags.add(_MiuraTags["default"].MiuraTextData, _MiuraTags["default"].MiuraTextData.valueToBytes(msg));
      var e0 = new _tlvlib.TlvList();
      e0.add(_MiuraTags["default"].MiuraCommandData, e0Tags);
      var cmd = new _tlvlib.ApduCommand(0xD2, 0x20, 0x00, 0x80);
      cmd.appendBytes(e0.toBytes());
      this.writer.sendAndReceive('displayImageAndText', cmd, {
        responseCheck: responseCheck
      }, callback);
    }
  }, {
    key: "displayImageAndTextAsync",
    value: function () {
      var _displayImageAndTextAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(image, msg) {
        var xText, yText, xImage, yImage, e0Tags, responseCheck, imagePosition, textPosition, e0, cmd;
        return _regenerator["default"].wrap(function _callee2$(_context6) {
          while (1) {
            switch (_context6.prev = _context6.next) {
              case 0:
                // For now only confirm-tip is using this Method and
                // is good with [0, 10, 0, 0]
                xText = 0, yText = 10, xImage = 0, yImage = 0;
                e0Tags = new _tlvlib.TlvList();
                responseCheck = this.getDisplayResponseCheck([0x00, 0x0D, 0x10], 'displayImage'); // Display image related tags

                imagePosition = [_MiuraTags["default"].MiuraMediaCoordinates.valueToBytes(xImage), _MiuraTags["default"].MiuraMediaCoordinates.valueToBytes(yImage)];
                e0Tags.add(_MiuraTags["default"].MiuraMediaCoordinates, (0, _concat["default"])(Buffer).call(Buffer, imagePosition));
                e0Tags.add(_MiuraTags["default"].MiuraImageData, _MiuraTags["default"].MiuraImageData.valueToBytes(image)); // Display text related tags

                textPosition = [_MiuraTags["default"].MiuraMediaCoordinates.valueToBytes(xText), _MiuraTags["default"].MiuraMediaCoordinates.valueToBytes(yText)];
                e0Tags.add(_MiuraTags["default"].MiuraMediaCoordinates, (0, _concat["default"])(Buffer).call(Buffer, textPosition));
                e0Tags.add(_MiuraTags["default"].MiuraTextData, _MiuraTags["default"].MiuraTextData.valueToBytes(msg));
                e0 = new _tlvlib.TlvList();
                e0.add(_MiuraTags["default"].MiuraCommandData, e0Tags);
                cmd = new _tlvlib.ApduCommand(0xD2, 0x20, 0x00, 0x00);
                cmd.appendBytes(e0.toBytes());
                _context6.next = 15;
                return this.writer.sendAndReceiveP('displayImageAndTextAsync', cmd, {
                  responseCheck: responseCheck
                });

              case 15:
              case "end":
                return _context6.stop();
            }
          }
        }, _callee2, this);
      }));

      function displayImageAndTextAsync(_x4, _x5) {
        return _displayImageAndTextAsync.apply(this, arguments);
      }

      return displayImageAndTextAsync;
    }() // ////////////////////////////////////////////////////////////////////
    // Commands
    // ////////////////////////////////////////////////////////////////////

  }, {
    key: "softReset",
    value: function softReset(callback) {
      this.writer.sendAndReceive('softReset', new _tlvlib.ApduCommand(0xD0, 0), callback);
    }
  }, {
    key: "hardReset",
    value: function hardReset(callback) {
      this.writer.sendAndReceive('hardReset', new _tlvlib.ApduCommand(0xD0, 0, 0x01), callback);
    }
  }, {
    key: "abortTransaction",
    value: function abortTransaction(callback) {
      var responseCheck = this.getDisplayResponseCheck([0x00], 'abortTransaction');
      this.writer.sendAndReceive('abortTransaction', new _tlvlib.ApduCommand(0xD0, 0xFF), {
        responseCheck: responseCheck
      }, callback);
    }
  }, {
    key: "abortTransactionAsync",
    value: function () {
      var _abortTransactionAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
        var responseCheck;
        return _regenerator["default"].wrap(function _callee3$(_context7) {
          while (1) {
            switch (_context7.prev = _context7.next) {
              case 0:
                responseCheck = this.getDisplayResponseCheck([0x00], 'abortTransaction');
                _context7.next = 3;
                return this.writer.sendAndReceiveP('abortTransactionAsync', new _tlvlib.ApduCommand(0xD0, 0xFF), {
                  responseCheck: responseCheck
                });

              case 3:
              case "end":
                return _context7.stop();
            }
          }
        }, _callee3, this);
      }));

      function abortTransactionAsync() {
        return _abortTransactionAsync.apply(this, arguments);
      }

      return abortTransactionAsync;
    }() // Response check for acceptable templates
    // ignore=true processes the result for templates to be ignored.
    // ignore expects the response to have a template, but that is not in the acceptableTemplates
    // tag indicates the tag that should be present in the response

  }, {
    key: "getResponseCheck",
    value: function getResponseCheck(templateList, checkDescription, ignore, tag) {
      var responseCheck = function responseCheck(rz) {
        var error = null;
        var mine = false;
        var responseTemplate = rz && rz.apdu && rz.apdu.template;
        var templateTypeText = ignore ? 'Ignored templates' : 'Acceptable Templates';
        var hasTag = true;

        if (tag) {
          var _context8;

          hasTag = !!(rz && rz.tlvs && (0, _find["default"])(_context8 = rz.tlvs).call(_context8, tag));
        }

        if (responseTemplate) {
          mine = (0, _indexOf["default"])(templateList).call(templateList, responseTemplate) !== -1; // acceptableTemplates contains responseTemplate

          mine = ignore ? !mine : mine;
          mine = mine && hasTag;
          Log.debug(function () {
            var _context9, _context10, _context11, _context12, _context13, _context14;

            return (0, _concat["default"])(_context9 = (0, _concat["default"])(_context10 = (0, _concat["default"])(_context11 = (0, _concat["default"])(_context12 = (0, _concat["default"])(_context13 = "getResponseCheck ".concat(checkDescription, ". This is a response with template 0x")).call(_context13, responseTemplate.toString(16), ". ")).call(_context12, templateTypeText, " = ")).call(_context11, templateList, ".")).call(_context10, tag ? (0, _concat["default"])(_context14 = "tag[".concat(tag.name, "]=")).call(_context14, hasTag, ".") : '', " Mine=")).call(_context9, mine);
          });
        } else {
          if (rz && rz.apdu && rz.apdu.sw1 === 0x9f && (rz.apdu.sw2 === 0xff || rz.apdu.sw2 === 0x26)) {
            error = _retailPaymentDevice.deviceError.cannotAcceptMessage;
            mine = true;
          }

          Log.debug(function () {
            var _context15, _context16, _context17;

            return (0, _concat["default"])(_context15 = (0, _concat["default"])(_context16 = (0, _concat["default"])(_context17 = "getResponseCheck ".concat(checkDescription, " This is a response with no template. ")).call(_context17, templateTypeText, " = ")).call(_context16, templateList, ". Mine=")).call(_context15, mine);
          });
        }

        return [error, mine];
      };

      return responseCheck;
    }
  }, {
    key: "getBatteryLevel",
    value: function getBatteryLevel() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      var responseCheck = this.getResponseCheck([0xE1], 'getBatteryLevel', false, _MiuraTags["default"].MiuraBatteryData);
      this.writer.sendAndReceive('getBatteryLevel', new _tlvlib.ApduCommand(0xD0, 0x62), {
        responseCheck: responseCheck
      }, function (err, rz) {
        var _rz$tlvs;

        var batteryInfo = (rz === null || rz === void 0 ? void 0 : (_rz$tlvs = rz.tlvs) === null || _rz$tlvs === void 0 ? void 0 : (0, _find["default"])(_rz$tlvs).call(_rz$tlvs, _MiuraTags["default"].MiuraBatteryData)) ? new _BatteryStatus["default"](rz).batteryInfo : undefined;
        callback(err, batteryInfo);
      });
    }
  }, {
    key: "disconnectUsb",
    value: function disconnectUsb(callback) {
      var responseCheck = this.getDisplayResponseCheck([0x00], 'disconnectUsb');
      this.writer.sendAndReceive('disconnectUsb', new _tlvlib.ApduCommand(0xD0, 0xC0), {
        responseCheck: responseCheck
      }, callback);
    }
    /**
     * Determine whether card status events are sent to your application
     * @param yesEvents truthy to get events, false to turn them off
     * @param callback called when the message has been acknowledged
     */

  }, {
    key: "registerForCardEvents",
    value: function registerForCardEvents(yesEvents, callback) {
      var _this3 = this;

      var responseCheck = this.getResponseCheck([0xE1], yesEvents ? 'registerForCardEvents' : 'unRegisterForCardEvents', false, _MiuraTags["default"].MiuraCardStatusInfo);
      var cardStatusCallback = yesEvents ? function (error, response) {
        if (!error) {
          Log.debug('Emit response as unsolicited for registerForCardEvents');

          _this3._emitUnsolicited(response);
        }

        callback(error, response);
      } : callback; // 0xD0 returns a solicited response with 0x64
      // With 0x64, we can wait for register/unregister response before sending the next command
      // Note: Miura framework emits the status twice on register in some scenarios such as register with card inserted
      // and once in other scenarios such as chipcardswiped (solicited only, no unsolicited)
      // So, we need to emit the solicited response as an unsolicited response to ensure we process a card status change
      // We could have avoided this hack and multiple unsolicited events if Miura was consistent

      this.writer.sendAndReceive(yesEvents ? 'registerForCardEvents' : 'unRegisterForCardEvents', new _tlvlib.ApduCommand(0xD0, 0x64, yesEvents ? 0x0F : 0, 0x01), {
        responseCheck: responseCheck
      }, cardStatusCallback);
    }
    /**
     * Determine whether keyboard events are sent to your application
     * @param yesEvents truthy to get events, false to turn them off
     * @param callback called when the message has been acknowledged
     */

  }, {
    key: "registerForKeyboardEvents",
    value: function registerForKeyboardEvents(yesEvents, callback) {
      this.writer.sendAndReceive(yesEvents ? 'registerForKeyboardEvents' : 'unRegisterForKeyboardEvents', new _tlvlib.ApduCommand(0xD0, 0x61, yesEvents ? 1 : 0), callback);
    }
  }, {
    key: "registerForKeyboardEventsAsync",
    value: function () {
      var _registerForKeyboardEventsAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(yesEvents) {
        return _regenerator["default"].wrap(function _callee4$(_context18) {
          while (1) {
            switch (_context18.prev = _context18.next) {
              case 0:
                _context18.next = 2;
                return this.writer.sendAndReceiveP(yesEvents ? 'registerForKeyboardEvents' : 'unRegisterForKeyboardEvents', new _tlvlib.ApduCommand(0xD0, 0x61, yesEvents ? 1 : 0));

              case 2:
              case "end":
                return _context18.stop();
            }
          }
        }, _callee4, this);
      }));

      function registerForKeyboardEventsAsync(_x6) {
        return _registerForKeyboardEventsAsync.apply(this, arguments);
      }

      return registerForKeyboardEventsAsync;
    }()
  }, {
    key: "getDisplayResponseCheck",
    value: function getDisplayResponseCheck(sw2List, checkDescription) {
      var responseCheck = function responseCheck(rz) {
        var _rz$apdu, _rz$apdu2;

        var responseTemplate = rz === null || rz === void 0 ? void 0 : (_rz$apdu = rz.apdu) === null || _rz$apdu === void 0 ? void 0 : _rz$apdu.template;
        var indx = (0, _indexOf["default"])(sw2List).call(sw2List, rz === null || rz === void 0 ? void 0 : (_rz$apdu2 = rz.apdu) === null || _rz$apdu2 === void 0 ? void 0 : _rz$apdu2.sw2);
        var mine = false;

        if (responseTemplate) {
          Log.debug(function () {
            var _context19, _context20;

            return (0, _concat["default"])(_context19 = (0, _concat["default"])(_context20 = "getResponseCheck ".concat(checkDescription, ". This is a response with template 0x")).call(_context20, responseTemplate.toString(16), ". Mine=")).call(_context19, mine);
          });
        } else {
          var _rz$apdu3, _rz$apdu4, _rz$apdu5, _context21, _context22, _context23;

          mine = (rz === null || rz === void 0 ? void 0 : (_rz$apdu3 = rz.apdu) === null || _rz$apdu3 === void 0 ? void 0 : _rz$apdu3.sw1) === 0x90 && indx !== -1 || (rz === null || rz === void 0 ? void 0 : (_rz$apdu4 = rz.apdu) === null || _rz$apdu4 === void 0 ? void 0 : _rz$apdu4.sw1) === 0x9F && (rz === null || rz === void 0 ? void 0 : (_rz$apdu5 = rz.apdu) === null || _rz$apdu5 === void 0 ? void 0 : _rz$apdu5.sw2) === 0xFF;
          Log.debug((0, _concat["default"])(_context21 = (0, _concat["default"])(_context22 = (0, _concat["default"])(_context23 = "getResponseCheck ".concat(checkDescription, " This is a response with no template. Mine=")).call(_context23, mine, ". sw2List=")).call(_context22, sw2List, ", sw2List.indexOf(rz.apdu.sw2): ")).call(_context21, indx));
        }

        return [null, mine];
      };

      return responseCheck;
    }
  }, {
    key: "showMessage",
    value: function showMessage(message, callback, displaySystemIcons) {
      var responseCheck = this.getDisplayResponseCheck([0x00, 0x0D, 0x10], 'showMessage');
      var systemIconsDisplayByte = displaySystemIcons ? 0x01 : 0;
      var cmd = new _tlvlib.ApduCommand(0xD2, 0x01, systemIconsDisplayByte, 0x80);
      cmd.appendString(message);
      Log.debug(function () {
        var _context24;

        return (0, _concat["default"])(_context24 = "Displaying: '".concat(message, "' icons: ")).call(_context24, !!displaySystemIcons);
      });
      this.writer.sendAndReceive('displayMessage', cmd, {
        responseCheck: responseCheck
      }, callback);
    }
  }, {
    key: "showMessageAsync",
    value: function () {
      var _showMessageAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(message, displaySystemIcons) {
        var responseCheck, systemIconsDisplayByte, cmd;
        return _regenerator["default"].wrap(function _callee5$(_context25) {
          while (1) {
            switch (_context25.prev = _context25.next) {
              case 0:
                responseCheck = this.getDisplayResponseCheck([0x00, 0x0D, 0x10], 'showMessageAsync');
                systemIconsDisplayByte = displaySystemIcons ? 0x01 : 0;
                cmd = new _tlvlib.ApduCommand(0xD2, 0x01, systemIconsDisplayByte, 0x80);
                cmd.appendString(message);
                _context25.next = 6;
                return this.writer.sendAndReceiveP('displayMessage', cmd, {
                  responseCheck: responseCheck
                });

              case 6:
              case "end":
                return _context25.stop();
            }
          }
        }, _callee5, this);
      }));

      function showMessageAsync(_x7, _x8) {
        return _showMessageAsync.apply(this, arguments);
      }

      return showMessageAsync;
    }()
    /*
     Prompts: (0-based)
     Please Select
     Enter/Entrez/Voer
     Server Port
     Amount?
     Gratuity?
     Enter Last 4 Digits
     (1) Credit Account
     (2) Cheque Account
     (3) Savings Account
     Enter Budget Period
     (1) Manual Login
     (2) Card Swipe Login
     Prompt index 0x000D
     Enter Expiry Date
     Enter CVV2
     CHQ     SAV     CR
     Enter Cashback Amount
     Enter Store Number
     Enter User ID
     Enter Table Number
     Enter Check Number
     Select Either
     (1) Table Number
     (2) Check Number
     (1) Sale
     (2) Refund
     as MMYY
     Enter Amount
     (1) Full Amount
     (2) Partial Amount
     Account
     Straight or Budget?
     (1) Straight
     (2) Budget
     Enter mobile number
     Enter ref number
     1) 5%          10% (2
     3) 15%         20% (4
     5) Enter Amount
     1) 10%         15% (2
     3) 20%         25% (4
     5) Enter TIP Amount
     Enter TIP Amount
     Prompt index 0x002C
     Enter Gratuity
     Enter TIP
     TIP?
     Prompt index 0x0030
     Enter Issue Number
     Enter Start Date
     Prompt index 0x0033
     Enter refund amount
     1) 5%          2) 10%
     3) 15%         4) 20%
     Prompt index 0x0037
     Please Enter
     Prompt index 0x0039
     Prompt index 0x003A
     Prompt index 0x003B
     Prompt index 0x003C
     Prompt index 0x003D
     Prompt index 0x003E
     Prompt index 0x003F
     Prompt index 0x0040
     Try Again
     Select Account
     Prompt index 0x0043
     Prompt index 0x0044
     Prompt index 0x0045
     Prompt index 0x0046
     Prompt index 0x0047
     Prompt index 0x0048
     Prompt index 0x0049
     Prompt index 0x004A
     Prompt index 0x004B
     Prompt index 0x004C
     Prompt index 0x004D
     Prompt index 0x004E
     Prompt index 0x004F
     Prompt index 0x0050
     Prompt index 0x0051
     Prompt index 0x0052
     Auth Code
     Prompt index 0x0054
     $Revision: Miura-1-1 $
     */

  }, {
    key: "promptForNumericEntry",
    value: function promptForNumericEntry(options, callback) {
      this._numericPrompt(options).then(function (card) {
        callback(null, card);
      })["catch"](function (error) {
        callback(error, null);
      });
    }
  }, {
    key: "getNumericPromptResponseCheck",
    value: function getNumericPromptResponseCheck(sw29fList, err) {
      var responseCheck = function responseCheck(rz) {
        var _rz$apdu6;

        var error = null;
        var mine = false;
        var responseTemplate = rz === null || rz === void 0 ? void 0 : (_rz$apdu6 = rz.apdu) === null || _rz$apdu6 === void 0 ? void 0 : _rz$apdu6.template;

        if (responseTemplate) {
          mine = responseTemplate === 0xE1;
        } else {
          var _rz$apdu7, _rz$apdu8, _rz$apdu9, _rz$apdu10;

          mine = (rz === null || rz === void 0 ? void 0 : (_rz$apdu7 = rz.apdu) === null || _rz$apdu7 === void 0 ? void 0 : _rz$apdu7.sw1) === 0x9F && (0, _indexOf["default"])(sw29fList).call(sw29fList, rz === null || rz === void 0 ? void 0 : (_rz$apdu8 = rz.apdu) === null || _rz$apdu8 === void 0 ? void 0 : _rz$apdu8.sw2) !== -1;
          mine = mine || (rz === null || rz === void 0 ? void 0 : (_rz$apdu9 = rz.apdu) === null || _rz$apdu9 === void 0 ? void 0 : _rz$apdu9.sw1) === 0x6A && (rz === null || rz === void 0 ? void 0 : (_rz$apdu10 = rz.apdu) === null || _rz$apdu10 === void 0 ? void 0 : _rz$apdu10.sw2) === 0x88;
          error = err;
        }

        return [error, mine];
      };

      return responseCheck;
    }
  }, {
    key: "_numericPrompt",
    value: function () {
      var _numericPrompt2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(options) {
        var _context26;

        var responseCheck, promptIndexes, numberFormat, numberToEdit, autoEnt, piBuf, numBuf, cmd, e0Tags, e0, data, numTlv;
        return _regenerator["default"].wrap(function _callee6$(_context27) {
          while (1) {
            switch (_context27.prev = _context27.next) {
              case 0:
                responseCheck = this.getNumericPromptResponseCheck([0x88, 0x0D, 0x14, 0x2A, 0x41, 0X42], _retailPaymentDevice.deviceError.numericEntryFailed); // eslint-disable-line max-len

                autoEnt = 0;

                if (options.entryType === _retailPaymentDevice.NumericEntryType.ExpirationDate) {
                  promptIndexes = '000E001B0000';
                  numberFormat = '0400';
                  autoEnt = 1;
                } else if (options.entryType === _retailPaymentDevice.NumericEntryType.Cvv) {
                  promptIndexes = '0000000F0000';
                  numberFormat = '0500';
                }

                piBuf = Buffer.from(promptIndexes, 'hex');
                numBuf = Buffer.from(numberFormat, 'hex');

                if (!(piBuf.length !== 4 && piBuf.length !== 6)) {
                  _context27.next = 7;
                  break;
                }

                throw _retailPaymentDevice.deviceError.dataValidationError.withDevMessage('Prompt index array must be 4 or 6 hex bytes (8 or 12 characters) referencing the prompts.txt file.');

              case 7:
                if (!(numBuf.length !== 2)) {
                  _context27.next = 9;
                  break;
                }

                throw _retailPaymentDevice.deviceError.dataValidationError.withDevMessage('Number format must be 2 hex bytes (4 characters)');

              case 9:
                cmd = new _tlvlib.ApduCommand(0xD2, 4, autoEnt, 1);
                e0Tags = new _tlvlib.TlvList();
                e0Tags.add(0xDFA206, piBuf);
                e0Tags.add(0xDFA207, numBuf);

                if (numberToEdit) {
                  e0Tags.add(0xDFA208, Buffer.from(numberToEdit.toString(), 'utf8'));
                }

                e0 = new _tlvlib.TlvList();
                e0.add(0xE0, e0Tags.toBytes());
                cmd.appendBytes(e0.toBytes());
                _context27.next = 19;
                return this.writer.sendAndReceiveP('numericPrompt', cmd, {
                  responseCheck: responseCheck
                });

              case 19:
                data = _context27.sent;

                if (data.tlvs) {
                  _context27.next = 22;
                  break;
                }

                throw _retailPaymentDevice.deviceError.numericEntryFailed;

              case 22:
                numTlv = (0, _find["default"])(_context26 = data.tlvs).call(_context26, _MiuraTags["default"].MiuraNumericData);
                return _context27.abrupt("return", numTlv.parse());

              case 24:
              case "end":
                return _context27.stop();
            }
          }
        }, _callee6, this);
      }));

      function _numericPrompt(_x9) {
        return _numericPrompt2.apply(this, arguments);
      }

      return _numericPrompt;
    }()
    /*
     Prompts:
     Please Enter
     Card Number
     Account Number
     Enter Card Number
     Enter Account Number
     $File: acc-data-prompts $
     $Revision: 1.00 $
     */

  }, {
    key: "promptForSecureAccountNumber",
    value: function promptForSecureAccountNumber(options, callback) {
      this._securePrompt(options).then(function (card) {
        callback(null, card);
      })["catch"](function (error) {
        callback(error, null);
      });
    }
  }, {
    key: "_securePrompt",
    value: function () {
      var _securePrompt2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(options) {
        var _context28;

        var responseCheck, piBuf, cmd, e0Tags, e0, data, numTlv, card, masked, _context30, mmyy;

        return _regenerator["default"].wrap(function _callee7$(_context31) {
          while (1) {
            switch (_context31.prev = _context31.next) {
              case 0:
                responseCheck = this.getNumericPromptResponseCheck([0x88, 0x0D, 0x14, 0x2A, 0x41, 0X42, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6], _retailPaymentDevice.deviceError.secureEntryFailed); // eslint-disable-line max-len

                piBuf = Buffer.from('00000004', 'hex');

                if (!(piBuf.length !== 4 && piBuf.length !== 6)) {
                  _context31.next = 4;
                  break;
                }

                throw _retailPaymentDevice.deviceError.dataValidationError.withDevMessage('Prompt index array must be 4 or 6 hex bytes (8 or 12 characters) referencing the prompts.txt file.');

              case 4:
                cmd = new _tlvlib.ApduCommand(0xD2, 0x5A, 0, 1);
                e0Tags = new _tlvlib.TlvList();
                e0Tags.add(0xDFA206, piBuf);
                e0 = new _tlvlib.TlvList();
                e0.add(0xE0, e0Tags.toBytes());
                cmd.appendBytes(e0.toBytes());
                _context31.next = 12;
                return this.writer.sendAndReceiveP('securePrompt', cmd, {
                  responseCheck: responseCheck
                });

              case 12:
                data = _context31.sent;

                if (data.tlvs) {
                  _context31.next = 15;
                  break;
                }

                throw _retailPaymentDevice.deviceError.secureEntryFailed;

              case 15:
                if (data.apdu.isSuccess) {
                  _context31.next = 17;
                  break;
                }

                throw _retailPaymentDevice.deviceError.actionCancelled;

              case 17:
                numTlv = (0, _find["default"])(_context28 = data.tlvs).call(_context28, _MiuraTags["default"].MiuraNumericData);
                card = new _retailPaymentDevice.ManuallyEnteredCard();
                card.formFactor = _retailPaymentDevice.FormFactor.SecureManualEntry;
                card.emvData = data.apdu.data.toString('hex');
                card.reader = this.reader;
                masked = numTlv.parse();
                card.cardIssuer = _retailPaymentDevice.CardDataUtil.getCardIssuerFromCardNumber(masked);
                card.lastFourDigits = masked.substring(masked.length - 4);
                card.firstFourDigits = masked.substring(0, 4);
                Log.debug(function () {
                  var _context29;

                  return (0, _concat["default"])(_context29 = "Card number entry complete. firstFour: ".concat(card.firstFourDigits, ", lastFour: ")).call(_context29, card.lastFourDigits);
                });

                if (!options.expiration) {
                  _context31.next = 32;
                  break;
                }

                _context31.next = 30;
                return this._numericPrompt({
                  entryType: _retailPaymentDevice.NumericEntryType.ExpirationDate
                });

              case 30:
                mmyy = _context31.sent;
                card.expiration = (0, _concat["default"])(_context30 = "".concat(mmyy.substring(2))).call(_context30, mmyy.substring(0, 2));

              case 32:
                if (!options.cvv) {
                  _context31.next = 38;
                  break;
                }

                _context31.t0 = card;
                _context31.next = 36;
                return this._numericPrompt({
                  entryType: _retailPaymentDevice.NumericEntryType.Cvv
                });

              case 36:
                _context31.t1 = _context31.sent;

                _context31.t0.setCvv.call(_context31.t0, _context31.t1);

              case 38:
                return _context31.abrupt("return", card);

              case 39:
              case "end":
                return _context31.stop();
            }
          }
        }, _callee7, this);
      }));

      function _securePrompt(_x10) {
        return _securePrompt2.apply(this, arguments);
      }

      return _securePrompt;
    }()
  }, {
    key: "promptForTipEntry",
    value: function () {
      var _promptForTipEntry = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(amountBasedTip) {
        return _regenerator["default"].wrap(function _callee8$(_context32) {
          while (1) {
            switch (_context32.prev = _context32.next) {
              case 0:
                return _context32.abrupt("return", this._tipPrompt(amountBasedTip));

              case 1:
              case "end":
                return _context32.stop();
            }
          }
        }, _callee8, this);
      }));

      function promptForTipEntry(_x11) {
        return _promptForTipEntry.apply(this, arguments);
      }

      return promptForTipEntry;
    }()
  }, {
    key: "_tipPrompt",
    value: function () {
      var _tipPrompt2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(amountBasedTip) {
        var _context33;

        var responseCheck, tipCommandData, tipCommandData1, e0Tags, e0, cmd, data, numTlv;
        return _regenerator["default"].wrap(function _callee9$(_context34) {
          while (1) {
            switch (_context34.prev = _context34.next) {
              case 0:
                responseCheck = this.getNumericPromptResponseCheck([0x88, 0x0D, 0x14, 0x2A, 0x41, 0X42], _retailPaymentDevice.deviceError.tipEntryFailed); // eslint-disable-line max-len

                tipCommandData = Buffer.from([0x00, 0x00, 0x00, 0x2C, 0x00, 0x00]);
                tipCommandData1 = Buffer.from([0x06, 0x00]);

                if (amountBasedTip) {
                  tipCommandData = Buffer.from([0x00, 0x00, 0x00, 0x2B, 0x00, 0x00]);
                  tipCommandData1 = Buffer.from([0x06, 0x02]);
                }

                e0Tags = new _tlvlib.TlvList();
                e0Tags.add(0xDFA206, tipCommandData);
                e0Tags.add(0xDFA207, tipCommandData1);
                e0 = new _tlvlib.TlvList();
                e0.add(_MiuraTags["default"].MiuraCommandData, e0Tags.toBytes());
                cmd = new _tlvlib.ApduCommand(0xD2, 0x04, 0x00, 0x01);
                cmd.appendBytes(e0.toBytes());
                _context34.next = 13;
                return this.writer.sendAndReceiveP('tipPrompt', cmd, {
                  responseCheck: responseCheck
                });

              case 13:
                data = _context34.sent;

                if (data.tlvs) {
                  _context34.next = 16;
                  break;
                }

                throw _retailPaymentDevice.deviceError.tipEntryFailed;

              case 16:
                numTlv = (0, _find["default"])(_context33 = data.tlvs).call(_context33, _MiuraTags["default"].MiuraNumericData);
                return _context34.abrupt("return", numTlv.parse());

              case 18:
              case "end":
                return _context34.stop();
            }
          }
        }, _callee9, this);
      }));

      function _tipPrompt(_x12) {
        return _tipPrompt2.apply(this, arguments);
      }

      return _tipPrompt;
    }()
  }, {
    key: "promptForOnDevicePayment",
    value: function () {
      var _promptForOnDevicePayment = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
        return _regenerator["default"].wrap(function _callee10$(_context35) {
          while (1) {
            switch (_context35.prev = _context35.next) {
              case 0:
                return _context35.abrupt("return", this._onDevicePaymentPrompt());

              case 1:
              case "end":
                return _context35.stop();
            }
          }
        }, _callee10, this);
      }));

      function promptForOnDevicePayment() {
        return _promptForOnDevicePayment.apply(this, arguments);
      }

      return promptForOnDevicePayment;
    }()
  }, {
    key: "_onDevicePaymentPrompt",
    value: function () {
      var _onDevicePaymentPrompt2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
        var _context36;

        var responseCheck, promptIndexes, numberFormat, e0Tags, e0, cmd, data, numTlv;
        return _regenerator["default"].wrap(function _callee11$(_context37) {
          while (1) {
            switch (_context37.prev = _context37.next) {
              case 0:
                responseCheck = this.getNumericPromptResponseCheck([0x88, 0x0D, 0x14, 0x2A, 0x41, 0X42], _retailPaymentDevice.deviceError.generic);
                promptIndexes = Buffer.from([0x00, 0x00, 0x00, 0x1C, 0x00, 0x00]); // Enter Amount

                numberFormat = Buffer.from([0x06, 0x02]);
                e0Tags = new _tlvlib.TlvList();
                e0Tags.add(0xDFA206, promptIndexes);
                e0Tags.add(0xDFA207, numberFormat);
                e0 = new _tlvlib.TlvList();
                e0.add(_MiuraTags["default"].MiuraCommandData, e0Tags.toBytes());
                cmd = new _tlvlib.ApduCommand(0xD2, 0x04, 0x00, 0x01);
                cmd.appendBytes(e0.toBytes());
                _context37.next = 12;
                return this.writer.sendAndReceiveP('onDevicePaymentPrompt', cmd, {
                  responseCheck: responseCheck
                });

              case 12:
                data = _context37.sent;

                if (data.tlvs) {
                  _context37.next = 15;
                  break;
                }

                throw _retailPaymentDevice.deviceError.generic;

              case 15:
                numTlv = (0, _find["default"])(_context36 = data.tlvs).call(_context36, _MiuraTags["default"].MiuraNumericData);
                return _context37.abrupt("return", numTlv.parse());

              case 17:
              case "end":
                return _context37.stop();
            }
          }
        }, _callee11, this);
      }));

      function _onDevicePaymentPrompt() {
        return _onDevicePaymentPrompt2.apply(this, arguments);
      }

      return _onDevicePaymentPrompt;
    }()
  }, {
    key: "startICCTransaction",
    value: function startICCTransaction(txSequenceNumber, txType, amount, currencyCode, callback) {
      var e0Tags = startTxCommon(txSequenceNumber, txType, amount, currencyCode);
      var e0 = new _tlvlib.TlvList();
      e0.add(_MiuraTags["default"].MiuraCommandData, e0Tags);
      var cmd = new _tlvlib.ApduCommand(0xDE, 0xD1);
      cmd.appendBytes(e0.toBytes());

      var responseCheck = function responseCheck(rz) {
        var _rz$apdu11;

        var acceptableTemplates = [0xE2, 0xE3, 0xE4, 0xE5];
        var responseTemplate = rz === null || rz === void 0 ? void 0 : (_rz$apdu11 = rz.apdu) === null || _rz$apdu11 === void 0 ? void 0 : _rz$apdu11.template;
        var err = Terminal.parseContactError(rz);
        var mine = (0, _indexOf["default"])(acceptableTemplates).call(acceptableTemplates, responseTemplate) !== -1 || err;
        return [err, mine];
      };

      this.writer.sendAndReceive('startChipTx', cmd, {
        responseCheck: responseCheck
      }, function (error, response) {
        var _context38;

        if (error) {
          callback(error, response);
          return;
        }

        if (response.apdu.template === 0xe2 && (0, _find["default"])(_context38 = response.tlvs).call(_context38, _tlvlib.Tags.TerminalApplicationIdentifier)) {
          var dr = new _retailPaymentDevice.AvailableApplications(response);
          buildApps(dr, response);
          dr.apdu = response.apdu;
          callback(null, dr);
        } else {
          // TODO more specific response objects to allow other reader types
          callback(null, response);
        }
      });
    }
  }, {
    key: "startContactlessTransaction",
    value: function startContactlessTransaction(txSequenceNumber, txType, amount, currencyCode, callback) {
      var e0Tags = startTxCommon(txSequenceNumber, txType, amount, currencyCode);
      var e0 = new _tlvlib.TlvList();
      e0.add(_MiuraTags["default"].MiuraCommandData, e0Tags);
      var cmd = new _tlvlib.ApduCommand(0xDE, 0xC1, 0x04, 0x00);
      cmd.appendBytes(e0.toBytes());

      var responseCheck = function responseCheck(rz) {
        var _rz$apdu12, _rz$apdu13, _rz$apdu14;

        var error = null;
        var mine = false;
        var acceptableTemplates = [0xE3, 0xE4, 0xE5];
        var responseTemplate = rz === null || rz === void 0 ? void 0 : (_rz$apdu12 = rz.apdu) === null || _rz$apdu12 === void 0 ? void 0 : _rz$apdu12.template;

        if (!responseTemplate && (rz === null || rz === void 0 ? void 0 : (_rz$apdu13 = rz.apdu) === null || _rz$apdu13 === void 0 ? void 0 : _rz$apdu13.sw1) === 0x9f && (rz === null || rz === void 0 ? void 0 : (_rz$apdu14 = rz.apdu) === null || _rz$apdu14 === void 0 ? void 0 : _rz$apdu14.sw2) === 0xff) {
          error = _retailPaymentDevice.deviceError.contactlessPaymentAbortedByCardInsert;
          mine = true;
        } else {
          error = Terminal.parseContactlessError(rz);
          mine = (0, _indexOf["default"])(acceptableTemplates).call(acceptableTemplates, responseTemplate) !== -1 || Terminal.parseContactlessError(rz);
        }

        Log.error('got this in error ', {
          error: error,
          mine: mine
        });
        return [error, mine];
      };

      this.writer.sendAndReceive('startNFCtx', cmd, {
        responseCheck: responseCheck
      }, function (err, response) {
        var error = err || Terminal.parseContactlessError(response);
        callback(error, response);
      });
    }
  }, {
    key: "continueTransaction",
    value: function continueTransaction(authCode, callback) {
      // The authCode is in fact a TLV buffer. Not the best name from the server for this. So we
      // hand pack the message to the terminal.
      var responseCheck = this.getResponseCheck([0xE2, 0xE3, 0xE4, 0xE5], 'continueTransaction', false);
      var cmd = new _tlvlib.ApduCommand(0xDE, 0xD2);
      cmd.expectNoBytes = true;
      var e0 = new _tlvlib.TlvList();
      e0.add(0xE0, Buffer.from(authCode, 'hex'));
      cmd.appendBytes(e0.toBytes());
      this.writer.sendAndReceive('continueTx', cmd, {
        responseCheck: responseCheck
      }, function (err, rz) {
        var rzError;

        if ((rz === null || rz === void 0 ? void 0 : rz.apdu) && (rz.apdu.template === 0XE5 || !rz.apdu.data || rz.apdu.sw1 === 0x9f)) {
          rzError = _retailPaymentDevice.deviceError.contactIssuer;
        }

        callback(rzError || err, rz);
      });
    }
  }, {
    key: "selectApplication",
    value: function selectApplication(aid, callback) {
      var responseCheck = this.getResponseCheck([0xE1], 'selectApplication', true);
      var cmd = new _tlvlib.ApduCommand(0xDE, 0xD2);
      cmd.expectNoBytes = true;
      var e0Tags = new _tlvlib.TlvList();
      e0Tags.add(_tlvlib.Tags.TerminalApplicationIdentifier, aid);
      var e0 = new _tlvlib.TlvList();
      e0.add(0xE0, e0Tags.toBytes());
      cmd.appendBytes(e0.toBytes());
      this.writer.sendAndReceive('selectApp', cmd, {
        responseCheck: responseCheck
      }, callback);
    }
  }, {
    key: "formFactors",
    get: function get() {
      // until we know for sure, assume we can only handle chip
      return this.Config && this.Config.formFactors || [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.MagneticCardSwipe];
    }
  }], [{
    key: "parseContactError",
    value: function parseContactError(response) {
      if (!response || !response.apdu) {
        return _retailPaymentDevice.deviceError.badEmvData;
      }

      var apdu = response.apdu;

      if (apdu.template === 0xE5) {
        return _retailPaymentDevice.deviceError.contactIssuer;
      }

      var errorMap = {
        0x41: _retailPaymentDevice.deviceError.paymentCancelled,
        0x23: _retailPaymentDevice.deviceError.smartCardNotInSlot,
        0x25: _retailPaymentDevice.deviceError.cardBlocked,
        0x28: _retailPaymentDevice.deviceError.mustSwipeCard
      };

      if (apdu.sw1 === 0x9f && errorMap[apdu.sw2]) {
        return errorMap[apdu.sw2];
      }

      return null;
    }
  }, {
    key: "parseContactlessError",
    value: function parseContactlessError(response) {
      if (!response || !response.apdu) {
        return _retailPaymentDevice.deviceError.badEmvData;
      }

      var apdu = response.apdu;

      if (apdu.template === 0xE5) {
        return _retailPaymentDevice.deviceError.nfcNotAllowed;
      }

      var errorMap = {
        0x41: _retailPaymentDevice.deviceError.paymentCancelled,
        0x42: _retailPaymentDevice.deviceError.nfcTimeout,
        0x43: _retailPaymentDevice.deviceError.contactlessPaymentAbortedByCardInsert,
        0x44: _retailPaymentDevice.deviceError.contactlessPaymentAbortedByCardSwipe,
        0xc1: _retailPaymentDevice.deviceError.nfcNotAllowed,
        0xc2: _retailPaymentDevice.deviceError.tryDifferentCard,
        0xc3: _retailPaymentDevice.deviceError.mustInsertCard,
        0xcf: _retailPaymentDevice.deviceError.hardwareError
      };

      if (apdu.sw1 === 0x9f && errorMap[apdu.sw2]) {
        return errorMap[apdu.sw2];
      }

      if (!apdu.isSuccess) {
        return _retailPaymentDevice.deviceError.generic;
      }

      return null;
    }
  }]);
  return Terminal;
}(_events.EventEmitter);

exports.Terminal = Terminal;

}).call(this)}).call(this,require("buffer").Buffer)
},{"./MiuraTags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraTags.js","./Parser":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/Parser.js","./TerminalConfig":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/TerminalConfig.js","./TerminalDisplay":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/TerminalDisplay.js","./Writer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/Writer.js","./messages/BatteryStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/BatteryStatus.js","./messages/CardStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/CardStatus.js","./messages/KeyStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/KeyStatus.js","./messages/TerminalStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/TerminalStatus.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/asyncToGenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","regenerator-runtime/runtime":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regenerator-runtime/runtime.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/TerminalConfig.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.to-string");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _tlvlib = require("tlvlib");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _MiuraTags = _interopRequireDefault(require("./MiuraTags"));

var _DeviceCaps = _interopRequireDefault(require("./messages/DeviceCaps"));

var _Writer = require("./Writer");

var Log = (0, _manticoreLog["default"])('miura.terminal.config');

function numberToBuffer(number, lengthInBytes) {
  var buf = Buffer.alloc(lengthInBytes);
  buf.writeUIntBE(number, 0, lengthInBytes);
  return buf;
}
/**
 * Terminal commands related to device configuration
 */


var TerminalConfig = /*#__PURE__*/function () {
  function TerminalConfig(device) {
    (0, _classCallCheck2["default"])(this, TerminalConfig);
    this.device = device;
    this.writer = device.writer;
  }

  (0, _createClass2["default"])(TerminalConfig, [{
    key: "removeLogs",
    value: function removeLogs(callback) {
      Log.debug('removeLogs');
      this.writer.sendAndReceive('removeLogs', new _tlvlib.ApduCommand(0xD0, 0xE1, 0x01), callback);
    }
  }, {
    key: "archiveLogs",
    value: function archiveLogs(callback) {
      Log.debug('archiveLogs');
      this.writer.sendAndReceive('archiveLogs', new _tlvlib.ApduCommand(0xD0, 0xE1), callback);
    }
    /**
     * Select a file on the terminal, such as mpi.log
     * @param file
     * @param truncate
     * @param callback
     */

  }, {
    key: "selectFile",
    value: function selectFile(file, truncate, callback) {
      var cmd = new _tlvlib.ApduCommand(0, 0xA4, truncate ? 1 : 0);
      cmd.appendString(file);
      Log.debug(function () {
        var _context;

        return (0, _concat["default"])(_context = "Miura Sending selectFile (".concat(file, ") ApduCommand: ")).call(_context, cmd);
      });
      this.writer.sendAndReceive('selectFile', cmd, callback);
    }
  }, {
    key: "readBinary",
    value: function readBinary(offset, len, callback) {
      var cmd;

      if (offset > 0x7FFF) {
        cmd = new _tlvlib.ApduCommand(0, 0xB0, 0x80 | offset >> 16 & 0x7F, offset >> 8 & 0xFF);
        cmd.appendBytes(Buffer.from([offset & 0xFF]));
      } else {
        cmd = new _tlvlib.ApduCommand(0, 0xB0, offset >> 8 & 0x7F, offset & 0xFF);
      }

      cmd.le = len;
      this.writer.sendAndReceive('readBinary', cmd, {
        rawResponse: true
      }, callback);
    }
  }, {
    key: "getConfiguration",
    value: function getConfiguration(callback) {
      this.writer.sendAndReceive('getConfig', new _tlvlib.ApduCommand(0xD0, 1), function (e, r) {
        if (r) {
          callback(e, new _DeviceCaps["default"](r));
        } else {
          callback(e, r);
        }
      });
    }
  }, {
    key: "getDeviceCapabilities",
    value: function getDeviceCapabilities(callback) {
      var _this = this;

      this.writer.sendAndReceive('getDeviceCapabilities', new _tlvlib.ApduCommand(0xD0, 2), function (e, r) {
        var deviceCaps = null;

        if (r && r.apdu.isSuccess) {
          deviceCaps = new _DeviceCaps["default"](r);
          _this._factors = [];

          if (deviceCaps.caps.Smartcard) {
            _this._factors.push(_retailPaymentDevice.FormFactor.Chip);
          }

          if (deviceCaps.caps.Contactless) {
            _this._factors.push(_retailPaymentDevice.FormFactor.EmvCertifiedContactless);
          }

          if (deviceCaps.caps.Mag) {
            _this._factors.push(_retailPaymentDevice.FormFactor.MagneticCardSwipe);
          }

          if (deviceCaps.caps.Keyboard) {
            _this._factors.push(_retailPaymentDevice.FormFactor.SecureManualEntry);
          }
        } else {
          Log.debug('Miura device does not support getDeviceCapabilities - proceeding with default capabilities.');
        }

        callback(e, deviceCaps);
      });
    }
  }, {
    key: "getP2PEStatus",
    value: function getP2PEStatus(callback) {
      this.writer.sendAndReceive('getP2PEStatus', new _tlvlib.ApduCommand(0xEE, 0xE0), callback);
    }
  }, {
    key: "initializeP2PE",
    value: function initializeP2PE(callback) {
      this.writer.sendAndReceive('initializeP2PE', new _tlvlib.ApduCommand(0xEE, 0xE1), callback);
    }
  }, {
    key: "importP2PE",
    value: function importP2PE(callback) {
      this.writer.sendAndReceive('importP2PE', new _tlvlib.ApduCommand(0xEE, 0xE2), callback);
    }
  }, {
    key: "getLogFile",
    value: function getLogFile(callback) {
      var _this2 = this;

      Log.debug('getLogFile');
      this.archiveLogs(function (eAl) {
        if (eAl) {
          var _context2;

          Log.error((0, _concat["default"])(_context2 = "Failed to archive Logs: ".concat(eAl.message, "\n")).call(_context2, eAl.stack));
          callback(eAl);
          return;
        }

        _this2.getFile('mpi.log', function (eGf, rGf) {
          if (eGf) {
            var _context3;

            Log.error((0, _concat["default"])(_context3 = "Failed to get mpi.log: ".concat(eGf.message, "\n")).call(_context3, eGf.stack));
          }

          callback(eGf, rGf); // ToDo: Decide whether we want to remove after copying, as recommended by Miura docs?
        });
      });
    }
  }, {
    key: "getFile",
    value: function getFile(filename, callback) {
      var _this3 = this;

      this.selectFile(filename, 0, function (e, rz) {
        var _context4, _context5;

        if (e || !rz.apdu.isSuccess) {
          callback(e || new Error("Could not select file ".concat(filename)), null);
          return;
        }

        var lenVal = (0, _find["default"])(_context4 = rz.tlvs).call(_context4, _MiuraTags["default"].MiuraFileLength);

        if (!lenVal || !lenVal.bytes) {
          callback(new Error("Empty or missing file length for ".concat(filename)));
          return;
        }

        var len = lenVal.parse();
        Log.debug((0, _concat["default"])(_context5 = "Fetching ".concat(len, " bytes of ")).call(_context5, filename));
        var offset = 0;
        var bufs = [];

        var reader = function reader() {
          _this3.readBinary(offset, 250, function (err, rzReadBinary) {
            if (err) {
              callback(err);
              return;
            }

            len -= rzReadBinary.apdu.data.length;
            offset += rzReadBinary.apdu.data.length;
            bufs.push(rzReadBinary.apdu.data);

            if (len > 0) {
              reader();
              return;
            }

            callback(null, (0, _concat["default"])(Buffer).call(Buffer, bufs));
          });
        };

        reader();
      });
    }
  }, {
    key: "streamBinary",
    value: function streamBinary(data, offset, timeout, md5, callback) {
      var cmd = new _tlvlib.ApduCommand(0, 0xd7, md5 ? 1 : 0);
      var e0Tags = new _tlvlib.TlvList();
      var isBuffer = Buffer.isBuffer(data);
      var e0 = new _tlvlib.TlvList(); // If it's not a buffer, it's a base64 string

      var dataLength = isBuffer ? data.length : (0, _Writer.base64ByteLength)(data);
      e0Tags.add(_MiuraTags["default"].MiuraFileWriteOffset, numberToBuffer(offset, 3));
      e0Tags.add(_MiuraTags["default"].MiuraFileWriteLength, numberToBuffer(dataLength, 3));
      e0Tags.add(_MiuraTags["default"].MiuraFileWriteTimeout, numberToBuffer(timeout, 1));
      e0.add(_MiuraTags["default"].MiuraCommandData, e0Tags);
      cmd.appendBytes(e0.toBytes());
      Log.debug(function () {
        var _context6;

        return (0, _concat["default"])(_context6 = "Miura sending binary stream of ".concat(dataLength, " bytes with offset ")).call(_context6, offset);
      });
      this.writer.sendAndReceive('streamBinary', cmd, {
        additionalData: data
      }, function (error, result) {
        var md5Error = null;

        if (!error && md5 && result && result.tlvs) {
          var _context7;

          var terminalMD5 = (0, _find["default"])(_context7 = result.tlvs).call(_context7, _MiuraTags["default"].MiuraFileMD5);
          terminalMD5 = terminalMD5 && terminalMD5.bytes.toString('hex');
          Log.debug(function () {
            var _context8;

            return (0, _concat["default"])(_context8 = "Comparing md5s. \nSource: ".concat(md5, " \nDestination: ")).call(_context8, terminalMD5);
          });

          if (md5 !== terminalMD5) {
            md5Error = new Error('Mismatched MD5 after streaming binary!');
          }
        }

        if (callback) {
          callback(error || md5Error, result);
        }
      });
    }
  }, {
    key: "formFactors",
    get: function get() {
      return this._factors;
    }
  }]);
  return TerminalConfig;
}();

exports["default"] = TerminalConfig;

}).call(this)}).call(this,require("buffer").Buffer)
},{"./MiuraTags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraTags.js","./Writer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/Writer.js","./messages/DeviceCaps":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/DeviceCaps.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/TerminalDisplay.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.exec");

require("core-js/modules/es.regexp.to-string");

require("core-js/modules/es.string.split");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _getIteratorMethod2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator-method"));

var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));

var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _l10nManticore = _interopRequireDefault(require("l10n-manticore"));

var _en = _interopRequireDefault(require("./strings/m010/en"));

function _createForOfIteratorHelper(o) {
  if (typeof _symbol["default"] === "undefined" || (0, _getIteratorMethod2["default"])(o) == null) {
    if ((0, _isArray["default"])(o) || (o = _unsupportedIterableToArray(o))) {
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var it,
      normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = (0, _getIterator2["default"])(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context2;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  var n = (0, _slice["default"])(_context2 = Object.prototype.toString.call(o)).call(_context2, 8, -1);
  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return (0, _from["default"])(n);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Message = _retailPaymentDevice.PaymentDevice.Message;
var Log = (0, _manticoreLog["default"])('miura.terminal.displayFormatter');

function centerLine(l, w) {
  if (l.length >= w - 1 || l.length === 0) {
    return l;
  }

  return Array(Math.floor((w - l.length) / 2) + 1).join(' ') + l;
}

var TerminalDisplay = /*#__PURE__*/function () {
  function TerminalDisplay(model) {
    (0, _classCallCheck2["default"])(this, TerminalDisplay);
    this.model = model; // This needs to be listed as ifs so that browserify picks up all the relevant files.

    if (model === 'M010') {
      this.lines = 4; // TODO this comes from somewhere in the configs?

      this.lineWidth = 21; // TODO this comes from somewhere in the configs?

      this.l10n = (0, _l10nManticore["default"])({
        en: _en["default"]
      });
    }
  }

  (0, _createClass2["default"])(TerminalDisplay, [{
    key: "formatMessage",
    value: function formatMessage(messageId, values, displaySystemIcons) {
      var _context;

      var verticallyCenter = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
      var actualMessageId = messageId === Message.SoftwareUpdateProgress && values ? "SwUpdate.".concat(values.stage) : messageId;
      var formatted = this.l10n(actualMessageId, values);

      if (formatted !== actualMessageId) {
        return this.centerString(formatted.split('\n'), displaySystemIcons, verticallyCenter).join('\n');
      }

      Log.error((0, _concat["default"])(_context = "Could not format message with id: ".concat(messageId, " values: ")).call(_context, (0, _stringify["default"])(values)));
      return '';
    }
  }, {
    key: "centerString",
    value: function centerString(lineOrLines, displaySystemIcons, verticallyCenter) {
      var actualLines = lineOrLines;

      if (typeof lineOrLines === 'string') {
        if (!this.lines) {
          return [centerLine(lineOrLines, this.lineWidth)];
        }

        actualLines = [lineOrLines];
      }

      var newStrs = [];

      var _iterator = _createForOfIteratorHelper(actualLines),
          _step;

      try {
        for (_iterator.s(); !(_step = _iterator.n()).done;) {
          var l = _step.value;
          newStrs.push(centerLine(l, this.lineWidth));
        }
      } catch (err) {
        _iterator.e(err);
      } finally {
        _iterator.f();
      }

      if (!verticallyCenter) {
        return newStrs;
      }

      if (!displaySystemIcons && newStrs.length < this.lines) {
        newStrs.unshift('');
      }

      var lines = this.lines;

      while (lines && lines > newStrs.length + 1) {
        newStrs.unshift('');
        lines -= 1;
      }

      return newStrs;
    }
  }]);
  return TerminalDisplay;
}();

exports["default"] = TerminalDisplay;

},{"./strings/m010/en":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/strings/m010/en.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.split":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js","l10n-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/l10n-manticore/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/Writer.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.to-string");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.buildCommandBytes = buildCommandBytes;
exports.base64ByteLength = base64ByteLength;
exports.Writer = exports.CommandStatus = void 0;

var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _getIteratorMethod2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator-method"));

var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));

var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _setImmediate2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-immediate"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _splice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/splice"));

var _findIndex = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find-index"));

var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _Parser = require("./Parser");

function _createForOfIteratorHelper(o) {
  if (typeof _symbol["default"] === "undefined" || (0, _getIteratorMethod2["default"])(o) == null) {
    if ((0, _isArray["default"])(o) || (o = _unsupportedIterableToArray(o))) {
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var it,
      normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = (0, _getIterator2["default"])(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context20;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  var n = (0, _slice["default"])(_context20 = Object.prototype.toString.call(o)).call(_context20, 8, -1);
  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return (0, _from["default"])(n);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Log = (0, _manticoreLog["default"])('miura.writer');

function buildCommandBytes(apdu) {
  var lrc = 0;
  var preamble = Buffer.alloc(3);
  preamble.writeUInt8(1, 0); // NAD always 1

  lrc ^= 1;
  preamble.writeUInt8(0, 1); // PCB always 0

  var meat = apdu.toBytes();

  if (meat.length > 255) {
    throw _retailPaymentDevice.deviceError.dataValidationError.withDevMessage("Miura command is too long, max 255 bytes, got ".concat(meat.length));
  }

  preamble.writeUInt8(meat.length, 2);
  lrc ^= meat.length;

  for (var i = 0; i < meat.length; i++) {
    lrc ^= meat[i];
  }

  var epilogue = Buffer.alloc(1);
  epilogue.writeUInt8(lrc & 0xFF, 0);
  return (0, _concat["default"])(Buffer).call(Buffer, [preamble, meat, epilogue]);
}

function base64ByteLength(str) {
  var rawLength = str.length * (3 / 4);

  if (str[str.length - 1] === '=') {
    rawLength -= 1;
  }

  if (str[str.length - 2] === '=') {
    rawLength -= 1;
  }

  return rawLength;
}

var CommandStatus = {
  Queued: 0,
  AwaitingResponse: 1
};
/**
 * A class to manage outbound messages to the Terminal and hook up appropriate callbacks with
 * terminal responses.
 * @class
 */

exports.CommandStatus = CommandStatus;

var Writer = /*#__PURE__*/function () {
  function Writer(terminal, sendFn) {
    var _this = this;

    (0, _classCallCheck2["default"])(this, Writer);
    this._terminal = terminal;
    this._sendFn = sendFn;
    this._parser = this._terminal.parser;

    this._parser.on(_Parser.ParserEvent.response, function (r) {
      _this._responseHandler(r);
    });

    this._terminal.reader.on(_retailPaymentDevice.PaymentDevice.Event.disconnected, function () {
      return _this._deviceDisconnected();
    });

    this._requestQueue = [];
    this._requestCounter = 0;
    this._responseQueue = [];
  }

  (0, _createClass2["default"])(Writer, [{
    key: "sendAndReceiveP",
    value: function sendAndReceiveP(cmdName, apdu, opts) {
      var _this2 = this;

      return new _promise["default"](function (accept, reject) {
        _this2.sendAndReceive(cmdName, apdu, opts, function (error, result) {
          if (error) {
            reject(error);
          } else {
            accept(result);
          }
        });
      });
    }
  }, {
    key: "updateLastCommand",
    value: function updateLastCommand(cmd) {
      Log.info('Miura Command', {
        name: cmd === null || cmd === void 0 ? void 0 : cmd.name,
        ordinal: cmd === null || cmd === void 0 ? void 0 : cmd.ordinal
      });
    }
    /**
     * Send a command to Miura and invoke the callback with the response from the device
     * Options:
     *   additionalData: (Buffer/Base64 string) additional data that must be sent with the apdu
     *   noResponse: (Boolean) if true then the request is not expected to get a response from the reader
     *   rawResponse: (Boolean) if true the response is expected to be a stream of raw data rather than a message
     *   responseCheck: (Function (response) => [error, handled]) if this request would receive a response first the responseCheck is invoked. It should return true for handled if it wants to claim the response, false if it wants the next request to attempt to handle it, and an error if the an error should be communicated to the next response
     * @param cmdName - Name for the Apdu command. Primarily used for logging purposes
     * @param apdu The tlvlib.ApduCommand to send
     * @param opts - An object containing one/many/none of the options described above OR a function which is shorthand for sendAndReceive(apdu, null, opts)
     * @param callback - The callback function to invoke on receiving an error (if any) and response from the reader
     */

    /* eslint-disable no-param-reassign */

  }, {
    key: "sendAndReceive",
    value: function sendAndReceive(name, apdu, opts, callback) {
      var _this3 = this;

      if (typeof opts === 'function') {
        callback = opts;
        opts = {};
      }

      opts = opts || {};
      Log.debug(function () {
        var _context, _context2;

        return (0, _concat["default"])(_context = (0, _concat["default"])(_context2 = "Queueing '".concat(name, "(")).call(_context2, _this3._requestCounter, ")' ")).call(_context, apdu.toString(true));
      });
      var dataParts = [buildCommandBytes(apdu)];

      if (opts.additionalData) {
        dataParts.push(opts.additionalData);
      }

      var requestData = {
        name: name,
        dataParts: dataParts,
        callback: callback,
        noResponse: opts.noResponse,
        rawResponse: opts.rawResponse,
        responseCheck: opts.responseCheck,
        status: CommandStatus.Queued,
        ordinal: this._requestCounter
      };
      this._requestCounter += 1;

      this._requestQueue.push(requestData);

      this._sendNext();
    }
    /* eslint-enable no-param-reassign */

    /**
     * If we're not already sending a message send the next one. recursive to send all available messages asap
     * @private
     */

  }, {
    key: "_sendNext",
    value: function _sendNext() {
      var _context3,
          _context4,
          _context5,
          _this4 = this;

      if (this.sending) {
        return;
      }

      var cmd = (0, _find["default"])(_context3 = this._requestQueue).call(_context3, function (x) {
        return x.status === CommandStatus.Queued && x.name === 'abortTransaction';
      }) || (0, _find["default"])(_context4 = this._requestQueue).call(_context4, function (x) {
        return x.status === CommandStatus.Queued;
      });

      if ((0, _some["default"])(_context5 = this._requestQueue).call(_context5, function (x) {
        return x.status === CommandStatus.AwaitingResponse;
      }) && (cmd === null || cmd === void 0 ? void 0 : cmd.name) !== 'abortTransaction') {
        Log.debug('Awaiting response for a request');
      } else if (cmd) {
        cmd.status = CommandStatus.AwaitingResponse;
        this.sending = true;

        this._updateParserExpectations();

        this.updateLastCommand(cmd);

        this._send(cmd.name, cmd.dataParts, function (error) {
          if (error || cmd.noResponse) {
            var _context7;

            if (error) {
              var _context6;

              Log.error((0, _concat["default"])(_context6 = "_sendNext failure: ".concat(error, " ")).call(_context6, error.message));
            }

            var cmdIndex = (0, _findIndex["default"])(_context7 = _this4._requestQueue).call(_context7, function (e) {
              return e.ordinal === cmd.ordinal;
            });

            if (cmdIndex !== -1) {
              var _context8;

              (0, _splice["default"])(_context8 = _this4._requestQueue).call(_context8, cmdIndex, 1);
            }

            if (cmd.callback) {
              cmd.callback(error);
            }
          }

          _this4.sending = false;

          _this4._sendNext();
        });
      } else {
        Log.debug('No suitable message to send');
      }
    }
    /**
     * Communicate the given data to the terminal. Implements recursive throttling and chunking to accommodate shortcomings in the comm stack
     * @private
     */

  }, {
    key: "_send",
    value: function _send(name, dataParts) {
      var _this$throttleInfo,
          _this5 = this;

      var callback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
      var offset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;

      if (!this._terminal.reader.canPushCommands()) {
        if (callback) {
          callback(_retailPaymentDevice.deviceError.cannotAcceptMessage);
        }

        return;
      }

      var data = dataParts[0];
      var isBuffer = Buffer.isBuffer(data);
      var dataLen = isBuffer ? data.length : base64ByteLength(data);
      var bytesToWrite = dataLen - offset;
      bytesToWrite = bytesToWrite > ((_this$throttleInfo = this.throttleInfo) === null || _this$throttleInfo === void 0 ? void 0 : _this$throttleInfo.size) ? this.throttleInfo.size : bytesToWrite;
      Log.debug('Sending data part', {
        dataLen: dataLen,
        offset: offset,
        lengthToSend: bytesToWrite,
        remainingParts: dataParts.length
      });
      var sendArgs;

      if (offset || bytesToWrite < dataLen) {
        if (isBuffer) {
          // It's a buffer, so don't bother making the sendFn do the substring of an overly long base64
          sendArgs = (0, _slice["default"])(data).call(data, offset, offset + bytesToWrite).toString('base64');
        } else {
          // It's base64, so leave it alone and let native pull it out
          sendArgs = {
            data: data,
            offset: offset,
            len: bytesToWrite
          };
        }
      } else {
        sendArgs = isBuffer ? data.toString('base64') : data;
      }

      this._sendFn(name, sendArgs, function (error) {
        if (error) {
          callback(error);
        } else {
          var newOffset = offset + bytesToWrite;

          if (newOffset >= dataLen) {
            dataParts.shift();
            newOffset = 0;
          }

          if (!dataParts.length) {
            Log.debug('Successfully sent message.');
            callback();
          } else {
            (0, _setImmediate2["default"])(function () {
              return _this5._send(name, dataParts, callback, newOffset);
            });
          }
        }
      });
    }
    /**
     * @private
     */

  }, {
    key: "_updateParserExpectations",
    value: function _updateParserExpectations() {
      var currentRequest = this._requestQueue.length && this._requestQueue[0];

      if (currentRequest && currentRequest.status === CommandStatus.AwaitingResponse) {
        this._parser.expectRawBytes = currentRequest.rawResponse;
      } else {
        this._parser.expectRawBytes = false;
      }
    }
    /**
     * Clean up after device disconnection
     * @private
     */

  }, {
    key: "_deviceDisconnected",
    value: function _deviceDisconnected() {
      var _iterator = _createForOfIteratorHelper(this._requestQueue),
          _step;

      try {
        for (_iterator.s(); !(_step = _iterator.n()).done;) {
          var request = _step.value;

          if (request.callback) {
            request.callback(_retailPaymentDevice.deviceError.deviceNotConnected);
          }
        }
      } catch (err) {
        _iterator.e(err);
      } finally {
        _iterator.f();
      }

      this._requestQueue = [];
      this._responseQueue = [];

      this._updateParserExpectations();
    }
    /**
     * Add a response to the queue so we can be sure to handle it in the order it was received
     * @private
     */

  }, {
    key: "_responseHandler",
    value: function _responseHandler(rz) {
      this._responseQueue.push(rz);

      this._handleNextResponse();
    }
    /**
     * If we are not handling a response and there is one to handle find the associated request and do the right thing
     * @private
     */

  }, {
    key: "_handleNextResponse",
    value: function _handleNextResponse() {
      var _this6 = this;

      if (!this._handlingResponse && this._responseQueue.length) {
        (function () {
          _this6._handlingResponse = true; // Skip over responses that don't meet specified criteria of the earlier messages.

          var response = _this6._responseQueue.shift();

          var template = response.apdu && response.apdu.template ? response.apdu.template.toString(16) : '<empty>';
          var sw1 = response.apdu && response.apdu.sw1 && response.apdu.sw1.toString(16);
          var sw2 = response.apdu && response.apdu.sw2 && response.apdu.sw2.toString(16);
          var raw = response.raw && response.raw.toString('hex');
          var requestIndex = 0;
          var request = null;
          var error = null;
          var handled = false; // eslint-disable-next-line no-constant-condition

          while (1) {
            // These remaining outstanding requests and responses should eventually get to 0.
            Log.debug(function () {
              var _context9;

              return (0, _concat["default"])(_context9 = "Remaining unhandled responses: ".concat(_this6._responseQueue.length, ". Remaining outstanding requests: ")).call(_context9, _this6._requestQueue.length, ".");
            });

            if (requestIndex === -1 || _this6._requestQueue.length <= requestIndex || _this6._requestQueue[requestIndex].status !== CommandStatus.AwaitingResponse) {
              var _context10; // For now, ignore unexpected responses.


              _this6._handlingResponse = false;
              Log.warn('Unexpected response: ', {
                queue: (0, _map["default"])(_context10 = _this6._requestQueue).call(_context10, function (cmd) {
                  return {
                    name: cmd.name,
                    status: cmd.status,
                    ordinal: cmd.ordinal
                  };
                }),
                index: requestIndex,
                template: template,
                sw1: sw1,
                sw2: sw2
              });
              _this6._responseQueue = [];
              break;
            }

            request = _this6._requestQueue[requestIndex];

            if (!error && request.responseCheck) {
              var _request$responseChec = request.responseCheck(response);

              var _request$responseChec2 = (0, _slicedToArray2["default"])(_request$responseChec, 2);

              error = _request$responseChec2[0];
              handled = _request$responseChec2[1];
            } else {
              handled = true;
            }

            if (handled) {
              var _context11;

              (0, _splice["default"])(_context11 = _this6._requestQueue).call(_context11, requestIndex, 1);

              if (request.callback) {
                try {
                  var _context12, _context13, _context14, _context15, _context16, _context17;

                  Log.debug((0, _concat["default"])(_context12 = (0, _concat["default"])(_context13 = (0, _concat["default"])(_context14 = (0, _concat["default"])(_context15 = (0, _concat["default"])(_context16 = (0, _concat["default"])(_context17 = "Response will be handled by request '".concat(request.name, "(")).call(_context17, request.ordinal, ")'. Response template ")).call(_context16, template, " SW1: ")).call(_context15, sw1, " SW2: ")).call(_context14, sw2, " Raw: ")).call(_context13, raw, ". Remaining requests: ")).call(_context12, _this6._requestQueue.length));
                  request.callback(error, response);
                } catch (x) {
                  var _context18;

                  Log.error((0, _concat["default"])(_context18 = "Error ".concat(x, " executing callback ")).call(_context18, request.callback));
                  request.callback(x, response);
                }
              }

              _this6._updateParserExpectations();

              _this6._handlingResponse = false;

              _this6._sendNext();

              _this6._handleNextResponse();

              break;
            } else {
              var _context19;

              requestIndex = (0, _findIndex["default"])(_context19 = _this6._requestQueue).call(_context19, // eslint-disable-next-line no-loop-func
              function (element, index) {
                return index > requestIndex && element.status === CommandStatus.AwaitingResponse;
              });
            }
          }
        })();
      }
    }
  }, {
    key: "throttleInfo",
    get: function get() {
      var _this$_terminal, _this$_terminal$reade;

      return (_this$_terminal = this._terminal) === null || _this$_terminal === void 0 ? void 0 : (_this$_terminal$reade = _this$_terminal.reader) === null || _this$_terminal$reade === void 0 ? void 0 : _this$_terminal$reade.throttleInfo;
    }
  }]);
  return Writer;
}();

exports.Writer = Writer;

}).call(this)}).call(this,require("buffer").Buffer)
},{"./Parser":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/Parser.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/find-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find-index.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js","@babel/runtime-corejs3/core-js-stable/instance/splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/promise.js","@babel/runtime-corejs3/core-js-stable/set-immediate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-immediate.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/cardMetadataParser.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.exec");

require("core-js/modules/es.regexp.to-string");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.getCardIssuer = getCardIssuer;
exports["default"] = parseCardMetadata;

var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _lastIndexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/last-index-of"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _tlvlib = require("tlvlib");

var _MiuraTags = _interopRequireDefault(require("./MiuraTags"));

var Log = (0, _manticoreLog["default"])('paymentDevice.miura.cardMetadataParser');
var swipeLastFourRegexMatcher;
var swipeFirstFourRegexMatcher;

function getMaskedPanFormEMVChipAndEMVContactlessBlob(responsePacket) {
  Log.debug('getMaskedPanFormEMVChipAndEMVContactlessBlob');
  var val = null;

  try {
    var _context, _context2, _context3, _context4; // Masked PAN is present in various different tags.. We need to parse one by one until we get what we need..


    var maskedPanTLV = (0, _find["default"])(_context = responsePacket.tlvs).call(_context, _MiuraTags["default"].MiuraMaskedPan) || (0, _find["default"])(_context2 = responsePacket.tlvs).call(_context2, _MiuraTags["default"].MiuraMaskedICCTrack2) || (0, _find["default"])(_context3 = responsePacket.tlvs).call(_context3, _MiuraTags["default"].MiuraMaskedTrack2) || (0, _find["default"])(_context4 = responsePacket.tlvs).call(_context4, _MiuraTags["default"].MiuraMaskedContactlessTrack2); // If we still don't find the TLV corresponding to masked pan then give up...

    if (!maskedPanTLV) {
      Log.warn('Unable to find the any TLV corresponding to masked pan');
      return null;
    }

    val = maskedPanTLV.bytes.toString('hex');

    if (!val) {
      Log.warn('maskedPanTLV:', {
        maskedPanTLV: maskedPanTLV
      });
    }

    Log.debug('maskedPanVal:', function () {
      return {
        val: val
      };
    });
  } catch (error) {
    Log.error('getMaskedPanFormEMVChipAndEMVContactlessBlob', {
      val: val,
      error: error
    });
  }

  return val;
}

function getLastFourFormEMVChipAndEMVContactlessBlob(responsePacket) {
  var lastFourStr = null;

  try {
    var _context5, _context6, _context7, _context8; // Masked PAN is present in various different tags.. We need to parse one by one until we get what we need..


    var lastFourTLV = (0, _find["default"])(_context5 = responsePacket.tlvs).call(_context5, _MiuraTags["default"].MiuraMaskedPan) || (0, _find["default"])(_context6 = responsePacket.tlvs).call(_context6, _MiuraTags["default"].MiuraMaskedICCTrack2) || (0, _find["default"])(_context7 = responsePacket.tlvs).call(_context7, _MiuraTags["default"].MiuraMaskedTrack2) || (0, _find["default"])(_context8 = responsePacket.tlvs).call(_context8, _MiuraTags["default"].MiuraMaskedContactlessTrack2); // If we still don't find the TLV corresponding to masked pan then give up...

    if (!lastFourTLV) {
      Log.warn('Unable to find the any TLV corresponding to masked pan');
      return null;
    }

    var maskedPan = getMaskedPanFormEMVChipAndEMVContactlessBlob(responsePacket);

    if (!maskedPan) {
      return null;
    } // With this blob we get the masked pan as [first 6 digits]ffffff[last 4 digits]ff..


    var indexMatcher = 'ffff';
    var index = (0, _indexOf["default"])(maskedPan).call(maskedPan, indexMatcher);
    lastFourStr = maskedPan.substring(index + indexMatcher.length); // Lets get rid of all f's until we hit valid numeric code..

    while (lastFourStr.length > 0 && lastFourStr.charAt(0) === 'f') {
      lastFourStr = lastFourStr.substring(1);
    }

    lastFourStr = lastFourStr.substring(0, 4);
  } catch (error) {
    Log.error('getLastFourFormEMVChipAndEMVContactlessBlob', {
      error: error,
      lastFourStr: lastFourStr
    });
  }

  return lastFourStr;
}

function getFirstFourFormEMVChipAndEMVContactlessBlob(responsePacket) {
  var maskedPan = null;

  try {
    var _context9, _context10, _context11, _context12; // Masked PAN is present in various different tags.. We need to parse one by one until we get what we need..


    var firstFourTLV = (0, _find["default"])(_context9 = responsePacket.tlvs).call(_context9, _MiuraTags["default"].MiuraMaskedPan) || (0, _find["default"])(_context10 = responsePacket.tlvs).call(_context10, _MiuraTags["default"].MiuraMaskedICCTrack2) || (0, _find["default"])(_context11 = responsePacket.tlvs).call(_context11, _MiuraTags["default"].MiuraMaskedTrack2) || (0, _find["default"])(_context12 = responsePacket.tlvs).call(_context12, _MiuraTags["default"].MiuraMaskedContactlessTrack2); // If we still don't find the TLV corresponding to masked pan then give up...

    if (!firstFourTLV) {
      Log.warn('Unable to find the any TLV corresponding to masked pan');
      return null;
    }

    maskedPan = getMaskedPanFormEMVChipAndEMVContactlessBlob(responsePacket);

    if (!maskedPan || maskedPan.length < 4) {
      return null;
    }

    maskedPan = maskedPan.substring(0, 4);
  } catch (error) {
    Log.error('getFirstFourFormEMVChipAndEMVContactlessBlob', {
      error: error,
      maskedPan: maskedPan
    });
  }

  return maskedPan;
}

function lastFourDigits(formFactor, responsePacket) {
  var match;
  var error;

  try {
    var emvData = responsePacket.apdu.data.toString('hex');

    if (formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
      if (!swipeLastFourRegexMatcher) {
        swipeLastFourRegexMatcher = /(?:2a){2,}(?!2a)((.){8})(?=3d)/;
      }

      match = swipeLastFourRegexMatcher.exec(emvData);

      if (match && match[1]) {
        var lastFourContainingString = Buffer.from(match[1], 'hex').toString('utf8');

        if (lastFourContainingString.length >= 4) {
          var lastFour = lastFourContainingString.substring(0, 4);
          Log.debug('Got last four digits of card as', function () {
            return {
              lastFour: lastFour
            };
          });
          return lastFour;
        }
      }
    }

    if (formFactor === _retailPaymentDevice.FormFactor.Chip || formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless) {
      var _lastFour = getLastFourFormEMVChipAndEMVContactlessBlob(responsePacket);

      if (_lastFour) {
        Log.debug('Got last four digits of card as', function () {
          return {
            lastFour: _lastFour
          };
        });
        return _lastFour;
      }
    }
  } catch (e) {
    error = e;
  }

  Log.error('Unable to parse last four digits with formFactor', {
    formFactor: formFactor,
    match: match,
    error: error
  });
  return null;
}

function firstFourDigits(formFactor, responsePacket) {
  var match;
  var error;

  try {
    var emvData = responsePacket.apdu.data.toString('hex');

    if (formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
      if (!swipeFirstFourRegexMatcher) {
        swipeFirstFourRegexMatcher = /dfae22(.*?)(3b)(.*?)(?=2a)/i;
      }

      match = swipeFirstFourRegexMatcher.exec(emvData);

      if (match && match[3]) {
        var firstFourContainingString = Buffer.from(match[3], 'hex').toString('utf8');

        if (firstFourContainingString.length >= 4) {
          var firstFour = firstFourContainingString.substring(0, 4);
          Log.debug('Got first four digits of card as', function () {
            return {
              firstFour: firstFour
            };
          });
          return firstFour;
        }
      }
    }

    if (formFactor === _retailPaymentDevice.FormFactor.Chip || formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless) {
      var _firstFour = getFirstFourFormEMVChipAndEMVContactlessBlob(responsePacket);

      if (_firstFour) {
        Log.debug('Got first four digits of card as', function () {
          return {
            firstFour: _firstFour
          };
        });
        return _firstFour;
      }
    }
  } catch (e) {
    error = e;
  }

  Log.error('Unable to parse first four digits with formFactor:', {
    formFactor: formFactor,
    match: match,
    error: error
  });
  return null;
}

function getCardIssuer(formFactor, responsePacket) {
  try {
    if (formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
      var _context13;

      var emvData = responsePacket.apdu.data.toString('hex');
      var start = (0, _lastIndexOf["default"])(_context13 = emvData.toString()).call(_context13, '3b');
      var end = (0, _lastIndexOf["default"])(emvData).call(emvData, '2a');

      if (start > end) {
        var _context14;

        start = (0, _lastIndexOf["default"])(_context14 = (0, _slice["default"])(emvData).call(emvData, 0, end)).call(_context14, '3b');
      }

      if (end < 0 || start < 0) {
        return null;
      }

      emvData = emvData.substring(start + 2, end);
      var cardNumber = Buffer.from(emvData, 'hex').toString('utf8');
      return _retailPaymentDevice.CardDataUtil.getCardIssuerFromCardNumber(cardNumber);
    }

    if (formFactor === _retailPaymentDevice.FormFactor.Chip || formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless) {
      var _context15;

      var appLabel = (0, _find["default"])(_context15 = responsePacket.tlvs).call(_context15, _tlvlib.Tags.ApplicationLabel);
      var appLabelVal = appLabel ? appLabel.parse() : null;

      var cardIssuer = _retailPaymentDevice.CardDataUtil.getCardIssuerFromEmvAppLabel(appLabelVal);

      if (cardIssuer === _retailPaymentDevice.CardIssuer.Unknown) {
        var _responsePacket$tlvs$, _context16;

        var applicationIdentifier = (_responsePacket$tlvs$ = (0, _find["default"])(_context16 = responsePacket.tlvs).call(_context16, 0x9F06)) === null || _responsePacket$tlvs$ === void 0 ? void 0 : _responsePacket$tlvs$.parse().toString('hex').toUpperCase();
        cardIssuer = _retailPaymentDevice.CardDataUtil.getCardIssuerFromEmvAID(applicationIdentifier);
      }

      return cardIssuer;
    }
  } catch (error) {
    Log.error('getCardIssuer', {
      error: error
    });
  }

  return null;
}

function isSignatureCvmRequired(formFactor, responsePacket) {
  try {
    var _context17;

    var cvmStatus = (0, _find["default"])(_context17 = responsePacket.tlvs).call(_context17, _MiuraTags["default"].MiuraCardholderVerificationStatus);
    Log.debug('Signature data from card:', function () {
      return {
        cvmStatus: cvmStatus === null || cvmStatus === void 0 ? void 0 : cvmStatus.parse()
      };
    });

    if (!cvmStatus) {
      return true;
    }

    var parsedCVMStatus = cvmStatus.parse();

    if (!parsedCVMStatus) {
      return true;
    }

    var _parsedCVMStatus = (0, _slicedToArray2["default"])(parsedCVMStatus, 1),
        first = _parsedCVMStatus[0];

    if (formFactor === _retailPaymentDevice.FormFactor.Chip) {
      if (first === 1 || first === 2 || first === 4 || first === 0x1F) {
        return false;
      }
    } else if (first === 0 || first === 2 || first === 3) {
      return false;
    }
  } catch (error) {
    Log.error('isSignatureCvmRequired', {
      error: error
    });
  }

  return true;
}

function getEmvResponseInfo(formFactor, responsePacket) {
  try {
    if (formFactor === _retailPaymentDevice.FormFactor.Chip || formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless) {
      var _responsePacket$tlvs$2, _context18, _responsePacket$tlvs$3, _context19, _responsePacket$tlvs$4, _context20, _responsePacket$tlvs$5, _context21;

      var tag82 = (_responsePacket$tlvs$2 = (0, _find["default"])(_context18 = responsePacket.tlvs).call(_context18, 0x82)) === null || _responsePacket$tlvs$2 === void 0 ? void 0 : _responsePacket$tlvs$2.parse().toString('hex');
      var tag95 = (_responsePacket$tlvs$3 = (0, _find["default"])(_context19 = responsePacket.tlvs).call(_context19, 0x95)) === null || _responsePacket$tlvs$3 === void 0 ? void 0 : _responsePacket$tlvs$3.parse().toString('hex');
      var tag9f06 = (_responsePacket$tlvs$4 = (0, _find["default"])(_context20 = responsePacket.tlvs).call(_context20, 0x9F06)) === null || _responsePacket$tlvs$4 === void 0 ? void 0 : _responsePacket$tlvs$4.parse().toString('hex');
      var tag9b = (_responsePacket$tlvs$5 = (0, _find["default"])(_context21 = responsePacket.tlvs).call(_context21, 0x9B)) === null || _responsePacket$tlvs$5 === void 0 ? void 0 : _responsePacket$tlvs$5.parse().toString('hex');
      var responseInfo = {
        tag82: tag82,
        tag95: tag95,
        tag9f06: tag9f06,
        tag9b: tag9b,
        length: responsePacket.length
      };
      return responseInfo;
    }
  } catch (error) {
    Log.error('getEmvResponseInfo', {
      error: error
    });
  }

  return 'Not EMV';
}

function getCardHolderName(formFactor, responsePacket) {
  try {
    if (formFactor === _retailPaymentDevice.FormFactor.Chip || formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless || formFactor === _retailPaymentDevice.FormFactor.MagneticCardSwipe) {
      var _context22;

      var cardHolderName = (0, _find["default"])(_context22 = responsePacket.tlvs).call(_context22, _tlvlib.Tags.CardholderName);
      return cardHolderName ? cardHolderName.parse() : null;
    }
  } catch (error) {
    Log.error('getCardHolderName', {
      error: error,
      formFactor: formFactor
    });
  }

  return null;
}

function parseCardMetadata(formFactor, deviceResponse) {
  var cardData = {};

  try {
    cardData = {
      lastFourDigits: lastFourDigits(formFactor, deviceResponse),
      firstFourDigits: firstFourDigits(formFactor, deviceResponse),
      cardIssuer: getCardIssuer(formFactor, deviceResponse),
      isSignatureRequired: isSignatureCvmRequired(formFactor, deviceResponse),
      cardholderName: getCardHolderName(formFactor, deviceResponse),
      emvResponseInfo: getEmvResponseInfo(formFactor, deviceResponse)
    };
    Log.debug('Parsed card metadata:', function () {
      return {
        cardData: cardData
      };
    });
    cardData.emvData = deviceResponse;
    Log.track('EMV ResponseInfo', {
      emvResponseInfo: cardData.emvResponseInfo
    });
  } catch (error) {
    Log.error('Unable to parse card metadata', {
      error: error,
      deviceResponse: (0, _keys["default"])(deviceResponse === null || deviceResponse === void 0 ? void 0 : deviceResponse.tlvs)
    });
  }

  return cardData;
}

}).call(this)}).call(this,require("buffer").Buffer)
},{"./MiuraTags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraTags.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/last-index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/last-index-of.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","tlvlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/common/Flow.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.to-string");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _construct = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/reflect/construct"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _events = require("events");

function _createSuper(Derived) {
  return function () {
    var Super = (0, _getPrototypeOf2["default"])(Derived),
        result;

    if (_isNativeReflectConstruct()) {
      var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
      result = (0, _construct["default"])(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return (0, _possibleConstructorReturn2["default"])(this, result);
  };
}

function _isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !_construct["default"]) return false;
  if (_construct["default"].sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Date.prototype.toString.call((0, _construct["default"])(Date, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

var FACADE = (0, _symbol["default"])('facade');
var Log = (0, _manticoreLog["default"])('flow'); // TODO Somehow reuse from retail-sdk/common/flow.js

/**
 * Present a protected view of the flow to a particular step so that it can't call the
 * true flow step after it is deactivated.
 */

var FlowFacade = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(FlowFacade, _EventEmitter);

  var _super = _createSuper(FlowFacade);

  function FlowFacade(flow) {
    var _this;

    (0, _classCallCheck2["default"])(this, FlowFacade);
    _this = _super.call(this);
    _this.active = true;
    _this.flow = flow;
    return _this;
  }

  (0, _createClass2["default"])(FlowFacade, [{
    key: "_prepareForChange",
    value: function _prepareForChange(noPush) {
      var f = this.flow;

      if (!noPush) {
        f.previousSteps.push(f.stepIndex);
      }

      if (f[FACADE]) {
        f[FACADE].active = false;
      }

      f[FACADE] = new FlowFacade(f);
    }
  }, {
    key: "_check",
    value: function _check() {
      if (!this.active) {
        Log.error("Flow step completion function called by inactive step ".concat(this.stepName, "!"));
        this.flow.emit('flowError', new Error('Flow step completion function called by inactive step!'));
        return false;
      }

      return true;
    }
  }, {
    key: "_executeStep",
    value: function _executeStep(index) {
      var _this2 = this;

      var direction = index < this.flow.stepIndex ? 'regressing' : 'advancing';
      this.flow.stepIndex = index;
      var stepFn = this.flow.steps[index];
      Log.debug(function () {
        var _context;

        return (0, _concat["default"])(_context = "Flow ".concat(direction, " to ")).call(_context, _this2.stepName);
      });

      try {
        stepFn.call(this.flow.owner, this.flow[FACADE]);
      } catch (e) {
        var _context2;

        Log.error((0, _concat["default"])(_context2 = "".concat(this.stepName, " execution returned an error: ")).call(_context2, e));
        this.flow[FACADE].abortFlow(e);
      }
    }
    /**
     * A flow step should call next to advance to the next step, or complete if it's the last
     */

  }, {
    key: "next",
    value: function next() {
      if (!this._check()) {
        Log.debug('Flow::next called out of turn!');
        return;
      }

      var f = this.flow;

      if (f.stepIndex + 1 >= f.steps.length) {
        this.completeFlow();
        return;
      }

      f.emit('next', f.stepIndex);

      this._prepareForChange();

      this._executeStep(f.stepIndex + 1);
    }
    /**
     * A flow step should call back to end the current step and go back to the previous step
     * (or abort if you're the first)
     * TODO how do we continue to go back if the previous step was skipped?
     */

  }, {
    key: "back",
    value: function back() {
      if (!this._check()) {
        Log.debug('Flow::back called out of turn!');
        return;
      }

      var f = this.flow;

      if (f.previousSteps.length === 0) {
        this.abortFlow();
        return;
      }

      f.emit('back', f.steps[f.stepIndex], f.steps[f.stepIndex - 1]);

      this._prepareForChange(true);

      this._executeStep(f.previousSteps.pop());
    }
    /**
     * Immediately complete the flow, firing the completed event
     */

  }, {
    key: "completeFlow",
    value: function completeFlow() {
      var _this3 = this;

      if (!this._check()) {
        Log.debug('Flow::complete called out of turn!');
        return;
      }

      Log.debug(function () {
        return "".concat(_this3.flow.name || 'Anonymous', " Flow completed.");
      });
      var f = this.flow;

      this._prepareForChange();

      f.stepIndex = null;
      f[FACADE] = null;
      f.emit('completed', null, f.data);
    }
    /**
     * Immediately abort the flow, firing the aborted event
     */

  }, {
    key: "abortFlow",
    value: function abortFlow(error) {
      if (!this._check()) {
        Log.debug('Flow::abortFlow called out of order!');
        return;
      }

      Log.debug("".concat(this.flow.name || 'Anonymous', " Flow aborted"));
      var f = this.flow;

      if (error) {
        f.data.error = error;
      }

      f[FACADE].emit('aborted');

      this._prepareForChange();

      f.stepIndex = null;
      f[FACADE] = null;
      f.emit('completed', error, f.data);
    }
  }, {
    key: "nextOrAbort",
    value: function nextOrAbort(error) {
      if (error) {
        this.abortFlow(error);
      } else {
        this.next();
      }
    }
  }, {
    key: "stepName",
    get: function get() {
      var fn = this.flow.steps[this.flow.stepIndex];
      return fn ? fn.fnName || fn.name : undefined;
    }
  }, {
    key: "data",
    get: function get() {
      return this.flow.data;
    }
  }, {
    key: "stepIndex",
    get: function get() {
      return this.flow.stepIndex;
    }
  }, {
    key: "previousSteps",
    get: function get() {
      return this.flow.previousSteps;
    }
  }]);
  return FlowFacade;
}(_events.EventEmitter);
/**
 * A flow is a series of steps in order to complete a process. Each step may complete, cancel, go forward or back
 * in the process. In code, a flow is an array of functions. The functions take one argument - a flow controller -
 * which exposes methods to control the next step in the flow.
 *
 */


var Flow = /*#__PURE__*/function (_EventEmitter2) {
  (0, _inherits2["default"])(Flow, _EventEmitter2);

  var _super2 = _createSuper(Flow);
  /**
   * Construct a new flow with steps pass as individual arguments (each a function) OR
   * as a single array as the second argument.
   * Call start() after setting up appropriate event handlers.
   */


  function Flow(thisForSteps, allSteps) {
    var _this4;

    (0, _classCallCheck2["default"])(this, Flow);
    _this4 = _super2.call(this);
    _this4.owner = thisForSteps;

    if ((0, _isArray["default"])(allSteps)) {
      _this4.steps = allSteps;
    } else {
      _this4.steps = (0, _slice["default"])(Array.prototype).call(arguments, 1); // eslint-disable-line prefer-rest-params
    }
    /**
     * A grab bag of data that can be used to share information among steps
     * @type {object}
     */


    _this4.data = {};
    _this4[FACADE] = null;
    _this4.stepIndex = 0;
    _this4.previousSteps = [];
    return _this4;
  }

  (0, _createClass2["default"])(Flow, [{
    key: "start",
    value: function start() {
      this[FACADE] = new FlowFacade(this);

      this[FACADE]._executeStep(0);

      return this;
    }
  }, {
    key: "abortFlow",
    value: function abortFlow(error) {
      if (!this[FACADE]) {
        Log.error('Abort called on an inactive flow!');
        return;
      }

      this[FACADE].abortFlow(error);
    }
  }]);
  return Flow;
}(_events.EventEmitter);

exports["default"] = Flow;

},{"@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/deviceState.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
/**
 * Indicates the current state of the device
 */

var deviceState = {
  unknown: 0,
  softwareUpdate: 1,
  hardResetting: 2
};
var _default = deviceState;
exports["default"] = _default;

},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/index.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

_Object$defineProperty(exports, "default", {
  enumerable: true,
  get: function get() {
    return _MiuraDevice["default"];
  }
});

_Object$defineProperty(exports, "MiuraTags", {
  enumerable: true,
  get: function get() {
    return _MiuraTags["default"];
  }
});

var _MiuraDevice = _interopRequireDefault(require("./MiuraDevice"));

var _MiuraTags = _interopRequireDefault(require("./MiuraTags"));

},{"./MiuraDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraDevice.js","./MiuraTags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraTags.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/BatteryStatus.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.to-string");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _getIteratorMethod2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator-method"));

var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));

var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/values"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

function _createForOfIteratorHelper(o) {
  if (typeof _symbol["default"] === "undefined" || (0, _getIteratorMethod2["default"])(o) == null) {
    if ((0, _isArray["default"])(o) || (o = _unsupportedIterableToArray(o))) {
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var it,
      normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = (0, _getIterator2["default"])(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  var n = (0, _slice["default"])(_context = Object.prototype.toString.call(o)).call(_context, 8, -1);
  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return (0, _from["default"])(n);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var BatteryStatus = /*#__PURE__*/function () {
  function BatteryStatus(apduResponse) {
    (0, _classCallCheck2["default"])(this, BatteryStatus);
    this.response = apduResponse;

    var _iterator = _createForOfIteratorHelper((0, _values["default"])(this.response.tlvs)),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var v = _step.value;

        if (v.tagNumber === 0xdfa209) {
          this._readStatus(v);
        } else if (v.tagNumber === 0xdfa20a) {
          // The eslint is disabled for the below line because array destructuring in to a this' property doesn't work on ios9
          this.batteryPercentage = v.bytes[0]; // eslint-disable-line prefer-destructuring
        }
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }

    this.measuredOn = new Date();
    this._batteryStatusJSON = {
      status: this.status,
      batteryPercentage: this.batteryPercentage,
      measuredOn: this.measuredOn
    };
  }

  (0, _createClass2["default"])(BatteryStatus, [{
    key: "_readStatus",
    value: function _readStatus(v) {
      switch (v.bytes[0]) {
        case 0:
          this.status = _retailPaymentDevice.batteryStatus.draining;
          break;

        case 1:
          this.status = _retailPaymentDevice.batteryStatus.charging;
          break;

        case 2:
          this.status = _retailPaymentDevice.batteryStatus.charged;
          break;

        case 0xFF:
          this.status = _retailPaymentDevice.batteryStatus.drained;
          break;

        default:
          this.status = _retailPaymentDevice.batteryStatus.unknown;
          break;
      }
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return this._batteryStatusJSON;
    }
  }, {
    key: "toString",
    value: function toString() {
      return "BatteryStatus: ".concat((0, _stringify["default"])(this, null, 2));
    }
  }, {
    key: "batteryInfo",
    get: function get() {
      return new _retailPaymentDevice.BatteryInfo(this.batteryPercentage, this.measuredOn, this.status);
    }
  }]);
  return BatteryStatus;
}();

exports["default"] = BatteryStatus;

},{"@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/CardStatus.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.date.to-json");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.to-string");

require("core-js/modules/web.url.to-json");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _getIteratorMethod2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator-method"));

var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));

var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/values"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _manticoreUtil = require("manticore-util");

var _cardMetadataParser = _interopRequireDefault(require("../cardMetadataParser"));

function _createForOfIteratorHelper(o) {
  if (typeof _symbol["default"] === "undefined" || (0, _getIteratorMethod2["default"])(o) == null) {
    if ((0, _isArray["default"])(o) || (o = _unsupportedIterableToArray(o))) {
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var it,
      normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = (0, _getIterator2["default"])(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context2;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  var n = (0, _slice["default"])(_context2 = Object.prototype.toString.call(o)).call(_context2, 8, -1);
  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return (0, _from["default"])(n);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var Log = (0, _manticoreLog["default"])('miura.cardStatus');
/**
 * Contain the details of card events on the Miura terminal such as insertion,
 * swipe, removal, etc.
 */

var CardStatus = /*#__PURE__*/function () {
  function CardStatus(miuraResponse) {
    var _context;

    (0, _classCallCheck2["default"])(this, CardStatus);
    this.response = miuraResponse;

    var _iterator = _createForOfIteratorHelper((0, _values["default"])(this.response.tlvs)),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var v = _step.value;

        if (v.tagNumber === 0x48) {
          // The eslint is disabled for the below lines because array destructuring in to a this' property doesn't work on ios9
          this.chipFlags = v.bytes[0]; // eslint-disable-line prefer-destructuring

          this.magstripeFlags = v.bytes[1]; // eslint-disable-line prefer-destructuring
        } else if (v.tagNumber === 0xdfae03) {
          this.ksn = v.parse();
        } else if (v.tagNumber === 0xdfae02) {
          this.sredData = v.parse();
        } else if (v.tagNumber === 0xdfae21) {
          this.maskedTrack1 = v.parse();
        } else if (v.tagNumber === 0x5f21) {
          this.track1 = v.parse();
        } else if (v.tagNumber === 0xdfae22) {
          this.maskedTrack2 = v.parse();
        } else if (v.tagNumber === 0x5f22) {
          this.track2 = v.parse();
        } else if (v.tagNumber === 0xdfae23) {
          this.maskedTrack3 = v.parse();
        } else if (v.tagNumber === 0x5f23) {
          this.track3 = v.parse();
        } else if (v.tagNumber === 0xdf30) {
          this.formFactor = _retailPaymentDevice.FormFactor.EmvCertifiedContactless;
          var contactlessMode = v.bytes[1]; // Contactless MSD would be set to either 0 or 2

          this.emv = !(contactlessMode === 0 || contactlessMode === 2);
        }
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }

    this.p2pe = (0, _slice["default"])(_context = miuraResponse.apdu.data).call(_context, 1).toString('hex');
  }

  (0, _createClass2["default"])(CardStatus, [{
    key: "getPresentedCard",
    value: function getPresentedCard(reader) {
      var card;

      if ((this.magstripeFlags & 0x1) === 0x1) {
        return this._magstripe(reader);
      }

      if ((this.chipFlags & 0x3) === 0x3) {
        card = new _retailPaymentDevice.Card();
        card.formFactor = _retailPaymentDevice.FormFactor.Chip;
        card.reader = reader;
        Log.debug('EMV Card Inserted');
        return card;
      }

      if ((this.chipFlags & 0x1) === 0x1) {
        card = new _retailPaymentDevice.Card();
        card.formFactor = _retailPaymentDevice.FormFactor.Chip;
        card.reader = reader;
        card.failed = true;
        Log.warn('EMV Chip Invalid');
        return card;
      }

      if (this.formFactor === _retailPaymentDevice.FormFactor.EmvCertifiedContactless) {
        card = new _retailPaymentDevice.Card();
        card.formFactor = _retailPaymentDevice.FormFactor.EmvCertifiedContactless;
        card.emvData = this.response;
        card.reader = reader;
        card.failed = this.response.apdu.template === 0xE5;
        card.isContactlessMSD = !this.emv;
        (0, _manticoreUtil.extend)(card, (0, _cardMetadataParser["default"])(card.formFactor, this.response), true);
        return card;
      }

      return null;
    }
  }, {
    key: "_magstripe",
    value: function _magstripe(reader) {
      var card = new _retailPaymentDevice.MagneticCard();
      card.formFactor = _retailPaymentDevice.FormFactor.MagneticCardSwipe;
      var maskedTrack = this.maskedTrack2 || this.maskedTrack1 || this.maskedTrack3 || this.track2 || this.track1 || this.track3;

      if (!maskedTrack || !maskedTrack.length) {
        var _this$track, _this$track2, _this$track3, _this$maskedTrack, _this$maskedTrack2, _this$maskedTrack3;

        Log.error('Missing card swipe data maskedTrack', {
          t1Len: (_this$track = this.track1) === null || _this$track === void 0 ? void 0 : _this$track.length,
          t2Len: (_this$track2 = this.track2) === null || _this$track2 === void 0 ? void 0 : _this$track2.length,
          t3Len: (_this$track3 = this.track3) === null || _this$track3 === void 0 ? void 0 : _this$track3.length,
          mt1Len: (_this$maskedTrack = this.maskedTrack1) === null || _this$maskedTrack === void 0 ? void 0 : _this$maskedTrack.length,
          mt2Len: (_this$maskedTrack2 = this.maskedTrack2) === null || _this$maskedTrack2 === void 0 ? void 0 : _this$maskedTrack2.length,
          mt3Len: (_this$maskedTrack3 = this.maskedTrack3) === null || _this$maskedTrack3 === void 0 ? void 0 : _this$maskedTrack3.length
        });
        card.failed = true;
        return card;
      }

      var start = (0, _indexOf["default"])(maskedTrack).call(maskedTrack, '=');
      var serviceCode = maskedTrack.substring(start + 5, start + 6);
      card.ksn = this.ksn ? this.ksn.toString('hex') : '';
      card.reader = reader;

      if (start < 6) {
        Log.error('Missing track2 = sentinel from card swipe data');
        card.failed = true;
        return card;
      }

      if (serviceCode === '2' || serviceCode === '6') {
        card.chipCard = true;
      }

      card.track2 = this.response.apdu.data.toString('hex');
      (0, _manticoreUtil.assignExcept)(card, (0, _cardMetadataParser["default"])(card.formFactor, this.response), 'isSignatureRequired');
      return card;
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      var _this$ksn, _this$track4, _this$track5, _this$track6, _this$maskedTrack4, _this$maskedTrack5, _this$maskedTrack6, _this$sredData;

      return {
        response: this.response.toString(),
        chipFlags: this.chipFlags.toString(16),
        magstripeFlags: this.magstripeFlags.toString(16),
        ksn: (_this$ksn = this.ksn) === null || _this$ksn === void 0 ? void 0 : _this$ksn.toString('hex'),
        track1: (_this$track4 = this.track1) === null || _this$track4 === void 0 ? void 0 : _this$track4.toString('hex'),
        track2: (_this$track5 = this.track2) === null || _this$track5 === void 0 ? void 0 : _this$track5.toString('hex'),
        track3: (_this$track6 = this.track3) === null || _this$track6 === void 0 ? void 0 : _this$track6.toString('hex'),
        maskedTrack1: (_this$maskedTrack4 = this.maskedTrack1) === null || _this$maskedTrack4 === void 0 ? void 0 : _this$maskedTrack4.toString('hex'),
        maskedTrack2: (_this$maskedTrack5 = this.maskedTrack2) === null || _this$maskedTrack5 === void 0 ? void 0 : _this$maskedTrack5.toString('hex'),
        maskedTrack3: (_this$maskedTrack6 = this.maskedTrack3) === null || _this$maskedTrack6 === void 0 ? void 0 : _this$maskedTrack6.toString('hex'),
        sredData: (_this$sredData = this.sredData) === null || _this$sredData === void 0 ? void 0 : _this$sredData.toString('hex')
      };
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }]);
  return CardStatus;
}();

exports["default"] = CardStatus;

},{"../cardMetadataParser":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/cardMetadataParser.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","core-js/modules/es.date.to-json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/web.url.to-json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/DeviceCaps.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.to-string");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _getIteratorMethod2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator-method"));

var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));

var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/values"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _MiuraTags = _interopRequireDefault(require("../MiuraTags"));

function _createForOfIteratorHelper(o) {
  if (typeof _symbol["default"] === "undefined" || (0, _getIteratorMethod2["default"])(o) == null) {
    if ((0, _isArray["default"])(o) || (o = _unsupportedIterableToArray(o))) {
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var it,
      normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = (0, _getIterator2["default"])(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  var n = (0, _slice["default"])(_context = Object.prototype.toString.call(o)).call(_context, 8, -1);
  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return (0, _from["default"])(n);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var DeviceCaps = /*#__PURE__*/function () {
  function DeviceCaps(apduResponse) {
    (0, _classCallCheck2["default"])(this, DeviceCaps);
    this.response = apduResponse;
    this.caps = {};

    var _iterator = _createForOfIteratorHelper((0, _values["default"])(this.response.tlvs)),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var v = _step.value;

        if (v.tagNumber === _MiuraTags["default"].MiuraConfigurationInformation.number) {
          this.readPair(v.parse());
        }
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }
  }

  (0, _createClass2["default"])(DeviceCaps, [{
    key: "readPair",
    value: function readPair(tlv) {
      var key;
      var val = true;

      var _iterator2 = _createForOfIteratorHelper((0, _values["default"])(tlv)),
          _step2;

      try {
        for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
          var v = _step2.value;

          if (v.tagNumber === _MiuraTags["default"].MiuraIdentifier.number) {
            key = v.parse();
          } else if (v.tagNumber === _MiuraTags["default"].MiuraVersionInformation.number) {
            val = v.parse();
          }
        }
      } catch (err) {
        _iterator2.e(err);
      } finally {
        _iterator2.f();
      }

      if (key) {
        this.caps[key] = val;
      }
    }
  }, {
    key: "toString",
    value: function toString() {
      var parts = [this.response.toString(), '\nCapabilities: '];

      var _iterator3 = _createForOfIteratorHelper(this.caps),
          _step3;

      try {
        for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
          var k = _step3.value;
          parts.push('  ');
          parts.push(k);

          if (this.caps[k] && this.caps[k] !== true) {
            parts.push(': ');
            parts.push(this.caps[k]);
          }
        }
      } catch (err) {
        _iterator3.e(err);
      } finally {
        _iterator3.f();
      }

      return parts.join('');
    }
  }]);
  return DeviceCaps;
}();

exports["default"] = DeviceCaps;

},{"../MiuraTags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraTags.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/KeyStatus.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.to-string");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _getIteratorMethod2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator-method"));

var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));

var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/values"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

function _createForOfIteratorHelper(o) {
  if (typeof _symbol["default"] === "undefined" || (0, _getIteratorMethod2["default"])(o) == null) {
    if ((0, _isArray["default"])(o) || (o = _unsupportedIterableToArray(o))) {
      var i = 0;

      var F = function F() {};

      return {
        s: F,
        n: function n() {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function e(_e) {
          throw _e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var it,
      normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function s() {
      it = (0, _getIterator2["default"])(o);
    },
    n: function n() {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function e(_e2) {
      didErr = true;
      err = _e2;
    },
    f: function f() {
      try {
        if (!normalCompletion && it["return"] != null) it["return"]();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function _unsupportedIterableToArray(o, minLen) {
  var _context2;

  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  var n = (0, _slice["default"])(_context2 = Object.prototype.toString.call(o)).call(_context2, 8, -1);
  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return (0, _from["default"])(n);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) {
    arr2[i] = arr[i];
  }

  return arr2;
}

var KeyStatus = /*#__PURE__*/function () {
  function KeyStatus(miuraResponse) {
    (0, _classCallCheck2["default"])(this, KeyStatus);
    this.response = miuraResponse;

    var _iterator = _createForOfIteratorHelper((0, _values["default"])(this.response.tlvs)),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var v = _step.value;

        if (v.tagNumber === 0xdfa205) {
          // The eslint is disabled for the below lines because array destructuring in to a this' property doesn't work on ios9
          this.keyCode = v.bytes[0]; // eslint-disable-line prefer-destructuring
        }
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }
  }

  (0, _createClass2["default"])(KeyStatus, [{
    key: "toString",
    value: function toString() {
      var _context;

      return (0, _concat["default"])(_context = "".concat(this.response.toString(), "\nKeyCode 0x")).call(_context, this.keyCode.toString(16));
    }
  }]);
  return KeyStatus;
}();

exports["default"] = KeyStatus;

},{"@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/messages/TerminalStatus.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.symbol");

require("core-js/modules/es.symbol.description");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.regexp.to-string");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/values"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _MiuraTags = _interopRequireDefault(require("../MiuraTags"));

var Log = (0, _manticoreLog["default"])('device.miura.terminalStatus');

var TerminalStatus = /*#__PURE__*/function () {
  function TerminalStatus(apduResponse) {
    var _this = this;

    (0, _classCallCheck2["default"])(this, TerminalStatus);
    this.response = apduResponse;

    if (this.response && this.response.tlvs && (0, _values["default"])(this.response.tlvs)) {
      var _context;

      (0, _forEach["default"])(_context = (0, _values["default"])(this.response.tlvs)).call(_context, function (v) {
        if (v.tag === _MiuraTags["default"].MiuraStateChangeReason) {
          _this.changeType = TerminalStatus._getTerminalStatus(v.bytes[0]);
        } else if (v.tag === _MiuraTags["default"].MiuraStateChangeText) {
          _this.description = v.parse();
        } else if (v.tag === _MiuraTags["default"].MiuraDigitsInPinBuffer) {
          _this.pinDigits = v.parse();
        } else if (v.tag === _MiuraTags["default"].MiuraPinEntryStatus) {
          var outcome = v.bytes[0];

          _this._readOutcome(outcome);
        }
      });
    }
  }

  (0, _createClass2["default"])(TerminalStatus, [{
    key: "toString",
    value: function toString() {
      var _context2, _context3;

      var str = [(0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = "".concat(this.response.toString(), "\nChange Type: ")).call(_context3, this.changeType, " (")).call(_context2, this.description, ")")];

      if ({}.hasOwnProperty.call(this, 'pinDigits')) {
        str.push('\nPIN digits: ');
        str.push(this.pinDigits);
      }

      if ({}.hasOwnProperty.call(this, 'pinComplete')) {
        str.push('\nPIN entry complete.');

        if ({}.hasOwnProperty.call(this, 'pinCorrect')) {
          str.push("Correct? ".concat(this.pinCorrect ? 'yes' : 'no'));

          if (!this.pinCorrect) {
            str.push('\nPIN failure reason: ');
            str.push(this.pinFailureReason);
          }
        }

        if (this.lastPinAttempt) {
          str.push('\n*** LAST PIN ATTEMPT ***');
        }
      }

      return str.join('');
    }
  }, {
    key: "_readOutcome",
    value: function _readOutcome(outcome) {
      if (outcome === 1) {
        this.lastPinAttempt = true;
      } else if (outcome === 2) {
        this.pinCorrect = true;
        this.pinComplete = true;
      } else if (outcome === 3) {
        this.pinCorrect = false;
        this.pinComplete = true;
        this.pinFailureReason = 'Incorrect PIN';
      } else if (outcome === 4) {
        this.pinCorrect = false;
        this.pinComplete = true;
        this.pinFailureReason = 'Entry Error';
      } else if (outcome === 5) {
        this.pinComplete = true;
      }
    }
  }], [{
    key: "_getTerminalStatus",
    value: function _getTerminalStatus(byte0) {
      switch (byte0) {
        case 1:
          return TerminalStatus.Constants.PoweringOn;

        case 2:
          return TerminalStatus.Constants.PinEntryStateChange;

        case 3:
          return TerminalStatus.Constants.ApplicationSelection;

        case 0xA:
          return TerminalStatus.Constants.PoweringOff;

        case 0xB:
          return TerminalStatus.Constants.Rebooting;

        case 0xC:
          return TerminalStatus.Constants.MpiRestarting;

        case 0xc0:
          return TerminalStatus.Constants.SeePhone;

        default:
          Log.error("Received unknown terminal status tag (0xC3) value ".concat(byte0));
          return 'Unknown';
      }
    }
  }]);
  return TerminalStatus;
}();

exports["default"] = TerminalStatus;
TerminalStatus.Constants = {
  PoweringOn: 'PoweringOn',
  PinEntryStateChange: 'PinEntryStateChange',
  ApplicationSelection: 'ApplicationSelection',
  PoweringOff: 'PoweringOff',
  Rebooting: 'Rebooting',
  MpiRestarting: 'MpiRestarting',
  SeePhone: 'SeePhone'
};

},{"../MiuraTags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/MiuraTags.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.js","core-js/modules/es.symbol.description":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.description.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/miura-emv/build/strings/m010/en.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));

var _defineProperties = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-properties"));

var _getOwnPropertyDescriptors = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"));

var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));

var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"));

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"));

var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));

var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

function ownKeys(object, enumerableOnly) {
  var keys = (0, _keys["default"])(object);

  if (_getOwnPropertySymbols["default"]) {
    var symbols = (0, _getOwnPropertySymbols["default"])(object);
    if (enumerableOnly) symbols = (0, _filter["default"])(symbols).call(symbols, function (sym) {
      return (0, _getOwnPropertyDescriptor["default"])(object, sym).enumerable;
    });
    keys.push.apply(keys, symbols);
  }

  return keys;
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var source = arguments[i] != null ? arguments[i] : {};

    if (i % 2) {
      var _context;

      (0, _forEach["default"])(_context = ownKeys(Object(source), true)).call(_context, function (key) {
        (0, _defineProperty3["default"])(target, key, source[key]);
      });
    } else if (_getOwnPropertyDescriptors["default"]) {
      (0, _defineProperties["default"])(target, (0, _getOwnPropertyDescriptors["default"])(source));
    } else {
      var _context2;

      (0, _forEach["default"])(_context2 = ownKeys(Object(source))).call(_context2, function (key) {
        (0, _defineProperty2["default"])(target, key, (0, _getOwnPropertyDescriptor["default"])(source, key));
      });
    }
  }

  return target;
}
/* eslint-disable no-template-curly-in-string */


var commonPaymentMessages = {
  Cancelled: '${amount}\nPayment canceled',
  CancelledRemoveCard: '${amount}\nPayment canceled\n Please remove card.',
  Declined: '${amount}\nPayment declined',
  DeclinedRemoveCard: '${amount}\nPayment declined\n Please remove card.',
  Failed: '${amount}\nPayment failed',
  FailedRemoveCard: '${amount}\nPayment failed\n Please remove card.',
  RemoveCard: '${amount} Paid\n Please remove card.',
  Successful: '${amount} Paid\nThank you!'
};
module.exports = {
  Connecting: 'Connecting to\nApplication',
  ConnectionFailed: 'Connection Failed',
  NotConnected: 'Open the app on your\nphone or tablet.',
  Ready: 'Ready to accept\npayments.',
  ReadyWithId: 'Ready to accept\npayments.\n${id}',
  NotReady: 'Another reader is\nin use.',
  NfcTimeout: '${amount}\nPayment timed out',
  GeneralNfcFallback: 'Unable to read card.\nInsert or swipe\ncard now or try\n a different card',
  NetworkOffline: '${amount}\nNetwork Error',
  NetworkOfflineRemoveCard: '${amount}\nNetwork Offline\n Please remove card',
  ReadyForInsertAndSwipePayment: '$image(insertswipe.bmp)\n${amount}',
  ReadyForInsertPayment: '$image(Insert.bmp)\n${amount}',
  ReadyForSwipePayment: '$image(Swipe.bmp)\n${amount}',
  CannotSwipeChip: 'Chip card detected.\nInsert the card,\nchip first,\ninto the reader.',
  ContactIssuer: 'Please contact your\ncard issuer.',
  ContactIssuerRemoveCard: 'Please contact your\ncard issuer.\n Please remove card.',
  InvoiceTotal: '${amount}${footer}',
  RechargeNow: 'Recharge now.',
  Blacklisted: 'Reader Disabled\nContact PayPal',
  AmountTooLow: 'Card minimum is\n${amount}',
  AmountTooLowRemoveCard: 'Card minimum is\n${amount}\n Please remove card.',
  AmountTooHigh: 'Card maximum is\n${amount}',
  AmountTooHighRemoveCard: 'Card maximum is\n${amount}\n Please remove card.',
  SwUpdate: {
    Complete: 'Software Update\nSuccessful',
    EncryptInit: 'Initializing\nDevice',
    EncryptGet: 'Validating\nSecurity\nKeys',
    EncryptDone: 'Security\nKeys\nInstalled',
    Required: 'Software Update\nRequired',
    OS: 'Updating OS\n${progress}%',
    MPI: 'Updating MPI\n${progress}%',
    Config: 'Updating\nConfiguration\n${progress}%',
    Failed: 'Software update\nfailed.',
    Downloading: 'Downloading updates\n${count}/${total}'
  },
  Processing: {
    Tap: '${amount}\nProcessing...',
    Contact: '${amount}\nDo not remove card.\nProcessing...',
    ContactPinOk: '${amount}\nDo not remove card.\nProcessing...\nPIN OK',
    PinOk: '${amount}\nProcessing...\nPIN OK'
  },
  QuickChip: {
    RemoveCard: 'Remove Card',
    Processing: '${amount}\nProcessing...',
    Signature: 'Signature Required'
  },
  Auth: _objectSpread({
    CompleteTransaction: 'See merchant to\n complete sale.',
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nDo not remove card.\nProcessing...'
    }
  }, commonPaymentMessages),
  Sale: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nDo not remove card.\nProcessing...'
    }
  }, commonPaymentMessages),
  QuickChipSale: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nProcessing...',
      RemoveCard: '${amount}\nProcessing...\n Please remove card.'
    }
  }, commonPaymentMessages),
  QuickChipAuth: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nProcessing...',
      RemoveCard: '${amount}\nProcessing...\n Please remove card.'
    }
  }, commonPaymentMessages),
  QuickChipSaleVault: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nProcessing...',
      RemoveCard: '${amount}\nProcessing...\n Please remove card.'
    }
  }, commonPaymentMessages),
  QuickChipAuthVault: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nProcessing...',
      RemoveCard: '${amount}\nProcessing...\n Please remove card.'
    }
  }, commonPaymentMessages),
  SaleVault: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nDo not remove card.\nProcessing...'
    }
  }, commonPaymentMessages),
  AuthVault: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nDo not remove card.\nProcessing...'
    }
  }, commonPaymentMessages),
  Vault: {
    Completing: 'Completing...',
    Processing: {
      Tap: 'Processing...',
      Contact: 'Do not remove card.\nProcessing...'
    },
    ReadyForAll: '$image(ctls-logo.bmp)',
    Cancelled: 'Canceled',
    CancelledRemoveCard: 'Canceled\n Please remove card.',
    Declined: 'Declined',
    DeclinedRemoveCard: 'Declined\n Please remove card.',
    Failed: 'Failed',
    FailedRemoveCard: 'Failed\n Please remove card.',
    RemoveCard: 'Successful\n Please remove card.',
    Successful: 'Thank you!'
  },
  Refund: {
    CardMismatch: 'Card mismatch!',
    CardMismatchRemoveCard: 'Card mismatch!\nPlease remove card.',
    Cancelled: '${amount}\nRefund canceled',
    CancelledRemoveCard: '${amount}\nRefund canceled\n Please remove card.',
    Declined: '${amount}\nRefund declined',
    DeclinedRemoveCard: '${amount}\nRefund declined\n Please remove card.',
    Failed: '${amount}\nRefund failed',
    FailedRemoveCard: '${amount} failed\n Please remove card.',
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nDo not remove card.\nProcessing...'
    },
    RemoveCard: '${amount} Refunded.\n Please remove card.',
    Successful: '${amount} Refunded.\nThank you!'
  },
  Declined: {
    BlockedCardInserted: 'Declined.\nPlease remove card.',
    UnableToReadNfcCard: 'Unable to read card.\nInsert, swipe, or\npress OK on the app\nand tap another card.',
    NfcDecline: 'Declined.\nRetry with\ninsert or swipe?',
    InvalidChipCard: 'Unable to read card.\nInsert the card,\nchip first,\ninto the reader.',
    IncorrectPin: 'Incorrect PIN\nPlease try again.'
  },
  Signature: {
    Insert: 'Signature required\nDo not remove card',
    NonEmv: '${amount} paid\nSignature required',
    Tap: 'Signature required'
  },
  CompletingPayment: '${amount}\nCompleting payment...',
  RequestTip: "${amount} due\n\n Add a tip?\nX = No      \u2713 = Yes",
  ConfirmTip: "${amount}\nincludes tip\n\nConfirm amount?\nX = No      \u2713 = Yes"
};
/* eslint-enable no-template-curly-in-string */

},{"@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/index.js":[function(require,module,exports){
'use strict';

var InvoicingFakeServer = null;
try {
  InvoicingFakeServer = require('./lib/InvoicingFakeServer').default;
} catch (x) {
  // Do nothing, fake server not available.
}

module.exports = {
  setupFakeServer: function setupFakeServer(fakeServer) {
    if (!InvoicingFakeServer || !InvoicingFakeServer.getFakeResponses) {
      throw new Error('Fake server module is not available.');
    }
    fakeServer.addFakeResponses(InvoicingFakeServer.getFakeResponses());
  },


  BaseService: require('./lib/BaseClasses/BaseService').default,
  InvoicingService: require('./lib/InvoicingService').default,
  Currency: require('./lib/Currency').default,
  InvoicePayment: require('./lib/Payment').default,
  InvoicePaymentTerm: require('./lib/PaymentTerm').default,
  InvoiceRefund: require('./lib/Refund').default,
  InvoiceCCInfo: require('./lib/CCInfo').default,
  InvoiceAddress: require('./lib/Address').default,
  InvoiceBillingInfo: require('./lib/BillingInfo').default,
  InvoiceMerchantInfo: require('./lib/MerchantInfo').default,
  InvoiceShippingInfo: require('./lib/ShippingInfo').default,
  InvoiceItem: require('./lib/Item').default,
  InvoiceNotification: require('./lib/Notification').default,
  InvoicingRequester: require('./lib/Requester').default,
  InvoiceActions: require('./lib/InvoiceActions').default,
  InvoiceAttachment: require('./lib/Attachment').default,
  Invoice: require('./lib/Invoice').default,
  InvoiceListRequest: require('./lib/InvoiceListRequest').default,
  InvoiceListResponse: require('./lib/InvoiceListResponse').default,
  InvoiceSearchRequest: require('./lib/SearchRequest').default,
  AccountSummary: require('./lib/AccountSummary').default,
  AccountSummarySection: require('./lib/AccountSummarySection').default,
  Countries: require('./lib/Countries').default,
  Country: require('./lib/Country').default,
  InvoiceEnums: require('./lib/InvoiceEnums').default,
  InvoiceCustomAmount: require('./lib/CustomAmount').default,
  InvoiceConstants: require('./lib/InvoiceConstants').default,
  InvoiceTemplate: require('./lib/Template').default,
  $$: require('./lib/InvoiceBigNumber').$$
};
},{"./lib/AccountSummary":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/AccountSummary.js","./lib/AccountSummarySection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/AccountSummarySection.js","./lib/Address":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Address.js","./lib/Attachment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Attachment.js","./lib/BaseClasses/BaseService":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/BaseClasses/BaseService.js","./lib/BillingInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/BillingInfo.js","./lib/CCInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/CCInfo.js","./lib/Countries":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Countries.js","./lib/Country":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Country.js","./lib/Currency":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Currency.js","./lib/CustomAmount":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/CustomAmount.js","./lib/Invoice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Invoice.js","./lib/InvoiceActions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceActions.js","./lib/InvoiceBigNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceBigNumber.js","./lib/InvoiceConstants":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceConstants.js","./lib/InvoiceEnums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceEnums.js","./lib/InvoiceListRequest":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceListRequest.js","./lib/InvoiceListResponse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceListResponse.js","./lib/InvoicingFakeServer":false,"./lib/InvoicingService":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingService.js","./lib/Item":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Item.js","./lib/MerchantInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/MerchantInfo.js","./lib/Notification":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Notification.js","./lib/Payment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Payment.js","./lib/PaymentTerm":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/PaymentTerm.js","./lib/Refund":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Refund.js","./lib/Requester":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Requester.js","./lib/SearchRequest":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/SearchRequest.js","./lib/ShippingInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/ShippingInfo.js","./lib/Template":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Template.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/AccountSummary.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _InvoiceEnums = require('./InvoiceEnums');

var _InvoiceEnums2 = _interopRequireDefault(_InvoiceEnums);

var _InvoiceBigNumber = require('./InvoiceBigNumber');

var _AccountSummarySection = require('./AccountSummarySection');

var _AccountSummarySection2 = _interopRequireDefault(_AccountSummarySection);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Account summary for current merchant
 * @class
 * @property {decimal} outstandingAmount outstanding amount on account
 * @property {AccountSummarySection} pastDueSection section summary
 *  containing past due invoice information
 * @property {AccountSummarySection} awaitingPaymentSection section
 *  summary containing awaiting invoice information
 * @property {AccountSummarySection} draftSection section summary
 *  containing draft invoice information
 * @property {AccountSummarySection} paidSection section summary
 *  containing paid invoice information
 */
var AccountSummary = function () {
  function AccountSummary(nonOverdueJson, overdueJson) {
    _classCallCheck(this, AccountSummary);

    this.pastDueSection = this.sectionFromSummaries(overdueJson.summaries);

    // The 'nonOverdueJson' actually includes overdue invoices.
    this.awaitingPaymentSection = this.sectionForStatuses([_InvoiceEnums2.default.Status.SENT, _InvoiceEnums2.default.Status.PARTIALLY_PAID, _InvoiceEnums2.default.Status.UNPAID, _InvoiceEnums2.default.Status.SCHEDULED], nonOverdueJson);

    this.draftSection = this.sectionForStatuses([_InvoiceEnums2.default.Status.DRAFT], nonOverdueJson);

    this.paidSection = this.sectionForStatuses([_InvoiceEnums2.default.Status.MARKED_AS_PAID, _InvoiceEnums2.default.Status.PAID], nonOverdueJson);

    this.outstandingAmount = this.awaitingPaymentSection.totalAmount;
  }

  // Given an array of invoice statuses and a JSON response from the summary endpoint, returns
  // an AccountSummarySection whose values are the sum of all the summaries whose statuses
  // are in the status array


  AccountSummary.prototype.sectionForStatuses = function sectionForStatuses(statuses, json) {
    return this.sectionFromSummaries(this.summariesForStatuses(statuses, json));
  };

  // Given an array of invoice statuses and a JSON response from the summary endpoint, returns an
  // array of the summaries whose statuses are in the status array


  AccountSummary.prototype.summariesForStatuses = function summariesForStatuses(statuses, json) {
    var retVal = [];
    for (var _iterator = json.summaries, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
      var _ref;

      if (_isArray) {
        if (_i >= _iterator.length) break;
        _ref = _iterator[_i++];
      } else {
        _i = _iterator.next();
        if (_i.done) break;
        _ref = _i.value;
      }

      var summary = _ref;

      if (statuses.indexOf(_InvoiceEnums2.default.Status[summary.status]) >= 0) {
        retVal.push(summary);
      }
    }
    return retVal;
  };

  // Given an array of summaries, sums all their values into an AccountSummarySection


  AccountSummary.prototype.sectionFromSummaries = function sectionFromSummaries(summaries) {
    var count = 0;
    var totalAmount = (0, _InvoiceBigNumber.$$)('0');
    var paidAmount = (0, _InvoiceBigNumber.$$)('0');
    var refundedAmount = (0, _InvoiceBigNumber.$$)('0');
    for (var _iterator2 = summaries, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
      var _ref2;

      if (_isArray2) {
        if (_i2 >= _iterator2.length) break;
        _ref2 = _iterator2[_i2++];
      } else {
        _i2 = _iterator2.next();
        if (_i2.done) break;
        _ref2 = _i2.value;
      }

      var summary = _ref2;

      count += summary.count;
      if (summary.amount_summary && summary.amount_summary.length) {
        // TODO: the amount_summary array contains multiple summaries
        // grouped by currency codes. Right now we just take the first.
        // Weird stuff will happen if we actually get multiple currencies.
        var amountSummary = summary.amount_summary[0];
        if (amountSummary.total_amount) {
          totalAmount = totalAmount.plus((0, _InvoiceBigNumber.$$)(amountSummary.total_amount.value));
        }
        if (amountSummary.paid_amount) {
          if (amountSummary.paid_amount.other) {
            paidAmount = paidAmount.plus((0, _InvoiceBigNumber.$$)(amountSummary.paid_amount.other.value));
          }
          if (amountSummary.paid_amount.paypal) {
            paidAmount = paidAmount.plus((0, _InvoiceBigNumber.$$)(amountSummary.paid_amount.paypal.value));
          }
        }
        if (amountSummary.refunded_amount) {
          if (amountSummary.refunded_amount.other) {
            refundedAmount = refundedAmount.plus((0, _InvoiceBigNumber.$$)(amountSummary.refunded_amount.other.value));
          }
          if (amountSummary.refunded_amount.paypal) {
            refundedAmount = refundedAmount.plus((0, _InvoiceBigNumber.$$)(amountSummary.refunded_amount.paypal.value));
          }
        }
      }
    }
    return new _AccountSummarySection2.default(count, totalAmount, paidAmount, refundedAmount);
  };

  AccountSummary.prototype.subtractSection = function subtractSection(section1, section2) {
    return new _AccountSummarySection2.default(section1.totalCount - section2.totalCount, section1.totalAmount.minus(section2.totalAmount), section1.paidAmount.minus(section2.paidAmount), section1.refundedAmount.minus(section2.refundedAmount));
  };

  return AccountSummary;
}();

exports.default = AccountSummary;
},{"./AccountSummarySection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/AccountSummarySection.js","./InvoiceBigNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceBigNumber.js","./InvoiceEnums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceEnums.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/AccountSummarySection.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Account summary for current merchant
 * @class
 * @property {decimal} totalCount total count of invoices for section
 * @property {decimal} totalAmount total amount for section
 * @property {decimal} paidAmount paid amount for section
 * @property {decimal} refundedAmount refunded amount for section
 */
var AccountSummarySection = function AccountSummarySection(totalCount, totalAmount, paidAmount, refundedAmount) {
  _classCallCheck(this, AccountSummarySection);

  this.totalCount = totalCount;
  this.totalAmount = totalAmount;
  this.paidAmount = paidAmount;
  this.refundedAmount = refundedAmount;
};

exports.default = AccountSummarySection;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Address.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Container for addresses used on various invoice entities
 * @class
 *
 * @property {string} line1 First line of the address @required
 * @property {string} line2 Second line of the address
 * @property {string} city City portion of the address
 * @property {string} state State, if applicable
 * @property {string} postalCode Postal Code
 * @property {string} country ISO two letter country code @required
 * @property {string} phone Phone number in E.123 format.
 * @property {bool} isPrimary
 * @property {string} addressee
 */
var InvoiceAddress = function () {
  function InvoiceAddress() {
    _classCallCheck(this, InvoiceAddress);
  }

  InvoiceAddress.prototype.readFromJson = function readFromJson(json) {
    if (json) {
      this.line1 = json.line1;
      if (!this.line1 && json.addressLine1) {
        this.line1 = json.addressLine1;
      }
      this.line2 = json.line2;
      if (!this.line2 && json.addressLine2) {
        this.line2 = json.addressLine2;
      }
      this.city = json.city;
      this.state = json.state;
      this.postalCode = json.postal_code;
      this.country = json.country_code;
      this.phone = json.phone;
      this.addressee = json.addressee_name;
      this.isPrimary = json.isPrimary;
    }
  };

  InvoiceAddress.prototype.toJSON = function toJSON() {
    var r = void 0;
    if (this.hasAnyValue()) {
      r = {};
      r.line1 = this.line1;
      r.line2 = this.line2;
      r.city = this.city;
      r.state = this.state;
      r.postal_code = this.postalCode;
      r.country_code = this.country;
      r.addressee = this.addressee;
      r.isPrimary = this.isPrimary;
      r.phone = this.phone;
    }
    return r;
  };

  /**
   * Check to see if this object has any value
   * @returns {bool}
   */


  InvoiceAddress.prototype.hasAnyValue = function hasAnyValue() {
    if (this.line1 || this.line2 || this.city || this.state || this.postalCode || this.country || this.addressee || this.phone) {
      return true;
    }
    return false;
  };

  return InvoiceAddress;
}();

exports.default = InvoiceAddress;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Attachment.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Invoice attachment
 * @class
 * @property {string} name name of the attachment
 * @property {string} url url of the attachment
 */
var InvoiceAttachment = function () {
  function InvoiceAttachment() {
    _classCallCheck(this, InvoiceAttachment);
  }

  InvoiceAttachment.readFromJson = function readFromJson(json) {
    var a = new InvoiceAttachment();

    a.name = json.name;
    a.url = json.url;

    return a;
  };

  InvoiceAttachment.prototype.toJSON = function toJSON() {
    var r = {};

    r.name = this.name;
    r.url = this.url;

    return r;
  };

  /**
   * workaround for known API issue, returns usable version of the URL
   * @returns {string} the usable url
   */


  InvoiceAttachment.prototype.usableURL = function usableURL() {
    var re = new RegExp('sig.*&');
    var section = this.url.match(re)[0];
    var newSection = section.split('/').join('.').split('+').join('-').replace('=&', '&');
    var newURL = this.url.replace(section, newSection);

    return newURL;
  };

  return InvoiceAttachment;
}();

exports.default = InvoiceAttachment;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/BaseClasses/BaseService.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * @class
 */
var BaseService = function BaseService() {
  _classCallCheck(this, BaseService);
};

exports.default = BaseService;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/BillingInfo.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _Address = require('./Address');

var _Address2 = _interopRequireDefault(_Address);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Container for information about the payer or intended payer on an invoice
 * @class
 * @property {string} email The email address of the payer @required @length(1,260) @format(email)
 * @property {string} firstName The first name of the payer @length(,30)
 * @property {string} lastName The last name of the payer @length(,30)
 * @property {string} businessName The business name of the payer
 * @property {InvoiceAddress} address The address of the payer @length(,100)
 * @property {string} language Language of the email sent to the payer. Will
 *  only be used if payer doesn't have a PayPal account.
 * @property {string} additionalInfo Option to display additional information
 *  such as business hours. 40 characters max.
 * @property {string} notificationChannel Preferred notification channel of the
 *  payer. Email by default.
 * @property {string} countryCode Country code (in E.164 format). Assume length is n.
 * @property {string} nationalNumber In-country phone number (in E.164 format).
 *  Maximum (15 - n) digits
 */
var InvoiceBillingInfo = function () {
  function InvoiceBillingInfo() {
    _classCallCheck(this, InvoiceBillingInfo);

    this.address = new _Address2.default();
  }

  InvoiceBillingInfo.prototype.readFromJson = function readFromJson(json) {
    if (json) {
      this.address.readFromJson(json.address);
      this.firstName = json.first_name;
      this.lastName = json.last_name;
      this.businessName = json.business_name;
      this.email = json.email;
      this.language = json.language;
      this.additionalInfo = json.additional_info;
      this.notificationChannel = json.notification_channel;
      if (json.phone) {
        this.countryCode = json.phone.country_code;
        this.nationalNumber = json.phone.national_number;
      }
    }
  };

  InvoiceBillingInfo.prototype.toJSON = function toJSON() {
    var r = {};
    // If the address is empty, don't include it in the JSON.
    if (Object.keys(this.address).length) {
      r.address = this.address;
    }
    r.first_name = this.firstName;
    r.last_name = this.lastName;
    r.email = this.email;
    r.business_name = this.businessName;
    r.language = this.language;
    r.additional_info = this.additionalInfo;
    r.notification_channel = this.notificationChannel;

    if (this.nationalNumber) {
      r.phone = {};
      r.phone.country_code = this.countryCode;
      r.phone.national_number = this.nationalNumber;
    }

    return r;
  };

  /**
   * Check to see if this object has any value
   * @returns {bool}
   */


  InvoiceBillingInfo.prototype.hasAnyValue = function hasAnyValue() {
    if (this.email || this.firstName || this.lastName || this.businessName || this.address.hasAnyValue() || this.language || this.additionalInfo || this.notificationChannel || this.countryCode || this.nationalNumber) {
      return true;
    }
    return false;
  };

  return InvoiceBillingInfo;
}();

exports.default = InvoiceBillingInfo;
},{"./Address":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Address.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/CCInfo.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _Address = require('./Address');

var _Address2 = _interopRequireDefault(_Address);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Container for information about a person CC'ed on an invoice
 * @class
 * @property {string} email The email address of the
 *  merchant @required @length(1,260) @format(email)
 * @property {string} firstName The first name of the merchant @length(,30)
 * @property {string} lastName The last name of the merchant @length(,30)
 * @property {InvoiceAddress} address The address of the merchant
 * @property {string} businessName The business name of the merchant
 * @property {string} phone The phone number of the merchant
 * @property {string} fax The fax number of the merchant
 * @property {string} website The URL of the merchant website @format{url}
 * @property {string} additionalInfo option to display additional info such as business hours
 **/
var InvoiceCCInfo = function () {
  function InvoiceCCInfo() {
    _classCallCheck(this, InvoiceCCInfo);

    this.address = new _Address2.default();
  }

  InvoiceCCInfo.fromJson = function fromJson(json) {
    var ccInfo = new InvoiceCCInfo();

    if (json) {
      ccInfo.address.readFromJson(json.address);
      ccInfo.firstName = json.first_name;
      ccInfo.lastName = json.last_name;
      ccInfo.businessName = json.business_name;
      ccInfo.email = json.email;
      ccInfo.phone = json.phone;
      ccInfo.fax = json.fax;
      ccInfo.website = json.website;
      ccInfo.additionalInfo = json.additional_info;
    }

    return ccInfo;
  };

  InvoiceCCInfo.prototype.toJSON = function toJSON() {
    var r = {};
    r.email = this.email;
    r.first_name = this.firstName;
    r.last_name = this.lastName;
    r.business_name = this.businessName;
    r.phone = this.phone;
    r.fax = this.fax;
    r.website = this.website;
    r.additional_info = this.additionalInfo;
    r.address = this.address;

    return r;
  };

  return InvoiceCCInfo;
}();

exports.default = InvoiceCCInfo;
},{"./Address":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Address.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Countries.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _Country = require('./Country');

var _Country2 = _interopRequireDefault(_Country);

var _CountryMap = require('./CountryMap');

var _CountryMap2 = _interopRequireDefault(_CountryMap);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * @class
 *
 *
 */
var Countries = function () {
  function Countries() {
    _classCallCheck(this, Countries);
  }

  /**
   * @returns {[Country]}
   */
  Countries.countries = function countries() {
    if (!Countries._countries) {
      Countries._countries = [];
      for (var _iterator = Object.keys(_CountryMap2.default), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
        var _ref;

        if (_isArray) {
          if (_i >= _iterator.length) break;
          _ref = _iterator[_i++];
        } else {
          _i = _iterator.next();
          if (_i.done) break;
          _ref = _i.value;
        }

        var countryCode = _ref;

        Countries._countries.push(new _Country2.default(countryCode, _CountryMap2.default[countryCode]));
      }
    }

    return Countries._countries;
  };

  /**
   * Given a country code, returns the full name of the country.
   * If there's no match, returns undefined.
   * @param {string} countryCode
   * @returns {string}
   */


  Countries.countryForCountryCode = function countryForCountryCode(countryCode) {
    if (!countryCode) {
      return undefined;
    }
    var upperCountryCode = countryCode.toUpperCase();

    for (var _iterator2 = this.countries(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
      var _ref2;

      if (_isArray2) {
        if (_i2 >= _iterator2.length) break;
        _ref2 = _iterator2[_i2++];
      } else {
        _i2 = _iterator2.next();
        if (_i2.done) break;
        _ref2 = _i2.value;
      }

      var country = _ref2;

      if (country.code === upperCountryCode) {
        if (country.name) {
          return country.name;
        }
      }
    }
    return undefined;
  };

  return Countries;
}();

exports.default = Countries;
},{"./Country":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Country.js","./CountryMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/CountryMap.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Country.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * @class
 *
 * @property {string} code The code for a country @readonly
 * @property {string} name The name of a country @readonly
 */
var Country =
/**
 * Create a new country.
 * @constructor
 * @param {string} countryCode
 * @param {string} countryName
 */
function Country(countryCode, countryName) {
  _classCallCheck(this, Country);

  this.code = countryCode;
  this.name = countryName;
};

exports.default = Country;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/CountryMap.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;
exports.default = {
  AL: 'Albania',
  DZ: 'Algeria',
  AD: 'Andorra',
  AO: 'Angola',
  AI: 'Anguilla',
  AG: 'Antigua & Barbuda',
  AR: 'Argentina',
  AM: 'Armenia',
  AW: 'Aruba',
  AU: 'Australia',
  AT: 'Austria',
  AZ: 'Azerbaijan',
  BS: 'Bahamas',
  BH: 'Bahrain',
  BB: 'Barbados',
  BY: 'Belarus',
  BE: 'Belgium',
  BZ: 'Belize',
  BJ: 'Benin',
  BM: 'Bermuda',
  BT: 'Bhutan',
  BO: 'Bolivia',
  BA: 'Bosnia & Herzegovina',
  BW: 'Botswana',
  BR: 'Brazil',
  VG: 'British Virgin Islands',
  BN: 'Brunei',
  BG: 'Bulgaria',
  BF: 'Burkina Faso',
  BI: 'Burundi',
  KH: 'Cambodia',
  CM: 'Cameroon',
  CA: 'Canada',
  CV: 'Cape Verde',
  KY: 'Cayman Islands',
  TD: 'Chad',
  CL: 'Chile',
  CN: 'China',
  C2: 'China World Wide',
  CO: 'Colombia',
  KM: 'Comoros',
  CG: 'Congo - Brazzaville',
  CD: 'Congo - Kinshasa',
  CK: 'Cook Islands',
  CR: 'Costa Rica',
  CI: 'Côte d’Ivoire',
  HR: 'Croatia',
  CY: 'Cyprus',
  CZ: 'Czech Republic',
  DK: 'Denmark',
  DJ: 'Djibouti',
  DM: 'Dominica',
  DO: 'Dominican Republic',
  EC: 'Ecuador',
  EG: 'Egypt',
  SV: 'El Salvador',
  ER: 'Eritrea',
  EE: 'Estonia',
  ET: 'Ethiopia',
  FK: 'Falkland Islands',
  FO: 'Faroe Islands',
  FJ: 'Fiji',
  FI: 'Finland',
  FR: 'France',
  GF: 'French Guiana',
  PF: 'French Polynesia',
  GA: 'Gabon',
  GM: 'Gambia',
  GE: 'Georgia',
  DE: 'Germany',
  GI: 'Gibraltar',
  GR: 'Greece',
  GL: 'Greenland',
  GD: 'Grenada',
  GP: 'Guadeloupe',
  GT: 'Guatemala',
  GN: 'Guinea',
  GW: 'Guinea - Bissau',
  GY: 'Guyana',
  HN: 'Honduras',
  HK: 'Hong Kong SAR China',
  HU: 'Hungary',
  IS: 'Iceland',
  IN: 'India',
  ID: 'Indonesia',
  IE: 'Ireland',
  IL: 'Israel',
  IT: 'Italy',
  JM: 'Jamaica',
  JP: 'Japan',
  JO: 'Jordan',
  KZ: 'Kazakhstan',
  KE: 'Kenya',
  KI: 'Kiribati',
  KW: 'Kuwait',
  KG: 'Kyrgyzstan',
  LA: 'Laos',
  LV: 'Latvia',
  LS: 'Lesotho',
  LI: 'Liechtenstein',
  LT: 'Lithuania',
  LU: 'Luxembourg',
  MK: 'Macedonia',
  MG: 'Madagascar',
  MW: 'Malawi',
  MY: 'Malaysia',
  MV: 'Maldives',
  ML: 'Mali',
  MT: 'Malta',
  MH: 'Marshall Islands',
  MQ: 'Martinique',
  MR: 'Mauritania',
  MU: 'Mauritius',
  YT: 'Mayotte',
  MX: 'Mexico',
  FM: 'Micronesia',
  MD: 'Moldova',
  MC: 'Monaco',
  MN: 'Mongolia',
  ME: 'Montenegro',
  MS: 'Montserrat',
  MA: 'Morocco',
  MZ: 'Mozambique',
  NA: 'Namibia',
  NR: 'Nauru',
  NP: 'Nepal',
  NL: 'Netherlands',
  AN: 'Netherlands Antilles',
  NC: 'New Caledonia',
  NZ: 'New Zealand',
  NI: 'Nicaragua',
  NE: 'Niger',
  NG: 'Nigeria',
  NU: 'Niue',
  NF: 'Norfolk Island',
  NO: 'Norway',
  OM: 'Oman',
  PW: 'Palau',
  PA: 'Panama',
  PG: 'Papua New Guinea',
  PY: 'Paraguay',
  PE: 'Peru',
  PH: 'Philippines',
  PN: 'Pitcairn Islands',
  PL: 'Poland',
  PT: 'Portugal',
  QA: 'Qatar',
  RE: 'Réunion',
  RO: 'Romania',
  RU: 'Russia',
  RW: 'Rwanda',
  WS: 'Samoa',
  SM: 'San Marino',
  ST: 'São Tomé & Príncipe',
  SA: 'Saudi Arabia',
  SN: 'Senegal',
  RS: 'Serbia',
  SC: 'Seychelles',
  SL: 'Sierra Leone',
  SG: 'Singapore',
  SK: 'Slovakia',
  SI: 'Slovenia',
  SB: 'Solomon Islands',
  SO: 'Somalia',
  ZA: 'South Africa',
  KR: 'South Korea',
  ES: 'Spain',
  LK: 'Sri Lanka',
  SH: 'St. Helena',
  KN: 'St. Kitts & Nevis',
  LC: 'St. Lucia',
  PM: 'St. Pierre & Miquelon',
  VC: 'St. Vincent & Grenadines',
  SR: 'Suriname',
  SJ: 'Svalbard & Jan Mayen',
  SZ: 'Swaziland',
  SE: 'Sweden',
  CH: 'Switzerland',
  TW: 'Taiwan',
  TJ: 'Tajikistan',
  TZ: 'Tanzania',
  TH: 'Thailand',
  TG: 'Togo',
  TO: 'Tonga',
  TT: 'Trinidad & Tobago',
  TN: 'Tunisia',
  TR: 'Turkey',
  TM: 'Turkmenistan',
  TC: 'Turks & Caicos Islands',
  TV: 'Tuvalu',
  UG: 'Uganda',
  UA: 'Ukraine',
  AE: 'United Arab Emirates',
  GB: 'United Kingdom',
  US: 'United States',
  UY: 'Uruguay',
  VU: 'Vanuatu',
  VA: 'Vatican City',
  VE: 'Venezuela',
  VN: 'Vietnam',
  WF: 'Wallis & Futuna',
  YE: 'Yemen',
  ZM: 'Zambia',
  ZW: 'Zimbabwe'
};
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Currency.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _InvoiceBigNumber = require('./InvoiceBigNumber');

var _InvoiceBigNumber2 = _interopRequireDefault(_InvoiceBigNumber);

var _RoundingRules = require('./RoundingRules.js');

var _RoundingRules2 = _interopRequireDefault(_RoundingRules);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Currency = function () {
  function Currency() {
    _classCallCheck(this, Currency);
  }

  Currency.round = function round(currencyCode, amount) {
    var roundingPrecision = _RoundingRules2.default[currencyCode];
    return (0, _InvoiceBigNumber.$$)(amount).dp(~~roundingPrecision, _InvoiceBigNumber2.default.ROUND_HALF_UP);
  };

  Currency.toCents = function toCents(currencyCode, amount) {
    var roundingPrecision = _RoundingRules2.default[currencyCode];
    return (0, _InvoiceBigNumber.$$)(10).pow(roundingPrecision).times(amount);
  };

  Currency.serverRound = function serverRound(currencyCode, amount) {
    var roundingPrecision = _RoundingRules2.default[currencyCode];
    return (0, _InvoiceBigNumber.IBN)((0, _InvoiceBigNumber.$$)(amount).dp(~~roundingPrecision, _InvoiceBigNumber2.default.ROUND_HALF_UP), roundingPrecision, roundingPrecision !== 0);
  };

  return Currency;
}();

exports.default = Currency;
},{"./InvoiceBigNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceBigNumber.js","./RoundingRules.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/RoundingRules.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/CustomAmount.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _InvoiceBigNumber = require('./InvoiceBigNumber');

var _Currency = require('./Currency');

var _Currency2 = _interopRequireDefault(_Currency);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Container for custom amounts on invoices
 * @class
 *
 * @property {string} label Custom amount label
 * @property {decimal} amount this is an amount object on the server
 *  which has a string for currency, and value
 */
var InvoiceCustomAmount = function () {
  function InvoiceCustomAmount() {
    _classCallCheck(this, InvoiceCustomAmount);
  }

  InvoiceCustomAmount.fromJSON = function fromJSON(json) {
    var customAmount = new InvoiceCustomAmount();
    if (json.label) {
      customAmount.label = json.label;
    }

    if (json.amount) {
      customAmount.amount = (0, _InvoiceBigNumber.$$)(json.amount.value);
    }

    return customAmount;
  };

  InvoiceCustomAmount.prototype.toJSON = function toJSON(currencyCode) {
    var r = {};
    if (this.amount) {
      r.amount = {
        currency: currencyCode,
        value: _Currency2.default.serverRound(currencyCode, this.amount)
      };
    }
    r.label = this.label;

    return r;
  };

  return InvoiceCustomAmount;
}();

exports.default = InvoiceCustomAmount;
},{"./Currency":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Currency.js","./InvoiceBigNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceBigNumber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Invoice.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _events = require('events');

var _deepEqual2 = require('deep-equal');

var _deepEqual3 = _interopRequireDefault(_deepEqual2);

var _manticoreLog = require('manticore-log');

var _manticoreLog2 = _interopRequireDefault(_manticoreLog);

var _InvoiceBigNumber = require('./InvoiceBigNumber');

var _Currency = require('./Currency');

var _Currency2 = _interopRequireDefault(_Currency);

var _CustomAmount = require('./CustomAmount');

var _CustomAmount2 = _interopRequireDefault(_CustomAmount);

var _Item = require('./Item');

var _Item2 = _interopRequireDefault(_Item);

var _MerchantInfo = require('./MerchantInfo');

var _MerchantInfo2 = _interopRequireDefault(_MerchantInfo);

var _BillingInfo = require('./BillingInfo');

var _BillingInfo2 = _interopRequireDefault(_BillingInfo);

var _assert = require('assert');

var _assert2 = _interopRequireDefault(_assert);

var _manticoreUtil = require('manticore-util');

var _InvoicingUtil = require('./InvoicingUtil');

var _InvoicingUtil2 = _interopRequireDefault(_InvoicingUtil);

var _Requester = require('./Requester');

var _ShippingInfo = require('./ShippingInfo');

var _ShippingInfo2 = _interopRequireDefault(_ShippingInfo);

var _InvoiceCalculator = require('./InvoiceCalculator');

var _InvoiceCalculator2 = _interopRequireDefault(_InvoiceCalculator);

var _CCInfo = require('./CCInfo');

var _CCInfo2 = _interopRequireDefault(_CCInfo);

var _Payment = require('./Payment');

var _Payment2 = _interopRequireDefault(_Payment);

var _PaymentTerm = require('./PaymentTerm');

var _PaymentTerm2 = _interopRequireDefault(_PaymentTerm);

var _Refund = require('./Refund');

var _Refund2 = _interopRequireDefault(_Refund);

var _Attachment = require('./Attachment');

var _Attachment2 = _interopRequireDefault(_Attachment);

var _InvoiceEnums = require('./InvoiceEnums');

var _InvoiceEnums2 = _interopRequireDefault(_InvoiceEnums);

var _InvoiceMetaData = require('./InvoiceMetaData');

var _InvoiceMetaData2 = _interopRequireDefault(_InvoiceMetaData);

var _InvoicingService = require('./InvoicingService');

var _InvoicingService2 = _interopRequireDefault(_InvoicingService);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Log = (0, _manticoreLog2.default)('invoicing');

// TODO: talk about the different dates correctly

function statusFromServer(s) {
  if (!s) {
    return _InvoiceEnums2.default.Status.NEW;
  } else if (_InvoiceEnums2.default.Status[s]) {
    return _InvoiceEnums2.default.Status[s];
  }
  Log.warn('Received unknown server invoice status ' + s);
  return _InvoiceEnums2.default.Status.DRAFT;
}

/**
 * Invoice is the fundamental transaction record for retail payments.
 * It contains header data, such as buyer and seller information and
 * {@link InvoiceItem line items} with unit prices, quantities, etc.
 * @class
 *
 * @property {string} currency The currency for all amounts on this invoice
 * @property {string} invoiceDate The date the invoice was 'enabled'. Can be set by user.
 * @property {string} payPalId The id assigned by PayPal for this invoice
 *  (if it has been saved to PayPal at some point) @readonly
 * @property {string} number The unique order number that can be assigned by you
 *  (you must ensure uniqueness) or automatically generated by PayPal
 * @property {Invoice.Status} status The current status of the invoice @readonly
 * @property {string} reference Reference data such as PO Number to be added to invoice.
 *  60 characters max.
 * @property {InvoiceMerchantInfo} merchantInfo Merchant email address and contact
 *  information (email defaults to a PayPal no-reply address)
 * @property {InvoiceBillingInfo} billingInfo Information about the payer or
 *  intended payer of the invoice
 * @property {InvoiceShippingInfo} shippingInfo The shipping address for this
 *  invoice (usually blank in retail use cases)
 * @property {bool} taxInclusive Prices for items on this invoice are INCLUSIVE
 *  of tax - defaults to false.
 * @property {bool} taxCalculatedAfterDiscount Taxes for line items are calculated
 *  after any discounts - defaults to false
 * @property {[InvoiceItem]} items The list of items on this invoice
 * @property {int} itemCount Get the number of items on this invoice @readonly
 * @property {InvoicePaymentTerm} paymentTerms Describes when payment is expected on the
 *  invoice (defaults to DueOnReceipt)
 * @property {decimal} gratuityAmount The amount of gratuity to be applied to the invoice, if any
 * @property {decimal} discountAmount Discount amount applied to the invoice
 * @property {decimal} minimumAmountDue Base object for all financial value related fields
 *  (balance, payment due, etc.)
 * @property {decimal} discountPercentage Discount percentage applied to the invoice
 * @property {string} note A note to the customer
 * @property {decimal} shippingAmount The shipping cost to be applied to the invoice, if any
 * @property {decimal} shippingTaxRate The shipping tax rate, as percent of the
 *  total shipping amount.
 * @property {string} shippingTaxName The name of the shipping tax.
 * @property {string} termsAndConditions General terms of the invoice. 4000 characters max.
 * @property {string} merchantMemo Bookkeeping memo that is private to the merchant.
 *  150 characters max.
 * @property {bool} isDirtyFromServer Has this invoice changed since the last time it was
 *  saved to the server? @readonly
 * @property {bool} hasDetails If false, this invoice doesn't know what items are in its item list.
 *  This can happen when only "summary" information has been fetched from the server
 *  (typically as the result of a search). You can get the total, but items and subtotals
 *  totals aren't available until you call getDetails. @readonly
 * @property {decimal} total The total amount due on the invoice @readonly
 * @property {decimal} subTotal The subtotal of the items on the invoice @readonly
 * @property {decimal} itemTax The total tax on the items (as opposed to the shipping tax,
 *  for example) @readonly
 * @property {decimal} itemDiscounts The total of all item discounts @readonly
 * @property {decimal} discountPrice The total dollar value of the invoice discount @readonly
 * @property {decimal} totalDiscount The total amount of discounts applied to the invoice items
 *  and overall invoice @readonly
 * @property {object} taxBreakdown An associative array of tax rate names to the total tax on the
 *  invoice from that rate @readonly
 * @property {bool} allowPartialPayment Indicates if a partial payment is allowed over the invoice.
 *  defaults to false
 * @property {[InvoiceCCInfo]} CCInfo an array of CCInfo Email addresses which should be marked as
 *  Carbon Copy (CC) while the invoice is sent via email. Only email address under participant is
 *  currently supported.
 * @property {[InvoicePayment]} payments an array of payment objects @readonly
 * @property {[InvoiceRefund]} refunds an array of refund objects @readonly
 * @property {decimal} paidAmount Total paid amount @readonly
 * @property {decimal} paidAmountPayPal The amount paid through PayPal @readonly
 * @property {decimal} paidAmountOther The amount paid through external means @readonly
 * @property {decimal} refundedAmount Total refunded amount @readonly
 * @property {decimal} refundedAmountPayPal The amount refunded through PayPal @readonly
 * @property {decimal} refundedAmountOther The amount refunded through external means @readonly
 * @property {decimal} remainingAmount The amount remaining on the invoice. @readonly
 * @property {decimal} amountPaidNet total payments net of any refunds. @readonly
 * @property {bool} hasBeenPaid If true, this invoice has been fully paid or marked as fully paid. Does not include partially paid. @readonly
 * @property {string} uri URI of the invoice resource.
 * @property {string} logoURL Full URL of an external image to use as the logo.
 *  4000 characters max. Non HTTPS URLs will be ignored when calling toJSON on this invoice.
 * @property {string} additionalData Any miscellaneous invoice data. 4000 characters max.
 * @property {InvoiceCustomAmount} custom Custom amount applied on an invoice. If a label
 *  is included then the amount cannot be empty.
 * @property {InvoiceMetaData} metadata Audit information of the resource. @readonly
 * @property {bool} wasDeleted If true, this invoice was deleted from the server.
 * @property {[InvoiceAttachment]} attachments List of files attached to the invoice.
 * @property {string} templateID Unique identifier id of the template.
 * @property {bool} isPastDue If true, this invoice is past due date. @readonly
 * @property {string} payerViewUrl url for the paypal view for share @readonly
 * @property {bool} allowTip Indicates if customers can tip against an invoice.
 * defaults to false
 */

var Invoice = function (_EventEmitter) {
  _inherits(Invoice, _EventEmitter);

  // TODO should this constructor also take an object
  // and assume it's from the server? Doesn't really
  // need to be public so that argues not...
  /**
   * Create a new blank invoice.
   * @constructor
   * @param {string} currencyCode currency code identifying the currency for amounts on this invoice
   */
  function Invoice(currencyCode) {
    _classCallCheck(this, Invoice);

    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));

    _this.hasDetails = true;
    var useCurrencyCode = currencyCode;
    if (!currencyCode) {
      if (!Invoice.DefaultCurrency) {
        throw new Error(
        /* eslint max-len: 0 */
        'Creating an invoice without a specified currency requires Invoice.DefaultCurrency to be set.');
      }
      useCurrencyCode = Invoice.DefaultCurrency;
    }
    if (!useCurrencyCode in Invoice.supportedCurrencies()) {
      throw new Error(
      /* eslint max-len: 0 */
      'Invalid currency code.');
    }
    _this.currency = useCurrencyCode;
    _this.merchantInfo = new _MerchantInfo2.default();
    _this.billingInfo = new _BillingInfo2.default();
    _this.shippingInfo = new _ShippingInfo2.default();
    _this.taxInclusive = false;
    _this.taxCalculatedAfterDiscount = false;
    _this.items = [];
    _this.payments = [];
    _this.allowPartialPayment = false;
    _this.CCInfo = [];
    _this.paymentTerms = new _PaymentTerm2.default();
    _this.status = _InvoiceEnums2.default.Status.NEW;
    _this._itemHandlers = {};
    _this.allowTip = false;
    if (Invoice.DefaultMerchant) {
      _this.merchantInfo.email = Invoice.DefaultMerchant.emailAddress;
      _this.merchantInfo.businessName = Invoice.DefaultMerchant.businessName;
      _this.merchantInfo.address = Invoice.DefaultMerchant.address;
      _this.merchantInfo.phoneDictionary = Invoice.DefaultMerchant.phoneDictionary;
      // TODO copy over more stuff.
    }
    return _this;
  }

  /**
   * Create a new invoice based on an existing invoice as a template.
   * @param {Invoice} invoice which is going to be copied
   * @returns {Invoice} the copy of the invoice
   */


  Invoice.withInvoice = function withInvoice(invoice) {
    (0, _assert2.default)(invoice.hasDetails, 'Can\'t use an invoice as a template if the details aren\'t loaded.');

    var i = new Invoice(invoice.currency);

    i.readJSON((0, _manticoreUtil.deepToJSON)(invoice), true);

    i.status = _InvoiceEnums2.default.Status.NEW;
    i.reference = undefined;
    i.number = undefined;
    i.payPalId = undefined;
    i.metadata = undefined;
    i.paymentTerms = invoice.paymentTerms || new _PaymentTerm2.default();
    i.invoiceDate = _InvoicingUtil2.default.toServerDateString(new Date(), false);

    return i;
  };

  /**
   * Create a true copy / duplicate of an invoice. This is named duplicate instead
   * of copy to avoid code gen issues on iOS
   * @returns {Invoice} the copy / duplicate of the invoice
   */


  Invoice.prototype.duplicate = function duplicate() {
    var i = new Invoice(this.currency);
    i.readJSON((0, _manticoreUtil.deepToJSON)(this.toFullJSON()), true);
    i.wasDeleted = this.wasDeleted;
    return i;
  };

  /**
   * Returns a list of currencies supported by the Invoicing API
   * @returns {[string]} an array of currency identifiers (i.e. "USD")
   */


  Invoice.supportedCurrencies = function supportedCurrencies() {
    return ['USD', 'AUD', 'BRL', 'GBP', 'CAD', 'CZK', 'DKK', 'EUR', 'HKD', 'HUF', 'INR', 'ILS', 'JPY', 'MXN', 'TWD', 'NZD', 'NOK', 'PHP', 'PLN', 'RUB', 'SGD', 'SEK', 'CHF', 'THB'];
  };

  Invoice.prototype.setCleanFromServer = function setCleanFromServer() {
    this._lastKnownServerValue = (0, _manticoreUtil.deepToJSON)(this);
  };

  // ********************************* ATTACHMENTS **********************************
  /**
   * Adds the specified attachment to the invoice.
   * @param {InvoiceAttachment} attachment The attachment to add to the invoice.
   * @returns {[InvoiceAttachment]} The new list of attachments after adding the specified one.
   */


  Invoice.prototype.addAttachment = function addAttachment(attachment) {
    if (!this.attachments) {
      this.attachments = [];
    }

    this.attachments.push(attachment);
    return this.attachments;
  };

  /**
   * Remove an attachment by instance
   * @param {InvoiceAttachment} attachment Instance of attachment to be removed
   * @returns {bool} true if the attachment was removed from the list
   */


  Invoice.prototype.removeAttachment = function removeAttachment(attachment) {
    if (!attachment) {
      return false;
    }

    var index = this.attachments.indexOf(attachment);
    if (index < 0) {
      return false;
    }

    this.attachments.splice(index, 1);
    return true;
  };

  Invoice.prototype._addItemTotalChangedListener = function _addItemTotalChangedListener(item) {
    var _this2 = this;

    var handler = function handler(src) {
      _this2._emitTotalUpdated(src);
    };
    handler.inv = this;
    item.on(_Item2.default.event.priceMayHaveChanged, handler);
  };

  Invoice.prototype._removeItemTotalChangedListener = function _removeItemTotalChangedListener(item) {
    for (var _iterator = item.listeners(_Item2.default.event.priceMayHaveChanged), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
      var _ref;

      if (_isArray) {
        if (_i >= _iterator.length) break;
        _ref = _iterator[_i++];
      } else {
        _i = _iterator.next();
        if (_i.done) break;
        _ref = _i.value;
      }

      var listener = _ref;

      if (listener.inv === this) {
        item.removeListener(_Item2.default.event.priceMayHaveChanged, listener);
      }
    }
  };

  Invoice.prototype._emitTotalUpdated = function _emitTotalUpdated(source) {
    _InvoicingUtil2.default.emitAsync(this, Invoice.event.totalMayHaveChanged, source);
  };

  // ********************************* ITEM LIST **********************************

  /**
   * Adds the specified item to the invoice. If there is an existing matching item
   * on the invoice, we will increment the quantity by the quantity argument.
   * You may pass a negative quantity value to decrement the quantity of an existing item.
   * @param {string} name The name of the item
   * @param {decimal} quantity The quantity of this item - up to three decimals
   * @param {decimal} unitPrice The price of 1 unit of this item
   * @param {int} itemId A unique identifier for this item - not currently
   *  saved to the server but used for local uniqueness such that one line item
   *  per itemId.detailId pair will be stored on an invoice
   * @param {string} detailId A secondary unique identifier (e.g. for item
   *  options or sizes, or to create multiple items on the same invoice
   *  with a single detailId)
   * @returns {InvoiceItem} the item actually stored on the invoice. If you want
   *  to set additional data on the item, you can use this item.
   */


  Invoice.prototype.addItem = function addItem(name, quantity, unitPrice, itemId, detailId) {
    var existing = this.findItem(itemId, detailId);
    if (existing) {
      existing.quantity = existing.quantity.plus(quantity);
      return existing;
    }
    var newItem = new _Item2.default(name, quantity, unitPrice, itemId, detailId || null);
    this.items.push(newItem);
    this._emitTotalUpdated('itemAdded');
    this._addItemTotalChangedListener(newItem);
    return newItem;
  };

  /**
   * Adds the specified item to the invoice. If there is an existing matching item
   * on the invoice, we will increment the quantity of the item.
   * @param {InvoiceItem} item The invoice item to be added
   * @returns {InvoiceItem} the item actually stored on the invoice. If you want
   *  to set additional data on the item, you can use this item.
   */


  Invoice.prototype.addInvoiceItem = function addInvoiceItem(item) {
    var existing = this.findItem(item.itemId, item.detailId);
    if (existing) {
      existing.quantity = existing.quantity.plus(item.quantity);
      return existing;
    }
    this.items.push(item);
    this._emitTotalUpdated('itemAdded');
    this._addItemTotalChangedListener(item);
    return item;
  };

  // ********************************* Equality **********************************

  /**
   * Checks for equality on all fields recursively
   * @param {Invoice} invoice Invoice to check equality on
   * @returns {bool} equality
   */


  Invoice.prototype.deepEqual = function deepEqual(invoice) {
    return (0, _deepEqual3.default)((0, _manticoreUtil.deepToJSON)(this.toFullJSON()), (0, _manticoreUtil.deepToJSON)(invoice.toFullJSON()));
  };

  /**
   * Remove all items on the invoice
   * @method
   */


  Invoice.prototype.removeAllItems = function removeAllItems() {
    if (this.items.length === 0) {
      return;
    }

    for (var _iterator2 = this.items, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
      var _ref2;

      if (_isArray2) {
        if (_i2 >= _iterator2.length) break;
        _ref2 = _iterator2[_i2++];
      } else {
        _i2 = _iterator2.next();
        if (_i2.done) break;
        _ref2 = _i2.value;
      }

      var item = _ref2;

      this._removeItemTotalChangedListener(item);
    }
    this.items = [];
    this._emitTotalUpdated('itemRemoved');
  };

  /**
   * Remove an item by instance
   * @param {InvoiceItem} item Instance of item to be removed
   * @returns {bool} true if the item was removed from the list
   */


  Invoice.prototype.removeItem = function removeItem(item) {
    if (!item) {
      return false;
    }

    var itemIndex = this.items.indexOf(item);
    if (itemIndex < 0) {
      return false;
    }

    this.items.splice(itemIndex, 1);
    this._removeItemTotalChangedListener(item);
    this._emitTotalUpdated('itemRemoved');
    return true;
  };

  /**
   * Find the InvoiceItem with the specified id and/or detailId
   * @param {int} itemId
   * @param {string} [detailId]
   * @returns {InvoiceItem} The existing item on the invoice, if any
   */


  Invoice.prototype.findItem = function findItem(itemId, detailId) {
    if (!itemId) {
      return null;
    }
    var _detailId = detailId || null;
    var _itemId = itemId;

    if (typeof itemId !== 'string' && typeof itemId !== 'number') {
      _detailId = itemId.detailId;
      _itemId = itemId.itemId;
    }
    for (var _iterator3 = this.items, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
      var _ref3;

      if (_isArray3) {
        if (_i3 >= _iterator3.length) break;
        _ref3 = _iterator3[_i3++];
      } else {
        _i3 = _iterator3.next();
        if (_i3.done) break;
        _ref3 = _i3.value;
      }

      var candidate = _ref3;

      if (candidate.itemId === _itemId && candidate.detailId === _detailId) {
        return candidate;
      }
    }
    return null;
  };

  /**
   * Get an item by 0-based index
   * @param {int} itemIndex 0-based index of item to retrieve.
   * @returns {InvoiceItem}
   */


  Invoice.prototype.getItem = function getItem(itemIndex) {
    return this.items[itemIndex];
  };

  // ********************************* API CALLS **********************************

  /**
   * Update the full invoice from the server, based on its payPalId.
   * @param {Invoice~gotDetails} callback Called with an error
   */
  Invoice.prototype.getDetails = function getDetails(callback) {
    var _this3 = this;

    (0, _assert2.default)(this.payPalId, 'Can\'t get details of an invoice without an id.');
    (0, _assert2.default)(!this.wasDeleted, 'Can\'t get details on an invoice that was deleted.');

    _InvoicingService2.default.getInvoiceDetails(this.payPalId, function (error, details) {
      if (!error) {
        _this3.readJSON(details, true);
        _this3.setCleanFromServer();
      }
      if (callback) {
        callback(error);
      }
    });
  };

  /**
   * Save the invoice to the PayPal servers.
   * @param {Invoice~saved} callback Called with an error
   */


  Invoice.prototype.save = function save(callback) {
    var _this4 = this;

    (0, _assert2.default)(this.hasDetails, 'Can\'t save an invoice without details');
    (0, _assert2.default)(!this.wasDeleted, 'Can\'t save an invoice that was deleted.');
    // If this invoice has an ID, then it must already be on the server. If it is, update
    // the existing invoice instead of creating a new one, default to not sending update emails.
    if (this.payPalId) {
      this.update(false, false, callback);
      return;
    }
    if (!this.isDirtyFromServer) {
      if (callback) {
        callback();
      }
      return;
    }
    (0, _Requester.request)({
      method: 'POST',
      op: 'invoices',
      body: JSON.stringify(this)
    }, function (error, invoiceResponse) {
      if (!error && invoiceResponse.body) {
        _this4.readJSON(invoiceResponse.body, true);
        _this4.setCleanFromServer();
      }
      if (callback) {
        callback(error);
      }
    });
  };

  /**
   * Update the invoice on the PayPal servers.
   * @param {bool} shouldNotifyMerchant A flag indicating whether a
   *  copy of the notification has to be sent to the merchant
   * @param {bool} shouldNotifyCustomer A flag indicating whether a
   *  copy of the notification has to be sent to the customer
   * @param {Invoice~saved} callback Called with an error
   */


  Invoice.prototype.update = function update(shouldNotifyMerchant, shouldNotifyCustomer, callback) {
    var _this5 = this;

    (0, _assert2.default)(this.hasDetails, 'Can\'t save an invoice without details');
    (0, _assert2.default)(!this.wasDeleted, 'Can\'t save an invoice that was deleted.');
    (0, _assert2.default)(this.payPalId, 'Can\'t update an invoice that hasn\'t been saved');
    if (!this.isDirtyFromServer) {
      if (callback) {
        callback();
      }
      return;
    }
    (0, _Requester.request)({
      // If this invoice has an ID, then it must already be on the server. If it is, update
      // the existing invoice instead of creating a new one.
      method: 'PUT',
      op: 'invoices/' + this.payPalId + '?notify_merchant=' + !!shouldNotifyMerchant + '&notify_customer=' + !!shouldNotifyCustomer,
      body: JSON.stringify(this)
    }, function (error, invoiceResponse) {
      if (!error && invoiceResponse.body) {
        _this5.readJSON(invoiceResponse.body, true);
        _this5.setCleanFromServer();
      }
      if (callback) {
        callback(error);
      }
    });
  };

  /**
   * Send the invoice. It must have already been saved to the server.
   * @param {bool} shouldNotifyMerchant A flag indicating whether a
   *  copy of the notification has to be sent to the merchant
   * @param {Invoice~sent} callback Called with an error
   */


  Invoice.prototype.send = function send(shouldNotifyMerchant, callback) {
    var _this6 = this;

    // TODO: Once we track whether save is required, save here if it's required.
    (0, _assert2.default)(this.payPalId, 'Can\'t send an invoice without an id.');
    (0, _assert2.default)(!this.wasDeleted, 'Can\'t send an invoice that was deleted.');

    (0, _Requester.request)({
      method: 'POST',
      op: 'invoices/' + this.payPalId + '/send?notify_merchant=' + !!shouldNotifyMerchant
    }, function (error, response) {
      if (!error) {
        _this6.status = _InvoiceEnums2.default.Status.SENT;
      }
      if (callback) {
        callback(error, response);
      }
      // this will allow getIsPastDue to return correct result before refresh
      if (_this6.paymentTerms.paymentTerms === _PaymentTerm2.default.PaymentTerms.DueOnReceipt) {
        _this6.paymentTerms.dueDate = _InvoicingUtil2.default.toServerDateString(new Date(), false);
      }
    });
  };

  /**
   * Delete the invoice from the server. It must have already been saved to the server.
   * @param {Invoice~deleted} callback Called with an error
   */


  Invoice.prototype.deleteFromServer = function deleteFromServer(callback) {
    var _this7 = this;

    (0, _assert2.default)(this.payPalId, 'Can\'t delete an invoice without an id.');
    (0, _assert2.default)(!this.wasDeleted, 'Can\'t delete an invoice that was deleted.');
    (0, _Requester.request)({
      method: 'DELETE',
      op: 'invoices/' + this.payPalId
    }, function (error, response) {
      if (!error) {
        _this7.status = _InvoiceEnums2.default.Status.NEW;
        _this7.wasDeleted = true;
      }
      if (callback) {
        callback(error, response);
      }
    });
  };

  /**
   * Send a reminder about this invoice to its intended recipient
   * @param {InvoiceNotification} notification
   * @param {Invoice~reminded} callback
   */


  Invoice.prototype.remind = function remind(notification, callback) {
    (0, _assert2.default)(this.payPalId, 'Can\'t remind an invoice without an id.');
    (0, _assert2.default)(notification.send_to_payer !== false, 'Can\'t send a reminder that doesn\'t go to the payer.');
    (0, _assert2.default)(!this.wasDeleted, 'Can\'t remind an invoice that was deleted.');
    (0, _Requester.request)({
      method: 'POST',
      op: 'invoices/' + this.payPalId + '/remind',
      body: JSON.stringify(notification)
    }, callback);
  };

  /**
   * Cancel this invoice
   * @param {InvoiceNotification} notification
   * @param {Invoice~cancelled} callback
   */


  Invoice.prototype.cancel = function cancel(notification, callback) {
    var _this8 = this;

    (0, _assert2.default)(this.payPalId, 'Can\'t cancel an invoice without an id.');
    (0, _assert2.default)(!this.wasDeleted, 'Can\'t cancel an invoice that was deleted.');

    (0, _Requester.request)({
      method: 'POST',
      op: 'invoices/' + this.payPalId + '/cancel',
      body: JSON.stringify(notification)
    }, function (error, response) {
      if (!error) {
        _this8.status = _InvoiceEnums2.default.Status.CANCELLED;
      }
      if (callback) {
        callback(error, response);
      }
    });
  };

  /**
   * @param {InvoicePayment} paymentInfo
   * @param {Invoice~paid} callback
   */


  Invoice.prototype.recordPayment = function recordPayment(paymentInfo, callback) {
    var _this9 = this;

    (0, _assert2.default)(this.payPalId, 'Can\'t record payment on an invoice without an id.');
    (0, _assert2.default)(paymentInfo, 'Can\'t record payment on an invoice without paymentInfo.');
    (0, _assert2.default)(!this.wasDeleted, 'Can\'t record payment on an invoice that was deleted.');

    paymentInfo.validate();
    (0, _Requester.request)({
      method: 'POST',
      op: 'invoices/' + this.payPalId + '/record-payment',
      body: JSON.stringify(paymentInfo)
    }, function (error, response) {
      if (!error) {
        if (paymentInfo.type === _InvoiceEnums2.default.PaymentType.EXTERNAL) {
          if (!_this9.allowPartialPayment || paymentInfo.amount && _this9.equiv(_this9.remainingAmount, paymentInfo.amount)) {
            _this9.status = _InvoiceEnums2.default.Status.MARKED_AS_PAID;
          } else {
            _this9.status = _InvoiceEnums2.default.Status.PARTIALLY_PAID;
          }
        } else if (paymentInfo.type === _InvoiceEnums2.default.PaymentType.PAYPAL) {
          _this9.status = _InvoiceEnums2.default.Status.PAID;
        }
      }
      if (callback) {
        callback(error, response);
      }
    });
  };

  // check if the two amounts are equivalent


  Invoice.prototype.equiv = function equiv(a, b) {
    return _Currency2.default.round(this.currency, a).isEqualTo(_Currency2.default.round(this.currency, b));
  };

  /**
   * @param {InvoiceRefund} refundInfo
   * @param {Invoice~paid} callback
   */


  Invoice.prototype.recordRefund = function recordRefund(refundInfo, callback) {
    var _this10 = this;

    (0, _assert2.default)(this.payPalId, 'Can\'t record refund on an invoice without an id.');
    (0, _assert2.default)(!this.wasDeleted, 'Can\'t record refund on an invoice that was deleted.');
    (0, _assert2.default)(this.status === _InvoiceEnums2.default.Status.MARKED_AS_PAID || this.status === _InvoiceEnums2.default.Status.PAID || this.status === _InvoiceEnums2.default.Status.PARTIALLY_REFUNDED || this.status === _InvoiceEnums2.default.Status.PARTIALLY_PAID, 'Can\'t record refund on an invoice that hasn\'t been paid yet.');
    (0, _assert2.default)(refundInfo, 'Can\'t record refund on an invoice without refundInfo.');

    (0, _Requester.request)({
      method: 'POST',
      op: 'invoices/' + this.payPalId + '/record-refund',
      body: JSON.stringify(refundInfo)
    }, function (error, response) {
      if (!error) {
        _this10.updateStatusFromRefund(refundInfo.type);
      }
      if (callback) {
        callback(error, response);
      }
    });
  };

  Invoice.prototype.updateStatusFromRefund = function updateStatusFromRefund(refundType) {
    if (!this.remainingAmount.isZero()) {
      this.status = _InvoiceEnums2.default.Status.PARTIALLY_PAID;
    } else {
      if (refundType === _InvoiceEnums2.default.PaymentType.EXTERNAL) {
        this.status = _InvoiceEnums2.default.Status.MARKED_AS_REFUNDED;
      } else if (refundType === _InvoiceEnums2.default.PaymentType.PAYPAL) {
        this.status = _InvoiceEnums2.default.Status.REFUNDED;
      }
    }
  };

  // **************************** JSON PARSING AND SERIALIZATION *****************************

  Invoice.prototype.toJSON = function toJSON() {
    /* jshint maxcomplexity: false */
    var r = {};
    r.note = this.note;
    r.number = this.number;
    r.invoice_date = this.invoiceDate;
    r.merchant_info = this.merchantInfo;
    r.shipping_info = this.shippingInfo;
    r.billing_info = [this.billingInfo];
    r.tax_inclusive = this.taxInclusive;
    r.tax_calculated_after_discount = this.taxCalculatedAfterDiscount;
    r.allow_partial_payment = this.allowPartialPayment;
    r.allow_tip = this.allowTip;
    r.uri = this.uri;
    if (this.logoURL && this.logoURL.toLowerCase().indexOf('https://') === 0) {
      r.logo_url = this.logoURL;
    }
    r.additional_data = this.additionalData;
    this._attachmentsToJson(r);
    r.template_id = this.templateID;

    this._CCInfoToJson(r);

    if (this.termsAndConditions) {
      r.terms = this.termsAndConditions.substring(0, 4000);
    }
    if (this.merchantMemo) {
      r.merchant_memo = this.merchantMemo.substring(0, 150);
    }

    this._shippingToJson(r);

    if (this.minimumAmountDue) {
      r.minimum_amount_due = {
        currency: this.currency,
        value: _Currency2.default.serverRound(this.currency, this.minimumAmountDue)
      };
    }

    r.id = this.payPalId;
    if (this.status) {
      r.status = _InvoiceEnums2.default.Status.toString[this.status];
    }
    r.reference = this.reference;

    if (this.gratuityAmount) {
      r.gratuity = {
        currency: this.currency,
        value: _Currency2.default.serverRound(this.currency, this.gratuityAmount)
      };
    }
    var discount = this.discountObject();
    if (discount != null) {
      r.discount = discount;
    }
    if (this.paymentTerms.dueDate || this.paymentTerms.paymentTerms) {
      r.payment_term = this.paymentTerms.toJSONHack(r.invoice_date);
    }
    this._itemsToJson(r);

    if (this._custom) {
      r.custom = this._custom.toJSON(this.currency);
    }
    return r;
  };

  // Returns the full JSON, including readonly properties like payments
  // and refunds which should not be sent to the server.


  Invoice.prototype.toFullJSON = function toFullJSON() {
    var r = this.toJSON();
    r.payments = this.payments;
    r.refunds = this.refunds;
    if (this.paidAmount && !this.paidAmount.isZero()) {
      r.paid_amount = {};
      if (!this.paidAmountPayPal.isZero()) {
        r.paid_amount.paypal = {
          currency: this.currency,
          value: _Currency2.default.serverRound(this.currency, this.paidAmountPayPal)
        };
      }
      if (!this.paidAmountOther.isZero()) {
        r.paid_amount.other = {
          currency: this.currency,
          value: _Currency2.default.serverRound(this.currency, this.paidAmountOther)
        };
      }
    }

    if (this.refundedAmount && !this.refundedAmount.isZero()) {
      r.refunded_amount = {};
      if (!this.refundedAmountPayPal.isZero()) {
        r.refunded_amount.paypal = {
          currency: this.currency,
          value: _Currency2.default.serverRound(this.currency, this.refundedAmountPayPal)
        };
      }
      if (!this.refundedAmountOther.isZero()) {
        r.refunded_amount.other = {
          currency: this.currency,
          value: _Currency2.default.serverRound(this.currency, this.refundedAmountOther)
        };
      }
    }

    if (this.metadata) {
      r.metadata = _InvoiceMetaData2.default.toFullJSON(this.metadata);
    }

    // Due to a server bug (see PaymentTerm.js), toJSON does a weird hack with the payment terms.
    // We don't want that in toFullJSON, so this overwrites it.
    // TODO: sto this once server is fixed.
    r.payment_term = this.paymentTerms;

    return r;
  };

  Invoice.prototype._shippingToJson = function _shippingToJson(r) {
    if (this.shippingAmount) {
      r.shipping_cost = {};

      r.shipping_cost.amount = {
        currency: this.currency,
        value: _Currency2.default.serverRound(this.currency, this.shippingAmount)
      };
      if (this.shippingTaxRate && !this.shippingTaxRate.isZero()) {
        r.shipping_cost.tax = {
          name: this.shippingTaxName || 'Shipping Tax',
          percent: this.shippingTaxRate
        };
      }
    }
  };

  Invoice.prototype._itemsToJson = function _itemsToJson(r) {
    if (this.items && this.items.length) {
      r.items = [];
      for (var _iterator4 = this.items, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
        var _ref4;

        if (_isArray4) {
          if (_i4 >= _iterator4.length) break;
          _ref4 = _iterator4[_i4++];
        } else {
          _i4 = _iterator4.next();
          if (_i4.done) break;
          _ref4 = _i4.value;
        }

        var i = _ref4;

        r.items.push(i.toJSON(this.currency));
      }
    }
  };

  Invoice.prototype._attachmentsToJson = function _attachmentsToJson(r) {
    if (this.attachments && this.attachments.length) {
      r.attachments = [];
      for (var _iterator5 = this.attachments, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {
        var _ref5;

        if (_isArray5) {
          if (_i5 >= _iterator5.length) break;
          _ref5 = _iterator5[_i5++];
        } else {
          _i5 = _iterator5.next();
          if (_i5.done) break;
          _ref5 = _i5.value;
        }

        var a = _ref5;

        r.attachments.push(a.toJSON());
      }
    }
  };

  Invoice.prototype._CCInfoToJson = function _CCInfoToJson(r) {
    if (this.CCInfo && this.CCInfo.length) {
      r.cc_info = [];
      for (var _iterator6 = this.CCInfo, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {
        var _ref6;

        if (_isArray6) {
          if (_i6 >= _iterator6.length) break;
          _ref6 = _iterator6[_i6++];
        } else {
          _i6 = _iterator6.next();
          if (_i6.done) break;
          _ref6 = _i6.value;
        }

        var i = _ref6;

        r.cc_info.push(i.toJSON());
      }
    }
  };

  Invoice.prototype.discountObject = function discountObject() {
    var discount = {};
    if (this.discountAmount > 0) {
      discount.amount = {};
      discount.amount.value = _Currency2.default.serverRound(this.currency, this.discountAmount);
      discount.amount.currency = this.currency;
    } else if (this.discountPercentage > 0) {
      discount.percent = this.discountPercentage;
    } else {
      return null;
    }
    return discount;
  };

  /**
   * Construct an invoice from a server response
   * @param serverJSON
   * @param bool hasDetails
   * @private
   */


  Invoice.prototype.readJSON = function readJSON(serverJSON, hasDetails) {
    /* jshint maxcomplexity: false */

    this.invoiceDate = serverJSON.invoice_date;
    this.status = statusFromServer(serverJSON.status);
    this.reference = serverJSON.reference;
    this.number = serverJSON.number;
    this.payPalId = serverJSON.id;
    this.note = serverJSON.note;
    this.merchantInfo.readFromJson(serverJSON.merchant_info);
    this.uri = serverJSON.uri;
    this.logoURL = serverJSON.logo_url;
    this.additionalData = serverJSON.additional_data;
    this.templateID = serverJSON.template_id;

    this.hasDetails = hasDetails;

    if (serverJSON.allow_partial_payment !== undefined) {
      this.allowPartialPayment = serverJSON.allow_partial_payment;
    }

    if (serverJSON.allow_tip !== undefined) {
      this.allowTip = serverJSON.allow_tip;
    }

    if (serverJSON.metadata) {
      this.metadata = _InvoiceMetaData2.default.fromJSON(serverJSON.metadata);
    }

    if (serverJSON.custom) {
      this._custom = _CustomAmount2.default.fromJSON(serverJSON.custom);
    }

    if (serverJSON.payments) {
      this.payments = [];
      for (var _iterator7 = serverJSON.payments, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {
        var _ref7;

        if (_isArray7) {
          if (_i7 >= _iterator7.length) break;
          _ref7 = _iterator7[_i7++];
        } else {
          _i7 = _iterator7.next();
          if (_i7.done) break;
          _ref7 = _i7.value;
        }

        var payment = _ref7;

        this.payments.push(_Payment2.default.readFromJson(payment));
      }
    }
    if (serverJSON.refunds) {
      this.refunds = [];
      for (var _iterator8 = serverJSON.refunds, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {
        var _ref8;

        if (_isArray8) {
          if (_i8 >= _iterator8.length) break;
          _ref8 = _iterator8[_i8++];
        } else {
          _i8 = _iterator8.next();
          if (_i8.done) break;
          _ref8 = _i8.value;
        }

        var refund = _ref8;

        this.refunds.push(_Refund2.default.readFromJson(refund));
      }
    }

    if (serverJSON.attachments) {
      this.attachments = [];
      for (var _iterator9 = serverJSON.attachments, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {
        var _ref9;

        if (_isArray9) {
          if (_i9 >= _iterator9.length) break;
          _ref9 = _iterator9[_i9++];
        } else {
          _i9 = _iterator9.next();
          if (_i9.done) break;
          _ref9 = _i9.value;
        }

        var a = _ref9;

        this.attachments.push(_Attachment2.default.readFromJson(a));
      }
    }

    if (serverJSON.terms) {
      this.termsAndConditions = serverJSON.terms;
    }
    if (serverJSON.merchant_memo) {
      this.merchantMemo = serverJSON.merchant_memo;
    }
    if (serverJSON.shipping_cost) {
      if (serverJSON.shipping_cost.amount && serverJSON.shipping_cost.amount.value) {
        this.shippingAmount = (0, _InvoiceBigNumber.$$)(serverJSON.shipping_cost.amount.value);
      }
      if (serverJSON.shipping_cost.tax) {
        this.shippingTaxRate = serverJSON.shipping_cost.tax.percent;
        if (serverJSON.shipping_cost.tax.name) {
          this.shippingTaxName = serverJSON.shipping_cost.tax.name;
        }
      }
    }
    if (serverJSON.minimum_amount_due) {
      this.minimumAmountDue = (0, _InvoiceBigNumber.$$)(serverJSON.minimum_amount_due.value);
    } else {
      this.minimumAmountDue = null;
    }
    if (serverJSON.refunded_amount) {
      this.refundedAmountPayPal = serverJSON.refunded_amount.paypal ? (0, _InvoiceBigNumber.$$)(serverJSON.refunded_amount.paypal.value) : _InvoiceCalculator.ZERO;
      this.refundedAmountOther = serverJSON.refunded_amount.other ? (0, _InvoiceBigNumber.$$)(serverJSON.refunded_amount.other.value) : _InvoiceCalculator.ZERO;
      this.refundedAmount = this.refundedAmountPayPal.plus(this.refundedAmountOther);
    }
    if (serverJSON.paid_amount) {
      this.paidAmountPayPal = serverJSON.paid_amount.paypal ? (0, _InvoiceBigNumber.$$)(serverJSON.paid_amount.paypal.value) : _InvoiceCalculator.ZERO;
      this.paidAmountOther = serverJSON.paid_amount.other ? (0, _InvoiceBigNumber.$$)(serverJSON.paid_amount.other.value) : _InvoiceCalculator.ZERO;
      this.paidAmount = this.paidAmountPayPal.plus(this.paidAmountOther);
    }
    if (serverJSON.billing_info && serverJSON.billing_info.length) {
      this.billingInfo.readFromJson(serverJSON.billing_info[0]);
    }
    if (serverJSON.shipping_info) {
      this.shippingInfo.readFromJson(serverJSON.shipping_info);
    }
    if (serverJSON.cc_info) {
      this.CCInfo = [];
      for (var _iterator10 = serverJSON.cc_info, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {
        var _ref10;

        if (_isArray10) {
          if (_i10 >= _iterator10.length) break;
          _ref10 = _iterator10[_i10++];
        } else {
          _i10 = _iterator10.next();
          if (_i10.done) break;
          _ref10 = _i10.value;
        }

        var ccinfo = _ref10;

        var invoiceCCInfo = _CCInfo2.default.fromJson(ccinfo);
        this.CCInfo.push(invoiceCCInfo);
      }
    }
    if (serverJSON.gratuity) {
      this.gratuityAmount = (0, _InvoiceBigNumber.$$)(serverJSON.gratuity.value);
    }
    this.paymentTerms = _PaymentTerm2.default.fromJson(serverJSON.payment_term);

    if (serverJSON.hasOwnProperty('tax_inclusive')) {
      this.taxInclusive = serverJSON.tax_inclusive;
    }
    if (serverJSON.hasOwnProperty('tax_calculated_after_discount')) {
      this.taxCalculatedAfterDiscount = serverJSON.tax_calculated_after_discount;
    }
    if (serverJSON.hasOwnProperty('discount')) {
      var discount = serverJSON.discount;
      if (discount.hasOwnProperty('percent')) {
        this.discountPercentage = discount.percent;
      } else if (serverJSON.discount.hasOwnProperty('amount')) {
        this.discountAmount = (0, _InvoiceBigNumber.$$)(serverJSON.discount.amount.value);
      }
    }
    this.removeAllItems();
    if (serverJSON.items) {
      for (var _iterator11 = serverJSON.items, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) {
        var _ref11;

        if (_isArray11) {
          if (_i11 >= _iterator11.length) break;
          _ref11 = _iterator11[_i11++];
        } else {
          _i11 = _iterator11.next();
          if (_i11.done) break;
          _ref11 = _i11.value;
        }

        var item = _ref11;

        var invoiceItem = _Item2.default.fromJson(item);
        this.items.push(invoiceItem);
      }
    } else {
      this._totalFromServer = serverJSON.total_amount ? (0, _InvoiceBigNumber.$$)(serverJSON.total_amount.value) : (0, _InvoiceBigNumber.$$)('0');
    }
  };

  Invoice.fromJson = function fromJson(serverJSON, hasDetails) {
    if (!serverJSON.total_amount) {
      throw new Error('Invoice JSON has no total_amount.');
    }
    var i = new Invoice(serverJSON.total_amount.currency);
    i.readJSON(serverJSON, hasDetails);
    return i;
  };

  _createClass(Invoice, [{
    key: 'isDirtyFromServer',
    get: function get() {
      return !this._lastKnownServerValue || !(0, _deepEqual3.default)(this._lastKnownServerValue, (0, _manticoreUtil.deepToJSON)(this));
    }
  }, {
    key: 'isPastDue',
    get: function get() {
      return _InvoicingUtil2.default.isInvoicePastDue(this.status, this.paymentTerms, this.invoiceDate);
    }
  }, {
    key: 'payerViewUrl',
    get: function get() {
      if (this.metadata && this.metadata.payerViewURL) {
        return this.metadata.payerViewURL;
      } else if (this.payPalId) {
        return "https://www.paypal.com/invoice/payerView/details/" + this.payPalId;
      } else {
        return nil;
      }
    }
  }, {
    key: 'currencyCode',
    set: function set(code) {
      if (code in Invoice.supportedCurrencies()) {
        this._currency = code;
      } else {
        throw new Error(
        /* eslint max-len: 0 */
        'Invalid currency code.');
      }
    },
    get: function get() {
      return this._currency;
    }
  }, {
    key: 'invoiceDate',
    set: function set(date) {
      this._invoiceDate = date;
    },
    get: function get() {
      return this._invoiceDate;
    }
  }, {
    key: 'itemCount',
    get: function get() {
      return this.items.length;
    }
  }, {
    key: 'gratuityAmount',
    get: function get() {
      return this._gratuityAmount;
    },
    set: function set(value) {
      this._gratuityAmount = (0, _InvoiceBigNumber.$$)(value);
      this._emitTotalUpdated('gratuityAmount');
    }
  }, {
    key: 'discountAmount',
    get: function get() {
      return this._discountAmount;
    },
    set: function set(value) {
      this._discountAmount = (0, _InvoiceBigNumber.$$)(value);
      this._discountPercentage = null;
      this._emitTotalUpdated('discountAmount');
    }
  }, {
    key: 'minimumAmountDue',
    get: function get() {
      return this._minimumAmountDue;
    },
    set: function set(value) {
      this._minimumAmountDue = (0, _InvoiceBigNumber.$$)(value);
    }
  }, {
    key: 'discountPercentage',
    get: function get() {
      return this._discountPercentage;
    },
    set: function set(value) {
      this._discountPercentage = (0, _InvoiceBigNumber.IBN)(value, _Item2.default.discountPercentageDecimalPrecision);
      this._discountAmount = null;
      this._emitTotalUpdated('discountPercentage');
    }
  }, {
    key: 'shippingAmount',
    get: function get() {
      return this._shippingAmount;
    },
    set: function set(value) {
      this._shippingAmount = (0, _InvoiceBigNumber.$$)(value);
      this._emitTotalUpdated('shippingAmount');
    }
  }, {
    key: 'shippingTaxRate',
    get: function get() {
      return this._shippingTaxRate;
    },
    set: function set(value) {
      this._shippingTaxRate = (0, _InvoiceBigNumber.IBN)(value, _Item2.default.taxDecimalPrecision);
      this._emitTotalUpdated('shippingTaxRate');
    }
  }, {
    key: 'custom',
    set: function set(value) {
      this._custom = value;
    },
    get: function get() {
      return this._custom;
    }

    // ********************************* TOTAL PROPERTIES **********************************

  }, {
    key: 'total',
    get: function get() {
      if (this.hasDetails) {
        return _InvoiceCalculator2.default.calculateTotal(this);
      } else {
        return this._totalFromServer;
      }
    }
  }, {
    key: 'subTotal',
    get: function get() {
      (0, _assert2.default)(this.hasDetails, 'Can\'t calculate the subtotal without details');
      return _InvoiceCalculator2.default.calculateSubtotal(this);
    }
  }, {
    key: 'itemTax',
    get: function get() {
      (0, _assert2.default)(this.hasDetails, 'Can\'t calculate the item tax without details');
      return _InvoiceCalculator2.default.calculateItemTaxTotal(this);
    }
  }, {
    key: 'itemDiscounts',
    get: function get() {
      (0, _assert2.default)(this.hasDetails, 'Can\'t calculate the total discount without details');
      return _InvoiceCalculator2.default.calculateItemDiscounts(this);
    }
  }, {
    key: 'discountPrice',
    get: function get() {
      (0, _assert2.default)(this.hasDetails, 'Can\'t calculate the discount price without details');
      return _InvoiceCalculator2.default.calculateDiscountPrice(this);
    }
  }, {
    key: 'totalDiscount',
    get: function get() {
      (0, _assert2.default)(this.hasDetails, 'Can\'t calculate the total discount without details');
      return _InvoiceCalculator2.default.calculateDiscountTotal(this);
    }
  }, {
    key: 'taxBreakdown',
    get: function get() {
      (0, _assert2.default)(this.hasDetails, 'Can\'t calculate the tax breakdown without details');
      return _InvoiceCalculator2.default.calculateTaxBreakdown(this);
    }
  }, {
    key: 'remainingAmount',
    get: function get() {
      var paid = this.paidAmount || _InvoiceCalculator.ZERO;
      return this.total.minus(paid);
    }
  }, {
    key: 'amountPaidNet',
    get: function get() {
      var paid = this.paidAmount || _InvoiceCalculator.ZERO;
      var refunded = this.refundedAmount || _InvoiceCalculator.ZERO;
      return paid.minus(refunded);
    }
  }, {
    key: 'hasBeenPaid',
    get: function get() {
      return this.status === _InvoiceEnums2.default.Status.MARKED_AS_PAID || this.status === _InvoiceEnums2.default.Status.PAID;
    }
  }]);

  return Invoice;
}(_events.EventEmitter);

// Put any callback definitions before the module exports, and
// reference them in parameter definitions.

/**
 * @callback Invoice~gotDetails
 * @param {PayPalError} error The error that occurred, if any
 */

/**
 * After an attempt has been made to save your invoice to the PayPal servers,
 * the completion handler will be called with the error (if any, or null if not)
 * and the invoice object will be updated appropriately.
 * @callback Invoice~saved
 * @param {PayPalError} error The error that occurred, if any
 */

/**
 * After an attempt has been made to send your invoice, the completion handler
 * will be called with the error (if any, or null if not) and the invoice object
 * will be updated appropriately.
 * @callback Invoice~sent
 * @param {PayPalError} error The error that occurred, if any
 */

/**
 * @callback Invoice~deleted
 * @param {PayPalError} error The error that occurred, if any
 */

/**
 * @callback Invoice~reminded
 * @param {PayPalError} error The error that occurred, if any
 */

/**
 * @callback Invoice~cancelled
 * @param {PayPalError} error The error that occurred, if any
 */

/**
 * @callback Invoice~paid
 * @param {PayPalError} error The error that occurred, if any
 */

/**
 * @callback Invoice~refunded
 * @param {PayPalError} error The error that occurred, if any
 */

exports.default = Invoice;
Invoice.event = {
  totalMayHaveChanged: 'TotalMayHaveChanged'
};
},{"./Attachment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Attachment.js","./BillingInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/BillingInfo.js","./CCInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/CCInfo.js","./Currency":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Currency.js","./CustomAmount":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/CustomAmount.js","./InvoiceBigNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceBigNumber.js","./InvoiceCalculator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceCalculator.js","./InvoiceEnums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceEnums.js","./InvoiceMetaData":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceMetaData.js","./InvoicingService":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingService.js","./InvoicingUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingUtil.js","./Item":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Item.js","./MerchantInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/MerchantInfo.js","./Payment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Payment.js","./PaymentTerm":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/PaymentTerm.js","./Refund":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Refund.js","./Requester":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Requester.js","./ShippingInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/ShippingInfo.js","assert":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/assert.js","deep-equal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/deep-equal/index.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-log/index.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceActions.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _InvoiceEnums = require('./InvoiceEnums');

var _InvoiceEnums2 = _interopRequireDefault(_InvoiceEnums);

var _InvoiceCalculator = require('./InvoiceCalculator');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * @class
 */
var InvoiceActions = function () {
  function InvoiceActions() {
    _classCallCheck(this, InvoiceActions);
  }

  /**
   * @param {Invoice} invoice
   * @returns {[Invoice.Action]}
   */
  InvoiceActions.availableActions = function availableActions(invoice) {
    var a = _InvoiceEnums2.default.Action;
    var paid = invoice.paidAmountOther || _InvoiceCalculator.ZERO;
    var refunded = invoice.refundedAmountOther || _InvoiceCalculator.ZERO;
    var hasEmail = invoice.billingInfo !== undefined && invoice.billingInfo.email;
    var actions = void 0;
    switch (invoice.status) {
      case _InvoiceEnums2.default.Status.NEW:
        throw new Error('Actions are undefined for NEW invoices.');
      case _InvoiceEnums2.default.Status.DRAFT:
        actions = [a.Send, a.Edit, a.Delete, a.RecordPayment, a.Copy, a.Share];
        break;
      case _InvoiceEnums2.default.Status.SENT:
        actions = [a.Remind, a.RecordPayment, a.QRCode, a.Edit, a.Cancel, a.Copy, a.Call, a.Share];
        break;
      case _InvoiceEnums2.default.Status.PARTIALLY_PAID:
        if (paid.minus(refunded).isZero()) {
          actions = [a.Remind, a.RecordPayment, a.Edit, a.Call, a.Copy, a.Share];
        } else {
          actions = [a.Remind, a.RecordPayment, a.RecordRefund, a.Edit, a.Call, a.Copy, a.Share];
        }
        break;
      case _InvoiceEnums2.default.Status.PAID:
      case _InvoiceEnums2.default.Status.MARKED_AS_PAID:
      case _InvoiceEnums2.default.Status.PARTIALLY_REFUNDED:
        if (invoice.total === 0 || paid.minus(refunded).isZero()) {
          actions = [a.Call, a.Copy, a.Share];
        } else {
          actions = [a.RecordRefund, a.Call, a.Copy, a.Share];
        }
        break;
      case _InvoiceEnums2.default.Status.CANCELLED:
      case _InvoiceEnums2.default.Status.REFUNDED:
      case _InvoiceEnums2.default.Status.MARKED_AS_REFUNDED:
        actions = [a.Call, a.Copy, a.Share];
        break;
      case _InvoiceEnums2.default.Status.UNPAID:
        actions = [a.RecordPayment, a.QRCode, a.Edit, a.Cancel, a.Copy, a.Share];
        break;
      case _InvoiceEnums2.default.Status.PAYMENT_PENDING:
        actions = [a.Call, a.Copy, a.Share];
        break;
      case _InvoiceEnums2.default.Status.SCHEDULED:
        actions = [a.RecordPayment, a.Edit, a.Cancel, a.Copy, a.Call, a.Share, a.Delete];
        break;
      default:
        throw new Error('Unknown invoice status');
    }

    if (!hasEmail) {
      if (actions.indexOf(a.Call) != -1) {
        actions.splice(actions.indexOf(a.Call), 1);
      }

      if (actions.indexOf(a.Remind) != -1) {
        actions.splice(actions.indexOf(a.Remind), 1);
      }
    }

    return actions;
  };

  return InvoiceActions;
}();

exports.default = InvoiceActions;
},{"./InvoiceCalculator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceCalculator.js","./InvoiceEnums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceEnums.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceBigNumber.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;
exports.$$ = $$;
exports.IBN = IBN;

var _bignumber = require('bignumber.js');

var _bignumber2 = _interopRequireDefault(_bignumber);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var InvoiceBigNumber = function (_BN) {
  _inherits(InvoiceBigNumber, _BN);

  function InvoiceBigNumber() {
    _classCallCheck(this, InvoiceBigNumber);

    return _possibleConstructorReturn(this, _BN.apply(this, arguments));
  }

  InvoiceBigNumber.$$ = function $$(a) {
    var result = IBN(a, 2);
    if (result) {
      result.includeTrailingZeros = true;
    }
    return result;
  };

  InvoiceBigNumber.IBN = function IBN(a, decimalPrecision, includeTrailingZeros) {
    var result = a != undefined && a != null ? new InvoiceBigNumber(a) : null;
    if (result) {
      result.decimalPrecision = _bignumber2.default.isBigNumber(decimalPrecision) ? decimalPrecision.toNumber() : decimalPrecision;
      result.includeTrailingZeros = includeTrailingZeros;
    }
    return result;
  };

  InvoiceBigNumber.prototype.toJSON = function toJSON() {
    if (!this.includeTrailingZeros) {
      var num = new _bignumber2.default(this.toFixed(this.decimalPrecision));
      return num.toString();
    } else {
      return this.toFixed(this.decimalPrecision);
    }
  };

  InvoiceBigNumber.prototype.toNumber = function toNumber() {
    var num = new _bignumber2.default(this.toJSON());
    return num.toNumber();
  };

  return InvoiceBigNumber;
}(_bignumber2.default);

exports.default = InvoiceBigNumber;
function $$(a) {
  return InvoiceBigNumber.$$(a);
}

function IBN(a, decimalPrecision, includeTrailingZeros) {
  return InvoiceBigNumber.IBN(a, decimalPrecision, includeTrailingZeros);
}
},{"bignumber.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/bignumber.js/bignumber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceCalculator.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;
exports.ONE = exports.ZERO = undefined;

var _Currency = require('./Currency');

var _Currency2 = _interopRequireDefault(_Currency);

var _InvoiceBigNumber = require('./InvoiceBigNumber');

var _InvoiceBigNumber2 = _interopRequireDefault(_InvoiceBigNumber);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var ZERO = exports.ZERO = new _InvoiceBigNumber2.default(0);
var ONE = exports.ONE = new _InvoiceBigNumber2.default(1);

function nonZero(amt) {
  return amt && !ZERO.isEqualTo(amt);
}

function valOrZero(amt) {
  return amt || ZERO;
}

function amtOrZero(val) {
  return val ? val['amount'] : ZERO;
}

function parseAmtOrZero(obj) {
  return obj ? JSON.parse(obj)['amount'] : ZERO;
}

// Calculates the total for the given item with an invoice-level discount included
function calculateItemTotalWithInvoiceDiscount(invoice, item) {
  var itemTotal = item.totalForInvoice(invoice);
  var discountShare = itemTotal.dividedBy(calculateItemTotals(invoice)).times(invoice.discountAmount);
  itemTotal = itemTotal.minus(discountShare);
  return itemTotal;
}

// Calculates the shipping tax for the given invoice
function calculateShippingTax(invoice) {
  var rate = invoice.shippingTaxRate;
  var amount = invoice.shippingAmount;
  var taxes = invoice.taxBreakdown;
  if (nonZero(rate) && nonZero(amount)) {
    var key = invoice.shippingTaxName;
    return parseAmtOrZero(taxes[key]);
  }
  return ZERO;
}

// Calculates the total for all items on the given invoice with discounts included
function calculateItemTotals(invoice) {
  var total = ZERO;
  for (var _iterator = invoice.items, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
    var _ref;

    if (_isArray) {
      if (_i >= _iterator.length) break;
      _ref = _iterator[_i++];
    } else {
      _i = _iterator.next();
      if (_i.done) break;
      _ref = _i.value;
    }

    var i = _ref;

    total = total.plus(i.totalForInvoice(invoice));
  }
  return (0, _InvoiceBigNumber.$$)(total);
}

var InvoiceCalculator = function () {
  function InvoiceCalculator() {
    _classCallCheck(this, InvoiceCalculator);
  }

  // Calculates the total amount discounted from all items on the given invoice
  InvoiceCalculator.calculateItemDiscounts = function calculateItemDiscounts(invoice) {
    var itemDiscounts = ZERO;
    for (var _iterator2 = invoice.items, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
      var _ref2;

      if (_isArray2) {
        if (_i2 >= _iterator2.length) break;
        _ref2 = _iterator2[_i2++];
      } else {
        _i2 = _iterator2.next();
        if (_i2.done) break;
        _ref2 = _i2.value;
      }

      var item = _ref2;

      if (item.discountAmount) {
        itemDiscounts = itemDiscounts.plus(item.discountAmount);
      } else if (item.discountPercentage) {
        var itemSubTotal = item.subtotalForInvoice(invoice);
        var discount = _Currency2.default.round(invoice.currency, itemSubTotal.times(item.discountPercentage.dividedBy(100)));
        itemDiscounts = itemDiscounts.plus(discount);
      }
    }
    return (0, _InvoiceBigNumber.$$)(itemDiscounts);
  };

  // Calculates the subtotal for an invoice from it's list of items


  InvoiceCalculator.calculateSubtotal = function calculateSubtotal(invoice) {
    var subtotal = ZERO;
    for (var _iterator3 = invoice.items, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
      var _ref3;

      if (_isArray3) {
        if (_i3 >= _iterator3.length) break;
        _ref3 = _iterator3[_i3++];
      } else {
        _i3 = _iterator3.next();
        if (_i3.done) break;
        _ref3 = _i3.value;
      }

      var item = _ref3;

      subtotal = subtotal.plus(item.subtotalForInvoice(invoice));
    }
    return (0, _InvoiceBigNumber.$$)(subtotal);
  };

  // Calculates the discount price for an invoice


  InvoiceCalculator.calculateDiscountPrice = function calculateDiscountPrice(invoice) {
    var price = ZERO;
    if (invoice.discountAmount) {
      price = invoice.discountAmount;
    }
    if (invoice.discountPercentage) {
      price = invoice.subTotal.minus(invoice.itemDiscounts).multipliedBy(invoice.discountPercentage.dividedBy(100));
    }
    return _Currency2.default.round(invoice.currency, price);
  };

  // Calculates the tax breakdown for the given invoice, including all item taxes and the shipping tax (if present)


  InvoiceCalculator.calculateTaxBreakdown = function calculateTaxBreakdown(invoice) {
    var taxes = {};
    for (var _iterator4 = invoice.items, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
      var _ref4;

      if (_isArray4) {
        if (_i4 >= _iterator4.length) break;
        _ref4 = _iterator4[_i4++];
      } else {
        _i4 = _iterator4.next();
        if (_i4.done) break;
        _ref4 = _i4.value;
      }

      var item = _ref4;

      var amountToBeTaxed = void 0;
      if (invoice.taxCalculatedAfterDiscount) {
        if (invoice.discountAmount) {
          amountToBeTaxed = calculateItemTotalWithInvoiceDiscount(invoice, item);
        } else if (invoice.discountPercentage) {
          amountToBeTaxed = item.totalForInvoice(invoice).times(ONE.minus(invoice.discountPercentage.dividedBy(100)));
        } else {
          amountToBeTaxed = item.totalForInvoice(invoice);
        }
      } else {
        amountToBeTaxed = item.subtotalForInvoice(invoice);
      }
      if (nonZero(item.taxRate)) {
        var _tax = item.taxRate.dividedBy(100);
        var _key = item.taxName;
        if (invoice.taxInclusive) {
          amountToBeTaxed = _Currency2.default.round(invoice.currency, amountToBeTaxed.dividedBy(ONE.plus(_tax)));
        }
        var taxAmount = amountToBeTaxed.times(_tax);
        var roundedTax = _Currency2.default.round(invoice.currency, taxAmount);
        roundedTax = nonZero(roundedTax) ? roundedTax : (0, _InvoiceBigNumber.$$)(0.00);
        taxes[_key] = {
          'amount': _Currency2.default.round(invoice.currency, amtOrZero(taxes[_key]).plus(roundedTax)),
          'rate': item.taxRate.toString()
        };
      }
    }
    var rate = invoice.shippingTaxRate;
    var amount = invoice.shippingAmount;
    if (nonZero(rate) && nonZero(amount)) {
      var key = invoice.shippingTaxName;
      var total = amount.times(rate.dividedBy(100));
      taxes[key] = {
        'amount': _Currency2.default.round(invoice.currency, amtOrZero(taxes[key]).plus(total)),
        'rate': rate.toString()
      };
    }
    for (var tax in taxes) {
      taxes[tax] = JSON.stringify(taxes[tax]);
    }
    return taxes;
  };

  // Calculates the discount total for the given invoice from either an amount or a percentage


  InvoiceCalculator.calculateDiscountTotal = function calculateDiscountTotal(invoice) {
    if (nonZero(invoice.discountAmount)) {
      return (0, _InvoiceBigNumber.$$)(invoice.discountAmount);
    } else if (nonZero(invoice.discountPercentage)) {
      return _Currency2.default.round(invoice.currency, (0, _InvoiceBigNumber.$$)(invoice.discountPercentage).dividedBy(100).times(calculateItemTotals(invoice)));
    }
    return ZERO;
  };

  // Calculates the tax total for all items on the invoice based on the tax breakdown, not counting the shipping tax


  InvoiceCalculator.calculateItemTaxTotal = function calculateItemTaxTotal(invoice) {
    var taxes = invoice.taxBreakdown;
    var taxTotal = ZERO;
    for (var tax in taxes) {
      taxTotal = taxTotal.plus(parseAmtOrZero(taxes[tax]));
    }
    var shippingTax = calculateShippingTax(invoice);
    return nonZero(taxTotal) ? taxTotal.minus(shippingTax) : taxTotal;
  };

  // Calculates the grand total for the given invoice


  InvoiceCalculator.calculateTotal = function calculateTotal(invoice) {
    var taxTotal = invoice.taxInclusive ? ZERO : valOrZero(invoice.itemTax).plus(calculateShippingTax(invoice));
    var custom = invoice.custom ? invoice.custom.amount : ZERO;
    var total = valOrZero(invoice.subTotal).plus(valOrZero(invoice.gratuityAmount)).plus(valOrZero(invoice.shippingAmount)).plus(taxTotal).plus(custom).minus(valOrZero(invoice.totalDiscount)).minus(InvoiceCalculator.calculateItemDiscounts(invoice));
    return _Currency2.default.round(invoice.currency, total);
  };

  return InvoiceCalculator;
}();

exports.default = InvoiceCalculator;
},{"./Currency":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Currency.js","./InvoiceBigNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceBigNumber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceConstants.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _bignumber = require('bignumber.js');

var _bignumber2 = _interopRequireDefault(_bignumber);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
* Class for getting constants relating to invoice business logic.
* @class
*/
var InvoiceConstants = function () {
  function InvoiceConstants() {
    _classCallCheck(this, InvoiceConstants);
  }

  /**
  * The number of numbers allowed after the decimal point for tax rates, including item & shipping.
  * @method
  * @returns {decimal}
  */
  InvoiceConstants.taxRateDecimalPrecision = function taxRateDecimalPrecision() {
    return new _bignumber2.default(5);
  };

  /**
  * The number of numbers allowed after the decimal point for discount rates.
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.discountPercentageDecimalPrecision = function discountPercentageDecimalPrecision() {
    return new _bignumber2.default(2);
  };

  /**
   * Character max for invoice number.
   * @method
   * @returns {decimal}
   */


  InvoiceConstants.invoiceNumberMaxLength = function invoiceNumberMaxLength() {
    return new _bignumber2.default(25);
  };

  /**
  * Character max for invoice terms.
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.invoiceTermsMaxLength = function invoiceTermsMaxLength() {
    return new _bignumber2.default(4000);
  };

  /**
  * Character max for invoice note.
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.invoiceNoteMaxLength = function invoiceNoteMaxLength() {
    return new _bignumber2.default(4000);
  };

  /**
  * Character max for invoice merchant memo.
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.invoiceMerchantMemoMaxLength = function invoiceMerchantMemoMaxLength() {
    return new _bignumber2.default(150);
  };

  /**
  * Character max for invoice reference field.
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.invoiceReferenceMaxLength = function invoiceReferenceMaxLength() {
    return new _bignumber2.default(60);
  };

  /**
  * The number of numbers allowed after the decimal point for item quantity.
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.itemQuantityDecimalPrecision = function itemQuantityDecimalPrecision() {
    return new _bignumber2.default(5);
  };

  /**
  * The maximum quantity allowed to specify on an invoice, inclusive.
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.itemQuantityMax = function itemQuantityMax() {
    return new _bignumber2.default(10000);
  };

  /**
  * The minimum quantity allowed to specify on an invoice, inclusive.
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.itemQuantityMin = function itemQuantityMin() {
    return new _bignumber2.default(-10000);
  };

  /**
  * Character max for invoice item name.
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.itemNameMaxLength = function itemNameMaxLength() {
    return new _bignumber2.default(200);
  };

  /**
  * Character max for invoice item description.
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.itemDescriptionMaxLength = function itemDescriptionMaxLength() {
    return new _bignumber2.default(1000);
  };

  /**
  * Max value for invoice item price.
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.itemPriceMax = function itemPriceMax() {
    return new _bignumber2.default(999999.99);
  };
  /**
  * Max value for tax
  * @method
  * @returns {decimal}
  */


  InvoiceConstants.taxRateMaxValue = function taxRateMaxValue() {
    return new _bignumber2.default(99.99999);
  };

  return InvoiceConstants;
}();

exports.default = InvoiceConstants;
},{"bignumber.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/bignumber.js/bignumber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceEnums.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _manticoreUtil = require('manticore-util');

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

// This class is named Invoice for the sake of codegen
var Invoice = function Invoice() {
  _classCallCheck(this, Invoice);
};

/**
 * Valid invoice statuses
 * @enum {int}
 */


exports.default = Invoice;
Invoice.Status = {
  /**
   * The invoice has not been saved to the server
   */
  NEW: 0,
  /**
   * The invoice has been saved to the server
   */
  DRAFT: 1,
  /**
   * The invoice has been sent to the recipient(payer)
   */
  SENT: 2,
  /**
   * The invoice has been paid with a balance affecting instrument like PayPal or CC
   */
  PAID: 3,
  /**
   * The invoice has been marked as paid with a method outside PayPal
   */
  MARKED_AS_PAID: 4,
  /**
   * The invoice has been cancelled
   */
  CANCELLED: 5,
  /**
   * The invoice has been refunded from a balance affecting instrument
   */
  REFUNDED: 6,
  /**
   * The invoice has been partially refunded from a balance affecting instrument
   */
  PARTIALLY_REFUNDED: 7,
  /**
   * The invoice has been marked as refunded with a method outside PayPal
   */
  MARKED_AS_REFUNDED: 8,
  /**
   * The invoice has been partially paid
   */
  PARTIALLY_PAID: 9,
  /*
   * The invoice has been sent with no receipient
   */
  UNPAID: 10,
  /*
   * A payment has been made on 'the invoice, but the merchant is not verified and
   * is therefore unable to accept the payment
   */
  PAYMENT_PENDING: 11,
  /**
   * The invoice has been scheduled
   */
  SCHEDULED: 12,
  /*
   * We were unable to infer or map the status
   */
  UNKNOWN: 13

};

Invoice.Status.toString = (0, _manticoreUtil.reverseKeysAndValues)(Invoice.Status);

/**
 * PayPal payment detail indicating whether payment was made in an invoicing flow via PayPal
 * or externally. In the case of the mark-as-paid API, payment type is EXTERNAL and this
 * is what is now supported. The PAYPAL value is provided for backward compatibility.
 * @enum {int}
 */
Invoice.PaymentType = {
  /**
   * The invoice hasn't been paid
   */
  NONE: 0,
  /**
   * The invoice was paid with an external (non-balance-affecting) source
   */
  EXTERNAL: 1,
  /**
   * The invoice was paid with an internal (balance-affecting) source
   */
  PAYPAL: 2
};

Invoice.PaymentType.toString = (0, _manticoreUtil.reverseKeysAndValues)(Invoice.PaymentType);

/**
 * Payment mode or method.
 * @enum {int}
 */
Invoice.PaymentMethod = {
  /**
   * None
   */
  NONE: 0,
  /**
   * Bank Transfer
   */
  BANK_TRANSFER: 1,
  /**
   * Cash
   */
  CASH: 2,
  /**
   * Check
   */
  CHECK: 3,
  /**
   * Credit Card
   */
  CREDIT_CARD: 4,
  /**
   * Debit Card
   */
  DEBIT_CARD: 5,
  /**
   * PayPal
   */
  PAYPAL: 6,
  /**
   * Wire Transfer
   */
  WIRE_TRANSFER: 7,
  /**
   * Other
   */
  OTHER: 8,
  /**
   * Digital Card
   */
  DIGITAL_CARD: 9,
  /**
   * Key In
   */
  KEY_IN: 10,
  /**
   * QRC
   */
  QRC: 11
};

Invoice.PaymentMethod.toString = (0, _manticoreUtil.reverseKeysAndValues)(Invoice.PaymentMethod);
// DIGITAL_CARD, QRC & KEY_IN are not officially recognized by the invoicing APIs
Invoice.PaymentMethod.toString[Invoice.PaymentMethod.DIGITAL_CARD] = 'OTHER';
Invoice.PaymentMethod.toString[Invoice.PaymentMethod.QRC] = 'PAYPAL';
Invoice.PaymentMethod.toString[Invoice.PaymentMethod.KEY_IN] = 'CREDIT_CARD';

/**
 * Invoice action
 * @enum {int}
 */
Invoice.Action = {
  /**
   * None
   */
  None: 0,
  /**
   * Delete
   */
  Delete: 1,
  /**
   * Send
   */
  Send: 2,
  /**
   * Remind
   */
  Remind: 3,
  /**
   * Record Payment
   */
  RecordPayment: 4,
  /**
   * Record Refund
   */
  RecordRefund: 5,
  /**
   * Copy
   */
  Copy: 6,
  /**
   * Edit
   */
  Edit: 7,
  /**
   * Call
   */
  Call: 8,
  /**
   * Cancel
   */
  Cancel: 9,
  /**
   * More
   */
  More: 10,
  /**
   * Share
   */
  Share: 11,
  /**
   * View History
   */
  ViewHistory: 12,
  /**
   * View Invoice
   */
  ViewInvoice: 13,
  /**
   * QR Code
   */
  QRCode: 14
};
},{"manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceListRequest.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * @class
 * @property {int} startIndex A zero-relative index of the merchant's list of invoices
 * @property {int} pageSize The number of invoices to retrieve, beginning with the specified page
 * @property {bool} totalCountRequired Determines if the total count is returned.
 */
var InvoiceListRequest = function InvoiceListRequest() {
  _classCallCheck(this, InvoiceListRequest);

  this.startIndex = 0;
  this.pageSize = 20;
  this.totalCountRequired = true;
};

exports.default = InvoiceListRequest;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceListResponse.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _Invoice = require('./Invoice');

var _Invoice2 = _interopRequireDefault(_Invoice);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * @class
 * @property {[Invoice]} invoices All the invoices in the requested page of the invoice list
 * @property {int} totalCount The total number of invoices in the invoice list.
 *  May be 0 if totalCountRequired wasn't specified.
 * @property {bool} hasMore yes if this is not the last page of invoices
 */
var InvoiceListResponse = function () {
  function InvoiceListResponse() {
    _classCallCheck(this, InvoiceListResponse);
  }

  InvoiceListResponse.fromJSON = function fromJSON(json) {
    var r = new InvoiceListResponse();

    r.invoices = [];
    if (json && json.invoices) {
      for (var _iterator = json.invoices, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
        var _ref;

        if (_isArray) {
          if (_i >= _iterator.length) break;
          _ref = _iterator[_i++];
        } else {
          _i = _iterator.next();
          if (_i.done) break;
          _ref = _i.value;
        }

        var invoiceJSON = _ref;

        var i = _Invoice2.default.fromJson(invoiceJSON, false);
        i.setCleanFromServer();
        r.invoices.push(i);
      }
    }

    r.totalCount = json && json.total_count ? json.total_count : 0;

    return r;
  };

  return InvoiceListResponse;
}();

exports.default = InvoiceListResponse;
},{"./Invoice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Invoice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceMetaData.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _InvoicingUtil = require('./InvoicingUtil');

var _InvoicingUtil2 = _interopRequireDefault(_InvoicingUtil);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Invoice MetaData
 * @class
 * @property {Date} createdDate Date when the resource was created. @readonly
 * @property {string} createdBy Email address of the account that created the resource. @readonly
 * @property {Date} cancelledDate Date when the resource was cancelled. @readonly
 * @property {string} cancelledBy Actor who cancelled the resource. @readonly
 * @property {Date} lastUpdatedDate Date when the resource was last edited. @readonly
 * @property {string} lastUpdatedBy Email address of the account that last
 *  edited the resource. @readonly
 * @property {Date} firstSentDate Date when the resource was first sent. @readonly
 * @property {Date} lastSentDate Date when the resource was last sent. @readonly
 * @property {string} lastSentBy Email address of the account that last sent the resource. @readonly
 * @property {string} payerViewURL URL representing the payer's view of the invoice. @readonly
 */
var InvoiceMetaData = function () {
  function InvoiceMetaData() {
    _classCallCheck(this, InvoiceMetaData);
  }

  InvoiceMetaData.fromJSON = function fromJSON(json) {
    var m = new InvoiceMetaData();

    m.createdBy = json.created_by;
    m.cancelledBy = json.cancelled_by;
    m.lastUpdatedBy = json.last_updated_by;
    m.lastSentBy = json.last_sent_by;
    m.payerViewURL = json.payer_view_url;

    if (json.created_date) {
      m.createdDate = _InvoicingUtil2.default.parseServerDateString(json.created_date);
    }
    if (json.cancelled_date) {
      m.cancelledDate = _InvoicingUtil2.default.parseServerDateString(json.cancelled_date);
    }
    if (json.last_updated_date) {
      m.lastUpdatedDate = _InvoicingUtil2.default.parseServerDateString(json.last_updated_date);
    }
    if (json.first_sent_date) {
      m.firstSentDate = _InvoicingUtil2.default.parseServerDateString(json.first_sent_date);
    }
    if (json.last_sent_date) {
      m.lastSentDate = _InvoicingUtil2.default.parseServerDateString(json.last_sent_date);
    }
    return m;
  };

  InvoiceMetaData.toFullJSON = function toFullJSON(metadata) {
    var r = {};

    r.created_by = metadata.createdBy;
    r.cancelled_by = metadata.cancelledBy;
    r.last_updated_by = metadata.lastUpdatedBy;
    r.last_sent_by = metadata.lastSentBy;
    r.payer_view_url = metadata.payerViewURL;

    if (metadata.createdDate) {
      r.created_date = _InvoicingUtil2.default.toServerDateString(metadata.createdDate, true);
    }
    if (metadata.cancelledDate) {
      r.cancelled_date = _InvoicingUtil2.default.toServerDateString(metadata.cancelledDate, true);
    }
    if (metadata.lastUpdatedDate) {
      r.last_updated_date = _InvoicingUtil2.default.toServerDateString(metadata.lastUpdatedDate, true);
    }
    if (metadata.firstSentDate) {
      r.first_sent_date = _InvoicingUtil2.default.toServerDateString(metadata.firstSentDate, true);
    }
    if (metadata.lastSentDate) {
      r.last_sent_date = _InvoicingUtil2.default.toServerDateString(metadata.lastSentDate, true);
    }
    return r;
  };

  _createClass(InvoiceMetaData, [{
    key: 'createdDate',
    set: function set(date) {
      this._createdDate = date;
    },
    get: function get() {
      return _InvoicingUtil2.default.getDateValue(this._createdDate);
    }
  }, {
    key: 'cancelledDate',
    set: function set(date) {
      this._cancelledDate = date;
    },
    get: function get() {
      return _InvoicingUtil2.default.getDateValue(this._cancelledDate);
    }
  }, {
    key: 'firstSentDate',
    set: function set(date) {
      this._firstSentDate = date;
    },
    get: function get() {
      return _InvoicingUtil2.default.getDateValue(this._firstSentDate);
    }
  }, {
    key: 'lastSentDate',
    set: function set(date) {
      this._lastSentDate = date;
    },
    get: function get() {
      return _InvoicingUtil2.default.getDateValue(this._lastSentDate);
    }
  }]);

  return InvoiceMetaData;
}();

exports.default = InvoiceMetaData;
},{"./InvoicingUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingUtil.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceTemplatesResponse.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _Template = require('./Template');

var _Template2 = _interopRequireDefault(_Template);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * @class
 * @property {InvoiceTemplate} defaultTemplate The default template
 * @property {[InvoiceTemplate]} templates array of all the templates
 */
var InvoiceTemplatesResponse = function () {
  function InvoiceTemplatesResponse() {
    _classCallCheck(this, InvoiceTemplatesResponse);

    this.templates = [];
  }

  InvoiceTemplatesResponse.fromJSON = function fromJSON(json) {
    var r = void 0;

    if (json && json.templates) {
      r = new InvoiceTemplatesResponse();

      for (var _iterator = json.templates, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
        var _ref;

        if (_isArray) {
          if (_i >= _iterator.length) break;
          _ref = _iterator[_i++];
        } else {
          _i = _iterator.next();
          if (_i.done) break;
          _ref = _i.value;
        }

        var t = _ref;

        var temp = _Template2.default.fromJSON(t);
        if (temp !== undefined) {
          r.templates.push(temp);
          if (temp.isDefault === true) {
            r.defaultTemplate = temp;
          }
        }
      }

      r.templates = _Template2.default.sortTemplates(r.templates);
    }

    return r;
  };

  return InvoiceTemplatesResponse;
}();

exports.default = InvoiceTemplatesResponse;
},{"./Template":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Template.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingService.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _BaseService2 = require('./BaseClasses/BaseService');

var _BaseService3 = _interopRequireDefault(_BaseService2);

var _Requester = require('./Requester');

var _InvoiceListResponse = require('./InvoiceListResponse');

var _InvoiceListResponse2 = _interopRequireDefault(_InvoiceListResponse);

var _InvoiceTemplatesResponse = require('./InvoiceTemplatesResponse');

var _InvoiceTemplatesResponse2 = _interopRequireDefault(_InvoiceTemplatesResponse);

var _Attachment = require('./Attachment');

var _Attachment2 = _interopRequireDefault(_Attachment);

var _Invoice = require('./Invoice');

var _Invoice2 = _interopRequireDefault(_Invoice);

var _AccountSummary = require('./AccountSummary');

var _AccountSummary2 = _interopRequireDefault(_AccountSummary);

var _InvoicingUtil = require('./InvoicingUtil');

var _InvoicingUtil2 = _interopRequireDefault(_InvoicingUtil);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

/**
 * @class
 */
var InvoicingService = function (_BaseService) {
    _inherits(InvoicingService, _BaseService);

    function InvoicingService() {
        _classCallCheck(this, InvoicingService);

        return _possibleConstructorReturn(this, _BaseService.apply(this, arguments));
    }

    /**
     * @param {InvoiceListRequest} params
     * @param {InvoicingService~getInvoices} completionHandler The completion handler
     */
    InvoicingService.getInvoices = function getInvoices(params, completionHandler) {
        var si = params.startIndex,
            pg = params.pageSize,
            tot = params.totalCountRequired;

        (0, _Requester.request)({
            method: 'GET',
            op: 'invoices?page=' + si + '&page_size=' + pg + '&total_count_required=' + tot
        }, function (error, response) {
            if (error) {
                completionHandler(error);
            } else {
                var r = _InvoiceListResponse2.default.fromJSON(response.body);
                r.hasMore = params.startIndex + params.pageSize < r.totalCount;
                completionHandler(error, r);
            }
        });
    };

    /**
     * Search for a specific invoice or invoices by passing a search object that
     * specifies your * search criteria.
     * @param {InvoiceSearchRequest} params
     * @param {InvoicingService~searchInvoices} completionHandler The completion handler
     */


    InvoicingService.searchInvoices = function searchInvoices(params, completionHandler) {
        (0, _Requester.request)({
            method: 'POST',
            op: 'search',
            body: JSON.stringify(params)
        }, function (error, response) {
            if (error) {
                completionHandler(error);
            } else {
                var r = _InvoiceListResponse2.default.fromJSON(response.body);
                r.hasMore = params.startIndex + params.pageSize < r.totalCount;
                completionHandler(error, r);
            }
        });
    };

    /**
     * Load the details for a specific invoice given the invoice ID
     * @param {string} invoiceID
     * @param {InvoicingService~getInvoice} completionHandler The completion handler
     */


    InvoicingService.getInvoice = function getInvoice(invoiceID, completionHandler) {
        InvoicingService.getInvoiceDetails(invoiceID, function (error, details) {
            if (error) {
                completionHandler(error);
            } else {
                var invoice = _Invoice2.default.fromJson(details, true);
                invoice.setCleanFromServer();
                completionHandler(error, invoice);
            }
        });
    };

    //Completion handler should accept error and JSON


    InvoicingService.getInvoiceDetails = function getInvoiceDetails(invoiceID, completionHandler) {
        (0, _Requester.request)({
            method: 'GET',
            op: 'invoices/' + invoiceID
        }, function (error, response) {
            if (error) {
                completionHandler(error);
            } else {
                completionHandler(error, response.body);
            }
        });
    };

    /**
     * @param {InvoicingService~getNextInvoiceNumber} completionHandler The completion handler
     */


    InvoicingService.getNextInvoiceNumber = function getNextInvoiceNumber(completionHandler) {
        (0, _Requester.request)({
            method: 'POST',
            op: 'invoices/next-invoice-number'
        }, function (error, response) {
            if (error) {
                completionHandler(error);
            } else {
                var nextInvNum = response.body.number;
                completionHandler(error, nextInvNum);
            }
        });
    };

    /**
     * @param {InvoicingService~getAccountSummary} completionHandler The completion handler
     */


    InvoicingService.getAccountSummary = function getAccountSummary(completionHandler) {
        var _this2 = this;

        // TODO: Should we expose something closer to the actual API? Right now we're returning data
        // specifically for the PPB app.

        var firstError = void 0;
        var secondError = void 0;
        var firstResponse = void 0;
        var secondResponse = void 0;

        var maybeContinue = function maybeContinue() {
            if ((firstError || firstResponse) && (secondError || secondResponse)) {
                _this2.continueGetAccountSummary(firstError, firstResponse, secondError, secondResponse, completionHandler);
            }
        };

        (0, _Requester.request)({
            method: 'GET',
            op: 'summaries?overdue=false'
        }, function (error, response) {
            firstError = error;
            firstResponse = response;
            maybeContinue();
        });

        (0, _Requester.request)({
            method: 'GET',
            op: 'summaries?overdue=true'
        }, function (error, response) {
            secondError = error;
            secondResponse = response;
            maybeContinue();
        });
    };

    InvoicingService.continueGetAccountSummary = function continueGetAccountSummary(firstError, firstResponse, secondError, secondResponse, completionHandler) {
        var error = firstError || secondError;
        if (error) {
            completionHandler(error);
        }
        completionHandler(error, new _AccountSummary2.default(firstResponse.body, secondResponse.body));
    };

    /**
     * @param {InvoicingService~getTemplates} completionHandler The completion handler
     */


    InvoicingService.getTemplates = function getTemplates(completionHandler) {
        (0, _Requester.request)({
            method: 'GET',
            op: 'templates'
        }, function (error, response) {
            if (error) {
                completionHandler(error);
            } else {
                completionHandler(error, _InvoiceTemplatesResponse2.default.fromJSON(response.body));
            }
        });
    };

    /**
     * @param {string} fileHandle Native reference to the file
     * @param {string} contentType Content type of the file
     * @param {InvoicingService~uploadFile} completionHandler The completion handler
     * Supported types: image/png, image/jpg, image/jpeg, image/gif, application/xml, application/pdf, image/tiff, image/tif, image/bmp
     */


    InvoicingService.uploadFile = function uploadFile(fileHandle, contentType, completionHandler) {
        var _this3 = this;

        if (fileHandle === undefined || fileHandle === '') {
            var error = new Error('file handle must be defined');
            return completionHandler(error, undefined);
        }

        if (!_InvoicingUtil2.default.isFileUploadSupported(contentType)) {
            var _error = new Error('Unsupported MIME type');
            return completionHandler(_error, undefined);
        }

        var params = {
            contentType: contentType,
            name: 'file',
            value: fileHandle
        };
        (0, _Requester.request)({
            method: 'POST',
            op: 'files',
            headers: { 'Content-Type': 'multipart/form-data' },
            multiPartBody: params
        }, function (error, response) {
            if (error) {
                completionHandler(error);
            } else {
                var attachmentResponse = _this3.adaptUploadAttachmentResponse(response.body);
                completionHandler(error, _Attachment2.default.readFromJson(attachmentResponse));
            }
        });
    };

    InvoicingService.adaptUploadAttachmentResponse = function adaptUploadAttachmentResponse(response) {
        return {
            name: response.filename ? response.filename : undefined,
            url: response.id ? '&id=' + response.id : undefined
        };
    };

    return InvoicingService;
}(_BaseService3.default);

/**
 * @callback InvoicingService~getInvoices
 * @param {PayPalError} error The error that occurred, if any
 * @param {InvoiceListResponse} response The server response
 */

/**
 * @callback InvoicingService~searchInvoices
 * @param {PayPalError} error The error that occurred, if any
 * @param {InvoiceListResponse} response The server response
 */

/**
 * @callback InvoicingService~getInvoice
 * @param {PayPalError} error The error that occurred, if any
 * @param {Invoice} response The server response
 */

/**
 * @callback InvoicingService~getAccountSummary
 * @param {PayPalError} error The error that occurred, if any
 * @param {AccountSummary} response The server response
 */

/**
 * @callback InvoicingService~getTemplates
 * @param {PayPalError} error The error that occurred, if any
 * @param {InvoiceTemplatesResponse} response The server response
 */

/**
 * @callback InvoicingService~getNextInvoiceNumber
 * @param {PayPalError} error The error that occurred, if any
 * @param {string} response The server response
 */

/**
 * @callback InvoicingService~uploadFile
 * @param {PayPalError} error The error that occurred, if any
 * @param {InvoiceAttachment} response The server response
 */


exports.default = InvoicingService;
},{"./AccountSummary":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/AccountSummary.js","./Attachment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Attachment.js","./BaseClasses/BaseService":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/BaseClasses/BaseService.js","./Invoice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Invoice.js","./InvoiceListResponse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceListResponse.js","./InvoiceTemplatesResponse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceTemplatesResponse.js","./InvoicingUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingUtil.js","./Requester":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Requester.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingUtil.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _moment = require('moment');

var _moment2 = _interopRequireDefault(_moment);

var _manticore = require('manticore');

var _manticore2 = _interopRequireDefault(_manticore);

var _InvoiceEnums = require('./InvoiceEnums');

var _InvoiceEnums2 = _interopRequireDefault(_InvoiceEnums);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var InvoicingUtils = function () {
  function InvoicingUtils() {
    _classCallCheck(this, InvoicingUtils);
  }

  InvoicingUtils.parseInvoicePaymentType = function parseInvoicePaymentType(type) {
    if (type && _InvoiceEnums2.default.PaymentType[type] !== undefined) {
      return _InvoiceEnums2.default.PaymentType[type];
    }

    return _InvoiceEnums2.default.PaymentType.NONE;
  };

  InvoicingUtils.parseInvoicePaymentMethod = function parseInvoicePaymentMethod(method) {
    if (method && _InvoiceEnums2.default.PaymentMethod[method] !== undefined) {
      return _InvoiceEnums2.default.PaymentMethod[method];
    }

    return _InvoiceEnums2.default.PaymentMethod.OTHER;
  };

  InvoicingUtils.isInvoicePastDue = function isInvoicePastDue(status, paymentTerms, sendDate) {
    if (!this.hasAwaitingPaymentStatus(status)) {
      return false;
    }

    if (!paymentTerms) {
      return false;
    }

    var today = new Date();
    today.setHours(0, 0, 0, 0);

    if (paymentTerms.paymentTerms) {
      var days = paymentTerms.daysForTerm;
      var dueDate = this.parseServerDateString(sendDate);
      dueDate.date(dueDate.date() + days);
      return dueDate.valueOf() < today.valueOf();
    } else if (paymentTerms.dueDate) {
      var dueDate = this.parseServerDateString(paymentTerms.dueDate);
      return dueDate.valueOf() < today.valueOf();
    } else {
      return false;
    }
  };

  InvoicingUtils.hasAwaitingPaymentStatus = function hasAwaitingPaymentStatus(status) {
    if (status === _InvoiceEnums2.default.Status.SENT || status === _InvoiceEnums2.default.Status.PARTIALLY_PAID || status === _InvoiceEnums2.default.Status.UNPAID || status === _InvoiceEnums2.default.Status.SCHEDULED) {
      return true;
    }
    return false;
  };

  InvoicingUtils.parseServerDateString = function parseServerDateString(date) {
    if (!date) {
      return date;
    }
    // Sometimes the date string doesn't have a time. In that case, the first replace will add one.
    var _date = date.replace(/(\d{4}-\d{2}-\d{2}) (PST|PDT)/, '$1 12:59:59 $2');
    _date = _date.replace('PST', '-0800').replace('PDT', '-0700');
    return _moment2.default.parseZone(_date, 'YYYY-MM-DD hh:mm:ss Z');
  };

  InvoicingUtils.toServerDateString = function toServerDateString(date, shouldIncludeTime) {
    if (!date) {
      return date;
    }
    var _date = (0, _moment2.default)(date);
    // It's important that we render dates into PDT instead of PST.
    // If we receive a date in PDT and then render it into PST, we'll assume the incoming date is at
    // time 00:00:00, which then ends up being in the previous day PST. Going from PST->PDT, the
    // offset goes the other way, so the day remains the same.
    //
    // Also, some invoicing fields won't accept the hh:mm:ss timestamp,
    // but it's required for others.  So, we are required to make you specify whether
    // you want the time or not.
    //
    // All of this could have been avoided by choosing a non-ridiculous date format, but ¯\_(ツ)_/¯.

    if (shouldIncludeTime) {
      _date.utcOffset(-420);
      return _date.format('YYYY-MM-DD HH:mm:ss') + ' PDT';
    }

    return _date.format('YYYY-MM-DD') + ' PDT';
  };

  InvoicingUtils.getDateValue = function getDateValue(date) {
    return date && date.constructor === (0, _moment2.default)().constructor ? date.toDate() : date;
  };

  InvoicingUtils.isFileUploadSupported = function isFileUploadSupported(contentType) {
    var supportedMimeTypes = ['image/png', 'image/jpg', 'image/jpeg', 'image/gif', 'application/xml', 'application/pdf', 'image/tiff', 'image/bmp'];
    return supportedMimeTypes.indexOf(contentType) !== -1;
  };

  InvoicingUtils.emitAsync = function emitAsync(emitter, eventName) {
    for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
      args[_key - 2] = arguments[_key];
    }

    if (emitter.listenerCount && emitter.listenerCount(eventName) > 0) {
      _manticore2.default.setTimeout(function () {
        emitter.emit.apply(emitter, [eventName].concat(args));
      }, 0);
    }
  };

  return InvoicingUtils;
}();

exports.default = InvoicingUtils;
},{"./InvoiceEnums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceEnums.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Item.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _events = require('events');

var _InvoiceBigNumber = require('./InvoiceBigNumber');

var _InvoiceConstants = require('./InvoiceConstants');

var _InvoiceConstants2 = _interopRequireDefault(_InvoiceConstants);

var _Currency = require('./Currency');

var _Currency2 = _interopRequireDefault(_Currency);

var _manticoreUtil = require('manticore-util');

var _InvoicingUtil = require('./InvoicingUtil');

var _InvoicingUtil2 = _interopRequireDefault(_InvoicingUtil);

var _deepEqual = require('deep-equal');

var _deepEqual2 = _interopRequireDefault(_deepEqual);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var staticIdAllocator = 1;
var ZERO = (0, _InvoiceBigNumber.$$)(0);

// TODO refactor tax rates into a real object?

/**
 * A line item on an invoice. Can be positive, negative, or zero total/unit price.
 * See https://cms.paypal.com/cms_content/US/en_US/files/developer/PP_InvoicingAPIGuide.pdf
 * for details on field length restrictions and formats.
 * @class
 * @property {string} name The name of this item
 * @property {string} itemDescription A description for this line item
 * @property {decimal} quantity The quantity of this item - up to three decimals
 * @property {decimal} unitPrice The price of 1 unit of this item
 * @property {int} itemId A unique identifier for this item - not currently saved to the
 *  server but used for local uniqueness such that one line item per itemId.detailId pair
 *  will be stored on an invoice @readonly
 * @property {string} detailId A secondary unique identifier (e.g. for item options
 *  or sizes, or to create multiple items on the same invoice with a single detailId) @readonly
 * @property {string} taxName The name for the tax rate applied to this item, if any
 * @property {decimal} taxRate The tax rate to be applied to this item. If non-zero,
 *  the taxName must also be set.
 * @property {decimal} discountPercentage A percentage discount for this line item
 * @property {decimal} discountAmount A flat amount discount for this line item
 * @property {Date} date Date on which the item or service was provided
 * @property {string} imageURL Image url of the item. 4000 characters max.
 * @property {string} unitOfMeasure Unit of measure of the item being invoiced.
 *
 */

var InvoiceItem = function (_EventEmitter) {
  _inherits(InvoiceItem, _EventEmitter);

  /**
   * Create a new invoice item with the required information (detailId is optional).
   * @constructor
   * @private
   * @param {string} name The name of the item
   * @param {decimal} quantity The quantity of this item - up to three decimals
   * @param {decimal} unitPrice The price of 1 unit of this item
   * @param {int} itemId A unique identifier for this item - not currently saved
   *  to the server but used for local
   * uniqeuness such that one line item per itemId.detailId pair will be stored on an invoice
   * @param {string} detailId A secondary unique identifier (e.g. for item options
   *  or sizes, or to create multiple items on the same invoice with a single detailId)
   */
  function InvoiceItem(name, quantity, unitPrice, itemId, detailId) {
    _classCallCheck(this, InvoiceItem);

    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));

    _this.name = name;
    if (!quantity) {
      quantity = 0;
    }

    if (!unitPrice) {
      unitPrice = 0;
    }

    // The server can return item quantities with over 15 digits, in which case bignumber errors.
    // We don't really care about the 16th digit, so convert to a string so
    // bignumber doesn't complain.
    _this._quantity = (0, _InvoiceBigNumber.IBN)(String(quantity), _InvoiceConstants2.default.itemQuantityDecimalPrecision());
    _this.unitPrice = (0, _InvoiceBigNumber.$$)(unitPrice || 0);
    _this.itemId = itemId && itemId > 0 ? itemId : staticIdAllocator++;
    _this.detailId = detailId || null;
    return _this;
  }

  /**
   * Create a true copy / duplicate of an item. This is named duplicate instead
   * of copy to avoid code gen issues on iOS
   * @returns {InvoiceItem} the copy / duplicate of the item
   */


  InvoiceItem.prototype.duplicate = function duplicate() {
    return InvoiceItem.fromJson((0, _manticoreUtil.deepToJSON)(this.toJSON()));
  };

  /**
   * Returns a decimal for the discount amount for this item, regardless of if it's specified as an amount or percentage.
   * @returns {decimal} If there is a discount, the discount amount, either stored or calcualed from discount percentage. Else returns undefined.
   */


  InvoiceItem.prototype.discountAmountForDisplay = function discountAmountForDisplay() {
    if (this.discountAmount) {
      return this.discountAmount;
    } else if (this.discountPercentage) {
      if (this.quantity && this.unitPrice) {
        var itemPrice = this.quantity.times(this.unitPrice);
        var result = itemPrice.times(this.discountPercentage / 100);

        return result;
      } else {
        return new ZERO();
      }
    }
    return null;
  };

  /**
   * Do simple math without discounts for this line item
   * @private
   */


  InvoiceItem.prototype.subtotalForInvoice = function subtotalForInvoice(invoice) {
    var itemPrice = this.quantity.times(this.unitPrice || ZERO);
    return _Currency2.default.round(invoice.currency, itemPrice);
  };

  /**
   * Do the simple math for this line item
   * @private
   */


  InvoiceItem.prototype.totalForInvoice = function totalForInvoice(invoice) {
    var itemPrice = this.subtotalForInvoice(invoice);
    if (this.discountPercentage) {
      var discount = _Currency2.default.round(invoice.currency, itemPrice.times(this.discountPercentage / 100));
      itemPrice = itemPrice.minus(discount);
    } else if (this.discountAmount) {
      itemPrice = itemPrice.minus(this.discountAmount);
    }
    return _Currency2.default.round(invoice.currency, itemPrice);
  };

  InvoiceItem.prototype._emitPriceMayHaveChanged = function _emitPriceMayHaveChanged(source) {
    _InvoicingUtil2.default.emitAsync(this, InvoiceItem.event.priceMayHaveChanged, 'item.' + source);
  };

  /**
   * Read the properties of this object from json, transforming to numbers where appropriate
   * @param json
   * @private
   */
  InvoiceItem.fromJson = function fromJson(json) {
    /* jshint maxcomplexity: false */
    var item = new InvoiceItem(json.name, json.quantity, json.unit_price.value, json.itemId || staticIdAllocator++, json.detailId);
    if (json.description) {
      item.itemDescription = json.description;
    }
    if (json.unit_price) {
      item.unitPrice = json.unit_price.value;
    }
    if (json.tax) {
      item.taxName = json.tax.name;
      item.taxRate = (0, _InvoiceBigNumber.IBN)(json.tax.percent, _InvoiceConstants2.default.taxRateDecimalPrecision());
    }
    if (json.discount) {
      if (json.discount.amount) {
        item.discountAmount = (0, _InvoiceBigNumber.$$)(json.discount.amount.value);
      }
      if (json.discount.percent) {
        item.discountPercentage = (0, _InvoiceBigNumber.IBN)(json.discount.percent, _InvoiceConstants2.default.discountPercentageDecimalPrecision());
      }
    }
    if (json.date) {
      item.date = _InvoicingUtil2.default.parseServerDateString(json.date);
    }

    item.imageURL = json.image_url;
    item.unitOfMeasure = json.unit_of_measure;

    return item;
  };

  InvoiceItem.prototype.toJSON = function toJSON(currency) {
    var json = {
      name: this.name,
      description: this.itemDescription,
      quantity: this.quantity.toNumber(),
      image_url: this.imageURL,
      unit_of_measure: this.unitOfMeasure
    };
    if (this.date) {
      json.date = _InvoicingUtil2.default.toServerDateString(this.date, false);
    }
    json.unit_price = {
      value: _Currency2.default.serverRound(currency, this.unitPrice),
      currency: currency
    };
    var tempDiscount = {};
    if (this.discountPercentage > 0) {
      tempDiscount.percent = this.discountPercentage;
    } else if (this.discountAmount > 0) {
      tempDiscount.amount = {
        value: _Currency2.default.serverRound(currency, this.discountAmount),
        currency: currency
      };
    }
    if (tempDiscount.amount || tempDiscount.percent) {
      json.discount = tempDiscount;
    }

    if (this.taxRate && this.taxName) {
      json.tax = {
        percent: this.taxRate,
        name: this.taxName
      };
    }
    return json;
  };

  /**
   * check if an item is equal to this
   * @param {InvoiceItem} item to which this one will be compared
   * @returns {bool} are they equal
   */


  InvoiceItem.prototype.isEqualToItem = function isEqualToItem(item) {
    return (0, _deepEqual2.default)((0, _manticoreUtil.deepToJSON)(this), (0, _manticoreUtil.deepToJSON)(item));
  };

  _createClass(InvoiceItem, [{
    key: 'quantity',
    get: function get() {
      return this._quantity;
    },
    set: function set(v) {
      this._quantity = (0, _InvoiceBigNumber.IBN)(v, _InvoiceConstants2.default.itemQuantityDecimalPrecision());
      this._emitPriceMayHaveChanged('quantity');
    }
  }, {
    key: 'taxRate',
    get: function get() {
      return this._taxRate;
    },
    set: function set(v) {
      this._taxRate = (0, _InvoiceBigNumber.IBN)(v, _InvoiceConstants2.default.taxRateDecimalPrecision());
      this._emitPriceMayHaveChanged('taxRate');
    }
  }, {
    key: 'discountAmount',
    get: function get() {
      return this._discountAmount;
    },
    set: function set(v) {
      this._discountAmount = (0, _InvoiceBigNumber.$$)(v);
      this._emitPriceMayHaveChanged('discountAmount');
    }
  }, {
    key: 'discountPercentage',
    get: function get() {
      return this._discountPercentage;
    },
    set: function set(v) {
      this._discountPercentage = (0, _InvoiceBigNumber.IBN)(v, _InvoiceConstants2.default.discountPercentageDecimalPrecision());
      this._emitPriceMayHaveChanged('discountPercentage');
    }
  }, {
    key: 'unitPrice',
    get: function get() {
      return this._unitPrice;
    },
    set: function set(v) {
      this._unitPrice = (0, _InvoiceBigNumber.$$)(v);
      this._emitPriceMayHaveChanged('unitPrice');
    }
  }, {
    key: 'date',
    set: function set(date) {
      this._date = date;
    },
    get: function get() {
      return _InvoicingUtil2.default.getDateValue(this._date);
    }
  }]);

  return InvoiceItem;
}(_events.EventEmitter);

exports.default = InvoiceItem;


InvoiceItem.event = {
  priceMayHaveChanged: 'PriceMayHaveChanged'
};
},{"./Currency":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Currency.js","./InvoiceBigNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceBigNumber.js","./InvoiceConstants":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceConstants.js","./InvoicingUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingUtil.js","deep-equal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/deep-equal/index.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/MerchantInfo.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _Address = require('./Address');

var _Address2 = _interopRequireDefault(_Address);

var _manticoreLog = require('manticore-log');

var _manticoreLog2 = _interopRequireDefault(_manticoreLog);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Log = (0, _manticoreLog2.default)('invoicing');

/**
 * Container for information about the merchant requesting payment on an invoice
 * @class
 * @property {string} email The email address of the
 *  merchant @required @length(1,260) @format(email)
 * @property {string} firstName The first name of the merchant @length(,30)
 * @property {string} lastName The last name of the merchant @length(,30)
 * @property {InvoiceAddress} address The address of the merchant
 * @property {string} businessName The business name of the merchant
 * @property {string} phone The phone number of the merchant
 * @property {string} fax The fax number of the merchant
 * @property {string} website The URL of the merchant website @format{url}
 * @property {string} taxId The tax identifier for the merchant
 * @property {string} additionalInfoLabel Option to provide a label to the
 *  additional_info field. 40 characters max.
 * @property {string} additionalInfo Option to display additional information
 *  such as business hours. 40 characters max.
 */

var InvoiceMerchantInfo = function () {
  function InvoiceMerchantInfo() {
    _classCallCheck(this, InvoiceMerchantInfo);

    this.address = new _Address2.default();
    this.phoneDictionary = {};
  }

  InvoiceMerchantInfo.prototype.readFromJson = function readFromJson(json) {
    if (json) {
      this.address.readFromJson(json.address);
      if (json.address) {
        this.address = new _Address2.default();
        this.address.readFromJson(json.address);
      }
      this.email = json.email;
      this.phoneDictionary = json.phone || {};
      this.fax = json.fax;
      this.website = json.website;
      this.firstName = json.first_name;
      this.lastName = json.last_name;
      this.businessName = json.business_name;
      this.taxId = json.tax_id;
      this.additionalInfo = json.additional_info;
      this.additionalInfoLabel = json.additional_info_label;
    }
  };

  InvoiceMerchantInfo.prototype.toJSON = function toJSON() {
    var r = {};
    if (this.phoneDictionary.national_number) {
      r.phone = this.phoneDictionary;
      if (!r.phone.country_code) {
        r.phone.country_code = " ";
      }
    }
    r.email = this.email;
    r.website = this.website;
    r.address = this.address;
    r.first_name = this.firstName;
    r.last_name = this.lastName;
    r.business_name = this.businessName;
    r.tax_id = this.taxId;
    r.additional_info = this.additionalInfo;
    r.additional_info_label = this.additionalInfoLabel;
    return r;
  };

  _createClass(InvoiceMerchantInfo, [{
    key: 'phone',
    get: function get() {
      return this.phoneDictionary.national_number;
    },
    set: function set(phone) {
      this.phoneDictionary.national_number = phone;
    }
  }]);

  return InvoiceMerchantInfo;
}();

exports.default = InvoiceMerchantInfo;
},{"./Address":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Address.js","manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-log/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Notification.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * An Invoice notification
 * @class
 * @property {string} subject Subject of the notification
 * @property {string} note Note to the payer
 * @property {bool} shouldSendToMerchant A flag indicating whether a copy of the
 *  email has to be sent to the merchant
 * @property {bool} shouldSendToPayer A flag indicating whether a copy of the email
 *  has to be sent to the payer
 * @property {string} ccEmails If the invoice has CCs associated with it, this field
 *  can be used to specify only certain set of CC emails for which notification is sent.
 *
 */
var InvoiceNotification = function () {
  function InvoiceNotification(subject, note, shouldSendToMerchant, ccEmails, shouldSendToPayer) {
    _classCallCheck(this, InvoiceNotification);

    this.subject = subject;
    this.note = note;
    this.shouldSendToMerchant = shouldSendToMerchant;
    this.shouldSendToPayer = shouldSendToPayer;
    this.ccEmails = ccEmails;
  }

  InvoiceNotification.prototype.toJSON = function toJSON() {
    var json = {};
    json.subject = this.subject;
    json.note = this.note;
    json.send_to_merchant = this.shouldSendToMerchant;
    json.send_to_payer = this.shouldSendToPayer;
    json.cc_emails = this.ccEmails;
    return json;
  };

  return InvoiceNotification;
}();

exports.default = InvoiceNotification;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Payment.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _assert = require('assert');

var _assert2 = _interopRequireDefault(_assert);

var _moment = require('moment');

var _moment2 = _interopRequireDefault(_moment);

var _InvoiceEnums = require('./InvoiceEnums');

var _InvoiceEnums2 = _interopRequireDefault(_InvoiceEnums);

var _InvoicingUtil = require('./InvoicingUtil');

var _InvoicingUtil2 = _interopRequireDefault(_InvoicingUtil);

var _InvoiceBigNumber = require('./InvoiceBigNumber');

var _Currency = require('./Currency');

var _Currency2 = _interopRequireDefault(_Currency);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Container for information about the payment on an invoice
 * @class
 * @property {Invoice.PaymentType} type PayPal payment detail indicating whether
 *  payment was made in an invoicing flow via PayPal or externally. @readonly
 * @property {string} transactionID PayPal payment transaction id. Mandatory
 *  field in case the type value is PAYPAL.
 * @property {string} transactionType type of the transaction @readonly
 * @property {Date} date date when the invoice was paid
 * @property {string} formattedDate date, formatted in MMM, D YYYY format
 * @property {Invoice.PaymentMethod} method payment mode or method this is mandatory
 * @property {string} note optional note associated with the payment
 * @property {decimal} amount this is an amount object on the server which
 *  has a string for currency, and value
 * @property {string} currency used with the amount
 **/
var InvoicePayment = function () {
  function InvoicePayment(paymentMethod, amount, currency) {
    _classCallCheck(this, InvoicePayment);

    this.type = _InvoiceEnums2.default.PaymentType.EXTERNAL;
    this.transactionId = undefined;
    this.transactionType = undefined;
    this.date = undefined;
    this.formattedDate = undefined;
    this.note = undefined;
    this.method = paymentMethod;
    this.currency = currency;
    this._amount = this._numberAsBN(amount);
    this._note = {};
    this._note.type = this.method === _InvoiceEnums2.default.PaymentMethod.DIGITAL_CARD ? 'digital_card' : undefined;
  }

  InvoicePayment.prototype._numberAsBN = function _numberAsBN(number) {
    return _Currency2.default.round(this.currency, number || 0);
  };

  InvoicePayment.prototype.isMethod = function isMethod(paymentMethod) {
    if (paymentMethod === _InvoiceEnums2.default.PaymentMethod.QRC && this.method === _InvoiceEnums2.default.PaymentMethod.PAYPAL) {
      return true;
    }
    return paymentMethod === this.method;
  };

  InvoicePayment.readFromJson = function readFromJson(json) {
    var payment = new InvoicePayment();

    if (json) {
      payment.type = _InvoicingUtil2.default.parseInvoicePaymentType(json.type);
      payment.transactionID = json.transaction_id;
      payment.transactionType = json.transaction_type;
      payment.date = _InvoicingUtil2.default.parseServerDateString(json.date);
      payment.formattedDate = payment.date ? payment.date.format('MMM D, YYYY') : undefined;
      payment.method = _InvoicingUtil2.default.parseInvoicePaymentMethod(json.method);
      payment.note = json.note;
    }

    if (json.amount) {
      payment.amount = (0, _InvoiceBigNumber.$$)(json.amount.value);
      payment.currency = json.amount.currency;
    }

    return payment;
  };

  InvoicePayment.prototype.toJSON = function toJSON() {
    var r = {};

    if (this.amount) {
      r.amount = {
        currency: this.currency,
        value: _Currency2.default.serverRound(this.currency, this.amount)
      };
    }

    r.method = _InvoiceEnums2.default.PaymentMethod.toString[this.method];
    r.date = _InvoicingUtil2.default.toServerDateString(this.date, true);
    r.formattedDate = this.formattedDate;
    r.note = JSON.stringify(this._note);

    return r;
  };

  // Assert if we know the server is going to reject this as the body of record-payment.


  InvoicePayment.prototype.validate = function validate() {
    if (!this.type) {
      (0, _assert2.default)(false, 'InvoicePaymentInfo must have a payment type.');
    }
    switch (this.type) {
      case _InvoiceEnums2.default.PaymentType.EXTERNAL:
        (0, _assert2.default)(this.method, 'InvoicePaymentInfo with payment type=EXTERNAL must have a method.');
        break;
      case _InvoiceEnums2.default.PaymentType.PAYPAL:
        (0, _assert2.default)(this.transactionId, 'InvoicePaymentInfo with payment type=PAYPAL must have a method.');
        throw new Error('The invoicing service doesn\'t currently support setting the payment type to PAYPAL :(.');
      default:
        throw new Error('Unknown payment type');
    }
  };

  _createClass(InvoicePayment, [{
    key: 'amount',
    set: function set(amount) {
      this._amount = this._numberAsBN(amount);
    },
    get: function get() {
      return this._amount;
    }
  }, {
    key: 'note',
    set: function set(noteObject) {
      if (!noteObject && !this._note) {
        return;
      }
      if (!noteObject) {
        this._note.type = undefined;
      } else if (typeof noteObject === 'string') {
        // Also used from readFromJson
        try {
          var parsedNote = JSON.parse(noteObject);
          this._note.type = parsedNote.type;
          this._note.code = parsedNote.code;
          this._note.note = parsedNote.note;
        } catch (e) {
          this._note.note = noteObject;
        }
      }

      if (this._note.type === 'digital_card') {
        this.method = _InvoiceEnums2.default.PaymentMethod.DIGITAL_CARD;
      }
    },
    get: function get() {
      if (_typeof(this._note.note) === 'object') {
        return JSON.stringify(this._note.note);
      }
      return this._note.note;
    }
  }, {
    key: 'digitalCardCode',
    set: function set(code) {
      this.method = _InvoiceEnums2.default.PaymentMethod.DIGITAL_CARD;
      this._note.type = 'digital_card';
      this._note.code = code;
    }
  }]);

  return InvoicePayment;
}();

exports.default = InvoicePayment;
},{"./Currency":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Currency.js","./InvoiceBigNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceBigNumber.js","./InvoiceEnums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceEnums.js","./InvoicingUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingUtil.js","assert":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/assert.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/PaymentTerm.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _manticoreUtil = require('manticore-util');

var _InvoicingUtil = require('./InvoicingUtil');

var _InvoicingUtil2 = _interopRequireDefault(_InvoicingUtil);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Contains information about the due date / payment terms of an invoice.
 * @class
 * @property {InvoicePaymentTerm.PaymentTerms} paymentTerms Describes when
 *  payment is expected on the invoice. Setting this to something truthy will clear dueDate.
 * @property {string} dueDate A specific date on which payment is due. Setting this
 *  to something truthy will clear paymentTerms.
 * @property {int} daysForTerm the number of days from the invoice start date
 * that this term is valid for
 **/
var InvoicePaymentTerm = function () {
  function InvoicePaymentTerm() {
    _classCallCheck(this, InvoicePaymentTerm);

    this.reset();
  }

  InvoicePaymentTerm.prototype.reset = function reset() {
    this._paymentTerms = InvoicePaymentTerm.PaymentTerms.NoPaymentTerms;
    this._dueDate = undefined;
  };

  InvoicePaymentTerm.fromJson = function fromJson(json) {
    var r = new InvoicePaymentTerm();
    if (json) {
      // Sometimes the server will send us a term_type AND a due_date. In this case, the due
      // date is just bogus, so setting the paymentTerms second here will override it.
      r.dueDate = json.due_date;
      r.paymentTerms = InvoicePaymentTerm.PaymentTerms.fromServer[json.term_type];
    } else {
      r.reset();
    }
    return r;
  };

  InvoicePaymentTerm.prototype.toJSON = function toJSON() {
    var r = {};

    if (this.dueDate) {
      r.due_date = this.dueDate;
    } else if (this.paymentTerms) {
      r.term_type = InvoicePaymentTerm.PaymentTerms.toServer[this.paymentTerms];
    }

    return r;
  };

  // There is a bug on the server where an invoice with the same invoice_date and due_date
  // will fail to validate. So, if those dates would be the same, use DUE_ON_RECEIPT instead.
  // TODO: stop this once the server is fixed.


  InvoicePaymentTerm.prototype.toJSONHack = function toJSONHack(invoiceDateString) {
    var r = this.toJSON();
    if (r.due_date !== undefined && r.due_date === invoiceDateString) {
      r.due_date = undefined;
      var dor = InvoicePaymentTerm.PaymentTerms.DueOnReceipt;
      r.term_type = InvoicePaymentTerm.PaymentTerms.toServer[dor];
    }

    return r;
  };

  _createClass(InvoicePaymentTerm, [{
    key: 'paymentTerms',
    set: function set(t) {
      if (t || t === InvoicePaymentTerm.PaymentTerms.NoPaymentTerms) {
        this.reset();
      }
      this._paymentTerms = t;
    },
    get: function get() {
      return this._paymentTerms;
    }
  }, {
    key: 'dueDate',
    set: function set(d) {
      if (d) {
        this.reset();
      }
      this._dueDate = d;
    },
    get: function get() {
      return this._dueDate;
    }
  }, {
    key: 'daysForTerm',
    get: function get() {
      switch (this._paymentTerms) {
        case (InvoicePaymentTerm.PaymentTerms.NoPaymentTerms, InvoicePaymentTerm.PaymentTerms.DueOnReceipt):
          return 0;
        case InvoicePaymentTerm.PaymentTerms.Net10:
          return 10;
        case InvoicePaymentTerm.PaymentTerms.Net15:
          return 15;
        case InvoicePaymentTerm.PaymentTerms.Net30:
          return 30;
        case InvoicePaymentTerm.PaymentTerms.Net45:
          return 45;
        case InvoicePaymentTerm.PaymentTerms.Net60:
          return 60;
        case InvoicePaymentTerm.PaymentTerms.Net90:
          return 90;
      }
      return 0;
    }
  }]);

  return InvoicePaymentTerm;
}();

/**
 * A payment term describes when payment is expected in relation to the date it is sent
 * @enum {int}
 */


exports.default = InvoicePaymentTerm;
InvoicePaymentTerm.PaymentTerms = {
  /**
   * The due date does not come from payment terms
   */
  NoPaymentTerms: 0,
  /**
   * The invoice is due immediately upon receipt of the invoice
   */
  DueOnReceipt: 1,
  /**
   * The payment is due 10 days after receipt of the invoice
   */
  Net10: 2,
  /**
   * The payment is due 15 days after receipt of the invoice
   */
  Net15: 3,
  /**
   * The payment is due 30 days after receipt of the invoice
   */
  Net30: 4,
  /**
   * The payment is due 45 days after receipt of the invoice
   */
  Net45: 5,
  /**
   * The payment is due 60 days after receipt of the invoice
   */
  Net60: 6,
  /**
   * The payment is due 90 days after receipt of the invoice
   */
  Net90: 7
};

InvoicePaymentTerm.PaymentTerms.fromServer = {
  DUE_ON_RECEIPT: InvoicePaymentTerm.PaymentTerms.DueOnReceipt,
  NET_10: InvoicePaymentTerm.PaymentTerms.Net10,
  NET_15: InvoicePaymentTerm.PaymentTerms.Net15,
  NET_30: InvoicePaymentTerm.PaymentTerms.Net30,
  NET_45: InvoicePaymentTerm.PaymentTerms.Net45,
  NET_60: InvoicePaymentTerm.PaymentTerms.Net60,
  NET_90: InvoicePaymentTerm.PaymentTerms.Net90
};

InvoicePaymentTerm.PaymentTerms.toServer = (0, _manticoreUtil.reverseKeysAndValues)(InvoicePaymentTerm.PaymentTerms.fromServer);
},{"./InvoicingUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingUtil.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Refund.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _InvoiceBigNumber = require('./InvoiceBigNumber');

var _InvoiceEnums = require('./InvoiceEnums');

var _InvoiceEnums2 = _interopRequireDefault(_InvoiceEnums);

var _InvoicingUtil = require('./InvoicingUtil');

var _InvoicingUtil2 = _interopRequireDefault(_InvoicingUtil);

var _Currency = require('./Currency');

var _Currency2 = _interopRequireDefault(_Currency);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Container for information about a refund on an invoice
 * @class
 * @property {string} type PayPal refund type indicating whether refund was
 *  done in invoicing flow via PayPal or externally. @readonly
 * @property {Date} date date when the invoice was paid
 * @property {string} note optional note associated with the payment
 * @property {decimal} amount this is an amount object on the server which
 *  has a string for currency, and value
 * @property {string} currency used with the amount
 * @property {string} transactionID PayPal refund transaction id. Mandatory
 *  field in case the type value is PAYPAL. @readonly
 **/
var InvoiceRefund = function () {
  function InvoiceRefund(paymentMethod, amount, currency) {
    _classCallCheck(this, InvoiceRefund);

    // Default payment type to EXTERNAL since it's the only one the server actually
    // supports right now.
    this.type = _InvoiceEnums2.default.PaymentType.EXTERNAL;
    this.method = paymentMethod;
    this.date = undefined;
    this.note = undefined;
    this.currency = currency;
    this._amount = this._numberAsBN(amount);
    this.transactionID = undefined;
  }

  InvoiceRefund.prototype._numberAsBN = function _numberAsBN(number) {
    return _Currency2.default.round(this.currency, number || 0);
  };

  InvoiceRefund.readFromJson = function readFromJson(json) {
    var refund = new InvoiceRefund();

    if (json) {
      refund.type = json.type;
      refund.date = _InvoicingUtil2.default.parseServerDateString(json.date);
      refund.note = json.note;
      refund.transactionID = json.transaction_id;
    }
    if (json.amount) {
      refund.amount = (0, _InvoiceBigNumber.$$)(json.amount.value);
      refund.currency = json.amount.currency;
    }

    return refund;
  };

  InvoiceRefund.prototype.toJSON = function toJSON() {
    var r = {};
    if (this.amount) {
      r.amount = {};
      r.amount = {
        currency: this.currency,
        value: _Currency2.default.serverRound(this.currency, this.amount)
      };
    }

    r.date = _InvoicingUtil2.default.toServerDateString(this.date, true);
    r.note = this.note;

    return r;
  };

  _createClass(InvoiceRefund, [{
    key: 'amount',
    set: function set(amount) {
      this._amount = this._numberAsBN(amount);
    },
    get: function get() {
      return this._amount;
    }
  }]);

  return InvoiceRefund;
}();

exports.default = InvoiceRefund;
},{"./Currency":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Currency.js","./InvoiceBigNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceBigNumber.js","./InvoiceEnums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceEnums.js","./InvoicingUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingUtil.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Requester.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;
exports.request = request;

var _manticoreUtil = require('manticore-util');

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // The main purpose of this file is to avoid a circular dependency between
// Invoice and InvoicingService, since Invoice needs to make requests and
// the service needs to construct Invoices based on server responses.


var InvoicingRequester = function () {
  function InvoicingRequester() {
    _classCallCheck(this, InvoicingRequester);
  }

  InvoicingRequester.request = function request(opts, cb) {
    if (!InvoicingRequester.api) {
      throw new Error('There is no service interface. Please set the InvoicingRequester.api property.');
    }

    InvoicingRequester.api.request((0, _manticoreUtil.extend)(opts, {
      service: 'invoicing',
      format: 'json',
      headers: { 'Content-Type': 'application/json' }
    }), function (err, response) {
      // this is copied directly paypal-business-app/lib/ServiceInterface.js
      // b/c of the fantastic architecture of manticore and trying to be too smart w/errors
      if (err && !(err instanceof Error)) {
        var error = new Error(err.body.message);
        error.code = err.body.name;
        // Sometimes errors from invoicing just don't have a debugId in the body. Oh well.
        error.debugId = err.body.debug_id || err.debug_id;
        if (err.body.details) {
          error.details = err.body.details;
        }
        error.status = err.body.status;
        cb(error, response);
      } else {
        cb(err, response);
      }
    });
  };

  return InvoicingRequester;
}();

exports.default = InvoicingRequester;
function request(opts, cb) {
  return InvoicingRequester.request(opts, cb);
}
},{"manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/RoundingRules.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;
exports.default = {
  'SHP': 2,
  'EUR': 2,
  'AED': 2,
  'AFN': 0,
  'XCD': 2,
  'ALL': 0,
  'AMD': 0,
  'AOA': 2,
  'ARS': 2,
  'USD': 2,
  'AUD': 2,
  'AWG': 2,
  'AZN': 2,
  'BAM': 2,
  'BBD': 2,
  'BDT': 2,
  'XOF': 0,
  'BGN': 2,
  'BHD': 3,
  'BIF': 0,
  'BMD': 2,
  'BND': 2,
  'BOB': 2,
  'BRL': 2,
  'BSD': 2,
  'INR': 2,
  'BTN': 2,
  'NOK': 2,
  'BWP': 2,
  'BYR': 0,
  'BZD': 2,
  'CAD': 2,
  'CDF': 2,
  'XAF': 0,
  'CHF': 2,
  'NZD': 2,
  'CLP': 0,
  'CNY': 2,
  'COP': 0,
  'CRC': 0,
  'CUP': 2,
  'CUC': 2,
  'CVE': 2,
  'ANG': 2,
  'CZK': 0,
  'DJF': 0,
  'DKK': 2,
  'DOP': 2,
  'DZD': 2,
  'EGP': 2,
  'MAD': 2,
  'ERN': 2,
  'ETB': 2,
  'FJD': 2,
  'FKP': 2,
  'GBP': 2,
  'GEL': 2,
  'GHS': 2,
  'GIP': 2,
  'GMD': 2,
  'GNF': 0,
  'GTQ': 2,
  'GYD': 0,
  'HKD': 2,
  'HNL': 2,
  'HRK': 2,
  'HTG': 2,
  'HUF': 0,
  'IDR': 0,
  'ILS': 2,
  'IQD': 0,
  'IRR': 0,
  'ISK': 0,
  'JMD': 2,
  'JOD': 3,
  'JPY': 0,
  'KES': 2,
  'KGS': 2,
  'KHR': 2,
  'KMF': 0,
  'KPW': 0,
  'KRW': 0,
  'KWD': 3,
  'KYD': 2,
  'KZT': 2,
  'LAK': 0,
  'LBP': 0,
  'LKR': 2,
  'LRD': 2,
  'ZAR': 2,
  'LSL': 2,
  'LYD': 3,
  'MDL': 2,
  'MGA': 0,
  'MKD': 2,
  'MMK': 0,
  'MNT': 0,
  'MOP': 2,
  'MRO': 0,
  'MUR': 0,
  'MVR': 2,
  'MWK': 2,
  'MXN': 2,
  'MYR': 2,
  'MZN': 2,
  'NAD': 2,
  'XPF': 0,
  'NGN': 2,
  'NIO': 2,
  'NPR': 2,
  'OMR': 3,
  'PAB': 2,
  'PEN': 2,
  'PGK': 2,
  'PHP': 2,
  'PKR': 0,
  'PLN': 2,
  'PYG': 0,
  'QAR': 2,
  'RON': 2,
  'RSD': 0,
  'RUB': 2,
  'RWF': 0,
  'SAR': 2,
  'SBD': 2,
  'SCR': 2,
  'SDG': 2,
  'SEK': 2,
  'SGD': 2,
  'SLL': 0,
  'SOS': 0,
  'SRD': 2,
  'SSP': 2,
  'STD': 0,
  'SYP': 0,
  'SZL': 2,
  'THB': 2,
  'TJS': 2,
  'TMT': 2,
  'TND': 3,
  'TOP': 2,
  'TRY': 2,
  'TTD': 2,
  'TWD': 0,
  'TZS': 0,
  'UAH': 2,
  'UGX': 0,
  'UYU': 2,
  'UZS': 0,
  'VEF': 2,
  'VND': 0,
  'VUV': 0,
  'WST': 2,
  'YER': 0,
  'ZMW': 2
};
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/SearchRequest.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _InvoiceEnums = require('./InvoiceEnums');

var _InvoiceEnums2 = _interopRequireDefault(_InvoiceEnums);

var _InvoicingUtil = require('./InvoicingUtil');

var _InvoicingUtil2 = _interopRequireDefault(_InvoicingUtil);

var _InvoiceBigNumber = require('./InvoiceBigNumber');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * @class
 * @property {string} email Initial letters of the email address.
 * @property {string} recipientFirstName Initial letters of the recipient's first name.
 * @property {string} recipientLastName Initial letters of the recipient's last name.
 * @property {string} recipientBusinessName Initial letters of the recipient's business name.
 * @property {string} number The invoice number that appears on the invoice.
 * @property {decimal} lowerTotalAmount Base object for all financial value
 *  related fields (balance, payment due, etc.)
 * @property {decimal} upperTotalAmount Base object for all financial value
 *  related fields (balance, payment due, etc.)
 * @property {Date} startInvoiceDate Start invoice date.
 *  Date format yyyy-MM-dd z, as defined in ISO8601.
 * @property {Date} endInvoiceDate End invoice date.
 *  Date format yyyy-MM-dd z, as defined in ISO8601.
 * @property {Date} startDueDate Start invoice due date.
 *  Date format yyyy-MM-dd z, as defined in ISO8601.
 * @property {Date} endDueDate End invoice due date.
 *  Date format yyyy-MM-dd z, as defined in ISO8601.
 * @property {Date} startPaymentDate Start invoice payment date.
 *  Date format yyyy-MM-dd z, as defined in ISO8601.
 * @property {Date} endPaymentDate End invoice payment date.
 *  Date format yyyy-MM-dd z, as defined in ISO8601.
 * @property {Date} startCreationDate Start invoice creation date.
 *  Date format yyyy-MM-dd z, as defined in ISO8601.
 * @property {Date} endCreationDate End invoice creation date.
 *  Date format yyyy-MM-dd z, as defined in ISO8601.
 * @property {int} startIndex A zero-relative index of the merchant's list of invoices
 * @property {int} pageSize Page size of the search results.
 * @property {bool} totalCountRequired A flag indicating whether total
 *  count is required in the response.
 * @property {bool} archived A flag indicating whether search is on invoices archived by
 *  merchant. true - returns archived / false returns unarchived / null returns all.
 */
var InvoiceSearchRequest = function () {
  function InvoiceSearchRequest() {
    _classCallCheck(this, InvoiceSearchRequest);

    this.startIndex = 0;
    this.pageSize = 20;
    this.totalCountRequired = false;
    this._statuses = [];
  }

  InvoiceSearchRequest.prototype.toJSON = function toJSON() {
    var json = {};
    this.assignDatesToJSON(json);

    json.email = this.email;
    json.recipientFirstName = this.recipientFirstName;
    json.recipientLastName = this.recipientLastName;
    json.recipientBusinessName = this.recipientBusinessName;
    json.number = this.number;
    for (var _iterator = this._statuses, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
      var _ref;

      if (_isArray) {
        if (_i >= _iterator.length) break;
        _ref = _iterator[_i++];
      } else {
        _i = _iterator.next();
        if (_i.done) break;
        _ref = _i.value;
      }

      var status = _ref;

      if (!json.status) {
        json.status = [];
      }
      json.status.push(_InvoiceEnums2.default.Status.toString[status]);
    }
    json.lower_total_amount = this.lowerTotalAmount;
    json.upper_total_amount = this.upperTotalAmount;
    json.page = this.startIndex;
    json.page_size = this.pageSize;
    json.total_count_required = this.totalCountRequired;
    json.archived = this.archived;
    return json;
  };

  /**
   * Manticore doesn't support properties that are arrays of enum values, and it's complicated.
   * So instead of a property for the status array, we have this method.
   * @param {Invoice.Status} status
   */


  InvoiceSearchRequest.prototype.addStatus = function addStatus(status) {
    this._statuses.push(status);
  };

  // If you send a startXDate, the server requires you to send an endXDate.
  // The server also only accepts certain time ranges (e.g. after 1970), so
  // this method automatically sets the most-lenient available date if you're
  // missing one of a pair.


  InvoiceSearchRequest.prototype.assignDatesToJSON = function assignDatesToJSON(json) {
    var datePairs = [['startInvoiceDate', 'endInvoiceDate', 'start_invoice_date', 'end_invoice_date'], ['startDueDate', 'endDueDate', 'start_due_date', 'end_due_date'], ['startPaymentDate', 'endPaymentDate', 'start_payment_date', 'end_payment_date'], ['startCreationDate', 'endCreationDate', 'start_creation_date', 'end_creation_date']];
    for (var _iterator2 = datePairs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
      var _ref2;

      if (_isArray2) {
        if (_i2 >= _iterator2.length) break;
        _ref2 = _iterator2[_i2++];
      } else {
        _i2 = _iterator2.next();
        if (_i2.done) break;
        _ref2 = _i2.value;
      }

      var p = _ref2;

      if (this[p[0]] || this[p[1]]) {
        json[p[2]] = this[p[0]] ? _InvoicingUtil2.default.toServerDateString(this[p[0]], false) : '1970-01-01 PST';
        json[p[3]] = this[p[1]] ? _InvoicingUtil2.default.toServerDateString(this[p[1]], false) : '2100-01-01 PST';
      }
    }
  };

  _createClass(InvoiceSearchRequest, [{
    key: 'lowerTotalAmount',
    get: function get() {
      return this._lowerTotalAmount;
    },
    set: function set(val) {
      this._lowerTotalAmount = (0, _InvoiceBigNumber.$$)(val);
    }
  }, {
    key: 'upperTotalAmount',
    get: function get() {
      return this._upperTotalAmount;
    },
    set: function set(val) {
      this._upperTotalAmount = (0, _InvoiceBigNumber.$$)(val);
    }
  }]);

  return InvoiceSearchRequest;
}();

exports.default = InvoiceSearchRequest;
},{"./InvoiceBigNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceBigNumber.js","./InvoiceEnums":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoiceEnums.js","./InvoicingUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/InvoicingUtil.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/ShippingInfo.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _Address = require('./Address');

var _Address2 = _interopRequireDefault(_Address);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Container for information about the merchant requesting payment on an invoice
 * @class
 * @property {string} email The email address of the
 *  merchant @required @length(1,260) @format(email)
 * @property {string} firstName The first name of the merchant @length(,30)
 * @property {string} lastName The last name of the merchant @length(,30)
 * @property {InvoiceAddress} address The address of the merchant
 * @property {string} businessName The business name of the merchant
 */
var InvoiceShippingInfo = function () {
  function InvoiceShippingInfo() {
    _classCallCheck(this, InvoiceShippingInfo);

    this.address = new _Address2.default();
  }

  InvoiceShippingInfo.prototype.readFromJson = function readFromJson(json) {
    if (json) {
      this.address.readFromJson(json.address);
      this.email = json.email;
      this.firstName = json.first_name;
      this.lastName = json.last_name;
      this.businessName = json.business_name;
    }
  };

  InvoiceShippingInfo.prototype.toJSON = function toJSON() {
    var r = {};
    // If the address is empty, don't include it in the JSON.
    if (Object.keys(this.address).length) {
      r.address = this.address;
    }
    r.email = this.email;
    r.first_name = this.firstName;
    r.last_name = this.lastName;
    r.business_name = this.businessName;

    return r;
  };

  /**
   * Check to see if this object has any value
   * @returns {bool}
   */


  InvoiceShippingInfo.prototype.hasAnyValue = function hasAnyValue() {
    if (this.email || this.firstName || this.lastName || this.businessName || this.address.hasAnyValue()) {
      return true;
    }
    return false;
  };

  return InvoiceShippingInfo;
}();

exports.default = InvoiceShippingInfo;
},{"./Address":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Address.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Template.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _Invoice2 = require('./Invoice');

var _Invoice3 = _interopRequireDefault(_Invoice2);

var _TemplateSettings = require('./TemplateSettings');

var _TemplateSettings2 = _interopRequireDefault(_TemplateSettings);

var _PaymentTerm = require('./PaymentTerm.js');

var _PaymentTerm2 = _interopRequireDefault(_PaymentTerm);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

/**
 * Invoice template
 * @class
 * @extends Invoice
 * @property {bool} isDefault true if this is the default template
 * @property {bool} isCustom true if this is a custom template
 * @property {string} name name of the template
 * @property {string} unitOfMeasure unit of measure for the template,
 *  known values: AMOUNT, QUANTITY, HOURS
 * @property {InvoiceTemplateSettings} settings list of which fields are enabled/disabled
 */
var InvoiceTemplate = function (_Invoice) {
  _inherits(InvoiceTemplate, _Invoice);

  /**
   * Create a new blank invoice template.
   * @constructor
   * @param {string} currencyCode currency code identifying the currency for amounts on this invoice
   */
  function InvoiceTemplate(currencyCode) {
    _classCallCheck(this, InvoiceTemplate);

    return _possibleConstructorReturn(this, _Invoice.call(this, currencyCode));
  }

  InvoiceTemplate.fromJSON = function fromJSON(json) {
    if (json.template_data && json.template_data.currencyCode) {
      var t = new InvoiceTemplate(json.template_data.currencyCode);
      t.readJSON(json.template_data, true);
      t.templateID = json.template_id;
      t.isDefault = json.default;
      t.isCustom = json.custom;
      t.name = json.name;
      t.unitOfMeasure = json.unit_of_measure;
      t.settings = _TemplateSettings2.default.fromJSON(json.settings);

      if (!t.isCustom) {
        t.paymentTerms = new _PaymentTerm2.default();
        t.paymentTerms.paymentTerms = _PaymentTerm2.default.PaymentTerms.DueOnReceipt;
        t.paymentTerms.dueDate = null;
      }
      return t;
    }
    return undefined;
  };

  /**
   * Return an invoice with all the fields from the template but the invoice
   * number and paypalID of another invoice
   * @param {Invoice} invoice whose paypalID and number going to be copied
   * @returns {Invoice} the new version of the invoice
   */


  InvoiceTemplate.prototype.invoiceFromInvoice = function invoiceFromInvoice(invoice) {
    var i = this.duplicate();

    // clear all the template specific fields
    i.isDefault = undefined;
    i.isCustom = undefined;
    i.name = undefined;
    i.unitOfMeasure = undefined;
    i.settings = undefined;

    i.number = invoice.number;
    i.payPalId = invoice.payPalId;
    return i;
  };

  // Given an array of InvoiceTemplate objects, return an array of the objects sorted by name


  InvoiceTemplate.sortTemplates = function sortTemplates(templates) {
    var r = templates;
    r.sort(function (a, b) {
      return a.name.localeCompare(b.name);
    });
    return r;
  };

  return InvoiceTemplate;
}(_Invoice3.default);

exports.default = InvoiceTemplate;
},{"./Invoice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/Invoice.js","./PaymentTerm.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/PaymentTerm.js","./TemplateSettings":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/TemplateSettings.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/build/lib/TemplateSettings.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _assert = require('assert');

var _assert2 = _interopRequireDefault(_assert);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Invoice template settings
 * @class
 * @property {bool} shipping true if shipping is displayed
 * @property {bool} discount true if discount is displayed
 * @property {bool} custom true if custom is displayed
 * @property {bool} itemsDiscount true if itemsDiscount is displayed
 * @property {bool} itemsTax true if itemsTax is displayed
 * @property {bool} itemsQuantity true if itemsQuantity is displayed
 * @property {bool} itemsDescription true if itemsDescription is displayed
 * @property {bool} itemsDate true if itemsDate is displayed
 */
var InvoiceTemplateSettings = function () {
  function InvoiceTemplateSettings() {
    _classCallCheck(this, InvoiceTemplateSettings);

    this.shipping = true;
    this.discount = true;
    this.custom = true;
    this.itemsDiscount = true;
    this.itemsTax = true;
    this.itemsQuantity = true;
    this.itemsDescription = true;
    this.itemsDate = true;
  }

  InvoiceTemplateSettings.fromJSON = function fromJSON(json) {
    var s = new InvoiceTemplateSettings();

    for (var _iterator = json, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
      var _ref;

      if (_isArray) {
        if (_i >= _iterator.length) break;
        _ref = _iterator[_i++];
      } else {
        _i = _iterator.next();
        if (_i.done) break;
        _ref = _i.value;
      }

      var f = _ref;

      switch (f.field_name) {
        case 'shipping':
          s.shipping = s.isFieldShown(f);
          break;
        case 'discount':
          s.discount = s.isFieldShown(f);
          break;
        case 'custom':
          s.custom = s.isFieldShown(f);
          break;
        case 'items.discount':
          s.itemsDiscount = s.isFieldShown(f);
          break;
        case 'items.tax':
          s.itemsTax = s.isFieldShown(f);
          break;
        case 'items.quantity':
          s.itemsQuantity = s.isFieldShown(f);
          break;
        case 'items.description':
          s.itemsDescription = s.isFieldShown(f);
          break;
        case 'items.date':
          s.itemsDate = s.isFieldShown(f);
          break;
        default:
          (0, _assert2.default)('unknown field name: ' + f.field_name);
      }
    }
    return s;
  };

  InvoiceTemplateSettings.prototype.isFieldShown = function isFieldShown(field) {
    return field.display_preference.hidden !== true;
  };

  return InvoiceTemplateSettings;
}();

exports.default = InvoiceTemplateSettings;
},{"assert":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/assert.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypal-invoicing/node_modules/moment/moment.js":[function(require,module,exports){
//! moment.js
//! version : 2.15.0
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
//! license : MIT
//! momentjs.com

;(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(factory) :
    global.moment = factory()
}(this, function () { 'use strict';

    var hookCallback;

    function utils_hooks__hooks () {
        return hookCallback.apply(null, arguments);
    }

    // This is done to register the method called with moment()
    // without creating circular dependencies.
    function setHookCallback (callback) {
        hookCallback = callback;
    }

    function isArray(input) {
        return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
    }

    function isObject(input) {
        // IE8 will treat undefined and null as object if it wasn't for
        // input != null
        return input != null && Object.prototype.toString.call(input) === '[object Object]';
    }

    function isObjectEmpty(obj) {
        var k;
        for (k in obj) {
            // even if its not own property I'd still call it non-empty
            return false;
        }
        return true;
    }

    function isDate(input) {
        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
    }

    function map(arr, fn) {
        var res = [], i;
        for (i = 0; i < arr.length; ++i) {
            res.push(fn(arr[i], i));
        }
        return res;
    }

    function hasOwnProp(a, b) {
        return Object.prototype.hasOwnProperty.call(a, b);
    }

    function extend(a, b) {
        for (var i in b) {
            if (hasOwnProp(b, i)) {
                a[i] = b[i];
            }
        }

        if (hasOwnProp(b, 'toString')) {
            a.toString = b.toString;
        }

        if (hasOwnProp(b, 'valueOf')) {
            a.valueOf = b.valueOf;
        }

        return a;
    }

    function create_utc__createUTC (input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, true).utc();
    }

    function defaultParsingFlags() {
        // We need to deep clone this object.
        return {
            empty           : false,
            unusedTokens    : [],
            unusedInput     : [],
            overflow        : -2,
            charsLeftOver   : 0,
            nullInput       : false,
            invalidMonth    : null,
            invalidFormat   : false,
            userInvalidated : false,
            iso             : false,
            parsedDateParts : [],
            meridiem        : null
        };
    }

    function getParsingFlags(m) {
        if (m._pf == null) {
            m._pf = defaultParsingFlags();
        }
        return m._pf;
    }

    var some;
    if (Array.prototype.some) {
        some = Array.prototype.some;
    } else {
        some = function (fun) {
            var t = Object(this);
            var len = t.length >>> 0;

            for (var i = 0; i < len; i++) {
                if (i in t && fun.call(this, t[i], i, t)) {
                    return true;
                }
            }

            return false;
        };
    }

    function valid__isValid(m) {
        if (m._isValid == null) {
            var flags = getParsingFlags(m);
            var parsedParts = some.call(flags.parsedDateParts, function (i) {
                return i != null;
            });
            var isNowValid = !isNaN(m._d.getTime()) &&
                flags.overflow < 0 &&
                !flags.empty &&
                !flags.invalidMonth &&
                !flags.invalidWeekday &&
                !flags.nullInput &&
                !flags.invalidFormat &&
                !flags.userInvalidated &&
                (!flags.meridiem || (flags.meridiem && parsedParts));

            if (m._strict) {
                isNowValid = isNowValid &&
                    flags.charsLeftOver === 0 &&
                    flags.unusedTokens.length === 0 &&
                    flags.bigHour === undefined;
            }

            if (Object.isFrozen == null || !Object.isFrozen(m)) {
                m._isValid = isNowValid;
            }
            else {
                return isNowValid;
            }
        }
        return m._isValid;
    }

    function valid__createInvalid (flags) {
        var m = create_utc__createUTC(NaN);
        if (flags != null) {
            extend(getParsingFlags(m), flags);
        }
        else {
            getParsingFlags(m).userInvalidated = true;
        }

        return m;
    }

    function isUndefined(input) {
        return input === void 0;
    }

    // Plugins that add properties should also add the key here (null value),
    // so we can properly clone ourselves.
    var momentProperties = utils_hooks__hooks.momentProperties = [];

    function copyConfig(to, from) {
        var i, prop, val;

        if (!isUndefined(from._isAMomentObject)) {
            to._isAMomentObject = from._isAMomentObject;
        }
        if (!isUndefined(from._i)) {
            to._i = from._i;
        }
        if (!isUndefined(from._f)) {
            to._f = from._f;
        }
        if (!isUndefined(from._l)) {
            to._l = from._l;
        }
        if (!isUndefined(from._strict)) {
            to._strict = from._strict;
        }
        if (!isUndefined(from._tzm)) {
            to._tzm = from._tzm;
        }
        if (!isUndefined(from._isUTC)) {
            to._isUTC = from._isUTC;
        }
        if (!isUndefined(from._offset)) {
            to._offset = from._offset;
        }
        if (!isUndefined(from._pf)) {
            to._pf = getParsingFlags(from);
        }
        if (!isUndefined(from._locale)) {
            to._locale = from._locale;
        }

        if (momentProperties.length > 0) {
            for (i in momentProperties) {
                prop = momentProperties[i];
                val = from[prop];
                if (!isUndefined(val)) {
                    to[prop] = val;
                }
            }
        }

        return to;
    }

    var updateInProgress = false;

    // Moment prototype object
    function Moment(config) {
        copyConfig(this, config);
        this._d = new Date(config._d != null ? config._d.getTime() : NaN);
        // Prevent infinite loop in case updateOffset creates new moment
        // objects.
        if (updateInProgress === false) {
            updateInProgress = true;
            utils_hooks__hooks.updateOffset(this);
            updateInProgress = false;
        }
    }

    function isMoment (obj) {
        return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
    }

    function absFloor (number) {
        if (number < 0) {
            // -0 -> 0
            return Math.ceil(number) || 0;
        } else {
            return Math.floor(number);
        }
    }

    function toInt(argumentForCoercion) {
        var coercedNumber = +argumentForCoercion,
            value = 0;

        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
            value = absFloor(coercedNumber);
        }

        return value;
    }

    // compare two arrays, return the number of differences
    function compareArrays(array1, array2, dontConvert) {
        var len = Math.min(array1.length, array2.length),
            lengthDiff = Math.abs(array1.length - array2.length),
            diffs = 0,
            i;
        for (i = 0; i < len; i++) {
            if ((dontConvert && array1[i] !== array2[i]) ||
                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
                diffs++;
            }
        }
        return diffs + lengthDiff;
    }

    function warn(msg) {
        if (utils_hooks__hooks.suppressDeprecationWarnings === false &&
                (typeof console !==  'undefined') && console.warn) {
            console.warn('Deprecation warning: ' + msg);
        }
    }

    function deprecate(msg, fn) {
        var firstTime = true;

        return extend(function () {
            if (utils_hooks__hooks.deprecationHandler != null) {
                utils_hooks__hooks.deprecationHandler(null, msg);
            }
            if (firstTime) {
                var args = [];
                var arg;
                for (var i = 0; i < arguments.length; i++) {
                    arg = '';
                    if (typeof arguments[i] === 'object') {
                        arg += '\n[' + i + '] ';
                        for (var key in arguments[0]) {
                            arg += key + ': ' + arguments[0][key] + ', ';
                        }
                        arg = arg.slice(0, -2); // Remove trailing comma and space
                    } else {
                        arg = arguments[i];
                    }
                    args.push(arg);
                }
                warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
                firstTime = false;
            }
            return fn.apply(this, arguments);
        }, fn);
    }

    var deprecations = {};

    function deprecateSimple(name, msg) {
        if (utils_hooks__hooks.deprecationHandler != null) {
            utils_hooks__hooks.deprecationHandler(name, msg);
        }
        if (!deprecations[name]) {
            warn(msg);
            deprecations[name] = true;
        }
    }

    utils_hooks__hooks.suppressDeprecationWarnings = false;
    utils_hooks__hooks.deprecationHandler = null;

    function isFunction(input) {
        return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
    }

    function locale_set__set (config) {
        var prop, i;
        for (i in config) {
            prop = config[i];
            if (isFunction(prop)) {
                this[i] = prop;
            } else {
                this['_' + i] = prop;
            }
        }
        this._config = config;
        // Lenient ordinal parsing accepts just a number in addition to
        // number + (possibly) stuff coming from _ordinalParseLenient.
        this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source);
    }

    function mergeConfigs(parentConfig, childConfig) {
        var res = extend({}, parentConfig), prop;
        for (prop in childConfig) {
            if (hasOwnProp(childConfig, prop)) {
                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
                    res[prop] = {};
                    extend(res[prop], parentConfig[prop]);
                    extend(res[prop], childConfig[prop]);
                } else if (childConfig[prop] != null) {
                    res[prop] = childConfig[prop];
                } else {
                    delete res[prop];
                }
            }
        }
        for (prop in parentConfig) {
            if (hasOwnProp(parentConfig, prop) &&
                    !hasOwnProp(childConfig, prop) &&
                    isObject(parentConfig[prop])) {
                // make sure changes to properties don't modify parent config
                res[prop] = extend({}, res[prop]);
            }
        }
        return res;
    }

    function Locale(config) {
        if (config != null) {
            this.set(config);
        }
    }

    var keys;

    if (Object.keys) {
        keys = Object.keys;
    } else {
        keys = function (obj) {
            var i, res = [];
            for (i in obj) {
                if (hasOwnProp(obj, i)) {
                    res.push(i);
                }
            }
            return res;
        };
    }

    var defaultCalendar = {
        sameDay : '[Today at] LT',
        nextDay : '[Tomorrow at] LT',
        nextWeek : 'dddd [at] LT',
        lastDay : '[Yesterday at] LT',
        lastWeek : '[Last] dddd [at] LT',
        sameElse : 'L'
    };

    function locale_calendar__calendar (key, mom, now) {
        var output = this._calendar[key] || this._calendar['sameElse'];
        return isFunction(output) ? output.call(mom, now) : output;
    }

    var defaultLongDateFormat = {
        LTS  : 'h:mm:ss A',
        LT   : 'h:mm A',
        L    : 'MM/DD/YYYY',
        LL   : 'MMMM D, YYYY',
        LLL  : 'MMMM D, YYYY h:mm A',
        LLLL : 'dddd, MMMM D, YYYY h:mm A'
    };

    function longDateFormat (key) {
        var format = this._longDateFormat[key],
            formatUpper = this._longDateFormat[key.toUpperCase()];

        if (format || !formatUpper) {
            return format;
        }

        this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
            return val.slice(1);
        });

        return this._longDateFormat[key];
    }

    var defaultInvalidDate = 'Invalid date';

    function invalidDate () {
        return this._invalidDate;
    }

    var defaultOrdinal = '%d';
    var defaultOrdinalParse = /\d{1,2}/;

    function ordinal (number) {
        return this._ordinal.replace('%d', number);
    }

    var defaultRelativeTime = {
        future : 'in %s',
        past   : '%s ago',
        s  : 'a few seconds',
        m  : 'a minute',
        mm : '%d minutes',
        h  : 'an hour',
        hh : '%d hours',
        d  : 'a day',
        dd : '%d days',
        M  : 'a month',
        MM : '%d months',
        y  : 'a year',
        yy : '%d years'
    };

    function relative__relativeTime (number, withoutSuffix, string, isFuture) {
        var output = this._relativeTime[string];
        return (isFunction(output)) ?
            output(number, withoutSuffix, string, isFuture) :
            output.replace(/%d/i, number);
    }

    function pastFuture (diff, output) {
        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
        return isFunction(format) ? format(output) : format.replace(/%s/i, output);
    }

    var aliases = {};

    function addUnitAlias (unit, shorthand) {
        var lowerCase = unit.toLowerCase();
        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
    }

    function normalizeUnits(units) {
        return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
    }

    function normalizeObjectUnits(inputObject) {
        var normalizedInput = {},
            normalizedProp,
            prop;

        for (prop in inputObject) {
            if (hasOwnProp(inputObject, prop)) {
                normalizedProp = normalizeUnits(prop);
                if (normalizedProp) {
                    normalizedInput[normalizedProp] = inputObject[prop];
                }
            }
        }

        return normalizedInput;
    }

    var priorities = {};

    function addUnitPriority(unit, priority) {
        priorities[unit] = priority;
    }

    function getPrioritizedUnits(unitsObj) {
        var units = [];
        for (var u in unitsObj) {
            units.push({unit: u, priority: priorities[u]});
        }
        units.sort(function (a, b) {
            return a.priority - b.priority;
        });
        return units;
    }

    function makeGetSet (unit, keepTime) {
        return function (value) {
            if (value != null) {
                get_set__set(this, unit, value);
                utils_hooks__hooks.updateOffset(this, keepTime);
                return this;
            } else {
                return get_set__get(this, unit);
            }
        };
    }

    function get_set__get (mom, unit) {
        return mom.isValid() ?
            mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
    }

    function get_set__set (mom, unit, value) {
        if (mom.isValid()) {
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
        }
    }

    // MOMENTS

    function stringGet (units) {
        units = normalizeUnits(units);
        if (isFunction(this[units])) {
            return this[units]();
        }
        return this;
    }


    function stringSet (units, value) {
        if (typeof units === 'object') {
            units = normalizeObjectUnits(units);
            var prioritized = getPrioritizedUnits(units);
            for (var i = 0; i < prioritized.length; i++) {
                this[prioritized[i].unit](units[prioritized[i].unit]);
            }
        } else {
            units = normalizeUnits(units);
            if (isFunction(this[units])) {
                return this[units](value);
            }
        }
        return this;
    }

    function zeroFill(number, targetLength, forceSign) {
        var absNumber = '' + Math.abs(number),
            zerosToFill = targetLength - absNumber.length,
            sign = number >= 0;
        return (sign ? (forceSign ? '+' : '') : '-') +
            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
    }

    var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;

    var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;

    var formatFunctions = {};

    var formatTokenFunctions = {};

    // token:    'M'
    // padded:   ['MM', 2]
    // ordinal:  'Mo'
    // callback: function () { this.month() + 1 }
    function addFormatToken (token, padded, ordinal, callback) {
        var func = callback;
        if (typeof callback === 'string') {
            func = function () {
                return this[callback]();
            };
        }
        if (token) {
            formatTokenFunctions[token] = func;
        }
        if (padded) {
            formatTokenFunctions[padded[0]] = function () {
                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
            };
        }
        if (ordinal) {
            formatTokenFunctions[ordinal] = function () {
                return this.localeData().ordinal(func.apply(this, arguments), token);
            };
        }
    }

    function removeFormattingTokens(input) {
        if (input.match(/\[[\s\S]/)) {
            return input.replace(/^\[|\]$/g, '');
        }
        return input.replace(/\\/g, '');
    }

    function makeFormatFunction(format) {
        var array = format.match(formattingTokens), i, length;

        for (i = 0, length = array.length; i < length; i++) {
            if (formatTokenFunctions[array[i]]) {
                array[i] = formatTokenFunctions[array[i]];
            } else {
                array[i] = removeFormattingTokens(array[i]);
            }
        }

        return function (mom) {
            var output = '', i;
            for (i = 0; i < length; i++) {
                output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
            }
            return output;
        };
    }

    // format date using native date object
    function formatMoment(m, format) {
        if (!m.isValid()) {
            return m.localeData().invalidDate();
        }

        format = expandFormat(format, m.localeData());
        formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);

        return formatFunctions[format](m);
    }

    function expandFormat(format, locale) {
        var i = 5;

        function replaceLongDateFormatTokens(input) {
            return locale.longDateFormat(input) || input;
        }

        localFormattingTokens.lastIndex = 0;
        while (i >= 0 && localFormattingTokens.test(format)) {
            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
            localFormattingTokens.lastIndex = 0;
            i -= 1;
        }

        return format;
    }

    var match1         = /\d/;            //       0 - 9
    var match2         = /\d\d/;          //      00 - 99
    var match3         = /\d{3}/;         //     000 - 999
    var match4         = /\d{4}/;         //    0000 - 9999
    var match6         = /[+-]?\d{6}/;    // -999999 - 999999
    var match1to2      = /\d\d?/;         //       0 - 99
    var match3to4      = /\d\d\d\d?/;     //     999 - 9999
    var match5to6      = /\d\d\d\d\d\d?/; //   99999 - 999999
    var match1to3      = /\d{1,3}/;       //       0 - 999
    var match1to4      = /\d{1,4}/;       //       0 - 9999
    var match1to6      = /[+-]?\d{1,6}/;  // -999999 - 999999

    var matchUnsigned  = /\d+/;           //       0 - inf
    var matchSigned    = /[+-]?\d+/;      //    -inf - inf

    var matchOffset    = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
    var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z

    var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123

    // any word (or two) characters or numbers including two/three word month in arabic.
    // includes scottish gaelic two word and hyphenated months
    var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;


    var regexes = {};

    function addRegexToken (token, regex, strictRegex) {
        regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
            return (isStrict && strictRegex) ? strictRegex : regex;
        };
    }

    function getParseRegexForToken (token, config) {
        if (!hasOwnProp(regexes, token)) {
            return new RegExp(unescapeFormat(token));
        }

        return regexes[token](config._strict, config._locale);
    }

    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
    function unescapeFormat(s) {
        return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
            return p1 || p2 || p3 || p4;
        }));
    }

    function regexEscape(s) {
        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    }

    var tokens = {};

    function addParseToken (token, callback) {
        var i, func = callback;
        if (typeof token === 'string') {
            token = [token];
        }
        if (typeof callback === 'number') {
            func = function (input, array) {
                array[callback] = toInt(input);
            };
        }
        for (i = 0; i < token.length; i++) {
            tokens[token[i]] = func;
        }
    }

    function addWeekParseToken (token, callback) {
        addParseToken(token, function (input, array, config, token) {
            config._w = config._w || {};
            callback(input, config._w, config, token);
        });
    }

    function addTimeToArrayFromToken(token, input, config) {
        if (input != null && hasOwnProp(tokens, token)) {
            tokens[token](input, config._a, config, token);
        }
    }

    var YEAR = 0;
    var MONTH = 1;
    var DATE = 2;
    var HOUR = 3;
    var MINUTE = 4;
    var SECOND = 5;
    var MILLISECOND = 6;
    var WEEK = 7;
    var WEEKDAY = 8;

    var indexOf;

    if (Array.prototype.indexOf) {
        indexOf = Array.prototype.indexOf;
    } else {
        indexOf = function (o) {
            // I know
            var i;
            for (i = 0; i < this.length; ++i) {
                if (this[i] === o) {
                    return i;
                }
            }
            return -1;
        };
    }

    function daysInMonth(year, month) {
        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
    }

    // FORMATTING

    addFormatToken('M', ['MM', 2], 'Mo', function () {
        return this.month() + 1;
    });

    addFormatToken('MMM', 0, 0, function (format) {
        return this.localeData().monthsShort(this, format);
    });

    addFormatToken('MMMM', 0, 0, function (format) {
        return this.localeData().months(this, format);
    });

    // ALIASES

    addUnitAlias('month', 'M');

    // PRIORITY

    addUnitPriority('month', 8);

    // PARSING

    addRegexToken('M',    match1to2);
    addRegexToken('MM',   match1to2, match2);
    addRegexToken('MMM',  function (isStrict, locale) {
        return locale.monthsShortRegex(isStrict);
    });
    addRegexToken('MMMM', function (isStrict, locale) {
        return locale.monthsRegex(isStrict);
    });

    addParseToken(['M', 'MM'], function (input, array) {
        array[MONTH] = toInt(input) - 1;
    });

    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
        var month = config._locale.monthsParse(input, token, config._strict);
        // if we didn't find a month name, mark the date as invalid.
        if (month != null) {
            array[MONTH] = month;
        } else {
            getParsingFlags(config).invalidMonth = input;
        }
    });

    // LOCALES

    var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/;
    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
    function localeMonths (m, format) {
        if (!m) {
            return this._months;
        }
        return isArray(this._months) ? this._months[m.month()] :
            this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
    }

    var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
    function localeMonthsShort (m, format) {
        if (!m) {
            return this._monthsShort;
        }
        return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
            this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
    }

    function units_month__handleStrictParse(monthName, format, strict) {
        var i, ii, mom, llc = monthName.toLocaleLowerCase();
        if (!this._monthsParse) {
            // this is not used
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
            for (i = 0; i < 12; ++i) {
                mom = create_utc__createUTC([2000, i]);
                this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeMonthsParse (monthName, format, strict) {
        var i, mom, regex;

        if (this._monthsParseExact) {
            return units_month__handleStrictParse.call(this, monthName, format, strict);
        }

        if (!this._monthsParse) {
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
        }

        // TODO: add sorting
        // Sorting makes sure if one month (or abbr) is a prefix of another
        // see sorting in computeMonthsParse
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = create_utc__createUTC([2000, i]);
            if (strict && !this._longMonthsParse[i]) {
                this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
                this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
            }
            if (!strict && !this._monthsParse[i]) {
                regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
                return i;
            } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
                return i;
            } else if (!strict && this._monthsParse[i].test(monthName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function setMonth (mom, value) {
        var dayOfMonth;

        if (!mom.isValid()) {
            // No op
            return mom;
        }

        if (typeof value === 'string') {
            if (/^\d+$/.test(value)) {
                value = toInt(value);
            } else {
                value = mom.localeData().monthsParse(value);
                // TODO: Another silent failure?
                if (typeof value !== 'number') {
                    return mom;
                }
            }
        }

        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
        return mom;
    }

    function getSetMonth (value) {
        if (value != null) {
            setMonth(this, value);
            utils_hooks__hooks.updateOffset(this, true);
            return this;
        } else {
            return get_set__get(this, 'Month');
        }
    }

    function getDaysInMonth () {
        return daysInMonth(this.year(), this.month());
    }

    var defaultMonthsShortRegex = matchWord;
    function monthsShortRegex (isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsShortStrictRegex;
            } else {
                return this._monthsShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsShortRegex')) {
                this._monthsShortRegex = defaultMonthsShortRegex;
            }
            return this._monthsShortStrictRegex && isStrict ?
                this._monthsShortStrictRegex : this._monthsShortRegex;
        }
    }

    var defaultMonthsRegex = matchWord;
    function monthsRegex (isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsStrictRegex;
            } else {
                return this._monthsRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsRegex')) {
                this._monthsRegex = defaultMonthsRegex;
            }
            return this._monthsStrictRegex && isStrict ?
                this._monthsStrictRegex : this._monthsRegex;
        }
    }

    function computeMonthsParse () {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var shortPieces = [], longPieces = [], mixedPieces = [],
            i, mom;
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = create_utc__createUTC([2000, i]);
            shortPieces.push(this.monthsShort(mom, ''));
            longPieces.push(this.months(mom, ''));
            mixedPieces.push(this.months(mom, ''));
            mixedPieces.push(this.monthsShort(mom, ''));
        }
        // Sorting makes sure if one month (or abbr) is a prefix of another it
        // will match the longer piece.
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);
        for (i = 0; i < 12; i++) {
            shortPieces[i] = regexEscape(shortPieces[i]);
            longPieces[i] = regexEscape(longPieces[i]);
        }
        for (i = 0; i < 24; i++) {
            mixedPieces[i] = regexEscape(mixedPieces[i]);
        }

        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._monthsShortRegex = this._monthsRegex;
        this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
        this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
    }

    // FORMATTING

    addFormatToken('Y', 0, 0, function () {
        var y = this.year();
        return y <= 9999 ? '' + y : '+' + y;
    });

    addFormatToken(0, ['YY', 2], 0, function () {
        return this.year() % 100;
    });

    addFormatToken(0, ['YYYY',   4],       0, 'year');
    addFormatToken(0, ['YYYYY',  5],       0, 'year');
    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');

    // ALIASES

    addUnitAlias('year', 'y');

    // PRIORITIES

    addUnitPriority('year', 1);

    // PARSING

    addRegexToken('Y',      matchSigned);
    addRegexToken('YY',     match1to2, match2);
    addRegexToken('YYYY',   match1to4, match4);
    addRegexToken('YYYYY',  match1to6, match6);
    addRegexToken('YYYYYY', match1to6, match6);

    addParseToken(['YYYYY', 'YYYYYY'], YEAR);
    addParseToken('YYYY', function (input, array) {
        array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input);
    });
    addParseToken('YY', function (input, array) {
        array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input);
    });
    addParseToken('Y', function (input, array) {
        array[YEAR] = parseInt(input, 10);
    });

    // HELPERS

    function daysInYear(year) {
        return isLeapYear(year) ? 366 : 365;
    }

    function isLeapYear(year) {
        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
    }

    // HOOKS

    utils_hooks__hooks.parseTwoDigitYear = function (input) {
        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
    };

    // MOMENTS

    var getSetYear = makeGetSet('FullYear', true);

    function getIsLeapYear () {
        return isLeapYear(this.year());
    }

    function createDate (y, m, d, h, M, s, ms) {
        //can't just apply() to create a date:
        //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
        var date = new Date(y, m, d, h, M, s, ms);

        //the date constructor remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
            date.setFullYear(y);
        }
        return date;
    }

    function createUTCDate (y) {
        var date = new Date(Date.UTC.apply(null, arguments));

        //the Date.UTC function remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
            date.setUTCFullYear(y);
        }
        return date;
    }

    // start-of-first-week - start-of-year
    function firstWeekOffset(year, dow, doy) {
        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
            fwd = 7 + dow - doy,
            // first-week day local weekday -- which local weekday is fwd
            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;

        return -fwdlw + fwd - 1;
    }

    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
        var localWeekday = (7 + weekday - dow) % 7,
            weekOffset = firstWeekOffset(year, dow, doy),
            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
            resYear, resDayOfYear;

        if (dayOfYear <= 0) {
            resYear = year - 1;
            resDayOfYear = daysInYear(resYear) + dayOfYear;
        } else if (dayOfYear > daysInYear(year)) {
            resYear = year + 1;
            resDayOfYear = dayOfYear - daysInYear(year);
        } else {
            resYear = year;
            resDayOfYear = dayOfYear;
        }

        return {
            year: resYear,
            dayOfYear: resDayOfYear
        };
    }

    function weekOfYear(mom, dow, doy) {
        var weekOffset = firstWeekOffset(mom.year(), dow, doy),
            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
            resWeek, resYear;

        if (week < 1) {
            resYear = mom.year() - 1;
            resWeek = week + weeksInYear(resYear, dow, doy);
        } else if (week > weeksInYear(mom.year(), dow, doy)) {
            resWeek = week - weeksInYear(mom.year(), dow, doy);
            resYear = mom.year() + 1;
        } else {
            resYear = mom.year();
            resWeek = week;
        }

        return {
            week: resWeek,
            year: resYear
        };
    }

    function weeksInYear(year, dow, doy) {
        var weekOffset = firstWeekOffset(year, dow, doy),
            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
    }

    // FORMATTING

    addFormatToken('w', ['ww', 2], 'wo', 'week');
    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');

    // ALIASES

    addUnitAlias('week', 'w');
    addUnitAlias('isoWeek', 'W');

    // PRIORITIES

    addUnitPriority('week', 5);
    addUnitPriority('isoWeek', 5);

    // PARSING

    addRegexToken('w',  match1to2);
    addRegexToken('ww', match1to2, match2);
    addRegexToken('W',  match1to2);
    addRegexToken('WW', match1to2, match2);

    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
        week[token.substr(0, 1)] = toInt(input);
    });

    // HELPERS

    // LOCALES

    function localeWeek (mom) {
        return weekOfYear(mom, this._week.dow, this._week.doy).week;
    }

    var defaultLocaleWeek = {
        dow : 0, // Sunday is the first day of the week.
        doy : 6  // The week that contains Jan 1st is the first week of the year.
    };

    function localeFirstDayOfWeek () {
        return this._week.dow;
    }

    function localeFirstDayOfYear () {
        return this._week.doy;
    }

    // MOMENTS

    function getSetWeek (input) {
        var week = this.localeData().week(this);
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    function getSetISOWeek (input) {
        var week = weekOfYear(this, 1, 4).week;
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    // FORMATTING

    addFormatToken('d', 0, 'do', 'day');

    addFormatToken('dd', 0, 0, function (format) {
        return this.localeData().weekdaysMin(this, format);
    });

    addFormatToken('ddd', 0, 0, function (format) {
        return this.localeData().weekdaysShort(this, format);
    });

    addFormatToken('dddd', 0, 0, function (format) {
        return this.localeData().weekdays(this, format);
    });

    addFormatToken('e', 0, 0, 'weekday');
    addFormatToken('E', 0, 0, 'isoWeekday');

    // ALIASES

    addUnitAlias('day', 'd');
    addUnitAlias('weekday', 'e');
    addUnitAlias('isoWeekday', 'E');

    // PRIORITY
    addUnitPriority('day', 11);
    addUnitPriority('weekday', 11);
    addUnitPriority('isoWeekday', 11);

    // PARSING

    addRegexToken('d',    match1to2);
    addRegexToken('e',    match1to2);
    addRegexToken('E',    match1to2);
    addRegexToken('dd',   function (isStrict, locale) {
        return locale.weekdaysMinRegex(isStrict);
    });
    addRegexToken('ddd',   function (isStrict, locale) {
        return locale.weekdaysShortRegex(isStrict);
    });
    addRegexToken('dddd',   function (isStrict, locale) {
        return locale.weekdaysRegex(isStrict);
    });

    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
        var weekday = config._locale.weekdaysParse(input, token, config._strict);
        // if we didn't get a weekday name, mark the date as invalid
        if (weekday != null) {
            week.d = weekday;
        } else {
            getParsingFlags(config).invalidWeekday = input;
        }
    });

    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
        week[token] = toInt(input);
    });

    // HELPERS

    function parseWeekday(input, locale) {
        if (typeof input !== 'string') {
            return input;
        }

        if (!isNaN(input)) {
            return parseInt(input, 10);
        }

        input = locale.weekdaysParse(input);
        if (typeof input === 'number') {
            return input;
        }

        return null;
    }

    function parseIsoWeekday(input, locale) {
        if (typeof input === 'string') {
            return locale.weekdaysParse(input) % 7 || 7;
        }
        return isNaN(input) ? null : input;
    }

    // LOCALES

    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
    function localeWeekdays (m, format) {
        if (!m) {
            return this._weekdays;
        }
        return isArray(this._weekdays) ? this._weekdays[m.day()] :
            this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
    }

    var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
    function localeWeekdaysShort (m) {
        return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
    }

    var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
    function localeWeekdaysMin (m) {
        return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
    }

    function day_of_week__handleStrictParse(weekdayName, format, strict) {
        var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._minWeekdaysParse = [];

            for (i = 0; i < 7; ++i) {
                mom = create_utc__createUTC([2000, 1]).day(i);
                this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
                this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeWeekdaysParse (weekdayName, format, strict) {
        var i, mom, regex;

        if (this._weekdaysParseExact) {
            return day_of_week__handleStrictParse.call(this, weekdayName, format, strict);
        }

        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._minWeekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._fullWeekdaysParse = [];
        }

        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already

            mom = create_utc__createUTC([2000, 1]).day(i);
            if (strict && !this._fullWeekdaysParse[i]) {
                this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i');
                this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i');
                this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i');
            }
            if (!this._weekdaysParse[i]) {
                regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
                return i;
            } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
                return i;
            } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
                return i;
            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function getSetDayOfWeek (input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
        if (input != null) {
            input = parseWeekday(input, this.localeData());
            return this.add(input - day, 'd');
        } else {
            return day;
        }
    }

    function getSetLocaleDayOfWeek (input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
        return input == null ? weekday : this.add(input - weekday, 'd');
    }

    function getSetISODayOfWeek (input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }

        // behaves the same as moment#day except
        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
        // as a setter, sunday should belong to the previous week.

        if (input != null) {
            var weekday = parseIsoWeekday(input, this.localeData());
            return this.day(this.day() % 7 ? weekday : weekday - 7);
        } else {
            return this.day() || 7;
        }
    }

    var defaultWeekdaysRegex = matchWord;
    function weekdaysRegex (isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysStrictRegex;
            } else {
                return this._weekdaysRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                this._weekdaysRegex = defaultWeekdaysRegex;
            }
            return this._weekdaysStrictRegex && isStrict ?
                this._weekdaysStrictRegex : this._weekdaysRegex;
        }
    }

    var defaultWeekdaysShortRegex = matchWord;
    function weekdaysShortRegex (isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysShortStrictRegex;
            } else {
                return this._weekdaysShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysShortRegex')) {
                this._weekdaysShortRegex = defaultWeekdaysShortRegex;
            }
            return this._weekdaysShortStrictRegex && isStrict ?
                this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
        }
    }

    var defaultWeekdaysMinRegex = matchWord;
    function weekdaysMinRegex (isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysMinStrictRegex;
            } else {
                return this._weekdaysMinRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysMinRegex')) {
                this._weekdaysMinRegex = defaultWeekdaysMinRegex;
            }
            return this._weekdaysMinStrictRegex && isStrict ?
                this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
        }
    }


    function computeWeekdaysParse () {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
            i, mom, minp, shortp, longp;
        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already
            mom = create_utc__createUTC([2000, 1]).day(i);
            minp = this.weekdaysMin(mom, '');
            shortp = this.weekdaysShort(mom, '');
            longp = this.weekdays(mom, '');
            minPieces.push(minp);
            shortPieces.push(shortp);
            longPieces.push(longp);
            mixedPieces.push(minp);
            mixedPieces.push(shortp);
            mixedPieces.push(longp);
        }
        // Sorting makes sure if one weekday (or abbr) is a prefix of another it
        // will match the longer piece.
        minPieces.sort(cmpLenRev);
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);
        for (i = 0; i < 7; i++) {
            shortPieces[i] = regexEscape(shortPieces[i]);
            longPieces[i] = regexEscape(longPieces[i]);
            mixedPieces[i] = regexEscape(mixedPieces[i]);
        }

        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._weekdaysShortRegex = this._weekdaysRegex;
        this._weekdaysMinRegex = this._weekdaysRegex;

        this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
        this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
        this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
    }

    // FORMATTING

    function hFormat() {
        return this.hours() % 12 || 12;
    }

    function kFormat() {
        return this.hours() || 24;
    }

    addFormatToken('H', ['HH', 2], 0, 'hour');
    addFormatToken('h', ['hh', 2], 0, hFormat);
    addFormatToken('k', ['kk', 2], 0, kFormat);

    addFormatToken('hmm', 0, 0, function () {
        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
    });

    addFormatToken('hmmss', 0, 0, function () {
        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2);
    });

    addFormatToken('Hmm', 0, 0, function () {
        return '' + this.hours() + zeroFill(this.minutes(), 2);
    });

    addFormatToken('Hmmss', 0, 0, function () {
        return '' + this.hours() + zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2);
    });

    function meridiem (token, lowercase) {
        addFormatToken(token, 0, 0, function () {
            return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
        });
    }

    meridiem('a', true);
    meridiem('A', false);

    // ALIASES

    addUnitAlias('hour', 'h');

    // PRIORITY
    addUnitPriority('hour', 13);

    // PARSING

    function matchMeridiem (isStrict, locale) {
        return locale._meridiemParse;
    }

    addRegexToken('a',  matchMeridiem);
    addRegexToken('A',  matchMeridiem);
    addRegexToken('H',  match1to2);
    addRegexToken('h',  match1to2);
    addRegexToken('HH', match1to2, match2);
    addRegexToken('hh', match1to2, match2);

    addRegexToken('hmm', match3to4);
    addRegexToken('hmmss', match5to6);
    addRegexToken('Hmm', match3to4);
    addRegexToken('Hmmss', match5to6);

    addParseToken(['H', 'HH'], HOUR);
    addParseToken(['a', 'A'], function (input, array, config) {
        config._isPm = config._locale.isPM(input);
        config._meridiem = input;
    });
    addParseToken(['h', 'hh'], function (input, array, config) {
        array[HOUR] = toInt(input);
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmmss', function (input, array, config) {
        var pos1 = input.length - 4;
        var pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('Hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
    });
    addParseToken('Hmmss', function (input, array, config) {
        var pos1 = input.length - 4;
        var pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
    });

    // LOCALES

    function localeIsPM (input) {
        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
        // Using charAt should be more compatible.
        return ((input + '').toLowerCase().charAt(0) === 'p');
    }

    var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
    function localeMeridiem (hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'pm' : 'PM';
        } else {
            return isLower ? 'am' : 'AM';
        }
    }


    // MOMENTS

    // Setting the hour should keep the time, because the user explicitly
    // specified which hour he wants. So trying to maintain the same hour (in
    // a new timezone) makes sense. Adding/subtracting hours does not follow
    // this rule.
    var getSetHour = makeGetSet('Hours', true);

    var baseConfig = {
        calendar: defaultCalendar,
        longDateFormat: defaultLongDateFormat,
        invalidDate: defaultInvalidDate,
        ordinal: defaultOrdinal,
        ordinalParse: defaultOrdinalParse,
        relativeTime: defaultRelativeTime,

        months: defaultLocaleMonths,
        monthsShort: defaultLocaleMonthsShort,

        week: defaultLocaleWeek,

        weekdays: defaultLocaleWeekdays,
        weekdaysMin: defaultLocaleWeekdaysMin,
        weekdaysShort: defaultLocaleWeekdaysShort,

        meridiemParse: defaultLocaleMeridiemParse
    };

    // internal storage for locale config files
    var locales = {};
    var globalLocale;

    function normalizeLocale(key) {
        return key ? key.toLowerCase().replace('_', '-') : key;
    }

    // pick the locale from the array
    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
    function chooseLocale(names) {
        var i = 0, j, next, locale, split;

        while (i < names.length) {
            split = normalizeLocale(names[i]).split('-');
            j = split.length;
            next = normalizeLocale(names[i + 1]);
            next = next ? next.split('-') : null;
            while (j > 0) {
                locale = loadLocale(split.slice(0, j).join('-'));
                if (locale) {
                    return locale;
                }
                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
                    //the next array item is better than a shallower substring of this one
                    break;
                }
                j--;
            }
            i++;
        }
        return null;
    }

    function loadLocale(name) {
        var oldLocale = null;
        // TODO: Find a better way to register and load all the locales in Node
        if (!locales[name] && (typeof module !== 'undefined') &&
                module && module.require) {
            try {
                oldLocale = globalLocale._abbr;
                module.require('./locale/' + name);
                // because defineLocale currently also sets the global locale, we
                // want to undo that for lazy loaded locales
                locale_locales__getSetGlobalLocale(oldLocale);
            } catch (e) { }
        }
        return locales[name];
    }

    // This function will load locale and then set the global locale.  If
    // no arguments are passed in, it will simply return the current global
    // locale key.
    function locale_locales__getSetGlobalLocale (key, values) {
        var data;
        if (key) {
            if (isUndefined(values)) {
                data = locale_locales__getLocale(key);
            }
            else {
                data = defineLocale(key, values);
            }

            if (data) {
                // moment.duration._locale = moment._locale = data;
                globalLocale = data;
            }
        }

        return globalLocale._abbr;
    }

    function defineLocale (name, config) {
        if (config !== null) {
            var parentConfig = baseConfig;
            config.abbr = name;
            if (locales[name] != null) {
                deprecateSimple('defineLocaleOverride',
                        'use moment.updateLocale(localeName, config) to change ' +
                        'an existing locale. moment.defineLocale(localeName, ' +
                        'config) should only be used for creating a new locale ' +
                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
                parentConfig = locales[name]._config;
            } else if (config.parentLocale != null) {
                if (locales[config.parentLocale] != null) {
                    parentConfig = locales[config.parentLocale]._config;
                } else {
                    // treat as if there is no base config
                    deprecateSimple('parentLocaleUndefined',
                            'specified parentLocale is not defined yet. See http://momentjs.com/guides/#/warnings/parent-locale/');
                }
            }
            locales[name] = new Locale(mergeConfigs(parentConfig, config));

            // backwards compat for now: also set the locale
            locale_locales__getSetGlobalLocale(name);

            return locales[name];
        } else {
            // useful for testing
            delete locales[name];
            return null;
        }
    }

    function updateLocale(name, config) {
        if (config != null) {
            var locale, parentConfig = baseConfig;
            // MERGE
            if (locales[name] != null) {
                parentConfig = locales[name]._config;
            }
            config = mergeConfigs(parentConfig, config);
            locale = new Locale(config);
            locale.parentLocale = locales[name];
            locales[name] = locale;

            // backwards compat for now: also set the locale
            locale_locales__getSetGlobalLocale(name);
        } else {
            // pass null for config to unupdate, useful for tests
            if (locales[name] != null) {
                if (locales[name].parentLocale != null) {
                    locales[name] = locales[name].parentLocale;
                } else if (locales[name] != null) {
                    delete locales[name];
                }
            }
        }
        return locales[name];
    }

    // returns locale data
    function locale_locales__getLocale (key) {
        var locale;

        if (key && key._locale && key._locale._abbr) {
            key = key._locale._abbr;
        }

        if (!key) {
            return globalLocale;
        }

        if (!isArray(key)) {
            //short-circuit everything else
            locale = loadLocale(key);
            if (locale) {
                return locale;
            }
            key = [key];
        }

        return chooseLocale(key);
    }

    function locale_locales__listLocales() {
        return keys(locales);
    }

    function checkOverflow (m) {
        var overflow;
        var a = m._a;

        if (a && getParsingFlags(m).overflow === -2) {
            overflow =
                a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :
                a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
                a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
                a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :
                a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :
                a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
                -1;

            if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
                overflow = DATE;
            }
            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
                overflow = WEEK;
            }
            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
                overflow = WEEKDAY;
            }

            getParsingFlags(m).overflow = overflow;
        }

        return m;
    }

    // iso 8601 regex
    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
    var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/;
    var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/;

    var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;

    var isoDates = [
        ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
        ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
        ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
        ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
        ['YYYY-DDD', /\d{4}-\d{3}/],
        ['YYYY-MM', /\d{4}-\d\d/, false],
        ['YYYYYYMMDD', /[+-]\d{10}/],
        ['YYYYMMDD', /\d{8}/],
        // YYYYMM is NOT allowed by the standard
        ['GGGG[W]WWE', /\d{4}W\d{3}/],
        ['GGGG[W]WW', /\d{4}W\d{2}/, false],
        ['YYYYDDD', /\d{7}/]
    ];

    // iso time formats and regexes
    var isoTimes = [
        ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
        ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
        ['HH:mm:ss', /\d\d:\d\d:\d\d/],
        ['HH:mm', /\d\d:\d\d/],
        ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
        ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
        ['HHmmss', /\d\d\d\d\d\d/],
        ['HHmm', /\d\d\d\d/],
        ['HH', /\d\d/]
    ];

    var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;

    // date from iso format
    function configFromISO(config) {
        var i, l,
            string = config._i,
            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
            allowTime, dateFormat, timeFormat, tzFormat;

        if (match) {
            getParsingFlags(config).iso = true;

            for (i = 0, l = isoDates.length; i < l; i++) {
                if (isoDates[i][1].exec(match[1])) {
                    dateFormat = isoDates[i][0];
                    allowTime = isoDates[i][2] !== false;
                    break;
                }
            }
            if (dateFormat == null) {
                config._isValid = false;
                return;
            }
            if (match[3]) {
                for (i = 0, l = isoTimes.length; i < l; i++) {
                    if (isoTimes[i][1].exec(match[3])) {
                        // match[2] should be 'T' or space
                        timeFormat = (match[2] || ' ') + isoTimes[i][0];
                        break;
                    }
                }
                if (timeFormat == null) {
                    config._isValid = false;
                    return;
                }
            }
            if (!allowTime && timeFormat != null) {
                config._isValid = false;
                return;
            }
            if (match[4]) {
                if (tzRegex.exec(match[4])) {
                    tzFormat = 'Z';
                } else {
                    config._isValid = false;
                    return;
                }
            }
            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
            configFromStringAndFormat(config);
        } else {
            config._isValid = false;
        }
    }

    // date from iso format or fallback
    function configFromString(config) {
        var matched = aspNetJsonRegex.exec(config._i);

        if (matched !== null) {
            config._d = new Date(+matched[1]);
            return;
        }

        configFromISO(config);
        if (config._isValid === false) {
            delete config._isValid;
            utils_hooks__hooks.createFromInputFallback(config);
        }
    }

    utils_hooks__hooks.createFromInputFallback = deprecate(
        'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +
        'which is not reliable across all browsers and versions. Non ISO date formats are ' +
        'discouraged and will be removed in an upcoming major release. Please refer to ' +
        'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
        function (config) {
            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
        }
    );

    // Pick the first defined of two or three arguments.
    function defaults(a, b, c) {
        if (a != null) {
            return a;
        }
        if (b != null) {
            return b;
        }
        return c;
    }

    function currentDateArray(config) {
        // hooks is actually the exported moment object
        var nowValue = new Date(utils_hooks__hooks.now());
        if (config._useUTC) {
            return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
        }
        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
    }

    // convert an array to a date.
    // the array should mirror the parameters below
    // note: all values past the year are optional and will default to the lowest possible value.
    // [year, month, day , hour, minute, second, millisecond]
    function configFromArray (config) {
        var i, date, input = [], currentDate, yearToUse;

        if (config._d) {
            return;
        }

        currentDate = currentDateArray(config);

        //compute day of the year from weeks and weekdays
        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
            dayOfYearFromWeekInfo(config);
        }

        //if the day of the year is set, figure out what it is
        if (config._dayOfYear) {
            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);

            if (config._dayOfYear > daysInYear(yearToUse)) {
                getParsingFlags(config)._overflowDayOfYear = true;
            }

            date = createUTCDate(yearToUse, 0, config._dayOfYear);
            config._a[MONTH] = date.getUTCMonth();
            config._a[DATE] = date.getUTCDate();
        }

        // Default to current date.
        // * if no year, month, day of month are given, default to today
        // * if day of month is given, default month and year
        // * if month is given, default only year
        // * if year is given, don't default anything
        for (i = 0; i < 3 && config._a[i] == null; ++i) {
            config._a[i] = input[i] = currentDate[i];
        }

        // Zero out whatever was not defaulted, including time
        for (; i < 7; i++) {
            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
        }

        // Check for 24:00:00.000
        if (config._a[HOUR] === 24 &&
                config._a[MINUTE] === 0 &&
                config._a[SECOND] === 0 &&
                config._a[MILLISECOND] === 0) {
            config._nextDay = true;
            config._a[HOUR] = 0;
        }

        config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
        // Apply timezone offset from input. The actual utcOffset can be changed
        // with parseZone.
        if (config._tzm != null) {
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
        }

        if (config._nextDay) {
            config._a[HOUR] = 24;
        }
    }

    function dayOfYearFromWeekInfo(config) {
        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;

        w = config._w;
        if (w.GG != null || w.W != null || w.E != null) {
            dow = 1;
            doy = 4;

            // TODO: We need to take the current isoWeekYear, but that depends on
            // how we interpret now (local, utc, fixed offset). So create
            // a now version of current config (take local/utc/offset flags, and
            // create now).
            weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year);
            week = defaults(w.W, 1);
            weekday = defaults(w.E, 1);
            if (weekday < 1 || weekday > 7) {
                weekdayOverflow = true;
            }
        } else {
            dow = config._locale._week.dow;
            doy = config._locale._week.doy;

            weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year);
            week = defaults(w.w, 1);

            if (w.d != null) {
                // weekday -- low day numbers are considered next week
                weekday = w.d;
                if (weekday < 0 || weekday > 6) {
                    weekdayOverflow = true;
                }
            } else if (w.e != null) {
                // local weekday -- counting starts from begining of week
                weekday = w.e + dow;
                if (w.e < 0 || w.e > 6) {
                    weekdayOverflow = true;
                }
            } else {
                // default to begining of week
                weekday = dow;
            }
        }
        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
            getParsingFlags(config)._overflowWeeks = true;
        } else if (weekdayOverflow != null) {
            getParsingFlags(config)._overflowWeekday = true;
        } else {
            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
            config._a[YEAR] = temp.year;
            config._dayOfYear = temp.dayOfYear;
        }
    }

    // constant that refers to the ISO standard
    utils_hooks__hooks.ISO_8601 = function () {};

    // date from string and format string
    function configFromStringAndFormat(config) {
        // TODO: Move this to another part of the creation flow to prevent circular deps
        if (config._f === utils_hooks__hooks.ISO_8601) {
            configFromISO(config);
            return;
        }

        config._a = [];
        getParsingFlags(config).empty = true;

        // This array is used to make a Date, either with `new Date` or `Date.UTC`
        var string = '' + config._i,
            i, parsedInput, tokens, token, skipped,
            stringLength = string.length,
            totalParsedInputLength = 0;

        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];

        for (i = 0; i < tokens.length; i++) {
            token = tokens[i];
            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
            // console.log('token', token, 'parsedInput', parsedInput,
            //         'regex', getParseRegexForToken(token, config));
            if (parsedInput) {
                skipped = string.substr(0, string.indexOf(parsedInput));
                if (skipped.length > 0) {
                    getParsingFlags(config).unusedInput.push(skipped);
                }
                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
                totalParsedInputLength += parsedInput.length;
            }
            // don't parse if it's not a known token
            if (formatTokenFunctions[token]) {
                if (parsedInput) {
                    getParsingFlags(config).empty = false;
                }
                else {
                    getParsingFlags(config).unusedTokens.push(token);
                }
                addTimeToArrayFromToken(token, parsedInput, config);
            }
            else if (config._strict && !parsedInput) {
                getParsingFlags(config).unusedTokens.push(token);
            }
        }

        // add remaining unparsed input length to the string
        getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
        if (string.length > 0) {
            getParsingFlags(config).unusedInput.push(string);
        }

        // clear _12h flag if hour is <= 12
        if (config._a[HOUR] <= 12 &&
            getParsingFlags(config).bigHour === true &&
            config._a[HOUR] > 0) {
            getParsingFlags(config).bigHour = undefined;
        }

        getParsingFlags(config).parsedDateParts = config._a.slice(0);
        getParsingFlags(config).meridiem = config._meridiem;
        // handle meridiem
        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);

        configFromArray(config);
        checkOverflow(config);
    }


    function meridiemFixWrap (locale, hour, meridiem) {
        var isPm;

        if (meridiem == null) {
            // nothing to do
            return hour;
        }
        if (locale.meridiemHour != null) {
            return locale.meridiemHour(hour, meridiem);
        } else if (locale.isPM != null) {
            // Fallback
            isPm = locale.isPM(meridiem);
            if (isPm && hour < 12) {
                hour += 12;
            }
            if (!isPm && hour === 12) {
                hour = 0;
            }
            return hour;
        } else {
            // this is not supposed to happen
            return hour;
        }
    }

    // date from string and array of format strings
    function configFromStringAndArray(config) {
        var tempConfig,
            bestMoment,

            scoreToBeat,
            i,
            currentScore;

        if (config._f.length === 0) {
            getParsingFlags(config).invalidFormat = true;
            config._d = new Date(NaN);
            return;
        }

        for (i = 0; i < config._f.length; i++) {
            currentScore = 0;
            tempConfig = copyConfig({}, config);
            if (config._useUTC != null) {
                tempConfig._useUTC = config._useUTC;
            }
            tempConfig._f = config._f[i];
            configFromStringAndFormat(tempConfig);

            if (!valid__isValid(tempConfig)) {
                continue;
            }

            // if there is any input that was not parsed add a penalty for that format
            currentScore += getParsingFlags(tempConfig).charsLeftOver;

            //or tokens
            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;

            getParsingFlags(tempConfig).score = currentScore;

            if (scoreToBeat == null || currentScore < scoreToBeat) {
                scoreToBeat = currentScore;
                bestMoment = tempConfig;
            }
        }

        extend(config, bestMoment || tempConfig);
    }

    function configFromObject(config) {
        if (config._d) {
            return;
        }

        var i = normalizeObjectUnits(config._i);
        config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
            return obj && parseInt(obj, 10);
        });

        configFromArray(config);
    }

    function createFromConfig (config) {
        var res = new Moment(checkOverflow(prepareConfig(config)));
        if (res._nextDay) {
            // Adding is smart enough around DST
            res.add(1, 'd');
            res._nextDay = undefined;
        }

        return res;
    }

    function prepareConfig (config) {
        var input = config._i,
            format = config._f;

        config._locale = config._locale || locale_locales__getLocale(config._l);

        if (input === null || (format === undefined && input === '')) {
            return valid__createInvalid({nullInput: true});
        }

        if (typeof input === 'string') {
            config._i = input = config._locale.preparse(input);
        }

        if (isMoment(input)) {
            return new Moment(checkOverflow(input));
        } else if (isArray(format)) {
            configFromStringAndArray(config);
        } else if (isDate(input)) {
            config._d = input;
        } else if (format) {
            configFromStringAndFormat(config);
        }  else {
            configFromInput(config);
        }

        if (!valid__isValid(config)) {
            config._d = null;
        }

        return config;
    }

    function configFromInput(config) {
        var input = config._i;
        if (input === undefined) {
            config._d = new Date(utils_hooks__hooks.now());
        } else if (isDate(input)) {
            config._d = new Date(input.valueOf());
        } else if (typeof input === 'string') {
            configFromString(config);
        } else if (isArray(input)) {
            config._a = map(input.slice(0), function (obj) {
                return parseInt(obj, 10);
            });
            configFromArray(config);
        } else if (typeof(input) === 'object') {
            configFromObject(config);
        } else if (typeof(input) === 'number') {
            // from milliseconds
            config._d = new Date(input);
        } else {
            utils_hooks__hooks.createFromInputFallback(config);
        }
    }

    function createLocalOrUTC (input, format, locale, strict, isUTC) {
        var c = {};

        if (typeof(locale) === 'boolean') {
            strict = locale;
            locale = undefined;
        }

        if ((isObject(input) && isObjectEmpty(input)) ||
                (isArray(input) && input.length === 0)) {
            input = undefined;
        }
        // object construction must be done this way.
        // https://github.com/moment/moment/issues/1423
        c._isAMomentObject = true;
        c._useUTC = c._isUTC = isUTC;
        c._l = locale;
        c._i = input;
        c._f = format;
        c._strict = strict;

        return createFromConfig(c);
    }

    function local__createLocal (input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, false);
    }

    var prototypeMin = deprecate(
        'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
        function () {
            var other = local__createLocal.apply(null, arguments);
            if (this.isValid() && other.isValid()) {
                return other < this ? this : other;
            } else {
                return valid__createInvalid();
            }
        }
    );

    var prototypeMax = deprecate(
        'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
        function () {
            var other = local__createLocal.apply(null, arguments);
            if (this.isValid() && other.isValid()) {
                return other > this ? this : other;
            } else {
                return valid__createInvalid();
            }
        }
    );

    // Pick a moment m from moments so that m[fn](other) is true for all
    // other. This relies on the function fn to be transitive.
    //
    // moments should either be an array of moment objects or an array, whose
    // first element is an array of moment objects.
    function pickBy(fn, moments) {
        var res, i;
        if (moments.length === 1 && isArray(moments[0])) {
            moments = moments[0];
        }
        if (!moments.length) {
            return local__createLocal();
        }
        res = moments[0];
        for (i = 1; i < moments.length; ++i) {
            if (!moments[i].isValid() || moments[i][fn](res)) {
                res = moments[i];
            }
        }
        return res;
    }

    // TODO: Use [].sort instead?
    function min () {
        var args = [].slice.call(arguments, 0);

        return pickBy('isBefore', args);
    }

    function max () {
        var args = [].slice.call(arguments, 0);

        return pickBy('isAfter', args);
    }

    var now = function () {
        return Date.now ? Date.now() : +(new Date());
    };

    function Duration (duration) {
        var normalizedInput = normalizeObjectUnits(duration),
            years = normalizedInput.year || 0,
            quarters = normalizedInput.quarter || 0,
            months = normalizedInput.month || 0,
            weeks = normalizedInput.week || 0,
            days = normalizedInput.day || 0,
            hours = normalizedInput.hour || 0,
            minutes = normalizedInput.minute || 0,
            seconds = normalizedInput.second || 0,
            milliseconds = normalizedInput.millisecond || 0;

        // representation for dateAddRemove
        this._milliseconds = +milliseconds +
            seconds * 1e3 + // 1000
            minutes * 6e4 + // 1000 * 60
            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
        // Because of dateAddRemove treats 24 hours as different from a
        // day when working around DST, we need to store them separately
        this._days = +days +
            weeks * 7;
        // It is impossible translate months into days without knowing
        // which months you are are talking about, so we have to store
        // it separately.
        this._months = +months +
            quarters * 3 +
            years * 12;

        this._data = {};

        this._locale = locale_locales__getLocale();

        this._bubble();
    }

    function isDuration (obj) {
        return obj instanceof Duration;
    }

    function absRound (number) {
        if (number < 0) {
            return Math.round(-1 * number) * -1;
        } else {
            return Math.round(number);
        }
    }

    // FORMATTING

    function offset (token, separator) {
        addFormatToken(token, 0, 0, function () {
            var offset = this.utcOffset();
            var sign = '+';
            if (offset < 0) {
                offset = -offset;
                sign = '-';
            }
            return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
        });
    }

    offset('Z', ':');
    offset('ZZ', '');

    // PARSING

    addRegexToken('Z',  matchShortOffset);
    addRegexToken('ZZ', matchShortOffset);
    addParseToken(['Z', 'ZZ'], function (input, array, config) {
        config._useUTC = true;
        config._tzm = offsetFromString(matchShortOffset, input);
    });

    // HELPERS

    // timezone chunker
    // '+10:00' > ['10',  '00']
    // '-1530'  > ['-15', '30']
    var chunkOffset = /([\+\-]|\d\d)/gi;

    function offsetFromString(matcher, string) {
        var matches = ((string || '').match(matcher) || []);
        var chunk   = matches[matches.length - 1] || [];
        var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];
        var minutes = +(parts[1] * 60) + toInt(parts[2]);

        return parts[0] === '+' ? minutes : -minutes;
    }

    // Return a moment from input, that is local/utc/zone equivalent to model.
    function cloneWithOffset(input, model) {
        var res, diff;
        if (model._isUTC) {
            res = model.clone();
            diff = (isMoment(input) || isDate(input) ? input.valueOf() : local__createLocal(input).valueOf()) - res.valueOf();
            // Use low-level api, because this fn is low-level api.
            res._d.setTime(res._d.valueOf() + diff);
            utils_hooks__hooks.updateOffset(res, false);
            return res;
        } else {
            return local__createLocal(input).local();
        }
    }

    function getDateOffset (m) {
        // On Firefox.24 Date#getTimezoneOffset returns a floating point.
        // https://github.com/moment/moment/pull/1871
        return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
    }

    // HOOKS

    // This function will be called whenever a moment is mutated.
    // It is intended to keep the offset in sync with the timezone.
    utils_hooks__hooks.updateOffset = function () {};

    // MOMENTS

    // keepLocalTime = true means only change the timezone, without
    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
    // +0200, so we adjust the time as needed, to be valid.
    //
    // Keeping the time actually adds/subtracts (one hour)
    // from the actual represented time. That is why we call updateOffset
    // a second time. In case it wants us to change the offset again
    // _changeInProgress == true case, then we have to adjust, because
    // there is no such time in the given timezone.
    function getSetOffset (input, keepLocalTime) {
        var offset = this._offset || 0,
            localAdjust;
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        if (input != null) {
            if (typeof input === 'string') {
                input = offsetFromString(matchShortOffset, input);
            } else if (Math.abs(input) < 16) {
                input = input * 60;
            }
            if (!this._isUTC && keepLocalTime) {
                localAdjust = getDateOffset(this);
            }
            this._offset = input;
            this._isUTC = true;
            if (localAdjust != null) {
                this.add(localAdjust, 'm');
            }
            if (offset !== input) {
                if (!keepLocalTime || this._changeInProgress) {
                    add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false);
                } else if (!this._changeInProgress) {
                    this._changeInProgress = true;
                    utils_hooks__hooks.updateOffset(this, true);
                    this._changeInProgress = null;
                }
            }
            return this;
        } else {
            return this._isUTC ? offset : getDateOffset(this);
        }
    }

    function getSetZone (input, keepLocalTime) {
        if (input != null) {
            if (typeof input !== 'string') {
                input = -input;
            }

            this.utcOffset(input, keepLocalTime);

            return this;
        } else {
            return -this.utcOffset();
        }
    }

    function setOffsetToUTC (keepLocalTime) {
        return this.utcOffset(0, keepLocalTime);
    }

    function setOffsetToLocal (keepLocalTime) {
        if (this._isUTC) {
            this.utcOffset(0, keepLocalTime);
            this._isUTC = false;

            if (keepLocalTime) {
                this.subtract(getDateOffset(this), 'm');
            }
        }
        return this;
    }

    function setOffsetToParsedOffset () {
        if (this._tzm) {
            this.utcOffset(this._tzm);
        } else if (typeof this._i === 'string') {
            var tZone = offsetFromString(matchOffset, this._i);

            if (tZone === 0) {
                this.utcOffset(0, true);
            } else {
                this.utcOffset(offsetFromString(matchOffset, this._i));
            }
        }
        return this;
    }

    function hasAlignedHourOffset (input) {
        if (!this.isValid()) {
            return false;
        }
        input = input ? local__createLocal(input).utcOffset() : 0;

        return (this.utcOffset() - input) % 60 === 0;
    }

    function isDaylightSavingTime () {
        return (
            this.utcOffset() > this.clone().month(0).utcOffset() ||
            this.utcOffset() > this.clone().month(5).utcOffset()
        );
    }

    function isDaylightSavingTimeShifted () {
        if (!isUndefined(this._isDSTShifted)) {
            return this._isDSTShifted;
        }

        var c = {};

        copyConfig(c, this);
        c = prepareConfig(c);

        if (c._a) {
            var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a);
            this._isDSTShifted = this.isValid() &&
                compareArrays(c._a, other.toArray()) > 0;
        } else {
            this._isDSTShifted = false;
        }

        return this._isDSTShifted;
    }

    function isLocal () {
        return this.isValid() ? !this._isUTC : false;
    }

    function isUtcOffset () {
        return this.isValid() ? this._isUTC : false;
    }

    function isUtc () {
        return this.isValid() ? this._isUTC && this._offset === 0 : false;
    }

    // ASP.NET json date format regex
    var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;

    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
    // and further modified to allow for strings containing both week and day
    var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;

    function create__createDuration (input, key) {
        var duration = input,
            // matching against regexp is expensive, do it on demand
            match = null,
            sign,
            ret,
            diffRes;

        if (isDuration(input)) {
            duration = {
                ms : input._milliseconds,
                d  : input._days,
                M  : input._months
            };
        } else if (typeof input === 'number') {
            duration = {};
            if (key) {
                duration[key] = input;
            } else {
                duration.milliseconds = input;
            }
        } else if (!!(match = aspNetRegex.exec(input))) {
            sign = (match[1] === '-') ? -1 : 1;
            duration = {
                y  : 0,
                d  : toInt(match[DATE])                         * sign,
                h  : toInt(match[HOUR])                         * sign,
                m  : toInt(match[MINUTE])                       * sign,
                s  : toInt(match[SECOND])                       * sign,
                ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
            };
        } else if (!!(match = isoRegex.exec(input))) {
            sign = (match[1] === '-') ? -1 : 1;
            duration = {
                y : parseIso(match[2], sign),
                M : parseIso(match[3], sign),
                w : parseIso(match[4], sign),
                d : parseIso(match[5], sign),
                h : parseIso(match[6], sign),
                m : parseIso(match[7], sign),
                s : parseIso(match[8], sign)
            };
        } else if (duration == null) {// checks for null or undefined
            duration = {};
        } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
            diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to));

            duration = {};
            duration.ms = diffRes.milliseconds;
            duration.M = diffRes.months;
        }

        ret = new Duration(duration);

        if (isDuration(input) && hasOwnProp(input, '_locale')) {
            ret._locale = input._locale;
        }

        return ret;
    }

    create__createDuration.fn = Duration.prototype;

    function parseIso (inp, sign) {
        // We'd normally use ~~inp for this, but unfortunately it also
        // converts floats to ints.
        // inp may be undefined, so careful calling replace on it.
        var res = inp && parseFloat(inp.replace(',', '.'));
        // apply sign while we're at it
        return (isNaN(res) ? 0 : res) * sign;
    }

    function positiveMomentsDifference(base, other) {
        var res = {milliseconds: 0, months: 0};

        res.months = other.month() - base.month() +
            (other.year() - base.year()) * 12;
        if (base.clone().add(res.months, 'M').isAfter(other)) {
            --res.months;
        }

        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));

        return res;
    }

    function momentsDifference(base, other) {
        var res;
        if (!(base.isValid() && other.isValid())) {
            return {milliseconds: 0, months: 0};
        }

        other = cloneWithOffset(other, base);
        if (base.isBefore(other)) {
            res = positiveMomentsDifference(base, other);
        } else {
            res = positiveMomentsDifference(other, base);
            res.milliseconds = -res.milliseconds;
            res.months = -res.months;
        }

        return res;
    }

    // TODO: remove 'name' arg after deprecation is removed
    function createAdder(direction, name) {
        return function (val, period) {
            var dur, tmp;
            //invert the arguments, but complain about it
            if (period !== null && !isNaN(+period)) {
                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
                'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
                tmp = val; val = period; period = tmp;
            }

            val = typeof val === 'string' ? +val : val;
            dur = create__createDuration(val, period);
            add_subtract__addSubtract(this, dur, direction);
            return this;
        };
    }

    function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) {
        var milliseconds = duration._milliseconds,
            days = absRound(duration._days),
            months = absRound(duration._months);

        if (!mom.isValid()) {
            // No op
            return;
        }

        updateOffset = updateOffset == null ? true : updateOffset;

        if (milliseconds) {
            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
        }
        if (days) {
            get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding);
        }
        if (months) {
            setMonth(mom, get_set__get(mom, 'Month') + months * isAdding);
        }
        if (updateOffset) {
            utils_hooks__hooks.updateOffset(mom, days || months);
        }
    }

    var add_subtract__add      = createAdder(1, 'add');
    var add_subtract__subtract = createAdder(-1, 'subtract');

    function getCalendarFormat(myMoment, now) {
        var diff = myMoment.diff(now, 'days', true);
        return diff < -6 ? 'sameElse' :
                diff < -1 ? 'lastWeek' :
                diff < 0 ? 'lastDay' :
                diff < 1 ? 'sameDay' :
                diff < 2 ? 'nextDay' :
                diff < 7 ? 'nextWeek' : 'sameElse';
    }

    function moment_calendar__calendar (time, formats) {
        // We want to compare the start of today, vs this.
        // Getting start-of-today depends on whether we're local/utc/offset or not.
        var now = time || local__createLocal(),
            sod = cloneWithOffset(now, this).startOf('day'),
            format = utils_hooks__hooks.calendarFormat(this, sod) || 'sameElse';

        var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);

        return this.format(output || this.localeData().calendar(format, this, local__createLocal(now)));
    }

    function clone () {
        return new Moment(this);
    }

    function isAfter (input, units) {
        var localInput = isMoment(input) ? input : local__createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
        if (units === 'millisecond') {
            return this.valueOf() > localInput.valueOf();
        } else {
            return localInput.valueOf() < this.clone().startOf(units).valueOf();
        }
    }

    function isBefore (input, units) {
        var localInput = isMoment(input) ? input : local__createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
        if (units === 'millisecond') {
            return this.valueOf() < localInput.valueOf();
        } else {
            return this.clone().endOf(units).valueOf() < localInput.valueOf();
        }
    }

    function isBetween (from, to, units, inclusivity) {
        inclusivity = inclusivity || '()';
        return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&
            (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));
    }

    function isSame (input, units) {
        var localInput = isMoment(input) ? input : local__createLocal(input),
            inputMs;
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units || 'millisecond');
        if (units === 'millisecond') {
            return this.valueOf() === localInput.valueOf();
        } else {
            inputMs = localInput.valueOf();
            return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
        }
    }

    function isSameOrAfter (input, units) {
        return this.isSame(input, units) || this.isAfter(input,units);
    }

    function isSameOrBefore (input, units) {
        return this.isSame(input, units) || this.isBefore(input,units);
    }

    function diff (input, units, asFloat) {
        var that,
            zoneDelta,
            delta, output;

        if (!this.isValid()) {
            return NaN;
        }

        that = cloneWithOffset(input, this);

        if (!that.isValid()) {
            return NaN;
        }

        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;

        units = normalizeUnits(units);

        if (units === 'year' || units === 'month' || units === 'quarter') {
            output = monthDiff(this, that);
            if (units === 'quarter') {
                output = output / 3;
            } else if (units === 'year') {
                output = output / 12;
            }
        } else {
            delta = this - that;
            output = units === 'second' ? delta / 1e3 : // 1000
                units === 'minute' ? delta / 6e4 : // 1000 * 60
                units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
                units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
                units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
                delta;
        }
        return asFloat ? output : absFloor(output);
    }

    function monthDiff (a, b) {
        // difference in months
        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
            // b is in (anchor - 1 month, anchor + 1 month)
            anchor = a.clone().add(wholeMonthDiff, 'months'),
            anchor2, adjust;

        if (b - anchor < 0) {
            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor - anchor2);
        } else {
            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor2 - anchor);
        }

        //check for negative zero, return zero if negative zero
        return -(wholeMonthDiff + adjust) || 0;
    }

    utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
    utils_hooks__hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';

    function toString () {
        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
    }

    function moment_format__toISOString () {
        var m = this.clone().utc();
        if (0 < m.year() && m.year() <= 9999) {
            if (isFunction(Date.prototype.toISOString)) {
                // native implementation is ~50x faster, use it when we can
                return this.toDate().toISOString();
            } else {
                return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
            }
        } else {
            return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
        }
    }

    function format (inputString) {
        if (!inputString) {
            inputString = this.isUtc() ? utils_hooks__hooks.defaultFormatUtc : utils_hooks__hooks.defaultFormat;
        }
        var output = formatMoment(this, inputString);
        return this.localeData().postformat(output);
    }

    function from (time, withoutSuffix) {
        if (this.isValid() &&
                ((isMoment(time) && time.isValid()) ||
                 local__createLocal(time).isValid())) {
            return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function fromNow (withoutSuffix) {
        return this.from(local__createLocal(), withoutSuffix);
    }

    function to (time, withoutSuffix) {
        if (this.isValid() &&
                ((isMoment(time) && time.isValid()) ||
                 local__createLocal(time).isValid())) {
            return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function toNow (withoutSuffix) {
        return this.to(local__createLocal(), withoutSuffix);
    }

    // If passed a locale key, it will set the locale for this
    // instance.  Otherwise, it will return the locale configuration
    // variables for this instance.
    function locale (key) {
        var newLocaleData;

        if (key === undefined) {
            return this._locale._abbr;
        } else {
            newLocaleData = locale_locales__getLocale(key);
            if (newLocaleData != null) {
                this._locale = newLocaleData;
            }
            return this;
        }
    }

    var lang = deprecate(
        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
        function (key) {
            if (key === undefined) {
                return this.localeData();
            } else {
                return this.locale(key);
            }
        }
    );

    function localeData () {
        return this._locale;
    }

    function startOf (units) {
        units = normalizeUnits(units);
        // the following switch intentionally omits break keywords
        // to utilize falling through the cases.
        switch (units) {
            case 'year':
                this.month(0);
                /* falls through */
            case 'quarter':
            case 'month':
                this.date(1);
                /* falls through */
            case 'week':
            case 'isoWeek':
            case 'day':
            case 'date':
                this.hours(0);
                /* falls through */
            case 'hour':
                this.minutes(0);
                /* falls through */
            case 'minute':
                this.seconds(0);
                /* falls through */
            case 'second':
                this.milliseconds(0);
        }

        // weeks are a special case
        if (units === 'week') {
            this.weekday(0);
        }
        if (units === 'isoWeek') {
            this.isoWeekday(1);
        }

        // quarters are also special
        if (units === 'quarter') {
            this.month(Math.floor(this.month() / 3) * 3);
        }

        return this;
    }

    function endOf (units) {
        units = normalizeUnits(units);
        if (units === undefined || units === 'millisecond') {
            return this;
        }

        // 'date' is an alias for 'day', so it should be considered as such.
        if (units === 'date') {
            units = 'day';
        }

        return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
    }

    function to_type__valueOf () {
        return this._d.valueOf() - ((this._offset || 0) * 60000);
    }

    function unix () {
        return Math.floor(this.valueOf() / 1000);
    }

    function toDate () {
        return new Date(this.valueOf());
    }

    function toArray () {
        var m = this;
        return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
    }

    function toObject () {
        var m = this;
        return {
            years: m.year(),
            months: m.month(),
            date: m.date(),
            hours: m.hours(),
            minutes: m.minutes(),
            seconds: m.seconds(),
            milliseconds: m.milliseconds()
        };
    }

    function toJSON () {
        // new Date(NaN).toJSON() === null
        return this.isValid() ? this.toISOString() : null;
    }

    function moment_valid__isValid () {
        return valid__isValid(this);
    }

    function parsingFlags () {
        return extend({}, getParsingFlags(this));
    }

    function invalidAt () {
        return getParsingFlags(this).overflow;
    }

    function creationData() {
        return {
            input: this._i,
            format: this._f,
            locale: this._locale,
            isUTC: this._isUTC,
            strict: this._strict
        };
    }

    // FORMATTING

    addFormatToken(0, ['gg', 2], 0, function () {
        return this.weekYear() % 100;
    });

    addFormatToken(0, ['GG', 2], 0, function () {
        return this.isoWeekYear() % 100;
    });

    function addWeekYearFormatToken (token, getter) {
        addFormatToken(0, [token, token.length], 0, getter);
    }

    addWeekYearFormatToken('gggg',     'weekYear');
    addWeekYearFormatToken('ggggg',    'weekYear');
    addWeekYearFormatToken('GGGG',  'isoWeekYear');
    addWeekYearFormatToken('GGGGG', 'isoWeekYear');

    // ALIASES

    addUnitAlias('weekYear', 'gg');
    addUnitAlias('isoWeekYear', 'GG');

    // PRIORITY

    addUnitPriority('weekYear', 1);
    addUnitPriority('isoWeekYear', 1);


    // PARSING

    addRegexToken('G',      matchSigned);
    addRegexToken('g',      matchSigned);
    addRegexToken('GG',     match1to2, match2);
    addRegexToken('gg',     match1to2, match2);
    addRegexToken('GGGG',   match1to4, match4);
    addRegexToken('gggg',   match1to4, match4);
    addRegexToken('GGGGG',  match1to6, match6);
    addRegexToken('ggggg',  match1to6, match6);

    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
        week[token.substr(0, 2)] = toInt(input);
    });

    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
        week[token] = utils_hooks__hooks.parseTwoDigitYear(input);
    });

    // MOMENTS

    function getSetWeekYear (input) {
        return getSetWeekYearHelper.call(this,
                input,
                this.week(),
                this.weekday(),
                this.localeData()._week.dow,
                this.localeData()._week.doy);
    }

    function getSetISOWeekYear (input) {
        return getSetWeekYearHelper.call(this,
                input, this.isoWeek(), this.isoWeekday(), 1, 4);
    }

    function getISOWeeksInYear () {
        return weeksInYear(this.year(), 1, 4);
    }

    function getWeeksInYear () {
        var weekInfo = this.localeData()._week;
        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
    }

    function getSetWeekYearHelper(input, week, weekday, dow, doy) {
        var weeksTarget;
        if (input == null) {
            return weekOfYear(this, dow, doy).year;
        } else {
            weeksTarget = weeksInYear(input, dow, doy);
            if (week > weeksTarget) {
                week = weeksTarget;
            }
            return setWeekAll.call(this, input, week, weekday, dow, doy);
        }
    }

    function setWeekAll(weekYear, week, weekday, dow, doy) {
        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);

        this.year(date.getUTCFullYear());
        this.month(date.getUTCMonth());
        this.date(date.getUTCDate());
        return this;
    }

    // FORMATTING

    addFormatToken('Q', 0, 'Qo', 'quarter');

    // ALIASES

    addUnitAlias('quarter', 'Q');

    // PRIORITY

    addUnitPriority('quarter', 7);

    // PARSING

    addRegexToken('Q', match1);
    addParseToken('Q', function (input, array) {
        array[MONTH] = (toInt(input) - 1) * 3;
    });

    // MOMENTS

    function getSetQuarter (input) {
        return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
    }

    // FORMATTING

    addFormatToken('D', ['DD', 2], 'Do', 'date');

    // ALIASES

    addUnitAlias('date', 'D');

    // PRIOROITY
    addUnitPriority('date', 9);

    // PARSING

    addRegexToken('D',  match1to2);
    addRegexToken('DD', match1to2, match2);
    addRegexToken('Do', function (isStrict, locale) {
        return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;
    });

    addParseToken(['D', 'DD'], DATE);
    addParseToken('Do', function (input, array) {
        array[DATE] = toInt(input.match(match1to2)[0], 10);
    });

    // MOMENTS

    var getSetDayOfMonth = makeGetSet('Date', true);

    // FORMATTING

    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');

    // ALIASES

    addUnitAlias('dayOfYear', 'DDD');

    // PRIORITY
    addUnitPriority('dayOfYear', 4);

    // PARSING

    addRegexToken('DDD',  match1to3);
    addRegexToken('DDDD', match3);
    addParseToken(['DDD', 'DDDD'], function (input, array, config) {
        config._dayOfYear = toInt(input);
    });

    // HELPERS

    // MOMENTS

    function getSetDayOfYear (input) {
        var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
        return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
    }

    // FORMATTING

    addFormatToken('m', ['mm', 2], 0, 'minute');

    // ALIASES

    addUnitAlias('minute', 'm');

    // PRIORITY

    addUnitPriority('minute', 14);

    // PARSING

    addRegexToken('m',  match1to2);
    addRegexToken('mm', match1to2, match2);
    addParseToken(['m', 'mm'], MINUTE);

    // MOMENTS

    var getSetMinute = makeGetSet('Minutes', false);

    // FORMATTING

    addFormatToken('s', ['ss', 2], 0, 'second');

    // ALIASES

    addUnitAlias('second', 's');

    // PRIORITY

    addUnitPriority('second', 15);

    // PARSING

    addRegexToken('s',  match1to2);
    addRegexToken('ss', match1to2, match2);
    addParseToken(['s', 'ss'], SECOND);

    // MOMENTS

    var getSetSecond = makeGetSet('Seconds', false);

    // FORMATTING

    addFormatToken('S', 0, 0, function () {
        return ~~(this.millisecond() / 100);
    });

    addFormatToken(0, ['SS', 2], 0, function () {
        return ~~(this.millisecond() / 10);
    });

    addFormatToken(0, ['SSS', 3], 0, 'millisecond');
    addFormatToken(0, ['SSSS', 4], 0, function () {
        return this.millisecond() * 10;
    });
    addFormatToken(0, ['SSSSS', 5], 0, function () {
        return this.millisecond() * 100;
    });
    addFormatToken(0, ['SSSSSS', 6], 0, function () {
        return this.millisecond() * 1000;
    });
    addFormatToken(0, ['SSSSSSS', 7], 0, function () {
        return this.millisecond() * 10000;
    });
    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
        return this.millisecond() * 100000;
    });
    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
        return this.millisecond() * 1000000;
    });


    // ALIASES

    addUnitAlias('millisecond', 'ms');

    // PRIORITY

    addUnitPriority('millisecond', 16);

    // PARSING

    addRegexToken('S',    match1to3, match1);
    addRegexToken('SS',   match1to3, match2);
    addRegexToken('SSS',  match1to3, match3);

    var token;
    for (token = 'SSSS'; token.length <= 9; token += 'S') {
        addRegexToken(token, matchUnsigned);
    }

    function parseMs(input, array) {
        array[MILLISECOND] = toInt(('0.' + input) * 1000);
    }

    for (token = 'S'; token.length <= 9; token += 'S') {
        addParseToken(token, parseMs);
    }
    // MOMENTS

    var getSetMillisecond = makeGetSet('Milliseconds', false);

    // FORMATTING

    addFormatToken('z',  0, 0, 'zoneAbbr');
    addFormatToken('zz', 0, 0, 'zoneName');

    // MOMENTS

    function getZoneAbbr () {
        return this._isUTC ? 'UTC' : '';
    }

    function getZoneName () {
        return this._isUTC ? 'Coordinated Universal Time' : '';
    }

    var momentPrototype__proto = Moment.prototype;

    momentPrototype__proto.add               = add_subtract__add;
    momentPrototype__proto.calendar          = moment_calendar__calendar;
    momentPrototype__proto.clone             = clone;
    momentPrototype__proto.diff              = diff;
    momentPrototype__proto.endOf             = endOf;
    momentPrototype__proto.format            = format;
    momentPrototype__proto.from              = from;
    momentPrototype__proto.fromNow           = fromNow;
    momentPrototype__proto.to                = to;
    momentPrototype__proto.toNow             = toNow;
    momentPrototype__proto.get               = stringGet;
    momentPrototype__proto.invalidAt         = invalidAt;
    momentPrototype__proto.isAfter           = isAfter;
    momentPrototype__proto.isBefore          = isBefore;
    momentPrototype__proto.isBetween         = isBetween;
    momentPrototype__proto.isSame            = isSame;
    momentPrototype__proto.isSameOrAfter     = isSameOrAfter;
    momentPrototype__proto.isSameOrBefore    = isSameOrBefore;
    momentPrototype__proto.isValid           = moment_valid__isValid;
    momentPrototype__proto.lang              = lang;
    momentPrototype__proto.locale            = locale;
    momentPrototype__proto.localeData        = localeData;
    momentPrototype__proto.max               = prototypeMax;
    momentPrototype__proto.min               = prototypeMin;
    momentPrototype__proto.parsingFlags      = parsingFlags;
    momentPrototype__proto.set               = stringSet;
    momentPrototype__proto.startOf           = startOf;
    momentPrototype__proto.subtract          = add_subtract__subtract;
    momentPrototype__proto.toArray           = toArray;
    momentPrototype__proto.toObject          = toObject;
    momentPrototype__proto.toDate            = toDate;
    momentPrototype__proto.toISOString       = moment_format__toISOString;
    momentPrototype__proto.toJSON            = toJSON;
    momentPrototype__proto.toString          = toString;
    momentPrototype__proto.unix              = unix;
    momentPrototype__proto.valueOf           = to_type__valueOf;
    momentPrototype__proto.creationData      = creationData;

    // Year
    momentPrototype__proto.year       = getSetYear;
    momentPrototype__proto.isLeapYear = getIsLeapYear;

    // Week Year
    momentPrototype__proto.weekYear    = getSetWeekYear;
    momentPrototype__proto.isoWeekYear = getSetISOWeekYear;

    // Quarter
    momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter;

    // Month
    momentPrototype__proto.month       = getSetMonth;
    momentPrototype__proto.daysInMonth = getDaysInMonth;

    // Week
    momentPrototype__proto.week           = momentPrototype__proto.weeks        = getSetWeek;
    momentPrototype__proto.isoWeek        = momentPrototype__proto.isoWeeks     = getSetISOWeek;
    momentPrototype__proto.weeksInYear    = getWeeksInYear;
    momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear;

    // Day
    momentPrototype__proto.date       = getSetDayOfMonth;
    momentPrototype__proto.day        = momentPrototype__proto.days             = getSetDayOfWeek;
    momentPrototype__proto.weekday    = getSetLocaleDayOfWeek;
    momentPrototype__proto.isoWeekday = getSetISODayOfWeek;
    momentPrototype__proto.dayOfYear  = getSetDayOfYear;

    // Hour
    momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour;

    // Minute
    momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute;

    // Second
    momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond;

    // Millisecond
    momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond;

    // Offset
    momentPrototype__proto.utcOffset            = getSetOffset;
    momentPrototype__proto.utc                  = setOffsetToUTC;
    momentPrototype__proto.local                = setOffsetToLocal;
    momentPrototype__proto.parseZone            = setOffsetToParsedOffset;
    momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset;
    momentPrototype__proto.isDST                = isDaylightSavingTime;
    momentPrototype__proto.isLocal              = isLocal;
    momentPrototype__proto.isUtcOffset          = isUtcOffset;
    momentPrototype__proto.isUtc                = isUtc;
    momentPrototype__proto.isUTC                = isUtc;

    // Timezone
    momentPrototype__proto.zoneAbbr = getZoneAbbr;
    momentPrototype__proto.zoneName = getZoneName;

    // Deprecations
    momentPrototype__proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
    momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
    momentPrototype__proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);
    momentPrototype__proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
    momentPrototype__proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);

    var momentPrototype = momentPrototype__proto;

    function moment__createUnix (input) {
        return local__createLocal(input * 1000);
    }

    function moment__createInZone () {
        return local__createLocal.apply(null, arguments).parseZone();
    }

    function preParsePostFormat (string) {
        return string;
    }

    var prototype__proto = Locale.prototype;

    prototype__proto.calendar        = locale_calendar__calendar;
    prototype__proto.longDateFormat  = longDateFormat;
    prototype__proto.invalidDate     = invalidDate;
    prototype__proto.ordinal         = ordinal;
    prototype__proto.preparse        = preParsePostFormat;
    prototype__proto.postformat      = preParsePostFormat;
    prototype__proto.relativeTime    = relative__relativeTime;
    prototype__proto.pastFuture      = pastFuture;
    prototype__proto.set             = locale_set__set;

    // Month
    prototype__proto.months            =        localeMonths;
    prototype__proto.monthsShort       =        localeMonthsShort;
    prototype__proto.monthsParse       =        localeMonthsParse;
    prototype__proto.monthsRegex       = monthsRegex;
    prototype__proto.monthsShortRegex  = monthsShortRegex;

    // Week
    prototype__proto.week = localeWeek;
    prototype__proto.firstDayOfYear = localeFirstDayOfYear;
    prototype__proto.firstDayOfWeek = localeFirstDayOfWeek;

    // Day of Week
    prototype__proto.weekdays       =        localeWeekdays;
    prototype__proto.weekdaysMin    =        localeWeekdaysMin;
    prototype__proto.weekdaysShort  =        localeWeekdaysShort;
    prototype__proto.weekdaysParse  =        localeWeekdaysParse;

    prototype__proto.weekdaysRegex       =        weekdaysRegex;
    prototype__proto.weekdaysShortRegex  =        weekdaysShortRegex;
    prototype__proto.weekdaysMinRegex    =        weekdaysMinRegex;

    // Hours
    prototype__proto.isPM = localeIsPM;
    prototype__proto.meridiem = localeMeridiem;

    function lists__get (format, index, field, setter) {
        var locale = locale_locales__getLocale();
        var utc = create_utc__createUTC().set(setter, index);
        return locale[field](utc, format);
    }

    function listMonthsImpl (format, index, field) {
        if (typeof format === 'number') {
            index = format;
            format = undefined;
        }

        format = format || '';

        if (index != null) {
            return lists__get(format, index, field, 'month');
        }

        var i;
        var out = [];
        for (i = 0; i < 12; i++) {
            out[i] = lists__get(format, i, field, 'month');
        }
        return out;
    }

    // ()
    // (5)
    // (fmt, 5)
    // (fmt)
    // (true)
    // (true, 5)
    // (true, fmt, 5)
    // (true, fmt)
    function listWeekdaysImpl (localeSorted, format, index, field) {
        if (typeof localeSorted === 'boolean') {
            if (typeof format === 'number') {
                index = format;
                format = undefined;
            }

            format = format || '';
        } else {
            format = localeSorted;
            index = format;
            localeSorted = false;

            if (typeof format === 'number') {
                index = format;
                format = undefined;
            }

            format = format || '';
        }

        var locale = locale_locales__getLocale(),
            shift = localeSorted ? locale._week.dow : 0;

        if (index != null) {
            return lists__get(format, (index + shift) % 7, field, 'day');
        }

        var i;
        var out = [];
        for (i = 0; i < 7; i++) {
            out[i] = lists__get(format, (i + shift) % 7, field, 'day');
        }
        return out;
    }

    function lists__listMonths (format, index) {
        return listMonthsImpl(format, index, 'months');
    }

    function lists__listMonthsShort (format, index) {
        return listMonthsImpl(format, index, 'monthsShort');
    }

    function lists__listWeekdays (localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
    }

    function lists__listWeekdaysShort (localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
    }

    function lists__listWeekdaysMin (localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
    }

    locale_locales__getSetGlobalLocale('en', {
        ordinalParse: /\d{1,2}(th|st|nd|rd)/,
        ordinal : function (number) {
            var b = number % 10,
                output = (toInt(number % 100 / 10) === 1) ? 'th' :
                (b === 1) ? 'st' :
                (b === 2) ? 'nd' :
                (b === 3) ? 'rd' : 'th';
            return number + output;
        }
    });

    // Side effect imports
    utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale);
    utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale);

    var mathAbs = Math.abs;

    function duration_abs__abs () {
        var data           = this._data;

        this._milliseconds = mathAbs(this._milliseconds);
        this._days         = mathAbs(this._days);
        this._months       = mathAbs(this._months);

        data.milliseconds  = mathAbs(data.milliseconds);
        data.seconds       = mathAbs(data.seconds);
        data.minutes       = mathAbs(data.minutes);
        data.hours         = mathAbs(data.hours);
        data.months        = mathAbs(data.months);
        data.years         = mathAbs(data.years);

        return this;
    }

    function duration_add_subtract__addSubtract (duration, input, value, direction) {
        var other = create__createDuration(input, value);

        duration._milliseconds += direction * other._milliseconds;
        duration._days         += direction * other._days;
        duration._months       += direction * other._months;

        return duration._bubble();
    }

    // supports only 2.0-style add(1, 's') or add(duration)
    function duration_add_subtract__add (input, value) {
        return duration_add_subtract__addSubtract(this, input, value, 1);
    }

    // supports only 2.0-style subtract(1, 's') or subtract(duration)
    function duration_add_subtract__subtract (input, value) {
        return duration_add_subtract__addSubtract(this, input, value, -1);
    }

    function absCeil (number) {
        if (number < 0) {
            return Math.floor(number);
        } else {
            return Math.ceil(number);
        }
    }

    function bubble () {
        var milliseconds = this._milliseconds;
        var days         = this._days;
        var months       = this._months;
        var data         = this._data;
        var seconds, minutes, hours, years, monthsFromDays;

        // if we have a mix of positive and negative values, bubble down first
        // check: https://github.com/moment/moment/issues/2166
        if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
                (milliseconds <= 0 && days <= 0 && months <= 0))) {
            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
            days = 0;
            months = 0;
        }

        // The following code bubbles up values, see the tests for
        // examples of what that means.
        data.milliseconds = milliseconds % 1000;

        seconds           = absFloor(milliseconds / 1000);
        data.seconds      = seconds % 60;

        minutes           = absFloor(seconds / 60);
        data.minutes      = minutes % 60;

        hours             = absFloor(minutes / 60);
        data.hours        = hours % 24;

        days += absFloor(hours / 24);

        // convert days to months
        monthsFromDays = absFloor(daysToMonths(days));
        months += monthsFromDays;
        days -= absCeil(monthsToDays(monthsFromDays));

        // 12 months -> 1 year
        years = absFloor(months / 12);
        months %= 12;

        data.days   = days;
        data.months = months;
        data.years  = years;

        return this;
    }

    function daysToMonths (days) {
        // 400 years have 146097 days (taking into account leap year rules)
        // 400 years have 12 months === 4800
        return days * 4800 / 146097;
    }

    function monthsToDays (months) {
        // the reverse of daysToMonths
        return months * 146097 / 4800;
    }

    function as (units) {
        var days;
        var months;
        var milliseconds = this._milliseconds;

        units = normalizeUnits(units);

        if (units === 'month' || units === 'year') {
            days   = this._days   + milliseconds / 864e5;
            months = this._months + daysToMonths(days);
            return units === 'month' ? months : months / 12;
        } else {
            // handle milliseconds separately because of floating point math errors (issue #1867)
            days = this._days + Math.round(monthsToDays(this._months));
            switch (units) {
                case 'week'   : return days / 7     + milliseconds / 6048e5;
                case 'day'    : return days         + milliseconds / 864e5;
                case 'hour'   : return days * 24    + milliseconds / 36e5;
                case 'minute' : return days * 1440  + milliseconds / 6e4;
                case 'second' : return days * 86400 + milliseconds / 1000;
                // Math.floor prevents floating point math errors here
                case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
                default: throw new Error('Unknown unit ' + units);
            }
        }
    }

    // TODO: Use this.as('ms')?
    function duration_as__valueOf () {
        return (
            this._milliseconds +
            this._days * 864e5 +
            (this._months % 12) * 2592e6 +
            toInt(this._months / 12) * 31536e6
        );
    }

    function makeAs (alias) {
        return function () {
            return this.as(alias);
        };
    }

    var asMilliseconds = makeAs('ms');
    var asSeconds      = makeAs('s');
    var asMinutes      = makeAs('m');
    var asHours        = makeAs('h');
    var asDays         = makeAs('d');
    var asWeeks        = makeAs('w');
    var asMonths       = makeAs('M');
    var asYears        = makeAs('y');

    function duration_get__get (units) {
        units = normalizeUnits(units);
        return this[units + 's']();
    }

    function makeGetter(name) {
        return function () {
            return this._data[name];
        };
    }

    var milliseconds = makeGetter('milliseconds');
    var seconds      = makeGetter('seconds');
    var minutes      = makeGetter('minutes');
    var hours        = makeGetter('hours');
    var days         = makeGetter('days');
    var months       = makeGetter('months');
    var years        = makeGetter('years');

    function weeks () {
        return absFloor(this.days() / 7);
    }

    var round = Math.round;
    var thresholds = {
        s: 45,  // seconds to minute
        m: 45,  // minutes to hour
        h: 22,  // hours to day
        d: 26,  // days to month
        M: 11   // months to year
    };

    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
    }

    function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) {
        var duration = create__createDuration(posNegDuration).abs();
        var seconds  = round(duration.as('s'));
        var minutes  = round(duration.as('m'));
        var hours    = round(duration.as('h'));
        var days     = round(duration.as('d'));
        var months   = round(duration.as('M'));
        var years    = round(duration.as('y'));

        var a = seconds < thresholds.s && ['s', seconds]  ||
                minutes <= 1           && ['m']           ||
                minutes < thresholds.m && ['mm', minutes] ||
                hours   <= 1           && ['h']           ||
                hours   < thresholds.h && ['hh', hours]   ||
                days    <= 1           && ['d']           ||
                days    < thresholds.d && ['dd', days]    ||
                months  <= 1           && ['M']           ||
                months  < thresholds.M && ['MM', months]  ||
                years   <= 1           && ['y']           || ['yy', years];

        a[2] = withoutSuffix;
        a[3] = +posNegDuration > 0;
        a[4] = locale;
        return substituteTimeAgo.apply(null, a);
    }

    // This function allows you to set the rounding function for relative time strings
    function duration_humanize__getSetRelativeTimeRounding (roundingFunction) {
        if (roundingFunction === undefined) {
            return round;
        }
        if (typeof(roundingFunction) === 'function') {
            round = roundingFunction;
            return true;
        }
        return false;
    }

    // This function allows you to set a threshold for relative time strings
    function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) {
        if (thresholds[threshold] === undefined) {
            return false;
        }
        if (limit === undefined) {
            return thresholds[threshold];
        }
        thresholds[threshold] = limit;
        return true;
    }

    function humanize (withSuffix) {
        var locale = this.localeData();
        var output = duration_humanize__relativeTime(this, !withSuffix, locale);

        if (withSuffix) {
            output = locale.pastFuture(+this, output);
        }

        return locale.postformat(output);
    }

    var iso_string__abs = Math.abs;

    function iso_string__toISOString() {
        // for ISO strings we do not use the normal bubbling rules:
        //  * milliseconds bubble up until they become hours
        //  * days do not bubble at all
        //  * months bubble up until they become years
        // This is because there is no context-free conversion between hours and days
        // (think of clock changes)
        // and also not between days and months (28-31 days per month)
        var seconds = iso_string__abs(this._milliseconds) / 1000;
        var days         = iso_string__abs(this._days);
        var months       = iso_string__abs(this._months);
        var minutes, hours, years;

        // 3600 seconds -> 60 minutes -> 1 hour
        minutes           = absFloor(seconds / 60);
        hours             = absFloor(minutes / 60);
        seconds %= 60;
        minutes %= 60;

        // 12 months -> 1 year
        years  = absFloor(months / 12);
        months %= 12;


        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
        var Y = years;
        var M = months;
        var D = days;
        var h = hours;
        var m = minutes;
        var s = seconds;
        var total = this.asSeconds();

        if (!total) {
            // this is the same as C#'s (Noda) and python (isodate)...
            // but not other JS (goog.date)
            return 'P0D';
        }

        return (total < 0 ? '-' : '') +
            'P' +
            (Y ? Y + 'Y' : '') +
            (M ? M + 'M' : '') +
            (D ? D + 'D' : '') +
            ((h || m || s) ? 'T' : '') +
            (h ? h + 'H' : '') +
            (m ? m + 'M' : '') +
            (s ? s + 'S' : '');
    }

    var duration_prototype__proto = Duration.prototype;

    duration_prototype__proto.abs            = duration_abs__abs;
    duration_prototype__proto.add            = duration_add_subtract__add;
    duration_prototype__proto.subtract       = duration_add_subtract__subtract;
    duration_prototype__proto.as             = as;
    duration_prototype__proto.asMilliseconds = asMilliseconds;
    duration_prototype__proto.asSeconds      = asSeconds;
    duration_prototype__proto.asMinutes      = asMinutes;
    duration_prototype__proto.asHours        = asHours;
    duration_prototype__proto.asDays         = asDays;
    duration_prototype__proto.asWeeks        = asWeeks;
    duration_prototype__proto.asMonths       = asMonths;
    duration_prototype__proto.asYears        = asYears;
    duration_prototype__proto.valueOf        = duration_as__valueOf;
    duration_prototype__proto._bubble        = bubble;
    duration_prototype__proto.get            = duration_get__get;
    duration_prototype__proto.milliseconds   = milliseconds;
    duration_prototype__proto.seconds        = seconds;
    duration_prototype__proto.minutes        = minutes;
    duration_prototype__proto.hours          = hours;
    duration_prototype__proto.days           = days;
    duration_prototype__proto.weeks          = weeks;
    duration_prototype__proto.months         = months;
    duration_prototype__proto.years          = years;
    duration_prototype__proto.humanize       = humanize;
    duration_prototype__proto.toISOString    = iso_string__toISOString;
    duration_prototype__proto.toString       = iso_string__toISOString;
    duration_prototype__proto.toJSON         = iso_string__toISOString;
    duration_prototype__proto.locale         = locale;
    duration_prototype__proto.localeData     = localeData;

    // Deprecations
    duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString);
    duration_prototype__proto.lang = lang;

    // Side effect imports

    // FORMATTING

    addFormatToken('X', 0, 0, 'unix');
    addFormatToken('x', 0, 0, 'valueOf');

    // PARSING

    addRegexToken('x', matchSigned);
    addRegexToken('X', matchTimestamp);
    addParseToken('X', function (input, array, config) {
        config._d = new Date(parseFloat(input, 10) * 1000);
    });
    addParseToken('x', function (input, array, config) {
        config._d = new Date(toInt(input));
    });

    // Side effect imports


    utils_hooks__hooks.version = '2.15.0';

    setHookCallback(local__createLocal);

    utils_hooks__hooks.fn                    = momentPrototype;
    utils_hooks__hooks.min                   = min;
    utils_hooks__hooks.max                   = max;
    utils_hooks__hooks.now                   = now;
    utils_hooks__hooks.utc                   = create_utc__createUTC;
    utils_hooks__hooks.unix                  = moment__createUnix;
    utils_hooks__hooks.months                = lists__listMonths;
    utils_hooks__hooks.isDate                = isDate;
    utils_hooks__hooks.locale                = locale_locales__getSetGlobalLocale;
    utils_hooks__hooks.invalid               = valid__createInvalid;
    utils_hooks__hooks.duration              = create__createDuration;
    utils_hooks__hooks.isMoment              = isMoment;
    utils_hooks__hooks.weekdays              = lists__listWeekdays;
    utils_hooks__hooks.parseZone             = moment__createInZone;
    utils_hooks__hooks.localeData            = locale_locales__getLocale;
    utils_hooks__hooks.isDuration            = isDuration;
    utils_hooks__hooks.monthsShort           = lists__listMonthsShort;
    utils_hooks__hooks.weekdaysMin           = lists__listWeekdaysMin;
    utils_hooks__hooks.defineLocale          = defineLocale;
    utils_hooks__hooks.updateLocale          = updateLocale;
    utils_hooks__hooks.locales               = locale_locales__listLocales;
    utils_hooks__hooks.weekdaysShort         = lists__listWeekdaysShort;
    utils_hooks__hooks.normalizeUnits        = normalizeUnits;
    utils_hooks__hooks.relativeTimeRounding = duration_humanize__getSetRelativeTimeRounding;
    utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold;
    utils_hooks__hooks.calendarFormat        = getCalendarFormat;
    utils_hooks__hooks.prototype             = momentPrototype;

    var _moment = utils_hooks__hooks;

    return _moment;

}));
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/EventSink.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.default = void 0;

var _rxjs = require("rxjs");

var subject = new _rxjs.Subject();
var _default = subject;
exports.default = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","rxjs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/PayPalREST.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray2 = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.default = void 0;

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.split.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some"));

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _EventSink = _interopRequireDefault(require("./EventSink"));

var _TokenExpirationHandler = _interopRequireDefault(require("./TokenExpirationHandler"));

var _TokenExpirationHandlerActions = _interopRequireDefault(require("./TokenExpirationHandlerActions"));

var _PayPalRestEvents = _interopRequireDefault(require("./PayPalRestEvents"));

var _restError = require("./restError");

function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray2(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }

function _unsupportedIterableToArray(o, minLen) { var _context12; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context12 = Object.prototype.toString.call(o)).call(_context12, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

var Log = (0, _manticoreLog.default)('paypalRest');
var LIVE = 'live';
var baseUrls = {
  live: 'https://api.paypal.com',
  sandbox: 'https://api.sandbox.paypal.com',
  msmaster: 'https://www.msmaster.qa.paypal.com'
};

function getUrl(env, service, op) {
  var _context, _context2;

  var url = baseUrls[env] || "https://www.".concat(env, ".stage.paypal.com");
  return (0, _concat.default)(_context = (0, _concat.default)(_context2 = "".concat(url)).call(_context2, service)).call(_context, op);
}

function getResolvers(env) {
  return {
    token: function token(opts) {
      return getUrl(env, '/v1/oauth2/', opts.op);
    },
    invoicing: function invoicing(opts) {
      return getUrl(env, '/v1/invoicing/', opts.op);
    },
    contactserv: function contactserv(opts) {
      return getUrl(env, '/v1/customer/contacts/', opts.op);
    }
  };
}

function refreshWithUrl(parsedToken) {
  return {
    isUsable: function isUsable() {
      return !!parsedToken.refreshUrl;
    },
    requestBody: {
      url: parsedToken.refreshUrl,
      format: 'json'
    },
    logMessage: 'Attempting an AccessToken refresh from RefreshURL',
    errorDeveloperMessage: 'Invalid response during token refresh with refreshUrl'
  };
}

function firstPartyRefresh(parsedToken) {
  return {
    isUsable: function isUsable() {
      return parsedToken.env !== LIVE && parsedToken.appIdSecret;
    },
    requestBody: {
      url: getResolvers(parsedToken.env || LIVE).token({
        op: 'token'
      }),
      headers: {
        Authorization: "Basic ".concat(parsedToken.appIdSecret),
        'Content-Type': 'application/x-www-form-urlencoded',
        'Cache-Control': 'no-cache',
        Accept: 'application/json'
      },
      method: 'POST',
      format: 'json',
      body: parsedToken.refreshToken ? "grant_type=refresh_token&response_type=token&refresh_token=".concat(encodeURIComponent(parsedToken.refreshToken)) : 'grant_type=client_credentials',
      timeout: 15000
    },
    logMessage: parsedToken.refreshToken ? 'Attempting an AccessToken refresh from RefreshToken' : 'Attempting an AccessToken refresh with First Party Credentials',
    errorDeveloperMessage: parsedToken.refreshToken ? 'Invalid response during token refresh with refreshToken' : 'Invalid response during token refresh with first party credentials'
  };
}

function doCallbacks(callbacks, error) {
  var _iterator = _createForOfIteratorHelper(callbacks),
      _step;

  try {
    for (_iterator.s(); !(_step = _iterator.n()).done;) {
      var cb = _step.value;

      try {
        cb(error);
      } catch (x) {
        Log.warn('Error executing callback function', {
          errMessage: x.message
        });
      }
    }
  } catch (err) {
    _iterator.e(err);
  } finally {
    _iterator.f();
  }
}
/**
 * An object that manages network calls to authenticated PayPal services. It will automatically refresh
 * expired access tokens and retry as appropriate. It also provides a "url resolution" infrastructure
 * to let callers specify services and operations to be interpreted in the context of an environment
 * to generate a URL for a service call rather than just hand coding all the service endpoints.
 * @class
 */


var PayPalREST = /*#__PURE__*/function () {
  /**
   * Build a REST interface with access token, refresh url and optional expiration time
   * @constructor
   * @param {object} parsedToken An object containing env, accessToken, refreshUrl, appIdSecret, refreshToken, expiresIn
   */
  function PayPalREST(parsedToken) {
    (0, _classCallCheck2.default)(this, PayPalREST);
    this.env = parsedToken.env || PayPalREST.Env.LIVE;
    this.resolvers = getResolvers(this.env);
    this.cbs = [];
    this.at = parsedToken.accessToken;
    this.refreshUrl = parsedToken.refreshUrl;
    this.app = parsedToken.appIdSecret;
    this.rt = parsedToken.refreshToken;
    this.exp = parsedToken.expiresIn;
    this.tokenExpirationHandler = null;
    this.refreshMethods = [refreshWithUrl(parsedToken), firstPartyRefresh(parsedToken)];
  }
  /**
   * Add a resolver for a given service
   * @param {string} service The name of the service this resolver will resolve.
   * @param {PayPalRest#serviceResolver} fn The function that will be called to get the URL for the operation
   */


  (0, _createClass2.default)(PayPalREST, [{
    key: "addResolver",
    value: function addResolver(service, fn) {
      this.resolvers[service] = fn;
    }
    /**
     * Injects Device Information if provided by the manticore object
     * @param {object} options The options on the request, in which you typically
     */

  }, {
    key: "injectDeviceInfo",
    value: function injectDeviceInfo(options) {
      var _manticore$deviceInfo;

      if (((_manticore$deviceInfo = _manticore.default.deviceInfo) === null || _manticore$deviceInfo === void 0 ? void 0 : _manticore$deviceInfo.call(_manticore.default)) != null) {
        var deviceInfo = _manticore.default.deviceInfo();

        if (typeof deviceInfo === 'string') {
          options.headers['X-PAYPAL-REQUEST-SOURCE'] = deviceInfo;
        } else if ((0, _isArray.default)(deviceInfo)) {
          options.headers['X-PAYPAL-REQUEST-SOURCE'] = deviceInfo.join('_');
        } else if (typeof deviceInfo === 'object') {
          for (var key in deviceInfo) {
            // Don't overwrite existing keys
            if (!(key in options.headers)) {
              options.headers[key] = deviceInfo[key];
            }
          }
        }
      }
    }
  }, {
    key: "setTokenExpirationHandler",
    value: function setTokenExpirationHandler(expirationHandler) {
      var newData = [];
      var lastAT;
      var callbacks = [];

      this.tokenExpirationHandler = function (expiredAccessToken) {
        var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

        if (lastAT === expiredAccessToken) {
          if (newData.length === 0) {
            callbacks.push(cb);
          } else {
            cb.apply(void 0, (0, _toConsumableArray2.default)(newData));
          }
        } else {
          newData = [];
          lastAT = expiredAccessToken;
          callbacks.push(cb);
          expirationHandler(new _TokenExpirationHandler.default(function (action, accessToken) {
            newData = [action, accessToken];

            while (callbacks.length > 0) {
              callbacks.pop()(action, accessToken);
            }
          }));
        }
      };
    }
  }, {
    key: "request",
    value: function request(options) {
      var _this = this;

      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};

      if (!options) {
        var error = _restError.restError.invalidRequest.withDevMessage('Request options was empty');

        Log.error('Empty options:', error);
        callback(error, null);
        return;
      }

      if (!options.url) {
        if (!options.service || !this.resolvers[options.service]) {
          var opError = _restError.restError.invalidRequest.withDevMessage('Options has no url and no resolvable service.');

          Log.error("Bad options: ".concat(opError.stack));
          callback(opError, null);
          return;
        }

        options.url = this.resolvers[options.service](this, options);
      }

      if (!this.at && !this.refreshUrl && !this.app) {
        callback(_restError.restError.invalidCompositeToken.withDevMessage('The access token is invalid and does not include an access token, refresh url or clientId/secret'), null);
        return;
      }

      if (!this.at) {
        // Refresh right away
        this.refresh(function (refreshError) {
          if (refreshError) {
            callback(refreshError, null);
            return;
          }

          _this.request(options, callback);
        });
        return;
      }

      options.headers = options.headers || {};
      options.headers.Authorization = "Bearer ".concat(this.at);
      this.injectDeviceInfo(options);
      var start = new Date().getTime();

      _manticore.default.http(options, function (error, response) {
        try {
          var end = new Date().getTime();
          var elapsed = end - start;
          Log.debug(function () {
            var _context3, _context4, _context5;

            return (0, _concat.default)(_context3 = (0, _concat.default)(_context4 = (0, _concat.default)(_context5 = "".concat(options.method || 'GET', " ")).call(_context5, options.url, " (")).call(_context4, elapsed, "ms): ")).call(_context3, response ? response.statusCode : error);
          });

          if (error) {
            if (!error.domain) {
              error.domain = _restError.paypalRestErrorDomain;
            }

            if (error.code === _restError.restError.networkOffline.code) {
              _EventSink.default.next(_PayPalRestEvents.default.networkOffline);
            }

            if (error.code === _restError.restError.untrustedNetwork.code) {
              _EventSink.default.next(_PayPalRestEvents.default.untrustedNetwork);
            }

            Log.error('Native Http Error', {
              url: options.url,
              error,
              response
            });
            callback(error, null);
            return;
          }

          var needsRefresh = response && (response.statusCode === 401 || response.statusCode === 403) && !options._tried;

          if (needsRefresh) {
            var callCBWithUnauth = function callCBWithUnauth() {
              Log.warn("Token expired and token refresh information not provided for ".concat(options.url));

              var e = _restError.restError.unauthorized.withDevMessage('Merchant token had no "refreshUrl" property, cannot refresh access token.');

              _EventSink.default.next(_PayPalRestEvents.default.tokenExpired);

              callback(e, response);
            };

            Log.error('Authorization Failed', {
              url: options.url,
              response: (0, _stringify.default)(response)
            });

            if (_this._canRefreshToken()) {
              options._tried = true;

              _this.refresh(function (refreshError) {
                if (refreshError) {
                  callback(refreshError, null);
                  return;
                }

                _this.request(options, callback);
              });
            } else if (_this.tokenExpirationHandler) {
              _EventSink.default.next(_PayPalRestEvents.default.handlingTokenExpiry);

              _this.tokenExpirationHandler(options.headers.Authorization.split(' ')[1], function (action, accessToken) {
                if (action === _TokenExpirationHandlerActions.default.resume && accessToken) {
                  _this.at = accessToken;

                  _this.request(options, callback);
                } else {
                  callCBWithUnauth();
                }
              });
            } else {
              callCBWithUnauth();
            }

            return;
          }

          if ((options.format === 'json' || options.format === 'jose') && !options.rawError) {
            var _response$body;

            if (response !== null && response !== void 0 && (_response$body = response.body) !== null && _response$body !== void 0 && _response$body.errorCode) {
              // HereApi style errors
              error = (0, _restError.payPalError)(response.body.errorCode, response.body.message, response.body.correlationId);
            } else if ((response === null || response === void 0 ? void 0 : response.statusCode) >= 300) {
              var _response$body2;

              // PlatformApiServ style errors
              var message = response.body.message;
              var code = ((_response$body2 = response.body) === null || _response$body2 === void 0 ? void 0 : _response$body2.name) || response.statusCode;
              var debugId = PayPalREST.getPlatformapiservDebugId(response);
              error = (0, _restError.payPalError)(code, message, debugId);
              error.domain = options.service;

              if (response.body.details) {
                error.details = response.body.details;
              }
            }

            if (error) {
              error.domain = options.service;
              PayPalREST.generateDevMessage(error);
              Log.error('Received error', {
                errMessage: error.developerMessage
              });
            }
          }
        } catch (x) {
          Log.error('Merchant request failure:', {
            error: x
          });
          error = x;
        }

        callback(error, response);
      });
    }
    /*
     * Accepts a refresh method object
     * {
     *   isUsable: () => boolean,
     *   requestBody: {}, // manticore.http options
     *   logMessage: String,
     *   errorDeveloperMessage: String,
     * }
     */

  }, {
    key: "addRefreshMethod",
    value: function addRefreshMethod(method) {
      this.refreshMethods.add(method);
    }
  }, {
    key: "_canRefreshToken",
    value: function _canRefreshToken() {
      var _context6;

      return (0, _some.default)(_context6 = this.refreshMethods).call(_context6, function (method) {
        return method.isUsable();
      });
    }
  }, {
    key: "refresh",
    value: function refresh(callback) {
      var _context7,
          _context8,
          _this2 = this;

      if (this.cbs.length) {
        this.cbs.push(callback);
        return;
      }

      this.cbs.push(callback);

      var _this$refreshMethods$ = (0, _concat.default)(_context7 = (0, _filter.default)(_context8 = this.refreshMethods).call(_context8, function (method) {
        return method.isUsable();
      })).call(_context7, {}),
          _this$refreshMethods$2 = (0, _slicedToArray2.default)(_this$refreshMethods$, 1),
          _this$refreshMethods$3 = _this$refreshMethods$2[0],
          requestBody = _this$refreshMethods$3.requestBody,
          logMessage = _this$refreshMethods$3.logMessage,
          errorDeveloperMessage = _this$refreshMethods$3.errorDeveloperMessage;

      if (requestBody) {
        Log.info(logMessage || 'Attempting token refresh');

        _manticore.default.http(requestBody, function (error, rz) {
          var _rz$body;

          if (rz !== null && rz !== void 0 && (_rz$body = rz.body) !== null && _rz$body !== void 0 && _rz$body.access_token) {
            // eslint-disable-line camelcase
            _this2.at = rz.body.access_token;
            _this2.refreshUrl = rz.body.refresh_url || _this2.refreshUrl; // eslint-disable-line camelcase

            _EventSink.default.next(_PayPalRestEvents.default.tokenRefreshed);

            Log.debug('Successfully refreshed token.');
          } else if (!error) {
            error = _restError.restError.unauthorized.withDevMessage(errorDeveloperMessage);
          }

          if (error) {
            var rzDesc = (0, _stringify.default)(rz || {});
            Log.error('Failed to refresh token:', {
              errMessage: error.message,
              rzDesc
            });

            _EventSink.default.next(_PayPalRestEvents.default.tokenExpired);
          }

          doCallbacks(_this2.cbs, error);
          _this2.cbs = [];
        });
      } else {
        Log.error('Failed to find refresh method!');

        _EventSink.default.next(_PayPalRestEvents.default.tokenExpired);

        var error = _restError.restError.unresolvedRefreshMethod.withDevMessage('no refresh method found!');

        doCallbacks(this.cbs, error);
        this.cbs = [];
      }
    }
  }], [{
    key: "fromToken",
    value:
    /**
     * Construct a PayPalREST object from a "token blob" format which contains
     * an environment specifier, access token, and refresh url (typically)
     * @param {string} token The token blob usually from a mid tier server
     */
    function fromToken(token) {
      var parsedToken;

      try {
        if (token && token[0] === '{') {
          parsedToken = JSON.parse(token);
        } else {
          var parts = (token || '').split(':', 2);

          if (parts.length !== 2) {
            throw new Error("Invalid token presented (off by ".concat(parts.length - 2, ")"));
          }

          var tokenParts = Buffer.from(parts[1], 'base64').toString('utf8');
          var infoArray = JSON.parse(tokenParts);
          parsedToken = {
            env: parts[0],
            accessToken: infoArray[0],
            expiresIn: infoArray[1],
            refreshUrl: infoArray[2],
            refreshToken: infoArray[3],
            appIdSecret: infoArray[4]
          };
        }

        return new PayPalREST(parsedToken);
      } catch (x) {
        var _context9;

        Log.error((0, _concat.default)(_context9 = "Could not read token: ".concat(x.message, "\n")).call(_context9, x.stack));
        throw _restError.restError.invalidToken.withDevMessage(x.message);
      }
    }
  }, {
    key: "getPlatformapiservDebugId",
    value: function getPlatformapiservDebugId(response) {
      var headers = response.headers;

      if (response.body.debug_id) {
        return response.body.debug_id;
      }

      return headers['correlation-id'] || headers['CORRELATION-ID'] || headers['paypal-debug-id'] || headers.debug_id;
    }
  }, {
    key: "generateDevMessage",
    value: function generateDevMessage(error) {
      if (!error) {
        return error;
      }

      var devMessage = '';

      function appendToDevMessage(key, str) {
        if (devMessage.length) {
          devMessage += ', ';
        }

        devMessage += "".concat(key, ": ");

        if (str && str.length) {
          devMessage += str;
        }
      }

      appendToDevMessage('domain', error.domain);
      appendToDevMessage('code', error.code);
      appendToDevMessage('message', error.message);
      appendToDevMessage('debugId', error.debugId);
      var details = '';

      if (error.details && (0, _isArray.default)(error.details) && error.details.length > 0) {
        var _context10;

        (0, _forEach.default)(_context10 = error.details).call(_context10, function (obj) {
          var _context11;

          if (details.length) {
            details += ' ';
          }

          details += (0, _concat.default)(_context11 = "".concat(obj.field, " ")).call(_context11, obj.issue);
        });
      }

      appendToDevMessage('details', details);
      error.developerMessage = devMessage;
      return error;
    }
  }]);
  return PayPalREST;
}();
/**
 * Enum for the main environments
 */


exports.default = PayPalREST;
PayPalREST.Env = {
  LIVE,
  SANDBOX: 'sandbox',
  MSMASTER: 'msmaster'
};
/**
 * Called when an operation needs to be resolved to a URL.
 * @callback TransactionContext~serviceResolver
 * @param {PayPalREST} api The API which is attempting to make the request
 * @param {object} options The options on the request, in which you typically only need to see op (meaning operation)
 */
}).call(this)}).call(this,require("buffer").Buffer)
},{"./EventSink":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/EventSink.js","./PayPalRestEvents":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/PayPalRestEvents.js","./TokenExpirationHandler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/TokenExpirationHandler.js","./TokenExpirationHandlerActions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/TokenExpirationHandlerActions.js","./restError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/restError.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.split.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/PayPalRestEvents.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.default = void 0;
var events = {
  end: 'end',
  resume: 'resume',
  handlingTokenExpiry: 'handlingTokenExpiry',
  tokenExpired: 'tokenExpired',
  networkOffline: 'networkOffline',
  untrustedNetwork: 'untrustedNetwork',
  tokenRefreshed: 'tokenRefreshed'
};
var _default = events;
exports.default = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/TokenExpirationHandler.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.default = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _EventSink = _interopRequireDefault(require("./EventSink"));

var _TokenExpirationHandlerActions = _interopRequireDefault(require("./TokenExpirationHandlerActions"));

var _PayPalRestEvents = _interopRequireDefault(require("./PayPalRestEvents"));

var Log = (0, _manticoreLog.default)('tokenExpiration.handler');
/**
 * When user session times-out during a transaction, it will emit the SessionTimeoutHandler handler
 * @class
 */

var TokenExpirationHandler = /*#__PURE__*/function () {
  function TokenExpirationHandler(cb) {
    (0, _classCallCheck2.default)(this, TokenExpirationHandler);
    this._cb = cb;
  }
  /**
   * Quit the current activity
   */


  (0, _createClass2.default)(TokenExpirationHandler, [{
    key: "quit",
    value: function quit() {
      Log.track('Quitting current action');

      _EventSink.default.next(_PayPalRestEvents.default.end);

      this._cb(_TokenExpirationHandlerActions.default.end);
    }
    /**
     * Restart the last action with a valid access token
     * @param {string} accessToken Valid access token
     */

  }, {
    key: "continueWithNewToken",
    value: function continueWithNewToken(accessToken) {
      Log.track('Continuing transaction with New Token');

      _EventSink.default.next(_PayPalRestEvents.default.resume);

      this._cb(_TokenExpirationHandlerActions.default.resume, accessToken);
    }
  }]);
  return TokenExpirationHandler;
}();

exports.default = TokenExpirationHandler;
},{"./EventSink":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/EventSink.js","./PayPalRestEvents":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/PayPalRestEvents.js","./TokenExpirationHandlerActions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/TokenExpirationHandlerActions.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/TokenExpirationHandlerActions.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.default = void 0;
var TokenExpirationHandlerActions = {
  end: 0,
  resume: 1
};
var _default = TokenExpirationHandlerActions;
exports.default = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/index.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

_Object$defineProperty(exports, "PayPalREST", {
  enumerable: true,
  get: function get() {
    return _PayPalREST.default;
  }
});

_Object$defineProperty(exports, "restError", {
  enumerable: true,
  get: function get() {
    return _restError.restError;
  }
});

_Object$defineProperty(exports, "paypalRestErrorDomain", {
  enumerable: true,
  get: function get() {
    return _restError.paypalRestErrorDomain;
  }
});

_Object$defineProperty(exports, "TokenExpirationHandler", {
  enumerable: true,
  get: function get() {
    return _TokenExpirationHandler.default;
  }
});

_Object$defineProperty(exports, "eventSink", {
  enumerable: true,
  get: function get() {
    return _EventSink.default;
  }
});

_Object$defineProperty(exports, "events", {
  enumerable: true,
  get: function get() {
    return _PayPalRestEvents.default;
  }
});

var _PayPalREST = _interopRequireDefault(require("./PayPalREST"));

var _restError = require("./restError");

var _TokenExpirationHandler = _interopRequireDefault(require("./TokenExpirationHandler"));

var _EventSink = _interopRequireDefault(require("./EventSink"));

var _PayPalRestEvents = _interopRequireDefault(require("./PayPalRestEvents"));
},{"./EventSink":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/EventSink.js","./PayPalREST":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/PayPalREST.js","./PayPalRestEvents":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/PayPalRestEvents.js","./TokenExpirationHandler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/TokenExpirationHandler.js","./restError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/restError.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/paypalrest-manticore/build/restError.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.payPalError = payPalError;
exports.paypalRestErrorDomain = exports.restError = void 0;

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _manticorePaypalerror = require("@paypalcorp/manticore-paypalerror");

var domain = 'PayPalRest';
exports.paypalRestErrorDomain = domain;

function payPalError(code, message, debugId) {
  var errorInfo = new _manticorePaypalerror.PayPalErrorInfo();
  errorInfo.code = code.toString();
  errorInfo.domain = domain;
  errorInfo.message = message;
  errorInfo.debugId = debugId;
  return _manticorePaypalerror.PayPalError.makeError(null, errorInfo);
}

var restError = {
  invalidToken: payPalError(0, 'Invalid token'),
  invalidRequest: payPalError(1, 'Invalid request'),
  invalidCompositeToken: payPalError(2, 'Invalid composite token provided'),
  unresolvedRefreshMethod: payPalError(3, 'unresolved refresh method'),
  unauthorized: payPalError(401, 'Request not authorized'),
  untrustedNetwork: payPalError(-999, 'Untrusted network'),
  networkOffline: payPalError(-1001, 'Network offline')
};
exports.restError = restError;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@paypalcorp/manticore-paypalerror":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-paypalerror/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/BatteryStatus.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Battery status
 * @enum {int}
 */
var BatteryStatus = {
  /**
   * Battery status not known
   */
  unknown: 0,

  /**
   * Battery is draining and not connected to power
   */
  draining: 1,

  /**
   * Battery is fully drained
   */
  drained: 2,

  /**
   * Battery is charging
   */
  charging: 3,

  /**
   * Battery is fully charged
   */
  charged: 4
};
var _default = BatteryStatus;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/CardIssuer.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Issuer of the card that was presented to the SDK
 * @enum {int}
 */
var CardIssuer = {
  /**
   * Unknown card issuer
   */
  Unknown: 0,

  /**
   * Visa credit/prepaid
   */
  Visa: 1,

  /**
   * Master card
   */
  MasterCard: 2,

  /**
   * Maestro
   */
  Maestro: 3,

  /**
   * American Express
   */
  Amex: 4,

  /**
   * Discover
   */
  Discover: 5,

  /**
   * PayPal
   */
  PayPal: 6
};
var _default = CardIssuer;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/DeviceError.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Device Error name to code
 * @enum {int}
 */
var DeviceError = {
  /**
   * Generic error
   */
  generic: 0,

  /**
   * Contactless reader timed out waiting for payment presentation
   */
  nfcTimeout: 1,

  /**
   * Contactless payment not allowed on this card
  */
  nfcNotAllowed: 2,

  /**
   * Try different card
   */
  tryDifferentCard: 3,

  /**
   * Must insert presented card
   */
  mustInsertCard: 4,

  /**
   * Must swipe presented card
   */
  mustSwipeCard: 5,

  /**
   * Hardware error
   */
  hardwareError: 6,

  /**
   * Presented card is blocked
   */
  cardBlocked: 7,

  /**
   * Payment was declined. Contact issuer
   */
  contactIssuer: 8,

  /**
   * Chip is invalid
   */
  invalidChip: 9,

  /**
   * Cannot swipe a chip card
   */
  cannotSwipeChipCard: 10,

  /**
   * Card not in slot
   */
  smartCardNotInSlot: 11,

  /**
   * Payment was cancelled
   */
  paymentCancelled: 12,

  /**
   * Contactless payment was aborted by card insert
   */
  contactlessPaymentAbortedByCardInsert: 13,

  /**
   * Contactless payment was aborted by card swipe
   */
  contactlessPaymentAbortedByCardSwipe: 14,

  /**
   * Bad EMV data
   */
  badEmvData: 15,

  /**
   * Device not connected
   */
  deviceNotConnected: 16,

  /**
   * Device cannot accept messages in its current state
   */
  cannotAcceptMessage: 17,

  /**
   * Action was cancelled
   */
  actionCancelled: 18,

  /**
   * Secure entry failed
   */
  secureEntryFailed: 19,

  /**
   * Numeric entry failed
   */
  numericEntryFailed: 20,

  /**
   * Data validation error
   */
  dataValidationError: 21,

  /**
   * Received unexpected response
   */
  unexpectedResponse: 22,

  /**
   * Received failure response
   */
  failureResponse: 23,

  /**
   * Failed to retrieve expected data
   */
  dataRetrievalFailed: 24,

  /**
   * Battery Low
   */
  lowOnBattery: 25,

  /**
   * Unable to retrieve the file from the device
   */
  fileNotFound: 26,

  /**
   * File import failed
   */
  fileImportFailed: 27,

  /**
   * Device initialization failed
   */
  initializationFailed: 28,

  /**
   * Tip entry failed
   */
  tipEntryFailed: 29,

  /**
   * Software Update Failed
   */
  swUpdateFailed: 30,

  /**
   * Device not functional at this moment
   */
  notFunctional: 31,

  /**
   * Software update is pending
   */
  swUpdatePending: 32,

  /**
   * Cancel reading card data
   */
  cancelReadCardData: 33,

  /**
   * Card reader not available for connection
   */
  cardReaderNotAvailable: 34,

  /**
   * Downloaded firmware file was corrupt
   */
  corruptFirmware: 35,

  /**
   * Received unexpected request
   */
  unexpectedRequest: 36,

  /**
   * Could not complete requested action
   */
  actionCannotBeCompleted: 37,

  /**
   * Received unexpected request
   */
  lastActiveReaderNotFound: 38,

  /**
   * Blacklisted
   */
  blacklisted: 39,

  /**
   * Bad Swipe Data
   */
  badSwipeData: 40,

  /**
   * Signature collection cancelled
   */
  signatureCancelled: 41,

  /**
   * User cancelled
   */
  userCancelled: 42,

  /**
   * Signature not presented
   */
  noSignature: 43,

  /**
   * Write to device failed
   */
  writeFailure: 44,

  /**
   * Socket connection could not be established
   */
  socketClosed: 45,

  /**
   * Invalid card data
   */
  invalidCardData: 46,

  /**
   * Unable to connect
   */
  unableToConnect: 47,

  /**
   * Further action on buyer phone is required
   */
  seePhone: 48,

  /**
   * Software update is in progress
   */
  swUpdateInProgress: 49,

  /**
   * Card reader has an active transaction
   */
  activeTransaction: 50,

  /**
   * Software update canceled
   */
  swUpdateCanceled: 51,

  /**
   * Firmware checksum does not match
   */
  swChecksumMismatch: 52,

  /**
   * No response received within the timeout duration
   */
  timeout: 53,

  /**
   * 	Battery info is not supported
   */
  batteryInfoNotSupported: 54
};
var _default = DeviceError;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/DeviceManufacturer.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * The device manufacturers
 * @enum {int}
 */
var DeviceManufacturer = {
  /**
   * Miura
   */
  miura: 0,

  /**
   * Manufacturer is Ingenico
   */
  ingenico: 1,

  /**
   * Manufacturer is BBPOS
   */
  bbpos: 2,

  /**
   * Manufacturer is Roam
   */
  roam: 3,

  /**
   * Manufacturer is Verifone
   */
  verifone: 4
};
var _default = DeviceManufacturer;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/EntryMode.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
var EntryMode = {
  KeyIn: 'keyIn',
  Swipe: 'swipe',
  Chip: 'chip',
  ContactlessChip: 'contactless_chip',
  FallbackSwipe: 'fallback_swipe',
  ContactlessMSD: 'contactless_msd'
};
var _default = EntryMode;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/ErrorDomain.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Error Domains
 * @enum {int}
 */
var ErrorDomain = {
  /**
   * PaymentDevice
   */
  paymentDevice: 0,

  /**
   * Transaction
   */
  transaction: 1,

  /**
   * Merchant
   */
  merchant: 2,

  /**
   * Retail
   */
  retail: 3,

  /**
   * SDK
   */
  sdk: 4,

  /**
   * Network
   */
  network: 5
};
var _default = ErrorDomain;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/FormFactor.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * A payment form factor describes the process used by the consumer to
 * communicate payment credentials to the merchant.
 * @enum {int}
 */
var FormFactor = {
  /**
   * This value is returned if a given merchant and payment device share no
   * common accepted form factors.
   */
  None: 0,

  /**
   * The consumer (or merchant) swipes the consumer's magnetic card through a
   * magnetic card reader
   */
  MagneticCardSwipe: 1,

  /**
   * The consumer dips a card with a smart chip into a smart card reader (e.g. EMV Chip&PIN)
   */
  Chip: 2,

  /**
   * An EMV-certified contactless card is presented and read by an
   * EMV-certified contactless reader
   */
  EmvCertifiedContactless: 3,

  /**
   * A terminal capable of collecting and encrypting a manually entered
   * account number (aka PAN) was used to collect some or all of the
   * necessary information
   */
  SecureManualEntry: 4,

  /**
   * Unencrypted card number entered manually from an App/Terminal
   */
  ManualCardEntry: 5
};
var _default = FormFactor;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/MerchantError.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Merchant Error name to code
 * @enum {int}
 */
var MerchantError = {
  /**
   * Failed to load the merchant information
   */
  failedToLoad: 1,

  /**
   * Failed to load required merchant information
   */
  requiredInfoNotLoaded: 2,

  /**
   * Merchant not initialized
   */
  notInitialized: 3,

  /**
   * Access token or ClientId/Secret is missing from provided credentials
   */
  missingCredentials: 4,

  /**
   * Environment is missing from provided credentials
   */
  environmentNotProvided: 5,

  /**
   * Data required to create the merchant object are missing
   */
  merchantDataNotProvided: 6,

  /**
   * Failed to load required merchant user information
   */
  invalidMerchantUserInfo: 7,

  /**
   * Failed to load required merchant status information
   */
  invalidMerchantStatusInfo: 8,

  /**
   * The token is either invalid or missing
   */
  invalidToken: 9,

  /**
   * The token data to build the composite token is either invalid or missing
   */
  tokenDataNotProvided: 10,

  /**
   * Merchant not white listed to make offline payments
   */
  offlinePaymentIneligible: 11,

  /**
   * Online initialize required once before you can initialize offline
   */
  offlineInfoNotAvailable: 12,

  /**
   * Failed to load offline merchant information
   */
  failedToLoadOfflineMerchant: 13,

  /**
   * Failed to reload online merchant information
   */
  failedToReloadOnlineMerchant: 14,

  /**
   * merchantInitialized callback is missing
   */
  merchantInitializedCallbackNotProvided: 15,

  /**
   * The region is not eligible for the web feature
   */
  webFeatureNotEnabled: 16,

  /**
   * Merchant not white listed to make QRC payments
   */
  qrcIneligible: 17
};
var _default = MerchantError;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/PaymentTypes.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Payment Methods enum for Transaction Begin Options
 * @enum {int}
 */
var PaymentTypes = {
  /**
   * Payment type for card (credit / debit)
   */
  card: 0,

  /**
   * Payment type for Keyed In Card
   */
  keyIn: 1,

  /**
   * Payment type for cash
   */
  cash: 2,

  /**
   * Payment type for check
   */
  check: 3,

  /**
   * Payment type for Digital Card
   */
  digitalCard: 4,

  /**
   * Payment type for QRC
   */
  qrc: 5
};
var _default = PaymentTypes;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/ReaderConnectionType.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Indicates the channel through which the reader is connected.
 * @enum {int}
 */
var ReaderConnectionType = {
  /**
   * When the SDK failed to determine the connection channel.
   */
  unknown: 0,

  /**
   * When the SDK detects a reader connected to the audio jack.
   */
  audioJack: 1,

  /**
   * When the SDK detects a reader connected via bluetooth.
   */
  bluetooth: 2,

  /**
   * When the SDK detects a reader connected via dock port.
   */
  dockPort: 3,

  /**
   * When the SDK detects a reader connected via USB.
   */
  usb: 4,

  /**
   * When the SDK detects a reader connected via Network.
   */
  network: 5
};
var _default = ReaderConnectionType;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/ReaderModel.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Card reader model
 * @enum {int}
 */
var ReaderModel = {
  /**
   * Card reader model is not known
   */
  Unknown: 0,

  /**
   * ROAM Audio reader
   */
  Swiper: 1,

  /**
   * Miura M003
   */
  M003: 2,

  /**
   * Miura M010
   */
  M010: 3,

  /**
   * Ingenico MOBY 3000
   */
  Moby3000: 4,

  /**
   * Ingenico RP 450
   */
  RP450: 5,

  /**
   * Verifone E285
   */
  E285: 6,

  /**
   * Verifone P400
   */
  P400: 7,

  /**
   * Verifone Reader
   */
  Verifone: 8
};
var _default = ReaderModel;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/SdkError.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Sdk Error name to code
 * @enum {int}
 */
var SdkError = {
  /**
   * Action was cancelled by user
   */
  userCancelled: 1,

  /**
   * Unable to retrieve file from device storage
   */
  fileNotFound: 2,

  /**
   * The arguments passed are invalid
   */
  validationError: 3,

  /**
   * Card reader scanner not initialized
   */
  cardReaderScannerNotInitialized: 4,

  /**
   * No reader found
   */
  noReaderFound: 5,

  /**
   * Bluetooth disabled
   */
  bluetoothDisabled: 6,

  /**
   * User logout
   */
  logout: 7,

  /**
   * Selected reader unavailable
   */
  selectedReaderUnavailable: 8,

  /**
   * Multiple readers associated with the provided ReaderConfiguration
   */
  multipleReaders: 9,

  /**
   * An ongoing card reader selection can not be interrupted
   */
  selectionInProgress: 10,

  /**
   * Rapid successive calls
   */
  rapidSuccessiveCall: 11,

  /**
   * A card reader is already connected
   */
  readerAlreadyConnected: 12,

  /**
   * Stopping auto connect to start a new scan
   */
  stoppingAutoConnect: 13
};
var _default = SdkError;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/SimulatorUseCase.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Device Simulator Types
 * @enum {int}
 */
var SimulatorUseCase = {
  /**
   * Chip use case
   */
  CHIP: 0,

  /**
   * Swipe use case
   */
  SWIPE: 1,

  /**
   * Fallback swipe use case
   */
  FB_SWIPE: 2,

  /**
   * Contactless use case
   */
  CONTACTLESS: 3
};
var _default = SimulatorUseCase;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/StorageType.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;
var StorageType = {
  Secure: 'S',
  Blob: 'B',
  BlobDecoded: 'BD',
  String: 'V',
  SecureBlob: 'E'
};
var _default = StorageType;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/TransactionError.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Transaction Error name to code
 * @enum {int}
 */
var TransactionError = {
  /**
   * Transaction cancelled by customer
   */
  customerCancel: 1,

  /**
   * The transaction was cancelled
   */
  genericCancel: 2,

  /**
   * Cannot continue with specified card.
   */
  cardCantContinue: 3,

  /**
   * No functional devices.
   */
  noFunctionalDevices: 4,

  /**
   * The invoice status is not eligible for the given transaction method
   */
  invoiceStatusMismatch: 5,

  /**
   * The invoice amount was too low
   */
  amountTooLow: 6,

  /**
   * The invoice amount was too high
   */
  amountTooHigh: 7,

  /**
   * Failed to collect signature
   */
  failedToCollectSignature: 8,

  /**
   * Cannot swipe a chip card
   */
  cannotSwipeChipCard: 9,

  /**
   * Must swipe the card
   */
  mustSwipeCard: 10,

  /**
   * Card presented for refund is not the one used for the original payment
   */
  refundCardMismatch: 11,

  /**
   * Presented card is not of the expected type
   */
  cardTypeMismatch: 12,

  /**
   * Unable to retrieve location information
   */
  locationError: 13,

  /**
   * Invoice ID is required to complete this refund.
   */
  missingInvoiceId: 14,

  /**
   * Transaction number or invoice id is required to complete this refund.
   */
  missingTransactionNumberOrInvoiceId: 15,

  /**
   * Cannot discard the presented card
   */
  cannotDiscardCard: 16,

  /**
   * Multiple Contactless Cards Detected.
   */
  multipleContactlessCardsDetected: 17,

  /**
   * Try different interface
   */
  tryDifferentInterface: 18,

  /**
   * Cannot clear transaction when payment is in progress
   */
  cannotClearActiveTransaction: 19,

  /**
   * The authorization request has failed
   */
  authorizationFailed: 20,

  /**
   * The capture request has failed
   */
  captureFailed: 21,

  /**
   * Authorization is not possible on this payment mode
   */
  invalidAuthorization: 22,

  /**
   * Unable to retrieve list of authorizations
   */
  retrieveAuthListFailed: 23,

  /**
   * Unable to void the authorization
   */
  voidFailed: 24,

  /**
   * Current operation not supported
   */
  notSupported: 25,

  /**
   * Validation failed for payment capture
   */
  captureValidationFailed: 26,

  /**
   * Validation failed for retrieving list of authorized transactions
   */
  authRetrieveValidationFailed: 27,

  /**
   * Not allowed to have an invalid item in the invoice item list
   */
  invalidInvoiceItem: 28,

  /**
   * Offline Payment Enabled
   */
  offlinePaymentEnabled: 29,

  /**
   * Offline Payment Transaction Limit Reached
   */
  offlineTxnLimit: 30,

  /**
   * Offline Payment Total Limit Reached
   */
  offlineTotalLimit: 31,

  /**
   * Offline Payment Mode is not available for Audio Readers
   */
  noAudioReaderWhenOffline: 32,

  /**
   * NFC Contactless Limit Reached
   */
  nfcContactlessLimitReached: 33,

  /**
   * Offline Payment Stopped
   */
  offlinePaymentStopped: 34,

  /**
   * Offline Payment key in is not allowed
   */
  offlinePaymentKeyinNotAllowed: 35,

  /**
   * Pay and Vault payment failed
   */
  payAndVaultFailed: 36,

  /**
   * Vault failed
   */
  vaultFailed: 37,

  /**
   * Failed to load invoice
   */
  invoiceLoadFailed: 38,

  /**
   * Missing transaction number
   */
  missingTransactionNumber: 39,

  /**
   * transaction failed due to outage
   */
  failedDueToOutage: 40,

  /**
   * QRC session timed out
   */
  qrcSessionTimeOut: 41,

  /**
   * QRC polling failed
   */
  qrcPollingFailed: 42,

  /**
   * Cannot clear transaction after QR code is scanned
   */
  cannotCancelActiveQrcTransaction: 43,

  /**
   * Failed to get the QRC service provider
   */
  failedQRCServiceProvider: 44,

  /**
   * Failed to generate the QRC URL
   */
  failedQRCUrlGeneration: 45,

  /**
   * Failed the QRC payment
   */
  failedQRC: 46,

  /**
   * declined the QRC payment
   */
  declinedQRC: 47,

  /**
   * Failed to get the QRC referrer(BN) code
   */
  failedQRCReferrerCode: 48,

  /**
   * transaction cancelled by merchant
   */
  merchantCancel: 49,

  /**
   * cannot Cancel inflight transaction
   */
  cancellationFailure: 50,

  /**
   * Missing digital card redemption information
   */
  missingDigitalCardRedemption: 51
};
var _default = TransactionError;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/TransactionTypeFlag.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Indicates the type of the transaction
 * @enum {int}
 */
var TransactionTypeFlag = {
  /**
   * A Sale transaction
   */
  sale: 1,

  /**
   * An Auth transaction
   */
  auth: 2,

  /**
   * A Vault transaction
   */
  vault: 4,

  /**
   * A Refund transaction
   */
  refund: 8,

  /**
   * A QuickChip transaction
   */
  quickChip: 16
};
var _default = TransactionTypeFlag;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/index.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

_Object$defineProperty(exports, "BatteryStatus", {
  enumerable: true,
  get: function get() {
    return _BatteryStatus2["default"];
  }
});

_Object$defineProperty(exports, "CardIssuer", {
  enumerable: true,
  get: function get() {
    return _CardIssuer2["default"];
  }
});

_Object$defineProperty(exports, "DeviceError", {
  enumerable: true,
  get: function get() {
    return _DeviceError2["default"];
  }
});

_Object$defineProperty(exports, "DeviceManufacturer", {
  enumerable: true,
  get: function get() {
    return _DeviceManufacturer2["default"];
  }
});

_Object$defineProperty(exports, "EntryMode", {
  enumerable: true,
  get: function get() {
    return _EntryMode2["default"];
  }
});

_Object$defineProperty(exports, "ErrorDomain", {
  enumerable: true,
  get: function get() {
    return _ErrorDomain2["default"];
  }
});

_Object$defineProperty(exports, "FormFactor", {
  enumerable: true,
  get: function get() {
    return _FormFactor2["default"];
  }
});

_Object$defineProperty(exports, "MerchantError", {
  enumerable: true,
  get: function get() {
    return _MerchantError2["default"];
  }
});

_Object$defineProperty(exports, "PaymentTypes", {
  enumerable: true,
  get: function get() {
    return _PaymentTypes2["default"];
  }
});

_Object$defineProperty(exports, "ReaderConnectionType", {
  enumerable: true,
  get: function get() {
    return _ReaderConnectionType2["default"];
  }
});

_Object$defineProperty(exports, "ReaderModel", {
  enumerable: true,
  get: function get() {
    return _ReaderModel2["default"];
  }
});

_Object$defineProperty(exports, "SdkError", {
  enumerable: true,
  get: function get() {
    return _SdkError2["default"];
  }
});

_Object$defineProperty(exports, "SimulatorUseCase", {
  enumerable: true,
  get: function get() {
    return _SimulatorUseCase2["default"];
  }
});

_Object$defineProperty(exports, "StorageType", {
  enumerable: true,
  get: function get() {
    return _StorageType2["default"];
  }
});

_Object$defineProperty(exports, "TransactionError", {
  enumerable: true,
  get: function get() {
    return _TransactionError2["default"];
  }
});

_Object$defineProperty(exports, "TransactionTypeFlag", {
  enumerable: true,
  get: function get() {
    return _TransactionTypeFlag2["default"];
  }
});

var _BatteryStatus2 = _interopRequireDefault(require("./BatteryStatus"));

var _CardIssuer2 = _interopRequireDefault(require("./CardIssuer"));

var _DeviceManufacturer2 = _interopRequireDefault(require("./DeviceManufacturer"));

var _EntryMode2 = _interopRequireDefault(require("./EntryMode"));

var _FormFactor2 = _interopRequireDefault(require("./FormFactor"));

var _ReaderConnectionType2 = _interopRequireDefault(require("./ReaderConnectionType"));

var _ReaderModel2 = _interopRequireDefault(require("./ReaderModel"));

var _SimulatorUseCase2 = _interopRequireDefault(require("./SimulatorUseCase"));

var _StorageType2 = _interopRequireDefault(require("./StorageType"));

var _TransactionTypeFlag2 = _interopRequireDefault(require("./TransactionTypeFlag"));

var _PaymentTypes2 = _interopRequireDefault(require("./PaymentTypes"));

var _DeviceError2 = _interopRequireDefault(require("./DeviceError"));

var _ErrorDomain2 = _interopRequireDefault(require("./ErrorDomain"));

var _TransactionError2 = _interopRequireDefault(require("./TransactionError"));

var _SdkError2 = _interopRequireDefault(require("./SdkError"));

var _MerchantError2 = _interopRequireDefault(require("./MerchantError"));
},{"./BatteryStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/BatteryStatus.js","./CardIssuer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/CardIssuer.js","./DeviceError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/DeviceError.js","./DeviceManufacturer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/DeviceManufacturer.js","./EntryMode":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/EntryMode.js","./ErrorDomain":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/ErrorDomain.js","./FormFactor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/FormFactor.js","./MerchantError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/MerchantError.js","./PaymentTypes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/PaymentTypes.js","./ReaderConnectionType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/ReaderConnectionType.js","./ReaderModel":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/ReaderModel.js","./SdkError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/SdkError.js","./SimulatorUseCase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/SimulatorUseCase.js","./StorageType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/StorageType.js","./TransactionError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/TransactionError.js","./TransactionTypeFlag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/TransactionTypeFlag.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/BatteryInfo.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _batteryStatus = _interopRequireDefault(require("./batteryStatus"));

/**
 * BatteryInfo class contains information about the health of the device battery
 * and the instant it was measured
 * @class
 * @property {int} percentage The level of battery in percentage @readonly
 * @property {bool} isCharging Indicates that the device battery is charging or charged @readonly
 * @property {bool} isLevelCritical Indicates that the device battery is at Critical or less and not charging @readonly
 * @property {bool} isLevelUpdateCritical Indicates that the device battery is at UpdateCritical or less and not charging @readonly
 * @property {Date} measuredOn The time the battery information was retrieved @readonly
 * @property {batteryStatus} status Status of the battery @readonly
 */
var BatteryInfo = /*#__PURE__*/function () {
  /**
   * Create a new Battery info object
   * @param {int} percentage The level of battery in percentage
   * @param {Date} measuredOn Time stamp at which the battery measurement was received
   * @param {batteryStatus} status Battery status
   */
  function BatteryInfo(percentage, measuredOn, status) {
    (0, _classCallCheck2["default"])(this, BatteryInfo);
    this._percentage = (0, _parseInt2["default"])(percentage, 10);
    this._measuredOn = measuredOn;
    this._status = status;
    this._batteryInfoJSON = {
      percentage: this._percentage,
      status: _batteryStatus["default"].keyFromValue[this._status],
      measuredOn: this._measuredOn
    };
  }

  (0, _createClass2["default"])(BatteryInfo, [{
    key: "percentage",
    get: function get() {
      return this._percentage;
    }
  }, {
    key: "isCharging",
    get: function get() {
      return this._status === _batteryStatus["default"].charging || this._status === _batteryStatus["default"].charged;
    }
  }, {
    key: "isLevelUpdateCritical",
    get: function get() {
      return !this.isCharging && this._percentage <= 20;
    }
  }, {
    key: "isLevelCritical",
    get: function get() {
      return !this.isCharging && this._percentage <= 15;
    }
  }, {
    key: "measuredOn",
    get: function get() {
      return this._measuredOn;
    }
  }, {
    key: "status",
    get: function get() {
      return this._status;
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return this._batteryInfoJSON;
    }
  }, {
    key: "toString",
    value: function toString() {
      return "BatteryInfo: ".concat((0, _stringify["default"])(this, null, 2));
    }
  }]);
  return BatteryInfo;
}();

exports["default"] = BatteryInfo;
},{"./batteryStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/batteryStatus.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardDataUtil.js":[function(require,module,exports){
"use strict";

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.function.name.js");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.replace.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _lodash = _interopRequireDefault(require("lodash"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _CardIssuer = _interopRequireDefault(require("./CardIssuer"));

var _SupportedEmvAid = _interopRequireDefault(require("./SupportedEmvAid"));

var _context, _context2, _context3, _context4, _context5, _context6;

function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }

function _unsupportedIterableToArray(o, minLen) { var _context7; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context7 = Object.prototype.toString.call(o)).call(_context7, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

var digitsOnlyRegexMatcher = null;
var Log = (0, _manticoreLog["default"])('card-issuer');

function intersection(setA, setB) {
  var _intersection = new _set["default"]();

  var _ref = setA.size > setB.size ? {
    smallerSet: setB,
    biggerSet: setA
  } : {
    smallerSet: setA,
    biggerSet: setB
  },
      smallerSet = _ref.smallerSet,
      biggerSet = _ref.biggerSet;

  var _iterator = _createForOfIteratorHelper(smallerSet),
      _step;

  try {
    for (_iterator.s(); !(_step = _iterator.n()).done;) {
      var elem = _step.value;

      if (biggerSet.has(elem)) {
        _intersection.add(elem);
      }
    }
  } catch (err) {
    _iterator.e(err);
  } finally {
    _iterator.f();
  }

  return _intersection;
}

function _checkIf() {
  var controlNumbers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new _set["default"]([]);
  var isInThis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new _set["default"]([]);
  var andIsNotInThis = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new _set["default"]([]);

  if (!controlNumbers) {
    return false;
  }

  return intersection(controlNumbers, isInThis).size > 0 && intersection(controlNumbers, andIsNotInThis).size === 0;
}

var CardDataUtil = /*#__PURE__*/function () {
  function CardDataUtil() {
    (0, _classCallCheck2["default"])(this, CardDataUtil);
  }

  (0, _createClass2["default"])(CardDataUtil, null, [{
    key: "getCardIssuerFromEmvAppLabel",
    value:
    /**
     * Identify card issuer from the value of Application label TLV Tag
     * @param emvAppLabel string Application label TLV tag value
     * @returns {CardIssuer|int}
     */
    function getCardIssuerFromEmvAppLabel(emvAppLabel) {
      if (!emvAppLabel) {
        return _CardIssuer["default"].Unknown;
      }

      var appLabel = emvAppLabel.toUpperCase();

      if ((0, _includes["default"])(appLabel).call(appLabel, 'VISA')) {
        return _CardIssuer["default"].Visa;
      }

      if ((0, _includes["default"])(appLabel).call(appLabel, 'MASTERCARD')) {
        return _CardIssuer["default"].MasterCard;
      }

      if ((0, _includes["default"])(appLabel).call(appLabel, 'MAESTRO')) {
        return _CardIssuer["default"].Maestro;
      }

      if ((0, _includes["default"])(appLabel).call(appLabel, 'AMERICAN')) {
        return _CardIssuer["default"].Amex;
      }

      if ((0, _includes["default"])(appLabel).call(appLabel, 'DISCOVER')) {
        return _CardIssuer["default"].Discover;
      }

      if ((0, _includes["default"])(appLabel).call(appLabel, 'PAYPAL')) {
        return _CardIssuer["default"].PayPal;
      }

      Log.warn("Unable to parse Card issuer from Application Label: ".concat(emvAppLabel));
      return _CardIssuer["default"].Unknown;
    }
    /**
     * Identify card issuer from the value of Application Identifier TLV Tag
     * @param EMVAID string Application Identifier TLV tag value
     * @returns {CardIssuer|int}
     */

  }, {
    key: "getCardIssuerFromEmvAID",
    value: function getCardIssuerFromEmvAID(EMVAID) {
      return _SupportedEmvAid["default"][EMVAID] || _CardIssuer["default"].Unknown;
    }
    /**
     * Identify card issuer from the card number
     * @param cardNumberInfo string
     * @returns {CardIssuer|int}
     */

  }, {
    key: "getCardIssuerFromCardNumber",
    value: function getCardIssuerFromCardNumber(cardNumberInfo) {
      if (!digitsOnlyRegexMatcher) {
        digitsOnlyRegexMatcher = /\D+/;
      }

      var cardNumber = cardNumberInfo.replace(digitsOnlyRegexMatcher, '');
      var issuer = _CardIssuer["default"].Unknown;
      var cardNumberSet = new _set["default"]([(0, _parseInt2["default"])(cardNumber.substr(0, 1), 10), (0, _parseInt2["default"])(cardNumber.substr(0, 2), 10), (0, _parseInt2["default"])(cardNumber.substr(0, 3), 10), (0, _parseInt2["default"])(cardNumber.substr(0, 4), 10), (0, _parseInt2["default"])(cardNumber.substr(0, 6), 10)]);

      _lodash["default"].forOwn(CardDataUtil._controlNumber, function (value) {
        if (_checkIf(cardNumberSet, value.inNumbers, value.notInNumbers)) {
          // eslint-disable-next-line prefer-destructuring
          issuer = value.issuer;
        }
      });

      return issuer;
    }
    /**
     * Get the display name for card issuer
     * @param cardIssuer
     * @returns {string}
     */

  }, {
    key: "getCardIssuerDisplayName",
    value: function getCardIssuerDisplayName(cardIssuer) {
      for (var issuerName in _CardIssuer["default"]) {
        if ({}.hasOwnProperty.call(_CardIssuer["default"], issuerName) && typeof _CardIssuer["default"] !== 'function' && _CardIssuer["default"][issuerName] === cardIssuer) {
          return issuerName;
        }
      }

      return null;
    }
  }]);
  return CardDataUtil;
}();
/**
 * Card issuer control numbers
 */


exports["default"] = CardDataUtil;
CardDataUtil._controlNumber = {
  AmericanExpress: {
    issuer: _CardIssuer["default"].Amex,
    inNumbers: new _set["default"]([34, 37]),
    notInNumbers: new _set["default"]([]),
    country: new _set["default"](['US', 'AU'])
  },
  Discover: {
    issuer: _CardIssuer["default"].Discover,
    inNumbers: new _set["default"]((0, _concat["default"])(_context = (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = (0, _concat["default"])(_context4 = (0, _concat["default"])(_context5 = _lodash["default"].range(601100, 601111)).call(_context5, _lodash["default"].range(601120, 601150))).call(_context4, 601174)).call(_context3, _lodash["default"].range(601177, 601180))).call(_context2, _lodash["default"].range(601186, 601200))).call(_context, _lodash["default"].range(644000, 660000))),
    notInNumbers: new _set["default"]([]),
    country: new _set["default"](['US'])
  },
  Maestro: {
    issuer: _CardIssuer["default"].Maestro,
    inNumbers: new _set["default"]([5018, 5020, 5038, 5893, 6304, 6759, 6761, 6762, 6763]),
    notInNumbers: new _set["default"]([]),
    country: new _set["default"](['GB'])
  },
  MasterCard: {
    issuer: _CardIssuer["default"].MasterCard,
    inNumbers: new _set["default"]((0, _concat["default"])(_context6 = [51, 52, 53, 54, 55]).call(_context6, _lodash["default"].range(222100, 272100))),
    notInNumbers: new _set["default"]([]),
    country: new _set["default"](['US', 'GB', 'AU'])
  },
  Visa: {
    issuer: _CardIssuer["default"].Visa,
    inNumbers: new _set["default"]([4]),
    notInNumbers: new _set["default"]([4026, 417500, 4508, 4844, 4913, 4917]),
    // Visa Electron
    country: new _set["default"](['US', 'GB', 'AU'])
  }
};
},{"./CardIssuer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardIssuer.js","./SupportedEmvAid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/SupportedEmvAid.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.function.name.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.function.name.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.string.replace.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardInsertedHandler.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

/**
 * When card insert is detected during a transaction, the registered listener with be invoked with this handler method
 * @class
 */
var CardInsertedHandler = /*#__PURE__*/function () {
  function CardInsertedHandler(cb) {
    (0, _classCallCheck2["default"])(this, CardInsertedHandler);
    this._cb = cb;
  }
  /**
   * Continue to read EMV data from inserted card
   */


  (0, _createClass2["default"])(CardInsertedHandler, [{
    key: "continueWithCardDataRead",
    value: function continueWithCardDataRead() {
      this._cb();
    }
    /**
     * Dismiss any SDK UI Dialog that would be displayed at the time this handler is invoked
     */

  }, {
    key: "dismissSDKUIPrompt",
    value: function dismissSDKUIPrompt() {}
  }]);
  return CardInsertedHandler;
}();

exports["default"] = CardInsertedHandler;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardIssuer.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _manticoreUtil = require("manticore-util");

/**
 * Issuer of the card that was presented to the SDK
 * @enum {int}
 */
var CardIssuer = {
  /**
   * Unknown card issuer
   */
  Unknown: 0,

  /**
   * Visa credit/prepaid
   */
  Visa: 1,

  /**
   * Master card
   */
  MasterCard: 2,

  /**
   * Maestro
   */
  Maestro: 3,

  /**
   * American Express
   */
  Amex: 4,

  /**
   * Discover
   */
  Discover: 5,

  /**
   * PayPal
   */
  PayPal: 6
};
CardIssuer.keyFromValue = (0, _manticoreUtil.reverseKeysAndValues)(CardIssuer);
var _default = CardIssuer;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardReader.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _events = require("events");

var _TransactionType = _interopRequireDefault(require("./TransactionType"));

var _FormFactor = _interopRequireDefault(require("./FormFactor"));

var _BatteryInfo = _interopRequireDefault(require("./BatteryInfo"));

var _CardIssuer = _interopRequireDefault(require("./CardIssuer"));

var _NumericEntryType = _interopRequireDefault(require("./NumericEntryType"));

var _appMessage = _interopRequireDefault(require("./appMessage"));

var _SecureEntryOptions = _interopRequireDefault(require("./SecureEntryOptions"));

var _NumericEntryOptions = _interopRequireDefault(require("./NumericEntryOptions"));

var _DeviceUpdate = _interopRequireDefault(require("./DeviceUpdate"));

var _readerInformation = require("./readerInformation");

var _CardPresentEvent = _interopRequireDefault(require("./Messages/CardPresentEvent"));

var _paymentDeviceError = require("./paymentDeviceError");

var _PinEvent = _interopRequireDefault(require("./Messages/PinEvent"));

var _Card = _interopRequireDefault(require("./Messages/Card"));

var _AvailableApplications = _interopRequireDefault(require("./Messages/AvailableApplications"));

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

/**
 * The Card Reader interface lists the functions that needs to be implemented by a payment device in order to fully
 * integrate with PayPal Here SDK. This interface is partially implemented by the {PaymentDevice} class and any new
 * payment device that is provisioned should inherit {PaymentDevice} and not {CardReader}
 * @class
 * @property {CardReader~appInterface} app Interface to app components
 * @property {CardReader~nativeInterface} native Interface to native components
 * @property {readerConnectionType} connectionType Indicates card reader connection type
 * @property {string} serialNumber Unique serial number of the card reader
 * @property {DeviceUpdate} pendingUpdate Pending software update for the card reader (if any)
 * @property {BatteryInfo} batteryInfo Most recent battery information of the card reader
 */
var CardReader = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(CardReader, _EventEmitter);

  var _super = _createSuper(CardReader);

  function CardReader() {
    (0, _classCallCheck2["default"])(this, CardReader);
    return _super.apply(this, arguments);
  }

  (0, _createClass2["default"])(CardReader, [{
    key: "beginDeviceRemoved",
    value:
    /**
     * Start the device removing process.
     * @method
     * @param {CardReader~callback} callback A callback function that should be invoked on completion of removed flow.
     */
    function beginDeviceRemoved(callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Start the device pairing/connection process. After a successful connection, the device should be
     * ready to take payments
     * @method
     * @param {CardReader~callback} callback A callback function that should be invoked on completion of connection flow.
     */

  }, {
    key: "beginDeviceConnect",
    value: function beginDeviceConnect(callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Disconnect the card reader. The device should no longer be able to take payments after a successful disconnect
     * @param {CardReader~callback} callback A callback function that will be invoked on completion of disconnection flow.
     */

  }, {
    key: "beginDeviceDisconnect",
    value: function beginDeviceDisconnect(callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Get supported formFactors for this device
     * @return {[FormFactor]} List of payment form factors supported by the card reader
     */

  }, {
    key: "formFactors",
    get: function get() {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Receive data stream from the card reader
     * @param {Object} data from the reader in some device specific format
     */

  }, {
    key: "received",
    value: function received(data) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Display a predefined message on the terminal, if supported
     * @param {CardReader~readerDisplayArgs} opt Message display options
     * @param {CardReader~callback} callback Callback function to invoke after the message is displayed
     */

  }, {
    key: "display",
    value: function display(opt, callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Retrieve the firmware version information on the reader
     * @param {CardReader~getVersionCallback} callback Callback function that is called with the reader firmware version information.
     */

  }, {
    key: "getFirmwareVersionInfo",
    value: function getFirmwareVersionInfo(callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Retrieve operations logs from the card reader
     * @param {CardReader~deviceLogsCallback} callback A callback to invoke after the logs are extracted. Invoked with {Error, string}
     */

  }, {
    key: "extractReaderLogs",
    value: function extractReaderLogs(callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Activate the card reader to take payment. {CardReader#cardPresented} event should be emitted after the card was
     * presented. Based on the type of card that was presented, this event can be invoked more than once. For e.g., for pin present
     * transactions, more than one event will be emitted for PIN presented status change followed by card data read event.
     * The card reader should also emit {PaymentDevice.Message.Cancelled} & {PaymentDevice.Message.CancelRequested} events
     * for cancellations and cancel requests that are initiated from the card reader. For e.g. pressing cancel button from
     * the card reader during an active payment
     * Note: Should invoke super.activateForPayment while extending from Abstract {PaymentDevice} class that implements this interface
     * @param {TransactionContext} context Transaction context
     * @param {[FormFactor]} formFactors List of form factors to enable for this transaction
     * @param {bool} showPrompt true to display a prompt on the card reader's display (depends on hardware support)
     */

  }, {
    key: "activateForPayment",
    value: function activateForPayment(context, formFactors, showPrompt) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Select payment application from the presented card. {CardPresentEvent#cardDataRead} event should be emitted after the
     * application is selected
     * @param {string} appId Id of the selected Application
     * @param {Card} card The card that was presented
     */

  }, {
    key: "selectPaymentApplication",
    value: function selectPaymentApplication(appId, card) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Complete an ongoing transaction by pushing the auth code to the reader
     * @param {string} authCode The auth-code from the payments API that needs to be pushed to the reader
     * @param {CardReader~callback} callback Callback function to invoke after completing the transaction
     */

  }, {
    key: "completeTransaction",
    value: function completeTransaction(authCode, callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Deactivate an active transaction. Can be called anytime after from activating card reader and before completing the payment.
     * {PaymentDevice.Event.cancelled} event should be emitted after the transaction is cancelled
     * Note: Should invoke super.abortTransaction while extending from Abstract {PaymentDevice} class that implements this interface
     * @param {TransactionContext} context Transaction context
     * @param {CardReader~callback} callback Callback function to invoke after the the reader is deactivated
     */

  }, {
    key: "abortTransaction",
    value: function abortTransaction(context) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Deactivate contactless reader
     * @param {[FormFactor]} formFactors Form factors to deactivate
     * @param {CardReader~callback} callback
     */

  }, {
    key: "deactivateFormFactors",
    value: function deactivateFormFactors(formFactors, callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Begin listen for card removal events
     * @param {CardReader~callback} callback
     */

  }, {
    key: "listenForCardRemoval",
    value: function listenForCardRemoval(callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * This function will be invoked after completion of a transaction (for both successful and declined transactions) and
     * before beginning a subsequent transaction. A post transaction action (like soft resetting the card reader state
     * in-between transactions) should be performed here
     * @param {CardReader~callback} callback
     */

  }, {
    key: "postTransactionCleanup",
    value: function postTransactionCleanup(callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Retrieve battery information from the reader
     * @param {CardReader~batteryInfo} callback Callback function to invoke after retrieving the battery info
     */

  }, {
    key: "getBatteryInfo",
    value: function getBatteryInfo(callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Query whether battery info is supported on this device
     * Override in implementations where battery info is not supported to return false
     * @returns {boolean} Returns true if supported
     */

  }, {
    key: "isBatteryInfoSupported",
    value: function isBatteryInfoSupported() {
      return true;
    }
    /**
     * Prompt for a non-secure amount or numeric value to be entered.
     * @param {NumericEntryOptions} options Options governing numeric entry
     * @param {NumericEntryOptions~amountEntered} callback Called when the attempt completes
     */

  }, {
    key: "promptForNumericEntry",
    value: function promptForNumericEntry(options, callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Get a secure Personal Account Number (PAN) from the device
     * @param {SecureEntryOptions} options
     * @param {SecureEntryOptions~secureEntry} callback
     */

  }, {
    key: "promptForSecureAccountNumber",
    value: function promptForSecureAccountNumber(options, callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Gets the device version information
     * @method
     * @returns {object} Returns key-value pair of version type and value.
     */

  }, {
    key: "getVersionInfo",
    value: function getVersionInfo() {
      throw new Error('Subclass must implement this method');
    }
  }]);
  return CardReader;
}(_events.EventEmitter);
/**
 * @callback CardReader~callback
 * @param {Error} error Error object if any
 */

/**
 * @callback CardReader~getVersionCallback
 * @param {Error} error Error object if any
 * @param {[Object.<string, string>]} versionInfo Version information in
 * { component_1_VersionName:value, component_2_VersionName:value, ... } format
 * @param {function} versionInfo.toString Version information that will be displayed to the user
 */

/**
 * @callback CardReader~deviceLogsCallback
 * @param {Error} error Error object if any
 * @param {string} logs Device logs
 */

/**
 * @callback CardReader~batteryInfo
 * @param {Error} error Error object if any
 * @param {BatteryInfo} batteryInfo Battery information from the card reader
 */

/**
 * @callback CardReader~swUpdateUrlCallback
 * @param {Error} error Error object if any
 * @param {string} logs URL to retrieve software update instructions
 */

/**
 * @typedef {function} CardReader~getSwUpdateUrl
 * @param {deviceManufacturer} deviceManufacturer Manufacturer of the device
 * @param {string} deviceModel Model of the device e.g., m010
 * @param {CardReader~swUpdateUrlCallback} callback
 */

/**
 * The interface to App. This is also an event emitter that could be subscribed for events like 'merchantInitialized'
 * @typedef {Object} CardReader~appInterface
 * @property {CardReader~appDisplay} display Update the App UI
 * @property {CardReader~getSwUpdateUrl} getSwUpdateUrl Get the URL to retrieve software update instructions for the card reader
 * @property {Object} getMerchant Returns the merchant account that is currently active
 */

/**
 * Connect the card reader over Bluetooth, USB or audiojack to the physical device on which the SDK is running. The SDK should be
 * able to send and receive data from the card reader after a successful connection
 * @typedef {function} CardReader~nativeConnect
 * @param {CardReader~callback}
 */

/**
 * Disconnect a card reader (previously connected over Bluetooth, USB or audiojack) from the device on which the SDK is
 * running. The card reader should not respond to data requests from the SDK after a successful disconnect
 * @typedef {function} CardReader~nativeDisconnect
 * @param {CardReader~callback}
 */

/**
 * Send a stream of data to a connected card reader
 * @typedef {function} CardReader~nativeSend
 * @param {Object} data Data to be streamed in a format specific to the reader
 * @param {CardReader~callback}
 */

/**
 * @typedef {Object} CardReader~nativeInterface
 * @property {function} isConnected Indicates if the card reader is connected to the device
 * @property {CardReader~nativeConnect} connect Establish a connection with the card reader
 * @property {CardReader~nativeDisconnect} disconnect Disconnect a card reader
 * @property {CardReader~nativeSend} send Send a stream of data to a connected card reader
 */

/**
 * @typedef {function} CardReader~appDisplay
 * @param {CardReader~appDisplayArgs} args Alert configuration options
 * @param {CardReader~appDisplayCallback} Callback invoked when user takes action
 * @returns {AlertViewHandle} alert Handle to the alert view
 */

/**
 * @typedef {Object} CardReader~appDisplayArgs
 * @property {appMessage} id Id of the message to be displayed
 * @property {Object} substitutions Substitution values for string literals
 * @property {boolean} showActivity Show a progress bar
 */

/**
 * @callback CardReader~appDisplayCallback
 * @param {AlertViewHandle} alert Handle to the alert view
 * @param {index} index Index to the button that was clicked
 */

/**
 * @typedef {Object} AlertViewHandle
 * @param {function} dismiss Dismiss the alert view
 * @param {function} setTitle Set the title on the alert view
 * @param {function} setMessage Set the message on the alert view
 */

/**
 * @typedef {Object} TransactionContext
 * @property {TransactionType} type Transaction type
 * @property {Invoice} invoice The invoice for this transaction
 */

/**
 * @typedef {Object} Invoice
 * @property {number} total The total amount due on invoice
 * @property {string} currency The currency for all amounts on this invoice
 */

/**
 * @typedef {Object} CardReader~readerDisplayArgs
 * @property {PaymentDevice.Message} id The message to display
 * @property {Object} substitutions values to replace in the string
 * @property {boolean} displaySystemIcons Show/Hide system status icon row on the card reader display
 */

/**
 * A card was presented to the card reader,
 * @event CardReader#cardPresented
 * @param {Error} error Error object (if any)
 * @param {CardPresentEvent} type The type of card present event
 * @param {FormFactor} formFactor Form factor by which the card was presented
 * @param {CardReader~CardData|PinEvent|AvailableApplications} result
 */

/**
 * @typedef {Object} CardReader~CardData
 * @property {Card} card Presented card
 * @property {boolean} approvedOffline Indicates if transaction was approved offline
 */

/* eslint-enable no-unused-vars */


exports["default"] = CardReader;
},{"./BatteryInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/BatteryInfo.js","./CardIssuer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardIssuer.js","./DeviceUpdate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/DeviceUpdate.js","./FormFactor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/FormFactor.js","./Messages/AvailableApplications":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/AvailableApplications.js","./Messages/Card":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/Card.js","./Messages/CardPresentEvent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/CardPresentEvent.js","./Messages/PinEvent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/PinEvent.js","./NumericEntryOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/NumericEntryOptions.js","./NumericEntryType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/NumericEntryType.js","./SecureEntryOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/SecureEntryOptions.js","./TransactionType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/TransactionType.js","./appMessage":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/appMessage.js","./paymentDeviceError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/paymentDeviceError.js","./readerInformation":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/readerInformation.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardStatus.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * The current status of the contact based card reader
 * @enum {int}
 */
var CardStatus = {
  /**
   * There is no card inserted in the reader.
   */
  None: 0,

  /**
   * A card is inserted in the reader but it is not EMV
   */
  NonEmvCard: 1,

  /**
   * An EMV card is inserted in the reader
   */
  EmvCard: 3
};
var _default = CardStatus;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CommandBuilder.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _FormFactor = _interopRequireDefault(require("./FormFactor"));

var _TransactionType = _interopRequireDefault(require("./TransactionType"));

/* eslint-disable no-unused-vars */

/**
 *  CommandBuilder provides an interface for building commands that the PayPal Here SDK would send to a connected card
 *  reader during transaction, software update or connection flow. The commands returned by the implementing class can be
 *  in APDU or any other format that is specific to the card reader.
 *  @interface
 */
var CommandBuilder = /*#__PURE__*/function () {
  function CommandBuilder() {
    (0, _classCallCheck2["default"])(this, CommandBuilder);
  }

  (0, _createClass2["default"])(CommandBuilder, [{
    key: "startTransactionCmd",
    value:
    /**
     * Activate the card reader to accept payments
     * @param {[FormFactor]} formFactors List of form factors to enable for this transaction
     * @param {TransactionCommandOptions} opt Additional options to start the transaction
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */
    function startTransactionCmd(formFactors, opt, callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Complete an ongoing transaction by pushing the auth code to the reader
     * @param {string} authCode The auth-code from the payments API which needs to be pushed to the reader
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "completeTransactionCmd",
    value: function completeTransactionCmd(authCode, callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Select an application on the presented card
     * @param {string} aid Identifier for the selected application
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "selectApplication",
    value: function selectApplication(aid) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Display a predefined message on the card reader, if supported
     * @param {displayOptions} opt Message display options
     * @param {Object} substitutions values to replace in the string
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "displayMessageCmd",
    value: function displayMessageCmd(opt, substitutions) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Clear any active transaction
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "clearTransactionCmd",
    value: function clearTransactionCmd(callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Restart the card reader
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "restartCmd",
    value: function restartCmd() {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Retrieve the firmware version information on the reader
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "getVersionInfoCmd",
    value: function getVersionInfoCmd() {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Abort an active transaction
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "abortTransactionCmd",
    value: function abortTransactionCmd(callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Retrieve the battery level on the card reader
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "getBatterLevelCmd",
    value: function getBatterLevelCmd() {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Put the connected reader in key entry mode to receive numeric values as entered on the card reader's
     * keypad
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "promptForNumericEntry",
    value: function promptForNumericEntry() {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Put the connected reader in key entry mode to receive secure account number as entered on the card reader's
     * keypad
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "promptForSecureAccountNumber",
    value: function promptForSecureAccountNumber() {
      throw new Error('Subclass must implement this method');
    }
  }, {
    key: "removeCardCmd",
    value: function removeCardCmd(callback) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Retrieve form factors supported by the connected card reader
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "getSupportedFormFactorsCmd",
    value: function getSupportedFormFactorsCmd() {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Retrieve a file from a connected reader
     * @param {string} fileName Name of the file to be retrieved
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "getFile",
    value: function getFile(fileName) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Remove a file that is physically present on the connected reader
     * @param {string} fileName Name of the file to be removed
     * @returns {Object} Command in the format specific to the card reader or null if the command is not supported on the reader
     */

  }, {
    key: "removeFile",
    value: function removeFile(fileName) {
      throw new Error('Subclass must implement this method');
    }
    /**
     * Push a chunk of data to the card reader
     * @param {StreamBinaryOptions} opt Common options to build the command
     */

  }, {
    key: "streamBinary",
    value: function streamBinary(opt) {
      throw new Error('Subclass must implement this method');
    }
  }]);
  return CommandBuilder;
}();
/**
 * @typedef {Object} transactionOptions
 * @property {PaymentDevice.Message} messageId The message to display
 * @property {boolean} displaySystemIcons Show/Hide system status icon row on the card reader display
 */

/**
 * @typedef {Object} TransactionCommandOptions
 * @property {TransactionType} type Transaction type
 * @property {number} sequenceNumber Transaction sequence number
 * @property {number} amount The total amount on the transaction
 * @property {string} currencyCode Currency code for the transaction
 */

/**
 * @typedef {Object} StreamBinaryOptions
 * @property {Object} data Data that needs to be pushed to the reader in a format specific to the reader.
 * Common formats are Buffer or a base64 encoded stream
 * @property {number} offset Data offset
 * @property {number} timeout Timeout in ms
 */

/* eslint-enable no-unused-vars */


exports["default"] = CommandBuilder;
},{"./FormFactor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/FormFactor.js","./TransactionType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/TransactionType.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/DeviceUpdate.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _events = require("events");

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _appMessage = _interopRequireDefault(require("./appMessage"));

var _paymentDeviceError = require("./paymentDeviceError");

var _deviceState = _interopRequireDefault(require("./deviceState"));

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var Log = (0, _manticoreLog["default"])('paymentDevice.deviceUpdate');
var skipAppPrompt = 'skipAppPrompt';
/**
 * A device update object is passed to your application via the PaymentDevice#updateRequired event and is capable
 * of applying an update to a device.
 * @class
 * @property {bool} isRequired Whether the update is required before taking further transactions using the device
 * @property {bool} wasInstalled Indicates if the update was installed
 * @property {bool} updateInProgress True if software update is in progress @readonly
 */

var DeviceUpdate = /*#__PURE__*/function (_EventEmitter) {
  (0, _inherits2["default"])(DeviceUpdate, _EventEmitter);

  var _super = _createSuper(DeviceUpdate);

  /**
   * Nobody can make me but Javascript
   * @package
   * @constructor
   * @param {PaymentDevice} device
   */
  function DeviceUpdate(device) {
    var _this;

    (0, _classCallCheck2["default"])(this, DeviceUpdate);
    _this = _super.call(this);
    _this.isRequired = true;
    _this.wasInstalled = false;
    _this.device = device;
    _this._firmwareUpdateCallbacks = [];
    return _this;
  }
  /**
   * Determines if a software update is in progress
   * @package
   */


  (0, _createClass2["default"])(DeviceUpdate, [{
    key: "updateInProgress",
    get: function get() {
      return this.device.hasState(_deviceState["default"].softwareUpdate);
    }
    /**
     * Display a prompt to the merchant offering the opportunity to upgrade the payment device, and optionally
     * update the device. Call the callback with completion status when the upgrade is complete or cancelled.
     * @param {DeviceUpdate~completed} callback Called upon success or failure of the update attempt.
     */

  }, {
    key: "offer",
    value: function offer(callback) {
      this.offerWithTag(null, callback);
    }
    /**
     * Display a prompt to the merchant offering the opportunity to upgrade the payment device, and optionally
     * update the device. Call the callback with completion status when the upgrade is complete or cancelled.
     * @nativeName offer
     * @param {string} tag to be passed to the function to suppress the UpgradeDevice UI.
     * @param {DeviceUpdate~completed} callback Called upon success or failure of the update attempt.
     */

  }, {
    key: "offerWithTag",
    value: function offerWithTag(tag, callback) {
      var _this2 = this;

      Log.info("updateDeviceOfferWithTag ".concat(tag, "."));

      if (this.device.pendingUpdate && this.device.pendingUpdate !== this) {
        // If someone else is in charge of the update, let them handle it
        // This can happen if new info comes from the server in the intervening time.
        this.device.pendingUpdate.offer(callback);
        return;
      } // The validation callback allows DeviceUpdate handle the responsibility of success
      // And the responsibility to check for implementation specific validations is moved to the implementation


      var validateCallback = function validateCallback(error) {
        if (error) {
          Log.error('Cannot do software update. Device validation failed', {
            error: error
          });
          callback(error, false);
        } else if (tag === skipAppPrompt) {
          Log.debug('The Device has started updating');

          _this2.beginWithTag(tag, callback);
        } else {
          _this2.device.app.display({
            title: _this2.isRequired ? _appMessage["default"].SwUpdateRequired.title : _appMessage["default"].SwUpdateOptional.title,
            message: _this2.isRequired ? _appMessage["default"].SwUpdateRequired.message : _appMessage["default"].SwUpdateOptional.message,
            cancel: _appMessage["default"].SwUpdate.buttons.notNow,
            buttons: [_appMessage["default"].SwUpdate.buttons.updateNow]
          }, function (alertView, index) {
            alertView.dismiss();

            if (index === 0) {
              _this2.begin(callback);

              return;
            }

            callback(_paymentDeviceError.deviceError.swUpdateCanceled, false);
          });
        }
      };

      this.validateUpdateEligibility(validateCallback);
    }
  }, {
    key: "_shiftAndInvokeUpdateCallbacks",
    value: function _shiftAndInvokeUpdateCallbacks(error, wasDeviceUpgraded) {
      var _this3 = this;

      var _loop = function _loop() {
        var cb = _this3._firmwareUpdateCallbacks.shift();

        _manticore["default"].setTimeout(function () {
          if (cb) {
            cb(error, wasDeviceUpgraded);
          }
        }, 0);
      };

      while (this._firmwareUpdateCallbacks.length > 0) {
        _loop();
      }
    }
    /**
     * Begin the software update.
     * @param {DeviceUpdate~completed} callback Called upon success or failure of the update attempt.
     */

  }, {
    key: "begin",
    value: function begin(callback) {
      this.beginWithTag(null, callback);
    }
    /**
     * Begin the software update.
     * @nativeName begin
     * @param {string} tag to be passed to the function to suppress the UpgradeDevice UI.
     * @param {DeviceUpdate~completed} callback Called upon success or failure of the update attempt.
     */

  }, {
    key: "beginWithTag",
    value: function beginWithTag(tag, callback) {
      var _this4 = this;

      if (callback) {
        this._firmwareUpdateCallbacks.push(callback);
      }

      if (this.updateInProgress) {
        Log.debug('Firmware update is in progress. Callback queued', {
          crId: this.device.id
        });
        return;
      }

      this.device.stopPollForBattery();
      this.device.addState(_deviceState["default"].softwareUpdate);
      this.beginDeviceUpdate(function (error, deviceUpgraded) {
        _this4.device.removeState(_deviceState["default"].softwareUpdate);

        if (error) {
          Log.error('Software update failed', {
            error: error
          });

          if (tag === skipAppPrompt) {
            _this4._shiftAndInvokeUpdateCallbacks(error, deviceUpgraded);
          } else {
            _this4.device.app.display({
              title: _appMessage["default"].SwUpdateFailed.title,
              message: _appMessage["default"].SwUpdateFailed.message,
              buttons: [_appMessage["default"].SwUpdate.buttons.retry, _appMessage["default"].SwUpdate.buttons.notNow]
            }, function (a, ix) {
              a.dismiss();

              if (ix === 0) {
                _this4.begin(null);
              } else {
                _this4._shiftAndInvokeUpdateCallbacks(error, deviceUpgraded);
              }
            });
          }

          return;
        }

        if (tag === skipAppPrompt) {
          var PaymentDevice = require('./PaymentDevice')["default"]; // eslint-disable-line global-require


          _this4._successfulDeviceUpdateResponse(PaymentDevice);

          _this4._shiftAndInvokeUpdateCallbacks(error, deviceUpgraded);

          _this4.device.onConnected();
        } else {
          _this4.device.app.display({
            title: _appMessage["default"].SwUpdateSuccessful.title,
            message: _appMessage["default"].SwUpdateSuccessful.message,
            buttons: [_appMessage["default"].SwUpdate.buttons.ok]
          }, function (a) {
            var PaymentDevice = require('./PaymentDevice')["default"]; // eslint-disable-line global-require


            a.dismiss();

            _this4._successfulDeviceUpdateResponse(PaymentDevice);

            _this4._shiftAndInvokeUpdateCallbacks(error, deviceUpgraded);

            _this4.device.onConnected();
          });
        }
      });
    }
  }, {
    key: "_successfulDeviceUpdateResponse",
    value: function _successfulDeviceUpdateResponse(PaymentDevice) {
      this.wasInstalled = true;
      Log.info('SW Update success', {
        crId: this.device.id
      });
      this.device.startPollForBattery(); // keep device

      this.device.display({
        id: PaymentDevice.Message.ReadyWithId,
        substitutions: {
          id: this.device.id
        },
        displaySystemIcons: true
      }, function () {});
    }
    /**
     * Actual implementation of software update
     * @param {DeviceUpdate~completed} callback Called upon success or failure of the update attempt.
     * @package
     */

  }, {
    key: "beginDeviceUpdate",
    value: function beginDeviceUpdate(callback) {
      // eslint-disable-line no-unused-vars
      throw new Error('Subclass must implement this method');
    }
    /**
     * Check device-specific conditions for update such as battery level.
     */

  }, {
    key: "validateUpdateEligibility",
    value: function validateUpdateEligibility(callback) {
      // The default implementation assumes no error
      callback();
    }
  }]);
  return DeviceUpdate;
}(_events.EventEmitter);
/**
 * Called when either the software update completed, failed, or was canceled. (To detect the user having chosen
 * not to update, check that the error is null but deviceUpgraded is false.
 * @callback DeviceUpdate~completed
 * @param {error} error The error that caused the update to fail, if any
 * @param {bool} deviceUpgraded True if the device has been successfully updated.
 */

/**
 * Payment device connected via USB needs to be unplugged and plugged back to the USB port for the software
 * update to complete
 * @event DeviceUpdate#reconnectReader
 * @param {int} waitTime The duration within which the device needs to be reconnected
 */


exports["default"] = DeviceUpdate;
},{"./PaymentDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/PaymentDevice.js","./appMessage":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/appMessage.js","./deviceState":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/deviceState.js","./paymentDeviceError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/paymentDeviceError.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/DigitalCard.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _Card2 = _interopRequireDefault(require("./Messages/Card"));

var _FormFactor = _interopRequireDefault(require("./FormFactor"));

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

/**
 * Holds Gift Card information used for the Payment
 * @class
 * @extends Card
 * @property {string} code online redemption Code
 */
var DigitalCard = /*#__PURE__*/function (_Card) {
  (0, _inherits2["default"])(DigitalCard, _Card);

  var _super = _createSuper(DigitalCard);

  /**
   * Create a new instance of Digital Card
   * @constructor
   */
  function DigitalCard() {
    var _this;

    (0, _classCallCheck2["default"])(this, DigitalCard);
    _this = _super.call(this);
    _this.formFactor = _FormFactor["default"].DigitalCard;
    return _this;
  }

  return (0, _createClass2["default"])(DigitalCard);
}(_Card2["default"]);

exports["default"] = DigitalCard;
},{"./FormFactor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/FormFactor.js","./Messages/Card":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/Card.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/EntryMode.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/EntryMode.js"][0].apply(exports,arguments)
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/FormFactor.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _manticoreUtil = require("manticore-util");

// TODO The naming convention is not correct! Use camelCase for constants and it's properties

/**
 * A payment form factor describes the process used by the consumer to
 * communicate payment credentials to the merchant.
 * @enum {int}
 */
var FormFactor = {
  /**
   * This value is returned if a given merchant and payment device share no
   * common accepted form factors.
   */
  None: 0,

  /**
   * The consumer (or merchant) swipes the consumer's magnetic card through a
   * magnetic card reader
   */
  MagneticCardSwipe: 1,

  /**
   * The consumer dips a card with a smart chip into a smart card reader (e.g. EMV Chip&PIN)
   */
  Chip: 2,

  /**
   * An EMV-certified contactless card is presented and read by an
   * EMV-certified contactless reader
   */
  EmvCertifiedContactless: 3,

  /**
   * A terminal capable of collecting and encrypting a manually entered
   * account number (aka PAN) was used to collect some or all of the
   * necessary information
   */
  SecureManualEntry: 4,

  /**
   * Unencrypted card number entered manually from an App/Terminal
   */
  ManualCardEntry: 5,

  /**
   *  Online redemption code entered manually/Scan from an App/Terminal
   */
  DigitalCard: 6
};
FormFactor.keyFromValue = (0, _manticoreUtil.reverseKeysAndValues)(FormFactor);
var _default = FormFactor;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/MagneticCard.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _Card2 = _interopRequireDefault(require("./Messages/Card"));

var _FormFactor = _interopRequireDefault(require("./FormFactor"));

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var Log = (0, _manticoreLog["default"])('payment');
/**
 * Information about a card presented to the PayPal Retail SDK
 * @class
 * @extends Card
 * @property {string} pan The personal account number (usually masked)
 * @property {string} expiration The expiration date (YYMM)
 * @property {string} track1 Encrypted track1 data if available
 * @property {string} track2 Encrypted track2 data if available
 * @property {string} track3 Encrypted track3 data if available
 * @property {string} firstName Cardholder first name
 * @property {string} lastName Cardholder last name
 * @property {string} middleInitial Cardholder middle name
 * @property {string} ksn Key serial number of the reader used to interpret the track data
 */

var MagneticCard = /*#__PURE__*/function (_Card) {
  (0, _inherits2["default"])(MagneticCard, _Card);

  var _super = _createSuper(MagneticCard);

  function MagneticCard() {
    var _this;

    (0, _classCallCheck2["default"])(this, MagneticCard);
    _this = _super.call(this);
    _this.nativeClass = 'MagneticCard';
    _this.formFactor = _FormFactor["default"].MagneticCardSwipe;
    return _this;
  }

  (0, _createClass2["default"])(MagneticCard, [{
    key: "parseName",
    value: function parseName(name) {
      Log.debug("Not parsing ".concat(name));
    }
  }]);
  return MagneticCard;
}(_Card2["default"]);

exports["default"] = MagneticCard;
},{"./FormFactor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/FormFactor.js","./Messages/Card":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/Card.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/MagneticReaderDevice.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _PaymentDevice2 = _interopRequireDefault(require("./PaymentDevice"));

var _FormFactor = _interopRequireDefault(require("./FormFactor"));

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var Log = (0, _manticoreLog["default"])('payment');
/**
 * Represents a magnetic card reader with limited capabilities.
 * @class
 * @protected
 */

var MagneticReaderDevice = /*#__PURE__*/function (_PaymentDevice) {
  (0, _inherits2["default"])(MagneticReaderDevice, _PaymentDevice);

  var _super = _createSuper(MagneticReaderDevice);

  function MagneticReaderDevice(uniqueName, _native) {
    var _this;

    (0, _classCallCheck2["default"])(this, MagneticReaderDevice);
    _this = _super.call(this, uniqueName, _native); // Connect to the reader and get details

    _this.connect(function () {
      if (!_this.isActivated) {
        _this.disconnect();
      }
    });

    return _this;
  }

  (0, _createClass2["default"])(MagneticReaderDevice, [{
    key: "connect",
    value: function connect(callback) {
      var _this2 = this;

      if (this["native"].isConnected()) {
        Log.debug(function () {
          return "Connect called, but ".concat(_this2.id, " is already connected.");
        });

        if (callback) {
          callback();
        }
      }

      Log.debug(function () {
        return "Connecting to Magnetic Reader ".concat(_this2.id);
      });
      this["native"].connect(function (error) {
        Log.debug(function () {
          return "Connected to Magnetic Reader ".concat(_this2.id);
        });

        if (callback) {
          callback(error);
        }
      });
    }
  }, {
    key: "formFactors",
    get: function get() {
      return [_FormFactor["default"].MagneticCardSwipe];
    }
  }, {
    key: "disconnect",
    value: function disconnect(callback) {
      this["native"].disconnect(callback);
    }
    /**
     * Data has been received from the device
     * @param {object} event
     */

  }, {
    key: "received",
    value: function received(event) {
      if (event && event.type === 'start') {// Swipe started
      } else if (event && event.type === 'fail') {// Swipe failed
      } else if (event.formFactor) {
        if (!event.reader) {
          event.reader = this;
        }

        this.emit('cardPresented', event);
      }
    }
  }]);
  return MagneticReaderDevice;
}(_PaymentDevice2["default"]);

exports["default"] = MagneticReaderDevice;
},{"./FormFactor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/FormFactor.js","./PaymentDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/PaymentDevice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/ManuallyEnteredCard.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _Card2 = _interopRequireDefault(require("./Messages/Card"));

var _FormFactor = _interopRequireDefault(require("./FormFactor"));

var _cardError = require("./cardError");

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var regExDate = /^(1[0-2]|0[1-9])([0-9]{4})$/;
var Log = (0, _manticoreLog["default"])('card.manuallyEnteredCard');
/**
 * Certain regions support manual entry of credit card numbers. The retail SDK requires
 * that you use an EMV certified terminal to gather an encrypted PAN and when doing so,
 * an object of type ManuallyEnteredCard would be returned, which can be presented to
 * the backend services to collect payment
 * @class
 * @extends Card
 */

var ManuallyEnteredCard = /*#__PURE__*/function (_Card) {
  (0, _inherits2["default"])(ManuallyEnteredCard, _Card);

  var _super = _createSuper(ManuallyEnteredCard);

  /**
   * Create a new instance of Manually Entered card for key-in payments
   * @constructor
   */
  function ManuallyEnteredCard() {
    var _this;

    (0, _classCallCheck2["default"])(this, ManuallyEnteredCard);
    _this = _super.call(this);
    _this.formFactor = _FormFactor["default"].ManualCardEntry;
    return _this;
  }
  /**
   * cardNumber Number of the provided card
   * @param {string} value
   */


  (0, _createClass2["default"])(ManuallyEnteredCard, [{
    key: "setCardNumber",
    value: function setCardNumber(value) {
      this._cardNumber = value;
    }
    /**
     * cardNumber Number of the provided card
     * @returns {string}
     */

  }, {
    key: "getCardNumber",
    value: function getCardNumber() {
      return this._cardNumber;
    }
    /**
     * The CVV on the card for payment. E.g. 131
     * @param {string} value
     */

  }, {
    key: "setCVV",
    value: function setCVV(value) {
      this._cvv = value;
    }
    /**
     * The CVV on the card for payment. E.g. 131
     * @returns {string}
     */

  }, {
    key: "getCVV",
    value: function getCVV() {
      return this._cvv;
    }
    /**
     * Primary account holder's billing postal code
     * @param {string} value
     */

  }, {
    key: "setPostalCode",
    value: function setPostalCode(value) {
      this._postalCode = value;
    }
    /**
     * Primary account holder's billing postal code
     * @returns {string}
     */

  }, {
    key: "getPostalCode",
    value: function getPostalCode() {
      return this._postalCode;
    }
    /**
     * Set the card expiration date in (MMYYYY) format. E.g. 092019 for Sep, 2019
     * @param {string} date Date in MMYYYY format
     */

  }, {
    key: "setExpiration",
    value: function setExpiration(date) {
      var match = regExDate.exec(date);

      if (!match) {
        Log.error("Invalid expiration date ".concat(date, " was provided which is not in format MMYYYY"));
        throw _cardError.cardError.invalidExpiryDate;
      }

      this._expiration = date;
    }
    /**
     * Get the card expiration date in MMYYYY format
     * @returns {string} Card expiration date
     */

  }, {
    key: "getExpiration",
    value: function getExpiration() {
      return this._expiration;
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      var jsonVal = (0, _get2["default"])((0, _getPrototypeOf2["default"])(ManuallyEnteredCard.prototype), "toJSON", this).call(this);
      jsonVal.cardNumber = this.getCardNumber();
      jsonVal.expiration = this.getExpiration();
      jsonVal.postalCode = this.getPostalCode();
      jsonVal.cvv = !!this.getCVV();
      return jsonVal;
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }]);
  return ManuallyEnteredCard;
}(_Card2["default"]);

exports["default"] = ManuallyEnteredCard;
},{"./FormFactor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/FormFactor.js","./Messages/Card":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/Card.js","./cardError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/cardError.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/AvailableApplications.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.date.to-string.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

/**
 * User needs to select an Application in order to proceed with a transaction
 * @property {Object} deviceResponse The raw response from the device
 * @property {Object} apps An array of [id,name] pairs identifying applications to pick from
 */
var AvailableApplications = /*#__PURE__*/function () {
  function AvailableApplications(deviceResponse) {
    (0, _classCallCheck2["default"])(this, AvailableApplications);
    this.deviceResponse = deviceResponse;
    this.apps = [];
  }

  (0, _createClass2["default"])(AvailableApplications, [{
    key: "toString",
    value: function toString() {
      var _context;

      return (0, _concat["default"])(_context = "AvailableApplications: ".concat(this.apps.length, " apps\nRaw Response: ")).call(_context, this.deviceResponse.toString());
    }
  }]);
  return AvailableApplications;
}();

exports["default"] = AvailableApplications;
},{"@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","core-js/modules/es.date.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/Card.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

require("core-js/modules/es.array.join.js");

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

var _moment = _interopRequireDefault(require("moment"));

var _EntryMode = _interopRequireDefault(require("../EntryMode"));

var _FormFactor = _interopRequireDefault(require("../FormFactor"));

// from internals/to-absolute-index
var idx = function idx(length) {
  return function (index) {
    return index < 0 ? Math.max(index + length, 0) : Math.min(index, length);
  };
};

function replace() {
  var _context;

  var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  var to = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  var withChar = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';
  var idxLen = idx(str.length - 1);
  var start = idxLen(from);
  var end = idxLen(to);
  return (0, _map["default"])(_context = (0, _toConsumableArray2["default"])(str)).call(_context, function (_char, i) {
    return i >= start && i <= end ? withChar : _char;
  }).join('');
}
/**
 * Information about a card presented to the PayPal Retail SDK
 * @class
 * @property {FormFactor} formFactor The process used by consumer to present the card @readonly
 * @property {bool} failed The presentation failed and this event is simply a notice of failure @readonly
 * @property {PaymentDevice} reader The device used to read the card @readonly
 * @property {string} timestamp A server-compatible formatted time for when this
 *  presentation occurred @readonly
 * @property {string} lastFourDigits Last four digits of the presented card @readonly
 * @property {string} firstFourDigits First four digits of the presented card @readonly
 * @property {string} firstSixDigits First six digits of the presented card @readonly
 * @property {string} panNumber The pan number containing the obfuscated card number @readonly
 * @property {CardIssuer} cardIssuer Issuer of the card that was presented to the SDK @readonly
 * @property {string} cardholderName Name of consumer who owns the presented card @readonly
 * @property {bool} pinPresent Indicates if pin was entered after presenting the card @readonly
 * @property {bool} isContactlessMSD Indicates if a contactless MSD card was presented @readonly
 * @property {bool} isSignatureRequired true if given the card and the context in which it
 *  was presented, a signature is required. @readonly
 */


var Card = /*#__PURE__*/function () {
  function Card() {
    (0, _classCallCheck2["default"])(this, Card);
    this.timestamp = (0, _moment["default"])().format();
    this.isSignatureRequired = false;
    this.isContactlessMSD = false;
    this.pinPresent = false;
    this.failed = false;
    this.chipCard = false;
    this.isMSRFallbackAllowed = false;
    this._panNumber = '';
  }
  /**
   * Indicates if the presented card is EMV
   * @returns {bool} true if EMV card was presented
   */


  (0, _createClass2["default"])(Card, [{
    key: "isEmv",
    value: function isEmv() {
      return (this.formFactor === _FormFactor["default"].Chip || this.formFactor === _FormFactor["default"].EmvCertifiedContactless) && !this.isContactlessMSD;
    }
  }, {
    key: "readJSON",
    value: function readJSON() {
      var _json$timestamp, _json$isSignatureRequ, _json$isContactlessMS, _json$pinPresent, _json$failed, _json$formFactor, _json$lastFourDigits, _json$firstFourDigits, _json$cardIssuer, _json$cardholderName, _json$chipCard, _json$isMSRFallbackAl, _json$panNumber;

      var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
      this.timestamp = (_json$timestamp = json.timestamp) !== null && _json$timestamp !== void 0 ? _json$timestamp : this.timestamp;
      this.isSignatureRequired = (_json$isSignatureRequ = json.isSignatureRequired) !== null && _json$isSignatureRequ !== void 0 ? _json$isSignatureRequ : this.isSignatureRequired;
      this.isContactlessMSD = (_json$isContactlessMS = json.isContactlessMSD) !== null && _json$isContactlessMS !== void 0 ? _json$isContactlessMS : this.isContactlessMSD;
      this.pinPresent = (_json$pinPresent = json.pinPresent) !== null && _json$pinPresent !== void 0 ? _json$pinPresent : this.pinPresent;
      this.failed = (_json$failed = json.failed) !== null && _json$failed !== void 0 ? _json$failed : this.failed;
      this.formFactor = (_json$formFactor = json.formFactor) !== null && _json$formFactor !== void 0 ? _json$formFactor : this.formFactor;
      this.lastFourDigits = (_json$lastFourDigits = json.lastFourDigits) !== null && _json$lastFourDigits !== void 0 ? _json$lastFourDigits : this.lastFourDigits;
      this.firstFourDigits = (_json$firstFourDigits = json.firstFourDigits) !== null && _json$firstFourDigits !== void 0 ? _json$firstFourDigits : this.firstFourDigits;
      this.cardIssuer = (_json$cardIssuer = json.cardIssuer) !== null && _json$cardIssuer !== void 0 ? _json$cardIssuer : this.cardIssuer;
      this.cardholderName = (_json$cardholderName = json.cardholderName) !== null && _json$cardholderName !== void 0 ? _json$cardholderName : this.cardholderName;
      this.chipCard = (_json$chipCard = json.chipCard) !== null && _json$chipCard !== void 0 ? _json$chipCard : this.chipCard;
      this.isMSRFallbackAllowed = (_json$isMSRFallbackAl = json.isMSRFallbackAllowed) !== null && _json$isMSRFallbackAl !== void 0 ? _json$isMSRFallbackAl : this.isMSRFallbackAllowed;
      this._panNumber = (_json$panNumber = json.panNumber) !== null && _json$panNumber !== void 0 ? _json$panNumber : this._panNumber;
      return this;
    }
  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        timestamp: this.timestamp,
        isSignatureRequired: this.isSignatureRequired,
        isContactlessMSD: this.isContactlessMSD,
        pinPresent: this.pinPresent,
        failed: this.failed,
        formFactor: this.formFactor,
        lastFourDigits: this.lastFourDigits,
        firstFourDigits: this.firstFourDigits,
        cardIssuer: this.cardIssuer,
        cardholderName: this.cardholderName,
        chipCard: this.chipCard,
        isMSRFallbackAllowed: this.isMSRFallbackAllowed,
        panNumber: this.panNumber,
        inputMethod: this.inputMethod
      };
    }
    /**
     * @package
     */

  }, {
    key: "panNumber",
    get: function get() {
      return this._panNumber;
    },
    set: function set(rawPanNumber) {
      this._panNumber = replace(rawPanNumber, 6, -4, '*');
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }, {
    key: "inputMethod",
    get: function get() {
      if (this.formFactor === _FormFactor["default"].MagneticCardSwipe) {
        return this.isMSRFallbackAllowed ? _EntryMode["default"].FallbackSwipe : _EntryMode["default"].Swipe;
      }

      if (this.formFactor === _FormFactor["default"].Chip) {
        return _EntryMode["default"].Chip;
      }

      if (this.formFactor === _FormFactor["default"].EmvCertifiedContactless) {
        return this.isContactlessMSD ? _EntryMode["default"].ContactlessMSD : _EntryMode["default"].ContactlessChip;
      }

      if (this.formFactor === _FormFactor["default"].ManualCardEntry) {
        return _EntryMode["default"].KeyIn;
      }

      return undefined;
    }
  }]);
  return Card;
}();

exports["default"] = Card;
},{"../EntryMode":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/EntryMode.js","../FormFactor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/FormFactor.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","core-js/modules/es.array.join.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.array.join.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js","moment":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/CardPresentEvent.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * The list of events that could be generated after a card is presented
 * @type {{cardDataRead: number, pinEvent: number, selectApplication: number}}
 */
var CardPresentEvent = {
  /**
   * EMV/Swipe data was read from the presented card
   */
  cardDataRead: 0,

  /**
   * PIN event
   */
  pinEvent: 1,

  /**
   * User needs to select an application before taking payment
   */
  appSelectionRequired: 2,

  /**
   * Card insert was detected, but EMV data was not read yet
   */
  insertDetected: 4
};
var _default = CardPresentEvent;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/CardReaderResponse.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.date.to-string.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

require("core-js/modules/es.array.join.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

/**
 * Card reader response including an APDU
 * @property {Buffer} raw The raw bytes of the response @readonly
 * @property {int} length The length of the data element of the response @readonly
 * @property {boolean} isUnsolicited Indicates if the response from card reader was unsolicited
 * @property {ApduResponse} apdu APDU response from card reader
 */
var CardReaderResponse = /*#__PURE__*/function () {
  function CardReaderResponse(buffer, length, isUnsolicited) {
    (0, _classCallCheck2["default"])(this, CardReaderResponse);
    this._raw = buffer;
    this._length = length;
    this._isUnsolicited = isUnsolicited;
  }

  (0, _createClass2["default"])(CardReaderResponse, [{
    key: "raw",
    get: function get() {
      return this._raw;
    }
  }, {
    key: "length",
    get: function get() {
      return this._length;
    }
  }, {
    key: "apdu",
    get: function get() {
      return this._apdu;
    },
    set: function set(val) {
      this._apdu = val;
    }
  }, {
    key: "isUnsolicited",
    get: function get() {
      return this._isUnsolicited;
    }
  }, {
    key: "tlvs",
    get: function get() {
      return this.apdu ? this.apdu.tlvs : null;
    }
  }, {
    key: "toString",
    value: function toString(shouldParse) {
      var str = ['<----\nCard reader response: ', this.apdu ? this.apdu.toString(shouldParse) : 'blank', '\n'];
      str.push('---->');
      return str.join('');
    }
  }]);
  return CardReaderResponse;
}();

exports["default"] = CardReaderResponse;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","core-js/modules/es.array.join.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.array.join.js","core-js/modules/es.date.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/DeviceStatus.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

/**
 * Information about a card presented to the PayPal Retail SDK
 * @class
 * @property {bool} isReady true if the device is ready for transaction @readonly
 * @property {error} error Reason (if any) for device unavailability  @readonly
 */
var DeviceStatus = /*#__PURE__*/(0, _createClass2["default"])(function DeviceStatus() {
  (0, _classCallCheck2["default"])(this, DeviceStatus);
});
exports["default"] = DeviceStatus;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/PinEvent.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

/**
 * Details about a change in status of PIN entry or validation
 * @property {bool} completed Whether PIN entry has completed
 * @property {bool} correct Whether the PIN is correct
 * @property {bool} isLastAttempt Whether this PIN attempt is the last
 *  attempt before a potential card lockout
 * @property {int} digits Number of digits entered
 * @property {string} failureReason The failure reason, if any
 */
var PinEvent = /*#__PURE__*/(0, _createClass2["default"])(function PinEvent() {
  (0, _classCallCheck2["default"])(this, PinEvent);
});
exports["default"] = PinEvent;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/NumericEntryOptions.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

/**
 * Options for asking for numeric entry on the EMV terminal. Because this is typically
 * a PIN entry device, you can't just display any message and get numeric entry
 * (e.g. "ENTER PIN" and then get the raw PIN). These options control and indicate
 * what you can ask for.
 * @class
 * @property {NumericEntryType} entryType The overall type of numeric entry desired
 * @property {string} editValue The existing amount to edit, if any
 */
var NumericEntryOptions = /*#__PURE__*/(0, _createClass2["default"])(function NumericEntryOptions() {
  (0, _classCallCheck2["default"])(this, NumericEntryOptions);
});
/**
 * Called after a request for amount entry (via promptForAmountEntry) completes.
 * @callback NumericEntryOptions~amountEntered
 * @param {error} error The error encountered - namely cancellation or lack of terminal support
 * @param {string} amount The amount entered
 */

exports["default"] = NumericEntryOptions;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/NumericEntryType.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * When you wish to get a numeric value from the device, you must specify precisely
 * which type of number you're asking for so that prompts and formats can be selected.
 * @enum {int}
 */
var NumericEntryType = {
  /**
   * A tip amount, in the local currency
   */
  GratuityAmount: 1,

  /**
   * A tip amount as a percentage of the current transaction total
   */
  GratuityPercentage: 2,

  /**
   * A mobile phone number
   */
  MobileNumber: 3,

  /**
   * Expiration date
   */
  ExpirationDate: 4,

  /**
   * Cardholder verification value
   */
  Cvv: 5
};
var _default = NumericEntryType;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/PaymentDevice.js":[function(require,module,exports){
"use strict";

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");

var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");

var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");

var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");

var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.exec.js");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

require("core-js/modules/es.date.to-string.js");

require("core-js/modules/es.function.name.js");

require("core-js/modules/es.date.to-json.js");

require("core-js/modules/web.url.to-json.js");

var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/values"));

var _splice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/splice"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));

var _entries = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/entries"));

var _setInterval2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-interval"));

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _get3 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _events = require("events");

var _manticore = _interopRequireDefault(require("manticore"));

var _manticoreUtil = require("manticore-util");

var _CardReader2 = _interopRequireDefault(require("./CardReader"));

var _FormFactor = _interopRequireDefault(require("./FormFactor"));

var _DeviceStatus = _interopRequireDefault(require("./Messages/DeviceStatus"));

var _readerInformation = require("./readerInformation");

var _paymentDeviceError = require("./paymentDeviceError");

var _deviceState = _interopRequireDefault(require("./deviceState"));

var _ReaderModel = _interopRequireDefault(require("./ReaderModel"));

var _deviceManufacturer = _interopRequireDefault(require("./deviceManufacturer"));

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context12, _context13; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty2(_context12 = ownKeys(Object(source), !0)).call(_context12, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty2(_context13 = ownKeys(Object(source))).call(_context13, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }

function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }

function _unsupportedIterableToArray(o, minLen) { var _context11; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context11 = Object.prototype.toString.call(o)).call(_context11, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var Log = (0, _manticoreLog["default"])('paymentDevice');
var secureBlobStorage = 'E';
var itemKeyMerchantCardReaders = 'merchant-card-readers';
var msDefaultMaxConnectionDuration = 30000;
/*
 * The native application is responsible for discovering and communicating
 * with these devices. You are responsible for providing a native object which
 * implements connect/disconnect/isConnected/send functions and calls
 * received(bytes/events) on this object as appropriate.
 */

/**
 * A payment device represents the abstract concept of something that can read
 * payment information from a customer. This includes card swipe readers, EMV
 * readers, barcode scanners, biometric devices we don't have yet, and DNA
 * sequencers. Ok, not so much that last bit.
 *
 * @class
 * @property {string} id A unique identifier for the device @readonly
 * @property {string} address Hardware address of this device
 * @property {string} name A friendly name for the device @readonly
 * @property {ReaderModel} model The model of the card reader @readonly
 * @property {string} serialNumber The serial number of the device, if available @readonly
 * @property {BatteryInfo} lastKnownBatteryInfo Status of the device battery @readonly
 * @property {bool} activated shows if the device has any active transaction @readonly
 * @property {[FormFactor]} formFactors The payment form factors
 *  this device can support @readonly
 * @property {DeviceUpdate} pendingUpdate Any pending software update for
 *  this device, or null if the device is current
 *  @property {readerType} type Indicates the type of reader @readonly
 *  @property {readerConnectionType} connectionType Indicates the connection channel of the reader @readonly
 *  @property {bool} cardInSlot Indicates whether a card is inserted within the reader at this moment @readonly
 *  @property {bool} isBlacklisted Indicates whether a card reader is blacklisted or not @readonly
 *
 */

var PaymentDevice = /*#__PURE__*/function (_CardReader) {
  (0, _inherits2["default"])(PaymentDevice, _CardReader);

  var _super = _createSuper(PaymentDevice);

  /**
   * Construct a new PaymentDevice given native functions capable of sending
   *  data, connect, disconnect and retrieve connection status from the reader
   * @param {string} uniqueId A unique identifier for this device, usually including
   *  type and serial number
   * @param {Object} native Interface to native components
   * @param {Object} app Interface to app components
   * @param {readerConnectionType} connectionType
   * @param {string} hardwareAddress Hardware address of the connected
   * @param {int} [requestTimeout=2500] Number of ms, the driver should wait for reader responses before timing out
   * @package
   */
  function PaymentDevice(uniqueId, _native, app) {
    var _this;

    var connectionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _readerInformation.readerConnectionType.unknown;
    var hardwareAddress = arguments.length > 4 ? arguments[4] : undefined;
    var requestTimeout = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 2500;
    (0, _classCallCheck2["default"])(this, PaymentDevice);
    _this = _super.call(this, uniqueId, _native);
    _this.id = uniqueId;
    _this.address = hardwareAddress;
    _this["native"] = _native;
    _this.app = app;
    _this.cardPresented = false;
    _this.connectionType = connectionType;
    _this.type = _readerInformation.readerType.Unknown;
    _this.cardInsertedHandler = null;
    _this._connectionCallbacks = [];
    _this.cardInSlot = false;
    _this._sEventNames = new _set["default"]();
    _this._sActiveFormFactors = new _set["default"]();

    _this.setMaxListeners(30);

    _this.model = _ReaderModel["default"].Unknown;
    _this.isBlacklisted = false;
    _this.log = Log.withContext(function () {
      return {
        crId: _this.id
      };
    });

    _this.log.debug('Create PaymentDevice', {
      address: hardwareAddress,
      connectionType: connectionType,
      "native": !!_native,
      app: !!app
    });

    _this._scheduleBatteryPoll();

    _this._requestTimeout = requestTimeout;
    return _this;
  }

  (0, _createClass2["default"])(PaymentDevice, [{
    key: "requestTimeout",
    get: function get() {
      return this._requestTimeout;
    }
  }, {
    key: "_getCardReaderId",
    value: function _getCardReaderId(serialNumber) {
      var _context;

      return (0, _concat["default"])(_context = "".concat(this.model, "-")).call(_context, serialNumber);
    }
  }, {
    key: "setCardReaderToMerchant",
    value: function setCardReaderToMerchant(serialNumber) {
      var _this2 = this;

      var merchant = this.app.getMerchant();

      if (!merchant) {
        this.log.warn('setCardReaderToMerchant> No merchant object; unable to register card reader');
        return;
      }

      if (!serialNumber) {
        this.log.warn('setCardReaderToMerchant> Empty serial number; unable to register card reader');
        return;
      }

      this.serialNumber = serialNumber;

      _manticore["default"].getItem(itemKeyMerchantCardReaders, secureBlobStorage, function (err, readerManifest) {
        _this2.log.debug('setCardReaderToMerchant> Fetched reader manifest', {
          readerManifest: readerManifest,
          err: err
        });

        var body = {
          asset: {
            status: 'ENABLED',
            serial: serialNumber,
            batch: _this2.model,
            family: _this2.manufacturer,
            usage_items: [{
              device_id: '0' // Default value required by service //

            }]
          }
        };
        merchant.request({
          service: 'devices',
          op: 'assets',
          format: 'json',
          method: 'POST',
          headers: {
            'Content-Type': 'application/json'
          },
          body: (0, _stringify["default"])(body)
        }, function (errRz, rz) {
          _this2.log.debug('setCardReaderToMerchant> Registering with serial', {
            serialNumber: serialNumber
          });

          if (errRz) {
            if ((rz === null || rz === void 0 ? void 0 : rz.statusCode) === 422) {
              // 422 represents disabled or blacklisted device //
              _this2.log.debug('setCardReaderToMerchant> Blacklisted card reader', {
                Request: body,
                Response: rz,
                error: errRz
              });

              _this2.isBlacklisted = true;

              _this2.emit(PaymentDevice.Event.blacklisted);
            } else {
              _this2.log.debug('setCardReaderToMerchant> Error registering card reader', {
                Request: body,
                Response: rz,
                Error: errRz
              });
            }
          } else {
            var _context2;

            _this2.log.debug('setCardReaderToMerchant> Registered', {
              serialNumber: serialNumber,
              Request: body,
              Response: rz
            });

            _this2.isBlacklisted = false;
            var newManifest = {};

            if (readerManifest) {
              try {
                newManifest = JSON.parse(readerManifest);
              } catch (e) {
                _this2.log.error('setCardReaderToMerchant> readerManifest parse failed', {
                  error: (0, _stringify["default"])(e)
                });
              }
            }

            _this2.log.debug('setCardReaderToMerchant> newManifest', {
              newManifest: newManifest
            });

            newManifest.readers = newManifest.readers || [];

            if ((0, _indexOf["default"])(_context2 = newManifest.readers).call(_context2, _this2._getCardReaderId(serialNumber)) < 0) {
              // Save serial in readers array only if it hasn't been previously saved or connected to
              newManifest.readers.push(_this2._getCardReaderId(serialNumber));
            }

            _manticore["default"].setItem(itemKeyMerchantCardReaders, secureBlobStorage, (0, _stringify["default"])(newManifest), function (errSet) {
              if (errSet) {
                _this2.log.warn('setCardReaderToMerchant> Error saving reader manifest', {
                  newManifest: newManifest,
                  Error: (0, _stringify["default"])(errSet)
                });
              }

              _this2.log.debug('setCardReaderToMerchant> Updated reader manifest', {
                newManifest: newManifest
              });
            });
          }
        });
      });
    }
    /**
     * EXTERNAL USE ONLY
     * Get manufacturer of the device
     * @returns {string} manufacturer String value of manufacturer
     * EXTERNAL USE ONLY
     */

  }, {
    key: "getManufacturer",
    value: function getManufacturer() {
      var _deviceManufacturer$k;

      return ((_deviceManufacturer$k = _deviceManufacturer["default"].keyFromValue[this.manufacturer]) === null || _deviceManufacturer$k === void 0 ? void 0 : _deviceManufacturer$k.toUpperCase()) || '';
    }
    /**
     * Extract logs from the device.
     * @method
     * @param {PaymentDevice~deviceLogs} callback Called when the logs are extracted
     */

  }, {
    key: "extractReaderLogs",
    value: function extractReaderLogs(callback) {
      callback(new Error('Not implemented'));
    }
  }, {
    key: "equals",
    value: function equals(device) {
      return this.id === device.id && this.manufacturer === device.manufacturer && this.address === device.address;
    }
    /**
     * Called internally when a new device has been discovered to register the device
     * and notify listeners of the new device.
     * @package
     */

  }, {
    key: "removeAllCardReaderListeners",
    value:
    /**
     * Remove listeners for all events
     * @package
     */
    function removeAllCardReaderListeners() {
      var _context3;

      var _iterator = _createForOfIteratorHelper((0, _values["default"])(_context3 = this._sEventNames).call(_context3)),
          _step;

      try {
        for (_iterator.s(); !(_step = _iterator.n()).done;) {
          var name = _step.value;
          this.log.debug('Removing listeners for event', {
            listenerCount: this.listenerCount(name),
            eventName: name
          });
          this.removeAllListeners(name);
        }
      } catch (err) {
        _iterator.e(err);
      } finally {
        _iterator.f();
      }

      this.log.info('Dropped all listeners', {
        listenerCount: this._sEventNames.size
      });

      this._sEventNames.clear();
    }
    /**
     * Called internally (by native) when the device has been removed from the system
     * @package
     */

  }, {
    key: "removed",
    value: function removed() {
      var _context4,
          _this3 = this;

      this.log.info('Device removal: beginning', {
        isFirmwareUpdateInProgress: this._isFirmwareUpdateInProgress,
        isConnected: this.isConnected()
      });

      if (this._isFirmwareUpdateInProgress) {
        return;
      }

      this.connectionInProgress = false;

      this._sActiveFormFactors.clear();

      this.log.debug('Device removal: Cleared all active form factors');

      if (this.isConnected()) {
        this.disconnect();
      }

      var ix = (0, _indexOf["default"])(_context4 = PaymentDevice.devices).call(_context4, this);

      if (ix >= 0) {
        var _context5;

        (0, _splice["default"])(_context5 = PaymentDevice.devices).call(_context5, ix, 1);
      }

      this.beginDeviceRemoved(function (error) {
        if (error) {
          _this3.log.warn('Device removal: failed', error);
        } else {
          _this3.log.debug('Device removal: success');

          _this3.emit(PaymentDevice.Event.deviceRemoved, _this3);

          _this3.removeAllCardReaderListeners();
        }
      });
    }
    /**
     * Called internally when connection has been verified, but the device must
     * be updated before being ready
     * @private
     */

  }, {
    key: "updateRequired",
    value: function updateRequired(update) {
      var _this4 = this;

      this.log.debug('Device needs an update', {
        isReaderReady: this.isReady
      });
      this.pendingUpdate = update;

      if (this.isReady) {
        this.emit(PaymentDevice.Event.updateRequired, update);
      } else {
        this.once(PaymentDevice.Event.connected, function () {
          return _this4.emit(PaymentDevice.Event.updateRequired, update);
        });
      }
    }
  }, {
    key: "activateForPayment",
    value: function activateForPayment(context, formFactors, showPrompt) {
      // eslint-disable-line no-unused-vars
      var _iterator2 = _createForOfIteratorHelper(formFactors),
          _step2;

      try {
        for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
          var ff = _step2.value;

          this._sActiveFormFactors.add(ff);
        }
      } catch (err) {
        _iterator2.e(err);
      } finally {
        _iterator2.f();
      }

      this.context = context;
      this.log.debug('Activating for Payment', {
        transactionId: context.id,
        formFactors: (0, _toConsumableArray2["default"])(formFactors),
        activeFormFactors: (0, _toConsumableArray2["default"])(this._sActiveFormFactors)
      });
    }
  }, {
    key: "deactivateFormFactors",
    value: function deactivateFormFactors(formFactors, callback) {
      var _iterator3 = _createForOfIteratorHelper(formFactors),
          _step3;

      try {
        for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
          var ff = _step3.value;

          this._sActiveFormFactors["delete"](ff);
        }
      } catch (err) {
        _iterator3.e(err);
      } finally {
        _iterator3.f();
      }

      this.log.debug('Deactivate formFactors', {
        removedFormFactors: (0, _manticoreUtil.getPropertyName)(_FormFactor["default"], formFactors),
        remainingFormFactors: (0, _manticoreUtil.getPropertyName)(_FormFactor["default"], (0, _toConsumableArray2["default"])(this._sActiveFormFactors))
      });

      if (callback) {
        callback();
      }
    }
  }, {
    key: "getSetOfActiveFormFactors",
    value: function getSetOfActiveFormFactors() {
      return new _set["default"](this._sActiveFormFactors); // Create shallow copy to make it immutable from outside
    }
    /**
     * Returns true if any form factor is active
     * @package
     */

  }, {
    key: "isActivated",
    get: function get() {
      return this._sActiveFormFactors.size > 0;
    }
    /**
     * Returns true if the passed FormFactor is active
     *
     * @method
     * @param {FormFactor} formFactor
     * @returns {bool}
     */

  }, {
    key: "isFormFactorActive",
    value: function isFormFactorActive(formFactor) {
      return this._sActiveFormFactors.has(formFactor);
    }
  }, {
    key: "isCardPresent",
    value: function isCardPresent() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      callback(true);
    }
  }, {
    key: "abortTransaction",
    value: function abortTransaction(context) {
      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      this.cardPresented = false;

      this._sActiveFormFactors.clear();

      this.log.debug('Aborting transaction. Cleared active form factors');
      callback();
    }
  }, {
    key: "postTransactionCleanup",
    value: function postTransactionCleanup() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      callback();
    }
  }, {
    key: "_checkAndDismissAlerts",
    value: function _checkAndDismissAlerts(alertToDismiss, showPrompt) {
      if (alertToDismiss && showPrompt) {
        alertToDismiss.dismiss();
      }
    }
  }, {
    key: "_shiftAndInvokeConnectionCallback",
    value: function _shiftAndInvokeConnectionCallback(err) {
      var _this5 = this;

      this.log.debug('Invoking connection callback handlers', {
        numberOfCBs: this._connectionCallbacks.length
      });

      var _loop = function _loop() {
        var cb = _this5._connectionCallbacks.shift() || function () {};

        _manticore["default"].setTimeout(function () {
          return cb(err);
        }, 0);
      };

      while (this._connectionCallbacks.length > 0) {
        _loop();
      }

      this.connectionInProgress = false;
    }
  }, {
    key: "waitForCardRemoval",
    value: function waitForCardRemoval() {
      var _this6 = this;

      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      if (!this.cardInSlot || !this.isConnected()) {
        this.log.debug('Will not wait for card removal cardInSlot:', {
          cardInSlot: this.cardInSlot,
          connected: this.isConnected()
        });
        cb();
        return [];
      }

      var cardRemovedHandler = function cardRemovedHandler(err) {
        _this6.cardInSlot = !!err;

        _this6.removeListener(PaymentDevice.Event.disconnected, cardRemovedHandler);

        _this6.removeListener(PaymentDevice.Event.cardRemoved, cardRemovedHandler);

        cb(err);
      };

      this.listenForCardRemoval(function (err) {
        if (err) {
          _this6.log.warn('Will not listen for card removal events', {
            error: err
          });

          cardRemovedHandler(err);
        }
      });
      this.once(PaymentDevice.Event.disconnected, cardRemovedHandler);
      this.once(PaymentDevice.Event.cardRemoved, cardRemovedHandler);
      return [[PaymentDevice.Event.disconnected, cardRemovedHandler], [PaymentDevice.Event.cardRemoved, cardRemovedHandler]];
    }
  }, {
    key: "stopWaitingForCardRemoval",
    value: function stopWaitingForCardRemoval(ids) {
      this.removeGroupedListeners(ids);
    } // id: [EventName: String, EventListener: Function]
    // ids: [id, id, ...]

  }, {
    key: "removeGroupedListeners",
    value: function removeGroupedListeners(ids) {
      var _context6,
          _this7 = this;

      var groups = (0, _reduce["default"])(ids).call(ids, function (acc, _ref) {
        var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
            eventName = _ref2[0],
            listener = _ref2[1];

        if (!acc[eventName]) {
          acc[eventName] = [listener];
        }

        acc[eventName].push(listener);
        return acc;
      }, {});
      (0, _forEach["default"])(_context6 = (0, _entries["default"])(groups)).call(_context6, function (_ref3) {
        var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2),
            eventName = _ref4[0],
            listeners = _ref4[1];

        return (0, _forEach["default"])(listeners).call(listeners, function (listener) {
          return _this7.removeListener(eventName, listener);
        });
      });
    }
  }, {
    key: "isConnectionErrorCommon",
    value: function isConnectionErrorCommon(error) {
      return _paymentDeviceError.deviceError.cardReaderNotAvailable.equals(error) || _paymentDeviceError.deviceError.unableToConnect.equals(error);
    }
    /**
     * Connect to this device. A device connected event will be emitted once the device is connected
     * @method
     * @param {PaymentDevice~connect} callback Callback with connection status
     */

  }, {
    key: "connect",
    value: function connect(callback) {
      var _this8 = this;

      var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
          shouldLogConnectionFailureAtLowLogLevel = _ref5.shouldLogConnectionFailureAtLowLogLevel;

      if (callback) {
        this._connectionCallbacks.push(callback);
      }

      if (!this._isFirmwareUpdateInProgress && this.connectionInProgress) {
        this.log.debug('Connection already in progress. Will not re-connect, but queue the callback');
        return;
      }

      this.isReady = false;
      var connectionStart = new Date().getTime();
      this.connectionInProgress = true;

      this._sActiveFormFactors.clear(); // Assumption is that a reconnection clears resets the device state and drops all activated form factors


      this.log.debug('Cleared all active form factors as part of connect()');

      var beginDeviceConnectCB = function beginDeviceConnectCB(_future) {
        return function (err) {
          _this8.removeListener(PaymentDevice.Event.disconnected, _this8._beginDeviceConnectCB);

          var timeElapsed = new Date().getTime() - connectionStart;

          _future.cancel();

          _this8.onConnected(err);

          if (err) {
            /*
             * During firmware update when a reader restarts after a hard reset, the connection attempts yield
             * cardReaderNotAvailable/unableToConnect errors. This is an expected error, so we log the error at debug level.
             */
            var shouldLogAtLowLevel = (_this8._isFirmwareUpdateInProgress || shouldLogConnectionFailureAtLowLogLevel) && _this8.isConnectionErrorCommon(err);

            Log[shouldLogAtLowLevel ? 'debug' : 'error']('Connection failed', {
              // Can't log just the error object until native always sends JS backed error objects
              err: err,
              Code: err.code,
              Message: err.message,
              Duration: timeElapsed
            });
          } else {
            _this8.log.info('Successfully connected', {
              Duration: timeElapsed
            });
          }

          _this8._shiftAndInvokeConnectionCallback(err);
        };
      };

      var future = _manticore["default"].setTimeout(function () {
        _this8.log.info('Force disconnect due to connection timed-out', {
          duration: PaymentDevice.ConnectionTimeOut
        });

        var error = _paymentDeviceError.deviceError.generic.withDevMessage('Connection timed out');

        _this8.forceDisconnect(function () {
          return _this8.emit(PaymentDevice.Event.connectionError, error);
        }, error);
      }, PaymentDevice.ConnectionTimeOut);

      this._beginDeviceConnectCB = beginDeviceConnectCB(future);
      this.once(PaymentDevice.Event.disconnected, this._beginDeviceConnectCB);
      this.beginDeviceConnect(beginDeviceConnectCB(future));
    }
    /**
     * Called internally when connection sequence with this device was complete.
     * The device will be ready to be used if payments if the connection was verified
     * with no errors
     * @package
     * @param {error} error while connecting to device. Ideally a PayPalError.
     */

  }, {
    key: "onConnected",
    value: function onConnected(error) {
      this.log.debug('Device connect event', {
        device: this,
        isFWUpdateInProgress: !!this._isFirmwareUpdateInProgress,
        error: !!error
      });

      if (!this._isFirmwareUpdateInProgress) {
        // We don't want to notify components and IA about connection when an update is in progress.
        if (error) {
          this.emit(PaymentDevice.Event.connectionError, error);
        } else {
          this.isReady = true;
          this.emit(PaymentDevice.Event.connected);
          PaymentDevice.Events.emit(PaymentDevice.Event.connected);
        }
      }

      if (!error) {
        this.startPollForBattery();
      }
    }
    /**
     * Query card reader for battery information
     * @param {PaymentDevice~batteryInfo} cb Callback with battery information
     */

  }, {
    key: "retrieveBatteryInfo",
    value: function retrieveBatteryInfo() {
      var _this9 = this;

      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      this.log.debug('Enter retrieveBatteryInfo');

      if (!this.isReady) {
        this.log.debug('Exit retrieveBatteryInfo. Not ready.');
        cb(_paymentDeviceError.deviceError.actionCannotBeCompleted.withDevMessage('Cannot retrieve battery info. Reader is not ready.'));
        return;
      }

      if (!this.isBatteryInfoSupported()) {
        cb(_paymentDeviceError.deviceError.batteryInfoNotSupported);
        return;
      }

      this.getBatteryInfo(function (err, batteryInfo) {
        if (err) {
          _this9.log.error('Error retrieving battery info', {
            err: err
          });
        } else {
          _this9.lastKnownBatteryInfo = batteryInfo;

          _this9.log.debug('Received battery info', {
            batteryInfo: batteryInfo
          });

          if (_this9.lastKnownBatteryInfo) {
            _this9.emit(PaymentDevice.Event.batteryStatusUpdate, _this9.lastKnownBatteryInfo);
          }
        }

        cb(err, batteryInfo);
      });
    }
  }, {
    key: "_clearBatteryPoll",
    value: function _clearBatteryPoll() {
      if (this._batteryPollHandle) {
        clearInterval(this._batteryPollHandle);
        delete this._batteryPollHandle;
      }
    }
  }, {
    key: "_scheduleBatteryPoll",
    value: function _scheduleBatteryPoll() {
      var _context7;

      if (!this.isBatteryInfoSupported()) {
        this.log.debug('_scheduleBatteryPoll skip: not supported');
        return;
      }

      this.log.debug('_scheduleBatteryPoll with handle');

      this._clearBatteryPoll();

      this._batteryPollHandle = (0, _setInterval2["default"])((0, _bind["default"])(_context7 = this.retrieveBatteryInfo).call(_context7, this), 30 * 1000);
    }
  }, {
    key: "startPollForBattery",
    value: function startPollForBattery() {
      if (!this.isBatteryInfoSupported()) {
        this.log.debug('startPollForBattery skip: not supported');
        return;
      }

      this.log.debug('startPollForBattery');

      this._scheduleBatteryPoll();

      this.retrieveBatteryInfo();
    }
  }, {
    key: "stopPollForBattery",
    value: function stopPollForBattery() {
      if (!this.isBatteryInfoSupported()) {
        this.log.debug('stopPollForBattery skip: not supported');
        return;
      }

      this._clearBatteryPoll();

      this.log.debug('stopPollForBattery with handle');
    }
  }, {
    key: "_isFirmwareUpdateInProgress",
    get: function get() {
      var _this$pendingUpdate;

      return (_this$pendingUpdate = this.pendingUpdate) === null || _this$pendingUpdate === void 0 ? void 0 : _this$pendingUpdate.updateInProgress;
    }
    /**
     * Force a card reader disconnect without performing any state validations. Should only be used in scenarios like
     * firmware update, device resets, etc. For all other cases, please use disconnect() API
     * @package
     * @param callback Called when the disconnection attempt is complete
     * @param {error} error An error for which a disconnect is being forced
     */

  }, {
    key: "forceDisconnect",
    value: function forceDisconnect() {
      var _this10 = this;

      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      var error = arguments.length > 1 ? arguments[1] : undefined;
      this.log.info('Force disconnecting', {
        isFWUpdateInProgress: this._isFirmwareUpdateInProgress,
        error: error
      });

      this._sActiveFormFactors.clear();

      this.beginDeviceDisconnect(function (err) {
        if (err) {
          _this10.log.warn('Forced disconnect failed', {
            err: err
          });
        } else {
          _this10.log.info('Forced disconnect success');

          _this10.connectionInProgress = false;

          _this10.onDisconnected(error);

          if (error) {
            _this10.removed();
          }
        }

        callback(err);
      });
    }
    /**
     * Disconnect from the device.
     * @method
     * @param {PaymentDevice~disconnect} callback Called when the disconnection attempt is complete
     */

  }, {
    key: "disconnect",
    value: function disconnect() {
      var _this$context, _this$context2;

      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      var error = arguments.length > 1 ? arguments[1] : undefined;
      this.log.debug('Device disconnecting', {
        canDisconnect: ((_this$context = this.context) === null || _this$context === void 0 ? void 0 : _this$context.isPaymentInRetryOrProgress()) || this._isFirmwareUpdateInProgress
      });

      if ((_this$context2 = this.context) !== null && _this$context2 !== void 0 && _this$context2.isPaymentInRetryOrProgress() || this._isFirmwareUpdateInProgress) {
        callback(_paymentDeviceError.deviceError.actionCannotBeCompleted);
      } else {
        this.forceDisconnect(callback, error);
      }
    }
    /**
     * Gets the device version information
     * @method
     * @returns {object} Returns key-value pair of version type and value.
     */

  }, {
    key: "getVersionInfo",
    value: function getVersionInfo() {
      return {}; // Sub classes should override this
    }
    /**
     * Inform the Javascript class that the device has been disconnected.
     * @package
     * @param {error} error Any error that caused disconnect
     */

  }, {
    key: "onDisconnected",
    value: function onDisconnected(error) {
      this.log.warn('Device was disconnected', {
        message: error === null || error === void 0 ? void 0 : error.message,
        code: error === null || error === void 0 ? void 0 : error.code,
        error: error
      });
      this.isReady = false;
      this.stopPollForBattery();

      if (!this._isFirmwareUpdateInProgress) {
        this.emit(PaymentDevice.Event.disconnected, error);
      }
    }
    /**
     * Attempt to cleanup any ties to native objects
     * @package
     * @method
     */

  }, {
    key: "destroy",
    value: function destroy() {
      this["native"] = null;
    }
  }, {
    key: "once",
    value: function once(eventName, listener) {
      listener.id = Math.floor(Math.random() * 10000000000000);
      (0, _get3["default"])((0, _getPrototypeOf2["default"])(PaymentDevice.prototype), "once", this).call(this, eventName, listener);
    }
  }, {
    key: "on",
    value: function on(eventName, listener) {
      listener.id = listener.id || Math.floor(Math.random() * 10000000000000);
      (0, _get3["default"])((0, _getPrototypeOf2["default"])(PaymentDevice.prototype), "on", this).call(this, eventName, listener);

      this._sEventNames.add(eventName);

      this.log.debug('Added \'on\' listener', {
        id: listener.id,
        eventName: eventName,
        listenerCount: this.listenerCount(eventName)
      });
    }
  }, {
    key: "removeListener",
    value: function removeListener(eventName, listener) {
      (0, _get3["default"])((0, _getPrototypeOf2["default"])(PaymentDevice.prototype), "removeListener", this).call(this, eventName, listener);
      this.log.debug('removeListener', {
        id: listener === null || listener === void 0 ? void 0 : listener.id,
        eventName: eventName
      });
    }
  }, {
    key: "removeAllListeners",
    value: function removeAllListeners() {
      var _this11 = this;

      var eventNames = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];

      var countListeners = function countListeners(_eventNames) {
        return (0, _reduce["default"])(_eventNames).call(_eventNames, function (acc, eventName) {
          return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, eventName, _this11.listenerCount(eventName)));
        }, {});
      };

      if (typeof eventNames === 'string') {
        (0, _get3["default"])((0, _getPrototypeOf2["default"])(PaymentDevice.prototype), "removeAllListeners", this).call(this, eventNames);
      } else {
        this.log.debug('Removing all listeners', {
          eventNames: eventNames,
          listenerCounts: countListeners(eventNames)
        });
        (0, _map["default"])(eventNames).call(eventNames, function (eventName) {
          return (0, _get3["default"])((0, _getPrototypeOf2["default"])(PaymentDevice.prototype), "removeAllListeners", _this11).call(_this11, eventName);
        });
        this.log.debug('Removed all listeners', {
          eventNames: eventNames,
          listenerCounts: countListeners(eventNames)
        });
      }
    }
  }, {
    key: "emit",
    value: function emit(eventName) {
      var _get2, _context8;

      var _iterator4 = _createForOfIteratorHelper(this.listeners(eventName)),
          _step4;

      try {
        for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
          var listener = _step4.value;
          this.log.debug('Emitting event', {
            id: listener.id,
            eventName: eventName
          });
        }
      } catch (err) {
        _iterator4.e(err);
      } finally {
        _iterator4.f();
      }

      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
        args[_key - 1] = arguments[_key];
      }

      (_get2 = (0, _get3["default"])((0, _getPrototypeOf2["default"])(PaymentDevice.prototype), "emit", this)).call.apply(_get2, (0, _concat["default"])(_context8 = [this, eventName]).call(_context8, args));
    }
  }, {
    key: "addState",
    value: function addState(state) {
      this.log.debug('Adding state', {
        state: (0, _manticoreUtil.getPropertyName)(_deviceState["default"], state)
      });
      this.state |= state;
    }
  }, {
    key: "removeState",
    value: function removeState(state) {
      this.log.debug('Removing device state', {
        state: (0, _manticoreUtil.getPropertyName)(_deviceState["default"], state)
      });
      this.state &= ~state;
    }
  }, {
    key: "hasState",
    value: function hasState(state) {
      return (this.state & state) === state;
    }
    /**
     * Return true if this device is connected
     * @method
     * @returns {bool} true if the device is currently connected
     */

  }, {
    key: "isConnected",
    value: function isConnected() {
      return this["native"].isConnected();
    }
    /**
     * Indicates if the device is ready for transaction
     * @returns {DeviceStatus} deviceStatus
     */

  }, {
    key: "isReadyForTransaction",
    value: function isReadyForTransaction() {
      var status = new _DeviceStatus["default"]();
      status.isReady = false;

      if (!this.isConnected()) {
        status.error = _paymentDeviceError.deviceError.deviceNotConnected;
      } else if (!this.isReady) {
        status.error = _paymentDeviceError.deviceError.notFunctional;
      } else if (this.isUpdateRequired()) {
        status.error = _paymentDeviceError.deviceError.swUpdatePending;
      } else if (this.lastKnownBatteryInfo && this.lastKnownBatteryInfo.isLevelCritical) {
        status.error = _paymentDeviceError.deviceError.lowOnBattery;
      } else if (this.isBlacklisted) {
        status.error = _paymentDeviceError.deviceError.blacklisted;
      } else {
        status.isReady = true;
        status.error = null;
      }

      return status;
    }
  }, {
    key: "isUpdateRequired",
    value: function isUpdateRequired() {
      return this.pendingUpdate && this.pendingUpdate.isRequired && !this.pendingUpdate.wasInstalled;
    }
    /**
     * Return true if this device has the requested capability
     * @method
     * @param {deviceCapabilityType} capability the enum type to check if the device has it
     * @returns {bool} true if the device supporting the capability
     */

  }, {
    key: "doesHaveCapability",
    value: function doesHaveCapability(capability) {
      // eslint-disable-line no-unused-vars
      return false;
    }
    /**
     * Display a predefined message on the terminal, if supported
     * @param {CardReader~readerDisplayArgs} opt Message display options
     * @param {function} callback Called when the message has been displayed, with any error
     * @package
     */

  }, {
    key: "display",
    value: function display(opt, callback) {
      // No-op by default, no error
      callback(null);
    }
    /**
     * Prompt for a non-secure amount or numeric value to be entered.
     * @param {NumericEntryOptions} options Options governing numeric entry
     * @param {NumericEntryOptions~amountEntered} callback Called when the attempt completes
     * @package
     */

  }, {
    key: "promptForNumericEntry",
    value: function promptForNumericEntry(options, callback) {
      // No-op by default, no error
      callback(null);
    }
    /**
     * Get a secure Personal Account Number (PAN) from the device
     * @param {SecureEntryOptions} options
     * @param {SecureEntryOptions~secureEntry} callback
     * @package
     */

  }, {
    key: "promptForSecureAccountNumber",
    value: function promptForSecureAccountNumber(options, callback) {
      // No-op by default, no error
      callback(null);
    }
  }, {
    key: "invoice",
    get: function get() {
      return this.context ? this.context.invoice : null;
    }
    /**
     * Look at an accessory connection and decide if we support it. Will differ a bit
     * on different platforms
     * @package
     * @method
     * @param {object} info
     */

  }, {
    key: "toJSON",
    value: function toJSON() {
      return {
        id: this.id,
        name: this.name,
        manufacturer: this.manufacturer,
        model: this.model,
        serialNumber: this.serialNumber,
        address: this.address,
        isConnected: this.isConnected()
      };
    }
  }, {
    key: "toString",
    value: function toString() {
      return (0, _stringify["default"])(this.toJSON());
    }
  }], [{
    key: "discovered",
    value: function discovered(pd) {
      var _context9;

      var previouslyDiscoveredDevice = (0, _find["default"])(_context9 = PaymentDevice.devices).call(_context9, function (device) {
        return device.equals(pd);
      });

      if (previouslyDiscoveredDevice) {
        Log.info('Device was previously discovered. Will not emit device discovered event', {
          pd: pd
        });
        return previouslyDiscoveredDevice;
      }

      PaymentDevice.devices.push(pd);
      Log.info('Discovered device. Emitting device event', {
        pd: pd,
        existingDevices: PaymentDevice.devices
      });
      PaymentDevice.Events.emit(PaymentDevice.Event.deviceDiscovered, pd);
      return pd;
    }
  }, {
    key: "isSupported",
    value: function isSupported(info) {
      var _context10;

      if ((0, _indexOf["default"])(_context10 = info.protocols).call(_context10, 'com.paypal.here.reader') >= 0) {
        return 'MiuraDevice';
      }

      return null;
    }
  }]);
  return PaymentDevice;
}(_CardReader2["default"]);

exports["default"] = PaymentDevice;
PaymentDevice.devices = [];
PaymentDevice.Event = {
  batteryStatusUpdate: 'batteryStatusUpdate',
  blacklisted: 'blacklisted',
  cardRemoved: 'cardRemoved',
  cardPresented: 'cardPresented',
  cancelled: 'cancelled',
  cancelRequested: 'cancelRequested',
  connected: 'connected',
  connectionError: 'connectionError',
  contactlessReaderDeactivated: 'contactlessReaderDeactivated',
  contactlessReaderActivated: 'contactlessReaderActivated',
  deviceDiscovered: 'deviceDiscovered',
  deviceRemoved: 'deviceRemoved',
  disconnected: 'disconnected',
  error: 'error',
  proceed: 'proceed',
  selected: 'selected',
  updateRequired: 'updateRequired'
};
/**
 * Indicates the maximum number of payment retries that are allowed per payment error event
 * @type {{InvalidChip: number}}
 * @package
 */

PaymentDevice.constant = {
  InvalidChipRetryCount: 2
};
/**
 * List of Auth codes that could be sent to the terminal in order to complete the transaction.
 * @package
 * @type {{TrxnFailureAuthCode: string, TrxnSuccessAuthCode: string, NoNetworkAuthCode: string}}
 */

PaymentDevice.authCode = {
  TransactionFailure: '8A023035',
  TransactionSuccess: '8A023030',
  NoNetwork: '8A025A33'
};
/**
 * The reader is now connected and ready.
 * @event PaymentDevice#connected
 */

/**
 * The reader is now selected and active to be used.
 * @event PaymentDevice#selected
 */

/**
 * The connection attempt with the reader failed
 * @event PaymentDevice#connectionError
 * @param {error} error Any error that caused the connection failure
 */

/**
 * The reader is now disconnected.
 * @event PaymentDevice#disconnected
 * @param {error} error Any error that caused the disconnect
 */

/**
 * A software update is required for the reader.
 * @event PaymentDevice#updateRequired
 * @param {DeviceUpdate} update The update that should or must be applied
 */

/**
 * The battery status has been updated
 * @event PaymentDevice#batteryStatusUpdate
 * @param {BatteryInfo} batteryInfo the latest battery info
 */

/**
 * The battery status has been updated
 * @callback PaymentDevice~batteryInfo
 * @param {error} error Any error in retrieving battery info
 * @param {BatteryInfo} batteryInfo the latest battery info
 */

/**
 * A card has been removed (generally from an EMV reader, where the card
 * stays in the reader for some time)
 * @event PaymentDevice#cardRemoved
 */

/**
 * Depending on your region and the buyer payment type, this can mean a magnetic card
 * was swiped, an EMV card was
 * inserted, or an NFC card/device was tapped.
 * @event PaymentDevice#cardPresented
 * @param {Card} card Information about the card.
 */

/**
 * @callback PaymentDevice~connect
 * @param {error} error Error (if any) that caused the action to fail
 */

/**
 * @callback PaymentDevice~disconnect
 * @param {error} error Error (if any) that caused the action to fail
 */

/**
 * @callback PaymentDevice~deviceLogs
 * @param {error} error Error (if any) that caused the action to fail
 */

/**
 * The reader is blacklisted.
 * @event PaymentDevice#blacklisted
 */
// Used to fire the "global" deviceAdded event

PaymentDevice.Events = new _events.EventEmitter();

function getCommonMessages(transactionFlagName) {
  return {
    Cancelled: "".concat(transactionFlagName, ".Cancelled"),
    CancelledRemoveCard: "".concat(transactionFlagName, ".CancelledRemoveCard"),
    Declined: "".concat(transactionFlagName, ".Declined"),
    DeclinedRemoveCard: "".concat(transactionFlagName, ".DeclinedRemoveCard"),
    Failed: "".concat(transactionFlagName, ".Failed"),
    FailedRemoveCard: "".concat(transactionFlagName, ".FailedRemoveCard"),
    Processing: "".concat(transactionFlagName, ".Processing"),
    ProcessingContact: "".concat(transactionFlagName, ".Processing.Contact"),
    ProcessingRemoveCard: "".concat(transactionFlagName, ".Processing.RemoveCard"),
    RemoveCard: "".concat(transactionFlagName, ".RemoveCard"),
    Successful: "".concat(transactionFlagName, ".Successful")
  };
}

PaymentDevice.Message = {
  AmountTooHigh: 'AmountTooHigh',
  AmountTooHighRemoveCard: 'AmountTooHighRemoveCard',
  AmountTooLow: 'AmountTooLow',
  AmountTooLowRemoveCard: 'AmountTooLowRemoveCard',
  Auth: _objectSpread({
    CompleteTransaction: 'Auth.CompleteTransaction'
  }, getCommonMessages('Auth')),
  AuthVault: _objectSpread({}, getCommonMessages('AuthVault')),
  Sale: _objectSpread({}, getCommonMessages('Sale')),
  SaleVault: _objectSpread({}, getCommonMessages('SaleVault')),
  Refund: _objectSpread({}, getCommonMessages('Refund')),
  QuickChipSale: _objectSpread({}, getCommonMessages('QuickChipSale')),
  QuickChipAuth: _objectSpread({}, getCommonMessages('QuickChipAuth')),
  QuickChipSaleVault: _objectSpread({}, getCommonMessages('QuickChipSaleVault')),
  QuickChipAuthVault: _objectSpread({}, getCommonMessages('QuickChipAuthVault')),
  Blacklisted: 'Blacklisted',
  BlockedCardInserted: 'Declined.BlockedCardInserted',
  Cancelling: 'Cancelling',
  CannotSwipeChip: 'CannotSwipeChip',
  Complete: 'Complete',
  CompletingPayment: 'CompletingPayment',
  CompletingVault: 'CompletingVault',
  ConfirmTip: 'ConfirmTip',
  Connecting: 'Connecting',
  ConnectionFailed: 'ConnectionFailed',
  ContactIssuer: 'ContactIssuer',
  ContactIssuerRemoveCard: 'ContactIssuerRemoveCard',
  GeneralNfcFallback: 'GeneralNfcFallback',
  IncorrectPin: 'Declined.IncorrectPin',
  InvalidChipCard: 'Declined.InvalidChipCard',
  InvoiceTotal: 'InvoiceTotal',
  NetworkOffline: 'NetworkOffline',
  NetworkOfflineRemoveCard: 'NetworkOfflineRemoveCard',
  NfcDecline: 'Declined.NfcDecline',
  NfcTimeOut: 'NfcTimeout',
  NotConnected: 'NotConnected',
  NotReady: 'NotReady',
  OrderInProgress: 'Order.InProgress',
  Processing: 'Processing.Tap',
  ProcessingContact: 'Processing.Contact',
  ProcessingContactWithPin: 'Processing.ContactPinOk',
  ProcessingWithPin: 'Processing.PinOk',
  QuickChip: {
    Processing: 'QuickChip.Processing',
    RemoveCard: 'QuickChip.RemoveCard',
    Signature: 'QuickChip.Signature'
  },
  Ready: 'Ready',
  ReadyForInsertAndSwipePayment: 'ReadyForInsertAndSwipePayment',
  ReadyForInsertPayment: 'ReadyForInsertPayment',
  ReadyForSwipePayment: 'ReadyForSwipePayment',
  ReadyWithId: 'ReadyWithId',
  RechargeNow: 'RechargeNow',
  RefundCardMismatch: 'Refund.CardMismatch',
  RefundCardMismatchRemoveCard: 'Refund.CardMismatchRemoveCard',
  RequestTip: 'RequestTip',
  SignContact: 'Sign.Contact',
  SignTap: 'Sign.Tap',
  SignatureForInsert: 'Signature.Insert',
  SignatureForNonEmv: 'Signature.NonEmv',
  SignatureForTap: 'Signature.Tap',
  NoEmptySignature: 'Signature.EmptyNotAllowed',
  NoSignatureCancellationOnSwipe: 'Signature.NoCancellationOnSwipe',
  SoftwareUpdateAvailable: 'SwUpdate.Available',
  SoftwareUpdateComplete: 'SwUpdate.Complete',
  SoftwareUpdateDownloading: 'SwUpdate.Downloading',
  SoftwareUpdateFailed: 'SwUpdate.Failed',
  SoftwareUpdateProgress: 'SwUpdate.Progress',
  SoftwareUpdateRequired: 'SwUpdate.Required',
  UnableToReadNfcCard: 'Declined.UnableToReadNfcCard',
  Vault: _objectSpread({
    Completing: 'Vault.Completing',
    ProcessingContact: 'Vault.Processing.Contact',
    ReadyForAll: 'Vault.ReadyForAll'
  }, getCommonMessages('Vault')),
  WaitForPayment: 'Order.Ready'
};
PaymentDevice.ConnectionTimeOut = msDefaultMaxConnectionDuration;
},{"./CardReader":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardReader.js","./FormFactor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/FormFactor.js","./Messages/DeviceStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/DeviceStatus.js","./ReaderModel":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/ReaderModel.js","./deviceManufacturer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/deviceManufacturer.js","./deviceState":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/deviceState.js","./paymentDeviceError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/paymentDeviceError.js","./readerInformation":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/readerInformation.js","@babel/runtime-corejs3/core-js-stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/instance/splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js","@babel/runtime-corejs3/core-js-stable/instance/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/entries":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/entries.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set.js","@babel/runtime-corejs3/core-js-stable/set-interval":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-interval.js","@babel/runtime-corejs3/core-js-stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js","@babel/runtime-corejs3/core-js/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","core-js/modules/es.date.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js","core-js/modules/es.date.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js","core-js/modules/es.function.name.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.function.name.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/web.url.to-json.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/ReaderModel.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/ReaderModel.js"][0].apply(exports,arguments)
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/SecureEntryOptions.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _ManuallyEnteredCard = _interopRequireDefault(require("./ManuallyEnteredCard"));

/* eslint-disable no-unused-vars */

/**
 * SecureEntryOptions specify which values you would like the SDK
 * to gather from the terminal and which you would like to just gather
 * on your own
 * @class
 * @property {bool} cvv true to gather the CVV value on terminal, false to skip that
 * @property {bool} expiration true to gather expiration month and year on terminal
 */
var SecureEntryOptions = /*#__PURE__*/(0, _createClass2["default"])(function SecureEntryOptions() {
  (0, _classCallCheck2["default"])(this, SecureEntryOptions);
});
/**
 * Called after a request to secure account number entry
 * @callback SecureEntryOptions~secureEntry
 * @param {error} error The error encountered - namely cancellation or lack of terminal support
 * @param {ManuallyEnteredCard} card The card object representing the information entered.
 *  You may still need to gather more information such as CVV and/or expiration date
 */

/* eslint-enable no-unused-vars */

exports["default"] = SecureEntryOptions;
},{"./ManuallyEnteredCard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/ManuallyEnteredCard.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/SupportedEmvAid.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _CardIssuer = _interopRequireDefault(require("./CardIssuer"));

var EmvAid = {
  A0000000031010: _CardIssuer["default"].Visa,
  A0000000041010: _CardIssuer["default"].MasterCard,
  A00000002501: _CardIssuer["default"].Amex,
  A0000000043060: _CardIssuer["default"].Maestro,
  A0000001523010: _CardIssuer["default"].Discover
};
var _default = EmvAid;
exports["default"] = _default;
},{"./CardIssuer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardIssuer.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/TransactionType.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * A transaction context is created for a certain operation - sale
 * (meaning auth+capture), auth or refund.
 * @enum {int}
 */
var TransactionType = {
  /**
   * An attempt to complete a transfer of funds between merchant and customer
   */
  Sale: 0,

  /**
   * An attempt to get authorization of funds for later capture
   */
  Auth: 1,

  /**
   * An attempt to return the entire amount of the remaining paid amount of an invoice
   */
  Refund: 2,

  /**
   * An attempt to return a partial amount of the remaining paid amount of an invoice
   */
  PartialRefund: 3,

  /**
   * An attempt to vault the card
   */
  Vault: 4,

  /**
   * An attempt to return a partial amount of the remaining paid amount of an invoice
   */
  Redemption: 5
};
var _default = TransactionType;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/appMessage.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Enum for messages that should be displayed on App side
 * @enum {string}
 */
var appMessage = {
  /**
   * SW Update is initializing
   */
  SwUpdateInitializing: {
    title: 'SwUpgrade.Updating.Title',
    message: 'SwUpgrade.Initializing'
  },

  /**
   * Reconnecting during SW Update
   */
  SwUpdateReconnecting: {
    title: 'SwUpgrade.Updating.Title',
    message: 'SwUpgrade.Reconnecting'
  },

  /**
   * Restart instruction during SW Update
   */
  SwUpdateRestartInstruction: {
    title: 'SwUpgrade.RestartInstruction.Title',
    message: 'SwUpgrade.RestartInstruction.Msg'
  },

  /**
   * Connected to card reader
   */
  SwUpdateConnected: {
    title: 'SwUpgrade.Updating.Title',
    message: 'SwUpgrade.Connected'
  },
  SwUpdate: {
    buttons: {
      notNow: 'SwUpgrade.Buttons.NotNow',
      ok: 'SwUpgrade.Buttons.Ok',
      updateNow: 'SwUpgrade.Buttons.UpdateNow',
      retry: 'SwUpgrade.Buttons.Retry'
    }
  },
  SwUpdateFailed: {
    title: 'SwUpgrade.Failed.Title',
    message: 'SwUpgrade.Failed.Msg',
    messageBatteryLow: 'SwUpgrade.Failed.BatteryLow'
  },
  SwUpdateSuccessful: {
    title: 'SwUpgrade.Success.Title',
    message: 'SwUpgrade.Success.Msg'
  },

  /**
   * SW Update is required
   */
  SwUpdateRequired: {
    title: 'SwUpgrade.Required.Title',
    message: 'SwUpgrade.Required.Msg'
  },

  /**
   * SW Update is optional
   */
  SwUpdateOptional: {
    title: 'SwUpgrade.Optional.Title',
    message: 'SwUpgrade.Optional.Msg'
  },

  /**
   * SW Update is in progress
   */
  SwUpdateInProgress: {
    title: 'SwUpgrade.Updating.Title',
    message: 'SwUpgrade.Updating.Msg'
  },

  /**
   * SW Update download in progress
   */
  SwUpdateDownloading: {
    title: 'SwUpgrade.Updating.Title',
    message: 'SwUpgrade.Downloading'
  },
  SwUpdateInProgressWithDetails: {
    title: 'SwUpgrade.Updating.Title',
    message: 'SwUpgrade.UpdatingWithDetails'
  },

  /**
   * SW Update is validating security keys
   */
  SwUpdateValidatingSecurityKeys: {
    title: 'SwUpgrade.Updating.Title',
    message: 'SwUpgrade.ValidatingSecurityKeys'
  },

  /**
   * Security keys were installed
   */
  SwUpdateSecurityKeysInstalled: {
    title: 'SwUpgrade.Updating.Title',
    message: 'SwUpgrade.SecurityKeysInstalled'
  },

  /**
   * Security keys were installed
   */
  SwUpdateRestarting: {
    title: 'SwUpgrade.Updating.Title',
    message: 'SwUpgrade.Restarting'
  },

  /**
   * Card insert was not successful due to incorrect insert or broken chip. Prompt user to retry card insert or swipe
   */
  UnsuccessfulInsert: {
    title: 'Tx.Alert.UnsuccessfulInsert.Title',
    message: 'Tx.Alert.UnsuccessfulInsert.Msg'
  },

  /**
   * Card reader can only take swipe payments
   */
  ReadyForSwipeOnly: {
    title: 'Tx.Alert.ReadyForSwipeOnly.Title',
    message: 'Tx.Alert.ReadyForSwipeOnly.Msg',
    cancel: 'Cancel',
    imageIcon: 'img_emv_swipe'
  },

  /**
   * Connecting to reader
   */
  ConnectingToDevice: {
    title: 'Device.Connecting.Title'
  },
  RetryConnectingToDevice: {
    title: 'Device.RetryConnecting.Title',
    message: 'Device.RetryConnecting.Message',
    buttons: ['Device.RetryConnecting.Buttons.Retry'],
    cancel: 'Device.RetryConnecting.Buttons.NotNow'
  },
  ConnectingToDeviceFailed: {
    title: 'Device.ConnectingFailed.Title',
    cancel: 'Device.ConnectingFailed.Buttons.Cancel'
  },
  LowBattery: {
    title: 'Tx.Alert.LowBattery.Title',
    message: 'Tx.Alert.LowBattery.Msg',
    cancel: 'OK'
  }
};
var _default = appMessage;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/batteryStatus.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _manticoreUtil = require("manticore-util");

/**
 * Battery status
 * @enum {int}
 */
var batteryStatus = {
  /**
   * Battery status not known
   */
  unknown: 0,

  /**
   * Battery is draining and not connected to power
   */
  draining: 1,

  /**
   * Battery is fully drained
   */
  drained: 2,

  /**
   * Battery is charging
   */
  charging: 3,

  /**
   * Battery is fully charged
   */
  charged: 4
};
batteryStatus.keyFromValue = (0, _manticoreUtil.reverseKeysAndValues)(batteryStatus);
var _default = batteryStatus;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/cardError.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.cardErrorDomain = exports.cardError = void 0;

var _freeze = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/freeze"));

var _paymentDeviceError = require("./paymentDeviceError");

var domain = 'Card';
exports.cardErrorDomain = domain;
var cardError = {
  invalidExpiryDate: (0, _freeze["default"])((0, _paymentDeviceError.payPalError)(domain, 0, 'Expiry date should be in MMYYYY format'))
};
exports.cardError = cardError;
},{"./paymentDeviceError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/paymentDeviceError.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/freeze":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/freeze.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/deviceCapabilityType.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * The device capability types
 * @enum {int}
 */
var deviceCapabilityType = {
  /**
   * no capability
   */
  none: 0,

  /**
   * Device has the display
   */
  display: 1,

  /**
   * Device has the keyboard
   */
  keyboard: 2,

  /**
   * Device has the secure entry
   */
  secureEntry: 3,

  /**
   * Device supports contactless payments
   */
  contactless: 4
};
var _default = deviceCapabilityType;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/deviceManufacturer.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _manticoreUtil = require("manticore-util");

/**
 * The device manufacturers
 * @enum {int}
 */
var deviceManufacturer = {
  /**
   * Miura
   */
  miura: 0,

  /**
   * Manufacturer is Ingenico
   */
  ingenico: 1,

  /**
   * Manufacturer is BBPOS
   */
  bbpos: 2,

  /**
   * Manufacturer is Roam
   */
  roam: 3,

  /**
   * Manufacturer is Verifone
   */
  verifone: 4
};
deviceManufacturer.keyFromValue = (0, _manticoreUtil.reverseKeysAndValues)(deviceManufacturer);
var _default = deviceManufacturer;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/deviceState.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

/**
 * Indicates the current state of the device
 */
var deviceState = {
  unknown: 0,
  softwareUpdate: 1,
  hardResetting: 2
};
var _default = deviceState;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

_Object$defineProperty(exports, "AvailableApplications", {
  enumerable: true,
  get: function get() {
    return _AvailableApplications["default"];
  }
});

_Object$defineProperty(exports, "BatteryInfo", {
  enumerable: true,
  get: function get() {
    return _BatteryInfo["default"];
  }
});

_Object$defineProperty(exports, "Card", {
  enumerable: true,
  get: function get() {
    return _Card["default"];
  }
});

_Object$defineProperty(exports, "CardDataUtil", {
  enumerable: true,
  get: function get() {
    return _CardDataUtil["default"];
  }
});

_Object$defineProperty(exports, "CardInsertedHandler", {
  enumerable: true,
  get: function get() {
    return _CardInsertedHandler["default"];
  }
});

_Object$defineProperty(exports, "CardIssuer", {
  enumerable: true,
  get: function get() {
    return _CardIssuer["default"];
  }
});

_Object$defineProperty(exports, "CardPresentEvent", {
  enumerable: true,
  get: function get() {
    return _CardPresentEvent["default"];
  }
});

_Object$defineProperty(exports, "CardReader", {
  enumerable: true,
  get: function get() {
    return _CardReader["default"];
  }
});

_Object$defineProperty(exports, "CardReaderResponse", {
  enumerable: true,
  get: function get() {
    return _CardReaderResponse["default"];
  }
});

_Object$defineProperty(exports, "CardStatus", {
  enumerable: true,
  get: function get() {
    return _CardStatus["default"];
  }
});

_Object$defineProperty(exports, "CommandBuilder", {
  enumerable: true,
  get: function get() {
    return _CommandBuilder["default"];
  }
});

_Object$defineProperty(exports, "DeviceStatus", {
  enumerable: true,
  get: function get() {
    return _DeviceStatus["default"];
  }
});

_Object$defineProperty(exports, "DeviceUpdate", {
  enumerable: true,
  get: function get() {
    return _DeviceUpdate["default"];
  }
});

_Object$defineProperty(exports, "DigitalCard", {
  enumerable: true,
  get: function get() {
    return _DigitalCard["default"];
  }
});

_Object$defineProperty(exports, "EntryMode", {
  enumerable: true,
  get: function get() {
    return _EntryMode["default"];
  }
});

_Object$defineProperty(exports, "FormFactor", {
  enumerable: true,
  get: function get() {
    return _FormFactor["default"];
  }
});

_Object$defineProperty(exports, "MagneticCard", {
  enumerable: true,
  get: function get() {
    return _MagneticCard["default"];
  }
});

_Object$defineProperty(exports, "MagneticReaderDevice", {
  enumerable: true,
  get: function get() {
    return _MagneticReaderDevice["default"];
  }
});

_Object$defineProperty(exports, "ManuallyEnteredCard", {
  enumerable: true,
  get: function get() {
    return _ManuallyEnteredCard["default"];
  }
});

_Object$defineProperty(exports, "NumericEntryOptions", {
  enumerable: true,
  get: function get() {
    return _NumericEntryOptions["default"];
  }
});

_Object$defineProperty(exports, "NumericEntryType", {
  enumerable: true,
  get: function get() {
    return _NumericEntryType["default"];
  }
});

_Object$defineProperty(exports, "PaymentDevice", {
  enumerable: true,
  get: function get() {
    return _PaymentDevice["default"];
  }
});

_Object$defineProperty(exports, "PinEvent", {
  enumerable: true,
  get: function get() {
    return _PinEvent["default"];
  }
});

_Object$defineProperty(exports, "ReaderModel", {
  enumerable: true,
  get: function get() {
    return _ReaderModel["default"];
  }
});

_Object$defineProperty(exports, "SecureEntryOptions", {
  enumerable: true,
  get: function get() {
    return _SecureEntryOptions["default"];
  }
});

_Object$defineProperty(exports, "StorageType", {
  enumerable: true,
  get: function get() {
    return _storageType["default"];
  }
});

_Object$defineProperty(exports, "TransactionType", {
  enumerable: true,
  get: function get() {
    return _TransactionType["default"];
  }
});

_Object$defineProperty(exports, "appMessage", {
  enumerable: true,
  get: function get() {
    return _appMessage["default"];
  }
});

_Object$defineProperty(exports, "batteryStatus", {
  enumerable: true,
  get: function get() {
    return _batteryStatus["default"];
  }
});

_Object$defineProperty(exports, "cardError", {
  enumerable: true,
  get: function get() {
    return _cardError.cardError;
  }
});

_Object$defineProperty(exports, "cardErrorDomain", {
  enumerable: true,
  get: function get() {
    return _cardError.cardErrorDomain;
  }
});

_Object$defineProperty(exports, "deviceCapabilityType", {
  enumerable: true,
  get: function get() {
    return _deviceCapabilityType["default"];
  }
});

_Object$defineProperty(exports, "deviceError", {
  enumerable: true,
  get: function get() {
    return _paymentDeviceError.deviceError;
  }
});

_Object$defineProperty(exports, "deviceErrorDomain", {
  enumerable: true,
  get: function get() {
    return _paymentDeviceError.deviceErrorDomain;
  }
});

_Object$defineProperty(exports, "deviceManufacturer", {
  enumerable: true,
  get: function get() {
    return _deviceManufacturer["default"];
  }
});

_Object$defineProperty(exports, "readerConnectionType", {
  enumerable: true,
  get: function get() {
    return _readerInformation.readerConnectionType;
  }
});

_Object$defineProperty(exports, "readerType", {
  enumerable: true,
  get: function get() {
    return _readerInformation.readerType;
  }
});

var _CardReader = _interopRequireDefault(require("./CardReader"));

var _NumericEntryOptions = _interopRequireDefault(require("./NumericEntryOptions"));

var _NumericEntryType = _interopRequireDefault(require("./NumericEntryType"));

var _SecureEntryOptions = _interopRequireDefault(require("./SecureEntryOptions"));

var _PaymentDevice = _interopRequireDefault(require("./PaymentDevice"));

var _BatteryInfo = _interopRequireDefault(require("./BatteryInfo"));

var _batteryStatus = _interopRequireDefault(require("./batteryStatus"));

var _MagneticCard = _interopRequireDefault(require("./MagneticCard"));

var _ManuallyEnteredCard = _interopRequireDefault(require("./ManuallyEnteredCard"));

var _DigitalCard = _interopRequireDefault(require("./DigitalCard"));

var _CardDataUtil = _interopRequireDefault(require("./CardDataUtil"));

var _MagneticReaderDevice = _interopRequireDefault(require("./MagneticReaderDevice"));

var _paymentDeviceError = require("./paymentDeviceError");

var _cardError = require("./cardError");

var _CardStatus = _interopRequireDefault(require("./CardStatus"));

var _CardIssuer = _interopRequireDefault(require("./CardIssuer"));

var _FormFactor = _interopRequireDefault(require("./FormFactor"));

var _TransactionType = _interopRequireDefault(require("./TransactionType"));

var _deviceCapabilityType = _interopRequireDefault(require("./deviceCapabilityType"));

var _DeviceUpdate = _interopRequireDefault(require("./DeviceUpdate"));

var _appMessage = _interopRequireDefault(require("./appMessage"));

var _CardPresentEvent = _interopRequireDefault(require("./Messages/CardPresentEvent"));

var _Card = _interopRequireDefault(require("./Messages/Card"));

var _AvailableApplications = _interopRequireDefault(require("./Messages/AvailableApplications"));

var _PinEvent = _interopRequireDefault(require("./Messages/PinEvent"));

var _CardReaderResponse = _interopRequireDefault(require("./Messages/CardReaderResponse"));

var _readerInformation = require("./readerInformation");

var _CardInsertedHandler = _interopRequireDefault(require("./CardInsertedHandler"));

var _DeviceStatus = _interopRequireDefault(require("./Messages/DeviceStatus"));

var _deviceManufacturer = _interopRequireDefault(require("./deviceManufacturer"));

var _ReaderModel = _interopRequireDefault(require("./ReaderModel"));

var _CommandBuilder = _interopRequireDefault(require("./CommandBuilder"));

var _EntryMode = _interopRequireDefault(require("./EntryMode"));

var _storageType = _interopRequireDefault(require("./storageType"));
},{"./BatteryInfo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/BatteryInfo.js","./CardDataUtil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardDataUtil.js","./CardInsertedHandler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardInsertedHandler.js","./CardIssuer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardIssuer.js","./CardReader":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardReader.js","./CardStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CardStatus.js","./CommandBuilder":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/CommandBuilder.js","./DeviceUpdate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/DeviceUpdate.js","./DigitalCard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/DigitalCard.js","./EntryMode":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/EntryMode.js","./FormFactor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/FormFactor.js","./MagneticCard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/MagneticCard.js","./MagneticReaderDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/MagneticReaderDevice.js","./ManuallyEnteredCard":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/ManuallyEnteredCard.js","./Messages/AvailableApplications":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/AvailableApplications.js","./Messages/Card":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/Card.js","./Messages/CardPresentEvent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/CardPresentEvent.js","./Messages/CardReaderResponse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/CardReaderResponse.js","./Messages/DeviceStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/DeviceStatus.js","./Messages/PinEvent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/Messages/PinEvent.js","./NumericEntryOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/NumericEntryOptions.js","./NumericEntryType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/NumericEntryType.js","./PaymentDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/PaymentDevice.js","./ReaderModel":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/ReaderModel.js","./SecureEntryOptions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/SecureEntryOptions.js","./TransactionType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/TransactionType.js","./appMessage":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/appMessage.js","./batteryStatus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/batteryStatus.js","./cardError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/cardError.js","./deviceCapabilityType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/deviceCapabilityType.js","./deviceManufacturer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/deviceManufacturer.js","./paymentDeviceError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/paymentDeviceError.js","./readerInformation":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/readerInformation.js","./storageType":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/storageType.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/paymentDeviceError.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.deviceErrorDomain = exports.deviceError = void 0;
exports.payPalError = payPalError;

require("core-js/modules/es.date.to-string.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _manticorePaypalerror = require("@paypalcorp/manticore-paypalerror");

var domain = 'PaymentDevice';
exports.deviceErrorDomain = domain;

function payPalError(errDomain, code, message) {
  var errorInfo = new _manticorePaypalerror.PayPalErrorInfo();
  errorInfo.code = code.toString();
  errorInfo.domain = errDomain;
  errorInfo.message = message;
  return _manticorePaypalerror.PayPalError.makeError(null, errorInfo);
}
/**
 * All payment device errors belong here
 */


var deviceError = {
  generic: payPalError(domain, 0, 'Generic error'),
  nfcTimeout: payPalError(domain, 1, 'Contactless reader timed out waiting for payment presentation'),
  nfcNotAllowed: payPalError(domain, 2, 'Contactless payment not allowed on this card'),
  tryDifferentCard: payPalError(domain, 3, 'Try different card'),
  mustInsertCard: payPalError(domain, 4, 'Must insert presented card'),
  mustSwipeCard: payPalError(domain, 5, 'Must swipe presented card'),
  hardwareError: payPalError(domain, 6, 'Hardware error'),
  cardBlocked: payPalError(domain, 7, 'Presented card is blocked'),
  contactIssuer: payPalError(domain, 8, 'Payment was declined. Contact issuer'),
  invalidChip: payPalError(domain, 9, 'Chip is invalid'),
  cannotSwipeChipCard: payPalError(domain, 10, 'Cannot swipe a chip card'),
  smartCardNotInSlot: payPalError(domain, 11, 'Card not in slot'),
  paymentCancelled: payPalError(domain, 12, 'Payment was cancelled'),
  contactlessPaymentAbortedByCardInsert: payPalError(domain, 13, 'Contactless payment was aborted by card insert'),
  contactlessPaymentAbortedByCardSwipe: payPalError(domain, 14, 'Contactless payment was aborted by card swipe'),
  badEmvData: payPalError(domain, 15, 'Bad EMV data'),
  deviceNotConnected: payPalError(domain, 16, 'Device not connected'),
  cannotAcceptMessage: payPalError(domain, 17, 'Device cannot accept messages in its current state'),
  actionCancelled: payPalError(domain, 18, 'Action was cancelled'),
  secureEntryFailed: payPalError(domain, 19, 'Secure entry failed'),
  numericEntryFailed: payPalError(domain, 20, 'Numeric entry failed'),
  dataValidationError: payPalError(domain, 21, 'Data validation error'),
  unexpectedResponse: payPalError(domain, 22, 'Received unexpected response'),
  failureResponse: payPalError(domain, 23, 'Received failure response'),
  dataRetrievalFailed: payPalError(domain, 24, 'Failed to retrieve expected data'),
  lowOnBattery: payPalError(domain, 25, 'Battery Low'),
  fileNotFound: payPalError(domain, 26, 'Unable to retrieve the file from the device'),
  fileImportFailed: payPalError(domain, 27, 'File import failed'),
  initializationFailed: payPalError(domain, 28, 'Device initialization failed'),
  tipEntryFailed: payPalError(domain, 29, 'Tip entry failed'),
  swUpdateFailed: payPalError(domain, 30, 'Software update failed'),
  notFunctional: payPalError(domain, 31, 'Device not functional at this moment'),
  swUpdatePending: payPalError(domain, 32, 'Software update is pending'),
  cancelReadCardData: payPalError(domain, 33, 'Cancel reading card data'),
  cardReaderNotAvailable: payPalError(domain, 34, 'Card reader not available for connection'),
  corruptFirmware: payPalError(domain, 35, 'Downloaded firmware file was corrupt'),
  unexpectedRequest: payPalError(domain, 36, 'Received unexpected request'),
  actionCannotBeCompleted: payPalError(domain, 37, 'Could not complete requested action'),
  lastActiveReaderNotFound: payPalError(domain, 38, 'Received unexpected request'),
  blacklisted: payPalError(domain, 39, 'Blacklisted'),
  badSwipeData: payPalError(domain, 40, 'Bad Swipe Data'),
  signatureCancelled: payPalError(domain, 41, 'Signature collection cancelled'),
  userCancelled: payPalError(domain, 42, 'User cancelled'),
  noSignature: payPalError(domain, 43, 'Signature not presented'),
  writeFailure: payPalError(domain, 44, 'Write to device failed'),
  socketClosed: payPalError(domain, 45, 'Connection was closed'),
  invalidCardData: payPalError(domain, 46, 'Invalid card data'),
  unableToConnect: payPalError(domain, 47, 'Unable to connect'),
  seePhone: payPalError(domain, 48, 'Further action on buyer phone is required'),
  swUpdateInProgress: payPalError(domain, 49, 'Software update is in progress'),
  activeTransaction: payPalError(domain, 50, 'Card reader has an active transaction'),
  swUpdateCanceled: payPalError(domain, 51, 'Software update canceled'),
  swChecksumMismatch: payPalError(domain, 52, 'Firmware checksum does not match'),
  timeout: payPalError(domain, 53, 'No response received within the timeout duration'),
  batteryInfoNotSupported: payPalError(domain, 54, 'Battery info is not supported')
};
exports.deviceError = deviceError;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@paypalcorp/manticore-paypalerror":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-paypalerror/build/index.js","core-js/modules/es.date.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/readerInformation.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.readerType = exports.readerConnectionType = void 0;

var _manticoreUtil = require("manticore-util");

/**
 * Indicates the type synonymous to the payment acceptance method.
 * @enum {int}
 */
var readerType = {
  /**
   * When the SDK failed to determine the type.
   */
  Unknown: 0,

  /**
   * When the SDK detects a reader capable of supporting only the Magstripe cards.
   */
  Magstripe: 1,

  /**
   * When the SDK detects a reader capable of supporting Magstripe, Chip and Contactless (optional) cards.
   */
  Emv: 2
};
/**
 * Indicates the channel through which the reader is connected.
 * @enum {int}
 */

exports.readerType = readerType;
var readerConnectionType = {
  /**
   * When the SDK failed to determine the connection channel.
   */
  unknown: 0,

  /**
   * When the SDK detects a reader connected to the audio jack.
   */
  audioJack: 1,

  /**
   * When the SDK detects a reader connected via bluetooth.
   */
  bluetooth: 2,

  /**
   * When the SDK detects a reader connected via dock port.
   */
  dockPort: 3,

  /**
   * When the SDK detects a reader connected via USB.
   */
  usb: 4,

  /**
   * When the SDK detects a reader connected via Network.
   */
  network: 5
};
exports.readerConnectionType = readerConnectionType;
readerConnectionType.keyFromValue = (0, _manticoreUtil.reverseKeysAndValues)(readerConnectionType);
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","manticore-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/node_modules/manticore-util/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/storageType.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/pph-sdk-enums/build/StorageType.js"][0].apply(exports,arguments)
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/node_modules/manticore-util/build/index.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getPropertyName = getPropertyName;
exports.extend = extend;
exports.assignSome = assignSome;
exports.assignExcept = assignExcept;
exports.reverseKeysAndValues = reverseKeysAndValues;
exports.clone = clone;
exports.deepToJSON = deepToJSON;
exports.callbackToPromise = callbackToPromise;

var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));

var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/typeof"));

var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/get-iterator"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/is-array"));

/* eslint-disable */
// There are eslint errors which should be fixed but these functions are too widely used, so will suppress them for now
function getPropertyName(obj, propertyVal) {
  var getVal = function getVal(value) {
    for (var prop in obj) {
      if (obj.hasOwnProperty(prop)) {
        if (obj[prop] === value) {
          return prop;
        }
      }
    }

    return null;
  };

  if ((0, _isArray.default)(propertyVal)) {
    var result = [];
    var _iteratorNormalCompletion = true;
    var _didIteratorError = false;
    var _iteratorError = undefined;

    try {
      for (var _iterator = (0, _getIterator2.default)(propertyVal), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
        var value = _step.value;
        var name = getVal(value);

        if (name) {
          result.push(name);
        }
      }
    } catch (err) {
      _didIteratorError = true;
      _iteratorError = err;
    } finally {
      try {
        if (!_iteratorNormalCompletion && _iterator.return != null) {
          _iterator.return();
        }
      } finally {
        if (_didIteratorError) {
          throw _iteratorError;
        }
      }
    }

    return result.join();
  }

  return getVal(propertyVal);
}

function extend(dest, src) {
  var overwriteExisting = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;

  for (var prop in src) {
    if (overwriteExisting) {
      dest[prop] = src[prop];
      continue;
    }

    if (!Object.prototype.hasOwnProperty.call(dest, prop)) {
      dest[prop] = src[prop];
    }
  }

  return dest;
}

function assignSome(dest, src, keys) {
  var _iteratorNormalCompletion2 = true;
  var _didIteratorError2 = false;
  var _iteratorError2 = undefined;

  try {
    for (var _iterator2 = (0, _getIterator2.default)(keys), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
      var prop = _step2.value;

      if (src.hasOwnProperty(prop)) {
        dest[prop] = src[prop];
      }
    }
  } catch (err) {
    _didIteratorError2 = true;
    _iteratorError2 = err;
  } finally {
    try {
      if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
        _iterator2.return();
      }
    } finally {
      if (_didIteratorError2) {
        throw _iteratorError2;
      }
    }
  }

  return dest;
}

function assignExcept(dest, src, keys) {
  for (var prop in src) {
    if (prop[0] !== '_' && src.hasOwnProperty(prop) && keys.indexOf(prop) < 0) {
      dest[prop] = src[prop];
    }
  }

  return dest;
}

function reverseKeysAndValues(obj) {
  if (!obj) {
    return obj;
  }

  var newObject = {};

  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObject[obj[key]] = key;
    }
  }

  return newObject;
}

function clone(obj) {
  var copy; // Handle the 3 simple types, and null or undefined

  if (obj === null || (0, _typeof2.default)(obj) !== 'object') {
    return obj;
  } // Handle Date


  if (obj instanceof Date) {
    copy = new Date();
    copy.setTime(obj.getTime());
    return copy;
  } // Handle Array


  if (obj instanceof Array) {
    copy = [];

    for (var i = 0, len = obj.length; i < len; i++) {
      copy[i] = clone(obj[i]);
    }

    return copy;
  } // Handle Object


  if (obj instanceof Object) {
    copy = {};

    for (var attr in obj) {
      if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
    }

    return copy;
  }

  throw new Error('Unable to copy obj! Its type isn\'t supported.');
} // Like doing JSON.parse(JSON.stringify(obj)), but without the string
// serialization/deserialization overhead.


function deepToJSON(obj) {
  // Handle the 3 simple types, and null or undefined
  if (obj === null || (0, _typeof2.default)(obj) !== 'object') {
    return obj;
  } // Handle thing that has a toJSON method


  if (obj && typeof obj.toJSON === 'function') {
    return deepToJSON(obj.toJSON());
  }

  var retVal; // Handle Array

  if (obj instanceof Array) {
    retVal = [];

    for (var i = 0, len = obj.length; i < len; i++) {
      retVal[i] = deepToJSON(obj[i]);
    }

    return retVal;
  } // Handle Object


  if (obj instanceof Object) {
    retVal = {};

    for (var attr in obj) {
      if (obj.hasOwnProperty(attr)) retVal[attr] = deepToJSON(obj[attr]);
    }

    return retVal;
  }

  throw new Error('Unable to deepToJSON obj! Its type isn\'t supported.');
}

function callbackToPromise(method) {
  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
    args[_key - 1] = arguments[_key];
  }

  return new _promise.default(function (resolve, reject) {
    return method.apply(void 0, args.concat([function (err, result) {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    }]));
  });
}
},{"@babel/runtime-corejs2/core-js/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/array/is-array.js","@babel/runtime-corejs2/core-js/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/get-iterator.js","@babel/runtime-corejs2/core-js/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/promise.js","@babel/runtime-corejs2/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/helpers/interopRequireDefault.js","@babel/runtime-corejs2/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/helpers/typeof.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/CommandBuilder.js":[function(require,module,exports){
"use strict";

require("core-js/modules/es.object.to-string.js");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/keys"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.split.js");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _verifone = require("@paypalcorp/verifone");

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context3, _context4; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context3 = ownKeys(Object(source), !0)).call(_context3, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context4 = ownKeys(Object(source))).call(_context4, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }

var formFactorMap = {
  0: 0x00,
  1: _verifone.StartTransactionEnums.Technology.SWIPE,
  2: _verifone.StartTransactionEnums.Technology.CHIP,
  3: _verifone.StartTransactionEnums.Technology.TAP,
  4: 0x00,
  5: 0x00
};

function splitMessageLines(numberOfLines) {
  var splitBy = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '\n';
  return function splitInLines(message) {
    var _context, _context2;

    var splitMessage = message.split(splitBy);
    return (0, _reduce["default"])(_context = (0, _toConsumableArray2["default"])((0, _keys["default"])(_context2 = Array(numberOfLines)).call(_context2))).call(_context, function (acc, i) {
      return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, "messageLine".concat(i + 1), splitMessage[i]));
    }, {});
  };
}

var VerifoneCommandBuilder = /*#__PURE__*/function (_CommandBuilder) {
  (0, _inherits2["default"])(VerifoneCommandBuilder, _CommandBuilder);

  var _super = _createSuper(VerifoneCommandBuilder);

  function VerifoneCommandBuilder() {
    var _this;

    (0, _classCallCheck2["default"])(this, VerifoneCommandBuilder);
    _this = _super.call(this);
    _this.removeCardMessageSplitter = splitMessageLines(2);
    _this.displayMessageSplitter = splitMessageLines(4);
    return _this;
  }

  (0, _createClass2["default"])(VerifoneCommandBuilder, [{
    key: "coldCancel",
    value: function coldCancel(callback) {
      return {
        action: 'coldCancel',
        argumentObject: {
          callback: callback
        }
      };
    }
  }, {
    key: "abortTransactionCmd",
    value: function abortTransactionCmd(callback) {
      return {
        action: 'cancel',
        argumentObject: {
          callback: callback
        }
      };
    }
  }, {
    key: "clearTransactionCmd",
    value: function clearTransactionCmd() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      return {
        action: 'clearScreen',
        argumentObject: {
          callback: callback
        }
      };
    }
  }, {
    key: "deactivateCancel",
    value: function deactivateCancel() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      return {
        action: 'cancel',
        argumentObject: {
          screenAction: _verifone.CancelCommandEnums.Screen.NO_CHANGE,
          callback: callback
        }
      };
    }
  }, {
    key: "signatureCommand",
    value: function signatureCommand() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      return {
        action: 'startSignature',
        argumentObject: {
          callback: callback
        }
      };
    }
  }, {
    key: "completeTransactionCmd",
    value: function completeTransactionCmd(_ref) {
      var authCode = _ref.authCode,
          issuerScript = _ref.issuerScript,
          _ref$hostDecision = _ref.hostDecision,
          hostDecision = _ref$hostDecision === void 0 ? '00' : _ref$hostDecision;
      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      return {
        action: 'completeEMVPayment',
        argumentObject: {
          authResponseTLV: authCode,
          hostDecision: hostDecision,
          issuerScript: issuerScript,
          callback: callback
        }
      };
    }
  }, {
    key: "getVersionInfoCmd",
    value: function getVersionInfoCmd() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      return {
        action: 'getSerialNumber',
        argumentObject: {
          callback: callback
        }
      };
    }
  }, {
    key: "isCardPresent",
    value: function isCardPresent() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      return {
        action: 'isCardPresent',
        argumentObject: {
          callback: callback
        }
      };
    }
  }, {
    key: "removeCardCmd",
    value: function removeCardCmd(message) {
      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      return {
        action: 'removeCard',
        argumentObject: _objectSpread(_objectSpread({}, this.removeCardMessageSplitter(message)), {}, {
          callback: callback
        })
      };
    }
  }, {
    key: "startTransactionCmd",
    value: function startTransactionCmd(formFactors) {
      var opt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      var callback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
      return {
        action: 'takeEMVPayment',
        argumentObject: _objectSpread({
          callback: callback,
          technology: _verifone.StartTransactionEnums.Technology.get((0, _map["default"])(formFactors).call(formFactors, function (formFactor) {
            return formFactorMap[formFactor];
          }))
        }, opt)
      };
    }
  }, {
    key: "displayMessageCmd",
    value: function displayMessageCmd(message) {
      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      return {
        action: 'displayMessage',
        argumentObject: _objectSpread({
          callback: callback
        }, this.displayMessageSplitter(message))
      };
    }
  }]);
  return VerifoneCommandBuilder;
}(_retailPaymentDevice.CommandBuilder);

var commandBuilder = new VerifoneCommandBuilder();
var _default = commandBuilder;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/keys.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","@paypalcorp/verifone":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/index.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.string.split.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/PaymentDevice.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Object$keys2 = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Reflect$construct = require("@babel/runtime-corejs3/core-js-stable/reflect/construct");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));

require("core-js/modules/es.array.join.js");

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.split.js");

require("core-js/modules/es.date.to-string.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/assertThisInitialized"));

var _get2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/get"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));

var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/typeof"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));

var _entries = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/entries"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/values"));

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-timeout"));

var _manticoreLog = _interopRequireDefault(require("@paypalcorp/manticore-log"));

var _nodeTlv = _interopRequireDefault(require("node-tlv"));

var _pipe = _interopRequireDefault(require("ramda/src/pipe"));

var _rxjs = require("rxjs");

var _operators = require("rxjs/operators");

var _l10nManticore = _interopRequireDefault(require("l10n-manticore"));

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _verifone = require("@paypalcorp/verifone");

var _CommandBuilder = _interopRequireDefault(require("./CommandBuilder"));

var _en = _interopRequireDefault(require("./en"));

var _entryModeMap = _interopRequireDefault(require("./entryModeMap"));

var _cardUtils = require("./cardUtils");

var _getStartTransactionArgs2 = _interopRequireDefault(require("./getStartTransactionArgs"));

var _excluded = ["formFactors"];

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

function ownKeys(object, enumerableOnly) { var keys = _Object$keys2(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty2(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context17, _context18; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context17 = ownKeys(Object(source), !0)).call(_context17, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context18 = ownKeys(Object(source))).call(_context18, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }

var Log = (0, _manticoreLog["default"])('verifone-payment-device');
var L10N = (0, _l10nManticore["default"])({
  en: _en["default"]
});

function delayEvent$(event) {
  var milliSeconds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100;
  return (0, _rxjs.of)(event).pipe((0, _operators.delay)(milliSeconds));
}

function mergeTLVsLeft(left, right) {
  var _context2, _context3;

  function getJSONObject(tlvList) {
    var _context;

    return tlvList ? (0, _reduce["default"])(_context = _nodeTlv["default"].parseList(tlvList)).call(_context, function (acc, tlv) {
      return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, tlv.getTag(), tlv.getValue()));
    }, {}) : {};
  }

  var leftJSON = getJSONObject(left);
  var rightJSON = getJSONObject(right);
  var mergedJSON = (0, _reduce["default"])(_context2 = (0, _keys["default"])(rightJSON)).call(_context2, function (acc, key) {
    return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, key, rightJSON[key]));
  }, leftJSON);
  return (0, _reduce["default"])(_context3 = (0, _entries["default"])(mergedJSON)).call(_context3, function (acc, _ref) {
    var _context4;

    var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
        key = _ref2[0],
        value = _ref2[1];

    return (0, _concat["default"])(_context4 = []).call(_context4, (0, _toConsumableArray2["default"])(acc), [_nodeTlv["default"].TLV(key, value)]);
  }, []).join('');
}

function getReaderModel() {
  var terminalName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';

  var _terminalName$split = terminalName.split(' '),
      _terminalName$split2 = (0, _slicedToArray2["default"])(_terminalName$split, 1),
      _terminalName$split2$ = _terminalName$split2[0],
      first = _terminalName$split2$ === void 0 ? '' : _terminalName$split2$;

  var _first$split = first.split('-'),
      _first$split2 = (0, _slicedToArray2["default"])(_first$split, 1),
      _first$split2$ = _first$split2[0],
      terminalNamePrefix = _first$split2$ === void 0 ? '' : _first$split2$;

  return _retailPaymentDevice.ReaderModel[terminalNamePrefix.toUpperCase()] || _retailPaymentDevice.ReaderModel.Unknown;
}

var Events = {
  cardRead: 'verifone_cardRead',
  cardReadError: 'verifone_cardReadError'
};

var getEventMatcher = function getEventMatcher(hasResponseCode, dataOnMatch) {
  return function (eventObject) {
    return hasResponseCode(eventObject.data) ? _objectSpread(_objectSpread({}, eventObject), {}, {
      event: Events.cardReadError
    }, dataOnMatch) : eventObject;
  };
};

var getEventForInvalidChip = getEventMatcher(function (data) {
  var _context5;

  return (0, _includes["default"])(_context5 = ['05', '07']).call(_context5, data === null || data === void 0 ? void 0 : data.responseCode);
}, {
  error: _retailPaymentDevice.deviceError.invalidChip,
  formFactor: _retailPaymentDevice.FormFactor.Chip
});
var getEventForCardBlocked = getEventMatcher(function (data) {
  return (data === null || data === void 0 ? void 0 : data.responseCode) === '08';
}, {
  error: _retailPaymentDevice.deviceError.cardBlocked,
  formFactor: _retailPaymentDevice.FormFactor.Chip
});
var getEventForBadSwipeData = getEventMatcher(function (data) {
  return (data === null || data === void 0 ? void 0 : data.responseCode) === '92';
}, {
  error: _retailPaymentDevice.deviceError.badSwipeData,
  formFactor: _retailPaymentDevice.FormFactor.MagneticCardSwipe
});
var getEventForCancelled = getEventMatcher(function (data) {
  var _context6;

  return (0, _includes["default"])(_context6 = ['02', '03', '06', '79']).call(_context6, data === null || data === void 0 ? void 0 : data.responseCode);
}, {
  error: _retailPaymentDevice.deviceError.cancelReadCardData,
  formFactor: _retailPaymentDevice.FormFactor.None
});
var getEventForStartedTransaction = (0, _pipe["default"])(getEventForInvalidChip, getEventForCardBlocked, getEventForCancelled, getEventForBadSwipeData);

function isCIDOk(compareTo) {
  return function () {
    var cid = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
    var highest2BytesCID = (Buffer.from(cid, 'hex')[0] & 0xc0) >> 6;
    return cid && (highest2BytesCID ^ compareTo) === 0;
  };
}

var aacCID = isCIDOk(0x00); // For refund transaction

var arqcCID = isCIDOk(0x02); // For every other transaction

var tcCID = isCIDOk(0x01);

function getCIDChecker(_ref3) {
  var contextDetails = _ref3.contextDetails,
      entryModeDetails = _ref3.entryModeDetails;

  if (!entryModeDetails.shouldCheckCID) {
    return function () {
      return true;
    };
  }

  if (contextDetails.isRefundTransaction) {
    return aacCID;
  }

  if (contextDetails.isTransactionCompleting && contextDetails.isQuickChipTransaction) {
    return aacCID;
  }

  if (contextDetails.isTransactionCompleting && !contextDetails.isQuickChipTransaction) {
    return tcCID;
  }

  return arqcCID;
}

function flatten() {
  var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

  var _currentKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';

  if ((0, _typeof2["default"])(obj) === 'object') {
    var _context7, _context8;

    return (0, _reduce["default"])(_context7 = (0, _map["default"])(_context8 = (0, _entries["default"])(obj)).call(_context8, function (_ref4) {
      var _context9;

      var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
          key = _ref5[0],
          value = _ref5[1];

      return flatten(value, (0, _concat["default"])(_context9 = "".concat(_currentKey === '' ? '' : "".concat(_currentKey, "."))).call(_context9, key));
    })).call(_context7, function (acc, curr) {
      return _objectSpread(_objectSpread({}, acc), curr);
    }, {});
  }

  return (0, _defineProperty2["default"])({}, _currentKey, obj);
}

var VerifonePaymentDevice = /*#__PURE__*/function (_PaymentDevice) {
  (0, _inherits2["default"])(VerifonePaymentDevice, _PaymentDevice);

  var _super = _createSuper(VerifonePaymentDevice);

  function VerifonePaymentDevice(uniqueId, _native, readerConnectionType, hardwareAddress) {
    var _context10, _context11;

    var _this;

    (0, _classCallCheck2["default"])(this, VerifonePaymentDevice);
    _this = _super.call(this, uniqueId, _native, undefined, readerConnectionType, hardwareAddress);
    _this.app = {
      display: function display() {}
    };
    _this._manufacturer = _retailPaymentDevice.deviceManufacturer.verifone;
    _this.unsubscribeCommandData = undefined;
    _this._serialNumber = undefined;
    _this.entryModeMap = _entryModeMap["default"];
    _this.paymentListeners = (0, _values["default"])(Events);
    _this.shouldPollForCardPresence = false;
    _this.response = Buffer.from([]);
    _this.removeCardIds = (0, _filter["default"])(_context10 = (0, _keys["default"])(flatten(_en["default"]))).call(_context10, function (key) {
      return (0, _includes["default"])(key).call(key, 'RemoveCard');
    });

    _this.on('nativeSend', (0, _bind["default"])(_context11 = _this.write).call(_context11, (0, _assertThisInitialized2["default"])(_this)));

    return _this;
  }

  (0, _createClass2["default"])(VerifonePaymentDevice, [{
    key: "write",
    value: function write(data) {
      var _data$argumentObject, _context12;

      Log.debug('Sending data to native');
      this.response = Buffer.from([]);
      this["native"].send(((_data$argumentObject = data.argumentObject) === null || _data$argumentObject === void 0 ? void 0 : _data$argumentObject.action) || (0, _concat["default"])(_context12 = "".concat(data.messageType, " ")).call(_context12, data.readerAction), data.stringified, function (error) {
        return Log.error('Write Error', {
          error: error
        });
      });
    }
  }, {
    key: "beginDeviceConnect",
    value: function beginDeviceConnect(callback) {
      var _this2 = this;

      if (!this["native"].isConnected()) {
        this["native"].connect(function (connectError) {
          Log.info('Established socket connection', {
            connectError: connectError
          });

          if (!connectError) {
            (0, _verifone.api)(function (_ref7) {
              var enqueueCommandRequest = _ref7.enqueueCommandRequest,
                  enqueueCommandResponse = _ref7.enqueueCommandResponse,
                  data$ = _ref7.data$;
              _this2.enqueueCommandResponse = enqueueCommandResponse;
              _this2.enqueueCommandRequest = enqueueCommandRequest; // ToDo: Measure minimum delay times for all connection types on all platforms. If different then move the delay to the native send layers
              // 150 mS delay for web-sdk-USB

              _this2.unsubscribeCommandData = data$.pipe((0, _operators.concatMap)(function (data) {
                return delayEvent$(data, 200);
              })).subscribe({
                next: function next(data) {
                  if (data.readerAction !== _verifone.ReaderAction.IGNORE) {
                    _this2.emit('nativeSend', data);
                  }

                  if (data.isFinished) {
                    var _data$argumentObject2, _data$argumentObject3;

                    (_data$argumentObject2 = data.argumentObject) === null || _data$argumentObject2 === void 0 ? void 0 : (_data$argumentObject3 = _data$argumentObject2.callback) === null || _data$argumentObject3 === void 0 ? void 0 : _data$argumentObject3.call(_data$argumentObject2, data);
                  }
                }
              });
              Log.info('Starting device interaction');

              _this2._coldStart();

              _this2.display({
                id: 'Connecting'
              });

              _this2._getVersionInfo(function (data) {
                var _data$payload, _data$payload2, _data$payload2$unform;

                _this2.model = getReaderModel(data === null || data === void 0 ? void 0 : (_data$payload = data.payload) === null || _data$payload === void 0 ? void 0 : _data$payload.terminalName);
                _this2._serialNumber = data === null || data === void 0 ? void 0 : (_data$payload2 = data.payload) === null || _data$payload2 === void 0 ? void 0 : (_data$payload2$unform = _data$payload2.unformattedSerialNumber) === null || _data$payload2$unform === void 0 ? void 0 : (0, _slice["default"])(_data$payload2$unform).call(_data$payload2$unform, 1);
              });

              _this2.display({
                id: 'Ready'
              }, function () {
                return callback();
              });
            }, (0, _manticoreLog["default"])('verifone-parser'));
          } else {
            callback(connectError);
          }
        });
      } else {
        callback();
      }
    }
  }, {
    key: "_coldStart",
    value: function _coldStart() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      this.enqueueCommandRequest(_CommandBuilder["default"].coldCancel(callback));
    }
  }, {
    key: "abortTransaction",
    value: function abortTransaction(context) {
      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      this.stopPollForCardPresence();
      this.cardPresented = false;
      this.enqueueCommandRequest(_CommandBuilder["default"].abortTransactionCmd(callback));
    }
  }, {
    key: "activateForPayment",
    value: function activateForPayment(context, formFactors, showPrompt) {
      var _this3 = this;

      (0, _get2["default"])((0, _getPrototypeOf2["default"])(VerifonePaymentDevice.prototype), "activateForPayment", this).call(this, context, formFactors, showPrompt);

      var contextDetails = this._getDetailsFromContext(context);

      this.cardInSlot = false;

      var callback = function callback(data) {
        var _getEventForStartedTr = getEventForStartedTransaction({
          data: data,
          contextDetails: contextDetails
        }),
            event = _getEventForStartedTr.event,
            error = _getEventForStartedTr.error,
            formFactor = _getEventForStartedTr.formFactor;

        _this3.emit(event || Events.cardRead, {
          data: data,
          error: error,
          formFactor: formFactor
        });
      };

      this.once(Events.cardReadError, function (_ref8) {
        var error = _ref8.error,
            formFactor = _ref8.formFactor;

        _this3.stopPollForCardPresence();

        _this3.removeAllListeners(_this3.paymentListeners);

        if (_retailPaymentDevice.deviceError.cancelReadCardData.equals(error)) {
          _this3.emit(_retailPaymentDevice.PaymentDevice.Event.cancelled);

          return;
        }

        if (_retailPaymentDevice.deviceError.invalidChip.equals(error)) {
          context.retryCountInvalidChip = 2;
        }

        _this3.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, error, null, formFactor);
      });
      this.once(Events.cardRead, function (_ref9) {
        var _data$payload3;

        var data = _ref9.data;

        _this3.removeAllListeners(_this3.paymentListeners);

        var entryMode = _this3._getEntryMode(data, contextDetails.isFallbackAllowed);

        var entryModeDetails = _this3.entryModeMap[entryMode];
        _this3.emvData = data === null || data === void 0 ? void 0 : (_data$payload3 = data.payload) === null || _data$payload3 === void 0 ? void 0 : _data$payload3.emvData;
        _this3.cardInSlot = entryModeDetails.isCardInserted;

        _this3.pollForCardPresence();

        _this3.emit(_retailPaymentDevice.PaymentDevice.Event.cardPresented, _this3._getStartTransactionError(data, entryModeDetails, contextDetails), _retailPaymentDevice.CardPresentEvent.cardDataRead, entryModeDetails.formFactor, {
          card: _this3._getCard(data, entryModeDetails)
        });
      });
      this.startTransaction(this._getStartTransactionArgs(_objectSpread(_objectSpread({}, contextDetails), {}, {
        formFactors: formFactors
      })), callback);
    }
  }, {
    key: "beginDeviceDisconnect",
    value: function beginDeviceDisconnect() {
      var _this$unsubscribeComm,
          _this4 = this;

      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      if (!this.isConnected()) {
        Log.debug('Disconnect called, but already disconnected');
        callback(undefined);
        return;
      }

      (_this$unsubscribeComm = this.unsubscribeCommandData) === null || _this$unsubscribeComm === void 0 ? void 0 : _this$unsubscribeComm.unsubscribe();
      this["native"].disconnect(function (error) {
        _this4.removed();

        callback(error);
      });
    }
  }, {
    key: "beginDeviceRemoved",
    value: function beginDeviceRemoved(callback) {
      var _this$unsubscribeComm2;

      (_this$unsubscribeComm2 = this.unsubscribeCommandData) === null || _this$unsubscribeComm2 === void 0 ? void 0 : _this$unsubscribeComm2.unsubscribe();
      callback();
    }
  }, {
    key: "clearTransaction",
    value: function clearTransaction() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      this.stopPollForCardPresence();
      this.enqueueCommandRequest(_CommandBuilder["default"].clearTransactionCmd(callback));
    }
  }, {
    key: "completeTransaction",
    value: function completeTransaction(authCode, callback) {
      var _this5 = this;

      Log.debug('Completing Transaction');
      this.stopPollForCardPresence();

      if (!this.cardInSlot) {
        callback(undefined, this._getResponse(this.emvData));
        return;
      }

      var _completeTransactionCallback = function _completeTransactionCallback(data) {
        var _data$payload4;

        var completedEmvData = mergeTLVsLeft(_this5.emvData, data === null || data === void 0 ? void 0 : (_data$payload4 = data.payload) === null || _data$payload4 === void 0 ? void 0 : _data$payload4.emvData);

        var completedTxnResponse = _this5._getResponse(completedEmvData);

        _this5._contextDetails.isTransactionCompleting = true;

        if ((data === null || data === void 0 ? void 0 : data.responseCode) === '00' && _this5.isCIDOk(data, _this5._contextDetails, _entryModeMap["default"]['05'])) {
          callback(undefined, completedTxnResponse);
        } else {
          callback(_retailPaymentDevice.deviceError.failureResponse.withDevMessage(data === null || data === void 0 ? void 0 : data.payload.emvData), completedTxnResponse);
        }
      };

      this.enqueueCommandRequest(_CommandBuilder["default"].completeTransactionCmd(this._getCompleteTransactionArgs(authCode, this._contextDetails), _completeTransactionCallback));
    }
  }, {
    key: "collectSignature",
    value: function collectSignature() {
      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      Log.debug('Verifone PD collecting signature');

      var callback = function callback(data) {
        if ((data === null || data === void 0 ? void 0 : data.responseCode) === '00') {
          return cb(undefined, Buffer.from(data.payload, 'hex').toString('base64'));
        }

        if ((data === null || data === void 0 ? void 0 : data.responseCode) === '01') {
          return cb(_retailPaymentDevice.deviceError.noSignature);
        }

        return cb(_retailPaymentDevice.deviceError.signatureCancelled);
      };

      this.enqueueCommandRequest(_CommandBuilder["default"].signatureCommand(callback));
    }
  }, {
    key: "deactivateFormFactors",
    value: function deactivateFormFactors(formFactors, callback) {
      var _this6 = this;

      this.stopPollForCardPresence();
      this.cardPresented = false;
      this.enqueueCommandRequest(_CommandBuilder["default"].deactivateCancel(function () {
        _this6.removeAllListeners(_this6.paymentListeners);

        (0, _get2["default"])((0, _getPrototypeOf2["default"])(VerifonePaymentDevice.prototype), "deactivateFormFactors", _this6).call(_this6, formFactors, callback);
      }));
    }
  }, {
    key: "display",
    value: function display(opt) {
      var _context13;

      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      var id = opt.id,
          substitutions = opt.substitutions;
      var message = L10N(id, substitutions);

      if (message === id) {
        Log.debug('Reader not displaying', opt);
        callback();
        return;
      }

      if ((0, _includes["default"])(_context13 = this.removeCardIds).call(_context13, id)) {
        this.removeCard(message, callback);
        return;
      }

      Log.debug('Reader displaying', opt);
      this.enqueueCommandRequest(_CommandBuilder["default"].displayMessageCmd(message, callback));
    }
  }, {
    key: "formFactors",
    get: function get() {
      return [_retailPaymentDevice.FormFactor.Chip, _retailPaymentDevice.FormFactor.EmvCertifiedContactless, _retailPaymentDevice.FormFactor.MagneticCardSwipe];
    }
  }, {
    key: "getSetOfActiveFormFactors",
    value: function getSetOfActiveFormFactors() {
      return this._sActiveFormFactors;
    }
  }, {
    key: "_getCompleteTransactionArgs",
    value: function _getCompleteTransactionArgs() {
      var rawAuthCode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';

      var _ref10 = arguments.length > 1 ? arguments[1] : undefined,
          isQuickChipTransaction = _ref10.isQuickChipTransaction;

      var authCodeTLVs = _nodeTlv["default"].parseList(rawAuthCode);

      var isIssuerScriptTLV = function isIssuerScriptTLV(tlv) {
        return tlv.getTag() === '71' || tlv.getTag() === '72';
      };

      var joinTLVs = function joinTLVs(tlvArray) {
        return (0, _reduce["default"])(tlvArray).call(tlvArray, function (acc, tlv) {
          var _context14;

          return (0, _concat["default"])(_context14 = []).call(_context14, (0, _toConsumableArray2["default"])(acc), [tlv.getTLV()]);
        }, []).join('');
      };

      return {
        authCode: joinTLVs((0, _filter["default"])(authCodeTLVs).call(authCodeTLVs, function (tlv) {
          return !isIssuerScriptTLV(tlv);
        })),
        issuerScript: joinTLVs((0, _filter["default"])(authCodeTLVs).call(authCodeTLVs, isIssuerScriptTLV)),
        hostDecision: isQuickChipTransaction ? _verifone.CompleteTransactionEnums.HostDecision.CONNECTION_FAILED : _verifone.CompleteTransactionEnums.HostDecision.HOST_AUTHORIZED
      };
    }
  }, {
    key: "_getStartTransactionError",
    value: function _getStartTransactionError(data, entryModeDetails, contextDetails) {
      return !this.isCIDOk(data, contextDetails, entryModeDetails) ? _retailPaymentDevice.deviceError.contactIssuer : undefined;
    }
  }, {
    key: "_getEntryMode",
    value: function _getEntryMode(data, fallBackMode) {
      var _data$payload5, _data$payload6;

      var dataEntryMode = data === null || data === void 0 ? void 0 : (_data$payload5 = data.payload) === null || _data$payload5 === void 0 ? void 0 : _data$payload5.entryMode;
      var track2 = data === null || data === void 0 ? void 0 : (_data$payload6 = data.payload) === null || _data$payload6 === void 0 ? void 0 : _data$payload6.track2;
      return dataEntryMode === '02' && fallBackMode && this._isChipCardSwiped(track2) ? '80' : dataEntryMode;
    }
  }, {
    key: "_isChipCardSwiped",
    value: function _isChipCardSwiped() {
      var track2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
      var track2UTF8 = Buffer.from(track2, 'hex').toString('utf8');
      var separator = (0, _indexOf["default"])(track2UTF8).call(track2UTF8, '=');

      if (separator > 0) {
        var serviceCode = track2UTF8.charAt(separator + 5);
        return serviceCode === '2' || serviceCode === '6';
      }

      return false;
    }
  }, {
    key: "_isSignatureRequired",
    value: function _isSignatureRequired() {
      var dataCVM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
      var slicedCVM = (0, _slice["default"])(dataCVM).call(dataCVM, 0, 2);
      return slicedCVM === '04' || (Buffer.from(slicedCVM, 'hex')[0] & 0x3f ^ 0x1e) === 0;
    }
  }, {
    key: "isCIDOk",
    value: function isCIDOk(data, contextDetails, entryModeDetails) {
      var _data$payload7;

      return getCIDChecker({
        contextDetails: contextDetails,
        entryModeDetails: entryModeDetails
      })(data === null || data === void 0 ? void 0 : (_data$payload7 = data.payload) === null || _data$payload7 === void 0 ? void 0 : _data$payload7.CID);
    }
  }, {
    key: "_getVersionInfo",
    value: function _getVersionInfo(callback) {
      this.enqueueCommandRequest(_CommandBuilder["default"].getVersionInfoCmd(callback));
    }
  }, {
    key: "_getCard",
    value: function _getCard(data, entryModeDetails) {
      var _data$payload8, _data$payload9, _data$payload10, _context15, _context16;

      var card = new _retailPaymentDevice.Card();
      card.isSignatureRequired = entryModeDetails.isSignatureRequired || this._isSignatureRequired(data === null || data === void 0 ? void 0 : (_data$payload8 = data.payload) === null || _data$payload8 === void 0 ? void 0 : _data$payload8.cvm);
      card.isContactlessMSD = entryModeDetails.isContactlessMSD;
      card.isMSRFallbackAllowed = entryModeDetails.isMSRFallbackAllowed;
      card.track2 = data === null || data === void 0 ? void 0 : (_data$payload9 = data.payload) === null || _data$payload9 === void 0 ? void 0 : _data$payload9.emvData;
      card.reader = this;
      card.emvData = this._getResponse(data === null || data === void 0 ? void 0 : (_data$payload10 = data.payload) === null || _data$payload10 === void 0 ? void 0 : _data$payload10.emvData);
      card.formFactor = entryModeDetails.formFactor;
      card.panNumber = (0, _cardUtils.getPanNumber)(data === null || data === void 0 ? void 0 : data.payload);
      card.cardholderName = (0, _cardUtils.getCardholderName)(data === null || data === void 0 ? void 0 : data.payload); // Derivative properties should be calculated in Card

      card.firstSixDigits = (0, _slice["default"])(_context15 = card.panNumber).call(_context15, 0, 6);
      card.lastFourDigits = (0, _slice["default"])(_context16 = card.panNumber).call(_context16, -4);
      return card;
    }
  }, {
    key: "_getAmount",
    value: function _getAmount(context) {
      var invoice = context.invoice;

      if (context.quickChipEnabled) {
        var _context$invoice;

        return ((_context$invoice = context.invoice) === null || _context$invoice === void 0 ? void 0 : _context$invoice.total.times(100).toNumber()) || 100;
      }

      if (context.isRefund()) {
        var _context$refundAmount;

        return (_context$refundAmount = context.refundAmount) === null || _context$refundAmount === void 0 ? void 0 : _context$refundAmount.times(100).toNumber();
      }

      if (invoice) {
        return invoice === null || invoice === void 0 ? void 0 : invoice.total.times(100).toNumber();
      }

      return 0;
    }
  }, {
    key: "_getDetailsFromContext",
    value: function _getDetailsFromContext(context) {
      this._contextDetails = {
        amount: this._getAmount(context),
        isFallbackAllowed: context.allowFallBackSwipe || context.offlinePaymentEnabled,
        isQuickChipTransaction: context.quickChipEnabled,
        isRefundTransaction: context.isRefund(),
        isVaultOnlyTransaction: context.isTransactionVaultOnly
      };
      return this._contextDetails;
    }
  }, {
    key: "_getResponse",
    value: function _getResponse() {
      var emvData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
      return {
        apdu: {
          data: Buffer.from(emvData, 'hex')
        }
      };
    }
  }, {
    key: "_getStartTransactionArgs",
    value: function _getStartTransactionArgs(paymentDeviceContext) {
      var _getStartTransactionA = (0, _getStartTransactionArgs2["default"])({
        startTransactionArgs: {
          amount: paymentDeviceContext.amount,
          formFactors: paymentDeviceContext.formFactors
        },
        paymentDeviceContext: paymentDeviceContext
      }),
          _getStartTransactionA2 = _getStartTransactionA.startTransactionArgs,
          startTransactionArgs = _getStartTransactionA2 === void 0 ? {} : _getStartTransactionA2;

      return startTransactionArgs;
    }
  }, {
    key: "isCardInSlot",
    value: function isCardInSlot() {
      return this.cardInSlot;
    }
  }, {
    key: "listenForCardRemoval",
    value: function listenForCardRemoval(callback) {} // eslint-disable-line no-unused-vars

  }, {
    key: "manufacturer",
    get: function get() {
      return this._manufacturer;
    }
  }, {
    key: "serialNumber",
    get: function get() {
      return this._serialNumber;
    }
  }, {
    key: "received",
    value: function received(data) {
      this.response = (0, _concat["default"])(Buffer).call(Buffer, [this.response, Buffer.from(data, 'base64')]);

      if (this.response.length > 1) {
        if (this.response[this.response.length - 2] !== 0x03) {
          return;
        }
      }

      this.enqueueCommandResponse(this.response);
      this.response = Buffer.from([]);
    }
  }, {
    key: "isCardPresent",
    value: function isCardPresent() {
      var _this7 = this;

      var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};

      var cardPresentCB = function cardPresentCB(data) {
        _this7.cardInSlot = (data === null || data === void 0 ? void 0 : data.responseCode) === '1';
        cb(_this7.cardInSlot);
      };

      if (this.cardInSlot) {
        this.enqueueCommandRequest(_CommandBuilder["default"].isCardPresent(cardPresentCB));
      } else {
        cb(false);
      }
    }
  }, {
    key: "removeCard",
    value: function removeCard(message) {
      var _this8 = this;

      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
      this.stopPollForCardPresence();

      if (this.cardInSlot) {
        var _removeCardCallback = function _removeCardCallback(data) {
          if ((data === null || data === void 0 ? void 0 : data.responseCode) === '0') {
            Log.debug('Card Removed');
            _this8.cardInSlot = false;
          }

          callback(); // The deviceError.userCancelled can be replaced with a new error.

          _this8.emit(_retailPaymentDevice.PaymentDevice.Event.cardRemoved, (data === null || data === void 0 ? void 0 : data.responseCode) !== '0' ? _retailPaymentDevice.deviceError.userCancelled : undefined);
        };

        this.abortTransaction();
        this.enqueueCommandRequest(_CommandBuilder["default"].removeCardCmd(message, _removeCardCallback));
      } else {
        callback();
      }
    }
  }, {
    key: "pollForCardPresence",
    value: function pollForCardPresence() {
      var _this9 = this;

      Log.debug('Poll for card presence');

      if (!this.cardInSlot) {
        return;
      }

      this.shouldPollForCardPresence = true;
      var pollTime = 1000;
      this.pollForCardPresenceTimeout = (0, _setTimeout2["default"])(function () {
        if (_this9.shouldPollForCardPresence && _this9.cardInSlot) {
          _this9.isCardPresent(function (isCardPresent) {
            if (_this9.shouldPollForCardPresence) {
              if (isCardPresent) {
                Log.debug('Card is still present');

                _this9.pollForCardPresence();
              } else {
                Log.debug('Card has been removed');

                _this9.abortTransaction(undefined, function () {
                  _this9.removeAllListeners(_this9.paymentListeners);

                  _this9.emit(_retailPaymentDevice.PaymentDevice.Event.cardRemoved);
                });
              }
            }
          });
        } else {
          _this9.stopPollForCardPresence();
        }
      }, pollTime);
    }
  }, {
    key: "stopPollForCardPresence",
    value: function stopPollForCardPresence() {
      this.shouldPollForCardPresence = false;

      if (this.pollForCardPresenceTimeout) {
        clearTimeout(this.pollForCardPresenceTimeout);
      }
    }
  }, {
    key: "isBatteryInfoSupported",
    value: function isBatteryInfoSupported() {
      // Verifone readers don't support battery info
      return false;
    }
  }, {
    key: "getBatteryInfo",
    value: function getBatteryInfo() {
      var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
      callback(_retailPaymentDevice.deviceError.batteryInfoNotSupported);
    }
  }, {
    key: "startTransaction",
    value: function startTransaction(_ref11, callback) {
      var formFactors = _ref11.formFactors,
          keyValues = (0, _objectWithoutProperties2["default"])(_ref11, _excluded);
      Log.debug('Starting transaction', {
        formFactors: formFactors,
        keyValues: keyValues
      });
      this.enqueueCommandRequest(_CommandBuilder["default"].startTransactionCmd(formFactors, keyValues, callback));
    }
  }]);
  return VerifonePaymentDevice;
}(_retailPaymentDevice.PaymentDevice);

exports["default"] = VerifonePaymentDevice;
}).call(this)}).call(this,require("buffer").Buffer)
},{"./CommandBuilder":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/CommandBuilder.js","./cardUtils":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/cardUtils.js","./en":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/en.js","./entryModeMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/entryModeMap.js","./getStartTransactionArgs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/getStartTransactionArgs.js","@babel/runtime-corejs3/core-js-stable/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/entries":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/entries.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/object/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/values.js","@babel/runtime-corejs3/core-js-stable/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js","@babel/runtime-corejs3/core-js-stable/set-timeout":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js","@babel/runtime-corejs3/helpers/assertThisInitialized":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js","@babel/runtime-corejs3/helpers/classCallCheck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js","@babel/runtime-corejs3/helpers/createClass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/createClass.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/get.js","@babel/runtime-corejs3/helpers/getPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js","@babel/runtime-corejs3/helpers/inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/inherits.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/objectWithoutProperties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/objectWithoutProperties.js","@babel/runtime-corejs3/helpers/possibleConstructorReturn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","@paypalcorp/manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/manticore-log/build/index.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","@paypalcorp/verifone":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.array.join.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.array.join.js","core-js/modules/es.date.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.split.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js","l10n-manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/l10n-manticore/index.js","node-tlv":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/TLV.js","ramda/src/pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipe.js","rxjs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/index.js","rxjs/operators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/operators/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/cardUtils.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.getCardholderName = getCardholderName;
exports.getPanNumber = getPanNumber;

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

require("core-js/modules/es.date.to-string.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.match.js");

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _pipe = _interopRequireDefault(require("ramda/src/pipe"));

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context3, _context4; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context3 = ownKeys(Object(source), !0)).call(_context3, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context4 = ownKeys(Object(source))).call(_context4, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }

function getPanFromTrack2(payload) {
  var _payload$track;

  var track2Buffer = Buffer.from((_payload$track = payload.track2) !== null && _payload$track !== void 0 ? _payload$track : '', 'hex');
  return _objectSpread(_objectSpread({}, payload), {}, {
    panNumber: payload.panNumber || (0, _slice["default"])(track2Buffer).call(track2Buffer, 1, (0, _indexOf["default"])(track2Buffer).call(track2Buffer, 0x3d)).toString('utf8')
  });
}

function getPanFromTrack1(payload) {
  var _payload$track2;

  var parsedTrack1 = Buffer.from((_payload$track2 = payload.track1) !== null && _payload$track2 !== void 0 ? _payload$track2 : '', 'hex').toString('utf8');
  return _objectSpread(_objectSpread({}, payload), {}, {
    panNumber: payload.panNumber || (0, _slice["default"])(parsedTrack1).call(parsedTrack1, 2, (0, _indexOf["default"])(parsedTrack1).call(parsedTrack1, '^'))
  });
}

function getPanFromTrack3(payload) {
  var _payload$track3;

  var track3Buffer = Buffer.from((_payload$track3 = payload.track3) !== null && _payload$track3 !== void 0 ? _payload$track3 : '', 'hex');
  return _objectSpread(_objectSpread({}, payload), {}, {
    panNumber: payload.panNumber || (0, _slice["default"])(track3Buffer).call(track3Buffer, 3, (0, _indexOf["default"])(track3Buffer).call(track3Buffer, 0x3d)).toString('utf8')
  });
}

function getPanFromTrack2EquivalentData(payload) {
  var _payload$track2Equiva, _context, _context2;

  return _objectSpread(_objectSpread({}, payload), {}, {
    panNumber: payload.panNumber || ((_payload$track2Equiva = payload.track2EquivalentData) === null || _payload$track2Equiva === void 0 ? void 0 : (0, _slice["default"])(_context = _payload$track2Equiva.toLowerCase()).call(_context, 0, (0, _indexOf["default"])(_context2 = payload.track2EquivalentData).call(_context2, 'd')))
  });
}

var getPanNumberFromTracks = (0, _pipe["default"])(getPanFromTrack2, getPanFromTrack2EquivalentData, getPanFromTrack1, getPanFromTrack3);

function getCardholderNameFromTrack1() {
  var _payload$track4, _parsedTrack1$match;

  var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  var parsedTrack1 = Buffer.from((_payload$track4 = payload.track1) !== null && _payload$track4 !== void 0 ? _payload$track4 : '', 'hex').toString('utf8');
  return (_parsedTrack1$match = parsedTrack1.match(/\^([^^]*)\^/)) === null || _parsedTrack1$match === void 0 ? void 0 : _parsedTrack1$match[1];
}

function getPanNumber() {
  var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  return payload.pan || getPanNumberFromTracks(payload).panNumber;
}

function getCardholderName() {
  var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  return payload.cardholderName || getCardholderNameFromTrack1(payload);
}
}).call(this)}).call(this,require("buffer").Buffer)
},{"@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.date.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.match.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.match.js","ramda/src/pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/en.js":[function(require,module,exports){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }

/* eslint-disable no-template-curly-in-string */
var commonPaymentMessages = {
  Cancelled: '${amount}\nPayment canceled',
  CancelledRemoveCard: '${amount}\nPayment canceled',
  Declined: '${amount}\nPayment declined',
  DeclinedRemoveCard: '${amount}\nPayment declined',
  Failed: '${amount}\nPayment failed',
  FailedRemoveCard: '${amount}\nPayment failed',
  RemoveCard: '${amount} Paid',
  Successful: '${amount} Paid\nThank you!'
};
var messages = {
  AmountTooLow: 'Card minimum is\n${amount}',
  AmountTooLowRemoveCard: 'Card minimum is\n${amount}',
  AmountTooHigh: 'Card maximum is\n${amount}',
  AmountTooHighRemoveCard: 'Card maximum is\n${amount}',
  Connecting: 'Connecting to\nApplication',
  ConnectionFailed: 'Connection Failed',
  ContactIssuer: 'Declined\nPlease contact your\ncard issuer.',
  ContactIssuerRemoveCard: 'Declined\nContact issuer',
  CompletingPayment: '${amount}\nCompleting payment...',
  Auth: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...'
    }
  }, commonPaymentMessages),
  Sale: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...'
    }
  }, commonPaymentMessages),
  Declined: {
    BlockedCardInserted: 'Declined',
    UnableToReadNfcCard: 'Unable to read card.\nInsert, swipe, or\npress OK on the app\nand tap another card.',
    NfcDecline: 'Declined.\nRetry with\ninsert or swipe.',
    IncorrectPin: 'Incorrect PIN\nPlease try again.'
  },
  GeneralNfcFallback: 'Unable to read card.\nInsert or swipe\ncard now or try\n a different card',
  NetworkOffline: '${amount}\nNetwork Error',
  NetworkOfflineRemoveCard: '${amount}\nNetwork Offline',
  NfcTimeout: '${amount}\nPayment timed out',
  Processing: {
    Tap: '${amount}\nProcessing...',
    Contact: '${amount}\nDo not remove card.\nProcessing...',
    ContactPinOk: '${amount}\nDo not remove card.\nProcessing...\nPIN OK',
    PinOk: '${amount}\nProcessing...\nPIN OK'
  },
  Ready: 'Ready to accept\npayments.',
  Refund: {
    CardMismatch: 'Card mismatch!',
    CardMismatchRemoveCard: 'Card mismatch!',
    Cancelled: '${amount}\nRefund canceled',
    CancelledRemoveCard: '${amount}\nRefund canceled',
    Declined: '${amount}\nRefund declined',
    DeclinedRemoveCard: '${amount}\nRefund declined',
    Failed: '${amount}\nRefund failed',
    FailedRemoveCard: '${amount} failed',
    Processing: {
      Tap: '${amount}\nProcessing...'
    },
    RemoveCard: '${amount} Refunded',
    Successful: '${amount} Refunded.\nThank you!'
  },
  Cancelling: 'Cancelling...',
  QuickChip: {
    RemoveCard: '${amount}\nProcessing...',
    Processing: {
      Tap: '${amount}\nProcessing...'
    },
    Signature: 'Signature Required'
  },
  QuickChipSale: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nProcessing...',
      RemoveCard: '${amount}\nProcessing...'
    }
  }, commonPaymentMessages),
  QuickChipAuth: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nProcessing...',
      RemoveCard: '${amount}\nProcessing...'
    }
  }, commonPaymentMessages),
  QuickChipSaleVault: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nProcessing...',
      RemoveCard: '${amount}\nProcessing...'
    }
  }, commonPaymentMessages),
  QuickChipAuthVault: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...',
      Contact: '${amount}\nProcessing...',
      RemoveCard: '${amount}\nProcessing...'
    }
  }, commonPaymentMessages),
  SaleVault: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...'
    }
  }, commonPaymentMessages),
  AuthVault: _objectSpread({
    Processing: {
      Tap: '${amount}\nProcessing...'
    }
  }, commonPaymentMessages),
  Vault: {
    Completing: 'Completing...',
    Processing: {
      Contact: 'Do not remove card.\nProcessing...'
    },
    Cancelled: 'Canceled',
    CancelledRemoveCard: 'Canceled',
    Declined: 'Declined',
    DeclinedRemoveCard: 'Declined',
    Failed: 'Failed',
    FailedRemoveCard: 'Failed',
    RemoveCard: 'Successful',
    Successful: 'Thank you!'
  },
  Signature: {
    EmptyNotAllowed: 'Please Sign',
    NoCancellationOnSwipe: 'Cancellation not\nallowed.\nPlease Sign'
  }
};
var _default = messages;
/* eslint-enable no-template-curly-in-string */

exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/entryModeMap.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var entryModeMap = {
  '01': {
    mode: _retailPaymentDevice.EntryMode.KeyIn,
    formFactor: _retailPaymentDevice.FormFactor.ManualCardEntry,
    isCardInserted: false,
    shouldCheckCID: false
  },
  '02': {
    mode: _retailPaymentDevice.EntryMode.Swipe,
    formFactor: _retailPaymentDevice.FormFactor.MagneticCardSwipe,
    isCardInserted: false,
    isSignatureRequired: true,
    shouldCheckCID: false
  },
  '05': {
    mode: _retailPaymentDevice.EntryMode.Chip,
    formFactor: _retailPaymentDevice.FormFactor.Chip,
    isCardInserted: true,
    shouldCheckCID: true
  },
  '07': {
    mode: _retailPaymentDevice.EntryMode.ContactlessChip,
    formFactor: _retailPaymentDevice.FormFactor.EmvCertifiedContactless,
    isCardInserted: false,
    shouldCheckCID: true
  },
  80: {
    mode: _retailPaymentDevice.EntryMode.FallbackSwipe,
    formFactor: _retailPaymentDevice.FormFactor.MagneticCardSwipe,
    isCardInserted: false,
    isMSRFallbackAllowed: true,
    isSignatureRequired: true,
    shouldCheckCID: false
  },
  91: {
    mode: _retailPaymentDevice.EntryMode.ContactlessMSD,
    formFactor: _retailPaymentDevice.FormFactor.EmvCertifiedContactless,
    isCardInserted: false,
    isContactlessMSD: true,
    shouldCheckCID: false
  }
};
var _default = entryModeMap;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/getStartTransactionArgs.js":[function(require,module,exports){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = void 0;

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _verifone = require("@paypalcorp/verifone");

var _retailPaymentDevice = require("@paypalcorp/retail-payment-device");

var _pipe = _interopRequireDefault(require("ramda/src/pipe"));

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }

var getQuickChipArgs = function getQuickChipArgs(_ref) {
  var startTransactionArgs = _ref.startTransactionArgs,
      paymentDeviceContext = _ref.paymentDeviceContext;
  return paymentDeviceContext.isQuickChipTransaction ? {
    startTransactionArgs: _objectSpread(_objectSpread({}, startTransactionArgs), {}, {
      showAmount: _verifone.StartTransactionEnums.ShowAmount.NO
    }),
    paymentDeviceContext: paymentDeviceContext
  } : {
    startTransactionArgs: startTransactionArgs,
    paymentDeviceContext: paymentDeviceContext
  };
};

var getFallBackArgs = function getFallBackArgs(_ref2) {
  var startTransactionArgs = _ref2.startTransactionArgs,
      paymentDeviceContext = _ref2.paymentDeviceContext;
  return paymentDeviceContext.isFallbackAllowed ? {
    startTransactionArgs: _objectSpread(_objectSpread({}, startTransactionArgs), {}, {
      formFactors: [_retailPaymentDevice.FormFactor.MagneticCardSwipe],
      fallback: _verifone.StartTransactionEnums.FallbackSwipe.YES
    }),
    paymentDeviceContext: paymentDeviceContext
  } : {
    startTransactionArgs: startTransactionArgs,
    paymentDeviceContext: paymentDeviceContext
  };
};

var getRefundArgs = function getRefundArgs(_ref3) {
  var startTransactionArgs = _ref3.startTransactionArgs,
      paymentDeviceContext = _ref3.paymentDeviceContext;
  return paymentDeviceContext.isRefundTransaction ? {
    startTransactionArgs: _objectSpread(_objectSpread({}, startTransactionArgs), {}, {
      merchantDecision: _verifone.StartTransactionEnums.MerchantDecision.FORCE_DECLINE,
      tap: _verifone.StartTransactionEnums.Tap.REFUND
    }),
    paymentDeviceContext: paymentDeviceContext
  } : {
    startTransactionArgs: startTransactionArgs,
    paymentDeviceContext: paymentDeviceContext
  };
};

var getVaultArgs = function getVaultArgs(_ref4) {
  var startTransactionArgs = _ref4.startTransactionArgs,
      paymentDeviceContext = _ref4.paymentDeviceContext;
  return paymentDeviceContext.isVaultOnlyTransaction ? {
    startTransactionArgs: _objectSpread(_objectSpread({}, startTransactionArgs), {}, {
      showAmount: _verifone.StartTransactionEnums.ShowAmount.NO
    }),
    paymentDeviceContext: paymentDeviceContext
  } : {
    startTransactionArgs: startTransactionArgs,
    paymentDeviceContext: paymentDeviceContext
  };
};

var getStartTransactionArgs = (0, _pipe["default"])(getQuickChipArgs, getFallBackArgs, getRefundArgs, getVaultArgs);
var _default = getStartTransactionArgs;
exports["default"] = _default;
},{"@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@paypalcorp/retail-payment-device":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/retail-payment-device/build/index.js","@paypalcorp/verifone":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/index.js","ramda/src/pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/index.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

_Object$defineProperty(exports, "default", {
  enumerable: true,
  get: function get() {
    return _PaymentDevice["default"];
  }
});

var _PaymentDevice = _interopRequireDefault(require("./PaymentDevice"));
},{"./PaymentDevice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone-payment-device/build/PaymentDevice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/conversionFunctions.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.addStringifiedSelf = exports.Format = void 0;
exports.decimalToHexArray = decimalToHexArray;
exports.toBase64 = exports.stringify = exports.hexEncode = exports.hexDecode = exports.fromBase64 = void 0;

var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));

var _reverse = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reverse"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _padStart = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/pad-start"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

require("core-js/modules/es.date.to-string.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _flip = _interopRequireDefault(require("ramda/src/flip"));

var _curryN = _interopRequireDefault(require("ramda/src/curryN"));

var _ = _interopRequireDefault(require("ramda/src/__"));

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context2; _forEachInstanceProperty(_context2 = ownKeys(Object(source), true)).call(_context2, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context3; _forEachInstanceProperty(_context3 = ownKeys(Object(source))).call(_context3, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }

var toBase64 = function toBase64(byteArray) {
  return Buffer.from(byteArray, 'hex').toString('base64');
};

exports.toBase64 = toBase64;

var fromBase64 = function fromBase64(base64String) {
  return Buffer.from(base64String, 'base64');
};

exports.fromBase64 = fromBase64;

var hexEncode = function hexEncode(string) {
  return (0, _toConsumableArray2["default"])(Buffer.from(string, 'utf8'));
};

exports.hexEncode = hexEncode;

var hexDecode = function hexDecode(hexed) {
  return Buffer.from(hexed, 'hex').toString('utf8');
};
/*
 * This function is curried version of the JSON.stringify with its first 2 arguments
 * flipped.
 * @param function (k, v) => v The <key, value> mapping function
 * @param object A JSON Object to be stringified
 * @return string
 */


exports.hexDecode = hexDecode;
var stringify = (0, _flip["default"])((0, _curryN["default"])(3, _stringify["default"]))(_["default"], _["default"], '');
exports.stringify = stringify;

var addStringifiedSelf = function addStringifiedSelf(json) {
  return _objectSpread(_objectSpread({}, json), {}, {
    stringified: stringify(function (k, v) {
      return v;
    }, json)
  });
};
/*
 * This function converts an integer to its n-byte hex array representation
 * Usage: add(Hex(decimalToHexArray(300)))
 * Eg: (300) => [0x01, 0x44]
 * @returns Array
 */


exports.addStringifiedSelf = addStringifiedSelf;

function decimalToHexArray(decimalNum) {
  function decimalToHexArrayHelper(_decimalNum) {
    var _arr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];

    if (_decimalNum > 0) {
      _arr.push(_decimalNum & 0xff);

      return decimalToHexArrayHelper(_decimalNum >> 8, _arr);
    }

    return _arr;
  }

  var reversedHexArray = decimalToHexArrayHelper(decimalNum);

  if (reversedHexArray.length === 0) {
    return [0x00];
  }

  return (0, _reverse["default"])(reversedHexArray).call(reversedHexArray);
}

var getAsciiTLVBytes = function getAsciiTLVBytes(_ref) {
  var tag = _ref.tag,
      length = _ref.length,
      value = _ref.value;
  return (0, _concat["default"])(Buffer).call(Buffer, [Buffer.from(tag, 'utf8'), Buffer.from(length, 'utf8'), Buffer.from(value)]);
};

var getHexTLVBytes = function getHexTLVBytes(_ref2) {
  var tag = _ref2.tag,
      _ref2$length = _ref2.length,
      length = _ref2$length === void 0 ? 0 : _ref2$length,
      _ref2$value = _ref2.value,
      value = _ref2$value === void 0 ? '' : _ref2$value;
  return (0, _concat["default"])(Buffer).call(Buffer, [Buffer.from(tag, 'hex'), Buffer.from(decimalToHexArray(length)), Buffer.from(value, 'hex')]);
};

var Format = {
  AlphaNumeric: {
    fromBytes: function fromBytes(buffer) {
      return buffer === null || buffer === void 0 ? void 0 : buffer.toString('utf8');
    },
    toBytes: function toBytes(value) {
      return Buffer.from(value, 'utf8');
    }
  },
  AsciiTLV: {
    fromBytes: function fromBytes() {},
    toBytes: getAsciiTLVBytes
  },
  Hex: {
    fromBytes: function fromBytes(buffer) {
      return buffer.toString('hex');
    },
    toBytes: function toBytes(value) {
      return Buffer.from(value, 'hex');
    }
  },
  HexTLV: {
    fromBytes: function fromBytes() {},
    toBytes: getHexTLVBytes
  },
  Numeric: {
    // Left Shift the acc a byte, then 'or' the new byte to it, 1100000000 || 00000011 gives 1100000011
    fromBytes: function fromBytes(buffer) {
      return (0, _reduce["default"])(buffer).call(buffer, function (acc, _byte) {
        return acc << 8 | _byte;
      }, 0);
    },
    toBytes: function toBytes(value, length) {
      var _context;

      return Buffer.from((0, _padStart["default"])(_context = String(value)).call(_context, length, '0'), 'utf8');
    }
  }
};
exports.Format = Format;
}).call(this)}).call(this,require("buffer").Buffer)
},{"@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/pad-start":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-start.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/reverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reverse.js","@babel/runtime-corejs3/core-js-stable/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.date.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","ramda/src/__":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/__.js","ramda/src/curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","ramda/src/flip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/flip.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/index.js":[function(require,module,exports){
"use strict";

var _typeof = require("@babel/runtime-corejs3/helpers/typeof");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.conversionFunctions = exports.ResponseParser = exports.RequestConstants = exports.RequestBuilder = void 0;

var _RequestBuilder = _interopRequireWildcard(require("./request"));

exports.RequestBuilder = _RequestBuilder;

var _RequestConstants = _interopRequireWildcard(require("./requestConstants"));

exports.RequestConstants = _RequestConstants;

var _conversionFunctions = _interopRequireWildcard(require("./conversionFunctions"));

exports.conversionFunctions = _conversionFunctions;

var _ResponseParser = _interopRequireWildcard(require("./responseFunctions"));

exports.ResponseParser = _ResponseParser;

function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
},{"./conversionFunctions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/conversionFunctions.js","./request":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/request.js","./requestConstants":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/requestConstants.js","./responseFunctions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/responseFunctions.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/request.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.Numeric = exports.HexTLV = exports.Hex = exports.AsciiTLV = exports.AlphaNumeric = void 0;
exports.Request = Request;

var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));

require("core-js/modules/es.string.iterator.js");

require("core-js/modules/es.array.iterator.js");

require("core-js/modules/web.dom-collections.iterator.js");

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _freeze = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/freeze"));

var _padEnd = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/pad-end"));

var _padStart = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/pad-start"));

var _isInteger = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/number/is-integer"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _iterator = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol/iterator"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _curryN = _interopRequireDefault(require("ramda/src/curryN"));

var _equals = _interopRequireDefault(require("ramda/src/equals"));

var _identity = _interopRequireDefault(require("ramda/src/identity"));

var _isNil = _interopRequireDefault(require("ramda/src/isNil"));

var _pipe = _interopRequireDefault(require("ramda/src/pipe"));

var _conversionFunctions = require("./conversionFunctions");

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty2(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context9; _forEachInstanceProperty(_context9 = ownKeys(Object(source), true)).call(_context9, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context10; _forEachInstanceProperty(_context10 = ownKeys(Object(source))).call(_context10, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }

/*
 * Function to add STX control character to an array
 * @param parts Array of Bytes
 */
function addSTX() {
  var _context;

  var parts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  return (0, _concat["default"])(_context = [0x02]).call(_context, (0, _toConsumableArray2["default"])(parts));
}
/*
 * Function to add ETX control character to an array
 * @param parts Array of Bytes
 */


function addETX() {
  var _context2;

  var parts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  return (0, _concat["default"])(_context2 = []).call(_context2, (0, _toConsumableArray2["default"])(parts), [0x03]);
}
/*
 * Function to add the Longitude Redundancy Check Byte at the end of the command, past the STX.
 * @param parts Array of Bytes
 */


function addLRC() {
  var _context3, _context4;

  var parts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  // Generate the LRC byte from XORing all but STX.
  return (0, _concat["default"])(_context3 = []).call(_context3, (0, _toConsumableArray2["default"])(parts), [(0, _reduce["default"])(_context4 = (0, _slice["default"])(parts).call(parts, 1)).call(_context4, function (acc, _byte) {
    return acc ^ _byte;
  }, 0)]);
}

var generateRequestBytes = (0, _pipe["default"])(addSTX, addETX, addLRC);
/*
 * @param tag string Length range [1, 4]
 * @param length int The number of AlphaNumeric characters in value argument
 * @param value Buffer The value buffer should be exactly as long as the length argument value
 */

function AsciiTLVHelper(tag, length, value) {
  var _context5, _context6;

  if (!tag || !length || !value) {
    throw new Error('Tag, Length & Value are needed to form a TLV');
  }

  if (tag.length > 4 || tag.length === 0) {
    throw new Error("Tag's length can not be greater than 4 or equal to 0");
  }

  if (!(length > 0 && length < 999)) {
    // eslint-disable-line yoda
    throw new Error("Length's length must be positive and less than or equal to 999");
  }

  if (value.length !== length) {
    throw new Error("Value's length should be equal to the passed Length");
  }

  return (0, _freeze["default"])({
    /*
     * 4-byte tags:
     *  - In HEX - 39 46 30 34
     *  - In ASCII - 9F04 (other amount)
     * 2-byte tags:
     *  - In HEX - 39 43
     *  - In ASCII - 9C00 (transaction type)
     * For 2-byte tags, actual tag value must be in the upper nibble.
     * In the example above, 9C is the upper nibble, and 00 is padded after 9C to make TLV tag 4 bytes.
     */
    tag: (0, _padEnd["default"])(_context5 = String(tag)).call(_context5, 4, '0'),

    /*
     * Len - must be 3 bytes
     */
    length: (0, _padStart["default"])(_context6 = String(length)).call(_context6, 3, '0'),
    value: value
  });
}
/*
 * This function's value argument can be a buffer of hex values, an array of hex values,
 * a string of hex values (eg: 0ACD) or a number. The number will be converted to an
 * array of hexadecimal values.
 * @param tag string Eg. 'C1', will be converted to [0xC1]
 * @param value Buffer|Array|string|Number
 */


function HexTLVHelper(tag, value) {
  if (tag.length % 2 === 1) {
    // If tag length is odd then pad the string with a 0
    return HexTLVHelper("0".concat(tag), value);
  }

  function _LV(V) {
    if ((0, _isInteger["default"])(V)) {
      var _decimalToHexArray = (0, _conversionFunctions.decimalToHexArray)(V);

      return {
        length: _decimalToHexArray.length,
        value: _decimalToHexArray
      };
    }

    if (Buffer.isBuffer(V)) {
      return {
        length: V.length,
        value: V
      };
    }

    if ((0, _isArray["default"])(V)) {
      return {
        length: V.length,
        value: V
      };
    }

    if (typeof V === 'string') {
      return V.length % 2 === 1 ? _LV("0".concat(V)) : {
        length: V.length / 2,
        value: V
      };
    }

    return {};
  }

  return _objectSpread({
    tag: tag
  }, _LV(value));
}

var addRequestElementHelper = (0, _curryN["default"])(4, function (format, postConversionFn, length, value) {
  return (0, _isNil["default"])(value) ? undefined : {
    value: value,
    length: length,
    toBytes: function toBytes() {
      return postConversionFn(format.toBytes(value, length));
    }
  };
});
/*
 * Give this function an AlphaNumeric (AN) request component. Generates ascii -> hex value of each character.
 * @param value string
 */

var AlphaNumeric = addRequestElementHelper(_conversionFunctions.Format.AlphaNumeric, _identity["default"], undefined);
/*
 * Give this function a Numeric (N) request component. Generates ascii -> hex value of each digit after padding the start with 0s.
 * @param length int
 * @param value int
 */

exports.AlphaNumeric = AlphaNumeric;
var Numeric = addRequestElementHelper(_conversionFunctions.Format.Numeric, _identity["default"]);
/*
 * Give this function a Hex (H) request component
 * @param tag String Eg. 'C1', will be converted to [0xC1]
 * @param value Array|String|Buffer of hex values
 */

exports.Numeric = Numeric;
var Hex = addRequestElementHelper(_conversionFunctions.Format.Hex, _identity["default"], undefined);
/*
 * Give this function an Ascii TLV (<Tag><Length><Value>) request component
 * @param value TLV
 * @param postConversionFn (Buffer) => Iterable A function to operate on the ByteArray of this request element
 */

exports.Hex = Hex;

var AsciiTLV = function AsciiTLV(tag, length, value) {
  var f = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _identity["default"];
  return (0, _pipe["default"])(AsciiTLVHelper, addRequestElementHelper(_conversionFunctions.Format.AsciiTLV, f, undefined))(tag, length, value);
};
/*
 * Give this function a Hex TLV (<Tag><Length><Value>) request component
 * @param tag String
 *
 * @param postConversionFn (Buffer) => Iterable A function to operate on the ByteArray of this request element
 */


exports.AsciiTLV = AsciiTLV;

var HexTLV = function HexTLV(tag, value) {
  var f = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _identity["default"];
  return (0, _pipe["default"])(HexTLVHelper, addRequestElementHelper(_conversionFunctions.Format.HexTLV, f, undefined))(tag, value);
};
/*
 * Usage:
 * Request()
 *  .add(AlphaNumeric('F30'))
 *  .add(Hex([0x04, 0x03, ...]))
 *  .add(Numeric(20, 2))
 *  .add(AsciiTLV('9F04', 2, 'QW', pcFn))
 *  .add(AsciiTLV('9F0X', 3, 'QWE'))
 *  .add(HexTLV('C1', '0102'))
 *  .add(HexTLV('C1', [0x01, 0x02]))
 *  .add(HexTLV('C2', Buffer.from('0102', 'hex')))
 *  .getRequestBytes();
 */


exports.HexTLV = HexTLV;

function Request() {
  var _Object$freeze2;

  for (var _len = arguments.length, parts = new Array(_len), _key = 0; _key < _len; _key++) {
    parts[_key] = arguments[_key];
  }

  // Parts is an array of individual command elements. On this method invocation, each element's toByte will be
  // invoked and added to an array.
  var convertToBytes = function convertToBytes(_parts) {
    return (0, _reduce["default"])(_parts).call(_parts, function (acc, _part) {
      var _context7;

      return (0, _concat["default"])(_context7 = []).call(_context7, (0, _toConsumableArray2["default"])(acc), (0, _toConsumableArray2["default"])(_part.toBytes()));
    }, []);
  };

  return (0, _freeze["default"])((_Object$freeze2 = {
    add: function add(arg) {
      return (0, _isNil["default"])(arg) ? Request.apply(void 0, parts) : Request.apply(void 0, (0, _concat["default"])(parts).call(parts, [arg]));
    },
    remove: function remove(arg) {
      return Request.apply(void 0, (0, _toConsumableArray2["default"])((0, _filter["default"])(parts).call(parts, function (part) {
        return !((0, _equals["default"])(part.value, arg.value) && (0, _equals["default"])(part.length, arg.length));
      })));
    }
  }, (0, _defineProperty2["default"])(_Object$freeze2, _iterator["default"], /*#__PURE__*/_regenerator["default"].mark(function _callee() {
    return _regenerator["default"].wrap(function _callee$(_context8) {
      while (1) {
        switch (_context8.prev = _context8.next) {
          case 0:
            return _context8.delegateYield(parts, "t0", 1);

          case 1:
          case "end":
            return _context8.stop();
        }
      }
    }, _callee);
  })), (0, _defineProperty2["default"])(_Object$freeze2, "getRequestBytes", function getRequestBytes() {
    var postConversionF = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _identity["default"];
    return (0, _pipe["default"])(convertToBytes, generateRequestBytes, postConversionF)(parts);
  }), (0, _defineProperty2["default"])(_Object$freeze2, "getPayloadBytes", function getPayloadBytes() {
    var postConversionF = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _identity["default"];
    return (0, _pipe["default"])(convertToBytes, postConversionF)(parts);
  }), _Object$freeze2));
}
}).call(this)}).call(this,{"isBuffer":require("../../../../is-buffer/index.js")})
},{"../../../../is-buffer/index.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-buffer/index.js","./conversionFunctions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/conversionFunctions.js","@babel/runtime-corejs3/core-js-stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/pad-end":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-end.js","@babel/runtime-corejs3/core-js-stable/instance/pad-start":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-start.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/number/is-integer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-integer.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/freeze":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/freeze.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/iterator.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","@babel/runtime-corejs3/regenerator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/regenerator/index.js","core-js/modules/es.array.iterator.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.array.iterator.js","core-js/modules/es.string.iterator.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.iterator.js","core-js/modules/web.dom-collections.iterator.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.dom-collections.iterator.js","ramda/src/curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","ramda/src/equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","ramda/src/identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/identity.js","ramda/src/isNil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isNil.js","ramda/src/pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/requestConstants.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.ZUSCommandID = exports.TransactionRequestCommandID = exports.ServerDataAndTextPromptCommandID = exports.QUSCommandID = exports.MaintenanceCommandID = exports.MagStripeAndDisplayCommandID = exports.GroupSeparator = exports.FileSeparator = exports.EncryptionCommandID = exports.EMVTransactionID = exports.EMVConfigurationID = exports.EMVCheckCardStatusCommandID = exports.DEFAULT = void 0;

var _request = require("./request");

var FileSeparator = (0, _request.Hex)([0x1c]);
exports.FileSeparator = FileSeparator;
var GroupSeparator = (0, _request.Hex)([0x1d]);
exports.GroupSeparator = GroupSeparator;
var DEFAULT = '2D';
exports.DEFAULT = DEFAULT;
var EMVTransactionID = (0, _request.AlphaNumeric)('C');
exports.EMVTransactionID = EMVTransactionID;
var EMVConfigurationID = (0, _request.AlphaNumeric)('D');
exports.EMVConfigurationID = EMVConfigurationID;
var EncryptionCommandID = (0, _request.AlphaNumeric)('E');
exports.EncryptionCommandID = EncryptionCommandID;
var EMVCheckCardStatusCommandID = (0, _request.AlphaNumeric)('I');
exports.EMVCheckCardStatusCommandID = EMVCheckCardStatusCommandID;
var MaintenanceCommandID = (0, _request.AlphaNumeric)('M');
exports.MaintenanceCommandID = MaintenanceCommandID;
var QUSCommandID = (0, _request.AlphaNumeric)('Q');
exports.QUSCommandID = QUSCommandID;
var MagStripeAndDisplayCommandID = (0, _request.AlphaNumeric)('S');
exports.MagStripeAndDisplayCommandID = MagStripeAndDisplayCommandID;
var ServerDataAndTextPromptCommandID = (0, _request.AlphaNumeric)('T');
exports.ServerDataAndTextPromptCommandID = ServerDataAndTextPromptCommandID;
var TransactionRequestCommandID = (0, _request.AlphaNumeric)('X');
exports.TransactionRequestCommandID = TransactionRequestCommandID;
var ZUSCommandID = (0, _request.AlphaNumeric)('Z');
exports.ZUSCommandID = ZUSCommandID;
},{"./request":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/request.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/responseFunctions.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.Type = exports.ParserConfig = void 0;
exports.getCommand = getCommand;
exports.parse = exports.mergePayloadAsString = exports.mergePayloadAsObject = void 0;
exports.responseTagMap = responseTagMap;
exports.responseTagValueMap = responseTagValueMap;

var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _freeze = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/freeze"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

require("core-js/modules/es.date.to-string.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

require("core-js/modules/es.function.name.js");

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.split.js");

var _pipe = _interopRequireDefault(require("ramda/src/pipe"));

var _curryN = _interopRequireDefault(require("ramda/src/curryN"));

var _identity = _interopRequireDefault(require("ramda/src/identity"));

var _nodeTlv = _interopRequireDefault(require("node-tlv"));

var _conversionFunctions = require("./conversionFunctions");

var _requestConstants = require("./requestConstants");

var _excluded = ["parsedResponse"],
    _excluded2 = ["parsedResponse"],
    _excluded3 = ["parsedResponse"],
    _excluded4 = ["payloadParserFn", "mergeStrategyFn"];

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context; _forEachInstanceProperty(_context = ownKeys(Object(source), true)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context2; _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }

var FileSeparatorString = _requestConstants.FileSeparator.toBytes().toString('utf8');
/*
 * This function extracts the command from the base64 decoded response from the reader
 * @param rawResponseBytes Array of hexadecimal values
 */


function getCommand(_ref) {
  var rawResponse = _ref.rawResponse,
      _ref$commandLength = _ref.commandLength,
      commandLength = _ref$commandLength === void 0 ? 3 : _ref$commandLength;
  var commandEndIndex = 1 + commandLength;
  return Buffer.from((0, _slice["default"])(rawResponse).call(rawResponse, 1, commandEndIndex)).toString('utf8');
}
/*
 * This function extracts the response code from the base64 decoded response from the reader
 * @param rawResponseBytes Array of hexadecimal values
 */


function getResponseCode(_ref2) {
  var _ref2$commandLength = _ref2.commandLength,
      commandLength = _ref2$commandLength === void 0 ? 3 : _ref2$commandLength,
      rawResponse = _ref2.rawResponse,
      responseCodeLength = _ref2.responseCodeLength;
  var commandEndIndex = 1 + commandLength;
  var responseCodeEndIndex = commandEndIndex + responseCodeLength;
  return Buffer.from((0, _slice["default"])(rawResponse).call(rawResponse, commandEndIndex, responseCodeEndIndex)).toString('utf8');
}
/*
 * This function extracts the payload from the base64 decoded response from the reader
 * @param rawResponseBytes Array of hexadecimal values
 */


function getPayload(_ref3) {
  var _ref3$commandLength = _ref3.commandLength,
      commandLength = _ref3$commandLength === void 0 ? 3 : _ref3$commandLength,
      rawResponse = _ref3.rawResponse,
      responseCodeLength = _ref3.responseCodeLength;
  var responseCodeEndIndex = 1 + commandLength + responseCodeLength;
  return Buffer.from((0, _slice["default"])(rawResponse).call(rawResponse, responseCodeEndIndex, -2));
}
/*
 * A utility function over the parsedResponse object.
 */


function parsedResponseHolder() {
  var _parsedResponse = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

  return (0, _freeze["default"])({
    add: function add(object) {
      return parsedResponseHolder(_objectSpread(_objectSpread({}, _parsedResponse), object));
    },
    getParsedResponse: function getParsedResponse() {
      return _parsedResponse;
    }
  });
}

function responseTagValueMap() {
  var Tag = function Tag(tag) {
    var _tvMap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    return (0, _freeze["default"])({
      to: function to(name) {
        return Tag(tag, _objectSpread(_objectSpread({}, _tvMap), {}, (0, _defineProperty2["default"])({}, tag, _objectSpread(_objectSpread({}, _tvMap[tag]), {}, {
          name: name
        }))));
      },
      Value: (0, _freeze["default"])({
        preFormatParseWith: function preFormatParseWith(preFormatParseF) {
          return Tag(tag, _objectSpread(_objectSpread({}, _tvMap), {}, (0, _defineProperty2["default"])({}, tag, _objectSpread(_objectSpread({}, _tvMap[tag]), {}, {
            preFormatParseF: preFormatParseF
          })))).Value;
        },
        format: function format(formatter) {
          return Tag(tag, _objectSpread(_objectSpread({}, _tvMap), {}, (0, _defineProperty2["default"])({}, tag, _objectSpread(_objectSpread({}, _tvMap[tag]), {}, {
            formatter: formatter
          })))).Value;
        },
        postFormatParseWith: function postFormatParseWith(postFormatParseF) {
          return Tag(tag, _objectSpread(_objectSpread({}, _tvMap), {}, (0, _defineProperty2["default"])({}, tag, _objectSpread(_objectSpread({}, _tvMap[tag]), {}, {
            postFormatParseF: postFormatParseF
          })))).Value;
        },
        _tvMap: _tvMap
      })
    });
  };

  return Tag;
}

function responseTagMap() {
  var _map = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

  return (0, _freeze["default"])({
    add: function add(_ref4) {
      var _tvMap = _ref4._tvMap;
      return responseTagMap(_objectSpread(_objectSpread({}, _map), _tvMap));
    },
    build: function build() {
      return _map;
    }
  });
}

var parseCommand = function parseCommand(_ref5) {
  var _ref5$parsedResponse = _ref5.parsedResponse,
      parsedResponse = _ref5$parsedResponse === void 0 ? parsedResponseHolder() : _ref5$parsedResponse,
      keyValues = (0, _objectWithoutProperties2["default"])(_ref5, _excluded);
  return _objectSpread({
    parsedResponse: parsedResponse.add({
      command: getCommand(keyValues)
    })
  }, keyValues);
};

var parseResponseCode = function parseResponseCode(_ref6) {
  var _ref6$parsedResponse = _ref6.parsedResponse,
      parsedResponse = _ref6$parsedResponse === void 0 ? parsedResponseHolder() : _ref6$parsedResponse,
      keyValues = (0, _objectWithoutProperties2["default"])(_ref6, _excluded2);
  return _objectSpread({
    parsedResponse: parsedResponse.add({
      responseCode: getResponseCode(keyValues)
    })
  }, keyValues);
};

var parsePayload = function parsePayload() {
  var parserFn = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _identity["default"];

  var _ref7 = arguments.length > 1 ? arguments[1] : undefined,
      _ref7$parsedResponse = _ref7.parsedResponse,
      parsedResponse = _ref7$parsedResponse === void 0 ? parsedResponseHolder() : _ref7$parsedResponse,
      keyValues = (0, _objectWithoutProperties2["default"])(_ref7, _excluded3);

  return _objectSpread({
    parsedResponse: parsedResponse.add({
      payload: parserFn(getPayload(keyValues))
    })
  }, keyValues);
};

var toParsedObject = function toParsedObject(_ref8) {
  var _ref8$parsedResponse = _ref8.parsedResponse,
      parsedResponse = _ref8$parsedResponse === void 0 ? parsedResponseHolder() : _ref8$parsedResponse,
      rawResponse = _ref8.rawResponse;
  return _objectSpread(_objectSpread({}, parsedResponse.getParsedResponse()), {}, {
    rawResponse: (0, _conversionFunctions.toBase64)(rawResponse)
  });
};

var tlvListToJSON = function tlvListToJSON(tagNameValueMap, _ref9) {
  var TLVs = _ref9.TLVs,
      emvData = _ref9.emvData;
  return (0, _reduce["default"])(TLVs).call(TLVs, function (acc, tlv) {
    var _objectSpread6;

    var _tag = tlv.getTag('hex');

    var _value = tlv.getValue('buffer');

    var _ref10 = tagNameValueMap[_tag] || {},
        name = _ref10.name,
        _ref10$formatter = _ref10.formatter,
        formatter = _ref10$formatter === void 0 ? {
      fromBytes: _identity["default"]
    } : _ref10$formatter,
        _ref10$preFormatParse = _ref10.preFormatParseF,
        preFormatParseF = _ref10$preFormatParse === void 0 ? _identity["default"] : _ref10$preFormatParse,
        _ref10$postFormatPars = _ref10.postFormatParseF,
        postFormatParseF = _ref10$postFormatPars === void 0 ? _identity["default"] : _ref10$postFormatPars;

    var _parse = (0, _pipe["default"])(preFormatParseF, formatter.fromBytes, postFormatParseF);

    return _objectSpread(_objectSpread({}, acc), {}, (_objectSpread6 = {}, (0, _defineProperty2["default"])(_objectSpread6, name, name && _parse(_value)), (0, _defineProperty2["default"])(_objectSpread6, "".concat(name, "TLV"), name && tlv.toString()), _objectSpread6));
  }, {
    emvData: emvData === null || emvData === void 0 ? void 0 : emvData.toString('hex')
  });
};

var fsListToJSON = function fsListToJSON() {
  var fsListValueFn = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _identity["default"];
  var fsList = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  return (0, _reduce["default"])(fsList).call(fsList, function (acc, listValue) {
    return _objectSpread(_objectSpread({}, acc), fsListValueFn(listValue));
  }, {});
};

var mergePayloadAsObject = function mergePayloadAsObject() {
  var oldObject = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  return function () {
    var newParsedObject = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
    return _objectSpread(_objectSpread({}, newParsedObject), {}, {
      payload: oldObject.command === newParsedObject.command ? _objectSpread(_objectSpread({}, oldObject.payload), newParsedObject.payload) : _objectSpread({}, newParsedObject.payload)
    });
  };
};

exports.mergePayloadAsObject = mergePayloadAsObject;

var mergePayloadAsString = function mergePayloadAsString() {
  var oldPayload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  return function () {
    var newPayload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
    return _objectSpread(_objectSpread({}, newPayload), {}, {
      payload: oldPayload.command === newPayload.command ? oldPayload.payload + newPayload.payload : newPayload.payload
    });
  };
};

exports.mergePayloadAsString = mergePayloadAsString;

var ParserConfig = function ParserConfig() {
  var _args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

  return (0, _freeze["default"])({
    responseType: function responseType(type) {
      return ParserConfig(_objectSpread(_objectSpread({}, _args), {}, {
        payloadParserFn: type
      }));
    },
    commandLength: function commandLength(_commandLength) {
      return ParserConfig(_objectSpread(_objectSpread({}, _args), {}, {
        commandLength: _commandLength
      }));
    },
    responseCodeLength: function responseCodeLength(_responseCodeLength) {
      return ParserConfig(_objectSpread(_objectSpread({}, _args), {}, {
        responseCodeLength: _responseCodeLength
      }));
    },
    mergeStrategy: function mergeStrategy(mergeStrategyFn) {
      return ParserConfig(_objectSpread(_objectSpread({}, _args), {}, {
        mergeStrategyFn: mergeStrategyFn
      }));
    },
    build: function build() {
      return _objectSpread(_objectSpread({}, {
        commandLength: 3,
        responseCodeLength: 1
      }), _args);
    }
  });
};
/*
 * This function builds an object containing functions to parse the response payload.
 * The payload in the response can be in TLV format, FS separated list format or Hex.
 * The return value of this function is added to the ParserConfig object.
 */


exports.ParserConfig = ParserConfig;

var Type = function Type() {
  var _args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
    extractorFn: _identity["default"]
  };

  var _tlvListToJSON = (0, _curryN["default"])(2, tlvListToJSON);

  var _fsListToJSON = (0, _curryN["default"])(2, fsListToJSON);

  var parseTLVList = function parseTLVList(emvData) {
    return {
      TLVs: _nodeTlv["default"].parseList(emvData),
      emvData: emvData
    };
  };

  var fsListExtractorFn = function fsListExtractorFn(rawResponse) {
    return rawResponse.split(FileSeparatorString);
  };

  return (0, _freeze["default"])({
    TLVList: {
      // extractorFn is run on the payload first
      extractWith: function extractWith(extractorFn) {
        return Type(_objectSpread(_objectSpread({}, _args), {}, {
          extractorFn: extractorFn
        })).TLVList;
      },
      mapWith: function mapWith(tagNameValueMap) {
        return Type(_objectSpread(_objectSpread({}, _args), {}, {
          tagNameValueMap: tagNameValueMap
        })).TLVList;
      },
      build: function build() {
        return (0, _pipe["default"])(function (buffer) {
          return buffer.toString('utf8');
        }, _args.extractorFn, parseTLVList, _tlvListToJSON(_args.tagNameValueMap));
      }
    },
    FSList: {
      // extractorFn is run on the payload first
      extractWith: function extractWith(extractorFn) {
        return Type(_objectSpread(_objectSpread({}, _args), {}, {
          extractorFn: extractorFn
        })).FSList;
      },
      mapWith: function mapWith(valueFn) {
        return Type(_objectSpread(_objectSpread({}, _args), {}, {
          valueFn: valueFn
        })).FSList;
      },
      build: function build() {
        return (0, _pipe["default"])(function (buffer) {
          return buffer.toString('utf8');
        }, _args.extractorFn, fsListExtractorFn, _fsListToJSON(_args.valueFn));
      }
    },
    Hex: {
      // extractorFn is run on the payload first
      extractWith: function extractWith(extractorFn) {
        return Type(_objectSpread(_objectSpread({}, _args), {}, {
          extractorFn: extractorFn
        })).Hex;
      },
      build: function build() {
        return (0, _pipe["default"])(_args.extractorFn);
      }
    }
  });
};
/*
 * This function accepts a ParserConfig object and the base64 decoded response to return the parsed object
 */


exports.Type = Type;

var parse = function parse(parserConfig, rawResponse) {
  var _parserConfig$payload = parserConfig.payloadParserFn,
      payloadParserFn = _parserConfig$payload === void 0 ? _identity["default"] : _parserConfig$payload,
      mergeStrategyFn = parserConfig.mergeStrategyFn,
      keyValues = (0, _objectWithoutProperties2["default"])(parserConfig, _excluded4);

  var _parsePayload = (0, _curryN["default"])(2, parsePayload); // Each step of the _parse function adds fields to an object


  var _parse = (0, _pipe["default"])( // Step 1: Parse and add the command
  parseCommand, // Step 2: Parse and add the response code
  parseResponseCode, // Step 3: Parse and add the payload object
  _parsePayload(payloadParserFn), // Step 4: Add the original base64 response to the result
  toParsedObject, // Step 5: Merge the new parsed response object with the old response
  mergeStrategyFn);

  return _parse(_objectSpread(_objectSpread({}, keyValues), {}, {
    rawResponse: rawResponse
  }));
};

exports.parse = parse;
}).call(this)}).call(this,require("buffer").Buffer)
},{"./conversionFunctions":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/conversionFunctions.js","./requestConstants":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/requestConstants.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/freeze":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/freeze.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/objectWithoutProperties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/objectWithoutProperties.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","core-js/modules/es.date.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js","core-js/modules/es.function.name.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.function.name.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.exec.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js","core-js/modules/es.string.split.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js","node-tlv":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/TLV.js","ramda/src/curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","ramda/src/identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/identity.js","ramda/src/pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/cancelCommands.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.parser = exports.coldCancel = exports.clearScreen = exports.cancel = exports.CancelCommandEnums = void 0;

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _curryN = _interopRequireDefault(require("ramda/src/curryN"));

var _TLVs = require("../TLVs");

var Request = _TLVs.RequestBuilder.Request,
    Numeric = _TLVs.RequestBuilder.Numeric;
var FileSeparator = _TLVs.RequestConstants.FileSeparator,
    MagStripeAndDisplayCommandID = _TLVs.RequestConstants.MagStripeAndDisplayCommandID;
var cancelCommandRequisite = Request(MagStripeAndDisplayCommandID, Numeric(2, 0));
var Numeric1 = (0, _curryN["default"])(2, Numeric)(1);
var Screen = {
  NO_CHANGE: 0,
  WELCOME: 1,
  CLEAR: 2,
  DISPLAY_AD: 3
};
var EmvFallbackMode = {
  OFF: 0,
  ON: 1
};
var KeyboardStatus = {
  UNCHANGED: 0,
  DISABLED: 1
};
var CancelCommandEnums = {
  EmvFallbackMode: EmvFallbackMode,
  KeyboardStatus: KeyboardStatus,
  Screen: Screen
};
exports.CancelCommandEnums = CancelCommandEnums;

var S00Helper = function S00Helper(_ref) {
  var _ref$screenAction = _ref.screenAction,
      screenAction = _ref$screenAction === void 0 ? Screen.WELCOME : _ref$screenAction,
      _ref$emvFallbackMode = _ref.emvFallbackMode,
      emvFallbackMode = _ref$emvFallbackMode === void 0 ? EmvFallbackMode.OFF : _ref$emvFallbackMode,
      _ref$keyBoardStatus = _ref.keyBoardStatus,
      keyBoardStatus = _ref$keyBoardStatus === void 0 ? KeyboardStatus.UNCHANGED : _ref$keyBoardStatus;
  return Request.apply(void 0, (0, _toConsumableArray2["default"])(cancelCommandRequisite)).add(Numeric1(screenAction)).add(Numeric1(emvFallbackMode)).add(FileSeparator).add(Numeric1(keyBoardStatus));
};

var cancel = {
  command: 'S00',
  request: S00Helper,
  isResponseExpected: false
};
exports.cancel = cancel;
var clearScreen = {
  command: 'S00',
  request: function request() {
    return S00Helper({
      screenAction: Screen.CLEAR,
      emvFallbackMode: EmvFallbackMode.OFF,
      keyBoardStatus: KeyboardStatus.UNCHANGED
    });
  },
  isResponseExpected: false
};
exports.clearScreen = clearScreen;
var coldCancel = {
  command: 'S00',
  commandInResponse: 'S00',
  request: function request() {
    return S00Helper({});
  },
  isResponseExpected: true,
  timeoutRead: true
};
exports.coldCancel = coldCancel;

var parser = function parser() {
  return {
    isResponseExpected: false
  };
};

exports.parser = parser;
},{"../TLVs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/index.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","ramda/src/curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/cardPresentCommands.js":[function(require,module,exports){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.isCardPresent = void 0;
exports.parser = parser;

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _TLVs = require("../TLVs");

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context; _forEachInstanceProperty(_context = ownKeys(Object(source), true)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context2; _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }

var parse = _TLVs.ResponseParser.parse,
    ParserConfig = _TLVs.ResponseParser.ParserConfig,
    mergePayloadAsObject = _TLVs.ResponseParser.mergePayloadAsObject;
var EMVCheckCardStatusCommandID = _TLVs.RequestConstants.EMVCheckCardStatusCommandID;
var Request = _TLVs.RequestBuilder.Request,
    Numeric = _TLVs.RequestBuilder.Numeric;
var cardPresentCommandRequisite = Request(EMVCheckCardStatusCommandID, Numeric(2, 5));

var I05Helper = function I05Helper() {
  return Request.apply(void 0, (0, _toConsumableArray2["default"])(cardPresentCommandRequisite)).add(Numeric(1, 0));
};

var isCardPresent = {
  command: 'I05',
  request: I05Helper,
  isResponseExpected: true,
  commandInResponse: 'I05'
};
exports.isCardPresent = isCardPresent;

function parser(accParsedResponse, rawResponse) {
  var parserConfig = ParserConfig().mergeStrategy(mergePayloadAsObject(accParsedResponse)).build();
  return _objectSpread(_objectSpread({}, parse(parserConfig, rawResponse)), {}, {
    continuationRequest: undefined,
    isFinished: true,
    isResponseExpected: false
  });
}
},{"../TLVs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/index.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/cardRemoveCommands.js":[function(require,module,exports){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.parser = parser;
exports.removeCard = void 0;

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _TLVs = require("../TLVs");

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context; _forEachInstanceProperty(_context = ownKeys(Object(source), true)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context2; _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }

var parse = _TLVs.ResponseParser.parse,
    ParserConfig = _TLVs.ResponseParser.ParserConfig,
    mergePayloadAsObject = _TLVs.ResponseParser.mergePayloadAsObject;
var EMVCheckCardStatusCommandID = _TLVs.RequestConstants.EMVCheckCardStatusCommandID,
    FileSeparator = _TLVs.RequestConstants.FileSeparator;
var AlphaNumeric = _TLVs.RequestBuilder.AlphaNumeric,
    Numeric = _TLVs.RequestBuilder.Numeric,
    Request = _TLVs.RequestBuilder.Request;
var removeCardCommandRequisite = Request(EMVCheckCardStatusCommandID, Numeric(2, 2));

var I02Helper = function I02Helper(_ref) {
  var _ref$showPleaseWaitMe = _ref.showPleaseWaitMessage,
      showPleaseWaitMessage = _ref$showPleaseWaitMe === void 0 ? 0 : _ref$showPleaseWaitMe,
      messageLine1 = _ref.messageLine1,
      messageLine2 = _ref.messageLine2;
  return Request.apply(void 0, (0, _toConsumableArray2["default"])(removeCardCommandRequisite)).add(Numeric(1, showPleaseWaitMessage)).add(FileSeparator).add(AlphaNumeric(messageLine1 === null || messageLine1 === void 0 ? void 0 : (0, _slice["default"])(messageLine1).call(messageLine1, 0, 16))).add(FileSeparator).add(AlphaNumeric(messageLine2 === null || messageLine2 === void 0 ? void 0 : (0, _slice["default"])(messageLine2).call(messageLine2, 0, 16)));
};

var removeCard = {
  command: 'I02',
  request: I02Helper,
  isResponseExpected: true,
  commandInResponse: 'I02'
};
exports.removeCard = removeCard;

function parser(accParsedResponse, rawResponse) {
  var parserConfig = ParserConfig().mergeStrategy(mergePayloadAsObject(accParsedResponse)).build();
  return _objectSpread(_objectSpread({}, parse(parserConfig, rawResponse)), {}, {
    continuationRequest: undefined,
    isFinished: true,
    isResponseExpected: false
  });
}
},{"../TLVs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/index.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/completeTransactionCommands.js":[function(require,module,exports){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.parser = exports.completeEMVPayment = exports.CompleteTransactionEnums = void 0;

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _TLVs = require("../TLVs");

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context; _forEachInstanceProperty(_context = ownKeys(Object(source), true)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context2; _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }

var Format = _TLVs.conversionFunctions.Format,
    fromBase64 = _TLVs.conversionFunctions.fromBase64,
    hexEncode = _TLVs.conversionFunctions.hexEncode,
    toBase64 = _TLVs.conversionFunctions.toBase64;
var parse = _TLVs.ResponseParser.parse,
    ParserConfig = _TLVs.ResponseParser.ParserConfig,
    responseTagMap = _TLVs.ResponseParser.responseTagMap,
    responseTagValueMap = _TLVs.ResponseParser.responseTagValueMap,
    Type = _TLVs.ResponseParser.Type,
    mergePayloadAsObject = _TLVs.ResponseParser.mergePayloadAsObject;
var AlphaNumeric = _TLVs.RequestBuilder.AlphaNumeric,
    Hex = _TLVs.RequestBuilder.Hex,
    HexTLV = _TLVs.RequestBuilder.HexTLV,
    Numeric = _TLVs.RequestBuilder.Numeric,
    Request = _TLVs.RequestBuilder.Request;
var HostDecision = {
  HOST_AUTHORIZED: '00',
  HOST_DECLINED: '01',
  CONNECTION_FAILED: '02',
  CONNECTION_FAILED_FORCE_AAC_DECLINE: '03'
};
var CompleteTransactionEnums = {
  HostDecision: HostDecision
};
exports.CompleteTransactionEnums = CompleteTransactionEnums;
var completeEMVTransactionCommandRequisite = Request(AlphaNumeric('F'), Numeric(2, 34));
/*
 * @param authResponseCode string Eg: 00, Z3, etc. This string gets ASCII HEX encoded.
 * @param authResponseTLV string A TLV string. Will be inserted as is in the request.
 * @param hostDecision string This string should have Hex values: 01, 02, 03, 04.
 */

var F34Helper = function F34Helper(_ref) {
  var authResponseCode = _ref.authResponseCode,
      authResponseTLV = _ref.authResponseTLV,
      hostDecision = _ref.hostDecision,
      issuerScript = _ref.issuerScript;
  var payload = Request().add(authResponseTLV && Hex(authResponseTLV) || authResponseCode && HexTLV('8A', hexEncode(authResponseCode))).add(HexTLV('9FA036', hostDecision)).add(HexTLV('9FA039', issuerScript)).getPayloadBytes(toBase64);
  return Request.apply(void 0, (0, _toConsumableArray2["default"])(completeEMVTransactionCommandRequisite)).add(AlphaNumeric(payload));
};

var completeEMVPayment = {
  command: 'F34',
  request: F34Helper,
  isResponseExpected: true,
  commandInResponse: 'F34'
};
exports.completeEMVPayment = completeEMVPayment;
var Tag = responseTagValueMap();
var tagNameValueMap = responseTagMap().add(Tag('95').to('TVR').Value.format(Format.Hex)).add(Tag('9B').to('TSI').Value.format(Format.Hex)).add(Tag('9F26').to('applicationCryptogram').Value.format(Format.Hex)).add(Tag('9F27').to('CID').Value.format(Format.Hex)).add(Tag('9F36').to('ADC').Value.format(Format.Hex)).add(Tag('9F10').to('IAD').Value.format(Format.Hex)).add(Tag('9FA050').to('Script1').Value.format(Format.Hex)).add(Tag('9FA051').to('Script2').Value.format(Format.Hex)).add(Tag('9FA052').to('Script3').Value.format(Format.Hex)).add(Tag('9FA053').to('Script4').Value.format(Format.Hex)).add(Tag('9FA054').to('Script5').Value.format(Format.Hex)).build();
var parserConfig = ParserConfig().responseType(Type().TLVList.mapWith(tagNameValueMap).extractWith(fromBase64).build()).responseCodeLength(2);

var parser = function parser(accParsedResponse, rawResponse) {
  return _objectSpread(_objectSpread({}, parse(parserConfig.mergeStrategy(mergePayloadAsObject(accParsedResponse)).build(), rawResponse)), {}, {
    continuationRequest: undefined,
    isFinished: true,
    isResponseExpected: false
  });
};

exports.parser = parser;
},{"../TLVs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/index.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/displayMessageCommands.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.displayMessage = void 0;

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _TLVs = require("../TLVs");

var AlphaNumeric = _TLVs.RequestBuilder.AlphaNumeric,
    Request = _TLVs.RequestBuilder.Request,
    Numeric = _TLVs.RequestBuilder.Numeric;
var FileSeparator = _TLVs.RequestConstants.FileSeparator;
var displayMessageCommandRequisite = Request(AlphaNumeric('S'), Numeric(2, 14));

var S14Helper = function S14Helper(_ref) {
  var messageLine1 = _ref.messageLine1,
      messageLine2 = _ref.messageLine2,
      messageLine3 = _ref.messageLine3,
      messageLine4 = _ref.messageLine4,
      _ref$timeout = _ref.timeout,
      timeout = _ref$timeout === void 0 ? 99999 : _ref$timeout;
  return Request.apply(void 0, (0, _toConsumableArray2["default"])(displayMessageCommandRequisite)).add(AlphaNumeric(messageLine1)).add(FileSeparator).add(AlphaNumeric(messageLine2)).add(FileSeparator).add(AlphaNumeric(messageLine3)).add(FileSeparator).add(AlphaNumeric(messageLine4)).add(FileSeparator).add(Numeric(5, timeout));
}; // eslint-disable-next-line import/prefer-default-export


var displayMessage = {
  command: 'S14',
  request: S14Helper,
  isResponseExpected: false
};
exports.displayMessage = displayMessage;
},{"../TLVs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/index.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/emvTransactionCommands.js":[function(require,module,exports){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.takeEMVPayment = exports.parser = exports.StartTransactionEnums = void 0;

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

require("core-js/modules/es.date.to-string.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _padStart = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/pad-start"));

var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _TLVs = require("../TLVs");

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context7; _forEachInstanceProperty(_context7 = ownKeys(Object(source), true)).call(_context7, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context8; _forEachInstanceProperty(_context8 = ownKeys(Object(source))).call(_context8, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }

var parse = _TLVs.ResponseParser.parse,
    ParserConfig = _TLVs.ResponseParser.ParserConfig,
    responseTagMap = _TLVs.ResponseParser.responseTagMap,
    responseTagValueMap = _TLVs.ResponseParser.responseTagValueMap,
    Type = _TLVs.ResponseParser.Type,
    mergePayloadAsObject = _TLVs.ResponseParser.mergePayloadAsObject;
var fromBase64 = _TLVs.conversionFunctions.fromBase64,
    toBase64 = _TLVs.conversionFunctions.toBase64,
    Format = _TLVs.conversionFunctions.Format;
var AlphaNumeric = _TLVs.RequestBuilder.AlphaNumeric,
    Request = _TLVs.RequestBuilder.Request,
    HexTLV = _TLVs.RequestBuilder.HexTLV,
    Numeric = _TLVs.RequestBuilder.Numeric;
var DEFAULT = _TLVs.RequestConstants.DEFAULT;
var startEMVTransactionCommandRequisite = Request(AlphaNumeric('F'), Numeric(2, 30));
var Technology = {
  DEFAULT: DEFAULT,
  SWIPE: 0x01,
  TAP: 0x02,
  CHIP: 0x04,
  get: function get() {
    var _context;

    var technologies = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
    return (0, _padStart["default"])(_context = (0, _reduce["default"])(technologies).call(technologies, function (acc, technology) {
      return acc | technology;
    }, 0x00).toString()).call(_context, 2, '0');
  }
};
var Tap = {
  DEFAULT: DEFAULT,
  AUTHORIZATION: '00',
  CASH: '01',
  DEBIT_ADJUSTMENT: '02',
  REFUND: '20',
  AVAILABLE_FUNDS_INQUIRY: '30',
  BALANCE_INQUIRY: '31',
  PAYMENT_FROM_ACCOUNT: '50',
  PAYMENT_TO_ACCOUNT: '53',
  DISABLED: '80'
};
var QuickChip = {
  DEFAULT: DEFAULT,
  DISABLED: '00',
  ENABLED: '01',
  ENABLED_TILL_READ_RECORD: '02'
};
var ShowAmount = {
  DEFAULT: DEFAULT,
  NO: '00',
  YES: '01'
};
var FallbackSwipe = {
  DEFAULT: DEFAULT,
  NO: '00',
  YES: '01'
};
var MerchantDecision = {
  DEFAULT: DEFAULT,
  TC: '00',
  FORCE_ONLINE: '01',
  FORCE_DECLINE: '02'
};
var StartTransactionEnums = {
  Tap: Tap,
  FallbackSwipe: FallbackSwipe,
  QuickChip: QuickChip,
  ShowAmount: ShowAmount,
  MerchantDecision: MerchantDecision,
  Technology: Technology
};
exports.StartTransactionEnums = StartTransactionEnums;

var F30Helper = function F30Helper(_ref) {
  var _context2, _context3, _context4, _context5, _context6;

  var _ref$amount = _ref.amount,
      amount = _ref$amount === void 0 ? 100 : _ref$amount,
      _ref$technology = _ref.technology,
      technology = _ref$technology === void 0 ? Technology.DEFAULT : _ref$technology,
      _ref$fallback = _ref.fallback,
      fallback = _ref$fallback === void 0 ? FallbackSwipe.DEFAULT : _ref$fallback,
      _ref$quickChip = _ref.quickChip,
      quickChip = _ref$quickChip === void 0 ? QuickChip.DISABLED : _ref$quickChip,
      _ref$showAmount = _ref.showAmount,
      showAmount = _ref$showAmount === void 0 ? ShowAmount.YES : _ref$showAmount,
      _ref$merchantDecision = _ref.merchantDecision,
      merchantDecision = _ref$merchantDecision === void 0 ? MerchantDecision.DEFAULT : _ref$merchantDecision,
      _ref$tap = _ref.tap,
      tap = _ref$tap === void 0 ? Tap.DEFAULT : _ref$tap;
  var payload = Request().add(HexTLV('9F02', "".concat(amount))).add(HexTLV('9FA031', (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = (0, _concat["default"])(_context4 = (0, _concat["default"])(_context5 = (0, _concat["default"])(_context6 = "01".concat(tap)).call(_context6, merchantDecision, "2D2D")).call(_context5, showAmount, "2D")).call(_context4, fallback)).call(_context3, quickChip)).call(_context2, technology, "2D"))).add(HexTLV('9FA032', '4F5F2A829A9C9F029F039F069F079F099F1A9F1E9F53')) // The request content of F30 needs to be a base64 encoded string of the hex array
  .getPayloadBytes(toBase64); // The base64 encoded payload string is then added as an AN element to the request

  return Request.apply(void 0, (0, _toConsumableArray2["default"])(startEMVTransactionCommandRequisite)).add(AlphaNumeric(payload));
};

var takeEMVPayment = {
  command: 'F30',
  request: F30Helper,
  isResponseExpected: true,
  commandInResponse: 'F30'
};
exports.takeEMVPayment = takeEMVPayment;
var Tag = responseTagValueMap();
var tagNameValueMap = responseTagMap().add(Tag('57').to('track2EquivalentData').Value.format(Format.Hex)).add(Tag('5A').to('pan').Value.format(Format.Hex)).add(Tag('9F27').to('CID').Value.format(Format.Hex)).add(Tag('9F39').to('entryMode').Value.format(Format.Hex)).add(Tag('5F20').to('cardholderName').Value.format(Format.AlphaNumeric)).add(Tag('9F34').to('cvm').Value.format(Format.Hex)).add(Tag('9FA006').to('cvm').Value.format(Format.Hex)).add(Tag('9FA060').to('track1').Value.format(Format.Hex)).add(Tag('9FA061').to('track2').Value.format(Format.Hex)).add(Tag('9FA062').to('track3').Value.format(Format.Hex)).add(Tag('9FA031').to('otherFlags').Value.format(Format.Hex)).add(Tag('9FA03B').to('encryptionType').Value.format(Format.AlphaNumeric)).add(Tag('9FA03A').to('encryptionResult').Value.format(Format.Hex)).add(Tag('9FA03D').to('encryptedBlob1').Value.format(Format.Hex)).build();
var parserConfig = ParserConfig().responseType(Type().TLVList.extractWith(fromBase64).mapWith(tagNameValueMap).build()).responseCodeLength(2);

var parser = function parser(accParsedResponse, rawResponse) {
  return _objectSpread(_objectSpread({}, parse(parserConfig.mergeStrategy(mergePayloadAsObject(accParsedResponse)).build(), rawResponse)), {}, {
    continuationRequest: undefined,
    isFinished: true,
    isResponseExpected: false
  });
};

exports.parser = parser;
},{"../TLVs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/index.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/pad-start":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-start.js","@babel/runtime-corejs3/core-js-stable/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","core-js/modules/es.date.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/index.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

_Object$defineProperty(exports, "CancelCommandEnums", {
  enumerable: true,
  get: function get() {
    return _cancelCommands.CancelCommandEnums;
  }
});

_Object$defineProperty(exports, "CompleteTransactionEnums", {
  enumerable: true,
  get: function get() {
    return _completeTransactionCommands.CompleteTransactionEnums;
  }
});

_Object$defineProperty(exports, "F30Parser", {
  enumerable: true,
  get: function get() {
    return _emvTransactionCommands.parser;
  }
});

_Object$defineProperty(exports, "F34Parser", {
  enumerable: true,
  get: function get() {
    return _completeTransactionCommands.parser;
  }
});

_Object$defineProperty(exports, "I02Parser", {
  enumerable: true,
  get: function get() {
    return _cardRemoveCommands.parser;
  }
});

_Object$defineProperty(exports, "I05Parser", {
  enumerable: true,
  get: function get() {
    return _cardPresentCommands.parser;
  }
});

_Object$defineProperty(exports, "S00Parser", {
  enumerable: true,
  get: function get() {
    return _cancelCommands.parser;
  }
});

_Object$defineProperty(exports, "S22Parser", {
  enumerable: true,
  get: function get() {
    return _signatureCommands.parser;
  }
});

_Object$defineProperty(exports, "S95Parser", {
  enumerable: true,
  get: function get() {
    return _serialNumberCommands.parser;
  }
});

_Object$defineProperty(exports, "StartTransactionEnums", {
  enumerable: true,
  get: function get() {
    return _emvTransactionCommands.StartTransactionEnums;
  }
});

_Object$defineProperty(exports, "cancel", {
  enumerable: true,
  get: function get() {
    return _cancelCommands.cancel;
  }
});

_Object$defineProperty(exports, "clearScreen", {
  enumerable: true,
  get: function get() {
    return _cancelCommands.clearScreen;
  }
});

_Object$defineProperty(exports, "coldCancel", {
  enumerable: true,
  get: function get() {
    return _cancelCommands.coldCancel;
  }
});

_Object$defineProperty(exports, "completeEMVPayment", {
  enumerable: true,
  get: function get() {
    return _completeTransactionCommands.completeEMVPayment;
  }
});

_Object$defineProperty(exports, "continueSignature", {
  enumerable: true,
  get: function get() {
    return _signatureCommands.continueSignature;
  }
});

_Object$defineProperty(exports, "displayMessage", {
  enumerable: true,
  get: function get() {
    return _displayMessageCommands.displayMessage;
  }
});

_Object$defineProperty(exports, "getSerialNumber", {
  enumerable: true,
  get: function get() {
    return _serialNumberCommands.getSerialNumber;
  }
});

_Object$defineProperty(exports, "isCardPresent", {
  enumerable: true,
  get: function get() {
    return _cardPresentCommands.isCardPresent;
  }
});

_Object$defineProperty(exports, "removeCard", {
  enumerable: true,
  get: function get() {
    return _cardRemoveCommands.removeCard;
  }
});

_Object$defineProperty(exports, "startSignature", {
  enumerable: true,
  get: function get() {
    return _signatureCommands.startSignature;
  }
});

_Object$defineProperty(exports, "takeEMVPayment", {
  enumerable: true,
  get: function get() {
    return _emvTransactionCommands.takeEMVPayment;
  }
});

var _cancelCommands = require("./cancelCommands");

var _displayMessageCommands = require("./displayMessageCommands");

var _emvTransactionCommands = require("./emvTransactionCommands");

var _completeTransactionCommands = require("./completeTransactionCommands");

var _cardRemoveCommands = require("./cardRemoveCommands");

var _cardPresentCommands = require("./cardPresentCommands");

var _serialNumberCommands = require("./serialNumberCommands");

var _signatureCommands = require("./signatureCommands");
},{"./cancelCommands":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/cancelCommands.js","./cardPresentCommands":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/cardPresentCommands.js","./cardRemoveCommands":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/cardRemoveCommands.js","./completeTransactionCommands":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/completeTransactionCommands.js","./displayMessageCommands":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/displayMessageCommands.js","./emvTransactionCommands":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/emvTransactionCommands.js","./serialNumberCommands":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/serialNumberCommands.js","./signatureCommands":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/signatureCommands.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/serialNumberCommands.js":[function(require,module,exports){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.parser = exports.getSerialNumber = void 0;

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _TLVs = require("../TLVs");

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context; _forEachInstanceProperty(_context = ownKeys(Object(source), true)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context2; _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }

var parse = _TLVs.ResponseParser.parse,
    ParserConfig = _TLVs.ResponseParser.ParserConfig,
    Type = _TLVs.ResponseParser.Type,
    mergePayloadAsObject = _TLVs.ResponseParser.mergePayloadAsObject;
var Numeric = _TLVs.RequestBuilder.Numeric,
    Request = _TLVs.RequestBuilder.Request;
var FileSeparator = _TLVs.RequestConstants.FileSeparator,
    MagStripeAndDisplayCommandID = _TLVs.RequestConstants.MagStripeAndDisplayCommandID;
var serialNumberRequisite = Request(MagStripeAndDisplayCommandID, Numeric(2, 95));

var S95Helper = function S95Helper() {
  return Request.apply(void 0, (0, _toConsumableArray2["default"])(serialNumberRequisite)).add(FileSeparator).add(Numeric(2, 10));
};

var getSerialNumber = {
  command: 'S95',
  request: S95Helper,
  isResponseExpected: true,
  commandInResponse: 'S95'
};
exports.getSerialNumber = getSerialNumber;
var extendedCodeNameMap = {
  11: 'terminalName',
  12: 'cxpiPackageVersion',
  13: 'camVersion',
  14: 'emvKernelVersion',
  15: 'unformattedSerialNumber',
  16: 'osVersion',
  17: 'ctlsVersion',
  18: 'formattedSerialNumber'
};

var fsListValueFn = function fsListValueFn(value) {
  var _ref = [(0, _slice["default"])(value).call(value, 0, 2), (0, _slice["default"])(value).call(value, 2)],
      extendedCode = _ref[0],
      responseData = _ref[1];
  return (0, _defineProperty2["default"])({}, extendedCodeNameMap[extendedCode], responseData);
};

var parserConfig = ParserConfig().responseType(Type().FSList.extractWith(function (value) {
  return value === null || value === void 0 ? void 0 : (0, _slice["default"])(value).call(value, 1);
}).mapWith(fsListValueFn).build()).responseCodeLength(2);

var parser = function parser(accParsedResponse, rawResponse) {
  return _objectSpread(_objectSpread({}, parse(parserConfig.mergeStrategy(mergePayloadAsObject(accParsedResponse)).build(), rawResponse)), {}, {
    continuationRequest: undefined,
    isFinished: true,
    isResponseExpected: false
  });
};

exports.parser = parser;
},{"../TLVs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/index.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/signatureCommands.js":[function(require,module,exports){
"use strict";

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.startSignature = exports.parser = exports.continueSignature = void 0;

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

require("core-js/modules/es.date.to-string.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.regexp.to-string.js");

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _TLVs = require("../TLVs");

var _excluded = ["payload", "responseCode"];

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context; _forEachInstanceProperty(_context = ownKeys(Object(source), true)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context2; _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }

var parse = _TLVs.ResponseParser.parse,
    ParserConfig = _TLVs.ResponseParser.ParserConfig,
    Type = _TLVs.ResponseParser.Type,
    mergePayloadAsString = _TLVs.ResponseParser.mergePayloadAsString;
var Request = _TLVs.RequestBuilder.Request,
    AlphaNumeric = _TLVs.RequestBuilder.AlphaNumeric,
    Numeric = _TLVs.RequestBuilder.Numeric;
var signatureCommand = 'S22';
var Signature = {
  start: '0',
  "continue": '1'
};
var signatureCommandRequisite = Request(_TLVs.RequestConstants.MagStripeAndDisplayCommandID, Numeric(2, 22));

var S22Helper = function S22Helper(_ref) {
  var signFlag = _ref.signFlag;
  return Request.apply(void 0, (0, _toConsumableArray2["default"])(signatureCommandRequisite)).add(_TLVs.RequestConstants.FileSeparator).add(AlphaNumeric(signFlag));
};

var startSignature = {
  command: signatureCommand,
  request: function request() {
    return S22Helper({
      signFlag: Signature.start
    });
  },
  isFinished: false,
  isResponseExpected: true,
  commandInResponse: signatureCommand
};
exports.startSignature = startSignature;
var continueSignature = {
  command: signatureCommand,
  request: function request() {
    return S22Helper({
      signFlag: Signature["continue"]
    });
  },
  isFinished: false,
  isResponseExpected: true,
  commandInResponse: signatureCommand
};
exports.continueSignature = continueSignature;
var parserConfig = ParserConfig().responseType(Type().Hex.extractWith(function (value) {
  return value === null || value === void 0 ? void 0 : (0, _slice["default"])(value).call(value, 2).toString('hex');
}).build()).responseCodeLength(2);

var parser = function parser(accParsedResponse, rawResponse) {
  var _parse = parse(parserConfig.mergeStrategy(mergePayloadAsString(accParsedResponse)).build(), rawResponse),
      payload = _parse.payload,
      responseCode = _parse.responseCode,
      keyValues = (0, _objectWithoutProperties2["default"])(_parse, _excluded);

  return _objectSpread(_objectSpread({}, keyValues), {}, {
    payload: payload,
    responseCode: responseCode,
    isResponseExpected: false,
    isFinished: responseCode !== '04',
    continuationRequest: responseCode === '04' ? {
      action: 'continueSignature'
    } : undefined
  });
};

exports.parser = parser;
},{"../TLVs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/index.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/objectWithoutProperties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/objectWithoutProperties.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","core-js/modules/es.date.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.regexp.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/heap.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.Min = exports.Max = void 0;
exports["default"] = Heap;

var _splice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/splice"));

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var Min = function Min(parent) {
  return function (child) {
    return parent < child;
  };
};

exports.Min = Min;

var Max = function Max(parent) {
  return function (child) {
    return parent > child;
  };
};

exports.Max = Max;

function Heap() {
  var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Min;
  var lens = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (value) {
    return value;
  };
  var compare = type;

  var nodeLens = function nodeLens(node) {
    return lens(node.value);
  };

  function Node(index, value) {
    return {
      value: value,
      index: index
    };
  }

  function subHeap(node) {
    var _index = 2 * node.index;

    return _index !== 0 ? [_index, _index + 1] : undefined;
  }

  function parentHeap(node) {
    var _index = Math.floor(node.index / 2);

    return _index !== 0 ? _index : undefined;
  }

  function swap(heap, _ref, _ref2) {
    var v1 = _ref.value,
        i1 = _ref.index;
    var v2 = _ref2.value,
        i2 = _ref2.index;
    heap[i1] = Node(i1, v2);
    heap[i2] = Node(i2, v1);
  }

  function heapifyUp(heap, i) {
    var currentNode = heap[i || heap.length - 1];
    var parentNode = heap[parentHeap(currentNode)];

    if (parentNode && compare(nodeLens(currentNode))(nodeLens(parentNode))) {
      swap(heap, currentNode, parentNode);
      return heapifyUp(heap, currentNode.index);
    }

    return heap;
  }

  var _compare = function _compare(node2) {
    return function (node1) {
      return node2 && !compare(nodeLens(node1))(nodeLens(node2)) ? node2 : node1;
    };
  };

  function heapifyDown(heap, i) {
    var currentNode = heap[i];

    var _subHeap = subHeap(currentNode),
        _subHeap2 = (0, _slicedToArray2["default"])(_subHeap, 2),
        leftHeap = _subHeap2[0],
        rightHeap = _subHeap2[1];

    var leftHeapNode = heap[leftHeap];
    var rightHeapNode = heap[rightHeap];

    var largest = _compare(rightHeapNode)(_compare(leftHeapNode)(currentNode));

    if (largest.index !== currentNode.index) {
      swap(heap, currentNode, largest);
      return heapifyDown(heap, largest.index);
    }

    return heap;
  }

  function _pop(heap) {
    // Copy the popped item to the beginning of the heap
    heap[0] = Node(0, heap[1].value);
    swap(heap, heap[1], heap[heap.length - 1]);
    (0, _splice["default"])(heap).call(heap, -1, 1); // Return the heap after downwards heapify

    return heap.length > 1 ? heapifyDown(heap, 1) : heap;
  }

  var _heapFunctions = {
    isEmpty: function isEmpty() {
      var heap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [Node(0, {})];
      return heap.length <= 1;
    },
    init: function init() {
      return [Node(0, {})];
    },
    push: function push(value) {
      var _context;

      var heap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [Node(0, {})];
      return heapifyUp((0, _concat["default"])(_context = []).call(_context, (0, _toConsumableArray2["default"])(heap), [Node(heap.length, value)]));
    },
    pop: function pop() {
      var heap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [Node(0, {})];
      return heap.length <= 1 ? [Node(0, {})] : _pop((0, _toConsumableArray2["default"])(heap));
    },
    popTill: function popTill(value) {
      var heap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [Node(0, {})];
      return !_heapFunctions.peek(heap) || _heapFunctions.peek(heap).value === {} || compare(lens(value))(nodeLens(_heapFunctions.peek(heap))) ? heap : _heapFunctions.popTill(value, _heapFunctions.pop(heap));
    },
    popUntil: function popUntil(value) {
      var heap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [Node(0, {})];
      return !_heapFunctions.peek(heap) || _heapFunctions.peek(heap).value === {} || lens(value) === nodeLens(_heapFunctions.peek(heap)) || compare(lens(value))(nodeLens(_heapFunctions.peek(heap))) ? heap : _heapFunctions.popUntil(value, _heapFunctions.pop(heap));
    },
    peek: function peek() {
      var heap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [Node(0, {})];
      return heap[1];
    }
  };
  return _heapFunctions;
}
},{"@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/index.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

_Object$defineProperty(exports, "CancelCommandEnums", {
  enumerable: true,
  get: function get() {
    return _commands.CancelCommandEnums;
  }
});

_Object$defineProperty(exports, "CompleteTransactionEnums", {
  enumerable: true,
  get: function get() {
    return _commands.CompleteTransactionEnums;
  }
});

_Object$defineProperty(exports, "MessageType", {
  enumerable: true,
  get: function get() {
    return _response.MessageType;
  }
});

_Object$defineProperty(exports, "ReaderAction", {
  enumerable: true,
  get: function get() {
    return _obs.ReaderAction;
  }
});

_Object$defineProperty(exports, "StartTransactionEnums", {
  enumerable: true,
  get: function get() {
    return _commands.StartTransactionEnums;
  }
});

_Object$defineProperty(exports, "api", {
  enumerable: true,
  get: function get() {
    return _publicFs["default"];
  }
});

var _obs = require("./obs");

var _publicFs = _interopRequireDefault(require("./publicFs"));

var _commands = require("./commands");

var _response = require("./response");
},{"./commands":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/index.js","./obs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/obs.js","./publicFs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/publicFs.js","./response":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/response.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/obs.js":[function(require,module,exports){
"use strict";

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.promise.js");

var _typeof = require("@babel/runtime-corejs3/helpers/typeof");

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _mapInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/map");

var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");

var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");

var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");

var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");

var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");

var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.commandResponseSubject = exports.commandRequestSubject = exports.ReaderAction = void 0;
exports.getData$ = getData$;

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _toArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toArray"));

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _isEmpty = _interopRequireDefault(require("ramda/src/isEmpty"));

var _rxjs = require("rxjs");

var _operators = require("rxjs/operators");

var _order = _interopRequireDefault(require("./order"));

var _heap = _interopRequireWildcard(require("./heap"));

var _TLVs = require("./TLVs");

var _response = require("./response");

var _commands = require("./commands");

var _excluded = ["continuationRequest"],
    _excluded2 = ["isResponseExpected"];

function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context; _forEachInstanceProperty(_context = ownKeys(Object(source), true)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context2; _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }

// Important: This file uses global.log variable.
var addStringifiedSelf = _TLVs.conversionFunctions.addStringifiedSelf,
    toBase64 = _TLVs.conversionFunctions.toBase64;
var ACK = toBase64([0x06]);
var ReaderAction = {
  WRITE: 'write',
  READ: 'read',
  RELAX: 'relax',
  IGNORE: 'ignore'
};
exports.ReaderAction = ReaderAction;
var requestActionMap = {
  cancel: _commands.cancel,
  clearScreen: _commands.clearScreen,
  coldCancel: _commands.coldCancel,
  completeEMVPayment: _commands.completeEMVPayment,
  continueSignature: _commands.continueSignature,
  displayMessage: _commands.displayMessage,
  getSerialNumber: _commands.getSerialNumber,
  isCardPresent: _commands.isCardPresent,
  removeCard: _commands.removeCard,
  startSignature: _commands.startSignature,
  takeEMVPayment: _commands.takeEMVPayment
};
var writeACK = {
  request: ACK,
  messageType: _response.MessageType.PASS_THROUGH,
  readerAction: ReaderAction.WRITE
};
var read = {
  messageType: _response.MessageType.PASS_THROUGH,
  readerAction: ReaderAction.READ
};
var relax = {
  messageType: _response.MessageType.PASS_THROUGH,
  readerAction: ReaderAction.RELAX
};

var commandRequestSubject = function commandRequestSubject() {
  return new _rxjs.ReplaySubject(5);
};

exports.commandRequestSubject = commandRequestSubject;

var commandResponseSubject = function commandResponseSubject() {
  return new _rxjs.ReplaySubject(5);
};

exports.commandResponseSubject = commandResponseSubject;

function logger(log) {
  return {
    LogD: function LogD(message) {
      return function (val) {
        return log.debug(message, function () {
          return {
            val: val
          };
        });
      };
    },
    LogI: function LogI(message) {
      return function (val) {
        return log.info(message, {
          val: val
        });
      };
    }
  };
}

function countFrom() {
  var starting = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  var _starting = starting;
  return function () {
    _starting += 1;
    return _starting;
  };
}

function startWithValue(observable$, startValue) {
  return (0, _rxjs.scheduled)([(0, _rxjs.of)(startValue), observable$], _rxjs.asapScheduler).pipe((0, _operators.concatAll)());
}

function getData$(_commandRequest$, _commandResponse$, log) {
  var _logger = logger(log),
      LogD = _logger.LogD,
      LogI = _logger.LogI;

  var isRequestCancel = function isRequestCancel(_ref) {
    var action = _ref.action;
    return action === 'cancel';
  };

  var isRequestColdCancel = function isRequestColdCancel(_ref2) {
    var action = _ref2.action;
    return action === 'coldCancel';
  };

  var isCancel = function isCancel(request) {
    return isRequestCancel(request) || isRequestColdCancel(request);
  };

  var isResponseRelax = function isResponseRelax(_ref3) {
    var readerAction = _ref3.readerAction;
    return readerAction === ReaderAction.RELAX;
  };

  var disposeRequest = function disposeRequest(request) {
    return _objectSpread(_objectSpread({}, request), {}, {
      readerAction: ReaderAction.IGNORE,
      isFinished: true,
      isResponseExpected: false
    });
  };

  var MinHeap = (0, _heap["default"])(_heap.Min, function (_ref4) {
    var id = _ref4.id;
    return id;
  });
  /*
   * If a cancel command is received then remove all the commands which came before it including the cancel command.
   * Otherwise, push the new request to the queue.
   */

  function getRequest(heap, request) {
    return isCancel(request) ? MinHeap.popTill(request, MinHeap.push(request, heap)) : MinHeap.push(request, heap);
  }

  var requestCounter = countFrom(0);
  var responseCounter = countFrom(0);
  var orderCounter = countFrom(0); // Observable which emits when a relax message goes to the reader

  var proxyRelaxSubject = new _rxjs.BehaviorSubject({
    id: 0,
    readerAction: ReaderAction.RELAX
  });
  var proxyRelax$ = proxyRelaxSubject.asObservable().pipe((0, _filterInstanceProperty(_operators))(isResponseRelax), (0, _operators.tap)(LogD('Relax Response')), (0, _operators.publishReplay)(1), (0, _operators.refCount)()); // A proxy for the continuation requests

  var proxyBuiltRequestSubject = new _rxjs.ReplaySubject(5);
  var proxyBuiltRequest$ = proxyBuiltRequestSubject.asObservable().pipe((0, _filterInstanceProperty(_operators))(function (_ref5) {
    var continuationRequest = _ref5.continuationRequest;
    return !!continuationRequest;
  }), (0, _mapInstanceProperty(_operators))(function (_ref6) {
    var action = _ref6.continuationRequest.action,
        keyValues = (0, _objectWithoutProperties2["default"])(_ref6, _excluded);
    return _objectSpread(_objectSpread({}, keyValues), {}, {
      action: action
    });
  })); // Observable to generate the request bytes for an action

  var builtRequest$ = (0, _rxjs.scheduled)([_commandRequest$, proxyBuiltRequest$], _rxjs.asapScheduler).pipe((0, _operators.mergeAll)(), (0, _mapInstanceProperty(_operators))(function (_ref7) {
    var action = _ref7.action,
        _ref7$argumentObject = _ref7.argumentObject,
        argumentObject = _ref7$argumentObject === void 0 ? {} : _ref7$argumentObject,
        requestId = _ref7.requestId;
    return {
      action: action,
      argumentObject: argumentObject,
      id: requestId ? requestId + 0.1 : requestCounter(),
      isResponseExpected: requestActionMap[action].isResponseExpected,
      messageType: _response.MessageType.BUILT_REQUEST,
      readerAction: ReaderAction.WRITE,
      request: requestActionMap[action].request(argumentObject).getRequestBytes(toBase64),
      commandInResponse: requestActionMap[action].commandInResponse,
      timeoutRead: requestActionMap[action].timeoutRead
    };
  }), (0, _operators.delayWhen)(function () {
    return (0, _rxjs.of)(true);
  }, proxyRelax$), (0, _operators.publishReplay)(5), (0, _operators.refCount)());

  var _partition = (0, _rxjs.partition)(builtRequest$, isCancel),
      _partition2 = (0, _slicedToArray2["default"])(_partition, 2),
      cancelRequest$ = _partition2[0],
      nonCancelRequest$ = _partition2[1];

  var cancelRequestShared$ = cancelRequest$.pipe((0, _operators.share)());
  var disposableCancel$ = cancelRequestShared$.pipe((0, _operators.bufferCount)(2, 1), (0, _filterInstanceProperty(_operators))(function (_ref8) {
    var _ref9 = (0, _slicedToArray2["default"])(_ref8, 2),
        first = _ref9[0],
        second = _ref9[1];

    return first.id + 1 === second.id;
  }), (0, _mapInstanceProperty(_operators))(function (_ref10) {
    var _ref11 = (0, _slicedToArray2["default"])(_ref10, 2),
        second = _ref11[1];

    return disposeRequest(second);
  }), (0, _operators.share)());
  var actionableCancel$ = cancelRequestShared$.pipe((0, _operators.startWith)({
    id: -1
  }), (0, _operators.bufferCount)(2, 1), (0, _filterInstanceProperty(_operators))(function (_ref12) {
    var _ref13 = (0, _slicedToArray2["default"])(_ref12, 2),
        first = _ref13[0],
        second = _ref13[1];

    return first.id + 1 !== second.id;
  }), (0, _mapInstanceProperty(_operators))(function (_ref14) {
    var _ref15 = (0, _slicedToArray2["default"])(_ref14, 2),
        second = _ref15[1];

    return second;
  }), (0, _operators.share)());

  var _partition3 = (0, _rxjs.partition)(_commandResponse$.pipe((0, _mapInstanceProperty(_operators))(function (response) {
    return {
      id: responseCounter(),
      response: response,
      responseType: (0, _response.getResponseType)(response)
    };
  })), function (_ref16) {
    var responseType = _ref16.responseType;
    return responseType === _response.ResponseType.MESSAGE;
  }),
      _partition4 = (0, _slicedToArray2["default"])(_partition3, 2),
      messageResponse$ = _partition4[0],
      handshakeResponse$ = _partition4[1];

  var actionableRequest$ = (0, _rxjs.scheduled)([actionableCancel$, nonCancelRequest$], _rxjs.asapScheduler).pipe((0, _operators.mergeAll)(), (0, _order["default"])('id', function (value1, value2) {
    var diff = value2.id - value1.id;
    /*
     * In case of multiple back to back cancels, only the first cancel is actionable. The rest are ignored and won't
     * come here via the actionableCancel$ observable. Let's say that there were 3 cancel requests with requestIds 24,
     * 25 and 26. ActionableCancel$ will emit 24 only. Let's now say that a normal non cancel request was sent with
     * requestId 27. The difference in the requestIds is now 3 (27 - 24). The 'order' operator emits events after
     * making sure that the all the event ids are spaced out with 1. In this scenario it needs to be made sure that
     * the difference of 3 is represented as 1.
     */

    if (isCancel(value1) && !isCancel(value2) && diff > 0) {
      return 1;
    } // Continuation requests' requestIds differ by 0.1 only. It needs to be boosted to 1.


    return diff > 0 ? Math.ceil(diff) : Math.floor(diff);
  }));
  var proxyParsedMessageSubject = new _rxjs.ReplaySubject(5);
  var proxyParsedMessage$ = startWithValue(proxyParsedMessageSubject.asObservable(), {
    isResponseExpected: false
  }); // A Proxy for the Timed Command Request observable, for the response generator observables to know the
  // active request.

  var proxyTimedCommandRequestSubject = new _rxjs.ReplaySubject(5);
  var proxyTimedCommandRequest$ = proxyTimedCommandRequestSubject.asObservable().pipe((0, _filterInstanceProperty(_operators))(function (_ref17) {
    var messageType = _ref17.messageType;
    return messageType === _response.MessageType.BUILT_REQUEST;
  })); // Observable to generate the handshake responses

  var parsedHandshakeResponse$ = (0, _rxjs.zip)(proxyTimedCommandRequest$, handshakeResponse$).pipe((0, _operators.tap)(LogD('Request and handshakeResponse')), (0, _operators.withLatestFrom)(proxyParsedMessage$), (0, _operators.scan)(function (_ref18, _ref19) {
    var actionPrevious = _ref18.action,
        irePrevious = _ref18.isResponseExpected,
        idPrevious = _ref18.requestId;

    var _ref20 = (0, _slicedToArray2["default"])(_ref19, 2),
        _ref20$ = (0, _slicedToArray2["default"])(_ref20[0], 2),
        _ref20$$ = _ref20$[0],
        action = _ref20$$.action,
        argumentObject = _ref20$$.argumentObject,
        ire1 = _ref20$$.isResponseExpected,
        requestId = _ref20$$.id,
        timeoutRead = _ref20$$.timeoutRead,
        id = _ref20$[1].id,
        _ref20$2 = _ref20[1],
        action2 = _ref20$2.action,
        ire2 = _ref20$2.isResponseExpected,
        id2 = _ref20$2.requestId;

    return _objectSpread(_objectSpread({
      action: action,
      argumentObject: argumentObject,
      id: id,
      isResponseExpected: ire1,
      // If the request is cancel then the callback associated with the request can be invoked
      // If the request isn't cancel then the associated callback can be invoked if no further response is expected
      // If the request isn't cancel then the associated callback can not be invoked if a response is expected
      isFinished: isRequestCancel({
        action: action
      }) || !ire1
    }, isRequestCancel({
      action: action
    }) && (actionPrevious === 'removeCard' && relax || (actionPrevious + idPrevious === action2 + id2 ? ire2 : irePrevious && read)) || (ire1 ? read : relax)), {}, {
      requestId: requestId,
      timeoutRead: timeoutRead
    });
  }, {
    isResponseExpected: false
  }), (0, _operators.tap)(LogD('Parsed Handshake Response')), (0, _operators.share)()); // Observable to parse the command responses

  var parsedMessageResponse$ = (0, _rxjs.combineLatest)([proxyTimedCommandRequest$.pipe((0, _filterInstanceProperty(_operators))(function (_ref21) {
    var isResponseExpected = _ref21.isResponseExpected;
    return isResponseExpected;
  })), messageResponse$]).pipe((0, _operators.distinctUntilChanged)(function (_ref22, _ref23) {
    var _ref24 = (0, _slicedToArray2["default"])(_ref22, 2),
        prevResp = _ref24[1];

    var _ref25 = (0, _slicedToArray2["default"])(_ref23, 2),
        currResp = _ref25[1];

    return prevResp.id === currResp.id;
  }), (0, _operators.tap)(LogD('Request and RawResponse')), // If the command for the current request matches the command present in the response then parse the response,
  // otherwise ignore it and return an empty object.
  (0, _operators.scan)(function (accResponse, _ref26) {
    var _ref27 = (0, _slicedToArray2["default"])(_ref26, 2),
        _ref27$ = _ref27[0],
        action = _ref27$.action,
        argumentObject = _ref27$.argumentObject,
        requestId = _ref27$.id,
        commandInResponse = _ref27$.commandInResponse,
        _ref27$2 = _ref27[1],
        response = _ref27$2.response,
        id = _ref27$2.id;

    var responseKVs = {
      action: action,
      argumentObject: argumentObject,
      id: id,
      requestId: requestId,
      messageType: _response.MessageType.PARSED_RESPONSE
    };

    if (action === 'coldCancel') {
      return _objectSpread(_objectSpread({}, responseKVs), {}, {
        isResponseExpected: false
      });
    }

    var commandAndResponse = (0, _response.parseCommand)(commandInResponse, response);

    if (requestActionMap[action].command === commandAndResponse.command) {
      return _objectSpread(_objectSpread({}, responseKVs), (0, _response.parse)(accResponse.command === commandAndResponse.command ? accResponse : {}, commandAndResponse));
    }

    if (commandAndResponse.command === '99E') {
      return _objectSpread(_objectSpread({}, responseKVs), {}, {
        continuationRequest: undefined,
        isFinished: true,
        isResponseExpected: false
      });
    }

    return {};
  }, {}), // If no further response is expected then declare the request as finished
  (0, _mapInstanceProperty(_operators))(function (_ref28) {
    var isResponseExpected = _ref28.isResponseExpected,
        keyValues = (0, _objectWithoutProperties2["default"])(_ref28, _excluded2);
    return _objectSpread(_objectSpread({}, keyValues), {}, {
      isResponseExpected: isResponseExpected,
      readerAction: isResponseExpected ? ReaderAction.READ : ReaderAction.RELAX
    });
  }), (0, _operators.share)());
  parsedMessageResponse$.subscribe(proxyParsedMessageSubject);
  parsedMessageResponse$.subscribe(proxyBuiltRequestSubject); // For every response that was sent by the reader the app needs to send an ack back.

  var ackAndParsedMessageResponse$ = parsedMessageResponse$.pipe((0, _operators.tap)(LogD('Parsed Message Response')), (0, _operators.concatMap)(function (parsedResponse) {
    return (0, _rxjs.from)([writeACK, parsedResponse]);
  })); // Observable to emit parsed Handshake responses, parsed Command Responses.

  var responses$ = (0, _rxjs.scheduled)([parsedHandshakeResponse$, ackAndParsedMessageResponse$], _rxjs.asapScheduler).pipe((0, _operators.mergeAll)(), (0, _operators.share)());
  var normalRequest$ = (0, _rxjs.combineLatest)([proxyRelax$, actionableRequest$]).pipe((0, _operators.tap)(LogD('builtRequest')), (0, _operators.distinctUntilChanged)(function (_ref29, _ref30) {
    var _ref31 = (0, _slicedToArray2["default"])(_ref29, 2),
        prevResp = _ref31[0],
        prevReq = _ref31[1];

    var _ref32 = (0, _slicedToArray2["default"])(_ref30, 2),
        currResp = _ref32[0],
        currReq = _ref32[1];

    return currReq.id === prevReq.id && currResp.id === prevResp.id;
  }),
  /*
   * On receiving a new relax response, pop a command from the queue.
   * On receiving a new request, push it to the queue.
   *
   * resId is the requestId for which the last response was received
   * reqId is the requestId which was last added to the queue
   */
  (0, _operators.scan)(function (_ref33, _ref34) {
    var heap = _ref33.heap,
        resId = _ref33.resId,
        reqId = _ref33.reqId;

    var _ref35 = (0, _slicedToArray2["default"])(_ref34, 2),
        response = _ref35[0],
        request = _ref35[1];

    // Case 1: When both are new, it doesn't matter whether the queue is empty or not.
    if (response.requestId !== resId && request.id !== reqId) {
      return {
        heap: MinHeap.pop(getRequest(heap, request)),
        resId: response.requestId,
        reqId: request.id
      };
    } // case 2: When request is new, it doesn't matter whether the queue is empty or not.


    if (response.requestId === resId && request.id !== reqId) {
      return {
        heap: getRequest(heap, request),
        resId: resId,
        reqId: request.id
      };
    } // case 3: When response is new, queue is empty do not store the response Id. Case 1 will be used when a new req comes in.


    if (response.requestId !== resId && request.id === reqId && MinHeap.isEmpty(heap)) {
      return {
        heap: MinHeap.pop(heap),
        resId: resId,
        reqId: reqId
      };
    } // Case 4: When response is new and queue is not empty


    if (response.requestId !== resId && request.id === reqId && (!heap[0].value.id || heap[0].value.id === response.requestId)) {
      return {
        heap: MinHeap.pop(heap),
        resId: response.requestId,
        reqId: reqId
      };
    }

    if (response.requestId !== resId && request.id === reqId && isCancel(heap[0].value) && heap[0].value.id !== response.requestId) {
      return {
        heap: heap,
        resId: response.requestId,
        reqId: reqId
      };
    }

    log.info('Unhandled case', {
      heap: heap,
      resId: resId,
      reqId: reqId,
      response: response,
      request: request
    });
    return {
      heap: heap,
      resId: resId,
      reqId: reqId
    }; // combineLatest won't emit if response and request do not change.
  }, {
    heap: MinHeap.init(),
    resId: 0,
    reqId: 0
  }), (0, _mapInstanceProperty(_operators))(function (_ref36) {
    var heap = _ref36.heap;
    return heap[0].value;
  }), (0, _operators.distinctUntilKeyChanged)('id'), (0, _operators.tap)(LogD('Normal Request awaiting a relax message')), (0, _operators.delayWhen)(function () {
    return proxyRelax$;
  }), (0, _filterInstanceProperty(_operators))(function (value) {
    return !(0, _isEmpty["default"])(value) && !isCancel(value);
  }), (0, _operators.tap)(LogD('Normal Request')), (0, _operators.share)());
  var timedActionableCancel$ = (0, _rxjs.combineLatest)([actionableCancel$.pipe((0, _operators.skip)(1)), proxyTimedCommandRequest$, parsedHandshakeResponse$, proxyRelax$]).pipe((0, _operators.scan)(function (_ref37, _ref38) {
    var cancels = _ref37.cancels,
        activeCancel = _ref37.activeCancel;

    var _ref39 = (0, _slicedToArray2["default"])(_ref38, 4),
        cancelReq = _ref39[0],
        sentReq = _ref39[1],
        ackedReq = _ref39[2],
        finishedReq = _ref39[3];

    if (cancels.length === 0 || cancels[cancels.length - 1].id !== cancelReq.id) {
      cancels.push(cancelReq);
    }

    if (isCancel(sentReq) && ackedReq.requestId === finishedReq.requestId || !isCancel(sentReq) && ackedReq.requestId === sentReq.id) {
      var _cancels2 = (0, _toArray2["default"])(cancels),
          _activeCancel = _cancels2[0],
          _cancels = (0, _slice["default"])(_cancels2).call(_cancels2, 1);

      return {
        cancels: _cancels,
        activeCancel: _activeCancel
      };
    }

    return {
      cancels: cancels,
      activeCancel: activeCancel
    };
  }, {
    cancels: [],
    activeCancel: undefined
  }), (0, _mapInstanceProperty(_operators))(function (_ref40) {
    var activeCancel = _ref40.activeCancel;
    return activeCancel;
  }), (0, _filterInstanceProperty(_operators))(function (activeCancel) {
    return !!activeCancel;
  }), (0, _operators.distinctUntilChanged)('id')); // The output of normalRequest$ should follow the relaxResponses$

  var requests$ = (0, _rxjs.scheduled)([actionableCancel$.pipe((0, _operators.take)(1)), timedActionableCancel$, normalRequest$], _rxjs.asapScheduler).pipe((0, _operators.mergeAll)(), (0, _operators.concatMap)(function (builtRequest) {
    return (0, _rxjs.from)([builtRequest, read]);
  }), (0, _operators.share)());
  var retVal$ = (0, _rxjs.scheduled)([responses$, requests$, disposableCancel$], _rxjs.asapScheduler).pipe((0, _operators.mergeAll)(), (0, _mapInstanceProperty(_operators))(addStringifiedSelf),
  /*
   * This observable generates the messages in the right order, according to the logs. Eg: [Write, Read, Read, Relax, Write, Read]
   * The subscriber on the verifone-emv is however getting it as [Write, Read, Read, Write, Read, Relax].
   * The hypothesis is that the proxyRelaxSubject is responsible for this order mess up. I haven't been able
   * to reproduce this issue on StackBlitz for the RxJS dev team to debug it.
   * Hence, adding an orderId field here (:/) to order the messages.
   */
  (0, _mapInstanceProperty(_operators))(function (message) {
    return _objectSpread(_objectSpread({}, message), {}, {
      orderId: orderCounter()
    });
  }), (0, _operators.tap)(LogI('Forwarding to Subscriber')), (0, _operators.share)());
  retVal$.subscribe(proxyRelaxSubject);
  requests$.subscribe(proxyTimedCommandRequestSubject);
  return retVal$.pipe((0, _order["default"])('orderId'));
}
},{"./TLVs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/index.js","./commands":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/index.js","./heap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/heap.js","./order":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/order.js","./response":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/response.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js","@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js","@babel/runtime-corejs3/core-js-stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js","@babel/runtime-corejs3/core-js-stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/objectWithoutProperties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/objectWithoutProperties.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","@babel/runtime-corejs3/helpers/toArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toArray.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js","core-js/modules/es.object.to-string.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js","core-js/modules/es.promise.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.js","ramda/src/isEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isEmpty.js","rxjs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/index.js","rxjs/operators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/operators/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/order.js":[function(require,module,exports){
"use strict";

var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = order;

var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));

var _every = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/every"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));

var _toArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toArray"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));

var _rxjs = require("rxjs");

var _operators = require("rxjs/operators");

function getInsertIndex(array, value, compareFn) {
  for (var i = 0; i < array.length; i++) {
    if (compareFn(array[i], value) < 0) {
      return i;
    }
  }

  return array.length;
}

function insert(array, value, compareFn) {
  var _context;

  var insertIndex = getInsertIndex(array, value, compareFn);
  return (0, _concat["default"])(_context = []).call(_context, (0, _toConsumableArray2["default"])((0, _slice["default"])(array).call(array, 0, insertIndex)), [value], (0, _toConsumableArray2["default"])((0, _slice["default"])(array).call(array, insertIndex)));
}

function checkOrder(array, compareFn) {
  var _array = (0, _toArray2["default"])(array),
      rest = (0, _slice["default"])(_array).call(_array, 1);

  return (0, _every["default"])(rest).call(rest, function (curr, i) {
    return compareFn(array[i], curr) === 1;
  });
}
/**
 * @typedef {function(object, object): number} comparator
 */

/**
 * This operator orders the emissions from the source observable based on 'by' key name.
 *
 * Assumptions:
 *  - 'by' is not multi-level deep key name
 *  - value referenced by 'by' is a number
 *
 * When the difference between the values referenced by 'by' is 1, the values are emitted. Until then the emissions
 * are kept buffered in an internal array.
 *
 * @param {string} by The key name whose value should be used to order the emissions
 * @param {?comparator} comparator Returns 1, if the input values are correctly sequenced
 * @returns {function(Observable): Observable}
 */


function order(by, comparator) {
  var _comparator = comparator;

  if (!_comparator) {
    _comparator = function _comparator(value1, value2) {
      return value2[by] - value1[by];
    };
  }

  return function (source) {
    return source.pipe((0, _operators.scan)(function (_ref, curr) {
      var isOrdered = _ref.isOrdered,
          events = _ref.events;
      var accEvents = insert(isOrdered ? [events[events.length - 1]] : events, curr, _comparator);
      var areACCEventsOrdered = checkOrder(accEvents, _comparator);
      return {
        isOrdered: areACCEventsOrdered,
        events: accEvents
      };
    }, {
      isOrdered: true,
      events: [(0, _defineProperty2["default"])({}, by, 0)]
    }), (0, _filterInstanceProperty(_operators))(function (_ref3) {
      var isOrdered = _ref3.isOrdered;
      return isOrdered;
    }), (0, _operators.concatMap)(function (_ref4) {
      var _ref4$events = (0, _toArray2["default"])(_ref4.events),
          rest = (0, _slice["default"])(_ref4$events).call(_ref4$events, 1);

      return (0, _rxjs.from)(rest);
    }));
  };
}
},{"@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/every":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/every.js","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/defineProperty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/toArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toArray.js","@babel/runtime-corejs3/helpers/toConsumableArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js","rxjs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/index.js","rxjs/operators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/operators/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/publicFs.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = publicFs;

var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-timeout"));

var _obs = require("./obs");

function publicFs(onInitialized, log) {
  var _commandRequestSubject = (0, _obs.commandRequestSubject)();

  var _commandResponseSubject = (0, _obs.commandResponseSubject)();

  var commandRequest$ = _commandRequestSubject.asObservable();

  var commandResponse$ = _commandResponseSubject.asObservable();

  var data$ = (0, _obs.getData$)(commandRequest$, commandResponse$, log);
  (0, _setTimeout2["default"])(function () {
    return onInitialized({
      data$: data$,
      enqueueCommandRequest: function enqueueCommandRequest(message) {
        return _commandRequestSubject.next(message);
      },
      enqueueCommandResponse: function enqueueCommandResponse(response) {
        return _commandResponseSubject.next(response);
      }
    });
  }, 200);
}
},{"./obs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/obs.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/core-js-stable/set-timeout":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/response.js":[function(require,module,exports){
"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.parseCommand = exports.parse = exports.getResponseType = exports.ResponseType = exports.MessageType = void 0;

var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));

var _curryN = _interopRequireDefault(require("ramda/src/curryN"));

var _commands = require("./commands");

var _TLVs = require("./TLVs");

var getCommand = _TLVs.ResponseParser.getCommand;
var ACKNOWLEDGEMENT = 'acknowledgement';
var BUILT_REQUEST = 'builtRequest';
var MESSAGE = 'message';
var PASS_THROUGH = 'passThrough';
var PARSED_RESPONSE = 'parsedResponse';
var REJECTION = 'rejection';
var MessageType = {
  BUILT_REQUEST: BUILT_REQUEST,
  PARSED_RESPONSE: PARSED_RESPONSE,
  PASS_THROUGH: PASS_THROUGH
};
exports.MessageType = MessageType;
var ResponseType = {
  ACKNOWLEDGEMENT: ACKNOWLEDGEMENT,
  REJECTION: REJECTION,
  MESSAGE: MESSAGE
};
exports.ResponseType = ResponseType;
var handshake = {
  0x06: ACKNOWLEDGEMENT,
  0x04: REJECTION,
  0x15: REJECTION
};
var responseParser = {
  F30: _commands.F30Parser,
  F34: _commands.F34Parser,
  I02: _commands.I02Parser,
  I05: _commands.I05Parser,
  S00: _commands.S00Parser,
  S22: _commands.S22Parser,
  S95: _commands.S95Parser
};

var getResponseType = function getResponseType(_ref) {
  var _ref2 = (0, _slicedToArray2["default"])(_ref, 1),
      firstByte = _ref2[0];

  return handshake[firstByte] || MESSAGE;
};

exports.getResponseType = getResponseType;

var parseCommand = function parseCommand(commandInResponse, responseByteArray) {
  return {
    command: getCommand({
      rawResponse: responseByteArray,
      commandLength: commandInResponse.length
    }),
    responseByteArray: responseByteArray
  };
};

exports.parseCommand = parseCommand;
var parse = (0, _curryN["default"])(2, function (accParsedResponse, _ref3) {
  var command = _ref3.command,
      responseByteArray = _ref3.responseByteArray;
  return responseParser[command](accParsedResponse, responseByteArray);
});
exports.parse = parse;
},{"./TLVs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/TLVs/index.js","./commands":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@paypalcorp/verifone/build/commands/index.js","@babel/runtime-corejs3/core-js-stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/slicedToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js","ramda/src/curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/assert.js":[function(require,module,exports){
(function (global){(function (){
'use strict';

var objectAssign = require('object-assign');

// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js
// original notice:

/*!
 * The buffer module from node.js, for the browser.
 *
 * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
 * @license  MIT
 */
function compare(a, b) {
  if (a === b) {
    return 0;
  }

  var x = a.length;
  var y = b.length;

  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
    if (a[i] !== b[i]) {
      x = a[i];
      y = b[i];
      break;
    }
  }

  if (x < y) {
    return -1;
  }
  if (y < x) {
    return 1;
  }
  return 0;
}
function isBuffer(b) {
  if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {
    return global.Buffer.isBuffer(b);
  }
  return !!(b != null && b._isBuffer);
}

// based on node assert, original notice:
// NB: The URL to the CommonJS spec is kept just for tradition.
//     node-assert has evolved a lot since then, both in API and behavior.

// http://wiki.commonjs.org/wiki/Unit_Testing/1.0
//
// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
//
// Originally from narwhal.js (http://narwhaljs.org)
// Copyright (c) 2009 Thomas Robinson <280north.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the 'Software'), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

var util = require('util/');
var hasOwn = Object.prototype.hasOwnProperty;
var pSlice = Array.prototype.slice;
var functionsHaveNames = (function () {
  return function foo() {}.name === 'foo';
}());
function pToString (obj) {
  return Object.prototype.toString.call(obj);
}
function isView(arrbuf) {
  if (isBuffer(arrbuf)) {
    return false;
  }
  if (typeof global.ArrayBuffer !== 'function') {
    return false;
  }
  if (typeof ArrayBuffer.isView === 'function') {
    return ArrayBuffer.isView(arrbuf);
  }
  if (!arrbuf) {
    return false;
  }
  if (arrbuf instanceof DataView) {
    return true;
  }
  if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {
    return true;
  }
  return false;
}
// 1. The assert module provides functions that throw
// AssertionError's when particular conditions are not met. The
// assert module must conform to the following interface.

var assert = module.exports = ok;

// 2. The AssertionError is defined in assert.
// new assert.AssertionError({ message: message,
//                             actual: actual,
//                             expected: expected })

var regex = /\s*function\s+([^\(\s]*)\s*/;
// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js
function getName(func) {
  if (!util.isFunction(func)) {
    return;
  }
  if (functionsHaveNames) {
    return func.name;
  }
  var str = func.toString();
  var match = str.match(regex);
  return match && match[1];
}
assert.AssertionError = function AssertionError(options) {
  this.name = 'AssertionError';
  this.actual = options.actual;
  this.expected = options.expected;
  this.operator = options.operator;
  if (options.message) {
    this.message = options.message;
    this.generatedMessage = false;
  } else {
    this.message = getMessage(this);
    this.generatedMessage = true;
  }
  var stackStartFunction = options.stackStartFunction || fail;
  if (Error.captureStackTrace) {
    Error.captureStackTrace(this, stackStartFunction);
  } else {
    // non v8 browsers so we can have a stacktrace
    var err = new Error();
    if (err.stack) {
      var out = err.stack;

      // try to strip useless frames
      var fn_name = getName(stackStartFunction);
      var idx = out.indexOf('\n' + fn_name);
      if (idx >= 0) {
        // once we have located the function frame
        // we need to strip out everything before it (and its line)
        var next_line = out.indexOf('\n', idx + 1);
        out = out.substring(next_line + 1);
      }

      this.stack = out;
    }
  }
};

// assert.AssertionError instanceof Error
util.inherits(assert.AssertionError, Error);

function truncate(s, n) {
  if (typeof s === 'string') {
    return s.length < n ? s : s.slice(0, n);
  } else {
    return s;
  }
}
function inspect(something) {
  if (functionsHaveNames || !util.isFunction(something)) {
    return util.inspect(something);
  }
  var rawname = getName(something);
  var name = rawname ? ': ' + rawname : '';
  return '[Function' +  name + ']';
}
function getMessage(self) {
  return truncate(inspect(self.actual), 128) + ' ' +
         self.operator + ' ' +
         truncate(inspect(self.expected), 128);
}

// At present only the three keys mentioned above are used and
// understood by the spec. Implementations or sub modules can pass
// other keys to the AssertionError's constructor - they will be
// ignored.

// 3. All of the following functions must throw an AssertionError
// when a corresponding condition is not met, with a message that
// may be undefined if not provided.  All assertion methods provide
// both the actual and expected values to the assertion error for
// display purposes.

function fail(actual, expected, message, operator, stackStartFunction) {
  throw new assert.AssertionError({
    message: message,
    actual: actual,
    expected: expected,
    operator: operator,
    stackStartFunction: stackStartFunction
  });
}

// EXTENSION! allows for well behaved errors defined elsewhere.
assert.fail = fail;

// 4. Pure assertion tests whether a value is truthy, as determined
// by !!guard.
// assert.ok(guard, message_opt);
// This statement is equivalent to assert.equal(true, !!guard,
// message_opt);. To test strictly for the value true, use
// assert.strictEqual(true, guard, message_opt);.

function ok(value, message) {
  if (!value) fail(value, true, message, '==', assert.ok);
}
assert.ok = ok;

// 5. The equality assertion tests shallow, coercive equality with
// ==.
// assert.equal(actual, expected, message_opt);

assert.equal = function equal(actual, expected, message) {
  if (actual != expected) fail(actual, expected, message, '==', assert.equal);
};

// 6. The non-equality assertion tests for whether two objects are not equal
// with != assert.notEqual(actual, expected, message_opt);

assert.notEqual = function notEqual(actual, expected, message) {
  if (actual == expected) {
    fail(actual, expected, message, '!=', assert.notEqual);
  }
};

// 7. The equivalence assertion tests a deep equality relation.
// assert.deepEqual(actual, expected, message_opt);

assert.deepEqual = function deepEqual(actual, expected, message) {
  if (!_deepEqual(actual, expected, false)) {
    fail(actual, expected, message, 'deepEqual', assert.deepEqual);
  }
};

assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
  if (!_deepEqual(actual, expected, true)) {
    fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);
  }
};

function _deepEqual(actual, expected, strict, memos) {
  // 7.1. All identical values are equivalent, as determined by ===.
  if (actual === expected) {
    return true;
  } else if (isBuffer(actual) && isBuffer(expected)) {
    return compare(actual, expected) === 0;

  // 7.2. If the expected value is a Date object, the actual value is
  // equivalent if it is also a Date object that refers to the same time.
  } else if (util.isDate(actual) && util.isDate(expected)) {
    return actual.getTime() === expected.getTime();

  // 7.3 If the expected value is a RegExp object, the actual value is
  // equivalent if it is also a RegExp object with the same source and
  // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
  } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
    return actual.source === expected.source &&
           actual.global === expected.global &&
           actual.multiline === expected.multiline &&
           actual.lastIndex === expected.lastIndex &&
           actual.ignoreCase === expected.ignoreCase;

  // 7.4. Other pairs that do not both pass typeof value == 'object',
  // equivalence is determined by ==.
  } else if ((actual === null || typeof actual !== 'object') &&
             (expected === null || typeof expected !== 'object')) {
    return strict ? actual === expected : actual == expected;

  // If both values are instances of typed arrays, wrap their underlying
  // ArrayBuffers in a Buffer each to increase performance
  // This optimization requires the arrays to have the same type as checked by
  // Object.prototype.toString (aka pToString). Never perform binary
  // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their
  // bit patterns are not identical.
  } else if (isView(actual) && isView(expected) &&
             pToString(actual) === pToString(expected) &&
             !(actual instanceof Float32Array ||
               actual instanceof Float64Array)) {
    return compare(new Uint8Array(actual.buffer),
                   new Uint8Array(expected.buffer)) === 0;

  // 7.5 For all other Object pairs, including Array objects, equivalence is
  // determined by having the same number of owned properties (as verified
  // with Object.prototype.hasOwnProperty.call), the same set of keys
  // (although not necessarily the same order), equivalent values for every
  // corresponding key, and an identical 'prototype' property. Note: this
  // accounts for both named and indexed properties on Arrays.
  } else if (isBuffer(actual) !== isBuffer(expected)) {
    return false;
  } else {
    memos = memos || {actual: [], expected: []};

    var actualIndex = memos.actual.indexOf(actual);
    if (actualIndex !== -1) {
      if (actualIndex === memos.expected.indexOf(expected)) {
        return true;
      }
    }

    memos.actual.push(actual);
    memos.expected.push(expected);

    return objEquiv(actual, expected, strict, memos);
  }
}

function isArguments(object) {
  return Object.prototype.toString.call(object) == '[object Arguments]';
}

function objEquiv(a, b, strict, actualVisitedObjects) {
  if (a === null || a === undefined || b === null || b === undefined)
    return false;
  // if one is a primitive, the other must be same
  if (util.isPrimitive(a) || util.isPrimitive(b))
    return a === b;
  if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))
    return false;
  var aIsArgs = isArguments(a);
  var bIsArgs = isArguments(b);
  if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
    return false;
  if (aIsArgs) {
    a = pSlice.call(a);
    b = pSlice.call(b);
    return _deepEqual(a, b, strict);
  }
  var ka = objectKeys(a);
  var kb = objectKeys(b);
  var key, i;
  // having the same number of owned properties (keys incorporates
  // hasOwnProperty)
  if (ka.length !== kb.length)
    return false;
  //the same set of keys (although not necessarily the same order),
  ka.sort();
  kb.sort();
  //~~~cheap key test
  for (i = ka.length - 1; i >= 0; i--) {
    if (ka[i] !== kb[i])
      return false;
  }
  //equivalent values for every corresponding key, and
  //~~~possibly expensive deep test
  for (i = ka.length - 1; i >= 0; i--) {
    key = ka[i];
    if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))
      return false;
  }
  return true;
}

// 8. The non-equivalence assertion tests for any deep inequality.
// assert.notDeepEqual(actual, expected, message_opt);

assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
  if (_deepEqual(actual, expected, false)) {
    fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
  }
};

assert.notDeepStrictEqual = notDeepStrictEqual;
function notDeepStrictEqual(actual, expected, message) {
  if (_deepEqual(actual, expected, true)) {
    fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);
  }
}


// 9. The strict equality assertion tests strict equality, as determined by ===.
// assert.strictEqual(actual, expected, message_opt);

assert.strictEqual = function strictEqual(actual, expected, message) {
  if (actual !== expected) {
    fail(actual, expected, message, '===', assert.strictEqual);
  }
};

// 10. The strict non-equality assertion tests for strict inequality, as
// determined by !==.  assert.notStrictEqual(actual, expected, message_opt);

assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
  if (actual === expected) {
    fail(actual, expected, message, '!==', assert.notStrictEqual);
  }
};

function expectedException(actual, expected) {
  if (!actual || !expected) {
    return false;
  }

  if (Object.prototype.toString.call(expected) == '[object RegExp]') {
    return expected.test(actual);
  }

  try {
    if (actual instanceof expected) {
      return true;
    }
  } catch (e) {
    // Ignore.  The instanceof check doesn't work for arrow functions.
  }

  if (Error.isPrototypeOf(expected)) {
    return false;
  }

  return expected.call({}, actual) === true;
}

function _tryBlock(block) {
  var error;
  try {
    block();
  } catch (e) {
    error = e;
  }
  return error;
}

function _throws(shouldThrow, block, expected, message) {
  var actual;

  if (typeof block !== 'function') {
    throw new TypeError('"block" argument must be a function');
  }

  if (typeof expected === 'string') {
    message = expected;
    expected = null;
  }

  actual = _tryBlock(block);

  message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
            (message ? ' ' + message : '.');

  if (shouldThrow && !actual) {
    fail(actual, expected, 'Missing expected exception' + message);
  }

  var userProvidedMessage = typeof message === 'string';
  var isUnwantedException = !shouldThrow && util.isError(actual);
  var isUnexpectedException = !shouldThrow && actual && !expected;

  if ((isUnwantedException &&
      userProvidedMessage &&
      expectedException(actual, expected)) ||
      isUnexpectedException) {
    fail(actual, expected, 'Got unwanted exception' + message);
  }

  if ((shouldThrow && actual && expected &&
      !expectedException(actual, expected)) || (!shouldThrow && actual)) {
    throw actual;
  }
}

// 11. Expected to throw an error:
// assert.throws(block, Error_opt, message_opt);

assert.throws = function(block, /*optional*/error, /*optional*/message) {
  _throws(true, block, error, message);
};

// EXTENSION! This is annoying to write outside this module.
assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {
  _throws(false, block, error, message);
};

assert.ifError = function(err) { if (err) throw err; };

// Expose a strict only variant of assert
function strict(value, message) {
  if (!value) fail(value, true, message, '==', strict);
}
assert.strict = objectAssign(strict, assert, {
  equal: assert.strictEqual,
  deepEqual: assert.deepStrictEqual,
  notEqual: assert.notStrictEqual,
  notDeepEqual: assert.notDeepStrictEqual
});
assert.strict.strict = assert.strict;

var objectKeys = Object.keys || function (obj) {
  var keys = [];
  for (var key in obj) {
    if (hasOwn.call(obj, key)) keys.push(key);
  }
  return keys;
};

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"object-assign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-assign/index.js","util/":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/node_modules/util/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/node_modules/inherits/inherits_browser.js":[function(require,module,exports){
if (typeof Object.create === 'function') {
  // implementation from standard node.js 'util' module
  module.exports = function inherits(ctor, superCtor) {
    ctor.super_ = superCtor
    ctor.prototype = Object.create(superCtor.prototype, {
      constructor: {
        value: ctor,
        enumerable: false,
        writable: true,
        configurable: true
      }
    });
  };
} else {
  // old school shim for old browsers
  module.exports = function inherits(ctor, superCtor) {
    ctor.super_ = superCtor
    var TempCtor = function () {}
    TempCtor.prototype = superCtor.prototype
    ctor.prototype = new TempCtor()
    ctor.prototype.constructor = ctor
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/node_modules/util/support/isBufferBrowser.js":[function(require,module,exports){
module.exports = function isBuffer(arg) {
  return arg && typeof arg === 'object'
    && typeof arg.copy === 'function'
    && typeof arg.fill === 'function'
    && typeof arg.readUInt8 === 'function';
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/node_modules/util/util.js":[function(require,module,exports){
(function (process,global){(function (){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var formatRegExp = /%[sdj%]/g;
exports.format = function(f) {
  if (!isString(f)) {
    var objects = [];
    for (var i = 0; i < arguments.length; i++) {
      objects.push(inspect(arguments[i]));
    }
    return objects.join(' ');
  }

  var i = 1;
  var args = arguments;
  var len = args.length;
  var str = String(f).replace(formatRegExp, function(x) {
    if (x === '%%') return '%';
    if (i >= len) return x;
    switch (x) {
      case '%s': return String(args[i++]);
      case '%d': return Number(args[i++]);
      case '%j':
        try {
          return JSON.stringify(args[i++]);
        } catch (_) {
          return '[Circular]';
        }
      default:
        return x;
    }
  });
  for (var x = args[i]; i < len; x = args[++i]) {
    if (isNull(x) || !isObject(x)) {
      str += ' ' + x;
    } else {
      str += ' ' + inspect(x);
    }
  }
  return str;
};


// Mark that a method should not be used.
// Returns a modified function which warns once by default.
// If --no-deprecation is set, then it is a no-op.
exports.deprecate = function(fn, msg) {
  // Allow for deprecating things in the process of starting up.
  if (isUndefined(global.process)) {
    return function() {
      return exports.deprecate(fn, msg).apply(this, arguments);
    };
  }

  if (process.noDeprecation === true) {
    return fn;
  }

  var warned = false;
  function deprecated() {
    if (!warned) {
      if (process.throwDeprecation) {
        throw new Error(msg);
      } else if (process.traceDeprecation) {
        console.trace(msg);
      } else {
        console.error(msg);
      }
      warned = true;
    }
    return fn.apply(this, arguments);
  }

  return deprecated;
};


var debugs = {};
var debugEnviron;
exports.debuglog = function(set) {
  if (isUndefined(debugEnviron))
    debugEnviron = process.env.NODE_DEBUG || '';
  set = set.toUpperCase();
  if (!debugs[set]) {
    if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
      var pid = process.pid;
      debugs[set] = function() {
        var msg = exports.format.apply(exports, arguments);
        console.error('%s %d: %s', set, pid, msg);
      };
    } else {
      debugs[set] = function() {};
    }
  }
  return debugs[set];
};


/**
 * Echos the value of a value. Trys to print the value out
 * in the best way possible given the different types.
 *
 * @param {Object} obj The object to print out.
 * @param {Object} opts Optional options object that alters the output.
 */
/* legacy: obj, showHidden, depth, colors*/
function inspect(obj, opts) {
  // default options
  var ctx = {
    seen: [],
    stylize: stylizeNoColor
  };
  // legacy...
  if (arguments.length >= 3) ctx.depth = arguments[2];
  if (arguments.length >= 4) ctx.colors = arguments[3];
  if (isBoolean(opts)) {
    // legacy...
    ctx.showHidden = opts;
  } else if (opts) {
    // got an "options" object
    exports._extend(ctx, opts);
  }
  // set default options
  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
  if (isUndefined(ctx.depth)) ctx.depth = 2;
  if (isUndefined(ctx.colors)) ctx.colors = false;
  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
  if (ctx.colors) ctx.stylize = stylizeWithColor;
  return formatValue(ctx, obj, ctx.depth);
}
exports.inspect = inspect;


// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
inspect.colors = {
  'bold' : [1, 22],
  'italic' : [3, 23],
  'underline' : [4, 24],
  'inverse' : [7, 27],
  'white' : [37, 39],
  'grey' : [90, 39],
  'black' : [30, 39],
  'blue' : [34, 39],
  'cyan' : [36, 39],
  'green' : [32, 39],
  'magenta' : [35, 39],
  'red' : [31, 39],
  'yellow' : [33, 39]
};

// Don't use 'blue' not visible on cmd.exe
inspect.styles = {
  'special': 'cyan',
  'number': 'yellow',
  'boolean': 'yellow',
  'undefined': 'grey',
  'null': 'bold',
  'string': 'green',
  'date': 'magenta',
  // "name": intentionally not styling
  'regexp': 'red'
};


function stylizeWithColor(str, styleType) {
  var style = inspect.styles[styleType];

  if (style) {
    return '\u001b[' + inspect.colors[style][0] + 'm' + str +
           '\u001b[' + inspect.colors[style][1] + 'm';
  } else {
    return str;
  }
}


function stylizeNoColor(str, styleType) {
  return str;
}


function arrayToHash(array) {
  var hash = {};

  array.forEach(function(val, idx) {
    hash[val] = true;
  });

  return hash;
}


function formatValue(ctx, value, recurseTimes) {
  // Provide a hook for user-specified inspect functions.
  // Check that value is an object with an inspect function on it
  if (ctx.customInspect &&
      value &&
      isFunction(value.inspect) &&
      // Filter out the util module, it's inspect function is special
      value.inspect !== exports.inspect &&
      // Also filter out any prototype objects using the circular check.
      !(value.constructor && value.constructor.prototype === value)) {
    var ret = value.inspect(recurseTimes, ctx);
    if (!isString(ret)) {
      ret = formatValue(ctx, ret, recurseTimes);
    }
    return ret;
  }

  // Primitive types cannot have properties
  var primitive = formatPrimitive(ctx, value);
  if (primitive) {
    return primitive;
  }

  // Look up the keys of the object.
  var keys = Object.keys(value);
  var visibleKeys = arrayToHash(keys);

  if (ctx.showHidden) {
    keys = Object.getOwnPropertyNames(value);
  }

  // IE doesn't make error fields non-enumerable
  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
  if (isError(value)
      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
    return formatError(value);
  }

  // Some type of object without properties can be shortcutted.
  if (keys.length === 0) {
    if (isFunction(value)) {
      var name = value.name ? ': ' + value.name : '';
      return ctx.stylize('[Function' + name + ']', 'special');
    }
    if (isRegExp(value)) {
      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
    }
    if (isDate(value)) {
      return ctx.stylize(Date.prototype.toString.call(value), 'date');
    }
    if (isError(value)) {
      return formatError(value);
    }
  }

  var base = '', array = false, braces = ['{', '}'];

  // Make Array say that they are Array
  if (isArray(value)) {
    array = true;
    braces = ['[', ']'];
  }

  // Make functions say that they are functions
  if (isFunction(value)) {
    var n = value.name ? ': ' + value.name : '';
    base = ' [Function' + n + ']';
  }

  // Make RegExps say that they are RegExps
  if (isRegExp(value)) {
    base = ' ' + RegExp.prototype.toString.call(value);
  }

  // Make dates with properties first say the date
  if (isDate(value)) {
    base = ' ' + Date.prototype.toUTCString.call(value);
  }

  // Make error with message first say the error
  if (isError(value)) {
    base = ' ' + formatError(value);
  }

  if (keys.length === 0 && (!array || value.length == 0)) {
    return braces[0] + base + braces[1];
  }

  if (recurseTimes < 0) {
    if (isRegExp(value)) {
      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
    } else {
      return ctx.stylize('[Object]', 'special');
    }
  }

  ctx.seen.push(value);

  var output;
  if (array) {
    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
  } else {
    output = keys.map(function(key) {
      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
    });
  }

  ctx.seen.pop();

  return reduceToSingleString(output, base, braces);
}


function formatPrimitive(ctx, value) {
  if (isUndefined(value))
    return ctx.stylize('undefined', 'undefined');
  if (isString(value)) {
    var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
                                             .replace(/'/g, "\\'")
                                             .replace(/\\"/g, '"') + '\'';
    return ctx.stylize(simple, 'string');
  }
  if (isNumber(value))
    return ctx.stylize('' + value, 'number');
  if (isBoolean(value))
    return ctx.stylize('' + value, 'boolean');
  // For some reason typeof null is "object", so special case here.
  if (isNull(value))
    return ctx.stylize('null', 'null');
}


function formatError(value) {
  return '[' + Error.prototype.toString.call(value) + ']';
}


function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  var output = [];
  for (var i = 0, l = value.length; i < l; ++i) {
    if (hasOwnProperty(value, String(i))) {
      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
          String(i), true));
    } else {
      output.push('');
    }
  }
  keys.forEach(function(key) {
    if (!key.match(/^\d+$/)) {
      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
          key, true));
    }
  });
  return output;
}


function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
  var name, str, desc;
  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
  if (desc.get) {
    if (desc.set) {
      str = ctx.stylize('[Getter/Setter]', 'special');
    } else {
      str = ctx.stylize('[Getter]', 'special');
    }
  } else {
    if (desc.set) {
      str = ctx.stylize('[Setter]', 'special');
    }
  }
  if (!hasOwnProperty(visibleKeys, key)) {
    name = '[' + key + ']';
  }
  if (!str) {
    if (ctx.seen.indexOf(desc.value) < 0) {
      if (isNull(recurseTimes)) {
        str = formatValue(ctx, desc.value, null);
      } else {
        str = formatValue(ctx, desc.value, recurseTimes - 1);
      }
      if (str.indexOf('\n') > -1) {
        if (array) {
          str = str.split('\n').map(function(line) {
            return '  ' + line;
          }).join('\n').substr(2);
        } else {
          str = '\n' + str.split('\n').map(function(line) {
            return '   ' + line;
          }).join('\n');
        }
      }
    } else {
      str = ctx.stylize('[Circular]', 'special');
    }
  }
  if (isUndefined(name)) {
    if (array && key.match(/^\d+$/)) {
      return str;
    }
    name = JSON.stringify('' + key);
    if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
      name = name.substr(1, name.length - 2);
      name = ctx.stylize(name, 'name');
    } else {
      name = name.replace(/'/g, "\\'")
                 .replace(/\\"/g, '"')
                 .replace(/(^"|"$)/g, "'");
      name = ctx.stylize(name, 'string');
    }
  }

  return name + ': ' + str;
}


function reduceToSingleString(output, base, braces) {
  var numLinesEst = 0;
  var length = output.reduce(function(prev, cur) {
    numLinesEst++;
    if (cur.indexOf('\n') >= 0) numLinesEst++;
    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
  }, 0);

  if (length > 60) {
    return braces[0] +
           (base === '' ? '' : base + '\n ') +
           ' ' +
           output.join(',\n  ') +
           ' ' +
           braces[1];
  }

  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
}


// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.
function isArray(ar) {
  return Array.isArray(ar);
}
exports.isArray = isArray;

function isBoolean(arg) {
  return typeof arg === 'boolean';
}
exports.isBoolean = isBoolean;

function isNull(arg) {
  return arg === null;
}
exports.isNull = isNull;

function isNullOrUndefined(arg) {
  return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;

function isNumber(arg) {
  return typeof arg === 'number';
}
exports.isNumber = isNumber;

function isString(arg) {
  return typeof arg === 'string';
}
exports.isString = isString;

function isSymbol(arg) {
  return typeof arg === 'symbol';
}
exports.isSymbol = isSymbol;

function isUndefined(arg) {
  return arg === void 0;
}
exports.isUndefined = isUndefined;

function isRegExp(re) {
  return isObject(re) && objectToString(re) === '[object RegExp]';
}
exports.isRegExp = isRegExp;

function isObject(arg) {
  return typeof arg === 'object' && arg !== null;
}
exports.isObject = isObject;

function isDate(d) {
  return isObject(d) && objectToString(d) === '[object Date]';
}
exports.isDate = isDate;

function isError(e) {
  return isObject(e) &&
      (objectToString(e) === '[object Error]' || e instanceof Error);
}
exports.isError = isError;

function isFunction(arg) {
  return typeof arg === 'function';
}
exports.isFunction = isFunction;

function isPrimitive(arg) {
  return arg === null ||
         typeof arg === 'boolean' ||
         typeof arg === 'number' ||
         typeof arg === 'string' ||
         typeof arg === 'symbol' ||  // ES6 symbol
         typeof arg === 'undefined';
}
exports.isPrimitive = isPrimitive;

exports.isBuffer = require('./support/isBuffer');

function objectToString(o) {
  return Object.prototype.toString.call(o);
}


function pad(n) {
  return n < 10 ? '0' + n.toString(10) : n.toString(10);
}


var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
              'Oct', 'Nov', 'Dec'];

// 26 Feb 16:19:34
function timestamp() {
  var d = new Date();
  var time = [pad(d.getHours()),
              pad(d.getMinutes()),
              pad(d.getSeconds())].join(':');
  return [d.getDate(), months[d.getMonth()], time].join(' ');
}


// log is just a thin wrapper to console.log that prepends a timestamp
exports.log = function() {
  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
};


/**
 * Inherit the prototype methods from one constructor into another.
 *
 * The Function.prototype.inherits from lang.js rewritten as a standalone
 * function (not on Function.prototype). NOTE: If this file is to be loaded
 * during bootstrapping this function needs to be rewritten using some native
 * functions as prototype setup using normal JavaScript does not work as
 * expected during bootstrapping (see mirror.js in r114903).
 *
 * @param {function} ctor Constructor function which needs to inherit the
 *     prototype.
 * @param {function} superCtor Constructor function to inherit prototype from.
 */
exports.inherits = require('inherits');

exports._extend = function(origin, add) {
  // Don't do anything if add isn't an object
  if (!add || !isObject(add)) return origin;

  var keys = Object.keys(add);
  var i = keys.length;
  while (i--) {
    origin[keys[i]] = add[keys[i]];
  }
  return origin;
};

function hasOwnProperty(obj, prop) {
  return Object.prototype.hasOwnProperty.call(obj, prop);
}

}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./support/isBuffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/node_modules/util/support/isBufferBrowser.js","_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/node_modules/inherits/inherits_browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/async/lib/async.js":[function(require,module,exports){
(function (process,global,setImmediate){(function (){
/*!
 * async
 * https://github.com/caolan/async
 *
 * Copyright 2010-2014 Caolan McMahon
 * Released under the MIT license
 */
(function () {

    var async = {};
    function noop() {}
    function identity(v) {
        return v;
    }
    function toBool(v) {
        return !!v;
    }
    function notId(v) {
        return !v;
    }

    // global on the server, window in the browser
    var previous_async;

    // Establish the root object, `window` (`self`) in the browser, `global`
    // on the server, or `this` in some virtual machines. We use `self`
    // instead of `window` for `WebWorker` support.
    var root = typeof self === 'object' && self.self === self && self ||
            typeof global === 'object' && global.global === global && global ||
            this;

    if (root != null) {
        previous_async = root.async;
    }

    async.noConflict = function () {
        root.async = previous_async;
        return async;
    };

    function only_once(fn) {
        return function() {
            if (fn === null) throw new Error("Callback was already called.");
            fn.apply(this, arguments);
            fn = null;
        };
    }

    function _once(fn) {
        return function() {
            if (fn === null) return;
            fn.apply(this, arguments);
            fn = null;
        };
    }

    //// cross-browser compatiblity functions ////

    var _toString = Object.prototype.toString;

    var _isArray = Array.isArray || function (obj) {
        return _toString.call(obj) === '[object Array]';
    };

    // Ported from underscore.js isObject
    var _isObject = function(obj) {
        var type = typeof obj;
        return type === 'function' || type === 'object' && !!obj;
    };

    function _isArrayLike(arr) {
        return _isArray(arr) || (
            // has a positive integer length property
            typeof arr.length === "number" &&
            arr.length >= 0 &&
            arr.length % 1 === 0
        );
    }

    function _arrayEach(arr, iterator) {
        var index = -1,
            length = arr.length;

        while (++index < length) {
            iterator(arr[index], index, arr);
        }
    }

    function _map(arr, iterator) {
        var index = -1,
            length = arr.length,
            result = Array(length);

        while (++index < length) {
            result[index] = iterator(arr[index], index, arr);
        }
        return result;
    }

    function _range(count) {
        return _map(Array(count), function (v, i) { return i; });
    }

    function _reduce(arr, iterator, memo) {
        _arrayEach(arr, function (x, i, a) {
            memo = iterator(memo, x, i, a);
        });
        return memo;
    }

    function _forEachOf(object, iterator) {
        _arrayEach(_keys(object), function (key) {
            iterator(object[key], key);
        });
    }

    function _indexOf(arr, item) {
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] === item) return i;
        }
        return -1;
    }

    var _keys = Object.keys || function (obj) {
        var keys = [];
        for (var k in obj) {
            if (obj.hasOwnProperty(k)) {
                keys.push(k);
            }
        }
        return keys;
    };

    function _keyIterator(coll) {
        var i = -1;
        var len;
        var keys;
        if (_isArrayLike(coll)) {
            len = coll.length;
            return function next() {
                i++;
                return i < len ? i : null;
            };
        } else {
            keys = _keys(coll);
            len = keys.length;
            return function next() {
                i++;
                return i < len ? keys[i] : null;
            };
        }
    }

    // Similar to ES6's rest param (http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html)
    // This accumulates the arguments passed into an array, after a given index.
    // From underscore.js (https://github.com/jashkenas/underscore/pull/2140).
    function _restParam(func, startIndex) {
        startIndex = startIndex == null ? func.length - 1 : +startIndex;
        return function() {
            var length = Math.max(arguments.length - startIndex, 0);
            var rest = Array(length);
            for (var index = 0; index < length; index++) {
                rest[index] = arguments[index + startIndex];
            }
            switch (startIndex) {
                case 0: return func.call(this, rest);
                case 1: return func.call(this, arguments[0], rest);
            }
            // Currently unused but handle cases outside of the switch statement:
            // var args = Array(startIndex + 1);
            // for (index = 0; index < startIndex; index++) {
            //     args[index] = arguments[index];
            // }
            // args[startIndex] = rest;
            // return func.apply(this, args);
        };
    }

    function _withoutIndex(iterator) {
        return function (value, index, callback) {
            return iterator(value, callback);
        };
    }

    //// exported async module functions ////

    //// nextTick implementation with browser-compatible fallback ////

    // capture the global reference to guard against fakeTimer mocks
    var _setImmediate = typeof setImmediate === 'function' && setImmediate;

    var _delay = _setImmediate ? function(fn) {
        // not a direct alias for IE10 compatibility
        _setImmediate(fn);
    } : function(fn) {
        setTimeout(fn, 0);
    };

    if (typeof process === 'object' && typeof process.nextTick === 'function') {
        async.nextTick = process.nextTick;
    } else {
        async.nextTick = _delay;
    }
    async.setImmediate = _setImmediate ? _delay : async.nextTick;


    async.forEach =
    async.each = function (arr, iterator, callback) {
        return async.eachOf(arr, _withoutIndex(iterator), callback);
    };

    async.forEachSeries =
    async.eachSeries = function (arr, iterator, callback) {
        return async.eachOfSeries(arr, _withoutIndex(iterator), callback);
    };


    async.forEachLimit =
    async.eachLimit = function (arr, limit, iterator, callback) {
        return _eachOfLimit(limit)(arr, _withoutIndex(iterator), callback);
    };

    async.forEachOf =
    async.eachOf = function (object, iterator, callback) {
        callback = _once(callback || noop);
        object = object || [];

        var iter = _keyIterator(object);
        var key, completed = 0;

        while ((key = iter()) != null) {
            completed += 1;
            iterator(object[key], key, only_once(done));
        }

        if (completed === 0) callback(null);

        function done(err) {
            completed--;
            if (err) {
                callback(err);
            }
            // Check key is null in case iterator isn't exhausted
            // and done resolved synchronously.
            else if (key === null && completed <= 0) {
                callback(null);
            }
        }
    };

    async.forEachOfSeries =
    async.eachOfSeries = function (obj, iterator, callback) {
        callback = _once(callback || noop);
        obj = obj || [];
        var nextKey = _keyIterator(obj);
        var key = nextKey();
        function iterate() {
            var sync = true;
            if (key === null) {
                return callback(null);
            }
            iterator(obj[key], key, only_once(function (err) {
                if (err) {
                    callback(err);
                }
                else {
                    key = nextKey();
                    if (key === null) {
                        return callback(null);
                    } else {
                        if (sync) {
                            async.setImmediate(iterate);
                        } else {
                            iterate();
                        }
                    }
                }
            }));
            sync = false;
        }
        iterate();
    };



    async.forEachOfLimit =
    async.eachOfLimit = function (obj, limit, iterator, callback) {
        _eachOfLimit(limit)(obj, iterator, callback);
    };

    function _eachOfLimit(limit) {

        return function (obj, iterator, callback) {
            callback = _once(callback || noop);
            obj = obj || [];
            var nextKey = _keyIterator(obj);
            if (limit <= 0) {
                return callback(null);
            }
            var done = false;
            var running = 0;
            var errored = false;

            (function replenish () {
                if (done && running <= 0) {
                    return callback(null);
                }

                while (running < limit && !errored) {
                    var key = nextKey();
                    if (key === null) {
                        done = true;
                        if (running <= 0) {
                            callback(null);
                        }
                        return;
                    }
                    running += 1;
                    iterator(obj[key], key, only_once(function (err) {
                        running -= 1;
                        if (err) {
                            callback(err);
                            errored = true;
                        }
                        else {
                            replenish();
                        }
                    }));
                }
            })();
        };
    }


    function doParallel(fn) {
        return function (obj, iterator, callback) {
            return fn(async.eachOf, obj, iterator, callback);
        };
    }
    function doParallelLimit(fn) {
        return function (obj, limit, iterator, callback) {
            return fn(_eachOfLimit(limit), obj, iterator, callback);
        };
    }
    function doSeries(fn) {
        return function (obj, iterator, callback) {
            return fn(async.eachOfSeries, obj, iterator, callback);
        };
    }

    function _asyncMap(eachfn, arr, iterator, callback) {
        callback = _once(callback || noop);
        arr = arr || [];
        var results = _isArrayLike(arr) ? [] : {};
        eachfn(arr, function (value, index, callback) {
            iterator(value, function (err, v) {
                results[index] = v;
                callback(err);
            });
        }, function (err) {
            callback(err, results);
        });
    }

    async.map = doParallel(_asyncMap);
    async.mapSeries = doSeries(_asyncMap);
    async.mapLimit = doParallelLimit(_asyncMap);

    // reduce only has a series version, as doing reduce in parallel won't
    // work in many situations.
    async.inject =
    async.foldl =
    async.reduce = function (arr, memo, iterator, callback) {
        async.eachOfSeries(arr, function (x, i, callback) {
            iterator(memo, x, function (err, v) {
                memo = v;
                callback(err);
            });
        }, function (err) {
            callback(err, memo);
        });
    };

    async.foldr =
    async.reduceRight = function (arr, memo, iterator, callback) {
        var reversed = _map(arr, identity).reverse();
        async.reduce(reversed, memo, iterator, callback);
    };

    async.transform = function (arr, memo, iterator, callback) {
        if (arguments.length === 3) {
            callback = iterator;
            iterator = memo;
            memo = _isArray(arr) ? [] : {};
        }

        async.eachOf(arr, function(v, k, cb) {
            iterator(memo, v, k, cb);
        }, function(err) {
            callback(err, memo);
        });
    };

    function _filter(eachfn, arr, iterator, callback) {
        var results = [];
        eachfn(arr, function (x, index, callback) {
            iterator(x, function (v) {
                if (v) {
                    results.push({index: index, value: x});
                }
                callback();
            });
        }, function () {
            callback(_map(results.sort(function (a, b) {
                return a.index - b.index;
            }), function (x) {
                return x.value;
            }));
        });
    }

    async.select =
    async.filter = doParallel(_filter);

    async.selectLimit =
    async.filterLimit = doParallelLimit(_filter);

    async.selectSeries =
    async.filterSeries = doSeries(_filter);

    function _reject(eachfn, arr, iterator, callback) {
        _filter(eachfn, arr, function(value, cb) {
            iterator(value, function(v) {
                cb(!v);
            });
        }, callback);
    }
    async.reject = doParallel(_reject);
    async.rejectLimit = doParallelLimit(_reject);
    async.rejectSeries = doSeries(_reject);

    function _createTester(eachfn, check, getResult) {
        return function(arr, limit, iterator, cb) {
            function done() {
                if (cb) cb(getResult(false, void 0));
            }
            function iteratee(x, _, callback) {
                if (!cb) return callback();
                iterator(x, function (v) {
                    if (cb && check(v)) {
                        cb(getResult(true, x));
                        cb = iterator = false;
                    }
                    callback();
                });
            }
            if (arguments.length > 3) {
                eachfn(arr, limit, iteratee, done);
            } else {
                cb = iterator;
                iterator = limit;
                eachfn(arr, iteratee, done);
            }
        };
    }

    async.any =
    async.some = _createTester(async.eachOf, toBool, identity);

    async.someLimit = _createTester(async.eachOfLimit, toBool, identity);

    async.all =
    async.every = _createTester(async.eachOf, notId, notId);

    async.everyLimit = _createTester(async.eachOfLimit, notId, notId);

    function _findGetResult(v, x) {
        return x;
    }
    async.detect = _createTester(async.eachOf, identity, _findGetResult);
    async.detectSeries = _createTester(async.eachOfSeries, identity, _findGetResult);
    async.detectLimit = _createTester(async.eachOfLimit, identity, _findGetResult);

    async.sortBy = function (arr, iterator, callback) {
        async.map(arr, function (x, callback) {
            iterator(x, function (err, criteria) {
                if (err) {
                    callback(err);
                }
                else {
                    callback(null, {value: x, criteria: criteria});
                }
            });
        }, function (err, results) {
            if (err) {
                return callback(err);
            }
            else {
                callback(null, _map(results.sort(comparator), function (x) {
                    return x.value;
                }));
            }

        });

        function comparator(left, right) {
            var a = left.criteria, b = right.criteria;
            return a < b ? -1 : a > b ? 1 : 0;
        }
    };

    async.auto = function (tasks, concurrency, callback) {
        if (typeof arguments[1] === 'function') {
            // concurrency is optional, shift the args.
            callback = concurrency;
            concurrency = null;
        }
        callback = _once(callback || noop);
        var keys = _keys(tasks);
        var remainingTasks = keys.length;
        if (!remainingTasks) {
            return callback(null);
        }
        if (!concurrency) {
            concurrency = remainingTasks;
        }

        var results = {};
        var runningTasks = 0;

        var hasError = false;

        var listeners = [];
        function addListener(fn) {
            listeners.unshift(fn);
        }
        function removeListener(fn) {
            var idx = _indexOf(listeners, fn);
            if (idx >= 0) listeners.splice(idx, 1);
        }
        function taskComplete() {
            remainingTasks--;
            _arrayEach(listeners.slice(0), function (fn) {
                fn();
            });
        }

        addListener(function () {
            if (!remainingTasks) {
                callback(null, results);
            }
        });

        _arrayEach(keys, function (k) {
            if (hasError) return;
            var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];
            var taskCallback = _restParam(function(err, args) {
                runningTasks--;
                if (args.length <= 1) {
                    args = args[0];
                }
                if (err) {
                    var safeResults = {};
                    _forEachOf(results, function(val, rkey) {
                        safeResults[rkey] = val;
                    });
                    safeResults[k] = args;
                    hasError = true;

                    callback(err, safeResults);
                }
                else {
                    results[k] = args;
                    async.setImmediate(taskComplete);
                }
            });
            var requires = task.slice(0, task.length - 1);
            // prevent dead-locks
            var len = requires.length;
            var dep;
            while (len--) {
                if (!(dep = tasks[requires[len]])) {
                    throw new Error('Has nonexistent dependency in ' + requires.join(', '));
                }
                if (_isArray(dep) && _indexOf(dep, k) >= 0) {
                    throw new Error('Has cyclic dependencies');
                }
            }
            function ready() {
                return runningTasks < concurrency && _reduce(requires, function (a, x) {
                    return (a && results.hasOwnProperty(x));
                }, true) && !results.hasOwnProperty(k);
            }
            if (ready()) {
                runningTasks++;
                task[task.length - 1](taskCallback, results);
            }
            else {
                addListener(listener);
            }
            function listener() {
                if (ready()) {
                    runningTasks++;
                    removeListener(listener);
                    task[task.length - 1](taskCallback, results);
                }
            }
        });
    };



    async.retry = function(times, task, callback) {
        var DEFAULT_TIMES = 5;
        var DEFAULT_INTERVAL = 0;

        var attempts = [];

        var opts = {
            times: DEFAULT_TIMES,
            interval: DEFAULT_INTERVAL
        };

        function parseTimes(acc, t){
            if(typeof t === 'number'){
                acc.times = parseInt(t, 10) || DEFAULT_TIMES;
            } else if(typeof t === 'object'){
                acc.times = parseInt(t.times, 10) || DEFAULT_TIMES;
                acc.interval = parseInt(t.interval, 10) || DEFAULT_INTERVAL;
            } else {
                throw new Error('Unsupported argument type for \'times\': ' + typeof t);
            }
        }

        var length = arguments.length;
        if (length < 1 || length > 3) {
            throw new Error('Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)');
        } else if (length <= 2 && typeof times === 'function') {
            callback = task;
            task = times;
        }
        if (typeof times !== 'function') {
            parseTimes(opts, times);
        }
        opts.callback = callback;
        opts.task = task;

        function wrappedTask(wrappedCallback, wrappedResults) {
            function retryAttempt(task, finalAttempt) {
                return function(seriesCallback) {
                    task(function(err, result){
                        seriesCallback(!err || finalAttempt, {err: err, result: result});
                    }, wrappedResults);
                };
            }

            function retryInterval(interval){
                return function(seriesCallback){
                    setTimeout(function(){
                        seriesCallback(null);
                    }, interval);
                };
            }

            while (opts.times) {

                var finalAttempt = !(opts.times-=1);
                attempts.push(retryAttempt(opts.task, finalAttempt));
                if(!finalAttempt && opts.interval > 0){
                    attempts.push(retryInterval(opts.interval));
                }
            }

            async.series(attempts, function(done, data){
                data = data[data.length - 1];
                (wrappedCallback || opts.callback)(data.err, data.result);
            });
        }

        // If a callback is passed, run this as a controll flow
        return opts.callback ? wrappedTask() : wrappedTask;
    };

    async.waterfall = function (tasks, callback) {
        callback = _once(callback || noop);
        if (!_isArray(tasks)) {
            var err = new Error('First argument to waterfall must be an array of functions');
            return callback(err);
        }
        if (!tasks.length) {
            return callback();
        }
        function wrapIterator(iterator) {
            return _restParam(function (err, args) {
                if (err) {
                    callback.apply(null, [err].concat(args));
                }
                else {
                    var next = iterator.next();
                    if (next) {
                        args.push(wrapIterator(next));
                    }
                    else {
                        args.push(callback);
                    }
                    ensureAsync(iterator).apply(null, args);
                }
            });
        }
        wrapIterator(async.iterator(tasks))();
    };

    function _parallel(eachfn, tasks, callback) {
        callback = callback || noop;
        var results = _isArrayLike(tasks) ? [] : {};

        eachfn(tasks, function (task, key, callback) {
            task(_restParam(function (err, args) {
                if (args.length <= 1) {
                    args = args[0];
                }
                results[key] = args;
                callback(err);
            }));
        }, function (err) {
            callback(err, results);
        });
    }

    async.parallel = function (tasks, callback) {
        _parallel(async.eachOf, tasks, callback);
    };

    async.parallelLimit = function(tasks, limit, callback) {
        _parallel(_eachOfLimit(limit), tasks, callback);
    };

    async.series = function(tasks, callback) {
        _parallel(async.eachOfSeries, tasks, callback);
    };

    async.iterator = function (tasks) {
        function makeCallback(index) {
            function fn() {
                if (tasks.length) {
                    tasks[index].apply(null, arguments);
                }
                return fn.next();
            }
            fn.next = function () {
                return (index < tasks.length - 1) ? makeCallback(index + 1): null;
            };
            return fn;
        }
        return makeCallback(0);
    };

    async.apply = _restParam(function (fn, args) {
        return _restParam(function (callArgs) {
            return fn.apply(
                null, args.concat(callArgs)
            );
        });
    });

    function _concat(eachfn, arr, fn, callback) {
        var result = [];
        eachfn(arr, function (x, index, cb) {
            fn(x, function (err, y) {
                result = result.concat(y || []);
                cb(err);
            });
        }, function (err) {
            callback(err, result);
        });
    }
    async.concat = doParallel(_concat);
    async.concatSeries = doSeries(_concat);

    async.whilst = function (test, iterator, callback) {
        callback = callback || noop;
        if (test()) {
            var next = _restParam(function(err, args) {
                if (err) {
                    callback(err);
                } else if (test.apply(this, args)) {
                    iterator(next);
                } else {
                    callback.apply(null, [null].concat(args));
                }
            });
            iterator(next);
        } else {
            callback(null);
        }
    };

    async.doWhilst = function (iterator, test, callback) {
        var calls = 0;
        return async.whilst(function() {
            return ++calls <= 1 || test.apply(this, arguments);
        }, iterator, callback);
    };

    async.until = function (test, iterator, callback) {
        return async.whilst(function() {
            return !test.apply(this, arguments);
        }, iterator, callback);
    };

    async.doUntil = function (iterator, test, callback) {
        return async.doWhilst(iterator, function() {
            return !test.apply(this, arguments);
        }, callback);
    };

    async.during = function (test, iterator, callback) {
        callback = callback || noop;

        var next = _restParam(function(err, args) {
            if (err) {
                callback(err);
            } else {
                args.push(check);
                test.apply(this, args);
            }
        });

        var check = function(err, truth) {
            if (err) {
                callback(err);
            } else if (truth) {
                iterator(next);
            } else {
                callback(null);
            }
        };

        test(check);
    };

    async.doDuring = function (iterator, test, callback) {
        var calls = 0;
        async.during(function(next) {
            if (calls++ < 1) {
                next(null, true);
            } else {
                test.apply(this, arguments);
            }
        }, iterator, callback);
    };

    function _queue(worker, concurrency, payload) {
        if (concurrency == null) {
            concurrency = 1;
        }
        else if(concurrency === 0) {
            throw new Error('Concurrency must not be zero');
        }
        function _insert(q, data, pos, callback) {
            if (callback != null && typeof callback !== "function") {
                throw new Error("task callback must be a function");
            }
            q.started = true;
            if (!_isArray(data)) {
                data = [data];
            }
            if(data.length === 0 && q.idle()) {
                // call drain immediately if there are no tasks
                return async.setImmediate(function() {
                    q.drain();
                });
            }
            _arrayEach(data, function(task) {
                var item = {
                    data: task,
                    callback: callback || noop
                };

                if (pos) {
                    q.tasks.unshift(item);
                } else {
                    q.tasks.push(item);
                }

                if (q.tasks.length === q.concurrency) {
                    q.saturated();
                }
            });
            async.setImmediate(q.process);
        }
        function _next(q, tasks) {
            return function(){
                workers -= 1;

                var removed = false;
                var args = arguments;
                _arrayEach(tasks, function (task) {
                    _arrayEach(workersList, function (worker, index) {
                        if (worker === task && !removed) {
                            workersList.splice(index, 1);
                            removed = true;
                        }
                    });

                    task.callback.apply(task, args);
                });
                if (q.tasks.length + workers === 0) {
                    q.drain();
                }
                q.process();
            };
        }

        var workers = 0;
        var workersList = [];
        var q = {
            tasks: [],
            concurrency: concurrency,
            payload: payload,
            saturated: noop,
            empty: noop,
            drain: noop,
            started: false,
            paused: false,
            push: function (data, callback) {
                _insert(q, data, false, callback);
            },
            kill: function () {
                q.drain = noop;
                q.tasks = [];
            },
            unshift: function (data, callback) {
                _insert(q, data, true, callback);
            },
            process: function () {
                while(!q.paused && workers < q.concurrency && q.tasks.length){

                    var tasks = q.payload ?
                        q.tasks.splice(0, q.payload) :
                        q.tasks.splice(0, q.tasks.length);

                    var data = _map(tasks, function (task) {
                        return task.data;
                    });

                    if (q.tasks.length === 0) {
                        q.empty();
                    }
                    workers += 1;
                    workersList.push(tasks[0]);
                    var cb = only_once(_next(q, tasks));
                    worker(data, cb);
                }
            },
            length: function () {
                return q.tasks.length;
            },
            running: function () {
                return workers;
            },
            workersList: function () {
                return workersList;
            },
            idle: function() {
                return q.tasks.length + workers === 0;
            },
            pause: function () {
                q.paused = true;
            },
            resume: function () {
                if (q.paused === false) { return; }
                q.paused = false;
                var resumeCount = Math.min(q.concurrency, q.tasks.length);
                // Need to call q.process once per concurrent
                // worker to preserve full concurrency after pause
                for (var w = 1; w <= resumeCount; w++) {
                    async.setImmediate(q.process);
                }
            }
        };
        return q;
    }

    async.queue = function (worker, concurrency) {
        var q = _queue(function (items, cb) {
            worker(items[0], cb);
        }, concurrency, 1);

        return q;
    };

    async.priorityQueue = function (worker, concurrency) {

        function _compareTasks(a, b){
            return a.priority - b.priority;
        }

        function _binarySearch(sequence, item, compare) {
            var beg = -1,
                end = sequence.length - 1;
            while (beg < end) {
                var mid = beg + ((end - beg + 1) >>> 1);
                if (compare(item, sequence[mid]) >= 0) {
                    beg = mid;
                } else {
                    end = mid - 1;
                }
            }
            return beg;
        }

        function _insert(q, data, priority, callback) {
            if (callback != null && typeof callback !== "function") {
                throw new Error("task callback must be a function");
            }
            q.started = true;
            if (!_isArray(data)) {
                data = [data];
            }
            if(data.length === 0) {
                // call drain immediately if there are no tasks
                return async.setImmediate(function() {
                    q.drain();
                });
            }
            _arrayEach(data, function(task) {
                var item = {
                    data: task,
                    priority: priority,
                    callback: typeof callback === 'function' ? callback : noop
                };

                q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);

                if (q.tasks.length === q.concurrency) {
                    q.saturated();
                }
                async.setImmediate(q.process);
            });
        }

        // Start with a normal queue
        var q = async.queue(worker, concurrency);

        // Override push to accept second parameter representing priority
        q.push = function (data, priority, callback) {
            _insert(q, data, priority, callback);
        };

        // Remove unshift function
        delete q.unshift;

        return q;
    };

    async.cargo = function (worker, payload) {
        return _queue(worker, 1, payload);
    };

    function _console_fn(name) {
        return _restParam(function (fn, args) {
            fn.apply(null, args.concat([_restParam(function (err, args) {
                if (typeof console === 'object') {
                    if (err) {
                        if (console.error) {
                            console.error(err);
                        }
                    }
                    else if (console[name]) {
                        _arrayEach(args, function (x) {
                            console[name](x);
                        });
                    }
                }
            })]));
        });
    }
    async.log = _console_fn('log');
    async.dir = _console_fn('dir');
    /*async.info = _console_fn('info');
    async.warn = _console_fn('warn');
    async.error = _console_fn('error');*/

    async.memoize = function (fn, hasher) {
        var memo = {};
        var queues = {};
        var has = Object.prototype.hasOwnProperty;
        hasher = hasher || identity;
        var memoized = _restParam(function memoized(args) {
            var callback = args.pop();
            var key = hasher.apply(null, args);
            if (has.call(memo, key)) {   
                async.setImmediate(function () {
                    callback.apply(null, memo[key]);
                });
            }
            else if (has.call(queues, key)) {
                queues[key].push(callback);
            }
            else {
                queues[key] = [callback];
                fn.apply(null, args.concat([_restParam(function (args) {
                    memo[key] = args;
                    var q = queues[key];
                    delete queues[key];
                    for (var i = 0, l = q.length; i < l; i++) {
                        q[i].apply(null, args);
                    }
                })]));
            }
        });
        memoized.memo = memo;
        memoized.unmemoized = fn;
        return memoized;
    };

    async.unmemoize = function (fn) {
        return function () {
            return (fn.unmemoized || fn).apply(null, arguments);
        };
    };

    function _times(mapper) {
        return function (count, iterator, callback) {
            mapper(_range(count), iterator, callback);
        };
    }

    async.times = _times(async.map);
    async.timesSeries = _times(async.mapSeries);
    async.timesLimit = function (count, limit, iterator, callback) {
        return async.mapLimit(_range(count), limit, iterator, callback);
    };

    async.seq = function (/* functions... */) {
        var fns = arguments;
        return _restParam(function (args) {
            var that = this;

            var callback = args[args.length - 1];
            if (typeof callback == 'function') {
                args.pop();
            } else {
                callback = noop;
            }

            async.reduce(fns, args, function (newargs, fn, cb) {
                fn.apply(that, newargs.concat([_restParam(function (err, nextargs) {
                    cb(err, nextargs);
                })]));
            },
            function (err, results) {
                callback.apply(that, [err].concat(results));
            });
        });
    };

    async.compose = function (/* functions... */) {
        return async.seq.apply(null, Array.prototype.reverse.call(arguments));
    };


    function _applyEach(eachfn) {
        return _restParam(function(fns, args) {
            var go = _restParam(function(args) {
                var that = this;
                var callback = args.pop();
                return eachfn(fns, function (fn, _, cb) {
                    fn.apply(that, args.concat([cb]));
                },
                callback);
            });
            if (args.length) {
                return go.apply(this, args);
            }
            else {
                return go;
            }
        });
    }

    async.applyEach = _applyEach(async.eachOf);
    async.applyEachSeries = _applyEach(async.eachOfSeries);


    async.forever = function (fn, callback) {
        var done = only_once(callback || noop);
        var task = ensureAsync(fn);
        function next(err) {
            if (err) {
                return done(err);
            }
            task(next);
        }
        next();
    };

    function ensureAsync(fn) {
        return _restParam(function (args) {
            var callback = args.pop();
            args.push(function () {
                var innerArgs = arguments;
                if (sync) {
                    async.setImmediate(function () {
                        callback.apply(null, innerArgs);
                    });
                } else {
                    callback.apply(null, innerArgs);
                }
            });
            var sync = true;
            fn.apply(this, args);
            sync = false;
        });
    }

    async.ensureAsync = ensureAsync;

    async.constant = _restParam(function(values) {
        var args = [null].concat(values);
        return function (callback) {
            return callback.apply(this, args);
        };
    });

    async.wrapSync =
    async.asyncify = function asyncify(func) {
        return _restParam(function (args) {
            var callback = args.pop();
            var result;
            try {
                result = func.apply(this, args);
            } catch (e) {
                return callback(e);
            }
            // if result is Promise object
            if (_isObject(result) && typeof result.then === "function") {
                result.then(function(value) {
                    callback(null, value);
                })["catch"](function(err) {
                    callback(err.message ? err : new Error(err));
                });
            } else {
                callback(null, result);
            }
        });
    };

    // Node.js
    if (typeof module === 'object' && module.exports) {
        module.exports = async;
    }
    // AMD / RequireJS
    else if (typeof define === 'function' && define.amd) {
        define([], function () {
            return async;
        });
    }
    // included directly via <script> tag
    else {
        root.async = async;
    }

}());

}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate)
},{"_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","timers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/timers-browserify/main.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/base64-js/index.js":[function(require,module,exports){
'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function getLens (b64) {
  var len = b64.length

  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // Trim off extra bytes after placeholder bytes are found
  // See: https://github.com/beatgammit/base64-js/issues/42
  var validLen = b64.indexOf('=')
  if (validLen === -1) validLen = len

  var placeHoldersLen = validLen === len
    ? 0
    : 4 - (validLen % 4)

  return [validLen, placeHoldersLen]
}

// base64 is 4/3 + up to two characters of the original data
function byteLength (b64) {
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function _byteLength (b64, validLen, placeHoldersLen) {
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function toByteArray (b64) {
  var tmp
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]

  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))

  var curByte = 0

  // if there are placeholders, only get up to the last complete 4 chars
  var len = placeHoldersLen > 0
    ? validLen - 4
    : validLen

  var i
  for (i = 0; i < len; i += 4) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 18) |
      (revLookup[b64.charCodeAt(i + 1)] << 12) |
      (revLookup[b64.charCodeAt(i + 2)] << 6) |
      revLookup[b64.charCodeAt(i + 3)]
    arr[curByte++] = (tmp >> 16) & 0xFF
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 2) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 2) |
      (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 1) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 10) |
      (revLookup[b64.charCodeAt(i + 1)] << 4) |
      (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] +
    lookup[num >> 12 & 0x3F] +
    lookup[num >> 6 & 0x3F] +
    lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp =
      ((uint8[i] << 16) & 0xFF0000) +
      ((uint8[i + 1] << 8) & 0xFF00) +
      (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    parts.push(
      lookup[tmp >> 2] +
      lookup[(tmp << 4) & 0x3F] +
      '=='
    )
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + uint8[len - 1]
    parts.push(
      lookup[tmp >> 10] +
      lookup[(tmp >> 4) & 0x3F] +
      lookup[(tmp << 2) & 0x3F] +
      '='
    )
  }

  return parts.join('')
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/base64url/dist/base64url.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var pad_string_1 = require("./pad-string");
function encode(input, encoding) {
    if (encoding === void 0) { encoding = "utf8"; }
    if (Buffer.isBuffer(input)) {
        return fromBase64(input.toString("base64"));
    }
    return fromBase64(Buffer.from(input, encoding).toString("base64"));
}
;
function decode(base64url, encoding) {
    if (encoding === void 0) { encoding = "utf8"; }
    return Buffer.from(toBase64(base64url), "base64").toString(encoding);
}
function toBase64(base64url) {
    base64url = base64url.toString();
    return pad_string_1.default(base64url)
        .replace(/\-/g, "+")
        .replace(/_/g, "/");
}
function fromBase64(base64) {
    return base64
        .replace(/=/g, "")
        .replace(/\+/g, "-")
        .replace(/\//g, "_");
}
function toBuffer(base64url) {
    return Buffer.from(toBase64(base64url), "base64");
}
var base64url = encode;
base64url.encode = encode;
base64url.decode = decode;
base64url.toBase64 = toBase64;
base64url.fromBase64 = fromBase64;
base64url.toBuffer = toBuffer;
exports.default = base64url;

}).call(this)}).call(this,require("buffer").Buffer)
},{"./pad-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/base64url/dist/pad-string.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/base64url/dist/pad-string.js":[function(require,module,exports){
(function (Buffer){(function (){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function padString(input) {
    var segmentLength = 4;
    var stringLength = input.length;
    var diff = stringLength % segmentLength;
    if (!diff) {
        return input;
    }
    var position = stringLength;
    var padLength = segmentLength - diff;
    var paddedStringLength = stringLength + padLength;
    var buffer = Buffer.alloc(paddedStringLength);
    buffer.write(input);
    while (padLength--) {
        buffer.write("=", position++);
    }
    return buffer.toString();
}
exports.default = padString;

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/base64url/index.js":[function(require,module,exports){
module.exports = require('./dist/base64url').default;
module.exports.default = module.exports;

},{"./dist/base64url":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/base64url/dist/base64url.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/bignumber.js/bignumber.js":[function(require,module,exports){
;(function (globalObject) {
  'use strict';

/*
 *      bignumber.js v7.2.1
 *      A JavaScript library for arbitrary-precision arithmetic.
 *      https://github.com/MikeMcl/bignumber.js
 *      Copyright (c) 2018 Michael Mclaughlin <M8ch88l@gmail.com>
 *      MIT Licensed.
 *
 *      BigNumber.prototype methods     |  BigNumber methods
 *                                      |
 *      absoluteValue            abs    |  clone
 *      comparedTo                      |  config               set
 *      decimalPlaces            dp     |      DECIMAL_PLACES
 *      dividedBy                div    |      ROUNDING_MODE
 *      dividedToIntegerBy       idiv   |      EXPONENTIAL_AT
 *      exponentiatedBy          pow    |      RANGE
 *      integerValue                    |      CRYPTO
 *      isEqualTo                eq     |      MODULO_MODE
 *      isFinite                        |      POW_PRECISION
 *      isGreaterThan            gt     |      FORMAT
 *      isGreaterThanOrEqualTo   gte    |      ALPHABET
 *      isInteger                       |  isBigNumber
 *      isLessThan               lt     |  maximum              max
 *      isLessThanOrEqualTo      lte    |  minimum              min
 *      isNaN                           |  random
 *      isNegative                      |
 *      isPositive                      |
 *      isZero                          |
 *      minus                           |
 *      modulo                   mod    |
 *      multipliedBy             times  |
 *      negated                         |
 *      plus                            |
 *      precision                sd     |
 *      shiftedBy                       |
 *      squareRoot               sqrt   |
 *      toExponential                   |
 *      toFixed                         |
 *      toFormat                        |
 *      toFraction                      |
 *      toJSON                          |
 *      toNumber                        |
 *      toPrecision                     |
 *      toString                        |
 *      valueOf                         |
 *
 */


  var BigNumber,
    isNumeric = /^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,

    mathceil = Math.ceil,
    mathfloor = Math.floor,

    bignumberError = '[BigNumber Error] ',
    tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ',

    BASE = 1e14,
    LOG_BASE = 14,
    MAX_SAFE_INTEGER = 0x1fffffffffffff,         // 2^53 - 1
    // MAX_INT32 = 0x7fffffff,                   // 2^31 - 1
    POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],
    SQRT_BASE = 1e7,

    // EDITABLE
    // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and
    // the arguments to toExponential, toFixed, toFormat, and toPrecision.
    MAX = 1E9;                                   // 0 to MAX_INT32


  /*
   * Create and return a BigNumber constructor.
   */
  function clone(configObject) {
    var div, convertBase, parseNumeric,
      P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null },
      ONE = new BigNumber(1),


      //----------------------------- EDITABLE CONFIG DEFAULTS -------------------------------


      // The default values below must be integers within the inclusive ranges stated.
      // The values can also be changed at run-time using BigNumber.set.

      // The maximum number of decimal places for operations involving division.
      DECIMAL_PLACES = 20,                     // 0 to MAX

      // The rounding mode used when rounding to the above decimal places, and when using
      // toExponential, toFixed, toFormat and toPrecision, and round (default value).
      // UP         0 Away from zero.
      // DOWN       1 Towards zero.
      // CEIL       2 Towards +Infinity.
      // FLOOR      3 Towards -Infinity.
      // HALF_UP    4 Towards nearest neighbour. If equidistant, up.
      // HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.
      // HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.
      // HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.
      // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.
      ROUNDING_MODE = 4,                       // 0 to 8

      // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]

      // The exponent value at and beneath which toString returns exponential notation.
      // Number type: -7
      TO_EXP_NEG = -7,                         // 0 to -MAX

      // The exponent value at and above which toString returns exponential notation.
      // Number type: 21
      TO_EXP_POS = 21,                         // 0 to MAX

      // RANGE : [MIN_EXP, MAX_EXP]

      // The minimum exponent value, beneath which underflow to zero occurs.
      // Number type: -324  (5e-324)
      MIN_EXP = -1e7,                          // -1 to -MAX

      // The maximum exponent value, above which overflow to Infinity occurs.
      // Number type:  308  (1.7976931348623157e+308)
      // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.
      MAX_EXP = 1e7,                           // 1 to MAX

      // Whether to use cryptographically-secure random number generation, if available.
      CRYPTO = false,                          // true or false

      // The modulo mode used when calculating the modulus: a mod n.
      // The quotient (q = a / n) is calculated according to the corresponding rounding mode.
      // The remainder (r) is calculated as: r = a - n * q.
      //
      // UP        0 The remainder is positive if the dividend is negative, else is negative.
      // DOWN      1 The remainder has the same sign as the dividend.
      //             This modulo mode is commonly known as 'truncated division' and is
      //             equivalent to (a % n) in JavaScript.
      // FLOOR     3 The remainder has the same sign as the divisor (Python %).
      // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.
      // EUCLID    9 Euclidian division. q = sign(n) * floor(a / abs(n)).
      //             The remainder is always positive.
      //
      // The truncated division, floored division, Euclidian division and IEEE 754 remainder
      // modes are commonly used for the modulus operation.
      // Although the other rounding modes can also be used, they may not give useful results.
      MODULO_MODE = 1,                         // 0 to 9

      // The maximum number of significant digits of the result of the exponentiatedBy operation.
      // If POW_PRECISION is 0, there will be unlimited significant digits.
      POW_PRECISION = 0,                    // 0 to MAX

      // The format specification used by the BigNumber.prototype.toFormat method.
      FORMAT = {
        decimalSeparator: '.',
        groupSeparator: ',',
        groupSize: 3,
        secondaryGroupSize: 0,
        fractionGroupSeparator: '\xA0',      // non-breaking space
        fractionGroupSize: 0
      },

      // The alphabet used for base conversion.
      // It must be at least 2 characters long, with no '.' or repeated character.
      // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'
      ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz';


    //------------------------------------------------------------------------------------------


    // CONSTRUCTOR


    /*
     * The BigNumber constructor and exported function.
     * Create and return a new instance of a BigNumber object.
     *
     * n {number|string|BigNumber} A numeric value.
     * [b] {number} The base of n. Integer, 2 to ALPHABET.length inclusive.
     */
    function BigNumber(n, b) {
      var alphabet, c, caseChanged, e, i, isNum, len, str,
        x = this;

      // Enable constructor usage without new.
      if (!(x instanceof BigNumber)) {

        // Don't throw on constructor call without new (#81).
        // '[BigNumber Error] Constructor call without new: {n}'
        //throw Error(bignumberError + ' Constructor call without new: ' + n);
        return new BigNumber(n, b);
      }

      if (b == null) {

        // Duplicate.
        if (n instanceof BigNumber) {
          x.s = n.s;
          x.e = n.e;
          x.c = (n = n.c) ? n.slice() : n;
          return;
        }

        isNum = typeof n == 'number';

        if (isNum && n * 0 == 0) {

          // Use `1 / n` to handle minus zero also.
          x.s = 1 / n < 0 ? (n = -n, -1) : 1;

          // Faster path for integers.
          if (n === ~~n) {
            for (e = 0, i = n; i >= 10; i /= 10, e++);
            x.e = e;
            x.c = [n];
            return;
          }

          str = n + '';
        } else {
          if (!isNumeric.test(str = n + '')) return parseNumeric(x, str, isNum);
          x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;
        }

        // Decimal point?
        if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');

        // Exponential form?
        if ((i = str.search(/e/i)) > 0) {

          // Determine exponent.
          if (e < 0) e = i;
          e += +str.slice(i + 1);
          str = str.substring(0, i);
        } else if (e < 0) {

          // Integer.
          e = str.length;
        }

      } else {

        // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'
        intCheck(b, 2, ALPHABET.length, 'Base');
        str = n + '';

        // Allow exponential notation to be used with base 10 argument, while
        // also rounding to DECIMAL_PLACES as with other bases.
        if (b == 10) {
          x = new BigNumber(n instanceof BigNumber ? n : str);
          return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE);
        }

        isNum = typeof n == 'number';

        if (isNum) {

          // Avoid potential interpretation of Infinity and NaN as base 44+ values.
          if (n * 0 != 0) return parseNumeric(x, str, isNum, b);

          x.s = 1 / n < 0 ? (str = str.slice(1), -1) : 1;

          // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'
          if (BigNumber.DEBUG && str.replace(/^0\.0*|\./, '').length > 15) {
            throw Error
             (tooManyDigits + n);
          }

          // Prevent later check for length on converted number.
          isNum = false;
        } else {
          x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;
        }

        alphabet = ALPHABET.slice(0, b);
        e = i = 0;

        // Check that str is a valid base b number.
        // Don't use RegExp so alphabet can contain special characters.
        for (len = str.length; i < len; i++) {
          if (alphabet.indexOf(c = str.charAt(i)) < 0) {
            if (c == '.') {

              // If '.' is not the first character and it has not be found before.
              if (i > e) {
                e = len;
                continue;
              }
            } else if (!caseChanged) {

              // Allow e.g. hexadecimal 'FF' as well as 'ff'.
              if (str == str.toUpperCase() && (str = str.toLowerCase()) ||
                  str == str.toLowerCase() && (str = str.toUpperCase())) {
                caseChanged = true;
                i = -1;
                e = 0;
                continue;
              }
            }

            return parseNumeric(x, n + '', isNum, b);
          }
        }

        str = convertBase(str, b, 10, x.s);

        // Decimal point?
        if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');
        else e = str.length;
      }

      // Determine leading zeros.
      for (i = 0; str.charCodeAt(i) === 48; i++);

      // Determine trailing zeros.
      for (len = str.length; str.charCodeAt(--len) === 48;);

      str = str.slice(i, ++len);

      if (str) {
        len -= i;

        // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'
        if (isNum && BigNumber.DEBUG &&
          len > 15 && (n > MAX_SAFE_INTEGER || n !== mathfloor(n))) {
            throw Error
             (tooManyDigits + (x.s * n));
        }

        e = e - i - 1;

         // Overflow?
        if (e > MAX_EXP) {

          // Infinity.
          x.c = x.e = null;

        // Underflow?
        } else if (e < MIN_EXP) {

          // Zero.
          x.c = [x.e = 0];
        } else {
          x.e = e;
          x.c = [];

          // Transform base

          // e is the base 10 exponent.
          // i is where to slice str to get the first element of the coefficient array.
          i = (e + 1) % LOG_BASE;
          if (e < 0) i += LOG_BASE;

          if (i < len) {
            if (i) x.c.push(+str.slice(0, i));

            for (len -= LOG_BASE; i < len;) {
              x.c.push(+str.slice(i, i += LOG_BASE));
            }

            str = str.slice(i);
            i = LOG_BASE - str.length;
          } else {
            i -= len;
          }

          for (; i--; str += '0');
          x.c.push(+str);
        }
      } else {

        // Zero.
        x.c = [x.e = 0];
      }
    }


    // CONSTRUCTOR PROPERTIES


    BigNumber.clone = clone;

    BigNumber.ROUND_UP = 0;
    BigNumber.ROUND_DOWN = 1;
    BigNumber.ROUND_CEIL = 2;
    BigNumber.ROUND_FLOOR = 3;
    BigNumber.ROUND_HALF_UP = 4;
    BigNumber.ROUND_HALF_DOWN = 5;
    BigNumber.ROUND_HALF_EVEN = 6;
    BigNumber.ROUND_HALF_CEIL = 7;
    BigNumber.ROUND_HALF_FLOOR = 8;
    BigNumber.EUCLID = 9;


    /*
     * Configure infrequently-changing library-wide settings.
     *
     * Accept an object with the following optional properties (if the value of a property is
     * a number, it must be an integer within the inclusive range stated):
     *
     *   DECIMAL_PLACES   {number}           0 to MAX
     *   ROUNDING_MODE    {number}           0 to 8
     *   EXPONENTIAL_AT   {number|number[]}  -MAX to MAX  or  [-MAX to 0, 0 to MAX]
     *   RANGE            {number|number[]}  -MAX to MAX (not zero)  or  [-MAX to -1, 1 to MAX]
     *   CRYPTO           {boolean}          true or false
     *   MODULO_MODE      {number}           0 to 9
     *   POW_PRECISION       {number}           0 to MAX
     *   ALPHABET         {string}           A string of two or more unique characters which does
     *                                       not contain '.'.
     *   FORMAT           {object}           An object with some of the following properties:
     *      decimalSeparator       {string}
     *      groupSeparator         {string}
     *      groupSize              {number}
     *      secondaryGroupSize     {number}
     *      fractionGroupSeparator {string}
     *      fractionGroupSize      {number}
     *
     * (The values assigned to the above FORMAT object properties are not checked for validity.)
     *
     * E.g.
     * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })
     *
     * Ignore properties/parameters set to null or undefined, except for ALPHABET.
     *
     * Return an object with the properties current values.
     */
    BigNumber.config = BigNumber.set = function (obj) {
      var p, v;

      if (obj != null) {

        if (typeof obj == 'object') {

          // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.
          // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}'
          if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) {
            v = obj[p];
            intCheck(v, 0, MAX, p);
            DECIMAL_PLACES = v;
          }

          // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.
          // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}'
          if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) {
            v = obj[p];
            intCheck(v, 0, 8, p);
            ROUNDING_MODE = v;
          }

          // EXPONENTIAL_AT {number|number[]}
          // Integer, -MAX to MAX inclusive or
          // [integer -MAX to 0 inclusive, 0 to MAX inclusive].
          // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}'
          if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) {
            v = obj[p];
            if (isArray(v)) {
              intCheck(v[0], -MAX, 0, p);
              intCheck(v[1], 0, MAX, p);
              TO_EXP_NEG = v[0];
              TO_EXP_POS = v[1];
            } else {
              intCheck(v, -MAX, MAX, p);
              TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);
            }
          }

          // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or
          // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].
          // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}'
          if (obj.hasOwnProperty(p = 'RANGE')) {
            v = obj[p];
            if (isArray(v)) {
              intCheck(v[0], -MAX, -1, p);
              intCheck(v[1], 1, MAX, p);
              MIN_EXP = v[0];
              MAX_EXP = v[1];
            } else {
              intCheck(v, -MAX, MAX, p);
              if (v) {
                MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);
              } else {
                throw Error
                 (bignumberError + p + ' cannot be zero: ' + v);
              }
            }
          }

          // CRYPTO {boolean} true or false.
          // '[BigNumber Error] CRYPTO not true or false: {v}'
          // '[BigNumber Error] crypto unavailable'
          if (obj.hasOwnProperty(p = 'CRYPTO')) {
            v = obj[p];
            if (v === !!v) {
              if (v) {
                if (typeof crypto != 'undefined' && crypto &&
                 (crypto.getRandomValues || crypto.randomBytes)) {
                  CRYPTO = v;
                } else {
                  CRYPTO = !v;
                  throw Error
                   (bignumberError + 'crypto unavailable');
                }
              } else {
                CRYPTO = v;
              }
            } else {
              throw Error
               (bignumberError + p + ' not true or false: ' + v);
            }
          }

          // MODULO_MODE {number} Integer, 0 to 9 inclusive.
          // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}'
          if (obj.hasOwnProperty(p = 'MODULO_MODE')) {
            v = obj[p];
            intCheck(v, 0, 9, p);
            MODULO_MODE = v;
          }

          // POW_PRECISION {number} Integer, 0 to MAX inclusive.
          // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}'
          if (obj.hasOwnProperty(p = 'POW_PRECISION')) {
            v = obj[p];
            intCheck(v, 0, MAX, p);
            POW_PRECISION = v;
          }

          // FORMAT {object}
          // '[BigNumber Error] FORMAT not an object: {v}'
          if (obj.hasOwnProperty(p = 'FORMAT')) {
            v = obj[p];
            if (typeof v == 'object') FORMAT = v;
            else throw Error
             (bignumberError + p + ' not an object: ' + v);
          }

          // ALPHABET {string}
          // '[BigNumber Error] ALPHABET invalid: {v}'
          if (obj.hasOwnProperty(p = 'ALPHABET')) {
            v = obj[p];

            // Disallow if only one character, or contains '.' or a repeated character.
            if (typeof v == 'string' && !/^.$|\.|(.).*\1/.test(v)) {
              ALPHABET = v;
            } else {
              throw Error
               (bignumberError + p + ' invalid: ' + v);
            }
          }

        } else {

          // '[BigNumber Error] Object expected: {v}'
          throw Error
           (bignumberError + 'Object expected: ' + obj);
        }
      }

      return {
        DECIMAL_PLACES: DECIMAL_PLACES,
        ROUNDING_MODE: ROUNDING_MODE,
        EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],
        RANGE: [MIN_EXP, MAX_EXP],
        CRYPTO: CRYPTO,
        MODULO_MODE: MODULO_MODE,
        POW_PRECISION: POW_PRECISION,
        FORMAT: FORMAT,
        ALPHABET: ALPHABET
      };
    };


    /*
     * Return true if v is a BigNumber instance, otherwise return false.
     *
     * v {any}
     */
    BigNumber.isBigNumber = function (v) {
      return v instanceof BigNumber || v && v._isBigNumber === true || false;
    };


    /*
     * Return a new BigNumber whose value is the maximum of the arguments.
     *
     * arguments {number|string|BigNumber}
     */
    BigNumber.maximum = BigNumber.max = function () {
      return maxOrMin(arguments, P.lt);
    };


    /*
     * Return a new BigNumber whose value is the minimum of the arguments.
     *
     * arguments {number|string|BigNumber}
     */
    BigNumber.minimum = BigNumber.min = function () {
      return maxOrMin(arguments, P.gt);
    };


    /*
     * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,
     * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing
     * zeros are produced).
     *
     * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.
     *
     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}'
     * '[BigNumber Error] crypto unavailable'
     */
    BigNumber.random = (function () {
      var pow2_53 = 0x20000000000000;

      // Return a 53 bit integer n, where 0 <= n < 9007199254740992.
      // Check if Math.random() produces more than 32 bits of randomness.
      // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.
      // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.
      var random53bitInt = (Math.random() * pow2_53) & 0x1fffff
       ? function () { return mathfloor(Math.random() * pow2_53); }
       : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +
         (Math.random() * 0x800000 | 0); };

      return function (dp) {
        var a, b, e, k, v,
          i = 0,
          c = [],
          rand = new BigNumber(ONE);

        if (dp == null) dp = DECIMAL_PLACES;
        else intCheck(dp, 0, MAX);

        k = mathceil(dp / LOG_BASE);

        if (CRYPTO) {

          // Browsers supporting crypto.getRandomValues.
          if (crypto.getRandomValues) {

            a = crypto.getRandomValues(new Uint32Array(k *= 2));

            for (; i < k;) {

              // 53 bits:
              // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)
              // 11111 11111111 11111111 11111111 11100000 00000000 00000000
              // ((Math.pow(2, 32) - 1) >>> 11).toString(2)
              //                                     11111 11111111 11111111
              // 0x20000 is 2^21.
              v = a[i] * 0x20000 + (a[i + 1] >>> 11);

              // Rejection sampling:
              // 0 <= v < 9007199254740992
              // Probability that v >= 9e15, is
              // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251
              if (v >= 9e15) {
                b = crypto.getRandomValues(new Uint32Array(2));
                a[i] = b[0];
                a[i + 1] = b[1];
              } else {

                // 0 <= v <= 8999999999999999
                // 0 <= (v % 1e14) <= 99999999999999
                c.push(v % 1e14);
                i += 2;
              }
            }
            i = k / 2;

          // Node.js supporting crypto.randomBytes.
          } else if (crypto.randomBytes) {

            // buffer
            a = crypto.randomBytes(k *= 7);

            for (; i < k;) {

              // 0x1000000000000 is 2^48, 0x10000000000 is 2^40
              // 0x100000000 is 2^32, 0x1000000 is 2^24
              // 11111 11111111 11111111 11111111 11111111 11111111 11111111
              // 0 <= v < 9007199254740992
              v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) +
                 (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) +
                 (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];

              if (v >= 9e15) {
                crypto.randomBytes(7).copy(a, i);
              } else {

                // 0 <= (v % 1e14) <= 99999999999999
                c.push(v % 1e14);
                i += 7;
              }
            }
            i = k / 7;
          } else {
            CRYPTO = false;
            throw Error
             (bignumberError + 'crypto unavailable');
          }
        }

        // Use Math.random.
        if (!CRYPTO) {

          for (; i < k;) {
            v = random53bitInt();
            if (v < 9e15) c[i++] = v % 1e14;
          }
        }

        k = c[--i];
        dp %= LOG_BASE;

        // Convert trailing digits to zeros according to dp.
        if (k && dp) {
          v = POWS_TEN[LOG_BASE - dp];
          c[i] = mathfloor(k / v) * v;
        }

        // Remove trailing elements which are zero.
        for (; c[i] === 0; c.pop(), i--);

        // Zero?
        if (i < 0) {
          c = [e = 0];
        } else {

          // Remove leading elements which are zero and adjust exponent accordingly.
          for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE);

          // Count the digits of the first element of c to determine leading zeros, and...
          for (i = 1, v = c[0]; v >= 10; v /= 10, i++);

          // adjust the exponent accordingly.
          if (i < LOG_BASE) e -= LOG_BASE - i;
        }

        rand.e = e;
        rand.c = c;
        return rand;
      };
    })();


    // PRIVATE FUNCTIONS


    // Called by BigNumber and BigNumber.prototype.toString.
    convertBase = (function () {
      var decimal = '0123456789';

      /*
       * Convert string of baseIn to an array of numbers of baseOut.
       * Eg. toBaseOut('255', 10, 16) returns [15, 15].
       * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5].
       */
      function toBaseOut(str, baseIn, baseOut, alphabet) {
        var j,
          arr = [0],
          arrL,
          i = 0,
          len = str.length;

        for (; i < len;) {
          for (arrL = arr.length; arrL--; arr[arrL] *= baseIn);

          arr[0] += alphabet.indexOf(str.charAt(i++));

          for (j = 0; j < arr.length; j++) {

            if (arr[j] > baseOut - 1) {
              if (arr[j + 1] == null) arr[j + 1] = 0;
              arr[j + 1] += arr[j] / baseOut | 0;
              arr[j] %= baseOut;
            }
          }
        }

        return arr.reverse();
      }

      // Convert a numeric string of baseIn to a numeric string of baseOut.
      // If the caller is toString, we are converting from base 10 to baseOut.
      // If the caller is BigNumber, we are converting from baseIn to base 10.
      return function (str, baseIn, baseOut, sign, callerIsToString) {
        var alphabet, d, e, k, r, x, xc, y,
          i = str.indexOf('.'),
          dp = DECIMAL_PLACES,
          rm = ROUNDING_MODE;

        // Non-integer.
        if (i >= 0) {
          k = POW_PRECISION;

          // Unlimited precision.
          POW_PRECISION = 0;
          str = str.replace('.', '');
          y = new BigNumber(baseIn);
          x = y.pow(str.length - i);
          POW_PRECISION = k;

          // Convert str as if an integer, then restore the fraction part by dividing the
          // result by its base raised to a power.

          y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'),
           10, baseOut, decimal);
          y.e = y.c.length;
        }

        // Convert the number as integer.

        xc = toBaseOut(str, baseIn, baseOut, callerIsToString
         ? (alphabet = ALPHABET, decimal)
         : (alphabet = decimal, ALPHABET));

        // xc now represents str as an integer and converted to baseOut. e is the exponent.
        e = k = xc.length;

        // Remove trailing zeros.
        for (; xc[--k] == 0; xc.pop());

        // Zero?
        if (!xc[0]) return alphabet.charAt(0);

        // Does str represent an integer? If so, no need for the division.
        if (i < 0) {
          --e;
        } else {
          x.c = xc;
          x.e = e;

          // The sign is needed for correct rounding.
          x.s = sign;
          x = div(x, y, dp, rm, baseOut);
          xc = x.c;
          r = x.r;
          e = x.e;
        }

        // xc now represents str converted to baseOut.

        // THe index of the rounding digit.
        d = e + dp + 1;

        // The rounding digit: the digit to the right of the digit that may be rounded up.
        i = xc[d];

        // Look at the rounding digits and mode to determine whether to round up.

        k = baseOut / 2;
        r = r || d < 0 || xc[d + 1] != null;

        r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))
              : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||
               rm == (x.s < 0 ? 8 : 7));

        // If the index of the rounding digit is not greater than zero, or xc represents
        // zero, then the result of the base conversion is zero or, if rounding up, a value
        // such as 0.00001.
        if (d < 1 || !xc[0]) {

          // 1^-dp or 0
          str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0))
              : alphabet.charAt(0);
        } else {

          // Truncate xc to the required number of decimal places.
          xc.length = d;

          // Round up?
          if (r) {

            // Rounding up may mean the previous digit has to be rounded up and so on.
            for (--baseOut; ++xc[--d] > baseOut;) {
              xc[d] = 0;

              if (!d) {
                ++e;
                xc = [1].concat(xc);
              }
            }
          }

          // Determine trailing zeros.
          for (k = xc.length; !xc[--k];);

          // E.g. [4, 11, 15] becomes 4bf.
          for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++]));

          // Add leading zeros, decimal point and trailing zeros as required.
          str = toFixedPoint(str, e, alphabet.charAt(0));
        }

        // The caller will add the sign.
        return str;
      };
    })();


    // Perform division in the specified base. Called by div and convertBase.
    div = (function () {

      // Assume non-zero x and k.
      function multiply(x, k, base) {
        var m, temp, xlo, xhi,
          carry = 0,
          i = x.length,
          klo = k % SQRT_BASE,
          khi = k / SQRT_BASE | 0;

        for (x = x.slice(); i--;) {
          xlo = x[i] % SQRT_BASE;
          xhi = x[i] / SQRT_BASE | 0;
          m = khi * xlo + xhi * klo;
          temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry;
          carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;
          x[i] = temp % base;
        }

        if (carry) x = [carry].concat(x);

        return x;
      }

      function compare(a, b, aL, bL) {
        var i, cmp;

        if (aL != bL) {
          cmp = aL > bL ? 1 : -1;
        } else {

          for (i = cmp = 0; i < aL; i++) {

            if (a[i] != b[i]) {
              cmp = a[i] > b[i] ? 1 : -1;
              break;
            }
          }
        }

        return cmp;
      }

      function subtract(a, b, aL, base) {
        var i = 0;

        // Subtract b from a.
        for (; aL--;) {
          a[aL] -= i;
          i = a[aL] < b[aL] ? 1 : 0;
          a[aL] = i * base + a[aL] - b[aL];
        }

        // Remove leading zeros.
        for (; !a[0] && a.length > 1; a.splice(0, 1));
      }

      // x: dividend, y: divisor.
      return function (x, y, dp, rm, base) {
        var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,
          yL, yz,
          s = x.s == y.s ? 1 : -1,
          xc = x.c,
          yc = y.c;

        // Either NaN, Infinity or 0?
        if (!xc || !xc[0] || !yc || !yc[0]) {

          return new BigNumber(

           // Return NaN if either NaN, or both Infinity or 0.
           !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN :

            // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.
            xc && xc[0] == 0 || !yc ? s * 0 : s / 0
         );
        }

        q = new BigNumber(s);
        qc = q.c = [];
        e = x.e - y.e;
        s = dp + e + 1;

        if (!base) {
          base = BASE;
          e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);
          s = s / LOG_BASE | 0;
        }

        // Result exponent may be one less then the current value of e.
        // The coefficients of the BigNumbers from convertBase may have trailing zeros.
        for (i = 0; yc[i] == (xc[i] || 0); i++);

        if (yc[i] > (xc[i] || 0)) e--;

        if (s < 0) {
          qc.push(1);
          more = true;
        } else {
          xL = xc.length;
          yL = yc.length;
          i = 0;
          s += 2;

          // Normalise xc and yc so highest order digit of yc is >= base / 2.

          n = mathfloor(base / (yc[0] + 1));

          // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1.
          // if (n > 1 || n++ == 1 && yc[0] < base / 2) {
          if (n > 1) {
            yc = multiply(yc, n, base);
            xc = multiply(xc, n, base);
            yL = yc.length;
            xL = xc.length;
          }

          xi = yL;
          rem = xc.slice(0, yL);
          remL = rem.length;

          // Add zeros to make remainder as long as divisor.
          for (; remL < yL; rem[remL++] = 0);
          yz = yc.slice();
          yz = [0].concat(yz);
          yc0 = yc[0];
          if (yc[1] >= base / 2) yc0++;
          // Not necessary, but to prevent trial digit n > base, when using base 3.
          // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15;

          do {
            n = 0;

            // Compare divisor and remainder.
            cmp = compare(yc, rem, yL, remL);

            // If divisor < remainder.
            if (cmp < 0) {

              // Calculate trial digit, n.

              rem0 = rem[0];
              if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);

              // n is how many times the divisor goes into the current remainder.
              n = mathfloor(rem0 / yc0);

              //  Algorithm:
              //  product = divisor multiplied by trial digit (n).
              //  Compare product and remainder.
              //  If product is greater than remainder:
              //    Subtract divisor from product, decrement trial digit.
              //  Subtract product from remainder.
              //  If product was less than remainder at the last compare:
              //    Compare new remainder and divisor.
              //    If remainder is greater than divisor:
              //      Subtract divisor from remainder, increment trial digit.

              if (n > 1) {

                // n may be > base only when base is 3.
                if (n >= base) n = base - 1;

                // product = divisor * trial digit.
                prod = multiply(yc, n, base);
                prodL = prod.length;
                remL = rem.length;

                // Compare product and remainder.
                // If product > remainder then trial digit n too high.
                // n is 1 too high about 5% of the time, and is not known to have
                // ever been more than 1 too high.
                while (compare(prod, rem, prodL, remL) == 1) {
                  n--;

                  // Subtract divisor from product.
                  subtract(prod, yL < prodL ? yz : yc, prodL, base);
                  prodL = prod.length;
                  cmp = 1;
                }
              } else {

                // n is 0 or 1, cmp is -1.
                // If n is 0, there is no need to compare yc and rem again below,
                // so change cmp to 1 to avoid it.
                // If n is 1, leave cmp as -1, so yc and rem are compared again.
                if (n == 0) {

                  // divisor < remainder, so n must be at least 1.
                  cmp = n = 1;
                }

                // product = divisor
                prod = yc.slice();
                prodL = prod.length;
              }

              if (prodL < remL) prod = [0].concat(prod);

              // Subtract product from remainder.
              subtract(rem, prod, remL, base);
              remL = rem.length;

               // If product was < remainder.
              if (cmp == -1) {

                // Compare divisor and new remainder.
                // If divisor < new remainder, subtract divisor from remainder.
                // Trial digit n too low.
                // n is 1 too low about 5% of the time, and very rarely 2 too low.
                while (compare(yc, rem, yL, remL) < 1) {
                  n++;

                  // Subtract divisor from remainder.
                  subtract(rem, yL < remL ? yz : yc, remL, base);
                  remL = rem.length;
                }
              }
            } else if (cmp === 0) {
              n++;
              rem = [0];
            } // else cmp === 1 and n will be 0

            // Add the next digit, n, to the result array.
            qc[i++] = n;

            // Update the remainder.
            if (rem[0]) {
              rem[remL++] = xc[xi] || 0;
            } else {
              rem = [xc[xi]];
              remL = 1;
            }
          } while ((xi++ < xL || rem[0] != null) && s--);

          more = rem[0] != null;

          // Leading zero?
          if (!qc[0]) qc.splice(0, 1);
        }

        if (base == BASE) {

          // To calculate q.e, first get the number of digits of qc[0].
          for (i = 1, s = qc[0]; s >= 10; s /= 10, i++);

          round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);

        // Caller is convertBase.
        } else {
          q.e = e;
          q.r = +more;
        }

        return q;
      };
    })();


    /*
     * Return a string representing the value of BigNumber n in fixed-point or exponential
     * notation rounded to the specified decimal places or significant digits.
     *
     * n: a BigNumber.
     * i: the index of the last digit required (i.e. the digit that may be rounded up).
     * rm: the rounding mode.
     * id: 1 (toExponential) or 2 (toPrecision).
     */
    function format(n, i, rm, id) {
      var c0, e, ne, len, str;

      if (rm == null) rm = ROUNDING_MODE;
      else intCheck(rm, 0, 8);

      if (!n.c) return n.toString();

      c0 = n.c[0];
      ne = n.e;

      if (i == null) {
        str = coeffToString(n.c);
        str = id == 1 || id == 2 && ne <= TO_EXP_NEG
         ? toExponential(str, ne)
         : toFixedPoint(str, ne, '0');
      } else {
        n = round(new BigNumber(n), i, rm);

        // n.e may have changed if the value was rounded up.
        e = n.e;

        str = coeffToString(n.c);
        len = str.length;

        // toPrecision returns exponential notation if the number of significant digits
        // specified is less than the number of digits necessary to represent the integer
        // part of the value in fixed-point notation.

        // Exponential notation.
        if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {

          // Append zeros?
          for (; len < i; str += '0', len++);
          str = toExponential(str, e);

        // Fixed-point notation.
        } else {
          i -= ne;
          str = toFixedPoint(str, e, '0');

          // Append zeros?
          if (e + 1 > len) {
            if (--i > 0) for (str += '.'; i--; str += '0');
          } else {
            i += e - len;
            if (i > 0) {
              if (e + 1 == len) str += '.';
              for (; i--; str += '0');
            }
          }
        }
      }

      return n.s < 0 && c0 ? '-' + str : str;
    }


    // Handle BigNumber.max and BigNumber.min.
    function maxOrMin(args, method) {
      var m, n,
        i = 0;

      if (isArray(args[0])) args = args[0];
      m = new BigNumber(args[0]);

      for (; ++i < args.length;) {
        n = new BigNumber(args[i]);

        // If any number is NaN, return NaN.
        if (!n.s) {
          m = n;
          break;
        } else if (method.call(m, n)) {
          m = n;
        }
      }

      return m;
    }


    /*
     * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.
     * Called by minus, plus and times.
     */
    function normalise(n, c, e) {
      var i = 1,
        j = c.length;

       // Remove trailing zeros.
      for (; !c[--j]; c.pop());

      // Calculate the base 10 exponent. First get the number of digits of c[0].
      for (j = c[0]; j >= 10; j /= 10, i++);

      // Overflow?
      if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {

        // Infinity.
        n.c = n.e = null;

      // Underflow?
      } else if (e < MIN_EXP) {

        // Zero.
        n.c = [n.e = 0];
      } else {
        n.e = e;
        n.c = c;
      }

      return n;
    }


    // Handle values that fail the validity test in BigNumber.
    parseNumeric = (function () {
      var basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i,
        dotAfter = /^([^.]+)\.$/,
        dotBefore = /^\.([^.]+)$/,
        isInfinityOrNaN = /^-?(Infinity|NaN)$/,
        whitespaceOrPlus = /^\s*\+(?=[\w.])|^\s+|\s+$/g;

      return function (x, str, isNum, b) {
        var base,
          s = isNum ? str : str.replace(whitespaceOrPlus, '');

        // No exception on ±Infinity or NaN.
        if (isInfinityOrNaN.test(s)) {
          x.s = isNaN(s) ? null : s < 0 ? -1 : 1;
          x.c = x.e = null;
        } else {
          if (!isNum) {

            // basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i
            s = s.replace(basePrefix, function (m, p1, p2) {
              base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8;
              return !b || b == base ? p1 : m;
            });

            if (b) {
              base = b;

              // E.g. '1.' to '1', '.1' to '0.1'
              s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1');
            }

            if (str != s) return new BigNumber(s, base);
          }

          // '[BigNumber Error] Not a number: {n}'
          // '[BigNumber Error] Not a base {b} number: {n}'
          if (BigNumber.DEBUG) {
            throw Error
              (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str);
          }

          // NaN
          x.c = x.e = x.s = null;
        }
      }
    })();


    /*
     * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.
     * If r is truthy, it is known that there are more digits after the rounding digit.
     */
    function round(x, sd, rm, r) {
      var d, i, j, k, n, ni, rd,
        xc = x.c,
        pows10 = POWS_TEN;

      // if x is not Infinity or NaN...
      if (xc) {

        // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.
        // n is a base 1e14 number, the value of the element of array x.c containing rd.
        // ni is the index of n within x.c.
        // d is the number of digits of n.
        // i is the index of rd within n including leading zeros.
        // j is the actual index of rd within n (if < 0, rd is a leading zero).
        out: {

          // Get the number of digits of the first element of xc.
          for (d = 1, k = xc[0]; k >= 10; k /= 10, d++);
          i = sd - d;

          // If the rounding digit is in the first element of xc...
          if (i < 0) {
            i += LOG_BASE;
            j = sd;
            n = xc[ni = 0];

            // Get the rounding digit at index j of n.
            rd = n / pows10[d - j - 1] % 10 | 0;
          } else {
            ni = mathceil((i + 1) / LOG_BASE);

            if (ni >= xc.length) {

              if (r) {

                // Needed by sqrt.
                for (; xc.length <= ni; xc.push(0));
                n = rd = 0;
                d = 1;
                i %= LOG_BASE;
                j = i - LOG_BASE + 1;
              } else {
                break out;
              }
            } else {
              n = k = xc[ni];

              // Get the number of digits of n.
              for (d = 1; k >= 10; k /= 10, d++);

              // Get the index of rd within n.
              i %= LOG_BASE;

              // Get the index of rd within n, adjusted for leading zeros.
              // The number of leading zeros of n is given by LOG_BASE - d.
              j = i - LOG_BASE + d;

              // Get the rounding digit at index j of n.
              rd = j < 0 ? 0 : n / pows10[d - j - 1] % 10 | 0;
            }
          }

          r = r || sd < 0 ||

          // Are there any non-zero digits after the rounding digit?
          // The expression  n % pows10[d - j - 1]  returns all digits of n to the right
          // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.
           xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);

          r = rm < 4
           ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))
           : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 &&

            // Check whether the digit to the left of the rounding digit is odd.
            ((i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 ||
             rm == (x.s < 0 ? 8 : 7));

          if (sd < 1 || !xc[0]) {
            xc.length = 0;

            if (r) {

              // Convert sd to decimal places.
              sd -= x.e + 1;

              // 1, 0.1, 0.01, 0.001, 0.0001 etc.
              xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];
              x.e = -sd || 0;
            } else {

              // Zero.
              xc[0] = x.e = 0;
            }

            return x;
          }

          // Remove excess digits.
          if (i == 0) {
            xc.length = ni;
            k = 1;
            ni--;
          } else {
            xc.length = ni + 1;
            k = pows10[LOG_BASE - i];

            // E.g. 56700 becomes 56000 if 7 is the rounding digit.
            // j > 0 means i > number of leading zeros of n.
            xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;
          }

          // Round up?
          if (r) {

            for (; ;) {

              // If the digit to be rounded up is in the first element of xc...
              if (ni == 0) {

                // i will be the length of xc[0] before k is added.
                for (i = 1, j = xc[0]; j >= 10; j /= 10, i++);
                j = xc[0] += k;
                for (k = 1; j >= 10; j /= 10, k++);

                // if i != k the length has increased.
                if (i != k) {
                  x.e++;
                  if (xc[0] == BASE) xc[0] = 1;
                }

                break;
              } else {
                xc[ni] += k;
                if (xc[ni] != BASE) break;
                xc[ni--] = 0;
                k = 1;
              }
            }
          }

          // Remove trailing zeros.
          for (i = xc.length; xc[--i] === 0; xc.pop());
        }

        // Overflow? Infinity.
        if (x.e > MAX_EXP) {
          x.c = x.e = null;

        // Underflow? Zero.
        } else if (x.e < MIN_EXP) {
          x.c = [x.e = 0];
        }
      }

      return x;
    }


    // PROTOTYPE/INSTANCE METHODS


    /*
     * Return a new BigNumber whose value is the absolute value of this BigNumber.
     */
    P.absoluteValue = P.abs = function () {
      var x = new BigNumber(this);
      if (x.s < 0) x.s = 1;
      return x;
    };


    /*
     * Return
     *   1 if the value of this BigNumber is greater than the value of BigNumber(y, b),
     *   -1 if the value of this BigNumber is less than the value of BigNumber(y, b),
     *   0 if they have the same value,
     *   or null if the value of either is NaN.
     */
    P.comparedTo = function (y, b) {
      return compare(this, new BigNumber(y, b));
    };


    /*
     * If dp is undefined or null or true or false, return the number of decimal places of the
     * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.
     *
     * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this
     * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or
     * ROUNDING_MODE if rm is omitted.
     *
     * [dp] {number} Decimal places: integer, 0 to MAX inclusive.
     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
     *
     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'
     */
    P.decimalPlaces = P.dp = function (dp, rm) {
      var c, n, v,
        x = this;

      if (dp != null) {
        intCheck(dp, 0, MAX);
        if (rm == null) rm = ROUNDING_MODE;
        else intCheck(rm, 0, 8);

        return round(new BigNumber(x), dp + x.e + 1, rm);
      }

      if (!(c = x.c)) return null;
      n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;

      // Subtract the number of trailing zeros of the last number.
      if (v = c[v]) for (; v % 10 == 0; v /= 10, n--);
      if (n < 0) n = 0;

      return n;
    };


    /*
     *  n / 0 = I
     *  n / N = N
     *  n / I = 0
     *  0 / n = 0
     *  0 / 0 = N
     *  0 / N = N
     *  0 / I = 0
     *  N / n = N
     *  N / 0 = N
     *  N / N = N
     *  N / I = N
     *  I / n = I
     *  I / 0 = I
     *  I / N = N
     *  I / I = N
     *
     * Return a new BigNumber whose value is the value of this BigNumber divided by the value of
     * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.
     */
    P.dividedBy = P.div = function (y, b) {
      return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE);
    };


    /*
     * Return a new BigNumber whose value is the integer part of dividing the value of this
     * BigNumber by the value of BigNumber(y, b).
     */
    P.dividedToIntegerBy = P.idiv = function (y, b) {
      return div(this, new BigNumber(y, b), 0, 1);
    };


    /*
     * Return a BigNumber whose value is the value of this BigNumber exponentiated by n.
     *
     * If m is present, return the result modulo m.
     * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.
     * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE.
     *
     * The modular power operation works efficiently when x, n, and m are integers, otherwise it
     * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0.
     *
     * n {number|string|BigNumber} The exponent. An integer.
     * [m] {number|string|BigNumber} The modulus.
     *
     * '[BigNumber Error] Exponent not an integer: {n}'
     */
    P.exponentiatedBy = P.pow = function (n, m) {
      var half, isModExp, k, more, nIsBig, nIsNeg, nIsOdd, y,
        x = this;

      n = new BigNumber(n);

      // Allow NaN and ±Infinity, but not other non-integers.
      if (n.c && !n.isInteger()) {
        throw Error
          (bignumberError + 'Exponent not an integer: ' + n);
      }

      if (m != null) m = new BigNumber(m);

      // Exponent of MAX_SAFE_INTEGER is 15.
      nIsBig = n.e > 14;

      // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0.
      if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {

        // The sign of the result of pow when x is negative depends on the evenness of n.
        // If +n overflows to ±Infinity, the evenness of n would be not be known.
        y = new BigNumber(Math.pow(+x.valueOf(), nIsBig ? 2 - isOdd(n) : +n));
        return m ? y.mod(m) : y;
      }

      nIsNeg = n.s < 0;

      if (m) {

        // x % m returns NaN if abs(m) is zero, or m is NaN.
        if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN);

        isModExp = !nIsNeg && x.isInteger() && m.isInteger();

        if (isModExp) x = x.mod(m);

      // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15.
      // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15.
      } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0
        // [1, 240000000]
        ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7
        // [80000000000000]  [99999750000000]
        : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {

        // If x is negative and n is odd, k = -0, else k = 0.
        k = x.s < 0 && isOdd(n) ? -0 : 0;

        // If x >= 1, k = ±Infinity.
        if (x.e > -1) k = 1 / k;

        // If n is negative return ±0, else return ±Infinity.
        return new BigNumber(nIsNeg ? 1 / k : k);

      } else if (POW_PRECISION) {

        // Truncating each coefficient array to a length of k after each multiplication
        // equates to truncating significant digits to POW_PRECISION + [28, 41],
        // i.e. there will be a minimum of 28 guard digits retained.
        k = mathceil(POW_PRECISION / LOG_BASE + 2);
      }

      if (nIsBig) {
        half = new BigNumber(0.5);
        nIsOdd = isOdd(n);
      } else {
        nIsOdd = n % 2;
      }

      if (nIsNeg) n.s = 1;

      y = new BigNumber(ONE);

      // Performs 54 loop iterations for n of 9007199254740991.
      for (; ;) {

        if (nIsOdd) {
          y = y.times(x);
          if (!y.c) break;

          if (k) {
            if (y.c.length > k) y.c.length = k;
          } else if (isModExp) {
            y = y.mod(m);    //y = y.minus(div(y, m, 0, MODULO_MODE).times(m));
          }
        }

        if (nIsBig) {
          n = n.times(half);
          round(n, n.e + 1, 1);
          if (!n.c[0]) break;
          nIsBig = n.e > 14;
          nIsOdd = isOdd(n);
        } else {
          n = mathfloor(n / 2);
          if (!n) break;
          nIsOdd = n % 2;
        }

        x = x.times(x);

        if (k) {
          if (x.c && x.c.length > k) x.c.length = k;
        } else if (isModExp) {
          x = x.mod(m);    //x = x.minus(div(x, m, 0, MODULO_MODE).times(m));
        }
      }

      if (isModExp) return y;
      if (nIsNeg) y = ONE.div(y);

      return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;
    };


    /*
     * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer
     * using rounding mode rm, or ROUNDING_MODE if rm is omitted.
     *
     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
     *
     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}'
     */
    P.integerValue = function (rm) {
      var n = new BigNumber(this);
      if (rm == null) rm = ROUNDING_MODE;
      else intCheck(rm, 0, 8);
      return round(n, n.e + 1, rm);
    };


    /*
     * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),
     * otherwise return false.
     */
    P.isEqualTo = P.eq = function (y, b) {
      return compare(this, new BigNumber(y, b)) === 0;
    };


    /*
     * Return true if the value of this BigNumber is a finite number, otherwise return false.
     */
    P.isFinite = function () {
      return !!this.c;
    };


    /*
     * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),
     * otherwise return false.
     */
    P.isGreaterThan = P.gt = function (y, b) {
      return compare(this, new BigNumber(y, b)) > 0;
    };


    /*
     * Return true if the value of this BigNumber is greater than or equal to the value of
     * BigNumber(y, b), otherwise return false.
     */
    P.isGreaterThanOrEqualTo = P.gte = function (y, b) {
      return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0;

    };


    /*
     * Return true if the value of this BigNumber is an integer, otherwise return false.
     */
    P.isInteger = function () {
      return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;
    };


    /*
     * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),
     * otherwise return false.
     */
    P.isLessThan = P.lt = function (y, b) {
      return compare(this, new BigNumber(y, b)) < 0;
    };


    /*
     * Return true if the value of this BigNumber is less than or equal to the value of
     * BigNumber(y, b), otherwise return false.
     */
    P.isLessThanOrEqualTo = P.lte = function (y, b) {
      return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0;
    };


    /*
     * Return true if the value of this BigNumber is NaN, otherwise return false.
     */
    P.isNaN = function () {
      return !this.s;
    };


    /*
     * Return true if the value of this BigNumber is negative, otherwise return false.
     */
    P.isNegative = function () {
      return this.s < 0;
    };


    /*
     * Return true if the value of this BigNumber is positive, otherwise return false.
     */
    P.isPositive = function () {
      return this.s > 0;
    };


    /*
     * Return true if the value of this BigNumber is 0 or -0, otherwise return false.
     */
    P.isZero = function () {
      return !!this.c && this.c[0] == 0;
    };


    /*
     *  n - 0 = n
     *  n - N = N
     *  n - I = -I
     *  0 - n = -n
     *  0 - 0 = 0
     *  0 - N = N
     *  0 - I = -I
     *  N - n = N
     *  N - 0 = N
     *  N - N = N
     *  N - I = N
     *  I - n = I
     *  I - 0 = I
     *  I - N = N
     *  I - I = N
     *
     * Return a new BigNumber whose value is the value of this BigNumber minus the value of
     * BigNumber(y, b).
     */
    P.minus = function (y, b) {
      var i, j, t, xLTy,
        x = this,
        a = x.s;

      y = new BigNumber(y, b);
      b = y.s;

      // Either NaN?
      if (!a || !b) return new BigNumber(NaN);

      // Signs differ?
      if (a != b) {
        y.s = -b;
        return x.plus(y);
      }

      var xe = x.e / LOG_BASE,
        ye = y.e / LOG_BASE,
        xc = x.c,
        yc = y.c;

      if (!xe || !ye) {

        // Either Infinity?
        if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN);

        // Either zero?
        if (!xc[0] || !yc[0]) {

          // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.
          return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x :

           // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity
           ROUNDING_MODE == 3 ? -0 : 0);
        }
      }

      xe = bitFloor(xe);
      ye = bitFloor(ye);
      xc = xc.slice();

      // Determine which is the bigger number.
      if (a = xe - ye) {

        if (xLTy = a < 0) {
          a = -a;
          t = xc;
        } else {
          ye = xe;
          t = yc;
        }

        t.reverse();

        // Prepend zeros to equalise exponents.
        for (b = a; b--; t.push(0));
        t.reverse();
      } else {

        // Exponents equal. Check digit by digit.
        j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;

        for (a = b = 0; b < j; b++) {

          if (xc[b] != yc[b]) {
            xLTy = xc[b] < yc[b];
            break;
          }
        }
      }

      // x < y? Point xc to the array of the bigger number.
      if (xLTy) t = xc, xc = yc, yc = t, y.s = -y.s;

      b = (j = yc.length) - (i = xc.length);

      // Append zeros to xc if shorter.
      // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.
      if (b > 0) for (; b--; xc[i++] = 0);
      b = BASE - 1;

      // Subtract yc from xc.
      for (; j > a;) {

        if (xc[--j] < yc[j]) {
          for (i = j; i && !xc[--i]; xc[i] = b);
          --xc[i];
          xc[j] += BASE;
        }

        xc[j] -= yc[j];
      }

      // Remove leading zeros and adjust exponent accordingly.
      for (; xc[0] == 0; xc.splice(0, 1), --ye);

      // Zero?
      if (!xc[0]) {

        // Following IEEE 754 (2008) 6.3,
        // n - n = +0  but  n - n = -0  when rounding towards -Infinity.
        y.s = ROUNDING_MODE == 3 ? -1 : 1;
        y.c = [y.e = 0];
        return y;
      }

      // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity
      // for finite x and y.
      return normalise(y, xc, ye);
    };


    /*
     *   n % 0 =  N
     *   n % N =  N
     *   n % I =  n
     *   0 % n =  0
     *  -0 % n = -0
     *   0 % 0 =  N
     *   0 % N =  N
     *   0 % I =  0
     *   N % n =  N
     *   N % 0 =  N
     *   N % N =  N
     *   N % I =  N
     *   I % n =  N
     *   I % 0 =  N
     *   I % N =  N
     *   I % I =  N
     *
     * Return a new BigNumber whose value is the value of this BigNumber modulo the value of
     * BigNumber(y, b). The result depends on the value of MODULO_MODE.
     */
    P.modulo = P.mod = function (y, b) {
      var q, s,
        x = this;

      y = new BigNumber(y, b);

      // Return NaN if x is Infinity or NaN, or y is NaN or zero.
      if (!x.c || !y.s || y.c && !y.c[0]) {
        return new BigNumber(NaN);

      // Return x if y is Infinity or x is zero.
      } else if (!y.c || x.c && !x.c[0]) {
        return new BigNumber(x);
      }

      if (MODULO_MODE == 9) {

        // Euclidian division: q = sign(y) * floor(x / abs(y))
        // r = x - qy    where  0 <= r < abs(y)
        s = y.s;
        y.s = 1;
        q = div(x, y, 0, 3);
        y.s = s;
        q.s *= s;
      } else {
        q = div(x, y, 0, MODULO_MODE);
      }

      y = x.minus(q.times(y));

      // To match JavaScript %, ensure sign of zero is sign of dividend.
      if (!y.c[0] && MODULO_MODE == 1) y.s = x.s;

      return y;
    };


    /*
     *  n * 0 = 0
     *  n * N = N
     *  n * I = I
     *  0 * n = 0
     *  0 * 0 = 0
     *  0 * N = N
     *  0 * I = N
     *  N * n = N
     *  N * 0 = N
     *  N * N = N
     *  N * I = N
     *  I * n = I
     *  I * 0 = N
     *  I * N = N
     *  I * I = I
     *
     * Return a new BigNumber whose value is the value of this BigNumber multiplied by the value
     * of BigNumber(y, b).
     */
    P.multipliedBy = P.times = function (y, b) {
      var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,
        base, sqrtBase,
        x = this,
        xc = x.c,
        yc = (y = new BigNumber(y, b)).c;

      // Either NaN, ±Infinity or ±0?
      if (!xc || !yc || !xc[0] || !yc[0]) {

        // Return NaN if either is NaN, or one is 0 and the other is Infinity.
        if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {
          y.c = y.e = y.s = null;
        } else {
          y.s *= x.s;

          // Return ±Infinity if either is ±Infinity.
          if (!xc || !yc) {
            y.c = y.e = null;

          // Return ±0 if either is ±0.
          } else {
            y.c = [0];
            y.e = 0;
          }
        }

        return y;
      }

      e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);
      y.s *= x.s;
      xcL = xc.length;
      ycL = yc.length;

      // Ensure xc points to longer array and xcL to its length.
      if (xcL < ycL) zc = xc, xc = yc, yc = zc, i = xcL, xcL = ycL, ycL = i;

      // Initialise the result array with zeros.
      for (i = xcL + ycL, zc = []; i--; zc.push(0));

      base = BASE;
      sqrtBase = SQRT_BASE;

      for (i = ycL; --i >= 0;) {
        c = 0;
        ylo = yc[i] % sqrtBase;
        yhi = yc[i] / sqrtBase | 0;

        for (k = xcL, j = i + k; j > i;) {
          xlo = xc[--k] % sqrtBase;
          xhi = xc[k] / sqrtBase | 0;
          m = yhi * xlo + xhi * ylo;
          xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c;
          c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;
          zc[j--] = xlo % base;
        }

        zc[j] = c;
      }

      if (c) {
        ++e;
      } else {
        zc.splice(0, 1);
      }

      return normalise(y, zc, e);
    };


    /*
     * Return a new BigNumber whose value is the value of this BigNumber negated,
     * i.e. multiplied by -1.
     */
    P.negated = function () {
      var x = new BigNumber(this);
      x.s = -x.s || null;
      return x;
    };


    /*
     *  n + 0 = n
     *  n + N = N
     *  n + I = I
     *  0 + n = n
     *  0 + 0 = 0
     *  0 + N = N
     *  0 + I = I
     *  N + n = N
     *  N + 0 = N
     *  N + N = N
     *  N + I = N
     *  I + n = I
     *  I + 0 = I
     *  I + N = N
     *  I + I = I
     *
     * Return a new BigNumber whose value is the value of this BigNumber plus the value of
     * BigNumber(y, b).
     */
    P.plus = function (y, b) {
      var t,
        x = this,
        a = x.s;

      y = new BigNumber(y, b);
      b = y.s;

      // Either NaN?
      if (!a || !b) return new BigNumber(NaN);

      // Signs differ?
       if (a != b) {
        y.s = -b;
        return x.minus(y);
      }

      var xe = x.e / LOG_BASE,
        ye = y.e / LOG_BASE,
        xc = x.c,
        yc = y.c;

      if (!xe || !ye) {

        // Return ±Infinity if either ±Infinity.
        if (!xc || !yc) return new BigNumber(a / 0);

        // Either zero?
        // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.
        if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0);
      }

      xe = bitFloor(xe);
      ye = bitFloor(ye);
      xc = xc.slice();

      // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.
      if (a = xe - ye) {
        if (a > 0) {
          ye = xe;
          t = yc;
        } else {
          a = -a;
          t = xc;
        }

        t.reverse();
        for (; a--; t.push(0));
        t.reverse();
      }

      a = xc.length;
      b = yc.length;

      // Point xc to the longer array, and b to the shorter length.
      if (a - b < 0) t = yc, yc = xc, xc = t, b = a;

      // Only start adding at yc.length - 1 as the further digits of xc can be ignored.
      for (a = 0; b;) {
        a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;
        xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;
      }

      if (a) {
        xc = [a].concat(xc);
        ++ye;
      }

      // No need to check for zero, as +x + +y != 0 && -x + -y != 0
      // ye = MAX_EXP + 1 possible
      return normalise(y, xc, ye);
    };


    /*
     * If sd is undefined or null or true or false, return the number of significant digits of
     * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.
     * If sd is true include integer-part trailing zeros in the count.
     *
     * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this
     * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or
     * ROUNDING_MODE if rm is omitted.
     *
     * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive.
     *                     boolean: whether to count integer-part trailing zeros: true or false.
     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
     *
     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'
     */
    P.precision = P.sd = function (sd, rm) {
      var c, n, v,
        x = this;

      if (sd != null && sd !== !!sd) {
        intCheck(sd, 1, MAX);
        if (rm == null) rm = ROUNDING_MODE;
        else intCheck(rm, 0, 8);

        return round(new BigNumber(x), sd, rm);
      }

      if (!(c = x.c)) return null;
      v = c.length - 1;
      n = v * LOG_BASE + 1;

      if (v = c[v]) {

        // Subtract the number of trailing zeros of the last element.
        for (; v % 10 == 0; v /= 10, n--);

        // Add the number of digits of the first element.
        for (v = c[0]; v >= 10; v /= 10, n++);
      }

      if (sd && x.e + 1 > n) n = x.e + 1;

      return n;
    };


    /*
     * Return a new BigNumber whose value is the value of this BigNumber shifted by k places
     * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.
     *
     * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.
     *
     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}'
     */
    P.shiftedBy = function (k) {
      intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);
      return this.times('1e' + k);
    };


    /*
     *  sqrt(-n) =  N
     *  sqrt(N) =  N
     *  sqrt(-I) =  N
     *  sqrt(I) =  I
     *  sqrt(0) =  0
     *  sqrt(-0) = -0
     *
     * Return a new BigNumber whose value is the square root of the value of this BigNumber,
     * rounded according to DECIMAL_PLACES and ROUNDING_MODE.
     */
    P.squareRoot = P.sqrt = function () {
      var m, n, r, rep, t,
        x = this,
        c = x.c,
        s = x.s,
        e = x.e,
        dp = DECIMAL_PLACES + 4,
        half = new BigNumber('0.5');

      // Negative/NaN/Infinity/zero?
      if (s !== 1 || !c || !c[0]) {
        return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);
      }

      // Initial estimate.
      s = Math.sqrt(+x);

      // Math.sqrt underflow/overflow?
      // Pass x to Math.sqrt as integer, then adjust the exponent of the result.
      if (s == 0 || s == 1 / 0) {
        n = coeffToString(c);
        if ((n.length + e) % 2 == 0) n += '0';
        s = Math.sqrt(n);
        e = bitFloor((e + 1) / 2) - (e < 0 || e % 2);

        if (s == 1 / 0) {
          n = '1e' + e;
        } else {
          n = s.toExponential();
          n = n.slice(0, n.indexOf('e') + 1) + e;
        }

        r = new BigNumber(n);
      } else {
        r = new BigNumber(s + '');
      }

      // Check for zero.
      // r could be zero if MIN_EXP is changed after the this value was created.
      // This would cause a division by zero (x/t) and hence Infinity below, which would cause
      // coeffToString to throw.
      if (r.c[0]) {
        e = r.e;
        s = e + dp;
        if (s < 3) s = 0;

        // Newton-Raphson iteration.
        for (; ;) {
          t = r;
          r = half.times(t.plus(div(x, t, dp, 1)));

          if (coeffToString(t.c  ).slice(0, s) === (n =
             coeffToString(r.c)).slice(0, s)) {

            // The exponent of r may here be one less than the final result exponent,
            // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits
            // are indexed correctly.
            if (r.e < e) --s;
            n = n.slice(s - 3, s + 1);

            // The 4th rounding digit may be in error by -1 so if the 4 rounding digits
            // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the
            // iteration.
            if (n == '9999' || !rep && n == '4999') {

              // On the first iteration only, check to see if rounding up gives the
              // exact result as the nines may infinitely repeat.
              if (!rep) {
                round(t, t.e + DECIMAL_PLACES + 2, 0);

                if (t.times(t).eq(x)) {
                  r = t;
                  break;
                }
              }

              dp += 4;
              s += 4;
              rep = 1;
            } else {

              // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact
              // result. If not, then there are further digits and m will be truthy.
              if (!+n || !+n.slice(1) && n.charAt(0) == '5') {

                // Truncate to the first rounding digit.
                round(r, r.e + DECIMAL_PLACES + 2, 1);
                m = !r.times(r).eq(x);
              }

              break;
            }
          }
        }
      }

      return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m);
    };


    /*
     * Return a string representing the value of this BigNumber in exponential notation and
     * rounded using ROUNDING_MODE to dp fixed decimal places.
     *
     * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.
     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
     *
     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'
     */
    P.toExponential = function (dp, rm) {
      if (dp != null) {
        intCheck(dp, 0, MAX);
        dp++;
      }
      return format(this, dp, rm, 1);
    };


    /*
     * Return a string representing the value of this BigNumber in fixed-point notation rounding
     * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.
     *
     * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',
     * but e.g. (-0.00001).toFixed(0) is '-0'.
     *
     * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.
     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
     *
     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'
     */
    P.toFixed = function (dp, rm) {
      if (dp != null) {
        intCheck(dp, 0, MAX);
        dp = dp + this.e + 1;
      }
      return format(this, dp, rm);
    };


    /*
     * Return a string representing the value of this BigNumber in fixed-point notation rounded
     * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties
     * of the FORMAT object (see BigNumber.set).
     *
     * FORMAT = {
     *      decimalSeparator : '.',
     *      groupSeparator : ',',
     *      groupSize : 3,
     *      secondaryGroupSize : 0,
     *      fractionGroupSeparator : '\xA0',    // non-breaking space
     *      fractionGroupSize : 0
     * };
     *
     * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.
     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
     *
     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'
     */
    P.toFormat = function (dp, rm) {
      var str = this.toFixed(dp, rm);

      if (this.c) {
        var i,
          arr = str.split('.'),
          g1 = +FORMAT.groupSize,
          g2 = +FORMAT.secondaryGroupSize,
          groupSeparator = FORMAT.groupSeparator,
          intPart = arr[0],
          fractionPart = arr[1],
          isNeg = this.s < 0,
          intDigits = isNeg ? intPart.slice(1) : intPart,
          len = intDigits.length;

        if (g2) i = g1, g1 = g2, g2 = i, len -= i;

        if (g1 > 0 && len > 0) {
          i = len % g1 || g1;
          intPart = intDigits.substr(0, i);

          for (; i < len; i += g1) {
            intPart += groupSeparator + intDigits.substr(i, g1);
          }

          if (g2 > 0) intPart += groupSeparator + intDigits.slice(i);
          if (isNeg) intPart = '-' + intPart;
        }

        str = fractionPart
         ? intPart + FORMAT.decimalSeparator + ((g2 = +FORMAT.fractionGroupSize)
          ? fractionPart.replace(new RegExp('\\d{' + g2 + '}\\B', 'g'),
           '$&' + FORMAT.fractionGroupSeparator)
          : fractionPart)
         : intPart;
      }

      return str;
    };


    /*
     * Return a string array representing the value of this BigNumber as a simple fraction with
     * an integer numerator and an integer denominator. The denominator will be a positive
     * non-zero value less than or equal to the specified maximum denominator. If a maximum
     * denominator is not specified, the denominator will be the lowest value necessary to
     * represent the number exactly.
     *
     * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator.
     *
     * '[BigNumber Error] Argument {not an integer|out of range} : {md}'
     */
    P.toFraction = function (md) {
      var arr, d, d0, d1, d2, e, exp, n, n0, n1, q, s,
        x = this,
        xc = x.c;

      if (md != null) {
        n = new BigNumber(md);

        // Throw if md is less than one or is not an integer, unless it is Infinity.
        if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) {
          throw Error
            (bignumberError + 'Argument ' +
              (n.isInteger() ? 'out of range: ' : 'not an integer: ') + md);
        }
      }

      if (!xc) return x.toString();

      d = new BigNumber(ONE);
      n1 = d0 = new BigNumber(ONE);
      d1 = n0 = new BigNumber(ONE);
      s = coeffToString(xc);

      // Determine initial denominator.
      // d is a power of 10 and the minimum max denominator that specifies the value exactly.
      e = d.e = s.length - x.e - 1;
      d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];
      md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n;

      exp = MAX_EXP;
      MAX_EXP = 1 / 0;
      n = new BigNumber(s);

      // n0 = d1 = 0
      n0.c[0] = 0;

      for (; ;)  {
        q = div(n, d, 0, 1);
        d2 = d0.plus(q.times(d1));
        if (d2.comparedTo(md) == 1) break;
        d0 = d1;
        d1 = d2;
        n1 = n0.plus(q.times(d2 = n1));
        n0 = d2;
        d = n.minus(q.times(d2 = d));
        n = d2;
      }

      d2 = div(md.minus(d0), d1, 0, 1);
      n0 = n0.plus(d2.times(n1));
      d0 = d0.plus(d2.times(d1));
      n0.s = n1.s = x.s;
      e *= 2;

      // Determine which fraction is closer to x, n0/d0 or n1/d1
      arr = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(
         div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1
          ? [n1.toString(), d1.toString()]
          : [n0.toString(), d0.toString()];

      MAX_EXP = exp;
      return arr;
    };


    /*
     * Return the value of this BigNumber converted to a number primitive.
     */
    P.toNumber = function () {
      return +this;
    };


    /*
     * Return a string representing the value of this BigNumber rounded to sd significant digits
     * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits
     * necessary to represent the integer part of the value in fixed-point notation, then use
     * exponential notation.
     *
     * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.
     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
     *
     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'
     */
    P.toPrecision = function (sd, rm) {
      if (sd != null) intCheck(sd, 1, MAX);
      return format(this, sd, rm, 2);
    };


    /*
     * Return a string representing the value of this BigNumber in base b, or base 10 if b is
     * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and
     * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent
     * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than
     * TO_EXP_NEG, return exponential notation.
     *
     * [b] {number} Integer, 2 to ALPHABET.length inclusive.
     *
     * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'
     */
    P.toString = function (b) {
      var str,
        n = this,
        s = n.s,
        e = n.e;

      // Infinity or NaN?
      if (e === null) {

        if (s) {
          str = 'Infinity';
          if (s < 0) str = '-' + str;
        } else {
          str = 'NaN';
        }
      } else {
        str = coeffToString(n.c);

        if (b == null) {
          str = e <= TO_EXP_NEG || e >= TO_EXP_POS
           ? toExponential(str, e)
           : toFixedPoint(str, e, '0');
        } else {
          intCheck(b, 2, ALPHABET.length, 'Base');
          str = convertBase(toFixedPoint(str, e, '0'), 10, b, s, true);
        }

        if (s < 0 && n.c[0]) str = '-' + str;
      }

      return str;
    };


    /*
     * Return as toString, but do not accept a base argument, and include the minus sign for
     * negative zero.
     */
    P.valueOf = P.toJSON = function () {
      var str,
        n = this,
        e = n.e;

      if (e === null) return n.toString();

      str = coeffToString(n.c);

      str = e <= TO_EXP_NEG || e >= TO_EXP_POS
        ? toExponential(str, e)
        : toFixedPoint(str, e, '0');

      return n.s < 0 ? '-' + str : str;
    };


    P._isBigNumber = true;

    if (configObject != null) BigNumber.set(configObject);

    return BigNumber;
  }


  // PRIVATE HELPER FUNCTIONS


  function bitFloor(n) {
    var i = n | 0;
    return n > 0 || n === i ? i : i - 1;
  }


  // Return a coefficient array as a string of base 10 digits.
  function coeffToString(a) {
    var s, z,
      i = 1,
      j = a.length,
      r = a[0] + '';

    for (; i < j;) {
      s = a[i++] + '';
      z = LOG_BASE - s.length;
      for (; z--; s = '0' + s);
      r += s;
    }

    // Determine trailing zeros.
    for (j = r.length; r.charCodeAt(--j) === 48;);
    return r.slice(0, j + 1 || 1);
  }


  // Compare the value of BigNumbers x and y.
  function compare(x, y) {
    var a, b,
      xc = x.c,
      yc = y.c,
      i = x.s,
      j = y.s,
      k = x.e,
      l = y.e;

    // Either NaN?
    if (!i || !j) return null;

    a = xc && !xc[0];
    b = yc && !yc[0];

    // Either zero?
    if (a || b) return a ? b ? 0 : -j : i;

    // Signs differ?
    if (i != j) return i;

    a = i < 0;
    b = k == l;

    // Either Infinity?
    if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1;

    // Compare exponents.
    if (!b) return k > l ^ a ? 1 : -1;

    j = (k = xc.length) < (l = yc.length) ? k : l;

    // Compare digit by digit.
    for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1;

    // Compare lengths.
    return k == l ? 0 : k > l ^ a ? 1 : -1;
  }


  /*
   * Check that n is a primitive number, an integer, and in range, otherwise throw.
   */
  function intCheck(n, min, max, name) {
    if (n < min || n > max || n !== (n < 0 ? mathceil(n) : mathfloor(n))) {
      throw Error
       (bignumberError + (name || 'Argument') + (typeof n == 'number'
         ? n < min || n > max ? ' out of range: ' : ' not an integer: '
         : ' not a primitive number: ') + n);
    }
  }


  function isArray(obj) {
    return Object.prototype.toString.call(obj) == '[object Array]';
  }


  // Assumes finite n.
  function isOdd(n) {
    var k = n.c.length - 1;
    return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;
  }


  function toExponential(str, e) {
    return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) +
     (e < 0 ? 'e' : 'e+') + e;
  }


  function toFixedPoint(str, e, z) {
    var len, zs;

    // Negative exponent?
    if (e < 0) {

      // Prepend zeros.
      for (zs = z + '.'; ++e; zs += z);
      str = zs + str;

    // Positive exponent
    } else {
      len = str.length;

      // Append zeros.
      if (++e > len) {
        for (zs = z, e -= len; --e; zs += z);
        str += zs;
      } else if (e < len) {
        str = str.slice(0, e) + '.' + str.slice(e);
      }
    }

    return str;
  }


  // EXPORT


  BigNumber = clone();
  BigNumber['default'] = BigNumber.BigNumber = BigNumber;

  // AMD.
  if (typeof define == 'function' && define.amd) {
    define(function () { return BigNumber; });

  // Node.js and other environments that support module.exports.
  } else if (typeof module != 'undefined' && module.exports) {
    module.exports = BigNumber;

  // Browser.
  } else {
    if (!globalObject) {
      globalObject = typeof self != 'undefined' && self ? self : window;
    }

    globalObject.BigNumber = BigNumber;
  }
})(this);

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browser-resolve/empty.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.to-string.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify-zlib/lib/binding.js":[function(require,module,exports){
(function (process,Buffer){(function (){
'use strict';
/* eslint camelcase: "off" */

var assert = require('assert');

var Zstream = require('pako/lib/zlib/zstream');
var zlib_deflate = require('pako/lib/zlib/deflate.js');
var zlib_inflate = require('pako/lib/zlib/inflate.js');
var constants = require('pako/lib/zlib/constants');

for (var key in constants) {
  exports[key] = constants[key];
}

// zlib modes
exports.NONE = 0;
exports.DEFLATE = 1;
exports.INFLATE = 2;
exports.GZIP = 3;
exports.GUNZIP = 4;
exports.DEFLATERAW = 5;
exports.INFLATERAW = 6;
exports.UNZIP = 7;

var GZIP_HEADER_ID1 = 0x1f;
var GZIP_HEADER_ID2 = 0x8b;

/**
 * Emulate Node's zlib C++ layer for use by the JS layer in index.js
 */
function Zlib(mode) {
  if (typeof mode !== 'number' || mode < exports.DEFLATE || mode > exports.UNZIP) {
    throw new TypeError('Bad argument');
  }

  this.dictionary = null;
  this.err = 0;
  this.flush = 0;
  this.init_done = false;
  this.level = 0;
  this.memLevel = 0;
  this.mode = mode;
  this.strategy = 0;
  this.windowBits = 0;
  this.write_in_progress = false;
  this.pending_close = false;
  this.gzip_id_bytes_read = 0;
}

Zlib.prototype.close = function () {
  if (this.write_in_progress) {
    this.pending_close = true;
    return;
  }

  this.pending_close = false;

  assert(this.init_done, 'close before init');
  assert(this.mode <= exports.UNZIP);

  if (this.mode === exports.DEFLATE || this.mode === exports.GZIP || this.mode === exports.DEFLATERAW) {
    zlib_deflate.deflateEnd(this.strm);
  } else if (this.mode === exports.INFLATE || this.mode === exports.GUNZIP || this.mode === exports.INFLATERAW || this.mode === exports.UNZIP) {
    zlib_inflate.inflateEnd(this.strm);
  }

  this.mode = exports.NONE;

  this.dictionary = null;
};

Zlib.prototype.write = function (flush, input, in_off, in_len, out, out_off, out_len) {
  return this._write(true, flush, input, in_off, in_len, out, out_off, out_len);
};

Zlib.prototype.writeSync = function (flush, input, in_off, in_len, out, out_off, out_len) {
  return this._write(false, flush, input, in_off, in_len, out, out_off, out_len);
};

Zlib.prototype._write = function (async, flush, input, in_off, in_len, out, out_off, out_len) {
  assert.equal(arguments.length, 8);

  assert(this.init_done, 'write before init');
  assert(this.mode !== exports.NONE, 'already finalized');
  assert.equal(false, this.write_in_progress, 'write already in progress');
  assert.equal(false, this.pending_close, 'close is pending');

  this.write_in_progress = true;

  assert.equal(false, flush === undefined, 'must provide flush value');

  this.write_in_progress = true;

  if (flush !== exports.Z_NO_FLUSH && flush !== exports.Z_PARTIAL_FLUSH && flush !== exports.Z_SYNC_FLUSH && flush !== exports.Z_FULL_FLUSH && flush !== exports.Z_FINISH && flush !== exports.Z_BLOCK) {
    throw new Error('Invalid flush value');
  }

  if (input == null) {
    input = Buffer.alloc(0);
    in_len = 0;
    in_off = 0;
  }

  this.strm.avail_in = in_len;
  this.strm.input = input;
  this.strm.next_in = in_off;
  this.strm.avail_out = out_len;
  this.strm.output = out;
  this.strm.next_out = out_off;
  this.flush = flush;

  if (!async) {
    // sync version
    this._process();

    if (this._checkError()) {
      return this._afterSync();
    }
    return;
  }

  // async version
  var self = this;
  process.nextTick(function () {
    self._process();
    self._after();
  });

  return this;
};

Zlib.prototype._afterSync = function () {
  var avail_out = this.strm.avail_out;
  var avail_in = this.strm.avail_in;

  this.write_in_progress = false;

  return [avail_in, avail_out];
};

Zlib.prototype._process = function () {
  var next_expected_header_byte = null;

  // If the avail_out is left at 0, then it means that it ran out
  // of room.  If there was avail_out left over, then it means
  // that all of the input was consumed.
  switch (this.mode) {
    case exports.DEFLATE:
    case exports.GZIP:
    case exports.DEFLATERAW:
      this.err = zlib_deflate.deflate(this.strm, this.flush);
      break;
    case exports.UNZIP:
      if (this.strm.avail_in > 0) {
        next_expected_header_byte = this.strm.next_in;
      }

      switch (this.gzip_id_bytes_read) {
        case 0:
          if (next_expected_header_byte === null) {
            break;
          }

          if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID1) {
            this.gzip_id_bytes_read = 1;
            next_expected_header_byte++;

            if (this.strm.avail_in === 1) {
              // The only available byte was already read.
              break;
            }
          } else {
            this.mode = exports.INFLATE;
            break;
          }

        // fallthrough
        case 1:
          if (next_expected_header_byte === null) {
            break;
          }

          if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID2) {
            this.gzip_id_bytes_read = 2;
            this.mode = exports.GUNZIP;
          } else {
            // There is no actual difference between INFLATE and INFLATERAW
            // (after initialization).
            this.mode = exports.INFLATE;
          }

          break;
        default:
          throw new Error('invalid number of gzip magic number bytes read');
      }

    // fallthrough
    case exports.INFLATE:
    case exports.GUNZIP:
    case exports.INFLATERAW:
      this.err = zlib_inflate.inflate(this.strm, this.flush

      // If data was encoded with dictionary
      );if (this.err === exports.Z_NEED_DICT && this.dictionary) {
        // Load it
        this.err = zlib_inflate.inflateSetDictionary(this.strm, this.dictionary);
        if (this.err === exports.Z_OK) {
          // And try to decode again
          this.err = zlib_inflate.inflate(this.strm, this.flush);
        } else if (this.err === exports.Z_DATA_ERROR) {
          // Both inflateSetDictionary() and inflate() return Z_DATA_ERROR.
          // Make it possible for After() to tell a bad dictionary from bad
          // input.
          this.err = exports.Z_NEED_DICT;
        }
      }
      while (this.strm.avail_in > 0 && this.mode === exports.GUNZIP && this.err === exports.Z_STREAM_END && this.strm.next_in[0] !== 0x00) {
        // Bytes remain in input buffer. Perhaps this is another compressed
        // member in the same archive, or just trailing garbage.
        // Trailing zero bytes are okay, though, since they are frequently
        // used for padding.

        this.reset();
        this.err = zlib_inflate.inflate(this.strm, this.flush);
      }
      break;
    default:
      throw new Error('Unknown mode ' + this.mode);
  }
};

Zlib.prototype._checkError = function () {
  // Acceptable error states depend on the type of zlib stream.
  switch (this.err) {
    case exports.Z_OK:
    case exports.Z_BUF_ERROR:
      if (this.strm.avail_out !== 0 && this.flush === exports.Z_FINISH) {
        this._error('unexpected end of file');
        return false;
      }
      break;
    case exports.Z_STREAM_END:
      // normal statuses, not fatal
      break;
    case exports.Z_NEED_DICT:
      if (this.dictionary == null) {
        this._error('Missing dictionary');
      } else {
        this._error('Bad dictionary');
      }
      return false;
    default:
      // something else.
      this._error('Zlib error');
      return false;
  }

  return true;
};

Zlib.prototype._after = function () {
  if (!this._checkError()) {
    return;
  }

  var avail_out = this.strm.avail_out;
  var avail_in = this.strm.avail_in;

  this.write_in_progress = false;

  // call the write() cb
  this.callback(avail_in, avail_out);

  if (this.pending_close) {
    this.close();
  }
};

Zlib.prototype._error = function (message) {
  if (this.strm.msg) {
    message = this.strm.msg;
  }
  this.onerror(message, this.err

  // no hope of rescue.
  );this.write_in_progress = false;
  if (this.pending_close) {
    this.close();
  }
};

Zlib.prototype.init = function (windowBits, level, memLevel, strategy, dictionary) {
  assert(arguments.length === 4 || arguments.length === 5, 'init(windowBits, level, memLevel, strategy, [dictionary])');

  assert(windowBits >= 8 && windowBits <= 15, 'invalid windowBits');
  assert(level >= -1 && level <= 9, 'invalid compression level');

  assert(memLevel >= 1 && memLevel <= 9, 'invalid memlevel');

  assert(strategy === exports.Z_FILTERED || strategy === exports.Z_HUFFMAN_ONLY || strategy === exports.Z_RLE || strategy === exports.Z_FIXED || strategy === exports.Z_DEFAULT_STRATEGY, 'invalid strategy');

  this._init(level, windowBits, memLevel, strategy, dictionary);
  this._setDictionary();
};

Zlib.prototype.params = function () {
  throw new Error('deflateParams Not supported');
};

Zlib.prototype.reset = function () {
  this._reset();
  this._setDictionary();
};

Zlib.prototype._init = function (level, windowBits, memLevel, strategy, dictionary) {
  this.level = level;
  this.windowBits = windowBits;
  this.memLevel = memLevel;
  this.strategy = strategy;

  this.flush = exports.Z_NO_FLUSH;

  this.err = exports.Z_OK;

  if (this.mode === exports.GZIP || this.mode === exports.GUNZIP) {
    this.windowBits += 16;
  }

  if (this.mode === exports.UNZIP) {
    this.windowBits += 32;
  }

  if (this.mode === exports.DEFLATERAW || this.mode === exports.INFLATERAW) {
    this.windowBits = -1 * this.windowBits;
  }

  this.strm = new Zstream();

  switch (this.mode) {
    case exports.DEFLATE:
    case exports.GZIP:
    case exports.DEFLATERAW:
      this.err = zlib_deflate.deflateInit2(this.strm, this.level, exports.Z_DEFLATED, this.windowBits, this.memLevel, this.strategy);
      break;
    case exports.INFLATE:
    case exports.GUNZIP:
    case exports.INFLATERAW:
    case exports.UNZIP:
      this.err = zlib_inflate.inflateInit2(this.strm, this.windowBits);
      break;
    default:
      throw new Error('Unknown mode ' + this.mode);
  }

  if (this.err !== exports.Z_OK) {
    this._error('Init error');
  }

  this.dictionary = dictionary;

  this.write_in_progress = false;
  this.init_done = true;
};

Zlib.prototype._setDictionary = function () {
  if (this.dictionary == null) {
    return;
  }

  this.err = exports.Z_OK;

  switch (this.mode) {
    case exports.DEFLATE:
    case exports.DEFLATERAW:
      this.err = zlib_deflate.deflateSetDictionary(this.strm, this.dictionary);
      break;
    default:
      break;
  }

  if (this.err !== exports.Z_OK) {
    this._error('Failed to set dictionary');
  }
};

Zlib.prototype._reset = function () {
  this.err = exports.Z_OK;

  switch (this.mode) {
    case exports.DEFLATE:
    case exports.DEFLATERAW:
    case exports.GZIP:
      this.err = zlib_deflate.deflateReset(this.strm);
      break;
    case exports.INFLATE:
    case exports.INFLATERAW:
    case exports.GUNZIP:
      this.err = zlib_inflate.inflateReset(this.strm);
      break;
    default:
      break;
  }

  if (this.err !== exports.Z_OK) {
    this._error('Failed to reset stream');
  }
};

exports.Zlib = Zlib;
}).call(this)}).call(this,require('_process'),require("buffer").Buffer)
},{"_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","assert":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/assert.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","pako/lib/zlib/constants":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/constants.js","pako/lib/zlib/deflate.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/deflate.js","pako/lib/zlib/inflate.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/inflate.js","pako/lib/zlib/zstream":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/zstream.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify-zlib/lib/index.js":[function(require,module,exports){
(function (process){(function (){
'use strict';

var Buffer = require('buffer').Buffer;
var Transform = require('stream').Transform;
var binding = require('./binding');
var util = require('util');
var assert = require('assert').ok;
var kMaxLength = require('buffer').kMaxLength;
var kRangeErrorMessage = 'Cannot create final Buffer. It would be larger ' + 'than 0x' + kMaxLength.toString(16) + ' bytes';

// zlib doesn't provide these, so kludge them in following the same
// const naming scheme zlib uses.
binding.Z_MIN_WINDOWBITS = 8;
binding.Z_MAX_WINDOWBITS = 15;
binding.Z_DEFAULT_WINDOWBITS = 15;

// fewer than 64 bytes per chunk is stupid.
// technically it could work with as few as 8, but even 64 bytes
// is absurdly low.  Usually a MB or more is best.
binding.Z_MIN_CHUNK = 64;
binding.Z_MAX_CHUNK = Infinity;
binding.Z_DEFAULT_CHUNK = 16 * 1024;

binding.Z_MIN_MEMLEVEL = 1;
binding.Z_MAX_MEMLEVEL = 9;
binding.Z_DEFAULT_MEMLEVEL = 8;

binding.Z_MIN_LEVEL = -1;
binding.Z_MAX_LEVEL = 9;
binding.Z_DEFAULT_LEVEL = binding.Z_DEFAULT_COMPRESSION;

// expose all the zlib constants
var bkeys = Object.keys(binding);
for (var bk = 0; bk < bkeys.length; bk++) {
  var bkey = bkeys[bk];
  if (bkey.match(/^Z/)) {
    Object.defineProperty(exports, bkey, {
      enumerable: true, value: binding[bkey], writable: false
    });
  }
}

// translation table for return codes.
var codes = {
  Z_OK: binding.Z_OK,
  Z_STREAM_END: binding.Z_STREAM_END,
  Z_NEED_DICT: binding.Z_NEED_DICT,
  Z_ERRNO: binding.Z_ERRNO,
  Z_STREAM_ERROR: binding.Z_STREAM_ERROR,
  Z_DATA_ERROR: binding.Z_DATA_ERROR,
  Z_MEM_ERROR: binding.Z_MEM_ERROR,
  Z_BUF_ERROR: binding.Z_BUF_ERROR,
  Z_VERSION_ERROR: binding.Z_VERSION_ERROR
};

var ckeys = Object.keys(codes);
for (var ck = 0; ck < ckeys.length; ck++) {
  var ckey = ckeys[ck];
  codes[codes[ckey]] = ckey;
}

Object.defineProperty(exports, 'codes', {
  enumerable: true, value: Object.freeze(codes), writable: false
});

exports.Deflate = Deflate;
exports.Inflate = Inflate;
exports.Gzip = Gzip;
exports.Gunzip = Gunzip;
exports.DeflateRaw = DeflateRaw;
exports.InflateRaw = InflateRaw;
exports.Unzip = Unzip;

exports.createDeflate = function (o) {
  return new Deflate(o);
};

exports.createInflate = function (o) {
  return new Inflate(o);
};

exports.createDeflateRaw = function (o) {
  return new DeflateRaw(o);
};

exports.createInflateRaw = function (o) {
  return new InflateRaw(o);
};

exports.createGzip = function (o) {
  return new Gzip(o);
};

exports.createGunzip = function (o) {
  return new Gunzip(o);
};

exports.createUnzip = function (o) {
  return new Unzip(o);
};

// Convenience methods.
// compress/decompress a string or buffer in one step.
exports.deflate = function (buffer, opts, callback) {
  if (typeof opts === 'function') {
    callback = opts;
    opts = {};
  }
  return zlibBuffer(new Deflate(opts), buffer, callback);
};

exports.deflateSync = function (buffer, opts) {
  return zlibBufferSync(new Deflate(opts), buffer);
};

exports.gzip = function (buffer, opts, callback) {
  if (typeof opts === 'function') {
    callback = opts;
    opts = {};
  }
  return zlibBuffer(new Gzip(opts), buffer, callback);
};

exports.gzipSync = function (buffer, opts) {
  return zlibBufferSync(new Gzip(opts), buffer);
};

exports.deflateRaw = function (buffer, opts, callback) {
  if (typeof opts === 'function') {
    callback = opts;
    opts = {};
  }
  return zlibBuffer(new DeflateRaw(opts), buffer, callback);
};

exports.deflateRawSync = function (buffer, opts) {
  return zlibBufferSync(new DeflateRaw(opts), buffer);
};

exports.unzip = function (buffer, opts, callback) {
  if (typeof opts === 'function') {
    callback = opts;
    opts = {};
  }
  return zlibBuffer(new Unzip(opts), buffer, callback);
};

exports.unzipSync = function (buffer, opts) {
  return zlibBufferSync(new Unzip(opts), buffer);
};

exports.inflate = function (buffer, opts, callback) {
  if (typeof opts === 'function') {
    callback = opts;
    opts = {};
  }
  return zlibBuffer(new Inflate(opts), buffer, callback);
};

exports.inflateSync = function (buffer, opts) {
  return zlibBufferSync(new Inflate(opts), buffer);
};

exports.gunzip = function (buffer, opts, callback) {
  if (typeof opts === 'function') {
    callback = opts;
    opts = {};
  }
  return zlibBuffer(new Gunzip(opts), buffer, callback);
};

exports.gunzipSync = function (buffer, opts) {
  return zlibBufferSync(new Gunzip(opts), buffer);
};

exports.inflateRaw = function (buffer, opts, callback) {
  if (typeof opts === 'function') {
    callback = opts;
    opts = {};
  }
  return zlibBuffer(new InflateRaw(opts), buffer, callback);
};

exports.inflateRawSync = function (buffer, opts) {
  return zlibBufferSync(new InflateRaw(opts), buffer);
};

function zlibBuffer(engine, buffer, callback) {
  var buffers = [];
  var nread = 0;

  engine.on('error', onError);
  engine.on('end', onEnd);

  engine.end(buffer);
  flow();

  function flow() {
    var chunk;
    while (null !== (chunk = engine.read())) {
      buffers.push(chunk);
      nread += chunk.length;
    }
    engine.once('readable', flow);
  }

  function onError(err) {
    engine.removeListener('end', onEnd);
    engine.removeListener('readable', flow);
    callback(err);
  }

  function onEnd() {
    var buf;
    var err = null;

    if (nread >= kMaxLength) {
      err = new RangeError(kRangeErrorMessage);
    } else {
      buf = Buffer.concat(buffers, nread);
    }

    buffers = [];
    engine.close();
    callback(err, buf);
  }
}

function zlibBufferSync(engine, buffer) {
  if (typeof buffer === 'string') buffer = Buffer.from(buffer);

  if (!Buffer.isBuffer(buffer)) throw new TypeError('Not a string or buffer');

  var flushFlag = engine._finishFlushFlag;

  return engine._processChunk(buffer, flushFlag);
}

// generic zlib
// minimal 2-byte header
function Deflate(opts) {
  if (!(this instanceof Deflate)) return new Deflate(opts);
  Zlib.call(this, opts, binding.DEFLATE);
}

function Inflate(opts) {
  if (!(this instanceof Inflate)) return new Inflate(opts);
  Zlib.call(this, opts, binding.INFLATE);
}

// gzip - bigger header, same deflate compression
function Gzip(opts) {
  if (!(this instanceof Gzip)) return new Gzip(opts);
  Zlib.call(this, opts, binding.GZIP);
}

function Gunzip(opts) {
  if (!(this instanceof Gunzip)) return new Gunzip(opts);
  Zlib.call(this, opts, binding.GUNZIP);
}

// raw - no header
function DeflateRaw(opts) {
  if (!(this instanceof DeflateRaw)) return new DeflateRaw(opts);
  Zlib.call(this, opts, binding.DEFLATERAW);
}

function InflateRaw(opts) {
  if (!(this instanceof InflateRaw)) return new InflateRaw(opts);
  Zlib.call(this, opts, binding.INFLATERAW);
}

// auto-detect header.
function Unzip(opts) {
  if (!(this instanceof Unzip)) return new Unzip(opts);
  Zlib.call(this, opts, binding.UNZIP);
}

function isValidFlushFlag(flag) {
  return flag === binding.Z_NO_FLUSH || flag === binding.Z_PARTIAL_FLUSH || flag === binding.Z_SYNC_FLUSH || flag === binding.Z_FULL_FLUSH || flag === binding.Z_FINISH || flag === binding.Z_BLOCK;
}

// the Zlib class they all inherit from
// This thing manages the queue of requests, and returns
// true or false if there is anything in the queue when
// you call the .write() method.

function Zlib(opts, mode) {
  var _this = this;

  this._opts = opts = opts || {};
  this._chunkSize = opts.chunkSize || exports.Z_DEFAULT_CHUNK;

  Transform.call(this, opts);

  if (opts.flush && !isValidFlushFlag(opts.flush)) {
    throw new Error('Invalid flush flag: ' + opts.flush);
  }
  if (opts.finishFlush && !isValidFlushFlag(opts.finishFlush)) {
    throw new Error('Invalid flush flag: ' + opts.finishFlush);
  }

  this._flushFlag = opts.flush || binding.Z_NO_FLUSH;
  this._finishFlushFlag = typeof opts.finishFlush !== 'undefined' ? opts.finishFlush : binding.Z_FINISH;

  if (opts.chunkSize) {
    if (opts.chunkSize < exports.Z_MIN_CHUNK || opts.chunkSize > exports.Z_MAX_CHUNK) {
      throw new Error('Invalid chunk size: ' + opts.chunkSize);
    }
  }

  if (opts.windowBits) {
    if (opts.windowBits < exports.Z_MIN_WINDOWBITS || opts.windowBits > exports.Z_MAX_WINDOWBITS) {
      throw new Error('Invalid windowBits: ' + opts.windowBits);
    }
  }

  if (opts.level) {
    if (opts.level < exports.Z_MIN_LEVEL || opts.level > exports.Z_MAX_LEVEL) {
      throw new Error('Invalid compression level: ' + opts.level);
    }
  }

  if (opts.memLevel) {
    if (opts.memLevel < exports.Z_MIN_MEMLEVEL || opts.memLevel > exports.Z_MAX_MEMLEVEL) {
      throw new Error('Invalid memLevel: ' + opts.memLevel);
    }
  }

  if (opts.strategy) {
    if (opts.strategy != exports.Z_FILTERED && opts.strategy != exports.Z_HUFFMAN_ONLY && opts.strategy != exports.Z_RLE && opts.strategy != exports.Z_FIXED && opts.strategy != exports.Z_DEFAULT_STRATEGY) {
      throw new Error('Invalid strategy: ' + opts.strategy);
    }
  }

  if (opts.dictionary) {
    if (!Buffer.isBuffer(opts.dictionary)) {
      throw new Error('Invalid dictionary: it should be a Buffer instance');
    }
  }

  this._handle = new binding.Zlib(mode);

  var self = this;
  this._hadError = false;
  this._handle.onerror = function (message, errno) {
    // there is no way to cleanly recover.
    // continuing only obscures problems.
    _close(self);
    self._hadError = true;

    var error = new Error(message);
    error.errno = errno;
    error.code = exports.codes[errno];
    self.emit('error', error);
  };

  var level = exports.Z_DEFAULT_COMPRESSION;
  if (typeof opts.level === 'number') level = opts.level;

  var strategy = exports.Z_DEFAULT_STRATEGY;
  if (typeof opts.strategy === 'number') strategy = opts.strategy;

  this._handle.init(opts.windowBits || exports.Z_DEFAULT_WINDOWBITS, level, opts.memLevel || exports.Z_DEFAULT_MEMLEVEL, strategy, opts.dictionary);

  this._buffer = Buffer.allocUnsafe(this._chunkSize);
  this._offset = 0;
  this._level = level;
  this._strategy = strategy;

  this.once('end', this.close);

  Object.defineProperty(this, '_closed', {
    get: function () {
      return !_this._handle;
    },
    configurable: true,
    enumerable: true
  });
}

util.inherits(Zlib, Transform);

Zlib.prototype.params = function (level, strategy, callback) {
  if (level < exports.Z_MIN_LEVEL || level > exports.Z_MAX_LEVEL) {
    throw new RangeError('Invalid compression level: ' + level);
  }
  if (strategy != exports.Z_FILTERED && strategy != exports.Z_HUFFMAN_ONLY && strategy != exports.Z_RLE && strategy != exports.Z_FIXED && strategy != exports.Z_DEFAULT_STRATEGY) {
    throw new TypeError('Invalid strategy: ' + strategy);
  }

  if (this._level !== level || this._strategy !== strategy) {
    var self = this;
    this.flush(binding.Z_SYNC_FLUSH, function () {
      assert(self._handle, 'zlib binding closed');
      self._handle.params(level, strategy);
      if (!self._hadError) {
        self._level = level;
        self._strategy = strategy;
        if (callback) callback();
      }
    });
  } else {
    process.nextTick(callback);
  }
};

Zlib.prototype.reset = function () {
  assert(this._handle, 'zlib binding closed');
  return this._handle.reset();
};

// This is the _flush function called by the transform class,
// internally, when the last chunk has been written.
Zlib.prototype._flush = function (callback) {
  this._transform(Buffer.alloc(0), '', callback);
};

Zlib.prototype.flush = function (kind, callback) {
  var _this2 = this;

  var ws = this._writableState;

  if (typeof kind === 'function' || kind === undefined && !callback) {
    callback = kind;
    kind = binding.Z_FULL_FLUSH;
  }

  if (ws.ended) {
    if (callback) process.nextTick(callback);
  } else if (ws.ending) {
    if (callback) this.once('end', callback);
  } else if (ws.needDrain) {
    if (callback) {
      this.once('drain', function () {
        return _this2.flush(kind, callback);
      });
    }
  } else {
    this._flushFlag = kind;
    this.write(Buffer.alloc(0), '', callback);
  }
};

Zlib.prototype.close = function (callback) {
  _close(this, callback);
  process.nextTick(emitCloseNT, this);
};

function _close(engine, callback) {
  if (callback) process.nextTick(callback);

  // Caller may invoke .close after a zlib error (which will null _handle).
  if (!engine._handle) return;

  engine._handle.close();
  engine._handle = null;
}

function emitCloseNT(self) {
  self.emit('close');
}

Zlib.prototype._transform = function (chunk, encoding, cb) {
  var flushFlag;
  var ws = this._writableState;
  var ending = ws.ending || ws.ended;
  var last = ending && (!chunk || ws.length === chunk.length);

  if (chunk !== null && !Buffer.isBuffer(chunk)) return cb(new Error('invalid input'));

  if (!this._handle) return cb(new Error('zlib binding closed'));

  // If it's the last chunk, or a final flush, we use the Z_FINISH flush flag
  // (or whatever flag was provided using opts.finishFlush).
  // If it's explicitly flushing at some other time, then we use
  // Z_FULL_FLUSH. Otherwise, use Z_NO_FLUSH for maximum compression
  // goodness.
  if (last) flushFlag = this._finishFlushFlag;else {
    flushFlag = this._flushFlag;
    // once we've flushed the last of the queue, stop flushing and
    // go back to the normal behavior.
    if (chunk.length >= ws.length) {
      this._flushFlag = this._opts.flush || binding.Z_NO_FLUSH;
    }
  }

  this._processChunk(chunk, flushFlag, cb);
};

Zlib.prototype._processChunk = function (chunk, flushFlag, cb) {
  var availInBefore = chunk && chunk.length;
  var availOutBefore = this._chunkSize - this._offset;
  var inOff = 0;

  var self = this;

  var async = typeof cb === 'function';

  if (!async) {
    var buffers = [];
    var nread = 0;

    var error;
    this.on('error', function (er) {
      error = er;
    });

    assert(this._handle, 'zlib binding closed');
    do {
      var res = this._handle.writeSync(flushFlag, chunk, // in
      inOff, // in_off
      availInBefore, // in_len
      this._buffer, // out
      this._offset, //out_off
      availOutBefore); // out_len
    } while (!this._hadError && callback(res[0], res[1]));

    if (this._hadError) {
      throw error;
    }

    if (nread >= kMaxLength) {
      _close(this);
      throw new RangeError(kRangeErrorMessage);
    }

    var buf = Buffer.concat(buffers, nread);
    _close(this);

    return buf;
  }

  assert(this._handle, 'zlib binding closed');
  var req = this._handle.write(flushFlag, chunk, // in
  inOff, // in_off
  availInBefore, // in_len
  this._buffer, // out
  this._offset, //out_off
  availOutBefore); // out_len

  req.buffer = chunk;
  req.callback = callback;

  function callback(availInAfter, availOutAfter) {
    // When the callback is used in an async write, the callback's
    // context is the `req` object that was created. The req object
    // is === this._handle, and that's why it's important to null
    // out the values after they are done being used. `this._handle`
    // can stay in memory longer than the callback and buffer are needed.
    if (this) {
      this.buffer = null;
      this.callback = null;
    }

    if (self._hadError) return;

    var have = availOutBefore - availOutAfter;
    assert(have >= 0, 'have should not go down');

    if (have > 0) {
      var out = self._buffer.slice(self._offset, self._offset + have);
      self._offset += have;
      // serve some output to the consumer.
      if (async) {
        self.push(out);
      } else {
        buffers.push(out);
        nread += out.length;
      }
    }

    // exhausted the output buffer, or used all the input create a new one.
    if (availOutAfter === 0 || self._offset >= self._chunkSize) {
      availOutBefore = self._chunkSize;
      self._offset = 0;
      self._buffer = Buffer.allocUnsafe(self._chunkSize);
    }

    if (availOutAfter === 0) {
      // Not actually done.  Need to reprocess.
      // Also, update the availInBefore to the availInAfter value,
      // so that if we have to hit it a third (fourth, etc.) time,
      // it'll have the correct byte counts.
      inOff += availInBefore - availInAfter;
      availInBefore = availInAfter;

      if (!async) return true;

      var newReq = self._handle.write(flushFlag, chunk, inOff, availInBefore, self._buffer, self._offset, self._chunkSize);
      newReq.callback = callback; // this same function
      newReq.buffer = chunk;
      return;
    }

    if (!async) return false;

    // finished with the chunk.
    cb();
  }
};

util.inherits(Deflate, Zlib);
util.inherits(Inflate, Zlib);
util.inherits(Gzip, Zlib);
util.inherits(Gunzip, Zlib);
util.inherits(DeflateRaw, Zlib);
util.inherits(InflateRaw, Zlib);
util.inherits(Unzip, Zlib);
}).call(this)}).call(this,require('_process'))
},{"./binding":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify-zlib/lib/binding.js","_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","assert":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/assert.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","stream":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/stream-browserify/index.js","util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/util/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/lib/_empty.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/es6.object.to-string.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * The buffer module from node.js, for the browser.
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */
/* eslint-disable no-proto */

'use strict'

var base64 = require('base64-js')
var ieee754 = require('ieee754')

exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50

var K_MAX_LENGTH = 0x7fffffff
exports.kMaxLength = K_MAX_LENGTH

/**
 * If `Buffer.TYPED_ARRAY_SUPPORT`:
 *   === true    Use Uint8Array implementation (fastest)
 *   === false   Print warning and recommend using `buffer` v4.x which has an Object
 *               implementation (most compatible, even IE6)
 *
 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
 * Opera 11.6+, iOS 4.2+.
 *
 * We report that the browser does not support typed arrays if the are not subclassable
 * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
 * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
 * for __proto__ and has a buggy typed array implementation.
 */
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()

if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
    typeof console.error === 'function') {
  console.error(
    'This browser lacks typed array (Uint8Array) support which is required by ' +
    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
  )
}

function typedArraySupport () {
  // Can typed array instances can be augmented?
  try {
    var arr = new Uint8Array(1)
    arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }
    return arr.foo() === 42
  } catch (e) {
    return false
  }
}

Object.defineProperty(Buffer.prototype, 'parent', {
  enumerable: true,
  get: function () {
    if (!Buffer.isBuffer(this)) return undefined
    return this.buffer
  }
})

Object.defineProperty(Buffer.prototype, 'offset', {
  enumerable: true,
  get: function () {
    if (!Buffer.isBuffer(this)) return undefined
    return this.byteOffset
  }
})

function createBuffer (length) {
  if (length > K_MAX_LENGTH) {
    throw new RangeError('The value "' + length + '" is invalid for option "size"')
  }
  // Return an augmented `Uint8Array` instance
  var buf = new Uint8Array(length)
  buf.__proto__ = Buffer.prototype
  return buf
}

/**
 * The Buffer constructor returns instances of `Uint8Array` that have their
 * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
 * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
 * and the `Uint8Array` methods. Square bracket notation works as expected -- it
 * returns a single octet.
 *
 * The `Uint8Array` prototype remains unmodified.
 */

function Buffer (arg, encodingOrOffset, length) {
  // Common case.
  if (typeof arg === 'number') {
    if (typeof encodingOrOffset === 'string') {
      throw new TypeError(
        'The "string" argument must be of type string. Received type number'
      )
    }
    return allocUnsafe(arg)
  }
  return from(arg, encodingOrOffset, length)
}

// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
if (typeof Symbol !== 'undefined' && Symbol.species != null &&
    Buffer[Symbol.species] === Buffer) {
  Object.defineProperty(Buffer, Symbol.species, {
    value: null,
    configurable: true,
    enumerable: false,
    writable: false
  })
}

Buffer.poolSize = 8192 // not used by this implementation

function from (value, encodingOrOffset, length) {
  if (typeof value === 'string') {
    return fromString(value, encodingOrOffset)
  }

  if (ArrayBuffer.isView(value)) {
    return fromArrayLike(value)
  }

  if (value == null) {
    throw TypeError(
      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
      'or Array-like Object. Received type ' + (typeof value)
    )
  }

  if (isInstance(value, ArrayBuffer) ||
      (value && isInstance(value.buffer, ArrayBuffer))) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof value === 'number') {
    throw new TypeError(
      'The "value" argument must not be of type number. Received type number'
    )
  }

  var valueOf = value.valueOf && value.valueOf()
  if (valueOf != null && valueOf !== value) {
    return Buffer.from(valueOf, encodingOrOffset, length)
  }

  var b = fromObject(value)
  if (b) return b

  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
      typeof value[Symbol.toPrimitive] === 'function') {
    return Buffer.from(
      value[Symbol.toPrimitive]('string'), encodingOrOffset, length
    )
  }

  throw new TypeError(
    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
    'or Array-like Object. Received type ' + (typeof value)
  )
}

/**
 * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
 * if value is a number.
 * Buffer.from(str[, encoding])
 * Buffer.from(array)
 * Buffer.from(buffer)
 * Buffer.from(arrayBuffer[, byteOffset[, length]])
 **/
Buffer.from = function (value, encodingOrOffset, length) {
  return from(value, encodingOrOffset, length)
}

// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
// https://github.com/feross/buffer/pull/148
Buffer.prototype.__proto__ = Uint8Array.prototype
Buffer.__proto__ = Uint8Array

function assertSize (size) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be of type number')
  } else if (size < 0) {
    throw new RangeError('The value "' + size + '" is invalid for option "size"')
  }
}

function alloc (size, fill, encoding) {
  assertSize(size)
  if (size <= 0) {
    return createBuffer(size)
  }
  if (fill !== undefined) {
    // Only pay attention to encoding if it's a string. This
    // prevents accidentally sending in a number that would
    // be interpretted as a start offset.
    return typeof encoding === 'string'
      ? createBuffer(size).fill(fill, encoding)
      : createBuffer(size).fill(fill)
  }
  return createBuffer(size)
}

/**
 * Creates a new filled Buffer instance.
 * alloc(size[, fill[, encoding]])
 **/
Buffer.alloc = function (size, fill, encoding) {
  return alloc(size, fill, encoding)
}

function allocUnsafe (size) {
  assertSize(size)
  return createBuffer(size < 0 ? 0 : checked(size) | 0)
}

/**
 * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
 * */
Buffer.allocUnsafe = function (size) {
  return allocUnsafe(size)
}
/**
 * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
 */
Buffer.allocUnsafeSlow = function (size) {
  return allocUnsafe(size)
}

function fromString (string, encoding) {
  if (typeof encoding !== 'string' || encoding === '') {
    encoding = 'utf8'
  }

  if (!Buffer.isEncoding(encoding)) {
    throw new TypeError('Unknown encoding: ' + encoding)
  }

  var length = byteLength(string, encoding) | 0
  var buf = createBuffer(length)

  var actual = buf.write(string, encoding)

  if (actual !== length) {
    // Writing a hex string, for example, that contains invalid characters will
    // cause everything after the first invalid character to be ignored. (e.g.
    // 'abxxcd' will be treated as 'ab')
    buf = buf.slice(0, actual)
  }

  return buf
}

function fromArrayLike (array) {
  var length = array.length < 0 ? 0 : checked(array.length) | 0
  var buf = createBuffer(length)
  for (var i = 0; i < length; i += 1) {
    buf[i] = array[i] & 255
  }
  return buf
}

function fromArrayBuffer (array, byteOffset, length) {
  if (byteOffset < 0 || array.byteLength < byteOffset) {
    throw new RangeError('"offset" is outside of buffer bounds')
  }

  if (array.byteLength < byteOffset + (length || 0)) {
    throw new RangeError('"length" is outside of buffer bounds')
  }

  var buf
  if (byteOffset === undefined && length === undefined) {
    buf = new Uint8Array(array)
  } else if (length === undefined) {
    buf = new Uint8Array(array, byteOffset)
  } else {
    buf = new Uint8Array(array, byteOffset, length)
  }

  // Return an augmented `Uint8Array` instance
  buf.__proto__ = Buffer.prototype
  return buf
}

function fromObject (obj) {
  if (Buffer.isBuffer(obj)) {
    var len = checked(obj.length) | 0
    var buf = createBuffer(len)

    if (buf.length === 0) {
      return buf
    }

    obj.copy(buf, 0, 0, len)
    return buf
  }

  if (obj.length !== undefined) {
    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
      return createBuffer(0)
    }
    return fromArrayLike(obj)
  }

  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
    return fromArrayLike(obj.data)
  }
}

function checked (length) {
  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
  // length is NaN (which is otherwise coerced to zero.)
  if (length >= K_MAX_LENGTH) {
    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
  }
  return length | 0
}

function SlowBuffer (length) {
  if (+length != length) { // eslint-disable-line eqeqeq
    length = 0
  }
  return Buffer.alloc(+length)
}

Buffer.isBuffer = function isBuffer (b) {
  return b != null && b._isBuffer === true &&
    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
}

Buffer.compare = function compare (a, b) {
  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
    throw new TypeError(
      'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
    )
  }

  if (a === b) return 0

  var x = a.length
  var y = b.length

  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
    if (a[i] !== b[i]) {
      x = a[i]
      y = b[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

Buffer.isEncoding = function isEncoding (encoding) {
  switch (String(encoding).toLowerCase()) {
    case 'hex':
    case 'utf8':
    case 'utf-8':
    case 'ascii':
    case 'latin1':
    case 'binary':
    case 'base64':
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      return true
    default:
      return false
  }
}

Buffer.concat = function concat (list, length) {
  if (!Array.isArray(list)) {
    throw new TypeError('"list" argument must be an Array of Buffers')
  }

  if (list.length === 0) {
    return Buffer.alloc(0)
  }

  var i
  if (length === undefined) {
    length = 0
    for (i = 0; i < list.length; ++i) {
      length += list[i].length
    }
  }

  var buffer = Buffer.allocUnsafe(length)
  var pos = 0
  for (i = 0; i < list.length; ++i) {
    var buf = list[i]
    if (isInstance(buf, Uint8Array)) {
      buf = Buffer.from(buf)
    }
    if (!Buffer.isBuffer(buf)) {
      throw new TypeError('"list" argument must be an Array of Buffers')
    }
    buf.copy(buffer, pos)
    pos += buf.length
  }
  return buffer
}

function byteLength (string, encoding) {
  if (Buffer.isBuffer(string)) {
    return string.length
  }
  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
    return string.byteLength
  }
  if (typeof string !== 'string') {
    throw new TypeError(
      'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
      'Received type ' + typeof string
    )
  }

  var len = string.length
  var mustMatch = (arguments.length > 2 && arguments[2] === true)
  if (!mustMatch && len === 0) return 0

  // Use a for loop to avoid recursion
  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'ascii':
      case 'latin1':
      case 'binary':
        return len
      case 'utf8':
      case 'utf-8':
        return utf8ToBytes(string).length
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return len * 2
      case 'hex':
        return len >>> 1
      case 'base64':
        return base64ToBytes(string).length
      default:
        if (loweredCase) {
          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
        }
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}
Buffer.byteLength = byteLength

function slowToString (encoding, start, end) {
  var loweredCase = false

  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
  // property of a typed array.

  // This behaves neither like String nor Uint8Array in that we set start/end
  // to their upper/lower bounds if the value passed is out of range.
  // undefined is handled specially as per ECMA-262 6th Edition,
  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
  if (start === undefined || start < 0) {
    start = 0
  }
  // Return early if start > this.length. Done here to prevent potential uint32
  // coercion fail below.
  if (start > this.length) {
    return ''
  }

  if (end === undefined || end > this.length) {
    end = this.length
  }

  if (end <= 0) {
    return ''
  }

  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
  end >>>= 0
  start >>>= 0

  if (end <= start) {
    return ''
  }

  if (!encoding) encoding = 'utf8'

  while (true) {
    switch (encoding) {
      case 'hex':
        return hexSlice(this, start, end)

      case 'utf8':
      case 'utf-8':
        return utf8Slice(this, start, end)

      case 'ascii':
        return asciiSlice(this, start, end)

      case 'latin1':
      case 'binary':
        return latin1Slice(this, start, end)

      case 'base64':
        return base64Slice(this, start, end)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return utf16leSlice(this, start, end)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = (encoding + '').toLowerCase()
        loweredCase = true
    }
  }
}

// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
// reliably in a browserify context because there could be multiple different
// copies of the 'buffer' package in use. This method works even for Buffer
// instances that were created from another copy of the `buffer` package.
// See: https://github.com/feross/buffer/issues/154
Buffer.prototype._isBuffer = true

function swap (b, n, m) {
  var i = b[n]
  b[n] = b[m]
  b[m] = i
}

Buffer.prototype.swap16 = function swap16 () {
  var len = this.length
  if (len % 2 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 16-bits')
  }
  for (var i = 0; i < len; i += 2) {
    swap(this, i, i + 1)
  }
  return this
}

Buffer.prototype.swap32 = function swap32 () {
  var len = this.length
  if (len % 4 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 32-bits')
  }
  for (var i = 0; i < len; i += 4) {
    swap(this, i, i + 3)
    swap(this, i + 1, i + 2)
  }
  return this
}

Buffer.prototype.swap64 = function swap64 () {
  var len = this.length
  if (len % 8 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 64-bits')
  }
  for (var i = 0; i < len; i += 8) {
    swap(this, i, i + 7)
    swap(this, i + 1, i + 6)
    swap(this, i + 2, i + 5)
    swap(this, i + 3, i + 4)
  }
  return this
}

Buffer.prototype.toString = function toString () {
  var length = this.length
  if (length === 0) return ''
  if (arguments.length === 0) return utf8Slice(this, 0, length)
  return slowToString.apply(this, arguments)
}

Buffer.prototype.toLocaleString = Buffer.prototype.toString

Buffer.prototype.equals = function equals (b) {
  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  if (this === b) return true
  return Buffer.compare(this, b) === 0
}

Buffer.prototype.inspect = function inspect () {
  var str = ''
  var max = exports.INSPECT_MAX_BYTES
  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
  if (this.length > max) str += ' ... '
  return '<Buffer ' + str + '>'
}

Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
  if (isInstance(target, Uint8Array)) {
    target = Buffer.from(target, target.offset, target.byteLength)
  }
  if (!Buffer.isBuffer(target)) {
    throw new TypeError(
      'The "target" argument must be one of type Buffer or Uint8Array. ' +
      'Received type ' + (typeof target)
    )
  }

  if (start === undefined) {
    start = 0
  }
  if (end === undefined) {
    end = target ? target.length : 0
  }
  if (thisStart === undefined) {
    thisStart = 0
  }
  if (thisEnd === undefined) {
    thisEnd = this.length
  }

  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
    throw new RangeError('out of range index')
  }

  if (thisStart >= thisEnd && start >= end) {
    return 0
  }
  if (thisStart >= thisEnd) {
    return -1
  }
  if (start >= end) {
    return 1
  }

  start >>>= 0
  end >>>= 0
  thisStart >>>= 0
  thisEnd >>>= 0

  if (this === target) return 0

  var x = thisEnd - thisStart
  var y = end - start
  var len = Math.min(x, y)

  var thisCopy = this.slice(thisStart, thisEnd)
  var targetCopy = target.slice(start, end)

  for (var i = 0; i < len; ++i) {
    if (thisCopy[i] !== targetCopy[i]) {
      x = thisCopy[i]
      y = targetCopy[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
//
// Arguments:
// - buffer - a Buffer to search
// - val - a string, Buffer, or number
// - byteOffset - an index into `buffer`; will be clamped to an int32
// - encoding - an optional encoding, relevant is val is a string
// - dir - true for indexOf, false for lastIndexOf
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  // Empty buffer means no match
  if (buffer.length === 0) return -1

  // Normalize byteOffset
  if (typeof byteOffset === 'string') {
    encoding = byteOffset
    byteOffset = 0
  } else if (byteOffset > 0x7fffffff) {
    byteOffset = 0x7fffffff
  } else if (byteOffset < -0x80000000) {
    byteOffset = -0x80000000
  }
  byteOffset = +byteOffset // Coerce to Number.
  if (numberIsNaN(byteOffset)) {
    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
    byteOffset = dir ? 0 : (buffer.length - 1)
  }

  // Normalize byteOffset: negative offsets start from the end of the buffer
  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
  if (byteOffset >= buffer.length) {
    if (dir) return -1
    else byteOffset = buffer.length - 1
  } else if (byteOffset < 0) {
    if (dir) byteOffset = 0
    else return -1
  }

  // Normalize val
  if (typeof val === 'string') {
    val = Buffer.from(val, encoding)
  }

  // Finally, search either indexOf (if dir is true) or lastIndexOf
  if (Buffer.isBuffer(val)) {
    // Special case: looking for empty string/buffer always fails
    if (val.length === 0) {
      return -1
    }
    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
  } else if (typeof val === 'number') {
    val = val & 0xFF // Search for a byte value [0-255]
    if (typeof Uint8Array.prototype.indexOf === 'function') {
      if (dir) {
        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
      } else {
        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
      }
    }
    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
  }

  throw new TypeError('val must be string, number or Buffer')
}

function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  var indexSize = 1
  var arrLength = arr.length
  var valLength = val.length

  if (encoding !== undefined) {
    encoding = String(encoding).toLowerCase()
    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
        encoding === 'utf16le' || encoding === 'utf-16le') {
      if (arr.length < 2 || val.length < 2) {
        return -1
      }
      indexSize = 2
      arrLength /= 2
      valLength /= 2
      byteOffset /= 2
    }
  }

  function read (buf, i) {
    if (indexSize === 1) {
      return buf[i]
    } else {
      return buf.readUInt16BE(i * indexSize)
    }
  }

  var i
  if (dir) {
    var foundIndex = -1
    for (i = byteOffset; i < arrLength; i++) {
      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
        if (foundIndex === -1) foundIndex = i
        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
      } else {
        if (foundIndex !== -1) i -= i - foundIndex
        foundIndex = -1
      }
    }
  } else {
    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
    for (i = byteOffset; i >= 0; i--) {
      var found = true
      for (var j = 0; j < valLength; j++) {
        if (read(arr, i + j) !== read(val, j)) {
          found = false
          break
        }
      }
      if (found) return i
    }
  }

  return -1
}

Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
  return this.indexOf(val, byteOffset, encoding) !== -1
}

Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
}

Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
}

function hexWrite (buf, string, offset, length) {
  offset = Number(offset) || 0
  var remaining = buf.length - offset
  if (!length) {
    length = remaining
  } else {
    length = Number(length)
    if (length > remaining) {
      length = remaining
    }
  }

  var strLen = string.length

  if (length > strLen / 2) {
    length = strLen / 2
  }
  for (var i = 0; i < length; ++i) {
    var parsed = parseInt(string.substr(i * 2, 2), 16)
    if (numberIsNaN(parsed)) return i
    buf[offset + i] = parsed
  }
  return i
}

function utf8Write (buf, string, offset, length) {
  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}

function asciiWrite (buf, string, offset, length) {
  return blitBuffer(asciiToBytes(string), buf, offset, length)
}

function latin1Write (buf, string, offset, length) {
  return asciiWrite(buf, string, offset, length)
}

function base64Write (buf, string, offset, length) {
  return blitBuffer(base64ToBytes(string), buf, offset, length)
}

function ucs2Write (buf, string, offset, length) {
  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}

Buffer.prototype.write = function write (string, offset, length, encoding) {
  // Buffer#write(string)
  if (offset === undefined) {
    encoding = 'utf8'
    length = this.length
    offset = 0
  // Buffer#write(string, encoding)
  } else if (length === undefined && typeof offset === 'string') {
    encoding = offset
    length = this.length
    offset = 0
  // Buffer#write(string, offset[, length][, encoding])
  } else if (isFinite(offset)) {
    offset = offset >>> 0
    if (isFinite(length)) {
      length = length >>> 0
      if (encoding === undefined) encoding = 'utf8'
    } else {
      encoding = length
      length = undefined
    }
  } else {
    throw new Error(
      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
    )
  }

  var remaining = this.length - offset
  if (length === undefined || length > remaining) length = remaining

  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
    throw new RangeError('Attempt to write outside buffer bounds')
  }

  if (!encoding) encoding = 'utf8'

  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'hex':
        return hexWrite(this, string, offset, length)

      case 'utf8':
      case 'utf-8':
        return utf8Write(this, string, offset, length)

      case 'ascii':
        return asciiWrite(this, string, offset, length)

      case 'latin1':
      case 'binary':
        return latin1Write(this, string, offset, length)

      case 'base64':
        // Warning: maxLength not taken into account in base64Write
        return base64Write(this, string, offset, length)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return ucs2Write(this, string, offset, length)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}

Buffer.prototype.toJSON = function toJSON () {
  return {
    type: 'Buffer',
    data: Array.prototype.slice.call(this._arr || this, 0)
  }
}

function base64Slice (buf, start, end) {
  if (start === 0 && end === buf.length) {
    return base64.fromByteArray(buf)
  } else {
    return base64.fromByteArray(buf.slice(start, end))
  }
}

function utf8Slice (buf, start, end) {
  end = Math.min(buf.length, end)
  var res = []

  var i = start
  while (i < end) {
    var firstByte = buf[i]
    var codePoint = null
    var bytesPerSequence = (firstByte > 0xEF) ? 4
      : (firstByte > 0xDF) ? 3
        : (firstByte > 0xBF) ? 2
          : 1

    if (i + bytesPerSequence <= end) {
      var secondByte, thirdByte, fourthByte, tempCodePoint

      switch (bytesPerSequence) {
        case 1:
          if (firstByte < 0x80) {
            codePoint = firstByte
          }
          break
        case 2:
          secondByte = buf[i + 1]
          if ((secondByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
            if (tempCodePoint > 0x7F) {
              codePoint = tempCodePoint
            }
          }
          break
        case 3:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
              codePoint = tempCodePoint
            }
          }
          break
        case 4:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          fourthByte = buf[i + 3]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
              codePoint = tempCodePoint
            }
          }
      }
    }

    if (codePoint === null) {
      // we did not generate a valid codePoint so insert a
      // replacement char (U+FFFD) and advance only 1 byte
      codePoint = 0xFFFD
      bytesPerSequence = 1
    } else if (codePoint > 0xFFFF) {
      // encode to utf16 (surrogate pair dance)
      codePoint -= 0x10000
      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
      codePoint = 0xDC00 | codePoint & 0x3FF
    }

    res.push(codePoint)
    i += bytesPerSequence
  }

  return decodeCodePointsArray(res)
}

// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000

function decodeCodePointsArray (codePoints) {
  var len = codePoints.length
  if (len <= MAX_ARGUMENTS_LENGTH) {
    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
  }

  // Decode in chunks to avoid "call stack size exceeded".
  var res = ''
  var i = 0
  while (i < len) {
    res += String.fromCharCode.apply(
      String,
      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
    )
  }
  return res
}

function asciiSlice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i] & 0x7F)
  }
  return ret
}

function latin1Slice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i])
  }
  return ret
}

function hexSlice (buf, start, end) {
  var len = buf.length

  if (!start || start < 0) start = 0
  if (!end || end < 0 || end > len) end = len

  var out = ''
  for (var i = start; i < end; ++i) {
    out += toHex(buf[i])
  }
  return out
}

function utf16leSlice (buf, start, end) {
  var bytes = buf.slice(start, end)
  var res = ''
  for (var i = 0; i < bytes.length; i += 2) {
    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
  }
  return res
}

Buffer.prototype.slice = function slice (start, end) {
  var len = this.length
  start = ~~start
  end = end === undefined ? len : ~~end

  if (start < 0) {
    start += len
    if (start < 0) start = 0
  } else if (start > len) {
    start = len
  }

  if (end < 0) {
    end += len
    if (end < 0) end = 0
  } else if (end > len) {
    end = len
  }

  if (end < start) end = start

  var newBuf = this.subarray(start, end)
  // Return an augmented `Uint8Array` instance
  newBuf.__proto__ = Buffer.prototype
  return newBuf
}

/*
 * Need to make sure that buffer isn't trying to write out of bounds.
 */
function checkOffset (offset, ext, length) {
  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}

Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }

  return val
}

Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    checkOffset(offset, byteLength, this.length)
  }

  var val = this[offset + --byteLength]
  var mul = 1
  while (byteLength > 0 && (mul *= 0x100)) {
    val += this[offset + --byteLength] * mul
  }

  return val
}

Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  return this[offset]
}

Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return this[offset] | (this[offset + 1] << 8)
}

Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return (this[offset] << 8) | this[offset + 1]
}

Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return ((this[offset]) |
      (this[offset + 1] << 8) |
      (this[offset + 2] << 16)) +
      (this[offset + 3] * 0x1000000)
}

Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] * 0x1000000) +
    ((this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    this[offset + 3])
}

Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var i = byteLength
  var mul = 1
  var val = this[offset + --i]
  while (i > 0 && (mul *= 0x100)) {
    val += this[offset + --i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  if (!(this[offset] & 0x80)) return (this[offset])
  return ((0xff - this[offset] + 1) * -1)
}

Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset] | (this[offset + 1] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset + 1] | (this[offset] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset]) |
    (this[offset + 1] << 8) |
    (this[offset + 2] << 16) |
    (this[offset + 3] << 24)
}

Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] << 24) |
    (this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    (this[offset + 3])
}

Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, true, 23, 4)
}

Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, false, 23, 4)
}

Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, true, 52, 8)
}

Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, false, 52, 8)
}

function checkInt (buf, value, offset, ext, max, min) {
  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
}

Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var mul = 1
  var i = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var i = byteLength - 1
  var mul = 1
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset + 3] = (value >>> 24)
  this[offset + 2] = (value >>> 16)
  this[offset + 1] = (value >>> 8)
  this[offset] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = 0
  var mul = 1
  var sub = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = byteLength - 1
  var mul = 1
  var sub = 0
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
  if (value < 0) value = 0xff + value + 1
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  this[offset + 2] = (value >>> 16)
  this[offset + 3] = (value >>> 24)
  return offset + 4
}

Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (value < 0) value = 0xffffffff + value + 1
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

function checkIEEE754 (buf, value, offset, ext, max, min) {
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
  if (offset < 0) throw new RangeError('Index out of range')
}

function writeFloat (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
  }
  ieee754.write(buf, value, offset, littleEndian, 23, 4)
  return offset + 4
}

Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
  return writeFloat(this, value, offset, true, noAssert)
}

Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
  return writeFloat(this, value, offset, false, noAssert)
}

function writeDouble (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
  }
  ieee754.write(buf, value, offset, littleEndian, 52, 8)
  return offset + 8
}

Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
  return writeDouble(this, value, offset, true, noAssert)
}

Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
  return writeDouble(this, value, offset, false, noAssert)
}

// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
  if (!start) start = 0
  if (!end && end !== 0) end = this.length
  if (targetStart >= target.length) targetStart = target.length
  if (!targetStart) targetStart = 0
  if (end > 0 && end < start) end = start

  // Copy 0 bytes; we're done
  if (end === start) return 0
  if (target.length === 0 || this.length === 0) return 0

  // Fatal error conditions
  if (targetStart < 0) {
    throw new RangeError('targetStart out of bounds')
  }
  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
  if (end < 0) throw new RangeError('sourceEnd out of bounds')

  // Are we oob?
  if (end > this.length) end = this.length
  if (target.length - targetStart < end - start) {
    end = target.length - targetStart + start
  }

  var len = end - start

  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
    // Use built-in when available, missing from IE11
    this.copyWithin(targetStart, start, end)
  } else if (this === target && start < targetStart && targetStart < end) {
    // descending copy from end
    for (var i = len - 1; i >= 0; --i) {
      target[i + targetStart] = this[i + start]
    }
  } else {
    Uint8Array.prototype.set.call(
      target,
      this.subarray(start, end),
      targetStart
    )
  }

  return len
}

// Usage:
//    buffer.fill(number[, offset[, end]])
//    buffer.fill(buffer[, offset[, end]])
//    buffer.fill(string[, offset[, end]][, encoding])
Buffer.prototype.fill = function fill (val, start, end, encoding) {
  // Handle string cases:
  if (typeof val === 'string') {
    if (typeof start === 'string') {
      encoding = start
      start = 0
      end = this.length
    } else if (typeof end === 'string') {
      encoding = end
      end = this.length
    }
    if (encoding !== undefined && typeof encoding !== 'string') {
      throw new TypeError('encoding must be a string')
    }
    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
      throw new TypeError('Unknown encoding: ' + encoding)
    }
    if (val.length === 1) {
      var code = val.charCodeAt(0)
      if ((encoding === 'utf8' && code < 128) ||
          encoding === 'latin1') {
        // Fast path: If `val` fits into a single byte, use that numeric value.
        val = code
      }
    }
  } else if (typeof val === 'number') {
    val = val & 255
  }

  // Invalid ranges are not set to a default, so can range check early.
  if (start < 0 || this.length < start || this.length < end) {
    throw new RangeError('Out of range index')
  }

  if (end <= start) {
    return this
  }

  start = start >>> 0
  end = end === undefined ? this.length : end >>> 0

  if (!val) val = 0

  var i
  if (typeof val === 'number') {
    for (i = start; i < end; ++i) {
      this[i] = val
    }
  } else {
    var bytes = Buffer.isBuffer(val)
      ? val
      : Buffer.from(val, encoding)
    var len = bytes.length
    if (len === 0) {
      throw new TypeError('The value "' + val +
        '" is invalid for argument "value"')
    }
    for (i = 0; i < end - start; ++i) {
      this[i + start] = bytes[i % len]
    }
  }

  return this
}

// HELPER FUNCTIONS
// ================

var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g

function base64clean (str) {
  // Node takes equal signs as end of the Base64 encoding
  str = str.split('=')[0]
  // Node strips out invalid characters like \n and \t from the string, base64-js does not
  str = str.trim().replace(INVALID_BASE64_RE, '')
  // Node converts strings with length < 2 to ''
  if (str.length < 2) return ''
  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
  while (str.length % 4 !== 0) {
    str = str + '='
  }
  return str
}

function toHex (n) {
  if (n < 16) return '0' + n.toString(16)
  return n.toString(16)
}

function utf8ToBytes (string, units) {
  units = units || Infinity
  var codePoint
  var length = string.length
  var leadSurrogate = null
  var bytes = []

  for (var i = 0; i < length; ++i) {
    codePoint = string.charCodeAt(i)

    // is surrogate component
    if (codePoint > 0xD7FF && codePoint < 0xE000) {
      // last char was a lead
      if (!leadSurrogate) {
        // no lead yet
        if (codePoint > 0xDBFF) {
          // unexpected trail
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        } else if (i + 1 === length) {
          // unpaired lead
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        }

        // valid lead
        leadSurrogate = codePoint

        continue
      }

      // 2 leads in a row
      if (codePoint < 0xDC00) {
        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
        leadSurrogate = codePoint
        continue
      }

      // valid surrogate pair
      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
    } else if (leadSurrogate) {
      // valid bmp char, but last char was a lead
      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
    }

    leadSurrogate = null

    // encode utf8
    if (codePoint < 0x80) {
      if ((units -= 1) < 0) break
      bytes.push(codePoint)
    } else if (codePoint < 0x800) {
      if ((units -= 2) < 0) break
      bytes.push(
        codePoint >> 0x6 | 0xC0,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x10000) {
      if ((units -= 3) < 0) break
      bytes.push(
        codePoint >> 0xC | 0xE0,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x110000) {
      if ((units -= 4) < 0) break
      bytes.push(
        codePoint >> 0x12 | 0xF0,
        codePoint >> 0xC & 0x3F | 0x80,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else {
      throw new Error('Invalid code point')
    }
  }

  return bytes
}

function asciiToBytes (str) {
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    // Node's code seems to be doing this and not & 0x7F..
    byteArray.push(str.charCodeAt(i) & 0xFF)
  }
  return byteArray
}

function utf16leToBytes (str, units) {
  var c, hi, lo
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    if ((units -= 2) < 0) break

    c = str.charCodeAt(i)
    hi = c >> 8
    lo = c % 256
    byteArray.push(lo)
    byteArray.push(hi)
  }

  return byteArray
}

function base64ToBytes (str) {
  return base64.toByteArray(base64clean(str))
}

function blitBuffer (src, dst, offset, length) {
  for (var i = 0; i < length; ++i) {
    if ((i + offset >= dst.length) || (i >= src.length)) break
    dst[i + offset] = src[i]
  }
  return i
}

// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
// the `instanceof` check but they should be treated as of that type.
// See: https://github.com/feross/buffer/issues/166
function isInstance (obj, type) {
  return obj instanceof type ||
    (obj != null && obj.constructor != null && obj.constructor.name != null &&
      obj.constructor.name === type.name)
}
function numberIsNaN (obj) {
  // For IE11 support
  return obj !== obj // eslint-disable-line no-self-compare
}

}).call(this)}).call(this,require("buffer").Buffer)
},{"base64-js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/base64-js/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","ieee754":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ieee754/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/call-bind/callBound.js":[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBind = require('./');

var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));

module.exports = function callBoundIntrinsic(name, allowMissing) {
	var intrinsic = GetIntrinsic(name, !!allowMissing);
	if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
		return callBind(intrinsic);
	}
	return intrinsic;
};

},{"./":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/call-bind/index.js","get-intrinsic":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/get-intrinsic/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/call-bind/index.js":[function(require,module,exports){
'use strict';

var bind = require('function-bind');
var GetIntrinsic = require('get-intrinsic');

var $apply = GetIntrinsic('%Function.prototype.apply%');
var $call = GetIntrinsic('%Function.prototype.call%');
var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);

var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
var $max = GetIntrinsic('%Math.max%');

if ($defineProperty) {
	try {
		$defineProperty({}, 'a', { value: 1 });
	} catch (e) {
		// IE 8 has a broken defineProperty
		$defineProperty = null;
	}
}

module.exports = function callBind(originalFunction) {
	var func = $reflectApply(bind, $call, arguments);
	if ($gOPD && $defineProperty) {
		var desc = $gOPD(func, 'length');
		if (desc.configurable) {
			// original length, plus the receiver, minus any additional arguments (after the receiver)
			$defineProperty(
				func,
				'length',
				{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }
			);
		}
	}
	return func;
};

var applyBind = function applyBind() {
	return $reflectApply(bind, $apply, arguments);
};

if ($defineProperty) {
	$defineProperty(module.exports, 'apply', { value: applyBind });
} else {
	module.exports.apply = applyBind;
}

},{"function-bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/function-bind/index.js","get-intrinsic":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/get-intrinsic/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/charenc/charenc.js":[function(require,module,exports){
var charenc = {
  // UTF-8 encoding
  utf8: {
    // Convert a string to a byte array
    stringToBytes: function(str) {
      return charenc.bin.stringToBytes(unescape(encodeURIComponent(str)));
    },

    // Convert a byte array to a string
    bytesToString: function(bytes) {
      return decodeURIComponent(escape(charenc.bin.bytesToString(bytes)));
    }
  },

  // Binary encoding
  bin: {
    // Convert a string to a byte array
    stringToBytes: function(str) {
      for (var bytes = [], i = 0; i < str.length; i++)
        bytes.push(str.charCodeAt(i) & 0xFF);
      return bytes;
    },

    // Convert a byte array to a string
    bytesToString: function(bytes) {
      for (var str = [], i = 0; i < bytes.length; i++)
        str.push(String.fromCharCode(bytes[i]));
      return str.join('');
    }
  }
};

module.exports = charenc;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/array/from.js":[function(require,module,exports){
var parent = require('../../stable/array/from');

module.exports = parent;

},{"../../stable/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/from.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/array/is-array.js":[function(require,module,exports){
var parent = require('../../stable/array/is-array');

module.exports = parent;

},{"../../stable/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/get-iterator-method.js":[function(require,module,exports){
var parent = require('../stable/get-iterator-method');

module.exports = parent;

},{"../stable/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/get-iterator-method.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/get-iterator.js":[function(require,module,exports){
var parent = require('../stable/get-iterator');

module.exports = parent;

},{"../stable/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/get-iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/instance/index-of.js":[function(require,module,exports){
var parent = require('../../stable/instance/index-of');

module.exports = parent;

},{"../../stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/instance/slice.js":[function(require,module,exports){
var parent = require('../../stable/instance/slice');

module.exports = parent;

},{"../../stable/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/create.js":[function(require,module,exports){
var parent = require('../../stable/object/create');

module.exports = parent;

},{"../../stable/object/create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/create.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/define-property.js":[function(require,module,exports){
var parent = require('../../stable/object/define-property');

module.exports = parent;

},{"../../stable/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/get-own-property-descriptor.js":[function(require,module,exports){
var parent = require('../../stable/object/get-own-property-descriptor');

module.exports = parent;

},{"../../stable/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/get-own-property-descriptor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/get-own-property-symbols.js":[function(require,module,exports){
var parent = require('../../stable/object/get-own-property-symbols');

module.exports = parent;

},{"../../stable/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/get-own-property-symbols.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/get-prototype-of.js":[function(require,module,exports){
var parent = require('../../stable/object/get-prototype-of');

module.exports = parent;

},{"../../stable/object/get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/get-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/keys.js":[function(require,module,exports){
var parent = require('../../stable/object/keys');

module.exports = parent;

},{"../../stable/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/set-prototype-of.js":[function(require,module,exports){
var parent = require('../../stable/object/set-prototype-of');

module.exports = parent;

},{"../../stable/object/set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/set-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/promise/index.js":[function(require,module,exports){
var parent = require('../../stable/promise');

module.exports = parent;

},{"../../stable/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/promise/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/reflect/get.js":[function(require,module,exports){
var parent = require('../../stable/reflect/get');

module.exports = parent;

},{"../../stable/reflect/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/reflect/get.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/symbol/index.js":[function(require,module,exports){
var parent = require('../../stable/symbol');

module.exports = parent;

},{"../../stable/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/symbol/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/symbol/iterator.js":[function(require,module,exports){
var parent = require('../../stable/symbol/iterator');

module.exports = parent;

},{"../../stable/symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/symbol/iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/weak-map/index.js":[function(require,module,exports){
var parent = require('../../stable/weak-map');

module.exports = parent;

},{"../../stable/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/weak-map/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/from.js":[function(require,module,exports){
require('../../modules/es.string.iterator');
require('../../modules/es.array.from');
var path = require('../../internals/path');

module.exports = path.Array.from;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.array.from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.from.js","../../modules/es.string.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/is-array.js":[function(require,module,exports){
require('../../modules/es.array.is-array');
var path = require('../../internals/path');

module.exports = path.Array.isArray;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.array.is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/concat.js":[function(require,module,exports){
require('../../../modules/es.array.concat');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').concat;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.concat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/every.js":[function(require,module,exports){
require('../../../modules/es.array.every');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').every;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.every":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.every.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/filter.js":[function(require,module,exports){
require('../../../modules/es.array.filter');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').filter;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.filter.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/find-index.js":[function(require,module,exports){
require('../../../modules/es.array.find-index');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').findIndex;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.find-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.find-index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/find.js":[function(require,module,exports){
require('../../../modules/es.array.find');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').find;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.find.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/flat-map.js":[function(require,module,exports){
require('../../../modules/es.array.flat-map');
require('../../../modules/es.array.unscopables.flat-map');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').flatMap;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.flat-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.flat-map.js","../../../modules/es.array.unscopables.flat-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.unscopables.flat-map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/flat.js":[function(require,module,exports){
require('../../../modules/es.array.flat');
require('../../../modules/es.array.unscopables.flat');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').flat;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.flat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.flat.js","../../../modules/es.array.unscopables.flat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.unscopables.flat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/for-each.js":[function(require,module,exports){
require('../../../modules/es.array.for-each');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').forEach;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.for-each.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/includes.js":[function(require,module,exports){
require('../../../modules/es.array.includes');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').includes;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.includes.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/index-of.js":[function(require,module,exports){
require('../../../modules/es.array.index-of');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').indexOf;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/keys.js":[function(require,module,exports){
require('../../../modules/es.array.iterator');
require('../../../modules/es.object.to-string');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').keys;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.iterator.js","../../../modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/last-index-of.js":[function(require,module,exports){
require('../../../modules/es.array.last-index-of');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').lastIndexOf;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.last-index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.last-index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/map.js":[function(require,module,exports){
require('../../../modules/es.array.map');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').map;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/reduce.js":[function(require,module,exports){
require('../../../modules/es.array.reduce');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').reduce;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/reverse.js":[function(require,module,exports){
require('../../../modules/es.array.reverse');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').reverse;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.reverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.reverse.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/slice.js":[function(require,module,exports){
require('../../../modules/es.array.slice');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').slice;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/some.js":[function(require,module,exports){
require('../../../modules/es.array.some');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').some;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.some.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/sort.js":[function(require,module,exports){
require('../../../modules/es.array.sort');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').sort;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.sort":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.sort.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/splice.js":[function(require,module,exports){
require('../../../modules/es.array.splice');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').splice;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.splice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/values.js":[function(require,module,exports){
require('../../../modules/es.array.iterator');
require('../../../modules/es.object.to-string');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').values;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.array.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.iterator.js","../../../modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/date/now.js":[function(require,module,exports){
require('../../modules/es.date.now');
var path = require('../../internals/path');

module.exports = path.Date.now;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.date.now":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.date.now.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/function/virtual/bind.js":[function(require,module,exports){
require('../../../modules/es.function.bind');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Function').bind;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.function.bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.function.bind.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/get-iterator-method.js":[function(require,module,exports){
require('../modules/es.array.iterator');
require('../modules/es.string.iterator');
var getIteratorMethod = require('../internals/get-iterator-method');

module.exports = getIteratorMethod;

},{"../internals/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-iterator-method.js","../modules/es.array.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.iterator.js","../modules/es.string.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/get-iterator.js":[function(require,module,exports){
require('../modules/es.array.iterator');
require('../modules/es.string.iterator');
var getIterator = require('../internals/get-iterator');

module.exports = getIterator;

},{"../internals/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-iterator.js","../modules/es.array.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.iterator.js","../modules/es.string.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/bind.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../function/virtual/bind');

var FunctionPrototype = Function.prototype;

module.exports = function (it) {
  var own = it.bind;
  return it === FunctionPrototype || (isPrototypeOf(FunctionPrototype, it) && own === FunctionPrototype.bind) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../function/virtual/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/function/virtual/bind.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/concat.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/concat');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.concat;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.concat) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/concat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/every.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/every');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.every;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.every) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/every":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/every.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/filter.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/filter');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.filter;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.filter) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/filter.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/find-index.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/find-index');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.findIndex;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.findIndex) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/find-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/find-index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/find.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/find');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.find;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.find) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/find.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/flat-map.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/flat-map');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.flatMap;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.flatMap) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/flat-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/flat-map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/flat.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/flat');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.flat;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.flat) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/flat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/flat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/includes.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var arrayMethod = require('../array/virtual/includes');
var stringMethod = require('../string/virtual/includes');

var ArrayPrototype = Array.prototype;
var StringPrototype = String.prototype;

module.exports = function (it) {
  var own = it.includes;
  if (it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.includes)) return arrayMethod;
  if (typeof it == 'string' || it === StringPrototype || (isPrototypeOf(StringPrototype, it) && own === StringPrototype.includes)) {
    return stringMethod;
  } return own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/includes.js","../string/virtual/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/string/virtual/includes.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/index-of.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/index-of');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.indexOf;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.indexOf) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/last-index-of.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/last-index-of');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.lastIndexOf;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.lastIndexOf) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/last-index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/last-index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/map.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/map');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.map;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.map) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/pad-end.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../string/virtual/pad-end');

var StringPrototype = String.prototype;

module.exports = function (it) {
  var own = it.padEnd;
  return typeof it == 'string' || it === StringPrototype
    || (isPrototypeOf(StringPrototype, it) && own === StringPrototype.padEnd) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../string/virtual/pad-end":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/string/virtual/pad-end.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/pad-start.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../string/virtual/pad-start');

var StringPrototype = String.prototype;

module.exports = function (it) {
  var own = it.padStart;
  return typeof it == 'string' || it === StringPrototype
    || (isPrototypeOf(StringPrototype, it) && own === StringPrototype.padStart) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../string/virtual/pad-start":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/string/virtual/pad-start.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/reduce.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/reduce');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.reduce;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.reduce) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/reverse.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/reverse');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.reverse;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.reverse) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/reverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/reverse.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/slice.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/slice');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.slice;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.slice) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/some.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/some');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.some;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.some) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/some.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/sort.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/sort');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.sort;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.sort) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/sort":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/sort.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/splice.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/splice');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
  var own = it.splice;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.splice) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../array/virtual/splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/splice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/starts-with.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../string/virtual/starts-with');

var StringPrototype = String.prototype;

module.exports = function (it) {
  var own = it.startsWith;
  return typeof it == 'string' || it === StringPrototype
    || (isPrototypeOf(StringPrototype, it) && own === StringPrototype.startsWith) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../string/virtual/starts-with":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/string/virtual/starts-with.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/trim.js":[function(require,module,exports){
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../string/virtual/trim');

var StringPrototype = String.prototype;

module.exports = function (it) {
  var own = it.trim;
  return typeof it == 'string' || it === StringPrototype
    || (isPrototypeOf(StringPrototype, it) && own === StringPrototype.trim) ? method : own;
};

},{"../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../string/virtual/trim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/string/virtual/trim.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/json/stringify.js":[function(require,module,exports){
require('../../modules/es.json.stringify');
var path = require('../../internals/path');
var apply = require('../../internals/function-apply');

// eslint-disable-next-line es-x/no-json -- safe
if (!path.JSON) path.JSON = { stringify: JSON.stringify };

// eslint-disable-next-line no-unused-vars -- required for `.length`
module.exports = function stringify(it, replacer, space) {
  return apply(path.JSON.stringify, null, arguments);
};

},{"../../internals/function-apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-apply.js","../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.json.stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.json.stringify.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/number/is-integer.js":[function(require,module,exports){
require('../../modules/es.number.is-integer');
var path = require('../../internals/path');

module.exports = path.Number.isInteger;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.number.is-integer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.number.is-integer.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/assign.js":[function(require,module,exports){
require('../../modules/es.object.assign');
var path = require('../../internals/path');

module.exports = path.Object.assign;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.assign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.assign.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/create.js":[function(require,module,exports){
require('../../modules/es.object.create');
var path = require('../../internals/path');

var Object = path.Object;

module.exports = function create(P, D) {
  return Object.create(P, D);
};

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.create.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/define-properties.js":[function(require,module,exports){
require('../../modules/es.object.define-properties');
var path = require('../../internals/path');

var Object = path.Object;

var defineProperties = module.exports = function defineProperties(T, D) {
  return Object.defineProperties(T, D);
};

if (Object.defineProperties.sham) defineProperties.sham = true;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.define-properties.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/define-property.js":[function(require,module,exports){
require('../../modules/es.object.define-property');
var path = require('../../internals/path');

var Object = path.Object;

var defineProperty = module.exports = function defineProperty(it, key, desc) {
  return Object.defineProperty(it, key, desc);
};

if (Object.defineProperty.sham) defineProperty.sham = true;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/entries.js":[function(require,module,exports){
require('../../modules/es.object.entries');
var path = require('../../internals/path');

module.exports = path.Object.entries;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.entries":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.entries.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/freeze.js":[function(require,module,exports){
require('../../modules/es.object.freeze');
var path = require('../../internals/path');

module.exports = path.Object.freeze;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.freeze":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.freeze.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/get-own-property-descriptor.js":[function(require,module,exports){
require('../../modules/es.object.get-own-property-descriptor');
var path = require('../../internals/path');

var Object = path.Object;

var getOwnPropertyDescriptor = module.exports = function getOwnPropertyDescriptor(it, key) {
  return Object.getOwnPropertyDescriptor(it, key);
};

if (Object.getOwnPropertyDescriptor.sham) getOwnPropertyDescriptor.sham = true;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.get-own-property-descriptor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/get-own-property-descriptors.js":[function(require,module,exports){
require('../../modules/es.object.get-own-property-descriptors');
var path = require('../../internals/path');

module.exports = path.Object.getOwnPropertyDescriptors;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.get-own-property-descriptors.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/get-own-property-symbols.js":[function(require,module,exports){
require('../../modules/es.symbol');
var path = require('../../internals/path');

module.exports = path.Object.getOwnPropertySymbols;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/get-prototype-of.js":[function(require,module,exports){
require('../../modules/es.object.get-prototype-of');
var path = require('../../internals/path');

module.exports = path.Object.getPrototypeOf;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.get-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/is.js":[function(require,module,exports){
require('../../modules/es.object.is');
var path = require('../../internals/path');

module.exports = path.Object.is;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.is.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/keys.js":[function(require,module,exports){
require('../../modules/es.object.keys');
var path = require('../../internals/path');

module.exports = path.Object.keys;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/set-prototype-of.js":[function(require,module,exports){
require('../../modules/es.object.set-prototype-of');
var path = require('../../internals/path');

module.exports = path.Object.setPrototypeOf;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.set-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/values.js":[function(require,module,exports){
require('../../modules/es.object.values');
var path = require('../../internals/path');

module.exports = path.Object.values;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.object.values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.values.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/parse-float.js":[function(require,module,exports){
require('../modules/es.parse-float');
var path = require('../internals/path');

module.exports = path.parseFloat;

},{"../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../modules/es.parse-float":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.parse-float.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/parse-int.js":[function(require,module,exports){
require('../modules/es.parse-int');
var path = require('../internals/path');

module.exports = path.parseInt;

},{"../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../modules/es.parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.parse-int.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/promise/index.js":[function(require,module,exports){
require('../../modules/es.aggregate-error');
require('../../modules/es.array.iterator');
require('../../modules/es.object.to-string');
require('../../modules/es.promise');
require('../../modules/es.promise.all-settled');
require('../../modules/es.promise.any');
require('../../modules/es.promise.finally');
require('../../modules/es.string.iterator');
var path = require('../../internals/path');

module.exports = path.Promise;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.aggregate-error":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.aggregate-error.js","../../modules/es.array.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.iterator.js","../../modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.to-string.js","../../modules/es.promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.js","../../modules/es.promise.all-settled":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.all-settled.js","../../modules/es.promise.any":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.any.js","../../modules/es.promise.finally":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.finally.js","../../modules/es.string.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/reflect/construct.js":[function(require,module,exports){
require('../../modules/es.reflect.construct');
var path = require('../../internals/path');

module.exports = path.Reflect.construct;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.reflect.construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.reflect.construct.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/reflect/get.js":[function(require,module,exports){
require('../../modules/es.reflect.get');
var path = require('../../internals/path');

module.exports = path.Reflect.get;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.reflect.get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.reflect.get.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/set/index.js":[function(require,module,exports){
require('../../modules/es.array.iterator');
require('../../modules/es.object.to-string');
require('../../modules/es.set');
require('../../modules/es.string.iterator');
var path = require('../../internals/path');

module.exports = path.Set;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.array.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.iterator.js","../../modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.to-string.js","../../modules/es.set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.set.js","../../modules/es.string.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/string/virtual/includes.js":[function(require,module,exports){
require('../../../modules/es.string.includes');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('String').includes;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.string.includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.includes.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/string/virtual/pad-end.js":[function(require,module,exports){
require('../../../modules/es.string.pad-end');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('String').padEnd;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.string.pad-end":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.pad-end.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/string/virtual/pad-start.js":[function(require,module,exports){
require('../../../modules/es.string.pad-start');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('String').padStart;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.string.pad-start":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.pad-start.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/string/virtual/starts-with.js":[function(require,module,exports){
require('../../../modules/es.string.starts-with');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('String').startsWith;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.string.starts-with":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.starts-with.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/string/virtual/trim.js":[function(require,module,exports){
require('../../../modules/es.string.trim');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('String').trim;

},{"../../../internals/entry-virtual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js","../../../modules/es.string.trim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.trim.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/symbol/index.js":[function(require,module,exports){
require('../../modules/es.array.concat');
require('../../modules/es.object.to-string');
require('../../modules/es.symbol');
require('../../modules/es.symbol.async-iterator');
require('../../modules/es.symbol.description');
require('../../modules/es.symbol.has-instance');
require('../../modules/es.symbol.is-concat-spreadable');
require('../../modules/es.symbol.iterator');
require('../../modules/es.symbol.match');
require('../../modules/es.symbol.match-all');
require('../../modules/es.symbol.replace');
require('../../modules/es.symbol.search');
require('../../modules/es.symbol.species');
require('../../modules/es.symbol.split');
require('../../modules/es.symbol.to-primitive');
require('../../modules/es.symbol.to-string-tag');
require('../../modules/es.symbol.unscopables');
require('../../modules/es.json.to-string-tag');
require('../../modules/es.math.to-string-tag');
require('../../modules/es.reflect.to-string-tag');
var path = require('../../internals/path');

module.exports = path.Symbol;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.array.concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.concat.js","../../modules/es.json.to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.json.to-string-tag.js","../../modules/es.math.to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.math.to-string-tag.js","../../modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.to-string.js","../../modules/es.reflect.to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.reflect.to-string-tag.js","../../modules/es.symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.js","../../modules/es.symbol.async-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.async-iterator.js","../../modules/es.symbol.description":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.description.js","../../modules/es.symbol.has-instance":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.has-instance.js","../../modules/es.symbol.is-concat-spreadable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.is-concat-spreadable.js","../../modules/es.symbol.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.iterator.js","../../modules/es.symbol.match":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.match.js","../../modules/es.symbol.match-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.match-all.js","../../modules/es.symbol.replace":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.replace.js","../../modules/es.symbol.search":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.search.js","../../modules/es.symbol.species":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.species.js","../../modules/es.symbol.split":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.split.js","../../modules/es.symbol.to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.to-primitive.js","../../modules/es.symbol.to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.to-string-tag.js","../../modules/es.symbol.unscopables":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.unscopables.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/symbol/iterator.js":[function(require,module,exports){
require('../../modules/es.array.iterator');
require('../../modules/es.object.to-string');
require('../../modules/es.string.iterator');
require('../../modules/es.symbol.iterator');
var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');

module.exports = WrappedWellKnownSymbolModule.f('iterator');

},{"../../internals/well-known-symbol-wrapped":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol-wrapped.js","../../modules/es.array.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.iterator.js","../../modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.to-string.js","../../modules/es.string.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.iterator.js","../../modules/es.symbol.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/symbol/replace.js":[function(require,module,exports){
require('../../modules/es.regexp.exec');
require('../../modules/es.symbol.replace');
require('../../modules/es.string.replace');
var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');

module.exports = WrappedWellKnownSymbolModule.f('replace');

},{"../../internals/well-known-symbol-wrapped":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol-wrapped.js","../../modules/es.regexp.exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.regexp.exec.js","../../modules/es.string.replace":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.replace.js","../../modules/es.symbol.replace":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.replace.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/weak-map/index.js":[function(require,module,exports){
require('../../modules/es.array.iterator');
require('../../modules/es.object.to-string');
require('../../modules/es.weak-map');
var path = require('../../internals/path');

module.exports = path.WeakMap;

},{"../../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../../modules/es.array.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.iterator.js","../../modules/es.object.to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.to-string.js","../../modules/es.weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.weak-map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/array/from.js":[function(require,module,exports){
module.exports = require('../../full/array/from');

},{"../../full/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/array/from.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/array/is-array.js":[function(require,module,exports){
module.exports = require('../../full/array/is-array');

},{"../../full/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/array/is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/get-iterator-method.js":[function(require,module,exports){
module.exports = require('../full/get-iterator-method');

},{"../full/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/get-iterator-method.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/get-iterator.js":[function(require,module,exports){
module.exports = require('../full/get-iterator');

},{"../full/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/get-iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/instance/index-of.js":[function(require,module,exports){
module.exports = require('../../full/instance/index-of');

},{"../../full/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/instance/index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/instance/slice.js":[function(require,module,exports){
module.exports = require('../../full/instance/slice');

},{"../../full/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/instance/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/create.js":[function(require,module,exports){
module.exports = require('../../full/object/create');

},{"../../full/object/create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/create.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/define-property.js":[function(require,module,exports){
module.exports = require('../../full/object/define-property');

},{"../../full/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/get-own-property-descriptor.js":[function(require,module,exports){
module.exports = require('../../full/object/get-own-property-descriptor');

},{"../../full/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/get-own-property-descriptor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/get-own-property-symbols.js":[function(require,module,exports){
module.exports = require('../../full/object/get-own-property-symbols');

},{"../../full/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/get-own-property-symbols.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/get-prototype-of.js":[function(require,module,exports){
module.exports = require('../../full/object/get-prototype-of');

},{"../../full/object/get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/get-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/keys.js":[function(require,module,exports){
module.exports = require('../../full/object/keys');

},{"../../full/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/object/set-prototype-of.js":[function(require,module,exports){
module.exports = require('../../full/object/set-prototype-of');

},{"../../full/object/set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/set-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/promise/index.js":[function(require,module,exports){
module.exports = require('../../full/promise');

},{"../../full/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/promise/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/reflect/get.js":[function(require,module,exports){
module.exports = require('../../full/reflect/get');

},{"../../full/reflect/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/reflect/get.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/symbol/index.js":[function(require,module,exports){
module.exports = require('../../full/symbol');

},{"../../full/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/symbol/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/symbol/iterator.js":[function(require,module,exports){
module.exports = require('../../full/symbol/iterator');

},{"../../full/symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/symbol/iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/features/weak-map/index.js":[function(require,module,exports){
module.exports = require('../../full/weak-map');

},{"../../full/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/weak-map/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/array/from.js":[function(require,module,exports){
var parent = require('../../actual/array/from');

module.exports = parent;

},{"../../actual/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/array/from.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/array/is-array.js":[function(require,module,exports){
var parent = require('../../actual/array/is-array');

module.exports = parent;

},{"../../actual/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/array/is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/get-iterator-method.js":[function(require,module,exports){
var parent = require('../actual/get-iterator-method');

module.exports = parent;

},{"../actual/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/get-iterator-method.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/get-iterator.js":[function(require,module,exports){
var parent = require('../actual/get-iterator');

module.exports = parent;

},{"../actual/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/get-iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/instance/index-of.js":[function(require,module,exports){
var parent = require('../../actual/instance/index-of');

module.exports = parent;

},{"../../actual/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/instance/index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/instance/slice.js":[function(require,module,exports){
var parent = require('../../actual/instance/slice');

module.exports = parent;

},{"../../actual/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/instance/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/create.js":[function(require,module,exports){
var parent = require('../../actual/object/create');

module.exports = parent;

},{"../../actual/object/create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/create.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/define-property.js":[function(require,module,exports){
var parent = require('../../actual/object/define-property');

module.exports = parent;

},{"../../actual/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/get-own-property-descriptor.js":[function(require,module,exports){
var parent = require('../../actual/object/get-own-property-descriptor');

module.exports = parent;

},{"../../actual/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/get-own-property-descriptor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/get-own-property-symbols.js":[function(require,module,exports){
var parent = require('../../actual/object/get-own-property-symbols');

module.exports = parent;

},{"../../actual/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/get-own-property-symbols.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/get-prototype-of.js":[function(require,module,exports){
var parent = require('../../actual/object/get-prototype-of');

module.exports = parent;

},{"../../actual/object/get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/get-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/keys.js":[function(require,module,exports){
var parent = require('../../actual/object/keys');

module.exports = parent;

},{"../../actual/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/object/set-prototype-of.js":[function(require,module,exports){
var parent = require('../../actual/object/set-prototype-of');

module.exports = parent;

},{"../../actual/object/set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/object/set-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/promise/index.js":[function(require,module,exports){
var parent = require('../../actual/promise');
require('../../modules/esnext.aggregate-error');
// TODO: Remove from `core-js@4`
require('../../modules/esnext.promise.all-settled');
require('../../modules/esnext.promise.try');
require('../../modules/esnext.promise.any');

module.exports = parent;

},{"../../actual/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/promise/index.js","../../modules/esnext.aggregate-error":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.aggregate-error.js","../../modules/esnext.promise.all-settled":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.promise.all-settled.js","../../modules/esnext.promise.any":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.promise.any.js","../../modules/esnext.promise.try":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.promise.try.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/reflect/get.js":[function(require,module,exports){
var parent = require('../../actual/reflect/get');

module.exports = parent;

},{"../../actual/reflect/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/reflect/get.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/symbol/index.js":[function(require,module,exports){
var parent = require('../../actual/symbol');
require('../../modules/esnext.symbol.async-dispose');
require('../../modules/esnext.symbol.dispose');
require('../../modules/esnext.symbol.matcher');
require('../../modules/esnext.symbol.metadata');
require('../../modules/esnext.symbol.observable');
// TODO: Remove from `core-js@4`
require('../../modules/esnext.symbol.pattern-match');
// TODO: Remove from `core-js@4`
require('../../modules/esnext.symbol.replace-all');

module.exports = parent;

},{"../../actual/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/symbol/index.js","../../modules/esnext.symbol.async-dispose":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.async-dispose.js","../../modules/esnext.symbol.dispose":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.dispose.js","../../modules/esnext.symbol.matcher":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.matcher.js","../../modules/esnext.symbol.metadata":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.metadata.js","../../modules/esnext.symbol.observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.observable.js","../../modules/esnext.symbol.pattern-match":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.pattern-match.js","../../modules/esnext.symbol.replace-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.replace-all.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/symbol/iterator.js":[function(require,module,exports){
var parent = require('../../actual/symbol/iterator');

module.exports = parent;

},{"../../actual/symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/symbol/iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/full/weak-map/index.js":[function(require,module,exports){
var parent = require('../../actual/weak-map');
require('../../modules/es.string.iterator');
require('../../modules/esnext.weak-map.emplace');
require('../../modules/esnext.weak-map.from');
require('../../modules/esnext.weak-map.of');
require('../../modules/esnext.weak-map.delete-all');
// TODO: remove from `core-js@4`
require('../../modules/esnext.weak-map.upsert');

module.exports = parent;

},{"../../actual/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/actual/weak-map/index.js","../../modules/es.string.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.iterator.js","../../modules/esnext.weak-map.delete-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.weak-map.delete-all.js","../../modules/esnext.weak-map.emplace":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.weak-map.emplace.js","../../modules/esnext.weak-map.from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.weak-map.from.js","../../modules/esnext.weak-map.of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.weak-map.of.js","../../modules/esnext.weak-map.upsert":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.weak-map.upsert.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js":[function(require,module,exports){
var global = require('../internals/global');
var isCallable = require('../internals/is-callable');
var tryToString = require('../internals/try-to-string');

var TypeError = global.TypeError;

// `Assert: IsCallable(argument) is true`
module.exports = function (argument) {
  if (isCallable(argument)) return argument;
  throw TypeError(tryToString(argument) + ' is not a function');
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/try-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/try-to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-constructor.js":[function(require,module,exports){
var global = require('../internals/global');
var isConstructor = require('../internals/is-constructor');
var tryToString = require('../internals/try-to-string');

var TypeError = global.TypeError;

// `Assert: IsConstructor(argument) is true`
module.exports = function (argument) {
  if (isConstructor(argument)) return argument;
  throw TypeError(tryToString(argument) + ' is not a constructor');
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-constructor.js","../internals/try-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/try-to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-possible-prototype.js":[function(require,module,exports){
var global = require('../internals/global');
var isCallable = require('../internals/is-callable');

var String = global.String;
var TypeError = global.TypeError;

module.exports = function (argument) {
  if (typeof argument == 'object' || isCallable(argument)) return argument;
  throw TypeError("Can't set " + String(argument) + ' as a prototype');
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/add-to-unscopables.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_add-to-unscopables.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-instance.js":[function(require,module,exports){
var global = require('../internals/global');
var isPrototypeOf = require('../internals/object-is-prototype-of');

var TypeError = global.TypeError;

module.exports = function (it, Prototype) {
  if (isPrototypeOf(Prototype, it)) return it;
  throw TypeError('Incorrect invocation');
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js":[function(require,module,exports){
var global = require('../internals/global');
var isObject = require('../internals/is-object');

var String = global.String;
var TypeError = global.TypeError;

// `Assert: Type(argument) is Object`
module.exports = function (argument) {
  if (isObject(argument)) return argument;
  throw TypeError(String(argument) + ' is not an object');
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-buffer-non-extensible.js":[function(require,module,exports){
// FF26- bug: ArrayBuffers are non-extensible, but Object.isExtensible does not report it
var fails = require('../internals/fails');

module.exports = fails(function () {
  if (typeof ArrayBuffer == 'function') {
    var buffer = new ArrayBuffer(8);
    // eslint-disable-next-line es-x/no-object-isextensible, es-x/no-object-defineproperty -- safe
    if (Object.isExtensible(buffer)) Object.defineProperty(buffer, 'a', { value: 8 });
  }
});

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-for-each.js":[function(require,module,exports){
'use strict';
var $forEach = require('../internals/array-iteration').forEach;
var arrayMethodIsStrict = require('../internals/array-method-is-strict');

var STRICT_METHOD = arrayMethodIsStrict('forEach');

// `Array.prototype.forEach` method implementation
// https://tc39.es/ecma262/#sec-array.prototype.foreach
module.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) {
  return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
// eslint-disable-next-line es-x/no-array-prototype-foreach -- safe
} : [].forEach;

},{"../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js","../internals/array-method-is-strict":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-is-strict.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-from.js":[function(require,module,exports){
'use strict';
var global = require('../internals/global');
var bind = require('../internals/function-bind-context');
var call = require('../internals/function-call');
var toObject = require('../internals/to-object');
var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');
var isArrayIteratorMethod = require('../internals/is-array-iterator-method');
var isConstructor = require('../internals/is-constructor');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var createProperty = require('../internals/create-property');
var getIterator = require('../internals/get-iterator');
var getIteratorMethod = require('../internals/get-iterator-method');

var Array = global.Array;

// `Array.from` method implementation
// https://tc39.es/ecma262/#sec-array.from
module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
  var O = toObject(arrayLike);
  var IS_CONSTRUCTOR = isConstructor(this);
  var argumentsLength = arguments.length;
  var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
  var mapping = mapfn !== undefined;
  if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined);
  var iteratorMethod = getIteratorMethod(O);
  var index = 0;
  var length, result, step, iterator, next, value;
  // if the target is not iterable or it's an array with the default iterator - use a simple case
  if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) {
    iterator = getIterator(O, iteratorMethod);
    next = iterator.next;
    result = IS_CONSTRUCTOR ? new this() : [];
    for (;!(step = call(next, iterator)).done; index++) {
      value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;
      createProperty(result, index, value);
    }
  } else {
    length = lengthOfArrayLike(O);
    result = IS_CONSTRUCTOR ? new this(length) : Array(length);
    for (;length > index; index++) {
      value = mapping ? mapfn(O[index], index) : O[index];
      createProperty(result, index, value);
    }
  }
  result.length = index;
  return result;
};

},{"../internals/call-with-safe-iteration-closing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/call-with-safe-iteration-closing.js","../internals/create-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-context.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-iterator.js","../internals/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-iterator-method.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-array-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array-iterator-method.js","../internals/is-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-constructor.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-includes.js":[function(require,module,exports){
var toIndexedObject = require('../internals/to-indexed-object');
var toAbsoluteIndex = require('../internals/to-absolute-index');
var lengthOfArrayLike = require('../internals/length-of-array-like');

// `Array.prototype.{ indexOf, includes }` methods implementation
var createMethod = function (IS_INCLUDES) {
  return function ($this, el, fromIndex) {
    var O = toIndexedObject($this);
    var length = lengthOfArrayLike(O);
    var index = toAbsoluteIndex(fromIndex, length);
    var value;
    // Array#includes uses SameValueZero equality algorithm
    // eslint-disable-next-line no-self-compare -- NaN check
    if (IS_INCLUDES && el != el) while (length > index) {
      value = O[index++];
      // eslint-disable-next-line no-self-compare -- NaN check
      if (value != value) return true;
    // Array#indexOf ignores holes, Array#includes - not
    } else for (;length > index; index++) {
      if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
    } return !IS_INCLUDES && -1;
  };
};

module.exports = {
  // `Array.prototype.includes` method
  // https://tc39.es/ecma262/#sec-array.prototype.includes
  includes: createMethod(true),
  // `Array.prototype.indexOf` method
  // https://tc39.es/ecma262/#sec-array.prototype.indexof
  indexOf: createMethod(false)
};

},{"../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-absolute-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-absolute-index.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js":[function(require,module,exports){
var bind = require('../internals/function-bind-context');
var uncurryThis = require('../internals/function-uncurry-this');
var IndexedObject = require('../internals/indexed-object');
var toObject = require('../internals/to-object');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var arraySpeciesCreate = require('../internals/array-species-create');

var push = uncurryThis([].push);

// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation
var createMethod = function (TYPE) {
  var IS_MAP = TYPE == 1;
  var IS_FILTER = TYPE == 2;
  var IS_SOME = TYPE == 3;
  var IS_EVERY = TYPE == 4;
  var IS_FIND_INDEX = TYPE == 6;
  var IS_FILTER_REJECT = TYPE == 7;
  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
  return function ($this, callbackfn, that, specificCreate) {
    var O = toObject($this);
    var self = IndexedObject(O);
    var boundFunction = bind(callbackfn, that);
    var length = lengthOfArrayLike(self);
    var index = 0;
    var create = specificCreate || arraySpeciesCreate;
    var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;
    var value, result;
    for (;length > index; index++) if (NO_HOLES || index in self) {
      value = self[index];
      result = boundFunction(value, index, O);
      if (TYPE) {
        if (IS_MAP) target[index] = result; // map
        else if (result) switch (TYPE) {
          case 3: return true;              // some
          case 5: return value;             // find
          case 6: return index;             // findIndex
          case 2: push(target, value);      // filter
        } else switch (TYPE) {
          case 4: return false;             // every
          case 7: push(target, value);      // filterReject
        }
      }
    }
    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;
  };
};

module.exports = {
  // `Array.prototype.forEach` method
  // https://tc39.es/ecma262/#sec-array.prototype.foreach
  forEach: createMethod(0),
  // `Array.prototype.map` method
  // https://tc39.es/ecma262/#sec-array.prototype.map
  map: createMethod(1),
  // `Array.prototype.filter` method
  // https://tc39.es/ecma262/#sec-array.prototype.filter
  filter: createMethod(2),
  // `Array.prototype.some` method
  // https://tc39.es/ecma262/#sec-array.prototype.some
  some: createMethod(3),
  // `Array.prototype.every` method
  // https://tc39.es/ecma262/#sec-array.prototype.every
  every: createMethod(4),
  // `Array.prototype.find` method
  // https://tc39.es/ecma262/#sec-array.prototype.find
  find: createMethod(5),
  // `Array.prototype.findIndex` method
  // https://tc39.es/ecma262/#sec-array.prototype.findIndex
  findIndex: createMethod(6),
  // `Array.prototype.filterReject` method
  // https://github.com/tc39/proposal-array-filtering
  filterReject: createMethod(7)
};

},{"../internals/array-species-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-species-create.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-context.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/indexed-object.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-last-index-of.js":[function(require,module,exports){
'use strict';
/* eslint-disable es-x/no-array-prototype-lastindexof -- safe */
var apply = require('../internals/function-apply');
var toIndexedObject = require('../internals/to-indexed-object');
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var arrayMethodIsStrict = require('../internals/array-method-is-strict');

var min = Math.min;
var $lastIndexOf = [].lastIndexOf;
var NEGATIVE_ZERO = !!$lastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;
var STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');
var FORCED = NEGATIVE_ZERO || !STRICT_METHOD;

// `Array.prototype.lastIndexOf` method implementation
// https://tc39.es/ecma262/#sec-array.prototype.lastindexof
module.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {
  // convert -0 to +0
  if (NEGATIVE_ZERO) return apply($lastIndexOf, this, arguments) || 0;
  var O = toIndexedObject(this);
  var length = lengthOfArrayLike(O);
  var index = length - 1;
  if (arguments.length > 1) index = min(index, toIntegerOrInfinity(arguments[1]));
  if (index < 0) index = length + index;
  for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;
  return -1;
} : $lastIndexOf;

},{"../internals/array-method-is-strict":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-is-strict.js","../internals/function-apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-apply.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js","../internals/to-integer-or-infinity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-integer-or-infinity.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-has-species-support.js":[function(require,module,exports){
var fails = require('../internals/fails');
var wellKnownSymbol = require('../internals/well-known-symbol');
var V8_VERSION = require('../internals/engine-v8-version');

var SPECIES = wellKnownSymbol('species');

module.exports = function (METHOD_NAME) {
  // We can't use this feature detection in V8 since it causes
  // deoptimization and serious performance degradation
  // https://github.com/zloirock/core-js/issues/677
  return V8_VERSION >= 51 || !fails(function () {
    var array = [];
    var constructor = array.constructor = {};
    constructor[SPECIES] = function () {
      return { foo: 1 };
    };
    return array[METHOD_NAME](Boolean).foo !== 1;
  });
};

},{"../internals/engine-v8-version":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-v8-version.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-is-strict.js":[function(require,module,exports){
'use strict';
var fails = require('../internals/fails');

module.exports = function (METHOD_NAME, argument) {
  var method = [][METHOD_NAME];
  return !!method && fails(function () {
    // eslint-disable-next-line no-useless-call -- required for testing
    method.call(null, argument || function () { return 1; }, 1);
  });
};

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-reduce.js":[function(require,module,exports){
var global = require('../internals/global');
var aCallable = require('../internals/a-callable');
var toObject = require('../internals/to-object');
var IndexedObject = require('../internals/indexed-object');
var lengthOfArrayLike = require('../internals/length-of-array-like');

var TypeError = global.TypeError;

// `Array.prototype.{ reduce, reduceRight }` methods implementation
var createMethod = function (IS_RIGHT) {
  return function (that, callbackfn, argumentsLength, memo) {
    aCallable(callbackfn);
    var O = toObject(that);
    var self = IndexedObject(O);
    var length = lengthOfArrayLike(O);
    var index = IS_RIGHT ? length - 1 : 0;
    var i = IS_RIGHT ? -1 : 1;
    if (argumentsLength < 2) while (true) {
      if (index in self) {
        memo = self[index];
        index += i;
        break;
      }
      index += i;
      if (IS_RIGHT ? index < 0 : length <= index) {
        throw TypeError('Reduce of empty array with no initial value');
      }
    }
    for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {
      memo = callbackfn(memo, self[index], index, O);
    }
    return memo;
  };
};

module.exports = {
  // `Array.prototype.reduce` method
  // https://tc39.es/ecma262/#sec-array.prototype.reduce
  left: createMethod(false),
  // `Array.prototype.reduceRight` method
  // https://tc39.es/ecma262/#sec-array.prototype.reduceright
  right: createMethod(true)
};

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/indexed-object.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice-simple.js":[function(require,module,exports){
var global = require('../internals/global');
var toAbsoluteIndex = require('../internals/to-absolute-index');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var createProperty = require('../internals/create-property');

var Array = global.Array;
var max = Math.max;

module.exports = function (O, start, end) {
  var length = lengthOfArrayLike(O);
  var k = toAbsoluteIndex(start, length);
  var fin = toAbsoluteIndex(end === undefined ? length : end, length);
  var result = Array(max(fin - k, 0));
  for (var n = 0; k < fin; k++, n++) createProperty(result, n, O[k]);
  result.length = n;
  return result;
};

},{"../internals/create-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-absolute-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-absolute-index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');

module.exports = uncurryThis([].slice);

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-sort.js":[function(require,module,exports){
var arraySlice = require('../internals/array-slice-simple');

var floor = Math.floor;

var mergeSort = function (array, comparefn) {
  var length = array.length;
  var middle = floor(length / 2);
  return length < 8 ? insertionSort(array, comparefn) : merge(
    array,
    mergeSort(arraySlice(array, 0, middle), comparefn),
    mergeSort(arraySlice(array, middle), comparefn),
    comparefn
  );
};

var insertionSort = function (array, comparefn) {
  var length = array.length;
  var i = 1;
  var element, j;

  while (i < length) {
    j = i;
    element = array[i];
    while (j && comparefn(array[j - 1], element) > 0) {
      array[j] = array[--j];
    }
    if (j !== i++) array[j] = element;
  } return array;
};

var merge = function (array, left, right, comparefn) {
  var llength = left.length;
  var rlength = right.length;
  var lindex = 0;
  var rindex = 0;

  while (lindex < llength || rindex < rlength) {
    array[lindex + rindex] = (lindex < llength && rindex < rlength)
      ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]
      : lindex < llength ? left[lindex++] : right[rindex++];
  } return array;
};

module.exports = mergeSort;

},{"../internals/array-slice-simple":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice-simple.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-species-constructor.js":[function(require,module,exports){
var global = require('../internals/global');
var isArray = require('../internals/is-array');
var isConstructor = require('../internals/is-constructor');
var isObject = require('../internals/is-object');
var wellKnownSymbol = require('../internals/well-known-symbol');

var SPECIES = wellKnownSymbol('species');
var Array = global.Array;

// a part of `ArraySpeciesCreate` abstract operation
// https://tc39.es/ecma262/#sec-arrayspeciescreate
module.exports = function (originalArray) {
  var C;
  if (isArray(originalArray)) {
    C = originalArray.constructor;
    // cross-realm fallback
    if (isConstructor(C) && (C === Array || isArray(C.prototype))) C = undefined;
    else if (isObject(C)) {
      C = C[SPECIES];
      if (C === null) C = undefined;
    }
  } return C === undefined ? Array : C;
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array.js","../internals/is-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-constructor.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-species-create.js":[function(require,module,exports){
var arraySpeciesConstructor = require('../internals/array-species-constructor');

// `ArraySpeciesCreate` abstract operation
// https://tc39.es/ecma262/#sec-arrayspeciescreate
module.exports = function (originalArray, length) {
  return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);
};

},{"../internals/array-species-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-species-constructor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/call-with-safe-iteration-closing.js":[function(require,module,exports){
var anObject = require('../internals/an-object');
var iteratorClose = require('../internals/iterator-close');

// call something on iterator step with safe closing on error
module.exports = function (iterator, fn, value, ENTRIES) {
  try {
    return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);
  } catch (error) {
    iteratorClose(iterator, 'throw', error);
  }
};

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/iterator-close":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterator-close.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/check-correctness-of-iteration.js":[function(require,module,exports){
var wellKnownSymbol = require('../internals/well-known-symbol');

var ITERATOR = wellKnownSymbol('iterator');
var SAFE_CLOSING = false;

try {
  var called = 0;
  var iteratorWithReturn = {
    next: function () {
      return { done: !!called++ };
    },
    'return': function () {
      SAFE_CLOSING = true;
    }
  };
  iteratorWithReturn[ITERATOR] = function () {
    return this;
  };
  // eslint-disable-next-line es-x/no-array-from, no-throw-literal -- required for testing
  Array.from(iteratorWithReturn, function () { throw 2; });
} catch (error) { /* empty */ }

module.exports = function (exec, SKIP_CLOSING) {
  if (!SKIP_CLOSING && !SAFE_CLOSING) return false;
  var ITERATION_SUPPORT = false;
  try {
    var object = {};
    object[ITERATOR] = function () {
      return {
        next: function () {
          return { done: ITERATION_SUPPORT = true };
        }
      };
    };
    exec(object);
  } catch (error) { /* empty */ }
  return ITERATION_SUPPORT;
};

},{"../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof-raw.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');

var toString = uncurryThis({}.toString);
var stringSlice = uncurryThis(''.slice);

module.exports = function (it) {
  return stringSlice(toString(it), 8, -1);
};

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof.js":[function(require,module,exports){
var global = require('../internals/global');
var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');
var isCallable = require('../internals/is-callable');
var classofRaw = require('../internals/classof-raw');
var wellKnownSymbol = require('../internals/well-known-symbol');

var TO_STRING_TAG = wellKnownSymbol('toStringTag');
var Object = global.Object;

// ES3 wrong here
var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';

// fallback for IE11 Script Access Denied error
var tryGet = function (it, key) {
  try {
    return it[key];
  } catch (error) { /* empty */ }
};

// getting tag from ES6+ `Object.prototype.toString`
module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {
  var O, tag, result;
  return it === undefined ? 'Undefined' : it === null ? 'Null'
    // @@toStringTag case
    : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag
    // builtinTag case
    : CORRECT_ARGUMENTS ? classofRaw(O)
    // ES3 arguments fallback
    : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;
};

},{"../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof-raw.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/to-string-tag-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string-tag-support.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/clear-error-stack.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');

var $Error = Error;
var replace = uncurryThis(''.replace);

var TEST = (function (arg) { return String($Error(arg).stack); })('zxcasd');
var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/;
var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST);

module.exports = function (stack, dropEntries) {
  if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) {
    while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, '');
  } return stack;
};

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection-delete-all.js":[function(require,module,exports){
'use strict';
var call = require('../internals/function-call');
var aCallable = require('../internals/a-callable');
var anObject = require('../internals/an-object');

// https://github.com/tc39/collection-methods
module.exports = function deleteAll(/* ...elements */) {
  var collection = anObject(this);
  var remover = aCallable(collection['delete']);
  var allDeleted = true;
  var wasDeleted;
  for (var k = 0, len = arguments.length; k < len; k++) {
    wasDeleted = call(remover, collection, arguments[k]);
    allDeleted = allDeleted && wasDeleted;
  }
  return !!allDeleted;
};

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection-from.js":[function(require,module,exports){
'use strict';
// https://tc39.github.io/proposal-setmap-offrom/
var bind = require('../internals/function-bind-context');
var call = require('../internals/function-call');
var aCallable = require('../internals/a-callable');
var aConstructor = require('../internals/a-constructor');
var iterate = require('../internals/iterate');

var push = [].push;

module.exports = function from(source /* , mapFn, thisArg */) {
  var length = arguments.length;
  var mapFn = length > 1 ? arguments[1] : undefined;
  var mapping, array, n, boundFunction;
  aConstructor(this);
  mapping = mapFn !== undefined;
  if (mapping) aCallable(mapFn);
  if (source == undefined) return new this();
  array = [];
  if (mapping) {
    n = 0;
    boundFunction = bind(mapFn, length > 2 ? arguments[2] : undefined);
    iterate(source, function (nextItem) {
      call(push, array, boundFunction(nextItem, n++));
    });
  } else {
    iterate(source, push, { that: array });
  }
  return new this(array);
};

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/a-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-constructor.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-context.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterate.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection-of.js":[function(require,module,exports){
'use strict';
var arraySlice = require('../internals/array-slice');

// https://tc39.github.io/proposal-setmap-offrom/
module.exports = function of() {
  return new this(arraySlice(arguments));
};

},{"../internals/array-slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection-strong.js":[function(require,module,exports){
'use strict';
var defineProperty = require('../internals/object-define-property').f;
var create = require('../internals/object-create');
var redefineAll = require('../internals/redefine-all');
var bind = require('../internals/function-bind-context');
var anInstance = require('../internals/an-instance');
var iterate = require('../internals/iterate');
var defineIterator = require('../internals/define-iterator');
var setSpecies = require('../internals/set-species');
var DESCRIPTORS = require('../internals/descriptors');
var fastKey = require('../internals/internal-metadata').fastKey;
var InternalStateModule = require('../internals/internal-state');

var setInternalState = InternalStateModule.set;
var internalStateGetterFor = InternalStateModule.getterFor;

module.exports = {
  getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
    var Constructor = wrapper(function (that, iterable) {
      anInstance(that, Prototype);
      setInternalState(that, {
        type: CONSTRUCTOR_NAME,
        index: create(null),
        first: undefined,
        last: undefined,
        size: 0
      });
      if (!DESCRIPTORS) that.size = 0;
      if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
    });

    var Prototype = Constructor.prototype;

    var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);

    var define = function (that, key, value) {
      var state = getInternalState(that);
      var entry = getEntry(that, key);
      var previous, index;
      // change existing entry
      if (entry) {
        entry.value = value;
      // create new entry
      } else {
        state.last = entry = {
          index: index = fastKey(key, true),
          key: key,
          value: value,
          previous: previous = state.last,
          next: undefined,
          removed: false
        };
        if (!state.first) state.first = entry;
        if (previous) previous.next = entry;
        if (DESCRIPTORS) state.size++;
        else that.size++;
        // add to index
        if (index !== 'F') state.index[index] = entry;
      } return that;
    };

    var getEntry = function (that, key) {
      var state = getInternalState(that);
      // fast case
      var index = fastKey(key);
      var entry;
      if (index !== 'F') return state.index[index];
      // frozen object case
      for (entry = state.first; entry; entry = entry.next) {
        if (entry.key == key) return entry;
      }
    };

    redefineAll(Prototype, {
      // `{ Map, Set }.prototype.clear()` methods
      // https://tc39.es/ecma262/#sec-map.prototype.clear
      // https://tc39.es/ecma262/#sec-set.prototype.clear
      clear: function clear() {
        var that = this;
        var state = getInternalState(that);
        var data = state.index;
        var entry = state.first;
        while (entry) {
          entry.removed = true;
          if (entry.previous) entry.previous = entry.previous.next = undefined;
          delete data[entry.index];
          entry = entry.next;
        }
        state.first = state.last = undefined;
        if (DESCRIPTORS) state.size = 0;
        else that.size = 0;
      },
      // `{ Map, Set }.prototype.delete(key)` methods
      // https://tc39.es/ecma262/#sec-map.prototype.delete
      // https://tc39.es/ecma262/#sec-set.prototype.delete
      'delete': function (key) {
        var that = this;
        var state = getInternalState(that);
        var entry = getEntry(that, key);
        if (entry) {
          var next = entry.next;
          var prev = entry.previous;
          delete state.index[entry.index];
          entry.removed = true;
          if (prev) prev.next = next;
          if (next) next.previous = prev;
          if (state.first == entry) state.first = next;
          if (state.last == entry) state.last = prev;
          if (DESCRIPTORS) state.size--;
          else that.size--;
        } return !!entry;
      },
      // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods
      // https://tc39.es/ecma262/#sec-map.prototype.foreach
      // https://tc39.es/ecma262/#sec-set.prototype.foreach
      forEach: function forEach(callbackfn /* , that = undefined */) {
        var state = getInternalState(this);
        var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);
        var entry;
        while (entry = entry ? entry.next : state.first) {
          boundFunction(entry.value, entry.key, this);
          // revert to the last existing entry
          while (entry && entry.removed) entry = entry.previous;
        }
      },
      // `{ Map, Set}.prototype.has(key)` methods
      // https://tc39.es/ecma262/#sec-map.prototype.has
      // https://tc39.es/ecma262/#sec-set.prototype.has
      has: function has(key) {
        return !!getEntry(this, key);
      }
    });

    redefineAll(Prototype, IS_MAP ? {
      // `Map.prototype.get(key)` method
      // https://tc39.es/ecma262/#sec-map.prototype.get
      get: function get(key) {
        var entry = getEntry(this, key);
        return entry && entry.value;
      },
      // `Map.prototype.set(key, value)` method
      // https://tc39.es/ecma262/#sec-map.prototype.set
      set: function set(key, value) {
        return define(this, key === 0 ? 0 : key, value);
      }
    } : {
      // `Set.prototype.add(value)` method
      // https://tc39.es/ecma262/#sec-set.prototype.add
      add: function add(value) {
        return define(this, value = value === 0 ? 0 : value, value);
      }
    });
    if (DESCRIPTORS) defineProperty(Prototype, 'size', {
      get: function () {
        return getInternalState(this).size;
      }
    });
    return Constructor;
  },
  setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) {
    var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';
    var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);
    var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);
    // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods
    // https://tc39.es/ecma262/#sec-map.prototype.entries
    // https://tc39.es/ecma262/#sec-map.prototype.keys
    // https://tc39.es/ecma262/#sec-map.prototype.values
    // https://tc39.es/ecma262/#sec-map.prototype-@@iterator
    // https://tc39.es/ecma262/#sec-set.prototype.entries
    // https://tc39.es/ecma262/#sec-set.prototype.keys
    // https://tc39.es/ecma262/#sec-set.prototype.values
    // https://tc39.es/ecma262/#sec-set.prototype-@@iterator
    defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) {
      setInternalState(this, {
        type: ITERATOR_NAME,
        target: iterated,
        state: getInternalCollectionState(iterated),
        kind: kind,
        last: undefined
      });
    }, function () {
      var state = getInternalIteratorState(this);
      var kind = state.kind;
      var entry = state.last;
      // revert to the last existing entry
      while (entry && entry.removed) entry = entry.previous;
      // get next entry
      if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {
        // or finish the iteration
        state.target = undefined;
        return { value: undefined, done: true };
      }
      // return step by kind
      if (kind == 'keys') return { value: entry.key, done: false };
      if (kind == 'values') return { value: entry.value, done: false };
      return { value: [entry.key, entry.value], done: false };
    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);

    // `{ Map, Set }.prototype[@@species]` accessors
    // https://tc39.es/ecma262/#sec-get-map-@@species
    // https://tc39.es/ecma262/#sec-get-set-@@species
    setSpecies(CONSTRUCTOR_NAME);
  }
};

},{"../internals/an-instance":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-instance.js","../internals/define-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-iterator.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-context.js","../internals/internal-metadata":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-metadata.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-state.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterate.js","../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-create.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js","../internals/redefine-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine-all.js","../internals/set-species":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-species.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection-weak.js":[function(require,module,exports){
'use strict';
var uncurryThis = require('../internals/function-uncurry-this');
var redefineAll = require('../internals/redefine-all');
var getWeakData = require('../internals/internal-metadata').getWeakData;
var anObject = require('../internals/an-object');
var isObject = require('../internals/is-object');
var anInstance = require('../internals/an-instance');
var iterate = require('../internals/iterate');
var ArrayIterationModule = require('../internals/array-iteration');
var hasOwn = require('../internals/has-own-property');
var InternalStateModule = require('../internals/internal-state');

var setInternalState = InternalStateModule.set;
var internalStateGetterFor = InternalStateModule.getterFor;
var find = ArrayIterationModule.find;
var findIndex = ArrayIterationModule.findIndex;
var splice = uncurryThis([].splice);
var id = 0;

// fallback for uncaught frozen keys
var uncaughtFrozenStore = function (store) {
  return store.frozen || (store.frozen = new UncaughtFrozenStore());
};

var UncaughtFrozenStore = function () {
  this.entries = [];
};

var findUncaughtFrozen = function (store, key) {
  return find(store.entries, function (it) {
    return it[0] === key;
  });
};

UncaughtFrozenStore.prototype = {
  get: function (key) {
    var entry = findUncaughtFrozen(this, key);
    if (entry) return entry[1];
  },
  has: function (key) {
    return !!findUncaughtFrozen(this, key);
  },
  set: function (key, value) {
    var entry = findUncaughtFrozen(this, key);
    if (entry) entry[1] = value;
    else this.entries.push([key, value]);
  },
  'delete': function (key) {
    var index = findIndex(this.entries, function (it) {
      return it[0] === key;
    });
    if (~index) splice(this.entries, index, 1);
    return !!~index;
  }
};

module.exports = {
  getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
    var Constructor = wrapper(function (that, iterable) {
      anInstance(that, Prototype);
      setInternalState(that, {
        type: CONSTRUCTOR_NAME,
        id: id++,
        frozen: undefined
      });
      if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
    });

    var Prototype = Constructor.prototype;

    var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);

    var define = function (that, key, value) {
      var state = getInternalState(that);
      var data = getWeakData(anObject(key), true);
      if (data === true) uncaughtFrozenStore(state).set(key, value);
      else data[state.id] = value;
      return that;
    };

    redefineAll(Prototype, {
      // `{ WeakMap, WeakSet }.prototype.delete(key)` methods
      // https://tc39.es/ecma262/#sec-weakmap.prototype.delete
      // https://tc39.es/ecma262/#sec-weakset.prototype.delete
      'delete': function (key) {
        var state = getInternalState(this);
        if (!isObject(key)) return false;
        var data = getWeakData(key);
        if (data === true) return uncaughtFrozenStore(state)['delete'](key);
        return data && hasOwn(data, state.id) && delete data[state.id];
      },
      // `{ WeakMap, WeakSet }.prototype.has(key)` methods
      // https://tc39.es/ecma262/#sec-weakmap.prototype.has
      // https://tc39.es/ecma262/#sec-weakset.prototype.has
      has: function has(key) {
        var state = getInternalState(this);
        if (!isObject(key)) return false;
        var data = getWeakData(key);
        if (data === true) return uncaughtFrozenStore(state).has(key);
        return data && hasOwn(data, state.id);
      }
    });

    redefineAll(Prototype, IS_MAP ? {
      // `WeakMap.prototype.get(key)` method
      // https://tc39.es/ecma262/#sec-weakmap.prototype.get
      get: function get(key) {
        var state = getInternalState(this);
        if (isObject(key)) {
          var data = getWeakData(key);
          if (data === true) return uncaughtFrozenStore(state).get(key);
          return data ? data[state.id] : undefined;
        }
      },
      // `WeakMap.prototype.set(key, value)` method
      // https://tc39.es/ecma262/#sec-weakmap.prototype.set
      set: function set(key, value) {
        return define(this, key, value);
      }
    } : {
      // `WeakSet.prototype.add(value)` method
      // https://tc39.es/ecma262/#sec-weakset.prototype.add
      add: function add(value) {
        return define(this, value, true);
      }
    });

    return Constructor;
  }
};

},{"../internals/an-instance":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-instance.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/internal-metadata":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-metadata.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-state.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterate.js","../internals/redefine-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine-all.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var global = require('../internals/global');
var InternalMetadataModule = require('../internals/internal-metadata');
var fails = require('../internals/fails');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var iterate = require('../internals/iterate');
var anInstance = require('../internals/an-instance');
var isCallable = require('../internals/is-callable');
var isObject = require('../internals/is-object');
var setToStringTag = require('../internals/set-to-string-tag');
var defineProperty = require('../internals/object-define-property').f;
var forEach = require('../internals/array-iteration').forEach;
var DESCRIPTORS = require('../internals/descriptors');
var InternalStateModule = require('../internals/internal-state');

var setInternalState = InternalStateModule.set;
var internalStateGetterFor = InternalStateModule.getterFor;

module.exports = function (CONSTRUCTOR_NAME, wrapper, common) {
  var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;
  var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;
  var ADDER = IS_MAP ? 'set' : 'add';
  var NativeConstructor = global[CONSTRUCTOR_NAME];
  var NativePrototype = NativeConstructor && NativeConstructor.prototype;
  var exported = {};
  var Constructor;

  if (!DESCRIPTORS || !isCallable(NativeConstructor)
    || !(IS_WEAK || NativePrototype.forEach && !fails(function () { new NativeConstructor().entries().next(); }))
  ) {
    // create collection constructor
    Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);
    InternalMetadataModule.enable();
  } else {
    Constructor = wrapper(function (target, iterable) {
      setInternalState(anInstance(target, Prototype), {
        type: CONSTRUCTOR_NAME,
        collection: new NativeConstructor()
      });
      if (iterable != undefined) iterate(iterable, target[ADDER], { that: target, AS_ENTRIES: IS_MAP });
    });

    var Prototype = Constructor.prototype;

    var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);

    forEach(['add', 'clear', 'delete', 'forEach', 'get', 'has', 'set', 'keys', 'values', 'entries'], function (KEY) {
      var IS_ADDER = KEY == 'add' || KEY == 'set';
      if (KEY in NativePrototype && !(IS_WEAK && KEY == 'clear')) {
        createNonEnumerableProperty(Prototype, KEY, function (a, b) {
          var collection = getInternalState(this).collection;
          if (!IS_ADDER && IS_WEAK && !isObject(a)) return KEY == 'get' ? undefined : false;
          var result = collection[KEY](a === 0 ? 0 : a, b);
          return IS_ADDER ? this : result;
        });
      }
    });

    IS_WEAK || defineProperty(Prototype, 'size', {
      configurable: true,
      get: function () {
        return getInternalState(this).collection.size;
      }
    });
  }

  setToStringTag(Constructor, CONSTRUCTOR_NAME, false, true);

  exported[CONSTRUCTOR_NAME] = Constructor;
  $({ global: true, forced: true }, exported);

  if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);

  return Constructor;
};

},{"../internals/an-instance":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-instance.js","../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js","../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-non-enumerable-property.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/internal-metadata":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-metadata.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-state.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterate.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js","../internals/set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-to-string-tag.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/copy-constructor-properties.js":[function(require,module,exports){
var hasOwn = require('../internals/has-own-property');
var ownKeys = require('../internals/own-keys');
var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');
var definePropertyModule = require('../internals/object-define-property');

module.exports = function (target, source, exceptions) {
  var keys = ownKeys(source);
  var defineProperty = definePropertyModule.f;
  var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
  for (var i = 0; i < keys.length; i++) {
    var key = keys[i];
    if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {
      defineProperty(target, key, getOwnPropertyDescriptor(source, key));
    }
  }
};

},{"../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js","../internals/own-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/own-keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/correct-is-regexp-logic.js":[function(require,module,exports){
var wellKnownSymbol = require('../internals/well-known-symbol');

var MATCH = wellKnownSymbol('match');

module.exports = function (METHOD_NAME) {
  var regexp = /./;
  try {
    '/./'[METHOD_NAME](regexp);
  } catch (error1) {
    try {
      regexp[MATCH] = false;
      return '/./'[METHOD_NAME](regexp);
    } catch (error2) { /* empty */ }
  } return false;
};

},{"../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/correct-prototype-getter.js":[function(require,module,exports){
var fails = require('../internals/fails');

module.exports = !fails(function () {
  function F() { /* empty */ }
  F.prototype.constructor = null;
  // eslint-disable-next-line es-x/no-object-getprototypeof -- required for testing
  return Object.getPrototypeOf(new F()) !== F.prototype;
});

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-iterator-constructor.js":[function(require,module,exports){
'use strict';
var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;
var create = require('../internals/object-create');
var createPropertyDescriptor = require('../internals/create-property-descriptor');
var setToStringTag = require('../internals/set-to-string-tag');
var Iterators = require('../internals/iterators');

var returnThis = function () { return this; };

module.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) {
  var TO_STRING_TAG = NAME + ' Iterator';
  IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) });
  setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);
  Iterators[TO_STRING_TAG] = returnThis;
  return IteratorConstructor;
};

},{"../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property-descriptor.js","../internals/iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterators.js","../internals/iterators-core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterators-core.js","../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-create.js","../internals/set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-to-string-tag.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-non-enumerable-property.js":[function(require,module,exports){
var DESCRIPTORS = require('../internals/descriptors');
var definePropertyModule = require('../internals/object-define-property');
var createPropertyDescriptor = require('../internals/create-property-descriptor');

module.exports = DESCRIPTORS ? function (object, key, value) {
  return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));
} : function (object, key, value) {
  object[key] = value;
  return object;
};

},{"../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property-descriptor.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property-descriptor.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property.js":[function(require,module,exports){
'use strict';
var toPropertyKey = require('../internals/to-property-key');
var definePropertyModule = require('../internals/object-define-property');
var createPropertyDescriptor = require('../internals/create-property-descriptor');

module.exports = function (object, key, value) {
  var propertyKey = toPropertyKey(key);
  if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));
  else object[propertyKey] = value;
};

},{"../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property-descriptor.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js","../internals/to-property-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-property-key.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-iterator.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var call = require('../internals/function-call');
var IS_PURE = require('../internals/is-pure');
var FunctionName = require('../internals/function-name');
var isCallable = require('../internals/is-callable');
var createIteratorConstructor = require('../internals/create-iterator-constructor');
var getPrototypeOf = require('../internals/object-get-prototype-of');
var setPrototypeOf = require('../internals/object-set-prototype-of');
var setToStringTag = require('../internals/set-to-string-tag');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var redefine = require('../internals/redefine');
var wellKnownSymbol = require('../internals/well-known-symbol');
var Iterators = require('../internals/iterators');
var IteratorsCore = require('../internals/iterators-core');

var PROPER_FUNCTION_NAME = FunctionName.PROPER;
var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;
var IteratorPrototype = IteratorsCore.IteratorPrototype;
var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;
var ITERATOR = wellKnownSymbol('iterator');
var KEYS = 'keys';
var VALUES = 'values';
var ENTRIES = 'entries';

var returnThis = function () { return this; };

module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {
  createIteratorConstructor(IteratorConstructor, NAME, next);

  var getIterationMethod = function (KIND) {
    if (KIND === DEFAULT && defaultIterator) return defaultIterator;
    if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];
    switch (KIND) {
      case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };
      case VALUES: return function values() { return new IteratorConstructor(this, KIND); };
      case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };
    } return function () { return new IteratorConstructor(this); };
  };

  var TO_STRING_TAG = NAME + ' Iterator';
  var INCORRECT_VALUES_NAME = false;
  var IterablePrototype = Iterable.prototype;
  var nativeIterator = IterablePrototype[ITERATOR]
    || IterablePrototype['@@iterator']
    || DEFAULT && IterablePrototype[DEFAULT];
  var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);
  var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;
  var CurrentIteratorPrototype, methods, KEY;

  // fix native
  if (anyNativeIterator) {
    CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));
    if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {
      if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {
        if (setPrototypeOf) {
          setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);
        } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {
          redefine(CurrentIteratorPrototype, ITERATOR, returnThis);
        }
      }
      // Set @@toStringTag to native iterators
      setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);
      if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;
    }
  }

  // fix Array.prototype.{ values, @@iterator }.name in V8 / FF
  if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
    if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {
      createNonEnumerableProperty(IterablePrototype, 'name', VALUES);
    } else {
      INCORRECT_VALUES_NAME = true;
      defaultIterator = function values() { return call(nativeIterator, this); };
    }
  }

  // export additional methods
  if (DEFAULT) {
    methods = {
      values: getIterationMethod(VALUES),
      keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),
      entries: getIterationMethod(ENTRIES)
    };
    if (FORCED) for (KEY in methods) {
      if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
        redefine(IterablePrototype, KEY, methods[KEY]);
      }
    } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
  }

  // define iterator
  if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {
    redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });
  }
  Iterators[NAME] = defaultIterator;

  return methods;
};

},{"../internals/create-iterator-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-iterator-constructor.js","../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-non-enumerable-property.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/function-name":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-name.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js","../internals/iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterators.js","../internals/iterators-core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterators-core.js","../internals/object-get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-prototype-of.js","../internals/object-set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-set-prototype-of.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine.js","../internals/set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-to-string-tag.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js":[function(require,module,exports){
var path = require('../internals/path');
var hasOwn = require('../internals/has-own-property');
var wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');
var defineProperty = require('../internals/object-define-property').f;

module.exports = function (NAME) {
  var Symbol = path.Symbol || (path.Symbol = {});
  if (!hasOwn(Symbol, NAME)) defineProperty(Symbol, NAME, {
    value: wrappedWellKnownSymbolModule.f(NAME)
  });
};

},{"../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js","../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../internals/well-known-symbol-wrapped":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol-wrapped.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js":[function(require,module,exports){
var fails = require('../internals/fails');

// Detect IE8's incomplete defineProperty implementation
module.exports = !fails(function () {
  // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing
  return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;
});

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/document-create-element.js":[function(require,module,exports){
var global = require('../internals/global');
var isObject = require('../internals/is-object');

var document = global.document;
// typeof document.createElement is 'object' in old IE
var EXISTS = isObject(document) && isObject(document.createElement);

module.exports = function (it) {
  return EXISTS ? document.createElement(it) : {};
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/dom-iterables.js":[function(require,module,exports){
// iterable DOM collections
// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods
module.exports = {
  CSSRuleList: 0,
  CSSStyleDeclaration: 0,
  CSSValueList: 0,
  ClientRectList: 0,
  DOMRectList: 0,
  DOMStringList: 0,
  DOMTokenList: 1,
  DataTransferItemList: 0,
  FileList: 0,
  HTMLAllCollection: 0,
  HTMLCollection: 0,
  HTMLFormElement: 0,
  HTMLSelectElement: 0,
  MediaList: 0,
  MimeTypeArray: 0,
  NamedNodeMap: 0,
  NodeList: 1,
  PaintRequestList: 0,
  Plugin: 0,
  PluginArray: 0,
  SVGLengthList: 0,
  SVGNumberList: 0,
  SVGPathSegList: 0,
  SVGPointList: 0,
  SVGStringList: 0,
  SVGTransformList: 0,
  SourceBufferList: 0,
  StyleSheetList: 0,
  TextTrackCueList: 0,
  TextTrackList: 0,
  TouchList: 0
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-ff-version.js":[function(require,module,exports){
var userAgent = require('../internals/engine-user-agent');

var firefox = userAgent.match(/firefox\/(\d+)/i);

module.exports = !!firefox && +firefox[1];

},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-user-agent.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-browser.js":[function(require,module,exports){
module.exports = typeof window == 'object' && typeof Deno != 'object';

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-ie-or-edge.js":[function(require,module,exports){
var UA = require('../internals/engine-user-agent');

module.exports = /MSIE|Trident/.test(UA);

},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-user-agent.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-ios-pebble.js":[function(require,module,exports){
var userAgent = require('../internals/engine-user-agent');
var global = require('../internals/global');

module.exports = /ipad|iphone|ipod/i.test(userAgent) && global.Pebble !== undefined;

},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-user-agent.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-ios.js":[function(require,module,exports){
var userAgent = require('../internals/engine-user-agent');

module.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent);

},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-user-agent.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-node.js":[function(require,module,exports){
var classof = require('../internals/classof-raw');
var global = require('../internals/global');

module.exports = classof(global.process) == 'process';

},{"../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof-raw.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-webos-webkit.js":[function(require,module,exports){
var userAgent = require('../internals/engine-user-agent');

module.exports = /web0s(?!.*chrome)/i.test(userAgent);

},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-user-agent.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-user-agent.js":[function(require,module,exports){
var getBuiltIn = require('../internals/get-built-in');

module.exports = getBuiltIn('navigator', 'userAgent') || '';

},{"../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-v8-version.js":[function(require,module,exports){
var global = require('../internals/global');
var userAgent = require('../internals/engine-user-agent');

var process = global.process;
var Deno = global.Deno;
var versions = process && process.versions || Deno && Deno.version;
var v8 = versions && versions.v8;
var match, version;

if (v8) {
  match = v8.split('.');
  // in old Chrome, versions of V8 isn't V8 = Chrome / 10
  // but their correct versions are not interesting for us
  version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);
}

// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`
// so check `userAgent` even if `.v8` exists, but 0
if (!version && userAgent) {
  match = userAgent.match(/Edge\/(\d+)/);
  if (!match || match[1] >= 74) {
    match = userAgent.match(/Chrome\/(\d+)/);
    if (match) version = +match[1];
  }
}

module.exports = version;

},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-user-agent.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-webkit-version.js":[function(require,module,exports){
var userAgent = require('../internals/engine-user-agent');

var webkit = userAgent.match(/AppleWebKit\/(\d+)\./);

module.exports = !!webkit && +webkit[1];

},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-user-agent.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/entry-virtual.js":[function(require,module,exports){
var path = require('../internals/path');

module.exports = function (CONSTRUCTOR) {
  return path[CONSTRUCTOR + 'Prototype'];
};

},{"../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/enum-bug-keys.js":[function(require,module,exports){
// IE8- don't enum bug keys
module.exports = [
  'constructor',
  'hasOwnProperty',
  'isPrototypeOf',
  'propertyIsEnumerable',
  'toLocaleString',
  'toString',
  'valueOf'
];

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/error-stack-installable.js":[function(require,module,exports){
var fails = require('../internals/fails');
var createPropertyDescriptor = require('../internals/create-property-descriptor');

module.exports = !fails(function () {
  var error = Error('a');
  if (!('stack' in error)) return true;
  // eslint-disable-next-line es-x/no-object-defineproperty -- safe
  Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7));
  return error.stack !== 7;
});

},{"../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property-descriptor.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js":[function(require,module,exports){
'use strict';
var global = require('../internals/global');
var apply = require('../internals/function-apply');
var uncurryThis = require('../internals/function-uncurry-this');
var isCallable = require('../internals/is-callable');
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
var isForced = require('../internals/is-forced');
var path = require('../internals/path');
var bind = require('../internals/function-bind-context');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var hasOwn = require('../internals/has-own-property');

var wrapConstructor = function (NativeConstructor) {
  var Wrapper = function (a, b, c) {
    if (this instanceof Wrapper) {
      switch (arguments.length) {
        case 0: return new NativeConstructor();
        case 1: return new NativeConstructor(a);
        case 2: return new NativeConstructor(a, b);
      } return new NativeConstructor(a, b, c);
    } return apply(NativeConstructor, this, arguments);
  };
  Wrapper.prototype = NativeConstructor.prototype;
  return Wrapper;
};

/*
  options.target      - name of the target object
  options.global      - target is the global object
  options.stat        - export as static methods of target
  options.proto       - export as prototype methods of target
  options.real        - real prototype method for the `pure` version
  options.forced      - export even if the native feature is available
  options.bind        - bind methods to the target, required for the `pure` version
  options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version
  options.unsafe      - use the simple assignment of property instead of delete + defineProperty
  options.sham        - add a flag to not completely full polyfills
  options.enumerable  - export as enumerable property
  options.noTargetGet - prevent calling a getter on target
  options.name        - the .name of the function if it does not match the key
*/
module.exports = function (options, source) {
  var TARGET = options.target;
  var GLOBAL = options.global;
  var STATIC = options.stat;
  var PROTO = options.proto;

  var nativeSource = GLOBAL ? global : STATIC ? global[TARGET] : (global[TARGET] || {}).prototype;

  var target = GLOBAL ? path : path[TARGET] || createNonEnumerableProperty(path, TARGET, {})[TARGET];
  var targetPrototype = target.prototype;

  var FORCED, USE_NATIVE, VIRTUAL_PROTOTYPE;
  var key, sourceProperty, targetProperty, nativeProperty, resultProperty, descriptor;

  for (key in source) {
    FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
    // contains in native
    USE_NATIVE = !FORCED && nativeSource && hasOwn(nativeSource, key);

    targetProperty = target[key];

    if (USE_NATIVE) if (options.noTargetGet) {
      descriptor = getOwnPropertyDescriptor(nativeSource, key);
      nativeProperty = descriptor && descriptor.value;
    } else nativeProperty = nativeSource[key];

    // export native or implementation
    sourceProperty = (USE_NATIVE && nativeProperty) ? nativeProperty : source[key];

    if (USE_NATIVE && typeof targetProperty == typeof sourceProperty) continue;

    // bind timers to global for call from export context
    if (options.bind && USE_NATIVE) resultProperty = bind(sourceProperty, global);
    // wrap global constructors for prevent changs in this version
    else if (options.wrap && USE_NATIVE) resultProperty = wrapConstructor(sourceProperty);
    // make static versions for prototype methods
    else if (PROTO && isCallable(sourceProperty)) resultProperty = uncurryThis(sourceProperty);
    // default case
    else resultProperty = sourceProperty;

    // add a flag to not completely full polyfills
    if (options.sham || (sourceProperty && sourceProperty.sham) || (targetProperty && targetProperty.sham)) {
      createNonEnumerableProperty(resultProperty, 'sham', true);
    }

    createNonEnumerableProperty(target, key, resultProperty);

    if (PROTO) {
      VIRTUAL_PROTOTYPE = TARGET + 'Prototype';
      if (!hasOwn(path, VIRTUAL_PROTOTYPE)) {
        createNonEnumerableProperty(path, VIRTUAL_PROTOTYPE, {});
      }
      // export virtual prototype methods
      createNonEnumerableProperty(path[VIRTUAL_PROTOTYPE], key, sourceProperty);
      // export real prototype methods
      if (options.real && targetPrototype && !targetPrototype[key]) {
        createNonEnumerableProperty(targetPrototype, key, sourceProperty);
      }
    }
  }
};

},{"../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-non-enumerable-property.js","../internals/function-apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-apply.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-context.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/is-forced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-forced.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js","../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js":[function(require,module,exports){
module.exports = function (exec) {
  try {
    return !!exec();
  } catch (error) {
    return true;
  }
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/flatten-into-array.js":[function(require,module,exports){
'use strict';
var global = require('../internals/global');
var isArray = require('../internals/is-array');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var bind = require('../internals/function-bind-context');

var TypeError = global.TypeError;

// `FlattenIntoArray` abstract operation
// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray
var flattenIntoArray = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {
  var targetIndex = start;
  var sourceIndex = 0;
  var mapFn = mapper ? bind(mapper, thisArg) : false;
  var element, elementLen;

  while (sourceIndex < sourceLen) {
    if (sourceIndex in source) {
      element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];

      if (depth > 0 && isArray(element)) {
        elementLen = lengthOfArrayLike(element);
        targetIndex = flattenIntoArray(target, original, element, elementLen, targetIndex, depth - 1) - 1;
      } else {
        if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError('Exceed the acceptable array length');
        target[targetIndex] = element;
      }

      targetIndex++;
    }
    sourceIndex++;
  }
  return targetIndex;
};

module.exports = flattenIntoArray;

},{"../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-context.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/freezing.js":[function(require,module,exports){
var fails = require('../internals/fails');

module.exports = !fails(function () {
  // eslint-disable-next-line es-x/no-object-isextensible, es-x/no-object-preventextensions -- required for testing
  return Object.isExtensible(Object.preventExtensions({}));
});

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-apply.js":[function(require,module,exports){
var NATIVE_BIND = require('../internals/function-bind-native');

var FunctionPrototype = Function.prototype;
var apply = FunctionPrototype.apply;
var call = FunctionPrototype.call;

// eslint-disable-next-line es-x/no-reflect -- safe
module.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {
  return call.apply(apply, arguments);
});

},{"../internals/function-bind-native":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-native.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-context.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');
var aCallable = require('../internals/a-callable');
var NATIVE_BIND = require('../internals/function-bind-native');

var bind = uncurryThis(uncurryThis.bind);

// optional / simple context binding
module.exports = function (fn, that) {
  aCallable(fn);
  return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {
    return fn.apply(that, arguments);
  };
};

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/function-bind-native":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-native.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-native.js":[function(require,module,exports){
var fails = require('../internals/fails');

module.exports = !fails(function () {
  // eslint-disable-next-line es-x/no-function-prototype-bind -- safe
  var test = (function () { /* empty */ }).bind();
  // eslint-disable-next-line no-prototype-builtins -- safe
  return typeof test != 'function' || test.hasOwnProperty('prototype');
});

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind.js":[function(require,module,exports){
'use strict';
var global = require('../internals/global');
var uncurryThis = require('../internals/function-uncurry-this');
var aCallable = require('../internals/a-callable');
var isObject = require('../internals/is-object');
var hasOwn = require('../internals/has-own-property');
var arraySlice = require('../internals/array-slice');
var NATIVE_BIND = require('../internals/function-bind-native');

var Function = global.Function;
var concat = uncurryThis([].concat);
var join = uncurryThis([].join);
var factories = {};

var construct = function (C, argsLength, args) {
  if (!hasOwn(factories, argsLength)) {
    for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']';
    factories[argsLength] = Function('C,a', 'return new C(' + join(list, ',') + ')');
  } return factories[argsLength](C, args);
};

// `Function.prototype.bind` method implementation
// https://tc39.es/ecma262/#sec-function.prototype.bind
module.exports = NATIVE_BIND ? Function.bind : function bind(that /* , ...args */) {
  var F = aCallable(this);
  var Prototype = F.prototype;
  var partArgs = arraySlice(arguments, 1);
  var boundFunction = function bound(/* args... */) {
    var args = concat(partArgs, arraySlice(arguments));
    return this instanceof boundFunction ? construct(F, args.length, args) : F.apply(that, args);
  };
  if (isObject(Prototype)) boundFunction.prototype = Prototype;
  return boundFunction;
};

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/array-slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice.js","../internals/function-bind-native":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-native.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js":[function(require,module,exports){
var NATIVE_BIND = require('../internals/function-bind-native');

var call = Function.prototype.call;

module.exports = NATIVE_BIND ? call.bind(call) : function () {
  return call.apply(call, arguments);
};

},{"../internals/function-bind-native":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-native.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-name.js":[function(require,module,exports){
var DESCRIPTORS = require('../internals/descriptors');
var hasOwn = require('../internals/has-own-property');

var FunctionPrototype = Function.prototype;
// eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe
var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;

var EXISTS = hasOwn(FunctionPrototype, 'name');
// additional protection from minified / mangled / dropped function names
var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';
var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));

module.exports = {
  EXISTS: EXISTS,
  PROPER: PROPER,
  CONFIGURABLE: CONFIGURABLE
};

},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js":[function(require,module,exports){
var NATIVE_BIND = require('../internals/function-bind-native');

var FunctionPrototype = Function.prototype;
var bind = FunctionPrototype.bind;
var call = FunctionPrototype.call;
var uncurryThis = NATIVE_BIND && bind.bind(call, call);

module.exports = NATIVE_BIND ? function (fn) {
  return fn && uncurryThis(fn);
} : function (fn) {
  return fn && function () {
    return call.apply(fn, arguments);
  };
};

},{"../internals/function-bind-native":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-native.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js":[function(require,module,exports){
var path = require('../internals/path');
var global = require('../internals/global');
var isCallable = require('../internals/is-callable');

var aFunction = function (variable) {
  return isCallable(variable) ? variable : undefined;
};

module.exports = function (namespace, method) {
  return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])
    : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-iterator-method.js":[function(require,module,exports){
var classof = require('../internals/classof');
var getMethod = require('../internals/get-method');
var Iterators = require('../internals/iterators');
var wellKnownSymbol = require('../internals/well-known-symbol');

var ITERATOR = wellKnownSymbol('iterator');

module.exports = function (it) {
  if (it != undefined) return getMethod(it, ITERATOR)
    || getMethod(it, '@@iterator')
    || Iterators[classof(it)];
};

},{"../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof.js","../internals/get-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-method.js","../internals/iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterators.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-iterator.js":[function(require,module,exports){
var global = require('../internals/global');
var call = require('../internals/function-call');
var aCallable = require('../internals/a-callable');
var anObject = require('../internals/an-object');
var tryToString = require('../internals/try-to-string');
var getIteratorMethod = require('../internals/get-iterator-method');

var TypeError = global.TypeError;

module.exports = function (argument, usingIterator) {
  var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;
  if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));
  throw TypeError(tryToString(argument) + ' is not iterable');
};

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-iterator-method.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/try-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/try-to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-method.js":[function(require,module,exports){
var aCallable = require('../internals/a-callable');

// `GetMethod` abstract operation
// https://tc39.es/ecma262/#sec-getmethod
module.exports = function (V, P) {
  var func = V[P];
  return func == null ? undefined : aCallable(func);
};

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js":[function(require,module,exports){
(function (global){(function (){
var check = function (it) {
  return it && it.Math == Math && it;
};

// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
module.exports =
  // eslint-disable-next-line es-x/no-global-this -- safe
  check(typeof globalThis == 'object' && globalThis) ||
  check(typeof window == 'object' && window) ||
  // eslint-disable-next-line no-restricted-globals -- safe
  check(typeof self == 'object' && self) ||
  check(typeof global == 'object' && global) ||
  // eslint-disable-next-line no-new-func -- fallback
  (function () { return this; })() || Function('return this')();

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');
var toObject = require('../internals/to-object');

var hasOwnProperty = uncurryThis({}.hasOwnProperty);

// `HasOwnProperty` abstract operation
// https://tc39.es/ecma262/#sec-hasownproperty
// eslint-disable-next-line es-x/no-object-hasown -- safe
module.exports = Object.hasOwn || function hasOwn(it, key) {
  return hasOwnProperty(toObject(it), key);
};

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/hidden-keys.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/host-report-errors.js":[function(require,module,exports){
var global = require('../internals/global');

module.exports = function (a, b) {
  var console = global.console;
  if (console && console.error) {
    arguments.length == 1 ? console.error(a) : console.error(a, b);
  }
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/html.js":[function(require,module,exports){
var getBuiltIn = require('../internals/get-built-in');

module.exports = getBuiltIn('document', 'documentElement');

},{"../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/ie8-dom-define.js":[function(require,module,exports){
var DESCRIPTORS = require('../internals/descriptors');
var fails = require('../internals/fails');
var createElement = require('../internals/document-create-element');

// Thanks to IE8 for its funny defineProperty
module.exports = !DESCRIPTORS && !fails(function () {
  // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing
  return Object.defineProperty(createElement('div'), 'a', {
    get: function () { return 7; }
  }).a != 7;
});

},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/document-create-element":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/document-create-element.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/indexed-object.js":[function(require,module,exports){
var global = require('../internals/global');
var uncurryThis = require('../internals/function-uncurry-this');
var fails = require('../internals/fails');
var classof = require('../internals/classof-raw');

var Object = global.Object;
var split = uncurryThis(''.split);

// fallback for non-array-like ES3 and non-enumerable old V8 strings
module.exports = fails(function () {
  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
  // eslint-disable-next-line no-prototype-builtins -- safe
  return !Object('z').propertyIsEnumerable(0);
}) ? function (it) {
  return classof(it) == 'String' ? split(it, '') : Object(it);
} : Object;

},{"../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof-raw.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/inspect-source.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');
var isCallable = require('../internals/is-callable');
var store = require('../internals/shared-store');

var functionToString = uncurryThis(Function.toString);

// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper
if (!isCallable(store.inspectSource)) {
  store.inspectSource = function (it) {
    return functionToString(it);
  };
}

module.exports = store.inspectSource;

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/shared-store":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared-store.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/install-error-cause.js":[function(require,module,exports){
var isObject = require('../internals/is-object');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');

// `InstallErrorCause` abstract operation
// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause
module.exports = function (O, options) {
  if (isObject(options) && 'cause' in options) {
    createNonEnumerableProperty(O, 'cause', options.cause);
  }
};

},{"../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-non-enumerable-property.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-metadata.js":[function(require,module,exports){
var $ = require('../internals/export');
var uncurryThis = require('../internals/function-uncurry-this');
var hiddenKeys = require('../internals/hidden-keys');
var isObject = require('../internals/is-object');
var hasOwn = require('../internals/has-own-property');
var defineProperty = require('../internals/object-define-property').f;
var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');
var getOwnPropertyNamesExternalModule = require('../internals/object-get-own-property-names-external');
var isExtensible = require('../internals/object-is-extensible');
var uid = require('../internals/uid');
var FREEZING = require('../internals/freezing');

var REQUIRED = false;
var METADATA = uid('meta');
var id = 0;

var setMetadata = function (it) {
  defineProperty(it, METADATA, { value: {
    objectID: 'O' + id++, // object ID
    weakData: {}          // weak collections IDs
  } });
};

var fastKey = function (it, create) {
  // return a primitive with prefix
  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
  if (!hasOwn(it, METADATA)) {
    // can't set metadata to uncaught frozen object
    if (!isExtensible(it)) return 'F';
    // not necessary to add metadata
    if (!create) return 'E';
    // add missing metadata
    setMetadata(it);
  // return object ID
  } return it[METADATA].objectID;
};

var getWeakData = function (it, create) {
  if (!hasOwn(it, METADATA)) {
    // can't set metadata to uncaught frozen object
    if (!isExtensible(it)) return true;
    // not necessary to add metadata
    if (!create) return false;
    // add missing metadata
    setMetadata(it);
  // return the store of weak collections IDs
  } return it[METADATA].weakData;
};

// add metadata on freeze-family methods calling
var onFreeze = function (it) {
  if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it);
  return it;
};

var enable = function () {
  meta.enable = function () { /* empty */ };
  REQUIRED = true;
  var getOwnPropertyNames = getOwnPropertyNamesModule.f;
  var splice = uncurryThis([].splice);
  var test = {};
  test[METADATA] = 1;

  // prevent exposing of metadata key
  if (getOwnPropertyNames(test).length) {
    getOwnPropertyNamesModule.f = function (it) {
      var result = getOwnPropertyNames(it);
      for (var i = 0, length = result.length; i < length; i++) {
        if (result[i] === METADATA) {
          splice(result, i, 1);
          break;
        }
      } return result;
    };

    $({ target: 'Object', stat: true, forced: true }, {
      getOwnPropertyNames: getOwnPropertyNamesExternalModule.f
    });
  }
};

var meta = module.exports = {
  enable: enable,
  fastKey: fastKey,
  getWeakData: getWeakData,
  onFreeze: onFreeze
};

hiddenKeys[METADATA] = true;

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/freezing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/freezing.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/hidden-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/hidden-keys.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js","../internals/object-get-own-property-names":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-names.js","../internals/object-get-own-property-names-external":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-names-external.js","../internals/object-is-extensible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-extensible.js","../internals/uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/uid.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-state.js":[function(require,module,exports){
var NATIVE_WEAK_MAP = require('../internals/native-weak-map');
var global = require('../internals/global');
var uncurryThis = require('../internals/function-uncurry-this');
var isObject = require('../internals/is-object');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var hasOwn = require('../internals/has-own-property');
var shared = require('../internals/shared-store');
var sharedKey = require('../internals/shared-key');
var hiddenKeys = require('../internals/hidden-keys');

var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
var TypeError = global.TypeError;
var WeakMap = global.WeakMap;
var set, get, has;

var enforce = function (it) {
  return has(it) ? get(it) : set(it, {});
};

var getterFor = function (TYPE) {
  return function (it) {
    var state;
    if (!isObject(it) || (state = get(it)).type !== TYPE) {
      throw TypeError('Incompatible receiver, ' + TYPE + ' required');
    } return state;
  };
};

if (NATIVE_WEAK_MAP || shared.state) {
  var store = shared.state || (shared.state = new WeakMap());
  var wmget = uncurryThis(store.get);
  var wmhas = uncurryThis(store.has);
  var wmset = uncurryThis(store.set);
  set = function (it, metadata) {
    if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
    metadata.facade = it;
    wmset(store, it, metadata);
    return metadata;
  };
  get = function (it) {
    return wmget(store, it) || {};
  };
  has = function (it) {
    return wmhas(store, it);
  };
} else {
  var STATE = sharedKey('state');
  hiddenKeys[STATE] = true;
  set = function (it, metadata) {
    if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
    metadata.facade = it;
    createNonEnumerableProperty(it, STATE, metadata);
    return metadata;
  };
  get = function (it) {
    return hasOwn(it, STATE) ? it[STATE] : {};
  };
  has = function (it) {
    return hasOwn(it, STATE);
  };
}

module.exports = {
  set: set,
  get: get,
  has: has,
  enforce: enforce,
  getterFor: getterFor
};

},{"../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-non-enumerable-property.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/hidden-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/hidden-keys.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/native-weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-weak-map.js","../internals/shared-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared-key.js","../internals/shared-store":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared-store.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array-iterator-method.js":[function(require,module,exports){
var wellKnownSymbol = require('../internals/well-known-symbol');
var Iterators = require('../internals/iterators');

var ITERATOR = wellKnownSymbol('iterator');
var ArrayPrototype = Array.prototype;

// check on default Array iterator
module.exports = function (it) {
  return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);
};

},{"../internals/iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterators.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array.js":[function(require,module,exports){
var classof = require('../internals/classof-raw');

// `IsArray` abstract operation
// https://tc39.es/ecma262/#sec-isarray
// eslint-disable-next-line es-x/no-array-isarray -- safe
module.exports = Array.isArray || function isArray(argument) {
  return classof(argument) == 'Array';
};

},{"../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof-raw.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js":[function(require,module,exports){
// `IsCallable` abstract operation
// https://tc39.es/ecma262/#sec-iscallable
module.exports = function (argument) {
  return typeof argument == 'function';
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-constructor.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');
var fails = require('../internals/fails');
var isCallable = require('../internals/is-callable');
var classof = require('../internals/classof');
var getBuiltIn = require('../internals/get-built-in');
var inspectSource = require('../internals/inspect-source');

var noop = function () { /* empty */ };
var empty = [];
var construct = getBuiltIn('Reflect', 'construct');
var constructorRegExp = /^\s*(?:class|function)\b/;
var exec = uncurryThis(constructorRegExp.exec);
var INCORRECT_TO_STRING = !constructorRegExp.exec(noop);

var isConstructorModern = function isConstructor(argument) {
  if (!isCallable(argument)) return false;
  try {
    construct(noop, empty, argument);
    return true;
  } catch (error) {
    return false;
  }
};

var isConstructorLegacy = function isConstructor(argument) {
  if (!isCallable(argument)) return false;
  switch (classof(argument)) {
    case 'AsyncFunction':
    case 'GeneratorFunction':
    case 'AsyncGeneratorFunction': return false;
  }
  try {
    // we can't check .prototype since constructors produced by .bind haven't it
    // `Function#toString` throws on some built-it function in some legacy engines
    // (for example, `DOMQuad` and similar in FF41-)
    return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));
  } catch (error) {
    return true;
  }
};

isConstructorLegacy.sham = true;

// `IsConstructor` abstract operation
// https://tc39.es/ecma262/#sec-isconstructor
module.exports = !construct || fails(function () {
  var called;
  return isConstructorModern(isConstructorModern.call)
    || !isConstructorModern(Object)
    || !isConstructorModern(function () { called = true; })
    || called;
}) ? isConstructorLegacy : isConstructorModern;

},{"../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/inspect-source":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/inspect-source.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-data-descriptor.js":[function(require,module,exports){
var hasOwn = require('../internals/has-own-property');

module.exports = function (descriptor) {
  return descriptor !== undefined && (hasOwn(descriptor, 'value') || hasOwn(descriptor, 'writable'));
};

},{"../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-forced.js":[function(require,module,exports){
var fails = require('../internals/fails');
var isCallable = require('../internals/is-callable');

var replacement = /#|\.prototype\./;

var isForced = function (feature, detection) {
  var value = data[normalize(feature)];
  return value == POLYFILL ? true
    : value == NATIVE ? false
    : isCallable(detection) ? fails(detection)
    : !!detection;
};

var normalize = isForced.normalize = function (string) {
  return String(string).replace(replacement, '.').toLowerCase();
};

var data = isForced.data = {};
var NATIVE = isForced.NATIVE = 'N';
var POLYFILL = isForced.POLYFILL = 'P';

module.exports = isForced;

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-integral-number.js":[function(require,module,exports){
var isObject = require('../internals/is-object');

var floor = Math.floor;

// `IsIntegralNumber` abstract operation
// https://tc39.es/ecma262/#sec-isintegralnumber
// eslint-disable-next-line es-x/no-number-isinteger -- safe
module.exports = Number.isInteger || function isInteger(it) {
  return !isObject(it) && isFinite(it) && floor(it) === it;
};

},{"../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js":[function(require,module,exports){
var isCallable = require('../internals/is-callable');

module.exports = function (it) {
  return typeof it == 'object' ? it !== null : isCallable(it);
};

},{"../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_library.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-regexp.js":[function(require,module,exports){
var isObject = require('../internals/is-object');
var classof = require('../internals/classof-raw');
var wellKnownSymbol = require('../internals/well-known-symbol');

var MATCH = wellKnownSymbol('match');

// `IsRegExp` abstract operation
// https://tc39.es/ecma262/#sec-isregexp
module.exports = function (it) {
  var isRegExp;
  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');
};

},{"../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof-raw.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-symbol.js":[function(require,module,exports){
var global = require('../internals/global');
var getBuiltIn = require('../internals/get-built-in');
var isCallable = require('../internals/is-callable');
var isPrototypeOf = require('../internals/object-is-prototype-of');
var USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');

var Object = global.Object;

module.exports = USE_SYMBOL_AS_UID ? function (it) {
  return typeof it == 'symbol';
} : function (it) {
  var $Symbol = getBuiltIn('Symbol');
  return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, Object(it));
};

},{"../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../internals/use-symbol-as-uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/use-symbol-as-uid.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterate.js":[function(require,module,exports){
var global = require('../internals/global');
var bind = require('../internals/function-bind-context');
var call = require('../internals/function-call');
var anObject = require('../internals/an-object');
var tryToString = require('../internals/try-to-string');
var isArrayIteratorMethod = require('../internals/is-array-iterator-method');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var isPrototypeOf = require('../internals/object-is-prototype-of');
var getIterator = require('../internals/get-iterator');
var getIteratorMethod = require('../internals/get-iterator-method');
var iteratorClose = require('../internals/iterator-close');

var TypeError = global.TypeError;

var Result = function (stopped, result) {
  this.stopped = stopped;
  this.result = result;
};

var ResultPrototype = Result.prototype;

module.exports = function (iterable, unboundFunction, options) {
  var that = options && options.that;
  var AS_ENTRIES = !!(options && options.AS_ENTRIES);
  var IS_ITERATOR = !!(options && options.IS_ITERATOR);
  var INTERRUPTED = !!(options && options.INTERRUPTED);
  var fn = bind(unboundFunction, that);
  var iterator, iterFn, index, length, result, next, step;

  var stop = function (condition) {
    if (iterator) iteratorClose(iterator, 'normal', condition);
    return new Result(true, condition);
  };

  var callFn = function (value) {
    if (AS_ENTRIES) {
      anObject(value);
      return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);
    } return INTERRUPTED ? fn(value, stop) : fn(value);
  };

  if (IS_ITERATOR) {
    iterator = iterable;
  } else {
    iterFn = getIteratorMethod(iterable);
    if (!iterFn) throw TypeError(tryToString(iterable) + ' is not iterable');
    // optimisation for array iterators
    if (isArrayIteratorMethod(iterFn)) {
      for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {
        result = callFn(iterable[index]);
        if (result && isPrototypeOf(ResultPrototype, result)) return result;
      } return new Result(false);
    }
    iterator = getIterator(iterable, iterFn);
  }

  next = iterator.next;
  while (!(step = call(next, iterator)).done) {
    try {
      result = callFn(step.value);
    } catch (error) {
      iteratorClose(iterator, 'throw', error);
    }
    if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;
  } return new Result(false);
};

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-context.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-iterator.js","../internals/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-iterator-method.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-array-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array-iterator-method.js","../internals/iterator-close":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterator-close.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../internals/try-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/try-to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterator-close.js":[function(require,module,exports){
var call = require('../internals/function-call');
var anObject = require('../internals/an-object');
var getMethod = require('../internals/get-method');

module.exports = function (iterator, kind, value) {
  var innerResult, innerError;
  anObject(iterator);
  try {
    innerResult = getMethod(iterator, 'return');
    if (!innerResult) {
      if (kind === 'throw') throw value;
      return value;
    }
    innerResult = call(innerResult, iterator);
  } catch (error) {
    innerError = true;
    innerResult = error;
  }
  if (kind === 'throw') throw value;
  if (innerError) throw innerResult;
  anObject(innerResult);
  return value;
};

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/get-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-method.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterators-core.js":[function(require,module,exports){
'use strict';
var fails = require('../internals/fails');
var isCallable = require('../internals/is-callable');
var create = require('../internals/object-create');
var getPrototypeOf = require('../internals/object-get-prototype-of');
var redefine = require('../internals/redefine');
var wellKnownSymbol = require('../internals/well-known-symbol');
var IS_PURE = require('../internals/is-pure');

var ITERATOR = wellKnownSymbol('iterator');
var BUGGY_SAFARI_ITERATORS = false;

// `%IteratorPrototype%` object
// https://tc39.es/ecma262/#sec-%iteratorprototype%-object
var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;

/* eslint-disable es-x/no-array-prototype-keys -- safe */
if ([].keys) {
  arrayIterator = [].keys();
  // Safari 8 has buggy iterators w/o `next`
  if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;
  else {
    PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));
    if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;
  }
}

var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {
  var test = {};
  // FF44- legacy iterators case
  return IteratorPrototype[ITERATOR].call(test) !== test;
});

if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};
else if (IS_PURE) IteratorPrototype = create(IteratorPrototype);

// `%IteratorPrototype%[@@iterator]()` method
// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator
if (!isCallable(IteratorPrototype[ITERATOR])) {
  redefine(IteratorPrototype, ITERATOR, function () {
    return this;
  });
}

module.exports = {
  IteratorPrototype: IteratorPrototype,
  BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS
};

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js","../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-create.js","../internals/object-get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-prototype-of.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterators.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js":[function(require,module,exports){
var toLength = require('../internals/to-length');

// `LengthOfArrayLike` abstract operation
// https://tc39.es/ecma262/#sec-lengthofarraylike
module.exports = function (obj) {
  return toLength(obj.length);
};

},{"../internals/to-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-length.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/map-emplace.js":[function(require,module,exports){
'use strict';
var call = require('../internals/function-call');
var aCallable = require('../internals/a-callable');
var anObject = require('../internals/an-object');

// `Map.prototype.emplace` method
// https://github.com/thumbsupep/proposal-upsert
module.exports = function emplace(key, handler) {
  var map = anObject(this);
  var get = aCallable(map.get);
  var has = aCallable(map.has);
  var set = aCallable(map.set);
  var value = (call(has, map, key) && 'update' in handler)
    ? handler.update(call(get, map, key), key, map)
    : handler.insert(key, map);
  call(set, map, key, value);
  return value;
};

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/map-upsert.js":[function(require,module,exports){
'use strict';
var global = require('../internals/global');
var call = require('../internals/function-call');
var aCallable = require('../internals/a-callable');
var isCallable = require('../internals/is-callable');
var anObject = require('../internals/an-object');

var TypeError = global.TypeError;

// `Map.prototype.upsert` method
// https://github.com/thumbsupep/proposal-upsert
module.exports = function upsert(key, updateFn /* , insertFn */) {
  var map = anObject(this);
  var get = aCallable(map.get);
  var has = aCallable(map.has);
  var set = aCallable(map.set);
  var insertFn = arguments.length > 2 ? arguments[2] : undefined;
  var value;
  if (!isCallable(updateFn) && !isCallable(insertFn)) {
    throw TypeError('At least one callback required');
  }
  if (call(has, map, key)) {
    value = call(get, map, key);
    if (isCallable(updateFn)) {
      value = updateFn(value);
      call(set, map, key, value);
    }
  } else if (isCallable(insertFn)) {
    value = insertFn();
    call(set, map, key, value);
  } return value;
};

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/microtask.js":[function(require,module,exports){
var global = require('../internals/global');
var bind = require('../internals/function-bind-context');
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
var macrotask = require('../internals/task').set;
var IS_IOS = require('../internals/engine-is-ios');
var IS_IOS_PEBBLE = require('../internals/engine-is-ios-pebble');
var IS_WEBOS_WEBKIT = require('../internals/engine-is-webos-webkit');
var IS_NODE = require('../internals/engine-is-node');

var MutationObserver = global.MutationObserver || global.WebKitMutationObserver;
var document = global.document;
var process = global.process;
var Promise = global.Promise;
// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`
var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');
var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;

var flush, head, last, notify, toggle, node, promise, then;

// modern engines have queueMicrotask method
if (!queueMicrotask) {
  flush = function () {
    var parent, fn;
    if (IS_NODE && (parent = process.domain)) parent.exit();
    while (head) {
      fn = head.fn;
      head = head.next;
      try {
        fn();
      } catch (error) {
        if (head) notify();
        else last = undefined;
        throw error;
      }
    } last = undefined;
    if (parent) parent.enter();
  };

  // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339
  // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898
  if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) {
    toggle = true;
    node = document.createTextNode('');
    new MutationObserver(flush).observe(node, { characterData: true });
    notify = function () {
      node.data = toggle = !toggle;
    };
  // environments with maybe non-completely correct, but existent Promise
  } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) {
    // Promise.resolve without an argument throws an error in LG WebOS 2
    promise = Promise.resolve(undefined);
    // workaround of WebKit ~ iOS Safari 10.1 bug
    promise.constructor = Promise;
    then = bind(promise.then, promise);
    notify = function () {
      then(flush);
    };
  // Node.js without promises
  } else if (IS_NODE) {
    notify = function () {
      process.nextTick(flush);
    };
  // for other environments - macrotask based on:
  // - setImmediate
  // - MessageChannel
  // - window.postMessage
  // - onreadystatechange
  // - setTimeout
  } else {
    // strange IE + webpack dev server bug - use .bind(global)
    macrotask = bind(macrotask, global);
    notify = function () {
      macrotask(flush);
    };
  }
}

module.exports = queueMicrotask || function (fn) {
  var task = { fn: fn, next: undefined };
  if (last) last.next = task;
  if (!head) {
    head = task;
    notify();
  } last = task;
};

},{"../internals/engine-is-ios":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-ios.js","../internals/engine-is-ios-pebble":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-ios-pebble.js","../internals/engine-is-node":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-node.js","../internals/engine-is-webos-webkit":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-webos-webkit.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-context.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js","../internals/task":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/task.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol-registry.js":[function(require,module,exports){
var NATIVE_SYMBOL = require('../internals/native-symbol');

/* eslint-disable es-x/no-symbol -- safe */
module.exports = NATIVE_SYMBOL && !!Symbol['for'] && !!Symbol.keyFor;

},{"../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol.js":[function(require,module,exports){
/* eslint-disable es-x/no-symbol -- required for testing */
var V8_VERSION = require('../internals/engine-v8-version');
var fails = require('../internals/fails');

// eslint-disable-next-line es-x/no-object-getownpropertysymbols -- required for testing
module.exports = !!Object.getOwnPropertySymbols && !fails(function () {
  var symbol = Symbol();
  // Chrome 38 Symbol has incorrect toString conversion
  // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances
  return !String(symbol) || !(Object(symbol) instanceof Symbol) ||
    // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
    !Symbol.sham && V8_VERSION && V8_VERSION < 41;
});

},{"../internals/engine-v8-version":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-v8-version.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-weak-map.js":[function(require,module,exports){
var global = require('../internals/global');
var isCallable = require('../internals/is-callable');
var inspectSource = require('../internals/inspect-source');

var WeakMap = global.WeakMap;

module.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap));

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/inspect-source":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/inspect-source.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/new-promise-capability.js":[function(require,module,exports){
'use strict';
var aCallable = require('../internals/a-callable');

var PromiseCapability = function (C) {
  var resolve, reject;
  this.promise = new C(function ($$resolve, $$reject) {
    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
    resolve = $$resolve;
    reject = $$reject;
  });
  this.resolve = aCallable(resolve);
  this.reject = aCallable(reject);
};

// `NewPromiseCapability` abstract operation
// https://tc39.es/ecma262/#sec-newpromisecapability
module.exports.f = function (C) {
  return new PromiseCapability(C);
};

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/normalize-string-argument.js":[function(require,module,exports){
var toString = require('../internals/to-string');

module.exports = function (argument, $default) {
  return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument);
};

},{"../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/not-a-regexp.js":[function(require,module,exports){
var global = require('../internals/global');
var isRegExp = require('../internals/is-regexp');

var TypeError = global.TypeError;

module.exports = function (it) {
  if (isRegExp(it)) {
    throw TypeError("The method doesn't accept regular expressions");
  } return it;
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-regexp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-regexp.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/number-parse-float.js":[function(require,module,exports){
var global = require('../internals/global');
var fails = require('../internals/fails');
var uncurryThis = require('../internals/function-uncurry-this');
var toString = require('../internals/to-string');
var trim = require('../internals/string-trim').trim;
var whitespaces = require('../internals/whitespaces');

var charAt = uncurryThis(''.charAt);
var n$ParseFloat = global.parseFloat;
var Symbol = global.Symbol;
var ITERATOR = Symbol && Symbol.iterator;
var FORCED = 1 / n$ParseFloat(whitespaces + '-0') !== -Infinity
  // MS Edge 18- broken with boxed symbols
  || (ITERATOR && !fails(function () { n$ParseFloat(Object(ITERATOR)); }));

// `parseFloat` method
// https://tc39.es/ecma262/#sec-parsefloat-string
module.exports = FORCED ? function parseFloat(string) {
  var trimmedString = trim(toString(string));
  var result = n$ParseFloat(trimmedString);
  return result === 0 && charAt(trimmedString, 0) == '-' ? -0 : result;
} : n$ParseFloat;

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/string-trim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-trim.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js","../internals/whitespaces":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/whitespaces.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/number-parse-int.js":[function(require,module,exports){
var global = require('../internals/global');
var fails = require('../internals/fails');
var uncurryThis = require('../internals/function-uncurry-this');
var toString = require('../internals/to-string');
var trim = require('../internals/string-trim').trim;
var whitespaces = require('../internals/whitespaces');

var $parseInt = global.parseInt;
var Symbol = global.Symbol;
var ITERATOR = Symbol && Symbol.iterator;
var hex = /^[+-]?0x/i;
var exec = uncurryThis(hex.exec);
var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22
  // MS Edge 18- broken with boxed symbols
  || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); }));

// `parseInt` method
// https://tc39.es/ecma262/#sec-parseint-string-radix
module.exports = FORCED ? function parseInt(string, radix) {
  var S = trim(toString(string));
  return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10));
} : $parseInt;

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/string-trim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-trim.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js","../internals/whitespaces":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/whitespaces.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-assign.js":[function(require,module,exports){
'use strict';
var DESCRIPTORS = require('../internals/descriptors');
var uncurryThis = require('../internals/function-uncurry-this');
var call = require('../internals/function-call');
var fails = require('../internals/fails');
var objectKeys = require('../internals/object-keys');
var getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');
var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');
var toObject = require('../internals/to-object');
var IndexedObject = require('../internals/indexed-object');

// eslint-disable-next-line es-x/no-object-assign -- safe
var $assign = Object.assign;
// eslint-disable-next-line es-x/no-object-defineproperty -- required for testing
var defineProperty = Object.defineProperty;
var concat = uncurryThis([].concat);

// `Object.assign` method
// https://tc39.es/ecma262/#sec-object.assign
module.exports = !$assign || fails(function () {
  // should have correct order of operations (Edge bug)
  if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {
    enumerable: true,
    get: function () {
      defineProperty(this, 'b', {
        value: 3,
        enumerable: false
      });
    }
  }), { b: 2 })).b !== 1) return true;
  // should work with symbols and should have deterministic property order (V8 bug)
  var A = {};
  var B = {};
  // eslint-disable-next-line es-x/no-symbol -- safe
  var symbol = Symbol();
  var alphabet = 'abcdefghijklmnopqrst';
  A[symbol] = 7;
  alphabet.split('').forEach(function (chr) { B[chr] = chr; });
  return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet;
}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`
  var T = toObject(target);
  var argumentsLength = arguments.length;
  var index = 1;
  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
  var propertyIsEnumerable = propertyIsEnumerableModule.f;
  while (argumentsLength > index) {
    var S = IndexedObject(arguments[index++]);
    var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S);
    var length = keys.length;
    var j = 0;
    var key;
    while (length > j) {
      key = keys[j++];
      if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key];
    }
  } return T;
} : $assign;

},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/indexed-object.js","../internals/object-get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-symbols.js","../internals/object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-keys.js","../internals/object-property-is-enumerable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-property-is-enumerable.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-create.js":[function(require,module,exports){
/* global ActiveXObject -- old IE, WSH */
var anObject = require('../internals/an-object');
var definePropertiesModule = require('../internals/object-define-properties');
var enumBugKeys = require('../internals/enum-bug-keys');
var hiddenKeys = require('../internals/hidden-keys');
var html = require('../internals/html');
var documentCreateElement = require('../internals/document-create-element');
var sharedKey = require('../internals/shared-key');

var GT = '>';
var LT = '<';
var PROTOTYPE = 'prototype';
var SCRIPT = 'script';
var IE_PROTO = sharedKey('IE_PROTO');

var EmptyConstructor = function () { /* empty */ };

var scriptTag = function (content) {
  return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;
};

// Create object with fake `null` prototype: use ActiveX Object with cleared prototype
var NullProtoObjectViaActiveX = function (activeXDocument) {
  activeXDocument.write(scriptTag(''));
  activeXDocument.close();
  var temp = activeXDocument.parentWindow.Object;
  activeXDocument = null; // avoid memory leak
  return temp;
};

// Create object with fake `null` prototype: use iframe Object with cleared prototype
var NullProtoObjectViaIFrame = function () {
  // Thrash, waste and sodomy: IE GC bug
  var iframe = documentCreateElement('iframe');
  var JS = 'java' + SCRIPT + ':';
  var iframeDocument;
  iframe.style.display = 'none';
  html.appendChild(iframe);
  // https://github.com/zloirock/core-js/issues/475
  iframe.src = String(JS);
  iframeDocument = iframe.contentWindow.document;
  iframeDocument.open();
  iframeDocument.write(scriptTag('document.F=Object'));
  iframeDocument.close();
  return iframeDocument.F;
};

// Check for document.domain and active x support
// No need to use active x approach when document.domain is not set
// see https://github.com/es-shims/es5-shim/issues/150
// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346
// avoid IE GC bug
var activeXDocument;
var NullProtoObject = function () {
  try {
    activeXDocument = new ActiveXObject('htmlfile');
  } catch (error) { /* ignore */ }
  NullProtoObject = typeof document != 'undefined'
    ? document.domain && activeXDocument
      ? NullProtoObjectViaActiveX(activeXDocument) // old IE
      : NullProtoObjectViaIFrame()
    : NullProtoObjectViaActiveX(activeXDocument); // WSH
  var length = enumBugKeys.length;
  while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];
  return NullProtoObject();
};

hiddenKeys[IE_PROTO] = true;

// `Object.create` method
// https://tc39.es/ecma262/#sec-object.create
// eslint-disable-next-line es-x/no-object-create -- safe
module.exports = Object.create || function create(O, Properties) {
  var result;
  if (O !== null) {
    EmptyConstructor[PROTOTYPE] = anObject(O);
    result = new EmptyConstructor();
    EmptyConstructor[PROTOTYPE] = null;
    // add "__proto__" for Object.getPrototypeOf polyfill
    result[IE_PROTO] = O;
  } else result = NullProtoObject();
  return Properties === undefined ? result : definePropertiesModule.f(result, Properties);
};

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/document-create-element":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/document-create-element.js","../internals/enum-bug-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/enum-bug-keys.js","../internals/hidden-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/hidden-keys.js","../internals/html":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/html.js","../internals/object-define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-properties.js","../internals/shared-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared-key.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-properties.js":[function(require,module,exports){
var DESCRIPTORS = require('../internals/descriptors');
var V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');
var definePropertyModule = require('../internals/object-define-property');
var anObject = require('../internals/an-object');
var toIndexedObject = require('../internals/to-indexed-object');
var objectKeys = require('../internals/object-keys');

// `Object.defineProperties` method
// https://tc39.es/ecma262/#sec-object.defineproperties
// eslint-disable-next-line es-x/no-object-defineproperties -- safe
exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {
  anObject(O);
  var props = toIndexedObject(Properties);
  var keys = objectKeys(Properties);
  var length = keys.length;
  var index = 0;
  var key;
  while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);
  return O;
};

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js","../internals/object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-keys.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js","../internals/v8-prototype-define-bug":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/v8-prototype-define-bug.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js":[function(require,module,exports){
var global = require('../internals/global');
var DESCRIPTORS = require('../internals/descriptors');
var IE8_DOM_DEFINE = require('../internals/ie8-dom-define');
var V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');
var anObject = require('../internals/an-object');
var toPropertyKey = require('../internals/to-property-key');

var TypeError = global.TypeError;
// eslint-disable-next-line es-x/no-object-defineproperty -- safe
var $defineProperty = Object.defineProperty;
// eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe
var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
var ENUMERABLE = 'enumerable';
var CONFIGURABLE = 'configurable';
var WRITABLE = 'writable';

// `Object.defineProperty` method
// https://tc39.es/ecma262/#sec-object.defineproperty
exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {
  anObject(O);
  P = toPropertyKey(P);
  anObject(Attributes);
  if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {
    var current = $getOwnPropertyDescriptor(O, P);
    if (current && current[WRITABLE]) {
      O[P] = Attributes.value;
      Attributes = {
        configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],
        enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],
        writable: false
      };
    }
  } return $defineProperty(O, P, Attributes);
} : $defineProperty : function defineProperty(O, P, Attributes) {
  anObject(O);
  P = toPropertyKey(P);
  anObject(Attributes);
  if (IE8_DOM_DEFINE) try {
    return $defineProperty(O, P, Attributes);
  } catch (error) { /* empty */ }
  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');
  if ('value' in Attributes) O[P] = Attributes.value;
  return O;
};

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/ie8-dom-define":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/ie8-dom-define.js","../internals/to-property-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-property-key.js","../internals/v8-prototype-define-bug":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/v8-prototype-define-bug.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js":[function(require,module,exports){
var DESCRIPTORS = require('../internals/descriptors');
var call = require('../internals/function-call');
var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');
var createPropertyDescriptor = require('../internals/create-property-descriptor');
var toIndexedObject = require('../internals/to-indexed-object');
var toPropertyKey = require('../internals/to-property-key');
var hasOwn = require('../internals/has-own-property');
var IE8_DOM_DEFINE = require('../internals/ie8-dom-define');

// eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe
var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;

// `Object.getOwnPropertyDescriptor` method
// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {
  O = toIndexedObject(O);
  P = toPropertyKey(P);
  if (IE8_DOM_DEFINE) try {
    return $getOwnPropertyDescriptor(O, P);
  } catch (error) { /* empty */ }
  if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);
};

},{"../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property-descriptor.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/ie8-dom-define":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/ie8-dom-define.js","../internals/object-property-is-enumerable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-property-is-enumerable.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js","../internals/to-property-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-property-key.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-names-external.js":[function(require,module,exports){
/* eslint-disable es-x/no-object-getownpropertynames -- safe */
var classof = require('../internals/classof-raw');
var toIndexedObject = require('../internals/to-indexed-object');
var $getOwnPropertyNames = require('../internals/object-get-own-property-names').f;
var arraySlice = require('../internals/array-slice-simple');

var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
  ? Object.getOwnPropertyNames(window) : [];

var getWindowNames = function (it) {
  try {
    return $getOwnPropertyNames(it);
  } catch (error) {
    return arraySlice(windowNames);
  }
};

// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
module.exports.f = function getOwnPropertyNames(it) {
  return windowNames && classof(it) == 'Window'
    ? getWindowNames(it)
    : $getOwnPropertyNames(toIndexedObject(it));
};

},{"../internals/array-slice-simple":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice-simple.js","../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof-raw.js","../internals/object-get-own-property-names":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-names.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-names.js":[function(require,module,exports){
var internalObjectKeys = require('../internals/object-keys-internal');
var enumBugKeys = require('../internals/enum-bug-keys');

var hiddenKeys = enumBugKeys.concat('length', 'prototype');

// `Object.getOwnPropertyNames` method
// https://tc39.es/ecma262/#sec-object.getownpropertynames
// eslint-disable-next-line es-x/no-object-getownpropertynames -- safe
exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
  return internalObjectKeys(O, hiddenKeys);
};

},{"../internals/enum-bug-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/enum-bug-keys.js","../internals/object-keys-internal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-keys-internal.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-symbols.js":[function(require,module,exports){
// eslint-disable-next-line es-x/no-object-getownpropertysymbols -- safe
exports.f = Object.getOwnPropertySymbols;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-prototype-of.js":[function(require,module,exports){
var global = require('../internals/global');
var hasOwn = require('../internals/has-own-property');
var isCallable = require('../internals/is-callable');
var toObject = require('../internals/to-object');
var sharedKey = require('../internals/shared-key');
var CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');

var IE_PROTO = sharedKey('IE_PROTO');
var Object = global.Object;
var ObjectPrototype = Object.prototype;

// `Object.getPrototypeOf` method
// https://tc39.es/ecma262/#sec-object.getprototypeof
module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {
  var object = toObject(O);
  if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];
  var constructor = object.constructor;
  if (isCallable(constructor) && object instanceof constructor) {
    return constructor.prototype;
  } return object instanceof Object ? ObjectPrototype : null;
};

},{"../internals/correct-prototype-getter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/correct-prototype-getter.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/shared-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared-key.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-extensible.js":[function(require,module,exports){
var fails = require('../internals/fails');
var isObject = require('../internals/is-object');
var classof = require('../internals/classof-raw');
var ARRAY_BUFFER_NON_EXTENSIBLE = require('../internals/array-buffer-non-extensible');

// eslint-disable-next-line es-x/no-object-isextensible -- safe
var $isExtensible = Object.isExtensible;
var FAILS_ON_PRIMITIVES = fails(function () { $isExtensible(1); });

// `Object.isExtensible` method
// https://tc39.es/ecma262/#sec-object.isextensible
module.exports = (FAILS_ON_PRIMITIVES || ARRAY_BUFFER_NON_EXTENSIBLE) ? function isExtensible(it) {
  if (!isObject(it)) return false;
  if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) == 'ArrayBuffer') return false;
  return $isExtensible ? $isExtensible(it) : true;
} : $isExtensible;

},{"../internals/array-buffer-non-extensible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-buffer-non-extensible.js","../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof-raw.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');

module.exports = uncurryThis({}.isPrototypeOf);

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-keys-internal.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');
var hasOwn = require('../internals/has-own-property');
var toIndexedObject = require('../internals/to-indexed-object');
var indexOf = require('../internals/array-includes').indexOf;
var hiddenKeys = require('../internals/hidden-keys');

var push = uncurryThis([].push);

module.exports = function (object, names) {
  var O = toIndexedObject(object);
  var i = 0;
  var result = [];
  var key;
  for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);
  // Don't enum bug & hidden keys
  while (names.length > i) if (hasOwn(O, key = names[i++])) {
    ~indexOf(result, key) || push(result, key);
  }
  return result;
};

},{"../internals/array-includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-includes.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/hidden-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/hidden-keys.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-keys.js":[function(require,module,exports){
var internalObjectKeys = require('../internals/object-keys-internal');
var enumBugKeys = require('../internals/enum-bug-keys');

// `Object.keys` method
// https://tc39.es/ecma262/#sec-object.keys
// eslint-disable-next-line es-x/no-object-keys -- safe
module.exports = Object.keys || function keys(O) {
  return internalObjectKeys(O, enumBugKeys);
};

},{"../internals/enum-bug-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/enum-bug-keys.js","../internals/object-keys-internal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-keys-internal.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-property-is-enumerable.js":[function(require,module,exports){
'use strict';
var $propertyIsEnumerable = {}.propertyIsEnumerable;
// eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;

// Nashorn ~ JDK8 bug
var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);

// `Object.prototype.propertyIsEnumerable` method implementation
// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable
exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
  var descriptor = getOwnPropertyDescriptor(this, V);
  return !!descriptor && descriptor.enumerable;
} : $propertyIsEnumerable;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-set-prototype-of.js":[function(require,module,exports){
/* eslint-disable no-proto -- safe */
var uncurryThis = require('../internals/function-uncurry-this');
var anObject = require('../internals/an-object');
var aPossiblePrototype = require('../internals/a-possible-prototype');

// `Object.setPrototypeOf` method
// https://tc39.es/ecma262/#sec-object.setprototypeof
// Works with __proto__ only. Old v8 can't work with null proto objects.
// eslint-disable-next-line es-x/no-object-setprototypeof -- safe
module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {
  var CORRECT_SETTER = false;
  var test = {};
  var setter;
  try {
    // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe
    setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set);
    setter(test, []);
    CORRECT_SETTER = test instanceof Array;
  } catch (error) { /* empty */ }
  return function setPrototypeOf(O, proto) {
    anObject(O);
    aPossiblePrototype(proto);
    if (CORRECT_SETTER) setter(O, proto);
    else O.__proto__ = proto;
    return O;
  };
}() : undefined);

},{"../internals/a-possible-prototype":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-possible-prototype.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-to-array.js":[function(require,module,exports){
var DESCRIPTORS = require('../internals/descriptors');
var uncurryThis = require('../internals/function-uncurry-this');
var objectKeys = require('../internals/object-keys');
var toIndexedObject = require('../internals/to-indexed-object');
var $propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;

var propertyIsEnumerable = uncurryThis($propertyIsEnumerable);
var push = uncurryThis([].push);

// `Object.{ entries, values }` methods implementation
var createMethod = function (TO_ENTRIES) {
  return function (it) {
    var O = toIndexedObject(it);
    var keys = objectKeys(O);
    var length = keys.length;
    var i = 0;
    var result = [];
    var key;
    while (length > i) {
      key = keys[i++];
      if (!DESCRIPTORS || propertyIsEnumerable(O, key)) {
        push(result, TO_ENTRIES ? [key, O[key]] : O[key]);
      }
    }
    return result;
  };
};

module.exports = {
  // `Object.entries` method
  // https://tc39.es/ecma262/#sec-object.entries
  entries: createMethod(true),
  // `Object.values` method
  // https://tc39.es/ecma262/#sec-object.values
  values: createMethod(false)
};

},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-keys.js","../internals/object-property-is-enumerable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-property-is-enumerable.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-to-string.js":[function(require,module,exports){
'use strict';
var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');
var classof = require('../internals/classof');

// `Object.prototype.toString` method implementation
// https://tc39.es/ecma262/#sec-object.prototype.tostring
module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {
  return '[object ' + classof(this) + ']';
};

},{"../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof.js","../internals/to-string-tag-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string-tag-support.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/ordinary-to-primitive.js":[function(require,module,exports){
var global = require('../internals/global');
var call = require('../internals/function-call');
var isCallable = require('../internals/is-callable');
var isObject = require('../internals/is-object');

var TypeError = global.TypeError;

// `OrdinaryToPrimitive` abstract operation
// https://tc39.es/ecma262/#sec-ordinarytoprimitive
module.exports = function (input, pref) {
  var fn, val;
  if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;
  if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;
  if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;
  throw TypeError("Can't convert object to primitive value");
};

},{"../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/own-keys.js":[function(require,module,exports){
var getBuiltIn = require('../internals/get-built-in');
var uncurryThis = require('../internals/function-uncurry-this');
var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');
var getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');
var anObject = require('../internals/an-object');

var concat = uncurryThis([].concat);

// all object keys, includes non-enumerable and symbols
module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {
  var keys = getOwnPropertyNamesModule.f(anObject(it));
  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
  return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;
};

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/object-get-own-property-names":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-names.js","../internals/object-get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-symbols.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/perform.js":[function(require,module,exports){
module.exports = function (exec) {
  try {
    return { error: false, value: exec() };
  } catch (error) {
    return { error: true, value: error };
  }
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-constructor-detection.js":[function(require,module,exports){
var global = require('../internals/global');
var NativePromiseConstructor = require('../internals/promise-native-constructor');
var isCallable = require('../internals/is-callable');
var isForced = require('../internals/is-forced');
var inspectSource = require('../internals/inspect-source');
var wellKnownSymbol = require('../internals/well-known-symbol');
var IS_BROWSER = require('../internals/engine-is-browser');
var IS_PURE = require('../internals/is-pure');
var V8_VERSION = require('../internals/engine-v8-version');

var NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;
var SPECIES = wellKnownSymbol('species');
var SUBCLASSING = false;
var NATIVE_PROMISE_REJECTION_EVENT = isCallable(global.PromiseRejectionEvent);

var FORCED_PROMISE_CONSTRUCTOR = isForced('Promise', function () {
  var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(NativePromiseConstructor);
  var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(NativePromiseConstructor);
  // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
  // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
  // We can't detect it synchronously, so just check versions
  if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true;
  // We need Promise#{ catch, finally } in the pure version for preventing prototype pollution
  if (IS_PURE && !(NativePromisePrototype['catch'] && NativePromisePrototype['finally'])) return true;
  // We can't use @@species feature detection in V8 since it causes
  // deoptimization and performance degradation
  // https://github.com/zloirock/core-js/issues/679
  if (V8_VERSION >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false;
  // Detect correctness of subclassing with @@species support
  var promise = new NativePromiseConstructor(function (resolve) { resolve(1); });
  var FakePromise = function (exec) {
    exec(function () { /* empty */ }, function () { /* empty */ });
  };
  var constructor = promise.constructor = {};
  constructor[SPECIES] = FakePromise;
  SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;
  if (!SUBCLASSING) return true;
  // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test
  return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_PROMISE_REJECTION_EVENT;
});

module.exports = {
  CONSTRUCTOR: FORCED_PROMISE_CONSTRUCTOR,
  REJECTION_EVENT: NATIVE_PROMISE_REJECTION_EVENT,
  SUBCLASSING: SUBCLASSING
};

},{"../internals/engine-is-browser":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-browser.js","../internals/engine-v8-version":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-v8-version.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/inspect-source":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/inspect-source.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/is-forced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-forced.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-native-constructor.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-native-constructor.js":[function(require,module,exports){
var global = require('../internals/global');

module.exports = global.Promise;

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-resolve.js":[function(require,module,exports){
var anObject = require('../internals/an-object');
var isObject = require('../internals/is-object');
var newPromiseCapability = require('../internals/new-promise-capability');

module.exports = function (C, x) {
  anObject(C);
  if (isObject(x) && x.constructor === C) return x;
  var promiseCapability = newPromiseCapability.f(C);
  var resolve = promiseCapability.resolve;
  resolve(x);
  return promiseCapability.promise;
};

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/new-promise-capability.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-statics-incorrect-iteration.js":[function(require,module,exports){
var NativePromiseConstructor = require('../internals/promise-native-constructor');
var checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');
var FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;

module.exports = FORCED_PROMISE_CONSTRUCTOR || !checkCorrectnessOfIteration(function (iterable) {
  NativePromiseConstructor.all(iterable).then(undefined, function () { /* empty */ });
});

},{"../internals/check-correctness-of-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/check-correctness-of-iteration.js","../internals/promise-constructor-detection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-constructor-detection.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-native-constructor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/queue.js":[function(require,module,exports){
var Queue = function () {
  this.head = null;
  this.tail = null;
};

Queue.prototype = {
  add: function (item) {
    var entry = { item: item, next: null };
    if (this.head) this.tail.next = entry;
    else this.head = entry;
    this.tail = entry;
  },
  get: function () {
    var entry = this.head;
    if (entry) {
      this.head = entry.next;
      if (this.tail === entry) this.tail = null;
      return entry.item;
    }
  }
};

module.exports = Queue;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine-all.js":[function(require,module,exports){
var redefine = require('../internals/redefine');

module.exports = function (target, src, options) {
  for (var key in src) {
    if (options && options.unsafe && target[key]) target[key] = src[key];
    else redefine(target, key, src[key], options);
  } return target;
};

},{"../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine.js":[function(require,module,exports){
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');

module.exports = function (target, key, value, options) {
  if (options && options.enumerable) target[key] = value;
  else createNonEnumerableProperty(target, key, value);
};

},{"../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-non-enumerable-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/require-object-coercible.js":[function(require,module,exports){
var global = require('../internals/global');

var TypeError = global.TypeError;

// `RequireObjectCoercible` abstract operation
// https://tc39.es/ecma262/#sec-requireobjectcoercible
module.exports = function (it) {
  if (it == undefined) throw TypeError("Can't call method on " + it);
  return it;
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/same-value.js":[function(require,module,exports){
// `SameValue` abstract operation
// https://tc39.es/ecma262/#sec-samevalue
// eslint-disable-next-line es-x/no-object-is -- safe
module.exports = Object.is || function is(x, y) {
  // eslint-disable-next-line no-self-compare -- NaN check
  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/schedulers-fix.js":[function(require,module,exports){
var global = require('../internals/global');
var apply = require('../internals/function-apply');
var isCallable = require('../internals/is-callable');
var userAgent = require('../internals/engine-user-agent');
var arraySlice = require('../internals/array-slice');
var validateArgumentsLength = require('../internals/validate-arguments-length');

var MSIE = /MSIE .\./.test(userAgent); // <- dirty ie9- check
var Function = global.Function;

var wrap = function (scheduler) {
  return MSIE ? function (handler, timeout /* , ...arguments */) {
    var boundArgs = validateArgumentsLength(arguments.length, 1) > 2;
    var fn = isCallable(handler) ? handler : Function(handler);
    var args = boundArgs ? arraySlice(arguments, 2) : undefined;
    return scheduler(boundArgs ? function () {
      apply(fn, this, args);
    } : fn, timeout);
  } : scheduler;
};

// ie9- setTimeout & setInterval additional parameters fix
// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers
module.exports = {
  // `setTimeout` method
  // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout
  setTimeout: wrap(global.setTimeout),
  // `setInterval` method
  // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
  setInterval: wrap(global.setInterval)
};

},{"../internals/array-slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice.js","../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-user-agent.js","../internals/function-apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-apply.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/validate-arguments-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/validate-arguments-length.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-global.js":[function(require,module,exports){
var global = require('../internals/global');

// eslint-disable-next-line es-x/no-object-defineproperty -- safe
var defineProperty = Object.defineProperty;

module.exports = function (key, value) {
  try {
    defineProperty(global, key, { value: value, configurable: true, writable: true });
  } catch (error) {
    global[key] = value;
  } return value;
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-species.js":[function(require,module,exports){
'use strict';
var getBuiltIn = require('../internals/get-built-in');
var definePropertyModule = require('../internals/object-define-property');
var wellKnownSymbol = require('../internals/well-known-symbol');
var DESCRIPTORS = require('../internals/descriptors');

var SPECIES = wellKnownSymbol('species');

module.exports = function (CONSTRUCTOR_NAME) {
  var Constructor = getBuiltIn(CONSTRUCTOR_NAME);
  var defineProperty = definePropertyModule.f;

  if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {
    defineProperty(Constructor, SPECIES, {
      configurable: true,
      get: function () { return this; }
    });
  }
};

},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-to-string-tag.js":[function(require,module,exports){
var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');
var defineProperty = require('../internals/object-define-property').f;
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var hasOwn = require('../internals/has-own-property');
var toString = require('../internals/object-to-string');
var wellKnownSymbol = require('../internals/well-known-symbol');

var TO_STRING_TAG = wellKnownSymbol('toStringTag');

module.exports = function (it, TAG, STATIC, SET_METHOD) {
  if (it) {
    var target = STATIC ? it : it.prototype;
    if (!hasOwn(target, TO_STRING_TAG)) {
      defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });
    }
    if (SET_METHOD && !TO_STRING_TAG_SUPPORT) {
      createNonEnumerableProperty(target, 'toString', toString);
    }
  }
};

},{"../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-non-enumerable-property.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js","../internals/object-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-to-string.js","../internals/to-string-tag-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string-tag-support.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared-key.js":[function(require,module,exports){
var shared = require('../internals/shared');
var uid = require('../internals/uid');

var keys = shared('keys');

module.exports = function (key) {
  return keys[key] || (keys[key] = uid(key));
};

},{"../internals/shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared.js","../internals/uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/uid.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared-store.js":[function(require,module,exports){
var global = require('../internals/global');
var setGlobal = require('../internals/set-global');

var SHARED = '__core-js_shared__';
var store = global[SHARED] || setGlobal(SHARED, {});

module.exports = store;

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/set-global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared.js":[function(require,module,exports){
var IS_PURE = require('../internals/is-pure');
var store = require('../internals/shared-store');

(module.exports = function (key, value) {
  return store[key] || (store[key] = value !== undefined ? value : {});
})('versions', []).push({
  version: '3.22.1',
  mode: IS_PURE ? 'pure' : 'global',
  copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)',
  license: 'https://github.com/zloirock/core-js/blob/v3.22.1/LICENSE',
  source: 'https://github.com/zloirock/core-js'
});

},{"../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js","../internals/shared-store":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared-store.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/species-constructor.js":[function(require,module,exports){
var anObject = require('../internals/an-object');
var aConstructor = require('../internals/a-constructor');
var wellKnownSymbol = require('../internals/well-known-symbol');

var SPECIES = wellKnownSymbol('species');

// `SpeciesConstructor` abstract operation
// https://tc39.es/ecma262/#sec-speciesconstructor
module.exports = function (O, defaultConstructor) {
  var C = anObject(O).constructor;
  var S;
  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aConstructor(S);
};

},{"../internals/a-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-constructor.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-multibyte.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
var toString = require('../internals/to-string');
var requireObjectCoercible = require('../internals/require-object-coercible');

var charAt = uncurryThis(''.charAt);
var charCodeAt = uncurryThis(''.charCodeAt);
var stringSlice = uncurryThis(''.slice);

var createMethod = function (CONVERT_TO_STRING) {
  return function ($this, pos) {
    var S = toString(requireObjectCoercible($this));
    var position = toIntegerOrInfinity(pos);
    var size = S.length;
    var first, second;
    if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
    first = charCodeAt(S, position);
    return first < 0xD800 || first > 0xDBFF || position + 1 === size
      || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF
        ? CONVERT_TO_STRING
          ? charAt(S, position)
          : first
        : CONVERT_TO_STRING
          ? stringSlice(S, position, position + 2)
          : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
  };
};

module.exports = {
  // `String.prototype.codePointAt` method
  // https://tc39.es/ecma262/#sec-string.prototype.codepointat
  codeAt: createMethod(false),
  // `String.prototype.at` method
  // https://github.com/mathiasbynens/String.prototype.at
  charAt: createMethod(true)
};

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/require-object-coercible.js","../internals/to-integer-or-infinity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-integer-or-infinity.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-pad-webkit-bug.js":[function(require,module,exports){
// https://github.com/zloirock/core-js/issues/280
var userAgent = require('../internals/engine-user-agent');

module.exports = /Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(userAgent);

},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-user-agent.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-pad.js":[function(require,module,exports){
// https://github.com/tc39/proposal-string-pad-start-end
var uncurryThis = require('../internals/function-uncurry-this');
var toLength = require('../internals/to-length');
var toString = require('../internals/to-string');
var $repeat = require('../internals/string-repeat');
var requireObjectCoercible = require('../internals/require-object-coercible');

var repeat = uncurryThis($repeat);
var stringSlice = uncurryThis(''.slice);
var ceil = Math.ceil;

// `String.prototype.{ padStart, padEnd }` methods implementation
var createMethod = function (IS_END) {
  return function ($this, maxLength, fillString) {
    var S = toString(requireObjectCoercible($this));
    var intMaxLength = toLength(maxLength);
    var stringLength = S.length;
    var fillStr = fillString === undefined ? ' ' : toString(fillString);
    var fillLen, stringFiller;
    if (intMaxLength <= stringLength || fillStr == '') return S;
    fillLen = intMaxLength - stringLength;
    stringFiller = repeat(fillStr, ceil(fillLen / fillStr.length));
    if (stringFiller.length > fillLen) stringFiller = stringSlice(stringFiller, 0, fillLen);
    return IS_END ? S + stringFiller : stringFiller + S;
  };
};

module.exports = {
  // `String.prototype.padStart` method
  // https://tc39.es/ecma262/#sec-string.prototype.padstart
  start: createMethod(false),
  // `String.prototype.padEnd` method
  // https://tc39.es/ecma262/#sec-string.prototype.padend
  end: createMethod(true)
};

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/require-object-coercible.js","../internals/string-repeat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-repeat.js","../internals/to-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-length.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-repeat.js":[function(require,module,exports){
'use strict';
var global = require('../internals/global');
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
var toString = require('../internals/to-string');
var requireObjectCoercible = require('../internals/require-object-coercible');

var RangeError = global.RangeError;

// `String.prototype.repeat` method implementation
// https://tc39.es/ecma262/#sec-string.prototype.repeat
module.exports = function repeat(count) {
  var str = toString(requireObjectCoercible(this));
  var result = '';
  var n = toIntegerOrInfinity(count);
  if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');
  for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;
  return result;
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/require-object-coercible.js","../internals/to-integer-or-infinity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-integer-or-infinity.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-trim-forced.js":[function(require,module,exports){
var PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;
var fails = require('../internals/fails');
var whitespaces = require('../internals/whitespaces');

var non = '\u200B\u0085\u180E';

// check that a method works with the correct list
// of whitespaces and has a correct name
module.exports = function (METHOD_NAME) {
  return fails(function () {
    return !!whitespaces[METHOD_NAME]()
      || non[METHOD_NAME]() !== non
      || (PROPER_FUNCTION_NAME && whitespaces[METHOD_NAME].name !== METHOD_NAME);
  });
};

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/function-name":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-name.js","../internals/whitespaces":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/whitespaces.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-trim.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');
var requireObjectCoercible = require('../internals/require-object-coercible');
var toString = require('../internals/to-string');
var whitespaces = require('../internals/whitespaces');

var replace = uncurryThis(''.replace);
var whitespace = '[' + whitespaces + ']';
var ltrim = RegExp('^' + whitespace + whitespace + '*');
var rtrim = RegExp(whitespace + whitespace + '*$');

// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation
var createMethod = function (TYPE) {
  return function ($this) {
    var string = toString(requireObjectCoercible($this));
    if (TYPE & 1) string = replace(string, ltrim, '');
    if (TYPE & 2) string = replace(string, rtrim, '');
    return string;
  };
};

module.exports = {
  // `String.prototype.{ trimLeft, trimStart }` methods
  // https://tc39.es/ecma262/#sec-string.prototype.trimstart
  start: createMethod(1),
  // `String.prototype.{ trimRight, trimEnd }` methods
  // https://tc39.es/ecma262/#sec-string.prototype.trimend
  end: createMethod(2),
  // `String.prototype.trim` method
  // https://tc39.es/ecma262/#sec-string.prototype.trim
  trim: createMethod(3)
};

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/require-object-coercible.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js","../internals/whitespaces":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/whitespaces.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/symbol-define-to-primitive.js":[function(require,module,exports){
var call = require('../internals/function-call');
var getBuiltIn = require('../internals/get-built-in');
var wellKnownSymbol = require('../internals/well-known-symbol');
var redefine = require('../internals/redefine');

module.exports = function () {
  var Symbol = getBuiltIn('Symbol');
  var SymbolPrototype = Symbol && Symbol.prototype;
  var valueOf = SymbolPrototype && SymbolPrototype.valueOf;
  var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');

  if (SymbolPrototype && !SymbolPrototype[TO_PRIMITIVE]) {
    // `Symbol.prototype[@@toPrimitive]` method
    // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive
    // eslint-disable-next-line no-unused-vars -- required for .length
    redefine(SymbolPrototype, TO_PRIMITIVE, function (hint) {
      return call(valueOf, this);
    });
  }
};

},{"../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/task.js":[function(require,module,exports){
var global = require('../internals/global');
var apply = require('../internals/function-apply');
var bind = require('../internals/function-bind-context');
var isCallable = require('../internals/is-callable');
var hasOwn = require('../internals/has-own-property');
var fails = require('../internals/fails');
var html = require('../internals/html');
var arraySlice = require('../internals/array-slice');
var createElement = require('../internals/document-create-element');
var validateArgumentsLength = require('../internals/validate-arguments-length');
var IS_IOS = require('../internals/engine-is-ios');
var IS_NODE = require('../internals/engine-is-node');

var set = global.setImmediate;
var clear = global.clearImmediate;
var process = global.process;
var Dispatch = global.Dispatch;
var Function = global.Function;
var MessageChannel = global.MessageChannel;
var String = global.String;
var counter = 0;
var queue = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
var location, defer, channel, port;

try {
  // Deno throws a ReferenceError on `location` access without `--location` flag
  location = global.location;
} catch (error) { /* empty */ }

var run = function (id) {
  if (hasOwn(queue, id)) {
    var fn = queue[id];
    delete queue[id];
    fn();
  }
};

var runner = function (id) {
  return function () {
    run(id);
  };
};

var listener = function (event) {
  run(event.data);
};

var post = function (id) {
  // old engines have not location.origin
  global.postMessage(String(id), location.protocol + '//' + location.host);
};

// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
if (!set || !clear) {
  set = function setImmediate(handler) {
    validateArgumentsLength(arguments.length, 1);
    var fn = isCallable(handler) ? handler : Function(handler);
    var args = arraySlice(arguments, 1);
    queue[++counter] = function () {
      apply(fn, undefined, args);
    };
    defer(counter);
    return counter;
  };
  clear = function clearImmediate(id) {
    delete queue[id];
  };
  // Node.js 0.8-
  if (IS_NODE) {
    defer = function (id) {
      process.nextTick(runner(id));
    };
  // Sphere (JS game engine) Dispatch API
  } else if (Dispatch && Dispatch.now) {
    defer = function (id) {
      Dispatch.now(runner(id));
    };
  // Browsers with MessageChannel, includes WebWorkers
  // except iOS - https://github.com/zloirock/core-js/issues/624
  } else if (MessageChannel && !IS_IOS) {
    channel = new MessageChannel();
    port = channel.port2;
    channel.port1.onmessage = listener;
    defer = bind(port.postMessage, port);
  // Browsers with postMessage, skip WebWorkers
  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
  } else if (
    global.addEventListener &&
    isCallable(global.postMessage) &&
    !global.importScripts &&
    location && location.protocol !== 'file:' &&
    !fails(post)
  ) {
    defer = post;
    global.addEventListener('message', listener, false);
  // IE8-
  } else if (ONREADYSTATECHANGE in createElement('script')) {
    defer = function (id) {
      html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {
        html.removeChild(this);
        run(id);
      };
    };
  // Rest old browsers
  } else {
    defer = function (id) {
      setTimeout(runner(id), 0);
    };
  }
}

module.exports = {
  set: set,
  clear: clear
};

},{"../internals/array-slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice.js","../internals/document-create-element":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/document-create-element.js","../internals/engine-is-ios":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-ios.js","../internals/engine-is-node":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-node.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/function-apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-apply.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-context.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/html":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/html.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/validate-arguments-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/validate-arguments-length.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-absolute-index.js":[function(require,module,exports){
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');

var max = Math.max;
var min = Math.min;

// Helper for a popular repeating case of the spec:
// Let integer be ? ToInteger(index).
// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
module.exports = function (index, length) {
  var integer = toIntegerOrInfinity(index);
  return integer < 0 ? max(integer + length, 0) : min(integer, length);
};

},{"../internals/to-integer-or-infinity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-integer-or-infinity.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js":[function(require,module,exports){
// toObject with fallback for non-array-like ES3 strings
var IndexedObject = require('../internals/indexed-object');
var requireObjectCoercible = require('../internals/require-object-coercible');

module.exports = function (it) {
  return IndexedObject(requireObjectCoercible(it));
};

},{"../internals/indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/indexed-object.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/require-object-coercible.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-integer-or-infinity.js":[function(require,module,exports){
var ceil = Math.ceil;
var floor = Math.floor;

// `ToIntegerOrInfinity` abstract operation
// https://tc39.es/ecma262/#sec-tointegerorinfinity
module.exports = function (argument) {
  var number = +argument;
  // eslint-disable-next-line no-self-compare -- safe
  return number !== number || number === 0 ? 0 : (number > 0 ? floor : ceil)(number);
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-length.js":[function(require,module,exports){
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');

var min = Math.min;

// `ToLength` abstract operation
// https://tc39.es/ecma262/#sec-tolength
module.exports = function (argument) {
  return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
};

},{"../internals/to-integer-or-infinity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-integer-or-infinity.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js":[function(require,module,exports){
var global = require('../internals/global');
var requireObjectCoercible = require('../internals/require-object-coercible');

var Object = global.Object;

// `ToObject` abstract operation
// https://tc39.es/ecma262/#sec-toobject
module.exports = function (argument) {
  return Object(requireObjectCoercible(argument));
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/require-object-coercible.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-primitive.js":[function(require,module,exports){
var global = require('../internals/global');
var call = require('../internals/function-call');
var isObject = require('../internals/is-object');
var isSymbol = require('../internals/is-symbol');
var getMethod = require('../internals/get-method');
var ordinaryToPrimitive = require('../internals/ordinary-to-primitive');
var wellKnownSymbol = require('../internals/well-known-symbol');

var TypeError = global.TypeError;
var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');

// `ToPrimitive` abstract operation
// https://tc39.es/ecma262/#sec-toprimitive
module.exports = function (input, pref) {
  if (!isObject(input) || isSymbol(input)) return input;
  var exoticToPrim = getMethod(input, TO_PRIMITIVE);
  var result;
  if (exoticToPrim) {
    if (pref === undefined) pref = 'default';
    result = call(exoticToPrim, input, pref);
    if (!isObject(result) || isSymbol(result)) return result;
    throw TypeError("Can't convert object to primitive value");
  }
  if (pref === undefined) pref = 'number';
  return ordinaryToPrimitive(input, pref);
};

},{"../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/get-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-method.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/is-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-symbol.js","../internals/ordinary-to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/ordinary-to-primitive.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-property-key.js":[function(require,module,exports){
var toPrimitive = require('../internals/to-primitive');
var isSymbol = require('../internals/is-symbol');

// `ToPropertyKey` abstract operation
// https://tc39.es/ecma262/#sec-topropertykey
module.exports = function (argument) {
  var key = toPrimitive(argument, 'string');
  return isSymbol(key) ? key : key + '';
};

},{"../internals/is-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-symbol.js","../internals/to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-primitive.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string-tag-support.js":[function(require,module,exports){
var wellKnownSymbol = require('../internals/well-known-symbol');

var TO_STRING_TAG = wellKnownSymbol('toStringTag');
var test = {};

test[TO_STRING_TAG] = 'z';

module.exports = String(test) === '[object z]';

},{"../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js":[function(require,module,exports){
var global = require('../internals/global');
var classof = require('../internals/classof');

var String = global.String;

module.exports = function (argument) {
  if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');
  return String(argument);
};

},{"../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/try-to-string.js":[function(require,module,exports){
var global = require('../internals/global');

var String = global.String;

module.exports = function (argument) {
  try {
    return String(argument);
  } catch (error) {
    return 'Object';
  }
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/uid.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');

var id = 0;
var postfix = Math.random();
var toString = uncurryThis(1.0.toString);

module.exports = function (key) {
  return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);
};

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/use-symbol-as-uid.js":[function(require,module,exports){
/* eslint-disable es-x/no-symbol -- required for testing */
var NATIVE_SYMBOL = require('../internals/native-symbol');

module.exports = NATIVE_SYMBOL
  && !Symbol.sham
  && typeof Symbol.iterator == 'symbol';

},{"../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/v8-prototype-define-bug.js":[function(require,module,exports){
var DESCRIPTORS = require('../internals/descriptors');
var fails = require('../internals/fails');

// V8 ~ Chrome 36-
// https://bugs.chromium.org/p/v8/issues/detail?id=3334
module.exports = DESCRIPTORS && fails(function () {
  // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing
  return Object.defineProperty(function () { /* empty */ }, 'prototype', {
    value: 42,
    writable: false
  }).prototype != 42;
});

},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/validate-arguments-length.js":[function(require,module,exports){
var global = require('../internals/global');

var TypeError = global.TypeError;

module.exports = function (passed, required) {
  if (passed < required) throw TypeError('Not enough arguments');
  return passed;
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol-wrapped.js":[function(require,module,exports){
var wellKnownSymbol = require('../internals/well-known-symbol');

exports.f = wellKnownSymbol;

},{"../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js":[function(require,module,exports){
var global = require('../internals/global');
var shared = require('../internals/shared');
var hasOwn = require('../internals/has-own-property');
var uid = require('../internals/uid');
var NATIVE_SYMBOL = require('../internals/native-symbol');
var USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');

var WellKnownSymbolsStore = shared('wks');
var Symbol = global.Symbol;
var symbolFor = Symbol && Symbol['for'];
var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;

module.exports = function (name) {
  if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) {
    var description = 'Symbol.' + name;
    if (NATIVE_SYMBOL && hasOwn(Symbol, name)) {
      WellKnownSymbolsStore[name] = Symbol[name];
    } else if (USE_SYMBOL_AS_UID && symbolFor) {
      WellKnownSymbolsStore[name] = symbolFor(description);
    } else {
      WellKnownSymbolsStore[name] = createWellKnownSymbol(description);
    }
  } return WellKnownSymbolsStore[name];
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol.js","../internals/shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared.js","../internals/uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/uid.js","../internals/use-symbol-as-uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/use-symbol-as-uid.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/whitespaces.js":[function(require,module,exports){
// a string of all valid unicode whitespaces
module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' +
  '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.aggregate-error.constructor.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var global = require('../internals/global');
var isPrototypeOf = require('../internals/object-is-prototype-of');
var getPrototypeOf = require('../internals/object-get-prototype-of');
var setPrototypeOf = require('../internals/object-set-prototype-of');
var copyConstructorProperties = require('../internals/copy-constructor-properties');
var create = require('../internals/object-create');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var createPropertyDescriptor = require('../internals/create-property-descriptor');
var clearErrorStack = require('../internals/clear-error-stack');
var installErrorCause = require('../internals/install-error-cause');
var iterate = require('../internals/iterate');
var normalizeStringArgument = require('../internals/normalize-string-argument');
var wellKnownSymbol = require('../internals/well-known-symbol');
var ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable');

var TO_STRING_TAG = wellKnownSymbol('toStringTag');
var Error = global.Error;
var push = [].push;

var $AggregateError = function AggregateError(errors, message /* , options */) {
  var options = arguments.length > 2 ? arguments[2] : undefined;
  var isInstance = isPrototypeOf(AggregateErrorPrototype, this);
  var that;
  if (setPrototypeOf) {
    that = setPrototypeOf(new Error(), isInstance ? getPrototypeOf(this) : AggregateErrorPrototype);
  } else {
    that = isInstance ? this : create(AggregateErrorPrototype);
    createNonEnumerableProperty(that, TO_STRING_TAG, 'Error');
  }
  if (message !== undefined) createNonEnumerableProperty(that, 'message', normalizeStringArgument(message));
  if (ERROR_STACK_INSTALLABLE) createNonEnumerableProperty(that, 'stack', clearErrorStack(that.stack, 1));
  installErrorCause(that, options);
  var errorsArray = [];
  iterate(errors, push, { that: errorsArray });
  createNonEnumerableProperty(that, 'errors', errorsArray);
  return that;
};

if (setPrototypeOf) setPrototypeOf($AggregateError, Error);
else copyConstructorProperties($AggregateError, Error, { name: true });

var AggregateErrorPrototype = $AggregateError.prototype = create(Error.prototype, {
  constructor: createPropertyDescriptor(1, $AggregateError),
  message: createPropertyDescriptor(1, ''),
  name: createPropertyDescriptor(1, 'AggregateError')
});

// `AggregateError` constructor
// https://tc39.es/ecma262/#sec-aggregate-error-constructor
$({ global: true }, {
  AggregateError: $AggregateError
});

},{"../internals/clear-error-stack":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/clear-error-stack.js","../internals/copy-constructor-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/copy-constructor-properties.js","../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-non-enumerable-property.js","../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property-descriptor.js","../internals/error-stack-installable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/error-stack-installable.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/install-error-cause":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/install-error-cause.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterate.js","../internals/normalize-string-argument":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/normalize-string-argument.js","../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-create.js","../internals/object-get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-prototype-of.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../internals/object-set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-set-prototype-of.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.aggregate-error.js":[function(require,module,exports){
// TODO: Remove this module from `core-js@4` since it's replaced to module below
require('../modules/es.aggregate-error.constructor');

},{"../modules/es.aggregate-error.constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.aggregate-error.constructor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.concat.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var global = require('../internals/global');
var fails = require('../internals/fails');
var isArray = require('../internals/is-array');
var isObject = require('../internals/is-object');
var toObject = require('../internals/to-object');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var createProperty = require('../internals/create-property');
var arraySpeciesCreate = require('../internals/array-species-create');
var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
var wellKnownSymbol = require('../internals/well-known-symbol');
var V8_VERSION = require('../internals/engine-v8-version');

var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');
var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';
var TypeError = global.TypeError;

// We can't use this feature detection in V8 since it causes
// deoptimization and serious performance degradation
// https://github.com/zloirock/core-js/issues/679
var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {
  var array = [];
  array[IS_CONCAT_SPREADABLE] = false;
  return array.concat()[0] !== array;
});

var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');

var isConcatSpreadable = function (O) {
  if (!isObject(O)) return false;
  var spreadable = O[IS_CONCAT_SPREADABLE];
  return spreadable !== undefined ? !!spreadable : isArray(O);
};

var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;

// `Array.prototype.concat` method
// https://tc39.es/ecma262/#sec-array.prototype.concat
// with adding support of @@isConcatSpreadable and @@species
$({ target: 'Array', proto: true, forced: FORCED }, {
  // eslint-disable-next-line no-unused-vars -- required for `.length`
  concat: function concat(arg) {
    var O = toObject(this);
    var A = arraySpeciesCreate(O, 0);
    var n = 0;
    var i, k, length, len, E;
    for (i = -1, length = arguments.length; i < length; i++) {
      E = i === -1 ? O : arguments[i];
      if (isConcatSpreadable(E)) {
        len = lengthOfArrayLike(E);
        if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
        for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);
      } else {
        if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
        createProperty(A, n++, E);
      }
    }
    A.length = n;
    return A;
  }
});

},{"../internals/array-method-has-species-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-has-species-support.js","../internals/array-species-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-species-create.js","../internals/create-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property.js","../internals/engine-v8-version":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-v8-version.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.every.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var $every = require('../internals/array-iteration').every;
var arrayMethodIsStrict = require('../internals/array-method-is-strict');

var STRICT_METHOD = arrayMethodIsStrict('every');

// `Array.prototype.every` method
// https://tc39.es/ecma262/#sec-array.prototype.every
$({ target: 'Array', proto: true, forced: !STRICT_METHOD }, {
  every: function every(callbackfn /* , thisArg */) {
    return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  }
});

},{"../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js","../internals/array-method-is-strict":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-is-strict.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.filter.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var $filter = require('../internals/array-iteration').filter;
var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');

var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');

// `Array.prototype.filter` method
// https://tc39.es/ecma262/#sec-array.prototype.filter
// with adding support of @@species
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
  filter: function filter(callbackfn /* , thisArg */) {
    return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  }
});

},{"../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js","../internals/array-method-has-species-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-has-species-support.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.find-index.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var $findIndex = require('../internals/array-iteration').findIndex;
var addToUnscopables = require('../internals/add-to-unscopables');

var FIND_INDEX = 'findIndex';
var SKIPS_HOLES = true;

// Shouldn't skip holes
if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });

// `Array.prototype.findIndex` method
// https://tc39.es/ecma262/#sec-array.prototype.findindex
$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {
  findIndex: function findIndex(callbackfn /* , that = undefined */) {
    return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  }
});

// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
addToUnscopables(FIND_INDEX);

},{"../internals/add-to-unscopables":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/add-to-unscopables.js","../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.find.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var $find = require('../internals/array-iteration').find;
var addToUnscopables = require('../internals/add-to-unscopables');

var FIND = 'find';
var SKIPS_HOLES = true;

// Shouldn't skip holes
if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });

// `Array.prototype.find` method
// https://tc39.es/ecma262/#sec-array.prototype.find
$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {
  find: function find(callbackfn /* , that = undefined */) {
    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  }
});

// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
addToUnscopables(FIND);

},{"../internals/add-to-unscopables":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/add-to-unscopables.js","../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.flat-map.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var flattenIntoArray = require('../internals/flatten-into-array');
var aCallable = require('../internals/a-callable');
var toObject = require('../internals/to-object');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var arraySpeciesCreate = require('../internals/array-species-create');

// `Array.prototype.flatMap` method
// https://tc39.es/ecma262/#sec-array.prototype.flatmap
$({ target: 'Array', proto: true }, {
  flatMap: function flatMap(callbackfn /* , thisArg */) {
    var O = toObject(this);
    var sourceLen = lengthOfArrayLike(O);
    var A;
    aCallable(callbackfn);
    A = arraySpeciesCreate(O, 0);
    A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
    return A;
  }
});

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/array-species-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-species-create.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/flatten-into-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/flatten-into-array.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.flat.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var flattenIntoArray = require('../internals/flatten-into-array');
var toObject = require('../internals/to-object');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
var arraySpeciesCreate = require('../internals/array-species-create');

// `Array.prototype.flat` method
// https://tc39.es/ecma262/#sec-array.prototype.flat
$({ target: 'Array', proto: true }, {
  flat: function flat(/* depthArg = 1 */) {
    var depthArg = arguments.length ? arguments[0] : undefined;
    var O = toObject(this);
    var sourceLen = lengthOfArrayLike(O);
    var A = arraySpeciesCreate(O, 0);
    A.length = flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toIntegerOrInfinity(depthArg));
    return A;
  }
});

},{"../internals/array-species-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-species-create.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/flatten-into-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/flatten-into-array.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-integer-or-infinity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-integer-or-infinity.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.for-each.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var forEach = require('../internals/array-for-each');

// `Array.prototype.forEach` method
// https://tc39.es/ecma262/#sec-array.prototype.foreach
// eslint-disable-next-line es-x/no-array-prototype-foreach -- safe
$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {
  forEach: forEach
});

},{"../internals/array-for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-for-each.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.from.js":[function(require,module,exports){
var $ = require('../internals/export');
var from = require('../internals/array-from');
var checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');

var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {
  // eslint-disable-next-line es-x/no-array-from -- required for testing
  Array.from(iterable);
});

// `Array.from` method
// https://tc39.es/ecma262/#sec-array.from
$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {
  from: from
});

},{"../internals/array-from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-from.js","../internals/check-correctness-of-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/check-correctness-of-iteration.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.includes.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var $includes = require('../internals/array-includes').includes;
var addToUnscopables = require('../internals/add-to-unscopables');

// `Array.prototype.includes` method
// https://tc39.es/ecma262/#sec-array.prototype.includes
$({ target: 'Array', proto: true }, {
  includes: function includes(el /* , fromIndex = 0 */) {
    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
  }
});

// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
addToUnscopables('includes');

},{"../internals/add-to-unscopables":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/add-to-unscopables.js","../internals/array-includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-includes.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.index-of.js":[function(require,module,exports){
'use strict';
/* eslint-disable es-x/no-array-prototype-indexof -- required for testing */
var $ = require('../internals/export');
var uncurryThis = require('../internals/function-uncurry-this');
var $IndexOf = require('../internals/array-includes').indexOf;
var arrayMethodIsStrict = require('../internals/array-method-is-strict');

var un$IndexOf = uncurryThis([].indexOf);

var NEGATIVE_ZERO = !!un$IndexOf && 1 / un$IndexOf([1], 1, -0) < 0;
var STRICT_METHOD = arrayMethodIsStrict('indexOf');

// `Array.prototype.indexOf` method
// https://tc39.es/ecma262/#sec-array.prototype.indexof
$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD }, {
  indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {
    var fromIndex = arguments.length > 1 ? arguments[1] : undefined;
    return NEGATIVE_ZERO
      // convert -0 to +0
      ? un$IndexOf(this, searchElement, fromIndex) || 0
      : $IndexOf(this, searchElement, fromIndex);
  }
});

},{"../internals/array-includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-includes.js","../internals/array-method-is-strict":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-is-strict.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.is-array.js":[function(require,module,exports){
var $ = require('../internals/export');
var isArray = require('../internals/is-array');

// `Array.isArray` method
// https://tc39.es/ecma262/#sec-array.isarray
$({ target: 'Array', stat: true }, {
  isArray: isArray
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.iterator.js":[function(require,module,exports){
'use strict';
var toIndexedObject = require('../internals/to-indexed-object');
var addToUnscopables = require('../internals/add-to-unscopables');
var Iterators = require('../internals/iterators');
var InternalStateModule = require('../internals/internal-state');
var defineProperty = require('../internals/object-define-property').f;
var defineIterator = require('../internals/define-iterator');
var IS_PURE = require('../internals/is-pure');
var DESCRIPTORS = require('../internals/descriptors');

var ARRAY_ITERATOR = 'Array Iterator';
var setInternalState = InternalStateModule.set;
var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);

// `Array.prototype.entries` method
// https://tc39.es/ecma262/#sec-array.prototype.entries
// `Array.prototype.keys` method
// https://tc39.es/ecma262/#sec-array.prototype.keys
// `Array.prototype.values` method
// https://tc39.es/ecma262/#sec-array.prototype.values
// `Array.prototype[@@iterator]` method
// https://tc39.es/ecma262/#sec-array.prototype-@@iterator
// `CreateArrayIterator` internal method
// https://tc39.es/ecma262/#sec-createarrayiterator
module.exports = defineIterator(Array, 'Array', function (iterated, kind) {
  setInternalState(this, {
    type: ARRAY_ITERATOR,
    target: toIndexedObject(iterated), // target
    index: 0,                          // next index
    kind: kind                         // kind
  });
// `%ArrayIteratorPrototype%.next` method
// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next
}, function () {
  var state = getInternalState(this);
  var target = state.target;
  var kind = state.kind;
  var index = state.index++;
  if (!target || index >= target.length) {
    state.target = undefined;
    return { value: undefined, done: true };
  }
  if (kind == 'keys') return { value: index, done: false };
  if (kind == 'values') return { value: target[index], done: false };
  return { value: [index, target[index]], done: false };
}, 'values');

// argumentsList[@@iterator] is %ArrayProto_values%
// https://tc39.es/ecma262/#sec-createunmappedargumentsobject
// https://tc39.es/ecma262/#sec-createmappedargumentsobject
var values = Iterators.Arguments = Iterators.Array;

// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
addToUnscopables('keys');
addToUnscopables('values');
addToUnscopables('entries');

// V8 ~ Chrome 45- bug
if (!IS_PURE && DESCRIPTORS && values.name !== 'values') try {
  defineProperty(values, 'name', { value: 'values' });
} catch (error) { /* empty */ }

},{"../internals/add-to-unscopables":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/add-to-unscopables.js","../internals/define-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-iterator.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-state.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js","../internals/iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterators.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.last-index-of.js":[function(require,module,exports){
var $ = require('../internals/export');
var lastIndexOf = require('../internals/array-last-index-of');

// `Array.prototype.lastIndexOf` method
// https://tc39.es/ecma262/#sec-array.prototype.lastindexof
// eslint-disable-next-line es-x/no-array-prototype-lastindexof -- required for testing
$({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {
  lastIndexOf: lastIndexOf
});

},{"../internals/array-last-index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-last-index-of.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.map.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var $map = require('../internals/array-iteration').map;
var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');

var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');

// `Array.prototype.map` method
// https://tc39.es/ecma262/#sec-array.prototype.map
// with adding support of @@species
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
  map: function map(callbackfn /* , thisArg */) {
    return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  }
});

},{"../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js","../internals/array-method-has-species-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-has-species-support.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.reduce.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var $reduce = require('../internals/array-reduce').left;
var arrayMethodIsStrict = require('../internals/array-method-is-strict');
var CHROME_VERSION = require('../internals/engine-v8-version');
var IS_NODE = require('../internals/engine-is-node');

var STRICT_METHOD = arrayMethodIsStrict('reduce');
// Chrome 80-82 has a critical bug
// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
var CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;

// `Array.prototype.reduce` method
// https://tc39.es/ecma262/#sec-array.prototype.reduce
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || CHROME_BUG }, {
  reduce: function reduce(callbackfn /* , initialValue */) {
    var length = arguments.length;
    return $reduce(this, callbackfn, length, length > 1 ? arguments[1] : undefined);
  }
});

},{"../internals/array-method-is-strict":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-is-strict.js","../internals/array-reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-reduce.js","../internals/engine-is-node":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-node.js","../internals/engine-v8-version":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-v8-version.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.reverse.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var uncurryThis = require('../internals/function-uncurry-this');
var isArray = require('../internals/is-array');

var un$Reverse = uncurryThis([].reverse);
var test = [1, 2];

// `Array.prototype.reverse` method
// https://tc39.es/ecma262/#sec-array.prototype.reverse
// fix for Safari 12.0 bug
// https://bugs.webkit.org/show_bug.cgi?id=188794
$({ target: 'Array', proto: true, forced: String(test) === String(test.reverse()) }, {
  reverse: function reverse() {
    // eslint-disable-next-line no-self-assign -- dirty hack
    if (isArray(this)) this.length = this.length;
    return un$Reverse(this);
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.slice.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var global = require('../internals/global');
var isArray = require('../internals/is-array');
var isConstructor = require('../internals/is-constructor');
var isObject = require('../internals/is-object');
var toAbsoluteIndex = require('../internals/to-absolute-index');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var toIndexedObject = require('../internals/to-indexed-object');
var createProperty = require('../internals/create-property');
var wellKnownSymbol = require('../internals/well-known-symbol');
var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
var un$Slice = require('../internals/array-slice');

var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');

var SPECIES = wellKnownSymbol('species');
var Array = global.Array;
var max = Math.max;

// `Array.prototype.slice` method
// https://tc39.es/ecma262/#sec-array.prototype.slice
// fallback for not array-like ES3 strings and DOM objects
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
  slice: function slice(start, end) {
    var O = toIndexedObject(this);
    var length = lengthOfArrayLike(O);
    var k = toAbsoluteIndex(start, length);
    var fin = toAbsoluteIndex(end === undefined ? length : end, length);
    // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible
    var Constructor, result, n;
    if (isArray(O)) {
      Constructor = O.constructor;
      // cross-realm fallback
      if (isConstructor(Constructor) && (Constructor === Array || isArray(Constructor.prototype))) {
        Constructor = undefined;
      } else if (isObject(Constructor)) {
        Constructor = Constructor[SPECIES];
        if (Constructor === null) Constructor = undefined;
      }
      if (Constructor === Array || Constructor === undefined) {
        return un$Slice(O, k, fin);
      }
    }
    result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));
    for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);
    result.length = n;
    return result;
  }
});

},{"../internals/array-method-has-species-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-has-species-support.js","../internals/array-slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice.js","../internals/create-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array.js","../internals/is-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-constructor.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-absolute-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-absolute-index.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.some.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var $some = require('../internals/array-iteration').some;
var arrayMethodIsStrict = require('../internals/array-method-is-strict');

var STRICT_METHOD = arrayMethodIsStrict('some');

// `Array.prototype.some` method
// https://tc39.es/ecma262/#sec-array.prototype.some
$({ target: 'Array', proto: true, forced: !STRICT_METHOD }, {
  some: function some(callbackfn /* , thisArg */) {
    return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  }
});

},{"../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js","../internals/array-method-is-strict":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-is-strict.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.sort.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var uncurryThis = require('../internals/function-uncurry-this');
var aCallable = require('../internals/a-callable');
var toObject = require('../internals/to-object');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var toString = require('../internals/to-string');
var fails = require('../internals/fails');
var internalSort = require('../internals/array-sort');
var arrayMethodIsStrict = require('../internals/array-method-is-strict');
var FF = require('../internals/engine-ff-version');
var IE_OR_EDGE = require('../internals/engine-is-ie-or-edge');
var V8 = require('../internals/engine-v8-version');
var WEBKIT = require('../internals/engine-webkit-version');

var test = [];
var un$Sort = uncurryThis(test.sort);
var push = uncurryThis(test.push);

// IE8-
var FAILS_ON_UNDEFINED = fails(function () {
  test.sort(undefined);
});
// V8 bug
var FAILS_ON_NULL = fails(function () {
  test.sort(null);
});
// Old WebKit
var STRICT_METHOD = arrayMethodIsStrict('sort');

var STABLE_SORT = !fails(function () {
  // feature detection can be too slow, so check engines versions
  if (V8) return V8 < 70;
  if (FF && FF > 3) return;
  if (IE_OR_EDGE) return true;
  if (WEBKIT) return WEBKIT < 603;

  var result = '';
  var code, chr, value, index;

  // generate an array with more 512 elements (Chakra and old V8 fails only in this case)
  for (code = 65; code < 76; code++) {
    chr = String.fromCharCode(code);

    switch (code) {
      case 66: case 69: case 70: case 72: value = 3; break;
      case 68: case 71: value = 4; break;
      default: value = 2;
    }

    for (index = 0; index < 47; index++) {
      test.push({ k: chr + index, v: value });
    }
  }

  test.sort(function (a, b) { return b.v - a.v; });

  for (index = 0; index < test.length; index++) {
    chr = test[index].k.charAt(0);
    if (result.charAt(result.length - 1) !== chr) result += chr;
  }

  return result !== 'DGBEFHACIJK';
});

var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT;

var getSortCompare = function (comparefn) {
  return function (x, y) {
    if (y === undefined) return -1;
    if (x === undefined) return 1;
    if (comparefn !== undefined) return +comparefn(x, y) || 0;
    return toString(x) > toString(y) ? 1 : -1;
  };
};

// `Array.prototype.sort` method
// https://tc39.es/ecma262/#sec-array.prototype.sort
$({ target: 'Array', proto: true, forced: FORCED }, {
  sort: function sort(comparefn) {
    if (comparefn !== undefined) aCallable(comparefn);

    var array = toObject(this);

    if (STABLE_SORT) return comparefn === undefined ? un$Sort(array) : un$Sort(array, comparefn);

    var items = [];
    var arrayLength = lengthOfArrayLike(array);
    var itemsLength, index;

    for (index = 0; index < arrayLength; index++) {
      if (index in array) push(items, array[index]);
    }

    internalSort(items, getSortCompare(comparefn));

    itemsLength = items.length;
    index = 0;

    while (index < itemsLength) array[index] = items[index++];
    while (index < arrayLength) delete array[index++];

    return array;
  }
});

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/array-method-is-strict":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-is-strict.js","../internals/array-sort":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-sort.js","../internals/engine-ff-version":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-ff-version.js","../internals/engine-is-ie-or-edge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-ie-or-edge.js","../internals/engine-v8-version":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-v8-version.js","../internals/engine-webkit-version":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-webkit-version.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.splice.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var global = require('../internals/global');
var toAbsoluteIndex = require('../internals/to-absolute-index');
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var toObject = require('../internals/to-object');
var arraySpeciesCreate = require('../internals/array-species-create');
var createProperty = require('../internals/create-property');
var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');

var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');

var TypeError = global.TypeError;
var max = Math.max;
var min = Math.min;
var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';

// `Array.prototype.splice` method
// https://tc39.es/ecma262/#sec-array.prototype.splice
// with adding support of @@species
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
  splice: function splice(start, deleteCount /* , ...items */) {
    var O = toObject(this);
    var len = lengthOfArrayLike(O);
    var actualStart = toAbsoluteIndex(start, len);
    var argumentsLength = arguments.length;
    var insertCount, actualDeleteCount, A, k, from, to;
    if (argumentsLength === 0) {
      insertCount = actualDeleteCount = 0;
    } else if (argumentsLength === 1) {
      insertCount = 0;
      actualDeleteCount = len - actualStart;
    } else {
      insertCount = argumentsLength - 2;
      actualDeleteCount = min(max(toIntegerOrInfinity(deleteCount), 0), len - actualStart);
    }
    if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {
      throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);
    }
    A = arraySpeciesCreate(O, actualDeleteCount);
    for (k = 0; k < actualDeleteCount; k++) {
      from = actualStart + k;
      if (from in O) createProperty(A, k, O[from]);
    }
    A.length = actualDeleteCount;
    if (insertCount < actualDeleteCount) {
      for (k = actualStart; k < len - actualDeleteCount; k++) {
        from = k + actualDeleteCount;
        to = k + insertCount;
        if (from in O) O[to] = O[from];
        else delete O[to];
      }
      for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];
    } else if (insertCount > actualDeleteCount) {
      for (k = len - actualDeleteCount; k > actualStart; k--) {
        from = k + actualDeleteCount - 1;
        to = k + insertCount - 1;
        if (from in O) O[to] = O[from];
        else delete O[to];
      }
    }
    for (k = 0; k < insertCount; k++) {
      O[k + actualStart] = arguments[k + 2];
    }
    O.length = len - actualDeleteCount + insertCount;
    return A;
  }
});

},{"../internals/array-method-has-species-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-has-species-support.js","../internals/array-species-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-species-create.js","../internals/create-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js","../internals/to-absolute-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-absolute-index.js","../internals/to-integer-or-infinity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-integer-or-infinity.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.unscopables.flat-map.js":[function(require,module,exports){
// this method was added to unscopables after implementation
// in popular engines, so it's moved to a separate module
var addToUnscopables = require('../internals/add-to-unscopables');

// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
addToUnscopables('flatMap');

},{"../internals/add-to-unscopables":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/add-to-unscopables.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.unscopables.flat.js":[function(require,module,exports){
// this method was added to unscopables after implementation
// in popular engines, so it's moved to a separate module
var addToUnscopables = require('../internals/add-to-unscopables');

// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
addToUnscopables('flat');

},{"../internals/add-to-unscopables":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/add-to-unscopables.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.date.now.js":[function(require,module,exports){
// TODO: Remove from `core-js@4`
var $ = require('../internals/export');
var global = require('../internals/global');
var uncurryThis = require('../internals/function-uncurry-this');

var Date = global.Date;
var getTime = uncurryThis(Date.prototype.getTime);

// `Date.now` method
// https://tc39.es/ecma262/#sec-date.now
$({ target: 'Date', stat: true }, {
  now: function now() {
    return getTime(new Date());
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.function.bind.js":[function(require,module,exports){
// TODO: Remove from `core-js@4`
var $ = require('../internals/export');
var bind = require('../internals/function-bind');

// `Function.prototype.bind` method
// https://tc39.es/ecma262/#sec-function.prototype.bind
$({ target: 'Function', proto: true, forced: Function.bind !== bind }, {
  bind: bind
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.json.stringify.js":[function(require,module,exports){
var $ = require('../internals/export');
var getBuiltIn = require('../internals/get-built-in');
var apply = require('../internals/function-apply');
var call = require('../internals/function-call');
var uncurryThis = require('../internals/function-uncurry-this');
var fails = require('../internals/fails');
var isArray = require('../internals/is-array');
var isCallable = require('../internals/is-callable');
var isObject = require('../internals/is-object');
var isSymbol = require('../internals/is-symbol');
var arraySlice = require('../internals/array-slice');
var NATIVE_SYMBOL = require('../internals/native-symbol');

var $stringify = getBuiltIn('JSON', 'stringify');
var exec = uncurryThis(/./.exec);
var charAt = uncurryThis(''.charAt);
var charCodeAt = uncurryThis(''.charCodeAt);
var replace = uncurryThis(''.replace);
var numberToString = uncurryThis(1.0.toString);

var tester = /[\uD800-\uDFFF]/g;
var low = /^[\uD800-\uDBFF]$/;
var hi = /^[\uDC00-\uDFFF]$/;

var WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () {
  var symbol = getBuiltIn('Symbol')();
  // MS Edge converts symbol values to JSON as {}
  return $stringify([symbol]) != '[null]'
    // WebKit converts symbol values to JSON as null
    || $stringify({ a: symbol }) != '{}'
    // V8 throws on boxed symbols
    || $stringify(Object(symbol)) != '{}';
});

// https://github.com/tc39/proposal-well-formed-stringify
var ILL_FORMED_UNICODE = fails(function () {
  return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"'
    || $stringify('\uDEAD') !== '"\\udead"';
});

var stringifyWithSymbolsFix = function (it, replacer) {
  var args = arraySlice(arguments);
  var $replacer = replacer;
  if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
  if (!isArray(replacer)) replacer = function (key, value) {
    if (isCallable($replacer)) value = call($replacer, this, key, value);
    if (!isSymbol(value)) return value;
  };
  args[1] = replacer;
  return apply($stringify, null, args);
};

var fixIllFormed = function (match, offset, string) {
  var prev = charAt(string, offset - 1);
  var next = charAt(string, offset + 1);
  if ((exec(low, match) && !exec(hi, next)) || (exec(hi, match) && !exec(low, prev))) {
    return '\\u' + numberToString(charCodeAt(match, 0), 16);
  } return match;
};

if ($stringify) {
  // `JSON.stringify` method
  // https://tc39.es/ecma262/#sec-json.stringify
  $({ target: 'JSON', stat: true, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE }, {
    // eslint-disable-next-line no-unused-vars -- required for `.length`
    stringify: function stringify(it, replacer, space) {
      var args = arraySlice(arguments);
      var result = apply(WRONG_SYMBOLS_CONVERSION ? stringifyWithSymbolsFix : $stringify, null, args);
      return ILL_FORMED_UNICODE && typeof result == 'string' ? replace(result, tester, fixIllFormed) : result;
    }
  });
}

},{"../internals/array-slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/function-apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-apply.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/is-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-symbol.js","../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.json.to-string-tag.js":[function(require,module,exports){
var global = require('../internals/global');
var setToStringTag = require('../internals/set-to-string-tag');

// JSON[@@toStringTag] property
// https://tc39.es/ecma262/#sec-json-@@tostringtag
setToStringTag(global.JSON, 'JSON', true);

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-to-string-tag.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.math.to-string-tag.js":[function(require,module,exports){
// empty

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.number.is-integer.js":[function(require,module,exports){
var $ = require('../internals/export');
var isIntegralNumber = require('../internals/is-integral-number');

// `Number.isInteger` method
// https://tc39.es/ecma262/#sec-number.isinteger
$({ target: 'Number', stat: true }, {
  isInteger: isIntegralNumber
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/is-integral-number":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-integral-number.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.assign.js":[function(require,module,exports){
var $ = require('../internals/export');
var assign = require('../internals/object-assign');

// `Object.assign` method
// https://tc39.es/ecma262/#sec-object.assign
// eslint-disable-next-line es-x/no-object-assign -- required for testing
$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {
  assign: assign
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/object-assign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-assign.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.create.js":[function(require,module,exports){
// TODO: Remove from `core-js@4`
var $ = require('../internals/export');
var DESCRIPTORS = require('../internals/descriptors');
var create = require('../internals/object-create');

// `Object.create` method
// https://tc39.es/ecma262/#sec-object.create
$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {
  create: create
});

},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-create.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.define-properties.js":[function(require,module,exports){
var $ = require('../internals/export');
var DESCRIPTORS = require('../internals/descriptors');
var defineProperties = require('../internals/object-define-properties').f;

// `Object.defineProperties` method
// https://tc39.es/ecma262/#sec-object.defineproperties
// eslint-disable-next-line es-x/no-object-defineproperties -- safe
$({ target: 'Object', stat: true, forced: Object.defineProperties !== defineProperties, sham: !DESCRIPTORS }, {
  defineProperties: defineProperties
});

},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/object-define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-properties.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.define-property.js":[function(require,module,exports){
var $ = require('../internals/export');
var DESCRIPTORS = require('../internals/descriptors');
var defineProperty = require('../internals/object-define-property').f;

// `Object.defineProperty` method
// https://tc39.es/ecma262/#sec-object.defineproperty
// eslint-disable-next-line es-x/no-object-defineproperty -- safe
$({ target: 'Object', stat: true, forced: Object.defineProperty !== defineProperty, sham: !DESCRIPTORS }, {
  defineProperty: defineProperty
});

},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.entries.js":[function(require,module,exports){
var $ = require('../internals/export');
var $entries = require('../internals/object-to-array').entries;

// `Object.entries` method
// https://tc39.es/ecma262/#sec-object.entries
$({ target: 'Object', stat: true }, {
  entries: function entries(O) {
    return $entries(O);
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/object-to-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-to-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.freeze.js":[function(require,module,exports){
var $ = require('../internals/export');
var FREEZING = require('../internals/freezing');
var fails = require('../internals/fails');
var isObject = require('../internals/is-object');
var onFreeze = require('../internals/internal-metadata').onFreeze;

// eslint-disable-next-line es-x/no-object-freeze -- safe
var $freeze = Object.freeze;
var FAILS_ON_PRIMITIVES = fails(function () { $freeze(1); });

// `Object.freeze` method
// https://tc39.es/ecma262/#sec-object.freeze
$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {
  freeze: function freeze(it) {
    return $freeze && isObject(it) ? $freeze(onFreeze(it)) : it;
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/freezing":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/freezing.js","../internals/internal-metadata":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-metadata.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.get-own-property-descriptor.js":[function(require,module,exports){
var $ = require('../internals/export');
var fails = require('../internals/fails');
var toIndexedObject = require('../internals/to-indexed-object');
var nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
var DESCRIPTORS = require('../internals/descriptors');

var FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });
var FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;

// `Object.getOwnPropertyDescriptor` method
// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {
  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {
    return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);
  }
});

},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.get-own-property-descriptors.js":[function(require,module,exports){
var $ = require('../internals/export');
var DESCRIPTORS = require('../internals/descriptors');
var ownKeys = require('../internals/own-keys');
var toIndexedObject = require('../internals/to-indexed-object');
var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');
var createProperty = require('../internals/create-property');

// `Object.getOwnPropertyDescriptors` method
// https://tc39.es/ecma262/#sec-object.getownpropertydescriptors
$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {
  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
    var O = toIndexedObject(object);
    var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
    var keys = ownKeys(O);
    var result = {};
    var index = 0;
    var key, descriptor;
    while (keys.length > index) {
      descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);
      if (descriptor !== undefined) createProperty(result, key, descriptor);
    }
    return result;
  }
});

},{"../internals/create-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js","../internals/own-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/own-keys.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.get-own-property-symbols.js":[function(require,module,exports){
var $ = require('../internals/export');
var NATIVE_SYMBOL = require('../internals/native-symbol');
var fails = require('../internals/fails');
var getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');
var toObject = require('../internals/to-object');

// V8 ~ Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
// https://bugs.chromium.org/p/v8/issues/detail?id=3443
var FORCED = !NATIVE_SYMBOL || fails(function () { getOwnPropertySymbolsModule.f(1); });

// `Object.getOwnPropertySymbols` method
// https://tc39.es/ecma262/#sec-object.getownpropertysymbols
$({ target: 'Object', stat: true, forced: FORCED }, {
  getOwnPropertySymbols: function getOwnPropertySymbols(it) {
    var $getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
    return $getOwnPropertySymbols ? $getOwnPropertySymbols(toObject(it)) : [];
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol.js","../internals/object-get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-symbols.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.get-prototype-of.js":[function(require,module,exports){
var $ = require('../internals/export');
var fails = require('../internals/fails');
var toObject = require('../internals/to-object');
var nativeGetPrototypeOf = require('../internals/object-get-prototype-of');
var CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');

var FAILS_ON_PRIMITIVES = fails(function () { nativeGetPrototypeOf(1); });

// `Object.getPrototypeOf` method
// https://tc39.es/ecma262/#sec-object.getprototypeof
$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PROTOTYPE_GETTER }, {
  getPrototypeOf: function getPrototypeOf(it) {
    return nativeGetPrototypeOf(toObject(it));
  }
});


},{"../internals/correct-prototype-getter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/correct-prototype-getter.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/object-get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-prototype-of.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.is.js":[function(require,module,exports){
var $ = require('../internals/export');
var is = require('../internals/same-value');

// `Object.is` method
// https://tc39.es/ecma262/#sec-object.is
$({ target: 'Object', stat: true }, {
  is: is
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/same-value":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/same-value.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.keys.js":[function(require,module,exports){
var $ = require('../internals/export');
var toObject = require('../internals/to-object');
var nativeKeys = require('../internals/object-keys');
var fails = require('../internals/fails');

var FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });

// `Object.keys` method
// https://tc39.es/ecma262/#sec-object.keys
$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
  keys: function keys(it) {
    return nativeKeys(toObject(it));
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-keys.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.set-prototype-of.js":[function(require,module,exports){
var $ = require('../internals/export');
var setPrototypeOf = require('../internals/object-set-prototype-of');

// `Object.setPrototypeOf` method
// https://tc39.es/ecma262/#sec-object.setprototypeof
$({ target: 'Object', stat: true }, {
  setPrototypeOf: setPrototypeOf
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/object-set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-set-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.to-string.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.math.to-string-tag.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.values.js":[function(require,module,exports){
var $ = require('../internals/export');
var $values = require('../internals/object-to-array').values;

// `Object.values` method
// https://tc39.es/ecma262/#sec-object.values
$({ target: 'Object', stat: true }, {
  values: function values(O) {
    return $values(O);
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/object-to-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-to-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.parse-float.js":[function(require,module,exports){
var $ = require('../internals/export');
var $parseFloat = require('../internals/number-parse-float');

// `parseFloat` method
// https://tc39.es/ecma262/#sec-parsefloat-string
$({ global: true, forced: parseFloat != $parseFloat }, {
  parseFloat: $parseFloat
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/number-parse-float":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/number-parse-float.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.parse-int.js":[function(require,module,exports){
var $ = require('../internals/export');
var $parseInt = require('../internals/number-parse-int');

// `parseInt` method
// https://tc39.es/ecma262/#sec-parseint-string-radix
$({ global: true, forced: parseInt != $parseInt }, {
  parseInt: $parseInt
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/number-parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/number-parse-int.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.all-settled.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var call = require('../internals/function-call');
var aCallable = require('../internals/a-callable');
var newPromiseCapabilityModule = require('../internals/new-promise-capability');
var perform = require('../internals/perform');
var iterate = require('../internals/iterate');

// `Promise.allSettled` method
// https://tc39.es/ecma262/#sec-promise.allsettled
$({ target: 'Promise', stat: true }, {
  allSettled: function allSettled(iterable) {
    var C = this;
    var capability = newPromiseCapabilityModule.f(C);
    var resolve = capability.resolve;
    var reject = capability.reject;
    var result = perform(function () {
      var promiseResolve = aCallable(C.resolve);
      var values = [];
      var counter = 0;
      var remaining = 1;
      iterate(iterable, function (promise) {
        var index = counter++;
        var alreadyCalled = false;
        remaining++;
        call(promiseResolve, C, promise).then(function (value) {
          if (alreadyCalled) return;
          alreadyCalled = true;
          values[index] = { status: 'fulfilled', value: value };
          --remaining || resolve(values);
        }, function (error) {
          if (alreadyCalled) return;
          alreadyCalled = true;
          values[index] = { status: 'rejected', reason: error };
          --remaining || resolve(values);
        });
      });
      --remaining || resolve(values);
    });
    if (result.error) reject(result.value);
    return capability.promise;
  }
});

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterate.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/new-promise-capability.js","../internals/perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/perform.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.all.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var call = require('../internals/function-call');
var aCallable = require('../internals/a-callable');
var newPromiseCapabilityModule = require('../internals/new-promise-capability');
var perform = require('../internals/perform');
var iterate = require('../internals/iterate');
var PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');

// `Promise.all` method
// https://tc39.es/ecma262/#sec-promise.all
$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {
  all: function all(iterable) {
    var C = this;
    var capability = newPromiseCapabilityModule.f(C);
    var resolve = capability.resolve;
    var reject = capability.reject;
    var result = perform(function () {
      var $promiseResolve = aCallable(C.resolve);
      var values = [];
      var counter = 0;
      var remaining = 1;
      iterate(iterable, function (promise) {
        var index = counter++;
        var alreadyCalled = false;
        remaining++;
        call($promiseResolve, C, promise).then(function (value) {
          if (alreadyCalled) return;
          alreadyCalled = true;
          values[index] = value;
          --remaining || resolve(values);
        }, reject);
      });
      --remaining || resolve(values);
    });
    if (result.error) reject(result.value);
    return capability.promise;
  }
});

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterate.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/new-promise-capability.js","../internals/perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/perform.js","../internals/promise-statics-incorrect-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-statics-incorrect-iteration.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.any.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var call = require('../internals/function-call');
var aCallable = require('../internals/a-callable');
var getBuiltIn = require('../internals/get-built-in');
var newPromiseCapabilityModule = require('../internals/new-promise-capability');
var perform = require('../internals/perform');
var iterate = require('../internals/iterate');

var PROMISE_ANY_ERROR = 'No one promise resolved';

// `Promise.any` method
// https://tc39.es/ecma262/#sec-promise.any
$({ target: 'Promise', stat: true }, {
  any: function any(iterable) {
    var C = this;
    var AggregateError = getBuiltIn('AggregateError');
    var capability = newPromiseCapabilityModule.f(C);
    var resolve = capability.resolve;
    var reject = capability.reject;
    var result = perform(function () {
      var promiseResolve = aCallable(C.resolve);
      var errors = [];
      var counter = 0;
      var remaining = 1;
      var alreadyResolved = false;
      iterate(iterable, function (promise) {
        var index = counter++;
        var alreadyRejected = false;
        remaining++;
        call(promiseResolve, C, promise).then(function (value) {
          if (alreadyRejected || alreadyResolved) return;
          alreadyResolved = true;
          resolve(value);
        }, function (error) {
          if (alreadyRejected || alreadyResolved) return;
          alreadyRejected = true;
          errors[index] = error;
          --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR));
        });
      });
      --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR));
    });
    if (result.error) reject(result.value);
    return capability.promise;
  }
});

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterate.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/new-promise-capability.js","../internals/perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/perform.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.catch.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var IS_PURE = require('../internals/is-pure');
var FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;
var NativePromiseConstructor = require('../internals/promise-native-constructor');
var getBuiltIn = require('../internals/get-built-in');
var isCallable = require('../internals/is-callable');
var redefine = require('../internals/redefine');

var NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;

// `Promise.prototype.catch` method
// https://tc39.es/ecma262/#sec-promise.prototype.catch
$({ target: 'Promise', proto: true, forced: FORCED_PROMISE_CONSTRUCTOR, real: true }, {
  'catch': function (onRejected) {
    return this.then(undefined, onRejected);
  }
});

// makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`
if (!IS_PURE && isCallable(NativePromiseConstructor)) {
  var method = getBuiltIn('Promise').prototype['catch'];
  if (NativePromisePrototype['catch'] !== method) {
    redefine(NativePromisePrototype, 'catch', method, { unsafe: true });
  }
}

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js","../internals/promise-constructor-detection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-constructor-detection.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-native-constructor.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.constructor.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var IS_PURE = require('../internals/is-pure');
var IS_NODE = require('../internals/engine-is-node');
var global = require('../internals/global');
var call = require('../internals/function-call');
var redefine = require('../internals/redefine');
var redefineAll = require('../internals/redefine-all');
var setPrototypeOf = require('../internals/object-set-prototype-of');
var setToStringTag = require('../internals/set-to-string-tag');
var setSpecies = require('../internals/set-species');
var aCallable = require('../internals/a-callable');
var isCallable = require('../internals/is-callable');
var isObject = require('../internals/is-object');
var anInstance = require('../internals/an-instance');
var speciesConstructor = require('../internals/species-constructor');
var task = require('../internals/task').set;
var microtask = require('../internals/microtask');
var hostReportErrors = require('../internals/host-report-errors');
var perform = require('../internals/perform');
var Queue = require('../internals/queue');
var InternalStateModule = require('../internals/internal-state');
var NativePromiseConstructor = require('../internals/promise-native-constructor');
var PromiseConstructorDetection = require('../internals/promise-constructor-detection');
var newPromiseCapabilityModule = require('../internals/new-promise-capability');

var PROMISE = 'Promise';
var FORCED_PROMISE_CONSTRUCTOR = PromiseConstructorDetection.CONSTRUCTOR;
var NATIVE_PROMISE_REJECTION_EVENT = PromiseConstructorDetection.REJECTION_EVENT;
var NATIVE_PROMISE_SUBCLASSING = PromiseConstructorDetection.SUBCLASSING;
var getInternalPromiseState = InternalStateModule.getterFor(PROMISE);
var setInternalState = InternalStateModule.set;
var NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;
var PromiseConstructor = NativePromiseConstructor;
var PromisePrototype = NativePromisePrototype;
var TypeError = global.TypeError;
var document = global.document;
var process = global.process;
var newPromiseCapability = newPromiseCapabilityModule.f;
var newGenericPromiseCapability = newPromiseCapability;

var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);
var UNHANDLED_REJECTION = 'unhandledrejection';
var REJECTION_HANDLED = 'rejectionhandled';
var PENDING = 0;
var FULFILLED = 1;
var REJECTED = 2;
var HANDLED = 1;
var UNHANDLED = 2;

var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;

// helpers
var isThenable = function (it) {
  var then;
  return isObject(it) && isCallable(then = it.then) ? then : false;
};

var callReaction = function (reaction, state) {
  var value = state.value;
  var ok = state.state == FULFILLED;
  var handler = ok ? reaction.ok : reaction.fail;
  var resolve = reaction.resolve;
  var reject = reaction.reject;
  var domain = reaction.domain;
  var result, then, exited;
  try {
    if (handler) {
      if (!ok) {
        if (state.rejection === UNHANDLED) onHandleUnhandled(state);
        state.rejection = HANDLED;
      }
      if (handler === true) result = value;
      else {
        if (domain) domain.enter();
        result = handler(value); // can throw
        if (domain) {
          domain.exit();
          exited = true;
        }
      }
      if (result === reaction.promise) {
        reject(TypeError('Promise-chain cycle'));
      } else if (then = isThenable(result)) {
        call(then, result, resolve, reject);
      } else resolve(result);
    } else reject(value);
  } catch (error) {
    if (domain && !exited) domain.exit();
    reject(error);
  }
};

var notify = function (state, isReject) {
  if (state.notified) return;
  state.notified = true;
  microtask(function () {
    var reactions = state.reactions;
    var reaction;
    while (reaction = reactions.get()) {
      callReaction(reaction, state);
    }
    state.notified = false;
    if (isReject && !state.rejection) onUnhandled(state);
  });
};

var dispatchEvent = function (name, promise, reason) {
  var event, handler;
  if (DISPATCH_EVENT) {
    event = document.createEvent('Event');
    event.promise = promise;
    event.reason = reason;
    event.initEvent(name, false, true);
    global.dispatchEvent(event);
  } else event = { promise: promise, reason: reason };
  if (!NATIVE_PROMISE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);
  else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);
};

var onUnhandled = function (state) {
  call(task, global, function () {
    var promise = state.facade;
    var value = state.value;
    var IS_UNHANDLED = isUnhandled(state);
    var result;
    if (IS_UNHANDLED) {
      result = perform(function () {
        if (IS_NODE) {
          process.emit('unhandledRejection', value, promise);
        } else dispatchEvent(UNHANDLED_REJECTION, promise, value);
      });
      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
      state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;
      if (result.error) throw result.value;
    }
  });
};

var isUnhandled = function (state) {
  return state.rejection !== HANDLED && !state.parent;
};

var onHandleUnhandled = function (state) {
  call(task, global, function () {
    var promise = state.facade;
    if (IS_NODE) {
      process.emit('rejectionHandled', promise);
    } else dispatchEvent(REJECTION_HANDLED, promise, state.value);
  });
};

var bind = function (fn, state, unwrap) {
  return function (value) {
    fn(state, value, unwrap);
  };
};

var internalReject = function (state, value, unwrap) {
  if (state.done) return;
  state.done = true;
  if (unwrap) state = unwrap;
  state.value = value;
  state.state = REJECTED;
  notify(state, true);
};

var internalResolve = function (state, value, unwrap) {
  if (state.done) return;
  state.done = true;
  if (unwrap) state = unwrap;
  try {
    if (state.facade === value) throw TypeError("Promise can't be resolved itself");
    var then = isThenable(value);
    if (then) {
      microtask(function () {
        var wrapper = { done: false };
        try {
          call(then, value,
            bind(internalResolve, wrapper, state),
            bind(internalReject, wrapper, state)
          );
        } catch (error) {
          internalReject(wrapper, error, state);
        }
      });
    } else {
      state.value = value;
      state.state = FULFILLED;
      notify(state, false);
    }
  } catch (error) {
    internalReject({ done: false }, error, state);
  }
};

// constructor polyfill
if (FORCED_PROMISE_CONSTRUCTOR) {
  // 25.4.3.1 Promise(executor)
  PromiseConstructor = function Promise(executor) {
    anInstance(this, PromisePrototype);
    aCallable(executor);
    call(Internal, this);
    var state = getInternalPromiseState(this);
    try {
      executor(bind(internalResolve, state), bind(internalReject, state));
    } catch (error) {
      internalReject(state, error);
    }
  };

  PromisePrototype = PromiseConstructor.prototype;

  // eslint-disable-next-line no-unused-vars -- required for `.length`
  Internal = function Promise(executor) {
    setInternalState(this, {
      type: PROMISE,
      done: false,
      notified: false,
      parent: false,
      reactions: new Queue(),
      rejection: false,
      state: PENDING,
      value: undefined
    });
  };

  Internal.prototype = redefineAll(PromisePrototype, {
    // `Promise.prototype.then` method
    // https://tc39.es/ecma262/#sec-promise.prototype.then
    // eslint-disable-next-line unicorn/no-thenable -- safe
    then: function then(onFulfilled, onRejected) {
      var state = getInternalPromiseState(this);
      var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));
      state.parent = true;
      reaction.ok = isCallable(onFulfilled) ? onFulfilled : true;
      reaction.fail = isCallable(onRejected) && onRejected;
      reaction.domain = IS_NODE ? process.domain : undefined;
      if (state.state == PENDING) state.reactions.add(reaction);
      else microtask(function () {
        callReaction(reaction, state);
      });
      return reaction.promise;
    }
  });

  OwnPromiseCapability = function () {
    var promise = new Internal();
    var state = getInternalPromiseState(promise);
    this.promise = promise;
    this.resolve = bind(internalResolve, state);
    this.reject = bind(internalReject, state);
  };

  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {
    return C === PromiseConstructor || C === PromiseWrapper
      ? new OwnPromiseCapability(C)
      : newGenericPromiseCapability(C);
  };

  if (!IS_PURE && isCallable(NativePromiseConstructor) && NativePromisePrototype !== Object.prototype) {
    nativeThen = NativePromisePrototype.then;

    if (!NATIVE_PROMISE_SUBCLASSING) {
      // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs
      redefine(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {
        var that = this;
        return new PromiseConstructor(function (resolve, reject) {
          call(nativeThen, that, resolve, reject);
        }).then(onFulfilled, onRejected);
      // https://github.com/zloirock/core-js/issues/640
      }, { unsafe: true });
    }

    // make `.constructor === Promise` work for native promise-based APIs
    try {
      delete NativePromisePrototype.constructor;
    } catch (error) { /* empty */ }

    // make `instanceof Promise` work for native promise-based APIs
    if (setPrototypeOf) {
      setPrototypeOf(NativePromisePrototype, PromisePrototype);
    }
  }
}

$({ global: true, wrap: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {
  Promise: PromiseConstructor
});

setToStringTag(PromiseConstructor, PROMISE, false, true);
setSpecies(PROMISE);

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/an-instance":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-instance.js","../internals/engine-is-node":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-node.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/host-report-errors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/host-report-errors.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-state.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js","../internals/microtask":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/microtask.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/new-promise-capability.js","../internals/object-set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-set-prototype-of.js","../internals/perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/perform.js","../internals/promise-constructor-detection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-constructor-detection.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-native-constructor.js","../internals/queue":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/queue.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine.js","../internals/redefine-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine-all.js","../internals/set-species":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-species.js","../internals/set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-to-string-tag.js","../internals/species-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/species-constructor.js","../internals/task":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/task.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.finally.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var IS_PURE = require('../internals/is-pure');
var NativePromiseConstructor = require('../internals/promise-native-constructor');
var fails = require('../internals/fails');
var getBuiltIn = require('../internals/get-built-in');
var isCallable = require('../internals/is-callable');
var speciesConstructor = require('../internals/species-constructor');
var promiseResolve = require('../internals/promise-resolve');
var redefine = require('../internals/redefine');

var NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;

// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829
var NON_GENERIC = !!NativePromiseConstructor && fails(function () {
  // eslint-disable-next-line unicorn/no-thenable -- required for testing
  NativePromisePrototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });
});

// `Promise.prototype.finally` method
// https://tc39.es/ecma262/#sec-promise.prototype.finally
$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {
  'finally': function (onFinally) {
    var C = speciesConstructor(this, getBuiltIn('Promise'));
    var isFunction = isCallable(onFinally);
    return this.then(
      isFunction ? function (x) {
        return promiseResolve(C, onFinally()).then(function () { return x; });
      } : onFinally,
      isFunction ? function (e) {
        return promiseResolve(C, onFinally()).then(function () { throw e; });
      } : onFinally
    );
  }
});

// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then`
if (!IS_PURE && isCallable(NativePromiseConstructor)) {
  var method = getBuiltIn('Promise').prototype['finally'];
  if (NativePromisePrototype['finally'] !== method) {
    redefine(NativePromisePrototype, 'finally', method, { unsafe: true });
  }
}

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-native-constructor.js","../internals/promise-resolve":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-resolve.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine.js","../internals/species-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/species-constructor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.js":[function(require,module,exports){
// TODO: Remove this module from `core-js@4` since it's split to modules listed below
require('../modules/es.promise.constructor');
require('../modules/es.promise.all');
require('../modules/es.promise.catch');
require('../modules/es.promise.race');
require('../modules/es.promise.reject');
require('../modules/es.promise.resolve');

},{"../modules/es.promise.all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.all.js","../modules/es.promise.catch":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.catch.js","../modules/es.promise.constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.constructor.js","../modules/es.promise.race":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.race.js","../modules/es.promise.reject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.reject.js","../modules/es.promise.resolve":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.resolve.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.race.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var call = require('../internals/function-call');
var aCallable = require('../internals/a-callable');
var newPromiseCapabilityModule = require('../internals/new-promise-capability');
var perform = require('../internals/perform');
var iterate = require('../internals/iterate');
var PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');

// `Promise.race` method
// https://tc39.es/ecma262/#sec-promise.race
$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {
  race: function race(iterable) {
    var C = this;
    var capability = newPromiseCapabilityModule.f(C);
    var reject = capability.reject;
    var result = perform(function () {
      var $promiseResolve = aCallable(C.resolve);
      iterate(iterable, function (promise) {
        call($promiseResolve, C, promise).then(capability.resolve, reject);
      });
    });
    if (result.error) reject(result.value);
    return capability.promise;
  }
});

},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterate.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/new-promise-capability.js","../internals/perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/perform.js","../internals/promise-statics-incorrect-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-statics-incorrect-iteration.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.reject.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var call = require('../internals/function-call');
var newPromiseCapabilityModule = require('../internals/new-promise-capability');
var FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;

// `Promise.reject` method
// https://tc39.es/ecma262/#sec-promise.reject
$({ target: 'Promise', stat: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {
  reject: function reject(r) {
    var capability = newPromiseCapabilityModule.f(this);
    call(capability.reject, undefined, r);
    return capability.promise;
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/new-promise-capability.js","../internals/promise-constructor-detection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-constructor-detection.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.resolve.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var getBuiltIn = require('../internals/get-built-in');
var IS_PURE = require('../internals/is-pure');
var NativePromiseConstructor = require('../internals/promise-native-constructor');
var FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;
var promiseResolve = require('../internals/promise-resolve');

var PromiseConstructorWrapper = getBuiltIn('Promise');
var CHECK_WRAPPER = IS_PURE && !FORCED_PROMISE_CONSTRUCTOR;

// `Promise.resolve` method
// https://tc39.es/ecma262/#sec-promise.resolve
$({ target: 'Promise', stat: true, forced: IS_PURE || FORCED_PROMISE_CONSTRUCTOR }, {
  resolve: function resolve(x) {
    return promiseResolve(CHECK_WRAPPER && this === PromiseConstructorWrapper ? NativePromiseConstructor : this, x);
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js","../internals/promise-constructor-detection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-constructor-detection.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-native-constructor.js","../internals/promise-resolve":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-resolve.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.reflect.construct.js":[function(require,module,exports){
var $ = require('../internals/export');
var getBuiltIn = require('../internals/get-built-in');
var apply = require('../internals/function-apply');
var bind = require('../internals/function-bind');
var aConstructor = require('../internals/a-constructor');
var anObject = require('../internals/an-object');
var isObject = require('../internals/is-object');
var create = require('../internals/object-create');
var fails = require('../internals/fails');

var nativeConstruct = getBuiltIn('Reflect', 'construct');
var ObjectPrototype = Object.prototype;
var push = [].push;

// `Reflect.construct` method
// https://tc39.es/ecma262/#sec-reflect.construct
// MS Edge supports only 2 arguments and argumentsList argument is optional
// FF Nightly sets third argument as `new.target`, but does not create `this` from it
var NEW_TARGET_BUG = fails(function () {
  function F() { /* empty */ }
  return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F);
});

var ARGS_BUG = !fails(function () {
  nativeConstruct(function () { /* empty */ });
});

var FORCED = NEW_TARGET_BUG || ARGS_BUG;

$({ target: 'Reflect', stat: true, forced: FORCED, sham: FORCED }, {
  construct: function construct(Target, args /* , newTarget */) {
    aConstructor(Target);
    anObject(args);
    var newTarget = arguments.length < 3 ? Target : aConstructor(arguments[2]);
    if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);
    if (Target == newTarget) {
      // w/o altered newTarget, optimization for 0-4 arguments
      switch (args.length) {
        case 0: return new Target();
        case 1: return new Target(args[0]);
        case 2: return new Target(args[0], args[1]);
        case 3: return new Target(args[0], args[1], args[2]);
        case 4: return new Target(args[0], args[1], args[2], args[3]);
      }
      // w/o altered newTarget, lot of arguments case
      var $args = [null];
      apply(push, $args, args);
      return new (apply(bind, Target, $args))();
    }
    // with altered newTarget, not support built-in constructors
    var proto = newTarget.prototype;
    var instance = create(isObject(proto) ? proto : ObjectPrototype);
    var result = apply(Target, instance, args);
    return isObject(result) ? result : instance;
  }
});

},{"../internals/a-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-constructor.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/function-apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-apply.js","../internals/function-bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-create.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.reflect.get.js":[function(require,module,exports){
var $ = require('../internals/export');
var call = require('../internals/function-call');
var isObject = require('../internals/is-object');
var anObject = require('../internals/an-object');
var isDataDescriptor = require('../internals/is-data-descriptor');
var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');
var getPrototypeOf = require('../internals/object-get-prototype-of');

// `Reflect.get` method
// https://tc39.es/ecma262/#sec-reflect.get
function get(target, propertyKey /* , receiver */) {
  var receiver = arguments.length < 3 ? target : arguments[2];
  var descriptor, prototype;
  if (anObject(target) === receiver) return target[propertyKey];
  descriptor = getOwnPropertyDescriptorModule.f(target, propertyKey);
  if (descriptor) return isDataDescriptor(descriptor)
    ? descriptor.value
    : descriptor.get === undefined ? undefined : call(descriptor.get, receiver);
  if (isObject(prototype = getPrototypeOf(target))) return get(prototype, propertyKey, receiver);
}

$({ target: 'Reflect', stat: true }, {
  get: get
});

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/is-data-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-data-descriptor.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js","../internals/object-get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.reflect.to-string-tag.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.math.to-string-tag.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.regexp.exec.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.math.to-string-tag.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.set.constructor.js":[function(require,module,exports){
'use strict';
var collection = require('../internals/collection');
var collectionStrong = require('../internals/collection-strong');

// `Set` constructor
// https://tc39.es/ecma262/#sec-set-objects
collection('Set', function (init) {
  return function Set() { return init(this, arguments.length ? arguments[0] : undefined); };
}, collectionStrong);

},{"../internals/collection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection.js","../internals/collection-strong":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection-strong.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.set.js":[function(require,module,exports){
// TODO: Remove this module from `core-js@4` since it's replaced to module below
require('../modules/es.set.constructor');

},{"../modules/es.set.constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.set.constructor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.includes.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var uncurryThis = require('../internals/function-uncurry-this');
var notARegExp = require('../internals/not-a-regexp');
var requireObjectCoercible = require('../internals/require-object-coercible');
var toString = require('../internals/to-string');
var correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');

var stringIndexOf = uncurryThis(''.indexOf);

// `String.prototype.includes` method
// https://tc39.es/ecma262/#sec-string.prototype.includes
$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {
  includes: function includes(searchString /* , position = 0 */) {
    return !!~stringIndexOf(
      toString(requireObjectCoercible(this)),
      toString(notARegExp(searchString)),
      arguments.length > 1 ? arguments[1] : undefined
    );
  }
});

},{"../internals/correct-is-regexp-logic":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/correct-is-regexp-logic.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/not-a-regexp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/not-a-regexp.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/require-object-coercible.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.iterator.js":[function(require,module,exports){
'use strict';
var charAt = require('../internals/string-multibyte').charAt;
var toString = require('../internals/to-string');
var InternalStateModule = require('../internals/internal-state');
var defineIterator = require('../internals/define-iterator');

var STRING_ITERATOR = 'String Iterator';
var setInternalState = InternalStateModule.set;
var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);

// `String.prototype[@@iterator]` method
// https://tc39.es/ecma262/#sec-string.prototype-@@iterator
defineIterator(String, 'String', function (iterated) {
  setInternalState(this, {
    type: STRING_ITERATOR,
    string: toString(iterated),
    index: 0
  });
// `%StringIteratorPrototype%.next` method
// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next
}, function next() {
  var state = getInternalState(this);
  var string = state.string;
  var index = state.index;
  var point;
  if (index >= string.length) return { value: undefined, done: true };
  point = charAt(string, index);
  state.index += point.length;
  return { value: point, done: false };
});

},{"../internals/define-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-iterator.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-state.js","../internals/string-multibyte":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-multibyte.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.pad-end.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var $padEnd = require('../internals/string-pad').end;
var WEBKIT_BUG = require('../internals/string-pad-webkit-bug');

// `String.prototype.padEnd` method
// https://tc39.es/ecma262/#sec-string.prototype.padend
$({ target: 'String', proto: true, forced: WEBKIT_BUG }, {
  padEnd: function padEnd(maxLength /* , fillString = ' ' */) {
    return $padEnd(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/string-pad":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-pad.js","../internals/string-pad-webkit-bug":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-pad-webkit-bug.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.pad-start.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var $padStart = require('../internals/string-pad').start;
var WEBKIT_BUG = require('../internals/string-pad-webkit-bug');

// `String.prototype.padStart` method
// https://tc39.es/ecma262/#sec-string.prototype.padstart
$({ target: 'String', proto: true, forced: WEBKIT_BUG }, {
  padStart: function padStart(maxLength /* , fillString = ' ' */) {
    return $padStart(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/string-pad":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-pad.js","../internals/string-pad-webkit-bug":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-pad-webkit-bug.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.replace.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.math.to-string-tag.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.starts-with.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var uncurryThis = require('../internals/function-uncurry-this');
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
var toLength = require('../internals/to-length');
var toString = require('../internals/to-string');
var notARegExp = require('../internals/not-a-regexp');
var requireObjectCoercible = require('../internals/require-object-coercible');
var correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');
var IS_PURE = require('../internals/is-pure');

// eslint-disable-next-line es-x/no-string-prototype-startswith -- safe
var un$StartsWith = uncurryThis(''.startsWith);
var stringSlice = uncurryThis(''.slice);
var min = Math.min;

var CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');
// https://github.com/zloirock/core-js/pull/702
var MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {
  var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');
  return descriptor && !descriptor.writable;
}();

// `String.prototype.startsWith` method
// https://tc39.es/ecma262/#sec-string.prototype.startswith
$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {
  startsWith: function startsWith(searchString /* , position = 0 */) {
    var that = toString(requireObjectCoercible(this));
    notARegExp(searchString);
    var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));
    var search = toString(searchString);
    return un$StartsWith
      ? un$StartsWith(that, search, index)
      : stringSlice(that, index, index + search.length) === search;
  }
});

},{"../internals/correct-is-regexp-logic":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/correct-is-regexp-logic.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js","../internals/not-a-regexp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/not-a-regexp.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/require-object-coercible.js","../internals/to-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-length.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.trim.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var $trim = require('../internals/string-trim').trim;
var forcedStringTrimMethod = require('../internals/string-trim-forced');

// `String.prototype.trim` method
// https://tc39.es/ecma262/#sec-string.prototype.trim
$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {
  trim: function trim() {
    return $trim(this);
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/string-trim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-trim.js","../internals/string-trim-forced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-trim-forced.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.async-iterator.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.asyncIterator` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.asynciterator
defineWellKnownSymbol('asyncIterator');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.constructor.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var global = require('../internals/global');
var call = require('../internals/function-call');
var uncurryThis = require('../internals/function-uncurry-this');
var IS_PURE = require('../internals/is-pure');
var DESCRIPTORS = require('../internals/descriptors');
var NATIVE_SYMBOL = require('../internals/native-symbol');
var fails = require('../internals/fails');
var hasOwn = require('../internals/has-own-property');
var isPrototypeOf = require('../internals/object-is-prototype-of');
var anObject = require('../internals/an-object');
var toIndexedObject = require('../internals/to-indexed-object');
var toPropertyKey = require('../internals/to-property-key');
var $toString = require('../internals/to-string');
var createPropertyDescriptor = require('../internals/create-property-descriptor');
var nativeObjectCreate = require('../internals/object-create');
var objectKeys = require('../internals/object-keys');
var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');
var getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');
var getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');
var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');
var definePropertyModule = require('../internals/object-define-property');
var definePropertiesModule = require('../internals/object-define-properties');
var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');
var redefine = require('../internals/redefine');
var shared = require('../internals/shared');
var sharedKey = require('../internals/shared-key');
var hiddenKeys = require('../internals/hidden-keys');
var uid = require('../internals/uid');
var wellKnownSymbol = require('../internals/well-known-symbol');
var wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
var defineSymbolToPrimitive = require('../internals/symbol-define-to-primitive');
var setToStringTag = require('../internals/set-to-string-tag');
var InternalStateModule = require('../internals/internal-state');
var $forEach = require('../internals/array-iteration').forEach;

var HIDDEN = sharedKey('hidden');
var SYMBOL = 'Symbol';
var PROTOTYPE = 'prototype';

var setInternalState = InternalStateModule.set;
var getInternalState = InternalStateModule.getterFor(SYMBOL);

var ObjectPrototype = Object[PROTOTYPE];
var $Symbol = global.Symbol;
var SymbolPrototype = $Symbol && $Symbol[PROTOTYPE];
var TypeError = global.TypeError;
var QObject = global.QObject;
var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
var nativeDefineProperty = definePropertyModule.f;
var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;
var nativePropertyIsEnumerable = propertyIsEnumerableModule.f;
var push = uncurryThis([].push);

var AllSymbols = shared('symbols');
var ObjectPrototypeSymbols = shared('op-symbols');
var WellKnownSymbolsStore = shared('wks');

// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;

// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
var setSymbolDescriptor = DESCRIPTORS && fails(function () {
  return nativeObjectCreate(nativeDefineProperty({}, 'a', {
    get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }
  })).a != 7;
}) ? function (O, P, Attributes) {
  var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);
  if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];
  nativeDefineProperty(O, P, Attributes);
  if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {
    nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);
  }
} : nativeDefineProperty;

var wrap = function (tag, description) {
  var symbol = AllSymbols[tag] = nativeObjectCreate(SymbolPrototype);
  setInternalState(symbol, {
    type: SYMBOL,
    tag: tag,
    description: description
  });
  if (!DESCRIPTORS) symbol.description = description;
  return symbol;
};

var $defineProperty = function defineProperty(O, P, Attributes) {
  if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);
  anObject(O);
  var key = toPropertyKey(P);
  anObject(Attributes);
  if (hasOwn(AllSymbols, key)) {
    if (!Attributes.enumerable) {
      if (!hasOwn(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));
      O[HIDDEN][key] = true;
    } else {
      if (hasOwn(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;
      Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });
    } return setSymbolDescriptor(O, key, Attributes);
  } return nativeDefineProperty(O, key, Attributes);
};

var $defineProperties = function defineProperties(O, Properties) {
  anObject(O);
  var properties = toIndexedObject(Properties);
  var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));
  $forEach(keys, function (key) {
    if (!DESCRIPTORS || call($propertyIsEnumerable, properties, key)) $defineProperty(O, key, properties[key]);
  });
  return O;
};

var $create = function create(O, Properties) {
  return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);
};

var $propertyIsEnumerable = function propertyIsEnumerable(V) {
  var P = toPropertyKey(V);
  var enumerable = call(nativePropertyIsEnumerable, this, P);
  if (this === ObjectPrototype && hasOwn(AllSymbols, P) && !hasOwn(ObjectPrototypeSymbols, P)) return false;
  return enumerable || !hasOwn(this, P) || !hasOwn(AllSymbols, P) || hasOwn(this, HIDDEN) && this[HIDDEN][P]
    ? enumerable : true;
};

var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {
  var it = toIndexedObject(O);
  var key = toPropertyKey(P);
  if (it === ObjectPrototype && hasOwn(AllSymbols, key) && !hasOwn(ObjectPrototypeSymbols, key)) return;
  var descriptor = nativeGetOwnPropertyDescriptor(it, key);
  if (descriptor && hasOwn(AllSymbols, key) && !(hasOwn(it, HIDDEN) && it[HIDDEN][key])) {
    descriptor.enumerable = true;
  }
  return descriptor;
};

var $getOwnPropertyNames = function getOwnPropertyNames(O) {
  var names = nativeGetOwnPropertyNames(toIndexedObject(O));
  var result = [];
  $forEach(names, function (key) {
    if (!hasOwn(AllSymbols, key) && !hasOwn(hiddenKeys, key)) push(result, key);
  });
  return result;
};

var $getOwnPropertySymbols = function (O) {
  var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;
  var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));
  var result = [];
  $forEach(names, function (key) {
    if (hasOwn(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || hasOwn(ObjectPrototype, key))) {
      push(result, AllSymbols[key]);
    }
  });
  return result;
};

// `Symbol` constructor
// https://tc39.es/ecma262/#sec-symbol-constructor
if (!NATIVE_SYMBOL) {
  $Symbol = function Symbol() {
    if (isPrototypeOf(SymbolPrototype, this)) throw TypeError('Symbol is not a constructor');
    var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]);
    var tag = uid(description);
    var setter = function (value) {
      if (this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value);
      if (hasOwn(this, HIDDEN) && hasOwn(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
      setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));
    };
    if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });
    return wrap(tag, description);
  };

  SymbolPrototype = $Symbol[PROTOTYPE];

  redefine(SymbolPrototype, 'toString', function toString() {
    return getInternalState(this).tag;
  });

  redefine($Symbol, 'withoutSetter', function (description) {
    return wrap(uid(description), description);
  });

  propertyIsEnumerableModule.f = $propertyIsEnumerable;
  definePropertyModule.f = $defineProperty;
  definePropertiesModule.f = $defineProperties;
  getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;
  getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;
  getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;

  wrappedWellKnownSymbolModule.f = function (name) {
    return wrap(wellKnownSymbol(name), name);
  };

  if (DESCRIPTORS) {
    // https://github.com/tc39/proposal-Symbol-description
    nativeDefineProperty(SymbolPrototype, 'description', {
      configurable: true,
      get: function description() {
        return getInternalState(this).description;
      }
    });
    if (!IS_PURE) {
      redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });
    }
  }
}

$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {
  Symbol: $Symbol
});

$forEach(objectKeys(WellKnownSymbolsStore), function (name) {
  defineWellKnownSymbol(name);
});

$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {
  useSetter: function () { USE_SETTER = true; },
  useSimple: function () { USE_SETTER = false; }
});

$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {
  // `Object.create` method
  // https://tc39.es/ecma262/#sec-object.create
  create: $create,
  // `Object.defineProperty` method
  // https://tc39.es/ecma262/#sec-object.defineproperty
  defineProperty: $defineProperty,
  // `Object.defineProperties` method
  // https://tc39.es/ecma262/#sec-object.defineproperties
  defineProperties: $defineProperties,
  // `Object.getOwnPropertyDescriptor` method
  // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors
  getOwnPropertyDescriptor: $getOwnPropertyDescriptor
});

$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {
  // `Object.getOwnPropertyNames` method
  // https://tc39.es/ecma262/#sec-object.getownpropertynames
  getOwnPropertyNames: $getOwnPropertyNames
});

// `Symbol.prototype[@@toPrimitive]` method
// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive
defineSymbolToPrimitive();

// `Symbol.prototype[@@toStringTag]` property
// https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag
setToStringTag($Symbol, SYMBOL);

hiddenKeys[HIDDEN] = true;

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js","../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js","../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property-descriptor.js","../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/hidden-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/hidden-keys.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-state.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-pure.js","../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol.js","../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-create.js","../internals/object-define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-properties.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js","../internals/object-get-own-property-names":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-names.js","../internals/object-get-own-property-names-external":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-names-external.js","../internals/object-get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-symbols.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../internals/object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-keys.js","../internals/object-property-is-enumerable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-property-is-enumerable.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine.js","../internals/set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-to-string-tag.js","../internals/shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared.js","../internals/shared-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared-key.js","../internals/symbol-define-to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/symbol-define-to-primitive.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js","../internals/to-property-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-property-key.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js","../internals/uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/uid.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js","../internals/well-known-symbol-wrapped":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol-wrapped.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.description.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.math.to-string-tag.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.for.js":[function(require,module,exports){
var $ = require('../internals/export');
var getBuiltIn = require('../internals/get-built-in');
var hasOwn = require('../internals/has-own-property');
var toString = require('../internals/to-string');
var shared = require('../internals/shared');
var NATIVE_SYMBOL_REGISTRY = require('../internals/native-symbol-registry');

var StringToSymbolRegistry = shared('string-to-symbol-registry');
var SymbolToStringRegistry = shared('symbol-to-string-registry');

// `Symbol.for` method
// https://tc39.es/ecma262/#sec-symbol.for
$({ target: 'Symbol', stat: true, forced: !NATIVE_SYMBOL_REGISTRY }, {
  'for': function (key) {
    var string = toString(key);
    if (hasOwn(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];
    var symbol = getBuiltIn('Symbol')(string);
    StringToSymbolRegistry[string] = symbol;
    SymbolToStringRegistry[symbol] = string;
    return symbol;
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/native-symbol-registry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol-registry.js","../internals/shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.has-instance.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.hasInstance` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.hasinstance
defineWellKnownSymbol('hasInstance');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.is-concat-spreadable.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.isConcatSpreadable` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.isconcatspreadable
defineWellKnownSymbol('isConcatSpreadable');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.iterator.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.iterator` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.iterator
defineWellKnownSymbol('iterator');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.js":[function(require,module,exports){
// TODO: Remove this module from `core-js@4` since it's split to modules listed below
require('../modules/es.symbol.constructor');
require('../modules/es.symbol.for');
require('../modules/es.symbol.key-for');
require('../modules/es.json.stringify');
require('../modules/es.object.get-own-property-symbols');

},{"../modules/es.json.stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.json.stringify.js","../modules/es.object.get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.get-own-property-symbols.js","../modules/es.symbol.constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.constructor.js","../modules/es.symbol.for":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.for.js","../modules/es.symbol.key-for":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.key-for.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.key-for.js":[function(require,module,exports){
var $ = require('../internals/export');
var hasOwn = require('../internals/has-own-property');
var isSymbol = require('../internals/is-symbol');
var tryToString = require('../internals/try-to-string');
var shared = require('../internals/shared');
var NATIVE_SYMBOL_REGISTRY = require('../internals/native-symbol-registry');

var SymbolToStringRegistry = shared('symbol-to-string-registry');

// `Symbol.keyFor` method
// https://tc39.es/ecma262/#sec-symbol.keyfor
$({ target: 'Symbol', stat: true, forced: !NATIVE_SYMBOL_REGISTRY }, {
  keyFor: function keyFor(sym) {
    if (!isSymbol(sym)) throw TypeError(tryToString(sym) + ' is not a symbol');
    if (hasOwn(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../internals/is-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-symbol.js","../internals/native-symbol-registry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol-registry.js","../internals/shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared.js","../internals/try-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/try-to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.match-all.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.matchAll` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.matchall
defineWellKnownSymbol('matchAll');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.match.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.match` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.match
defineWellKnownSymbol('match');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.replace.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.replace` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.replace
defineWellKnownSymbol('replace');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.search.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.search` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.search
defineWellKnownSymbol('search');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.species.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.species` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.species
defineWellKnownSymbol('species');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.split.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.split` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.split
defineWellKnownSymbol('split');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.to-primitive.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
var defineSymbolToPrimitive = require('../internals/symbol-define-to-primitive');

// `Symbol.toPrimitive` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.toprimitive
defineWellKnownSymbol('toPrimitive');

// `Symbol.prototype[@@toPrimitive]` method
// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive
defineSymbolToPrimitive();

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js","../internals/symbol-define-to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/symbol-define-to-primitive.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.to-string-tag.js":[function(require,module,exports){
var getBuiltIn = require('../internals/get-built-in');
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
var setToStringTag = require('../internals/set-to-string-tag');

// `Symbol.toStringTag` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.tostringtag
defineWellKnownSymbol('toStringTag');

// `Symbol.prototype[@@toStringTag]` property
// https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag
setToStringTag(getBuiltIn('Symbol'), 'Symbol');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-built-in.js","../internals/set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-to-string-tag.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.unscopables.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.unscopables` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.unscopables
defineWellKnownSymbol('unscopables');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.weak-map.constructor.js":[function(require,module,exports){
'use strict';
var global = require('../internals/global');
var uncurryThis = require('../internals/function-uncurry-this');
var redefineAll = require('../internals/redefine-all');
var InternalMetadataModule = require('../internals/internal-metadata');
var collection = require('../internals/collection');
var collectionWeak = require('../internals/collection-weak');
var isObject = require('../internals/is-object');
var isExtensible = require('../internals/object-is-extensible');
var enforceInternalState = require('../internals/internal-state').enforce;
var NATIVE_WEAK_MAP = require('../internals/native-weak-map');

var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;
var InternalWeakMap;

var wrapper = function (init) {
  return function WeakMap() {
    return init(this, arguments.length ? arguments[0] : undefined);
  };
};

// `WeakMap` constructor
// https://tc39.es/ecma262/#sec-weakmap-constructor
var $WeakMap = collection('WeakMap', wrapper, collectionWeak);

// IE11 WeakMap frozen keys fix
// We can't use feature detection because it crash some old IE builds
// https://github.com/zloirock/core-js/issues/485
if (NATIVE_WEAK_MAP && IS_IE11) {
  InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);
  InternalMetadataModule.enable();
  var WeakMapPrototype = $WeakMap.prototype;
  var nativeDelete = uncurryThis(WeakMapPrototype['delete']);
  var nativeHas = uncurryThis(WeakMapPrototype.has);
  var nativeGet = uncurryThis(WeakMapPrototype.get);
  var nativeSet = uncurryThis(WeakMapPrototype.set);
  redefineAll(WeakMapPrototype, {
    'delete': function (key) {
      if (isObject(key) && !isExtensible(key)) {
        var state = enforceInternalState(this);
        if (!state.frozen) state.frozen = new InternalWeakMap();
        return nativeDelete(this, key) || state.frozen['delete'](key);
      } return nativeDelete(this, key);
    },
    has: function has(key) {
      if (isObject(key) && !isExtensible(key)) {
        var state = enforceInternalState(this);
        if (!state.frozen) state.frozen = new InternalWeakMap();
        return nativeHas(this, key) || state.frozen.has(key);
      } return nativeHas(this, key);
    },
    get: function get(key) {
      if (isObject(key) && !isExtensible(key)) {
        var state = enforceInternalState(this);
        if (!state.frozen) state.frozen = new InternalWeakMap();
        return nativeHas(this, key) ? nativeGet(this, key) : state.frozen.get(key);
      } return nativeGet(this, key);
    },
    set: function set(key, value) {
      if (isObject(key) && !isExtensible(key)) {
        var state = enforceInternalState(this);
        if (!state.frozen) state.frozen = new InternalWeakMap();
        nativeHas(this, key) ? nativeSet(this, key, value) : state.frozen.set(key, value);
      } else nativeSet(this, key, value);
      return this;
    }
  });
}

},{"../internals/collection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection.js","../internals/collection-weak":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection-weak.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/internal-metadata":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-metadata.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-state.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js","../internals/native-weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-weak-map.js","../internals/object-is-extensible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-extensible.js","../internals/redefine-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/redefine-all.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.weak-map.js":[function(require,module,exports){
// TODO: Remove this module from `core-js@4` since it's replaced to module below
require('../modules/es.weak-map.constructor');

},{"../modules/es.weak-map.constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.weak-map.constructor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.aggregate-error.js":[function(require,module,exports){
// TODO: Remove from `core-js@4`
require('../modules/es.aggregate-error');

},{"../modules/es.aggregate-error":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.aggregate-error.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.promise.all-settled.js":[function(require,module,exports){
// TODO: Remove from `core-js@4`
require('../modules/es.promise.all-settled.js');

},{"../modules/es.promise.all-settled.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.all-settled.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.promise.any.js":[function(require,module,exports){
// TODO: Remove from `core-js@4`
require('../modules/es.promise.any');

},{"../modules/es.promise.any":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.any.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.promise.try.js":[function(require,module,exports){
'use strict';
// TODO: Remove from `core-js@4`
var $ = require('../internals/export');
var newPromiseCapabilityModule = require('../internals/new-promise-capability');
var perform = require('../internals/perform');

// `Promise.try` method
// https://github.com/tc39/proposal-promise-try
$({ target: 'Promise', stat: true, forced: true }, {
  'try': function (callbackfn) {
    var promiseCapability = newPromiseCapabilityModule.f(this);
    var result = perform(callbackfn);
    (result.error ? promiseCapability.reject : promiseCapability.resolve)(result.value);
    return promiseCapability.promise;
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/new-promise-capability.js","../internals/perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/perform.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.async-dispose.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.asyncDispose` well-known symbol
// https://github.com/tc39/proposal-using-statement
defineWellKnownSymbol('asyncDispose');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.dispose.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.dispose` well-known symbol
// https://github.com/tc39/proposal-using-statement
defineWellKnownSymbol('dispose');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.matcher.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.matcher` well-known symbol
// https://github.com/tc39/proposal-pattern-matching
defineWellKnownSymbol('matcher');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.metadata.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.metadata` well-known symbol
// https://github.com/tc39/proposal-decorators
defineWellKnownSymbol('metadata');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.observable.js":[function(require,module,exports){
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.observable` well-known symbol
// https://github.com/tc39/proposal-observable
defineWellKnownSymbol('observable');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.pattern-match.js":[function(require,module,exports){
// TODO: remove from `core-js@4`
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

// `Symbol.patternMatch` well-known symbol
// https://github.com/tc39/proposal-pattern-matching
defineWellKnownSymbol('patternMatch');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.symbol.replace-all.js":[function(require,module,exports){
// TODO: remove from `core-js@4`
var defineWellKnownSymbol = require('../internals/define-well-known-symbol');

defineWellKnownSymbol('replaceAll');

},{"../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.weak-map.delete-all.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var deleteAll = require('../internals/collection-delete-all');

// `WeakMap.prototype.deleteAll` method
// https://github.com/tc39/proposal-collection-methods
$({ target: 'WeakMap', proto: true, real: true, forced: true }, {
  deleteAll: deleteAll
});

},{"../internals/collection-delete-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection-delete-all.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.weak-map.emplace.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var emplace = require('../internals/map-emplace');

// `WeakMap.prototype.emplace` method
// https://github.com/tc39/proposal-upsert
$({ target: 'WeakMap', proto: true, real: true, forced: true }, {
  emplace: emplace
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/map-emplace":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/map-emplace.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.weak-map.from.js":[function(require,module,exports){
var $ = require('../internals/export');
var from = require('../internals/collection-from');

// `WeakMap.from` method
// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from
$({ target: 'WeakMap', stat: true, forced: true }, {
  from: from
});

},{"../internals/collection-from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection-from.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.weak-map.of.js":[function(require,module,exports){
var $ = require('../internals/export');
var of = require('../internals/collection-of');

// `WeakMap.of` method
// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of
$({ target: 'WeakMap', stat: true, forced: true }, {
  of: of
});

},{"../internals/collection-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/collection-of.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.weak-map.upsert.js":[function(require,module,exports){
'use strict';
// TODO: remove from `core-js@4`
var $ = require('../internals/export');
var upsert = require('../internals/map-upsert');

// `WeakMap.prototype.upsert` method (replaced by `WeakMap.prototype.emplace`)
// https://github.com/tc39/proposal-upsert
$({ target: 'WeakMap', proto: true, real: true, forced: true }, {
  upsert: upsert
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/map-upsert":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/map-upsert.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.clear-immediate.js":[function(require,module,exports){
var $ = require('../internals/export');
var global = require('../internals/global');
var clearImmediate = require('../internals/task').clear;

// `clearImmediate` method
// http://w3c.github.io/setImmediate/#si-clearImmediate
$({ global: true, bind: true, enumerable: true, forced: global.clearImmediate !== clearImmediate }, {
  clearImmediate: clearImmediate
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/task":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/task.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.dom-collections.iterator.js":[function(require,module,exports){
require('../modules/es.array.iterator');
var DOMIterables = require('../internals/dom-iterables');
var global = require('../internals/global');
var classof = require('../internals/classof');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var Iterators = require('../internals/iterators');
var wellKnownSymbol = require('../internals/well-known-symbol');

var TO_STRING_TAG = wellKnownSymbol('toStringTag');

for (var COLLECTION_NAME in DOMIterables) {
  var Collection = global[COLLECTION_NAME];
  var CollectionPrototype = Collection && Collection.prototype;
  if (CollectionPrototype && classof(CollectionPrototype) !== TO_STRING_TAG) {
    createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);
  }
  Iterators[COLLECTION_NAME] = Iterators.Array;
}

},{"../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof.js","../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-non-enumerable-property.js","../internals/dom-iterables":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/dom-iterables.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterators.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js","../modules/es.array.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.immediate.js":[function(require,module,exports){
// TODO: Remove this module from `core-js@4` since it's split to modules listed below
require('../modules/web.clear-immediate');
require('../modules/web.set-immediate');

},{"../modules/web.clear-immediate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.clear-immediate.js","../modules/web.set-immediate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.set-immediate.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.set-immediate.js":[function(require,module,exports){
var $ = require('../internals/export');
var global = require('../internals/global');
var setImmediate = require('../internals/task').set;

// `setImmediate` method
// http://w3c.github.io/setImmediate/#si-setImmediate
$({ global: true, bind: true, enumerable: true, forced: global.setImmediate !== setImmediate }, {
  setImmediate: setImmediate
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/task":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/task.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.set-interval.js":[function(require,module,exports){
var $ = require('../internals/export');
var global = require('../internals/global');
var setInterval = require('../internals/schedulers-fix').setInterval;

// ie9- setInterval additional parameters fix
// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
$({ global: true, bind: true, forced: global.setInterval !== setInterval }, {
  setInterval: setInterval
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/schedulers-fix":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/schedulers-fix.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.set-timeout.js":[function(require,module,exports){
var $ = require('../internals/export');
var global = require('../internals/global');
var setTimeout = require('../internals/schedulers-fix').setTimeout;

// ie9- setTimeout additional parameters fix
// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout
$({ global: true, bind: true, forced: global.setTimeout !== setTimeout }, {
  setTimeout: setTimeout
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/export.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js","../internals/schedulers-fix":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/schedulers-fix.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.timers.js":[function(require,module,exports){
// TODO: Remove this module from `core-js@4` since it's split to modules listed below
require('../modules/web.set-interval');
require('../modules/web.set-timeout');

},{"../modules/web.set-interval":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.set-interval.js","../modules/web.set-timeout":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.set-timeout.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/from.js":[function(require,module,exports){
var parent = require('../../es/array/from');

module.exports = parent;

},{"../../es/array/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/from.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/is-array.js":[function(require,module,exports){
var parent = require('../../es/array/is-array');

module.exports = parent;

},{"../../es/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/is-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/virtual/for-each.js":[function(require,module,exports){
var parent = require('../../../es/array/virtual/for-each');

module.exports = parent;

},{"../../../es/array/virtual/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/for-each.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/virtual/keys.js":[function(require,module,exports){
var parent = require('../../../es/array/virtual/keys');

module.exports = parent;

},{"../../../es/array/virtual/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/virtual/values.js":[function(require,module,exports){
var parent = require('../../../es/array/virtual/values');

module.exports = parent;

},{"../../../es/array/virtual/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/array/virtual/values.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/date/now.js":[function(require,module,exports){
var parent = require('../../es/date/now');

module.exports = parent;

},{"../../es/date/now":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/date/now.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/get-iterator-method.js":[function(require,module,exports){
var parent = require('../es/get-iterator-method');
require('../modules/web.dom-collections.iterator');

module.exports = parent;

},{"../es/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/get-iterator-method.js","../modules/web.dom-collections.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.dom-collections.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/get-iterator.js":[function(require,module,exports){
var parent = require('../es/get-iterator');
require('../modules/web.dom-collections.iterator');

module.exports = parent;

},{"../es/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/get-iterator.js","../modules/web.dom-collections.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.dom-collections.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/bind.js":[function(require,module,exports){
var parent = require('../../es/instance/bind');

module.exports = parent;

},{"../../es/instance/bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/bind.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/concat.js":[function(require,module,exports){
var parent = require('../../es/instance/concat');

module.exports = parent;

},{"../../es/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/concat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/every.js":[function(require,module,exports){
var parent = require('../../es/instance/every');

module.exports = parent;

},{"../../es/instance/every":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/every.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/filter.js":[function(require,module,exports){
var parent = require('../../es/instance/filter');

module.exports = parent;

},{"../../es/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/filter.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/find-index.js":[function(require,module,exports){
var parent = require('../../es/instance/find-index');

module.exports = parent;

},{"../../es/instance/find-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/find-index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/find.js":[function(require,module,exports){
var parent = require('../../es/instance/find');

module.exports = parent;

},{"../../es/instance/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/find.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/flat-map.js":[function(require,module,exports){
var parent = require('../../es/instance/flat-map');

module.exports = parent;

},{"../../es/instance/flat-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/flat-map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/flat.js":[function(require,module,exports){
var parent = require('../../es/instance/flat');

module.exports = parent;

},{"../../es/instance/flat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/flat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/for-each.js":[function(require,module,exports){
require('../../modules/web.dom-collections.iterator');
var classof = require('../../internals/classof');
var hasOwn = require('../../internals/has-own-property');
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/for-each');

var ArrayPrototype = Array.prototype;

var DOMIterables = {
  DOMTokenList: true,
  NodeList: true
};

module.exports = function (it) {
  var own = it.forEach;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.forEach)
    || hasOwn(DOMIterables, classof(it)) ? method : own;
};

},{"../../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof.js","../../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../../modules/web.dom-collections.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.dom-collections.iterator.js","../array/virtual/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/virtual/for-each.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/includes.js":[function(require,module,exports){
var parent = require('../../es/instance/includes');

module.exports = parent;

},{"../../es/instance/includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/includes.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/index-of.js":[function(require,module,exports){
var parent = require('../../es/instance/index-of');

module.exports = parent;

},{"../../es/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/keys.js":[function(require,module,exports){
require('../../modules/web.dom-collections.iterator');
var classof = require('../../internals/classof');
var hasOwn = require('../../internals/has-own-property');
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/keys');

var ArrayPrototype = Array.prototype;

var DOMIterables = {
  DOMTokenList: true,
  NodeList: true
};

module.exports = function (it) {
  var own = it.keys;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.keys)
    || hasOwn(DOMIterables, classof(it)) ? method : own;
};

},{"../../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof.js","../../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../../modules/web.dom-collections.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.dom-collections.iterator.js","../array/virtual/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/virtual/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/last-index-of.js":[function(require,module,exports){
var parent = require('../../es/instance/last-index-of');

module.exports = parent;

},{"../../es/instance/last-index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/last-index-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/map.js":[function(require,module,exports){
var parent = require('../../es/instance/map');

module.exports = parent;

},{"../../es/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/pad-end.js":[function(require,module,exports){
var parent = require('../../es/instance/pad-end');

module.exports = parent;

},{"../../es/instance/pad-end":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/pad-end.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/pad-start.js":[function(require,module,exports){
var parent = require('../../es/instance/pad-start');

module.exports = parent;

},{"../../es/instance/pad-start":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/pad-start.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/reduce.js":[function(require,module,exports){
var parent = require('../../es/instance/reduce');

module.exports = parent;

},{"../../es/instance/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/reverse.js":[function(require,module,exports){
var parent = require('../../es/instance/reverse');

module.exports = parent;

},{"../../es/instance/reverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/reverse.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/slice.js":[function(require,module,exports){
var parent = require('../../es/instance/slice');

module.exports = parent;

},{"../../es/instance/slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/some.js":[function(require,module,exports){
var parent = require('../../es/instance/some');

module.exports = parent;

},{"../../es/instance/some":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/some.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/sort.js":[function(require,module,exports){
var parent = require('../../es/instance/sort');

module.exports = parent;

},{"../../es/instance/sort":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/sort.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/splice.js":[function(require,module,exports){
var parent = require('../../es/instance/splice');

module.exports = parent;

},{"../../es/instance/splice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/splice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/starts-with.js":[function(require,module,exports){
var parent = require('../../es/instance/starts-with');

module.exports = parent;

},{"../../es/instance/starts-with":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/starts-with.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/trim.js":[function(require,module,exports){
var parent = require('../../es/instance/trim');

module.exports = parent;

},{"../../es/instance/trim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/instance/trim.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/instance/values.js":[function(require,module,exports){
require('../../modules/web.dom-collections.iterator');
var classof = require('../../internals/classof');
var hasOwn = require('../../internals/has-own-property');
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/values');

var ArrayPrototype = Array.prototype;

var DOMIterables = {
  DOMTokenList: true,
  NodeList: true
};

module.exports = function (it) {
  var own = it.values;
  return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.values)
    || hasOwn(DOMIterables, classof(it)) ? method : own;
};

},{"../../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof.js","../../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js","../../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js","../../modules/web.dom-collections.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.dom-collections.iterator.js","../array/virtual/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/array/virtual/values.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/json/stringify.js":[function(require,module,exports){
var parent = require('../../es/json/stringify');

module.exports = parent;

},{"../../es/json/stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/json/stringify.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/number/is-integer.js":[function(require,module,exports){
var parent = require('../../es/number/is-integer');

module.exports = parent;

},{"../../es/number/is-integer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/number/is-integer.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/assign.js":[function(require,module,exports){
var parent = require('../../es/object/assign');

module.exports = parent;

},{"../../es/object/assign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/assign.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/create.js":[function(require,module,exports){
var parent = require('../../es/object/create');

module.exports = parent;

},{"../../es/object/create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/create.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/define-properties.js":[function(require,module,exports){
var parent = require('../../es/object/define-properties');

module.exports = parent;

},{"../../es/object/define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/define-properties.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/define-property.js":[function(require,module,exports){
var parent = require('../../es/object/define-property');

module.exports = parent;

},{"../../es/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/entries.js":[function(require,module,exports){
var parent = require('../../es/object/entries');

module.exports = parent;

},{"../../es/object/entries":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/entries.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/freeze.js":[function(require,module,exports){
var parent = require('../../es/object/freeze');

module.exports = parent;

},{"../../es/object/freeze":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/freeze.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/get-own-property-descriptor.js":[function(require,module,exports){
var parent = require('../../es/object/get-own-property-descriptor');

module.exports = parent;

},{"../../es/object/get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/get-own-property-descriptor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/get-own-property-descriptors.js":[function(require,module,exports){
var parent = require('../../es/object/get-own-property-descriptors');

module.exports = parent;

},{"../../es/object/get-own-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/get-own-property-descriptors.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/get-own-property-symbols.js":[function(require,module,exports){
var parent = require('../../es/object/get-own-property-symbols');

module.exports = parent;

},{"../../es/object/get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/get-own-property-symbols.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/get-prototype-of.js":[function(require,module,exports){
var parent = require('../../es/object/get-prototype-of');

module.exports = parent;

},{"../../es/object/get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/get-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/is.js":[function(require,module,exports){
var parent = require('../../es/object/is');

module.exports = parent;

},{"../../es/object/is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/is.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/keys.js":[function(require,module,exports){
var parent = require('../../es/object/keys');

module.exports = parent;

},{"../../es/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/set-prototype-of.js":[function(require,module,exports){
var parent = require('../../es/object/set-prototype-of');

module.exports = parent;

},{"../../es/object/set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/set-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/object/values.js":[function(require,module,exports){
var parent = require('../../es/object/values');

module.exports = parent;

},{"../../es/object/values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/object/values.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/parse-float.js":[function(require,module,exports){
var parent = require('../es/parse-float');

module.exports = parent;

},{"../es/parse-float":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/parse-float.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/parse-int.js":[function(require,module,exports){
var parent = require('../es/parse-int');

module.exports = parent;

},{"../es/parse-int":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/parse-int.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/promise/index.js":[function(require,module,exports){
var parent = require('../../es/promise');
require('../../modules/web.dom-collections.iterator');

module.exports = parent;

},{"../../es/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/promise/index.js","../../modules/web.dom-collections.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.dom-collections.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/reflect/construct.js":[function(require,module,exports){
var parent = require('../../es/reflect/construct');

module.exports = parent;

},{"../../es/reflect/construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/reflect/construct.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/reflect/get.js":[function(require,module,exports){
var parent = require('../../es/reflect/get');

module.exports = parent;

},{"../../es/reflect/get":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/reflect/get.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/set-immediate.js":[function(require,module,exports){
require('../modules/web.immediate');
var path = require('../internals/path');

module.exports = path.setImmediate;

},{"../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../modules/web.immediate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.immediate.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/set-interval.js":[function(require,module,exports){
require('../modules/web.timers');
var path = require('../internals/path');

module.exports = path.setInterval;

},{"../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../modules/web.timers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.timers.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/set-timeout.js":[function(require,module,exports){
require('../modules/web.timers');
var path = require('../internals/path');

module.exports = path.setTimeout;

},{"../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/path.js","../modules/web.timers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.timers.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/set/index.js":[function(require,module,exports){
var parent = require('../../es/set');
require('../../modules/web.dom-collections.iterator');

module.exports = parent;

},{"../../es/set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/set/index.js","../../modules/web.dom-collections.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.dom-collections.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/symbol/index.js":[function(require,module,exports){
var parent = require('../../es/symbol');
require('../../modules/web.dom-collections.iterator');

module.exports = parent;

},{"../../es/symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/symbol/index.js","../../modules/web.dom-collections.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.dom-collections.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/symbol/iterator.js":[function(require,module,exports){
var parent = require('../../es/symbol/iterator');
require('../../modules/web.dom-collections.iterator');

module.exports = parent;

},{"../../es/symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/symbol/iterator.js","../../modules/web.dom-collections.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.dom-collections.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/symbol/replace.js":[function(require,module,exports){
var parent = require('../../es/symbol/replace');

module.exports = parent;

},{"../../es/symbol/replace":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/symbol/replace.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/stable/weak-map/index.js":[function(require,module,exports){
var parent = require('../../es/weak-map');
require('../../modules/web.dom-collections.iterator');

module.exports = parent;

},{"../../es/weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/es/weak-map/index.js","../../modules/web.dom-collections.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/web.dom-collections.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-callable.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-callable.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/try-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/try-to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-constructor.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-constructor.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-constructor.js","../internals/try-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/try-to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-possible-prototype.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/a-possible-prototype.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/add-to-unscopables.js":[function(require,module,exports){
var wellKnownSymbol = require('../internals/well-known-symbol');
var create = require('../internals/object-create');
var definePropertyModule = require('../internals/object-define-property');

var UNSCOPABLES = wellKnownSymbol('unscopables');
var ArrayPrototype = Array.prototype;

// Array.prototype[@@unscopables]
// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
if (ArrayPrototype[UNSCOPABLES] == undefined) {
  definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {
    configurable: true,
    value: create(null)
  });
}

// add a key to Array.prototype[@@unscopables]
module.exports = function (key) {
  ArrayPrototype[UNSCOPABLES][key] = true;
};

},{"../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-create.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/advance-string-index.js":[function(require,module,exports){
'use strict';
var charAt = require('../internals/string-multibyte').charAt;

// `AdvanceStringIndex` abstract operation
// https://tc39.es/ecma262/#sec-advancestringindex
module.exports = function (S, index, unicode) {
  return index + (unicode ? charAt(S, index).length : 1);
};

},{"../internals/string-multibyte":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/string-multibyte.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-instance.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-instance.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-is-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/an-object.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-includes.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-includes.js"][0].apply(exports,arguments)
},{"../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/length-of-array-like.js","../internals/to-absolute-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-absolute-index.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-iteration.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-iteration.js"][0].apply(exports,arguments)
},{"../internals/array-species-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-species-create.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-bind-context.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/indexed-object.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/length-of-array-like.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-method-has-species-support.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-has-species-support.js"][0].apply(exports,arguments)
},{"../internals/engine-v8-version":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-v8-version.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-method-is-strict.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-method-is-strict.js"][0].apply(exports,arguments)
},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-slice-simple.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice-simple.js"][0].apply(exports,arguments)
},{"../internals/create-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-property.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/length-of-array-like.js","../internals/to-absolute-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-absolute-index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-slice.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-slice.js"][0].apply(exports,arguments)
},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-species-constructor.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-species-constructor.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-array.js","../internals/is-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-constructor.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-species-create.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/array-species-create.js"][0].apply(exports,arguments)
},{"../internals/array-species-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-species-constructor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/check-correctness-of-iteration.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/check-correctness-of-iteration.js"][0].apply(exports,arguments)
},{"../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof-raw.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof-raw.js"][0].apply(exports,arguments)
},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/classof.js"][0].apply(exports,arguments)
},{"../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof-raw.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/to-string-tag-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string-tag-support.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/copy-constructor-properties.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/copy-constructor-properties.js"][0].apply(exports,arguments)
},{"../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-descriptor.js","../internals/own-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/own-keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/correct-prototype-getter.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/correct-prototype-getter.js"][0].apply(exports,arguments)
},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-iterator-constructor.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-iterator-constructor.js"][0].apply(exports,arguments)
},{"../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-property-descriptor.js","../internals/iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterators.js","../internals/iterators-core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterators-core.js","../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-create.js","../internals/set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-to-string-tag.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-non-enumerable-property.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-non-enumerable-property.js"][0].apply(exports,arguments)
},{"../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-property-descriptor.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-property-descriptor.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_property-desc.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-property.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/create-property.js"][0].apply(exports,arguments)
},{"../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-property-descriptor.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js","../internals/to-property-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-property-key.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/define-iterator.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-iterator.js"][0].apply(exports,arguments)
},{"../internals/create-iterator-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-iterator-constructor.js","../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-non-enumerable-property.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/function-name":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-name.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-pure.js","../internals/iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterators.js","../internals/iterators-core":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterators-core.js","../internals/object-get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-prototype-of.js","../internals/object-set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-set-prototype-of.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js","../internals/set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-to-string-tag.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/define-well-known-symbol.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/define-well-known-symbol.js"][0].apply(exports,arguments)
},{"../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js","../internals/path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/path.js","../internals/well-known-symbol-wrapped":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol-wrapped.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/descriptors.js"][0].apply(exports,arguments)
},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/document-create-element.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/document-create-element.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/dom-iterables.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/dom-iterables.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/dom-token-list-prototype.js":[function(require,module,exports){
// in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList`
var documentCreateElement = require('../internals/document-create-element');

var classList = documentCreateElement('span').classList;
var DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype;

module.exports = DOMTokenListPrototype === Object.prototype ? undefined : DOMTokenListPrototype;

},{"../internals/document-create-element":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/document-create-element.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-browser.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-browser.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-ios-pebble.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-ios-pebble.js"][0].apply(exports,arguments)
},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-user-agent.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-ios.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-ios.js"][0].apply(exports,arguments)
},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-user-agent.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-node.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-node.js"][0].apply(exports,arguments)
},{"../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof-raw.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-webos-webkit.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-is-webos-webkit.js"][0].apply(exports,arguments)
},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-user-agent.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-user-agent.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-user-agent.js"][0].apply(exports,arguments)
},{"../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-v8-version.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/engine-v8-version.js"][0].apply(exports,arguments)
},{"../internals/engine-user-agent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-user-agent.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/enum-bug-keys.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/enum-bug-keys.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js":[function(require,module,exports){
var global = require('../internals/global');
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var redefine = require('../internals/redefine');
var setGlobal = require('../internals/set-global');
var copyConstructorProperties = require('../internals/copy-constructor-properties');
var isForced = require('../internals/is-forced');

/*
  options.target      - name of the target object
  options.global      - target is the global object
  options.stat        - export as static methods of target
  options.proto       - export as prototype methods of target
  options.real        - real prototype method for the `pure` version
  options.forced      - export even if the native feature is available
  options.bind        - bind methods to the target, required for the `pure` version
  options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version
  options.unsafe      - use the simple assignment of property instead of delete + defineProperty
  options.sham        - add a flag to not completely full polyfills
  options.enumerable  - export as enumerable property
  options.noTargetGet - prevent calling a getter on target
  options.name        - the .name of the function if it does not match the key
*/
module.exports = function (options, source) {
  var TARGET = options.target;
  var GLOBAL = options.global;
  var STATIC = options.stat;
  var FORCED, target, key, targetProperty, sourceProperty, descriptor;
  if (GLOBAL) {
    target = global;
  } else if (STATIC) {
    target = global[TARGET] || setGlobal(TARGET, {});
  } else {
    target = (global[TARGET] || {}).prototype;
  }
  if (target) for (key in source) {
    sourceProperty = source[key];
    if (options.noTargetGet) {
      descriptor = getOwnPropertyDescriptor(target, key);
      targetProperty = descriptor && descriptor.value;
    } else targetProperty = target[key];
    FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
    // contained in target
    if (!FORCED && targetProperty !== undefined) {
      if (typeof sourceProperty == typeof targetProperty) continue;
      copyConstructorProperties(sourceProperty, targetProperty);
    }
    // add a flag to not completely full polyfills
    if (options.sham || (targetProperty && targetProperty.sham)) {
      createNonEnumerableProperty(sourceProperty, 'sham', true);
    }
    // extend global
    redefine(target, key, sourceProperty, options);
  }
};

},{"../internals/copy-constructor-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/copy-constructor-properties.js","../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-non-enumerable-property.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-forced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-forced.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-descriptor.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js","../internals/set-global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/fails.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js":[function(require,module,exports){
'use strict';
// TODO: Remove from `core-js@4` since it's moved to entry points
require('../modules/es.regexp.exec');
var uncurryThis = require('../internals/function-uncurry-this');
var redefine = require('../internals/redefine');
var regexpExec = require('../internals/regexp-exec');
var fails = require('../internals/fails');
var wellKnownSymbol = require('../internals/well-known-symbol');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');

var SPECIES = wellKnownSymbol('species');
var RegExpPrototype = RegExp.prototype;

module.exports = function (KEY, exec, FORCED, SHAM) {
  var SYMBOL = wellKnownSymbol(KEY);

  var DELEGATES_TO_SYMBOL = !fails(function () {
    // String methods call symbol-named RegEp methods
    var O = {};
    O[SYMBOL] = function () { return 7; };
    return ''[KEY](O) != 7;
  });

  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {
    // Symbol-named RegExp methods call .exec
    var execCalled = false;
    var re = /a/;

    if (KEY === 'split') {
      // We can't use real regex here since it causes deoptimization
      // and serious performance degradation in V8
      // https://github.com/zloirock/core-js/issues/306
      re = {};
      // RegExp[@@split] doesn't call the regex's exec method, but first creates
      // a new one. We need to return the patched regex when creating the new one.
      re.constructor = {};
      re.constructor[SPECIES] = function () { return re; };
      re.flags = '';
      re[SYMBOL] = /./[SYMBOL];
    }

    re.exec = function () { execCalled = true; return null; };

    re[SYMBOL]('');
    return !execCalled;
  });

  if (
    !DELEGATES_TO_SYMBOL ||
    !DELEGATES_TO_EXEC ||
    FORCED
  ) {
    var uncurriedNativeRegExpMethod = uncurryThis(/./[SYMBOL]);
    var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {
      var uncurriedNativeMethod = uncurryThis(nativeMethod);
      var $exec = regexp.exec;
      if ($exec === regexpExec || $exec === RegExpPrototype.exec) {
        if (DELEGATES_TO_SYMBOL && !forceStringMethod) {
          // The native String method already delegates to @@method (this
          // polyfilled function), leasing to infinite recursion.
          // We avoid it by directly calling the native @@method method.
          return { done: true, value: uncurriedNativeRegExpMethod(regexp, str, arg2) };
        }
        return { done: true, value: uncurriedNativeMethod(str, regexp, arg2) };
      }
      return { done: false };
    });

    redefine(String.prototype, KEY, methods[0]);
    redefine(RegExpPrototype, SYMBOL, methods[1]);
  }

  if (SHAM) createNonEnumerableProperty(RegExpPrototype[SYMBOL], 'sham', true);
};

},{"../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-non-enumerable-property.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js","../internals/regexp-exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-exec.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js","../modules/es.regexp.exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-apply.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-apply.js"][0].apply(exports,arguments)
},{"../internals/function-bind-native":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-bind-native.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-bind-context.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-context.js"][0].apply(exports,arguments)
},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-callable.js","../internals/function-bind-native":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-bind-native.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-bind-native.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-bind-native.js"][0].apply(exports,arguments)
},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-call.js"][0].apply(exports,arguments)
},{"../internals/function-bind-native":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-bind-native.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-name.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-name.js"][0].apply(exports,arguments)
},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/function-uncurry-this.js"][0].apply(exports,arguments)
},{"../internals/function-bind-native":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-bind-native.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js":[function(require,module,exports){
var global = require('../internals/global');
var isCallable = require('../internals/is-callable');

var aFunction = function (argument) {
  return isCallable(argument) ? argument : undefined;
};

module.exports = function (namespace, method) {
  return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];
};

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-iterator-method.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-iterator-method.js"][0].apply(exports,arguments)
},{"../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof.js","../internals/get-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-method.js","../internals/iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterators.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-iterator.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-iterator.js"][0].apply(exports,arguments)
},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-callable.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-iterator-method.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/try-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/try-to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-method.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/get-method.js"][0].apply(exports,arguments)
},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-substitution.js":[function(require,module,exports){
var uncurryThis = require('../internals/function-uncurry-this');
var toObject = require('../internals/to-object');

var floor = Math.floor;
var charAt = uncurryThis(''.charAt);
var replace = uncurryThis(''.replace);
var stringSlice = uncurryThis(''.slice);
var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d{1,2}|<[^>]*>)/g;
var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d{1,2})/g;

// `GetSubstitution` abstract operation
// https://tc39.es/ecma262/#sec-getsubstitution
module.exports = function (matched, str, position, captures, namedCaptures, replacement) {
  var tailPos = position + matched.length;
  var m = captures.length;
  var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;
  if (namedCaptures !== undefined) {
    namedCaptures = toObject(namedCaptures);
    symbols = SUBSTITUTION_SYMBOLS;
  }
  return replace(replacement, symbols, function (match, ch) {
    var capture;
    switch (charAt(ch, 0)) {
      case '$': return '$';
      case '&': return matched;
      case '`': return stringSlice(str, 0, position);
      case "'": return stringSlice(str, tailPos);
      case '<':
        capture = namedCaptures[stringSlice(ch, 1, -1)];
        break;
      default: // \d\d?
        var n = +ch;
        if (n === 0) return match;
        if (n > m) {
          var f = floor(n / 10);
          if (f === 0) return match;
          if (f <= m) return captures[f - 1] === undefined ? charAt(ch, 1) : captures[f - 1] + charAt(ch, 1);
          return match;
        }
        capture = captures[n - 1];
    }
    return capture === undefined ? '' : capture;
  });
};

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/global.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/has-own-property.js"][0].apply(exports,arguments)
},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/hidden-keys.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/host-report-errors.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/host-report-errors.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/html.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/html.js"][0].apply(exports,arguments)
},{"../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/ie8-dom-define.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/ie8-dom-define.js"][0].apply(exports,arguments)
},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/document-create-element":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/document-create-element.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/indexed-object.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/indexed-object.js"][0].apply(exports,arguments)
},{"../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof-raw.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/inherit-if-required.js":[function(require,module,exports){
var isCallable = require('../internals/is-callable');
var isObject = require('../internals/is-object');
var setPrototypeOf = require('../internals/object-set-prototype-of');

// makes subclassing work correct for wrapped built-ins
module.exports = function ($this, dummy, Wrapper) {
  var NewTarget, NewTargetPrototype;
  if (
    // it can work only with native `setPrototypeOf`
    setPrototypeOf &&
    // we haven't completely correct pre-ES6 way for getting `new.target`, so use this
    isCallable(NewTarget = dummy.constructor) &&
    NewTarget !== Wrapper &&
    isObject(NewTargetPrototype = NewTarget.prototype) &&
    NewTargetPrototype !== Wrapper.prototype
  ) setPrototypeOf($this, NewTargetPrototype);
  return $this;
};

},{"../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js","../internals/object-set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-set-prototype-of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/inspect-source.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/inspect-source.js"][0].apply(exports,arguments)
},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/shared-store":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared-store.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/internal-state.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/internal-state.js"][0].apply(exports,arguments)
},{"../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-non-enumerable-property.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/hidden-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/hidden-keys.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js","../internals/native-weak-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-weak-map.js","../internals/shared-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared-key.js","../internals/shared-store":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared-store.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-array-iterator-method.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array-iterator-method.js"][0].apply(exports,arguments)
},{"../internals/iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterators.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-array.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-array.js"][0].apply(exports,arguments)
},{"../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof-raw.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-callable.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-constructor.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-constructor.js"][0].apply(exports,arguments)
},{"../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js","../internals/inspect-source":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/inspect-source.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-forced.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-forced.js"][0].apply(exports,arguments)
},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-object.js"][0].apply(exports,arguments)
},{"../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-pure.js":[function(require,module,exports){
module.exports = false;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-regexp.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-regexp.js"][0].apply(exports,arguments)
},{"../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof-raw.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-symbol.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/is-symbol.js"][0].apply(exports,arguments)
},{"../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-is-prototype-of.js","../internals/use-symbol-as-uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/use-symbol-as-uid.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterate.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterate.js"][0].apply(exports,arguments)
},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-bind-context.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-iterator.js","../internals/get-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-iterator-method.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-array-iterator-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-array-iterator-method.js","../internals/iterator-close":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterator-close.js","../internals/length-of-array-like":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/length-of-array-like.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-is-prototype-of.js","../internals/try-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/try-to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterator-close.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterator-close.js"][0].apply(exports,arguments)
},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/get-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-method.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterators-core.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/iterators-core.js"][0].apply(exports,arguments)
},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-pure.js","../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-create.js","../internals/object-get-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-prototype-of.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterators.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/node_modules/core-js/library/modules/_iterators.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/length-of-array-like.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/length-of-array-like.js"][0].apply(exports,arguments)
},{"../internals/to-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-length.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/microtask.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/microtask.js"][0].apply(exports,arguments)
},{"../internals/engine-is-ios":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-ios.js","../internals/engine-is-ios-pebble":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-ios-pebble.js","../internals/engine-is-node":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-node.js","../internals/engine-is-webos-webkit":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-webos-webkit.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-bind-context.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-descriptor.js","../internals/task":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/task.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-symbol-registry.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol-registry.js"][0].apply(exports,arguments)
},{"../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-symbol.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-symbol.js"][0].apply(exports,arguments)
},{"../internals/engine-v8-version":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-v8-version.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-weak-map.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/native-weak-map.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/inspect-source":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/inspect-source.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/new-promise-capability.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/new-promise-capability.js"][0].apply(exports,arguments)
},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-callable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-create.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-create.js"][0].apply(exports,arguments)
},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/document-create-element":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/document-create-element.js","../internals/enum-bug-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/enum-bug-keys.js","../internals/hidden-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/hidden-keys.js","../internals/html":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/html.js","../internals/object-define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-properties.js","../internals/shared-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared-key.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-properties.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-properties.js"][0].apply(exports,arguments)
},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js","../internals/object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-keys.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-indexed-object.js","../internals/v8-prototype-define-bug":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/v8-prototype-define-bug.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-define-property.js"][0].apply(exports,arguments)
},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/ie8-dom-define":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/ie8-dom-define.js","../internals/to-property-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-property-key.js","../internals/v8-prototype-define-bug":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/v8-prototype-define-bug.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-descriptor.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js"][0].apply(exports,arguments)
},{"../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-property-descriptor.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/ie8-dom-define":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/ie8-dom-define.js","../internals/object-property-is-enumerable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-property-is-enumerable.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-indexed-object.js","../internals/to-property-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-property-key.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-names-external.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-names-external.js"][0].apply(exports,arguments)
},{"../internals/array-slice-simple":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-slice-simple.js","../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof-raw.js","../internals/object-get-own-property-names":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-names.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-names.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-names.js"][0].apply(exports,arguments)
},{"../internals/enum-bug-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/enum-bug-keys.js","../internals/object-keys-internal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-keys-internal.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-symbols.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-own-property-symbols.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-prototype-of.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-get-prototype-of.js"][0].apply(exports,arguments)
},{"../internals/correct-prototype-getter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/correct-prototype-getter.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/shared-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared-key.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-is-prototype-of.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-is-prototype-of.js"][0].apply(exports,arguments)
},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-keys-internal.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-keys-internal.js"][0].apply(exports,arguments)
},{"../internals/array-includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-includes.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/hidden-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/hidden-keys.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-keys.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-keys.js"][0].apply(exports,arguments)
},{"../internals/enum-bug-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/enum-bug-keys.js","../internals/object-keys-internal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-keys-internal.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-property-is-enumerable.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-property-is-enumerable.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-set-prototype-of.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-set-prototype-of.js"][0].apply(exports,arguments)
},{"../internals/a-possible-prototype":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-possible-prototype.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-to-array.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-to-array.js"][0].apply(exports,arguments)
},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-keys.js","../internals/object-property-is-enumerable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-property-is-enumerable.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-to-string.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/object-to-string.js"][0].apply(exports,arguments)
},{"../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof.js","../internals/to-string-tag-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string-tag-support.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/ordinary-to-primitive.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/ordinary-to-primitive.js"][0].apply(exports,arguments)
},{"../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/own-keys.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/own-keys.js"][0].apply(exports,arguments)
},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js","../internals/object-get-own-property-names":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-names.js","../internals/object-get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-symbols.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/path.js":[function(require,module,exports){
var global = require('../internals/global');

module.exports = global;

},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/perform.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/perform.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-constructor-detection.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-constructor-detection.js"][0].apply(exports,arguments)
},{"../internals/engine-is-browser":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-browser.js","../internals/engine-v8-version":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-v8-version.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/inspect-source":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/inspect-source.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/is-forced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-forced.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-pure.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-native-constructor.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-native-constructor.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-native-constructor.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-resolve.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-resolve.js"][0].apply(exports,arguments)
},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/new-promise-capability.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-statics-incorrect-iteration.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/promise-statics-incorrect-iteration.js"][0].apply(exports,arguments)
},{"../internals/check-correctness-of-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/check-correctness-of-iteration.js","../internals/promise-constructor-detection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-constructor-detection.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-native-constructor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/proxy-accessor.js":[function(require,module,exports){
var defineProperty = require('../internals/object-define-property').f;

module.exports = function (Target, Source, key) {
  key in Target || defineProperty(Target, key, {
    configurable: true,
    get: function () { return Source[key]; },
    set: function (it) { Source[key] = it; }
  });
};

},{"../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/queue.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/queue.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine-all.js":[function(require,module,exports){
var redefine = require('../internals/redefine');

module.exports = function (target, src, options) {
  for (var key in src) redefine(target, key, src[key], options);
  return target;
};

},{"../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js":[function(require,module,exports){
var global = require('../internals/global');
var isCallable = require('../internals/is-callable');
var hasOwn = require('../internals/has-own-property');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var setGlobal = require('../internals/set-global');
var inspectSource = require('../internals/inspect-source');
var InternalStateModule = require('../internals/internal-state');
var CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;

var getInternalState = InternalStateModule.get;
var enforceInternalState = InternalStateModule.enforce;
var TEMPLATE = String(String).split('String');

(module.exports = function (O, key, value, options) {
  var unsafe = options ? !!options.unsafe : false;
  var simple = options ? !!options.enumerable : false;
  var noTargetGet = options ? !!options.noTargetGet : false;
  var name = options && options.name !== undefined ? options.name : key;
  var state;
  if (isCallable(value)) {
    if (String(name).slice(0, 7) === 'Symbol(') {
      name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']';
    }
    if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {
      createNonEnumerableProperty(value, 'name', name);
    }
    state = enforceInternalState(value);
    if (!state.source) {
      state.source = TEMPLATE.join(typeof name == 'string' ? name : '');
    }
  }
  if (O === global) {
    if (simple) O[key] = value;
    else setGlobal(key, value);
    return;
  } else if (!unsafe) {
    delete O[key];
  } else if (!noTargetGet && O[key]) {
    simple = true;
  }
  if (simple) O[key] = value;
  else createNonEnumerableProperty(O, key, value);
// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
})(Function.prototype, 'toString', function toString() {
  return isCallable(this) && getInternalState(this).source || inspectSource(this);
});

},{"../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-non-enumerable-property.js","../internals/function-name":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-name.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/inspect-source":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/inspect-source.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/internal-state.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/set-global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-exec-abstract.js":[function(require,module,exports){
var global = require('../internals/global');
var call = require('../internals/function-call');
var anObject = require('../internals/an-object');
var isCallable = require('../internals/is-callable');
var classof = require('../internals/classof-raw');
var regexpExec = require('../internals/regexp-exec');

var TypeError = global.TypeError;

// `RegExpExec` abstract operation
// https://tc39.es/ecma262/#sec-regexpexec
module.exports = function (R, S) {
  var exec = R.exec;
  if (isCallable(exec)) {
    var result = call(exec, R, S);
    if (result !== null) anObject(result);
    return result;
  }
  if (classof(R) === 'RegExp') return call(regexpExec, R, S);
  throw TypeError('RegExp#exec called on incompatible receiver');
};

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/classof-raw":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof-raw.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/regexp-exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-exec.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-exec.js":[function(require,module,exports){
'use strict';
/* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */
/* eslint-disable regexp/no-useless-quantifier -- testing */
var call = require('../internals/function-call');
var uncurryThis = require('../internals/function-uncurry-this');
var toString = require('../internals/to-string');
var regexpFlags = require('../internals/regexp-flags');
var stickyHelpers = require('../internals/regexp-sticky-helpers');
var shared = require('../internals/shared');
var create = require('../internals/object-create');
var getInternalState = require('../internals/internal-state').get;
var UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');
var UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');

var nativeReplace = shared('native-string-replace', String.prototype.replace);
var nativeExec = RegExp.prototype.exec;
var patchedExec = nativeExec;
var charAt = uncurryThis(''.charAt);
var indexOf = uncurryThis(''.indexOf);
var replace = uncurryThis(''.replace);
var stringSlice = uncurryThis(''.slice);

var UPDATES_LAST_INDEX_WRONG = (function () {
  var re1 = /a/;
  var re2 = /b*/g;
  call(nativeExec, re1, 'a');
  call(nativeExec, re2, 'a');
  return re1.lastIndex !== 0 || re2.lastIndex !== 0;
})();

var UNSUPPORTED_Y = stickyHelpers.BROKEN_CARET;

// nonparticipating capturing group, copied from es5-shim's String#split patch.
var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;

var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG;

if (PATCH) {
  patchedExec = function exec(string) {
    var re = this;
    var state = getInternalState(re);
    var str = toString(string);
    var raw = state.raw;
    var result, reCopy, lastIndex, match, i, object, group;

    if (raw) {
      raw.lastIndex = re.lastIndex;
      result = call(patchedExec, raw, str);
      re.lastIndex = raw.lastIndex;
      return result;
    }

    var groups = state.groups;
    var sticky = UNSUPPORTED_Y && re.sticky;
    var flags = call(regexpFlags, re);
    var source = re.source;
    var charsAdded = 0;
    var strCopy = str;

    if (sticky) {
      flags = replace(flags, 'y', '');
      if (indexOf(flags, 'g') === -1) {
        flags += 'g';
      }

      strCopy = stringSlice(str, re.lastIndex);
      // Support anchored sticky behavior.
      if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt(str, re.lastIndex - 1) !== '\n')) {
        source = '(?: ' + source + ')';
        strCopy = ' ' + strCopy;
        charsAdded++;
      }
      // ^(? + rx + ) is needed, in combination with some str slicing, to
      // simulate the 'y' flag.
      reCopy = new RegExp('^(?:' + source + ')', flags);
    }

    if (NPCG_INCLUDED) {
      reCopy = new RegExp('^' + source + '$(?!\\s)', flags);
    }
    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;

    match = call(nativeExec, sticky ? reCopy : re, strCopy);

    if (sticky) {
      if (match) {
        match.input = stringSlice(match.input, charsAdded);
        match[0] = stringSlice(match[0], charsAdded);
        match.index = re.lastIndex;
        re.lastIndex += match[0].length;
      } else re.lastIndex = 0;
    } else if (UPDATES_LAST_INDEX_WRONG && match) {
      re.lastIndex = re.global ? match.index + match[0].length : lastIndex;
    }
    if (NPCG_INCLUDED && match && match.length > 1) {
      // Fix browsers whose `exec` methods don't consistently return `undefined`
      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
      call(nativeReplace, match[0], reCopy, function () {
        for (i = 1; i < arguments.length - 2; i++) {
          if (arguments[i] === undefined) match[i] = undefined;
        }
      });
    }

    if (match && groups) {
      match.groups = object = create(null);
      for (i = 0; i < groups.length; i++) {
        group = groups[i];
        object[group[0]] = match[group[1]];
      }
    }

    return match;
  };
}

module.exports = patchedExec;

},{"../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/internal-state.js","../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-create.js","../internals/regexp-flags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-flags.js","../internals/regexp-sticky-helpers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-sticky-helpers.js","../internals/regexp-unsupported-dot-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-unsupported-dot-all.js","../internals/regexp-unsupported-ncg":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-unsupported-ncg.js","../internals/shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-flags.js":[function(require,module,exports){
'use strict';
var anObject = require('../internals/an-object');

// `RegExp.prototype.flags` getter implementation
// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
module.exports = function () {
  var that = anObject(this);
  var result = '';
  if (that.hasIndices) result += 'd';
  if (that.global) result += 'g';
  if (that.ignoreCase) result += 'i';
  if (that.multiline) result += 'm';
  if (that.dotAll) result += 's';
  if (that.unicode) result += 'u';
  if (that.sticky) result += 'y';
  return result;
};

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-get-flags.js":[function(require,module,exports){
var call = require('../internals/function-call');
var hasOwn = require('../internals/has-own-property');
var isPrototypeOf = require('../internals/object-is-prototype-of');
var regExpFlags = require('../internals/regexp-flags');

var RegExpPrototype = RegExp.prototype;

module.exports = function (R) {
  var flags = R.flags;
  return flags === undefined && !('flags' in RegExpPrototype) && !hasOwn(R, 'flags') && isPrototypeOf(RegExpPrototype, R)
    ? call(regExpFlags, R) : flags;
};

},{"../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-is-prototype-of.js","../internals/regexp-flags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-flags.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-sticky-helpers.js":[function(require,module,exports){
var fails = require('../internals/fails');
var global = require('../internals/global');

// babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError
var $RegExp = global.RegExp;

var UNSUPPORTED_Y = fails(function () {
  var re = $RegExp('a', 'y');
  re.lastIndex = 2;
  return re.exec('abcd') != null;
});

// UC Browser bug
// https://github.com/zloirock/core-js/issues/1008
var MISSED_STICKY = UNSUPPORTED_Y || fails(function () {
  return !$RegExp('a', 'y').sticky;
});

var BROKEN_CARET = UNSUPPORTED_Y || fails(function () {
  // https://bugzilla.mozilla.org/show_bug.cgi?id=773687
  var re = $RegExp('^r', 'gy');
  re.lastIndex = 2;
  return re.exec('str') != null;
});

module.exports = {
  BROKEN_CARET: BROKEN_CARET,
  MISSED_STICKY: MISSED_STICKY,
  UNSUPPORTED_Y: UNSUPPORTED_Y
};

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-unsupported-dot-all.js":[function(require,module,exports){
var fails = require('../internals/fails');
var global = require('../internals/global');

// babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError
var $RegExp = global.RegExp;

module.exports = fails(function () {
  var re = $RegExp('.', 's');
  return !(re.dotAll && re.exec('\n') && re.flags === 's');
});

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-unsupported-ncg.js":[function(require,module,exports){
var fails = require('../internals/fails');
var global = require('../internals/global');

// babel-minify and Closure Compiler transpiles RegExp('(?<a>b)', 'g') -> /(?<a>b)/g and it causes SyntaxError
var $RegExp = global.RegExp;

module.exports = fails(function () {
  var re = $RegExp('(?<a>b)', 'g');
  return re.exec('b').groups.a !== 'b' ||
    'b'.replace(re, '$<a>c') !== 'bc';
});

},{"../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/require-object-coercible.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/require-object-coercible.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-global.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-global.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-species.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/set-species.js"][0].apply(exports,arguments)
},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-to-string-tag.js":[function(require,module,exports){
var defineProperty = require('../internals/object-define-property').f;
var hasOwn = require('../internals/has-own-property');
var wellKnownSymbol = require('../internals/well-known-symbol');

var TO_STRING_TAG = wellKnownSymbol('toStringTag');

module.exports = function (target, TAG, STATIC) {
  if (target && !STATIC) target = target.prototype;
  if (target && !hasOwn(target, TO_STRING_TAG)) {
    defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });
  }
};

},{"../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared-key.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared-key.js"][0].apply(exports,arguments)
},{"../internals/shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared.js","../internals/uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/uid.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared-store.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/shared-store.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/set-global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared.js":[function(require,module,exports){
var IS_PURE = require('../internals/is-pure');
var store = require('../internals/shared-store');

(module.exports = function (key, value) {
  return store[key] || (store[key] = value !== undefined ? value : {});
})('versions', []).push({
  version: '3.22.2',
  mode: IS_PURE ? 'pure' : 'global',
  copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)',
  license: 'https://github.com/zloirock/core-js/blob/v3.22.2/LICENSE',
  source: 'https://github.com/zloirock/core-js'
});

},{"../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-pure.js","../internals/shared-store":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared-store.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/species-constructor.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/species-constructor.js"][0].apply(exports,arguments)
},{"../internals/a-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-constructor.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/string-multibyte.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/string-multibyte.js"][0].apply(exports,arguments)
},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/require-object-coercible.js","../internals/to-integer-or-infinity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-integer-or-infinity.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/symbol-define-to-primitive.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/symbol-define-to-primitive.js"][0].apply(exports,arguments)
},{"../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/task.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/task.js"][0].apply(exports,arguments)
},{"../internals/array-slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-slice.js","../internals/document-create-element":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/document-create-element.js","../internals/engine-is-ios":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-ios.js","../internals/engine-is-node":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-node.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/function-apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-apply.js","../internals/function-bind-context":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-bind-context.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/html":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/html.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/validate-arguments-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/validate-arguments-length.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-absolute-index.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-absolute-index.js"][0].apply(exports,arguments)
},{"../internals/to-integer-or-infinity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-integer-or-infinity.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-indexed-object.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-indexed-object.js"][0].apply(exports,arguments)
},{"../internals/indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/indexed-object.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/require-object-coercible.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-integer-or-infinity.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-integer-or-infinity.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-length.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-length.js"][0].apply(exports,arguments)
},{"../internals/to-integer-or-infinity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-integer-or-infinity.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-object.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-object.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/require-object-coercible.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-primitive.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-primitive.js"][0].apply(exports,arguments)
},{"../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/get-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-method.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js","../internals/is-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-symbol.js","../internals/ordinary-to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/ordinary-to-primitive.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-property-key.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-property-key.js"][0].apply(exports,arguments)
},{"../internals/is-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-symbol.js","../internals/to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-primitive.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string-tag-support.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string-tag-support.js"][0].apply(exports,arguments)
},{"../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/to-string.js"][0].apply(exports,arguments)
},{"../internals/classof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/classof.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/try-to-string.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/try-to-string.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/uid.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/uid.js"][0].apply(exports,arguments)
},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/use-symbol-as-uid.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/use-symbol-as-uid.js"][0].apply(exports,arguments)
},{"../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/v8-prototype-define-bug.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/v8-prototype-define-bug.js"][0].apply(exports,arguments)
},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/validate-arguments-length.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/validate-arguments-length.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol-wrapped.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol-wrapped.js"][0].apply(exports,arguments)
},{"../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/internals/well-known-symbol.js"][0].apply(exports,arguments)
},{"../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-symbol.js","../internals/shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared.js","../internals/uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/uid.js","../internals/use-symbol-as-uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/use-symbol-as-uid.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.array.iterator.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.iterator.js"][0].apply(exports,arguments)
},{"../internals/add-to-unscopables":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/add-to-unscopables.js","../internals/define-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/define-iterator.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/internal-state.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-pure.js","../internals/iterators":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterators.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.array.join.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var uncurryThis = require('../internals/function-uncurry-this');
var IndexedObject = require('../internals/indexed-object');
var toIndexedObject = require('../internals/to-indexed-object');
var arrayMethodIsStrict = require('../internals/array-method-is-strict');

var un$Join = uncurryThis([].join);

var ES3_STRINGS = IndexedObject != Object;
var STRICT_METHOD = arrayMethodIsStrict('join', ',');

// `Array.prototype.join` method
// https://tc39.es/ecma262/#sec-array.prototype.join
$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {
  join: function join(separator) {
    return un$Join(toIndexedObject(this), separator === undefined ? ',' : separator);
  }
});

},{"../internals/array-method-is-strict":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-method-is-strict.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/indexed-object.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-indexed-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.array.map.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.array.map.js"][0].apply(exports,arguments)
},{"../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-iteration.js","../internals/array-method-has-species-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-method-has-species-support.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-json.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var fails = require('../internals/fails');
var toObject = require('../internals/to-object');
var toPrimitive = require('../internals/to-primitive');

var FORCED = fails(function () {
  return new Date(NaN).toJSON() !== null
    || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;
});

// `Date.prototype.toJSON` method
// https://tc39.es/ecma262/#sec-date.prototype.tojson
$({ target: 'Date', proto: true, forced: FORCED }, {
  // eslint-disable-next-line no-unused-vars -- required for `.length`
  toJSON: function toJSON(key) {
    var O = toObject(this);
    var pv = toPrimitive(O, 'number');
    return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-object.js","../internals/to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-primitive.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.date.to-string.js":[function(require,module,exports){
// TODO: Remove from `core-js@4`
var uncurryThis = require('../internals/function-uncurry-this');
var redefine = require('../internals/redefine');

var DatePrototype = Date.prototype;
var INVALID_DATE = 'Invalid Date';
var TO_STRING = 'toString';
var un$DateToString = uncurryThis(DatePrototype[TO_STRING]);
var getTime = uncurryThis(DatePrototype.getTime);

// `Date.prototype.toString` method
// https://tc39.es/ecma262/#sec-date.prototype.tostring
if (String(new Date(NaN)) != INVALID_DATE) {
  redefine(DatePrototype, TO_STRING, function toString() {
    var value = getTime(this);
    // eslint-disable-next-line no-self-compare -- NaN check
    return value === value ? un$DateToString(this) : INVALID_DATE;
  });
}

},{"../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.function.name.js":[function(require,module,exports){
var DESCRIPTORS = require('../internals/descriptors');
var FUNCTION_NAME_EXISTS = require('../internals/function-name').EXISTS;
var uncurryThis = require('../internals/function-uncurry-this');
var defineProperty = require('../internals/object-define-property').f;

var FunctionPrototype = Function.prototype;
var functionToString = uncurryThis(FunctionPrototype.toString);
var nameRE = /function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/;
var regExpExec = uncurryThis(nameRE.exec);
var NAME = 'name';

// Function instances `.name` property
// https://tc39.es/ecma262/#sec-function-instances-name
if (DESCRIPTORS && !FUNCTION_NAME_EXISTS) {
  defineProperty(FunctionPrototype, NAME, {
    configurable: true,
    get: function () {
      try {
        return regExpExec(nameRE, functionToString(this))[1];
      } catch (error) {
        return '';
      }
    }
  });
}

},{"../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/function-name":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-name.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.json.stringify.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.json.stringify.js"][0].apply(exports,arguments)
},{"../internals/array-slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-slice.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/function-apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-apply.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js","../internals/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-array.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js","../internals/is-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-symbol.js","../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.get-own-property-symbols.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.get-own-property-symbols.js"][0].apply(exports,arguments)
},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-symbol.js","../internals/object-get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-symbols.js","../internals/to-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-object.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.to-string.js":[function(require,module,exports){
var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');
var redefine = require('../internals/redefine');
var toString = require('../internals/object-to-string');

// `Object.prototype.toString` method
// https://tc39.es/ecma262/#sec-object.prototype.tostring
if (!TO_STRING_TAG_SUPPORT) {
  redefine(Object.prototype, 'toString', toString, { unsafe: true });
}

},{"../internals/object-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-to-string.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js","../internals/to-string-tag-support":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string-tag-support.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.values.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.object.values.js"][0].apply(exports,arguments)
},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/object-to-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-to-array.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.all-settled.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.all-settled.js"][0].apply(exports,arguments)
},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-callable.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterate.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/new-promise-capability.js","../internals/perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/perform.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.all.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.all.js"][0].apply(exports,arguments)
},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-callable.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterate.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/new-promise-capability.js","../internals/perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/perform.js","../internals/promise-statics-incorrect-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-statics-incorrect-iteration.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.catch.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.catch.js"][0].apply(exports,arguments)
},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-pure.js","../internals/promise-constructor-detection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-constructor-detection.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-native-constructor.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.constructor.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.constructor.js"][0].apply(exports,arguments)
},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-callable.js","../internals/an-instance":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-instance.js","../internals/engine-is-node":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/engine-is-node.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/host-report-errors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/host-report-errors.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/internal-state.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/is-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-object.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-pure.js","../internals/microtask":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/microtask.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/new-promise-capability.js","../internals/object-set-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-set-prototype-of.js","../internals/perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/perform.js","../internals/promise-constructor-detection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-constructor-detection.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-native-constructor.js","../internals/queue":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/queue.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js","../internals/redefine-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine-all.js","../internals/set-species":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-species.js","../internals/set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-to-string-tag.js","../internals/species-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/species-constructor.js","../internals/task":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/task.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.finally.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.finally.js"][0].apply(exports,arguments)
},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-pure.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-native-constructor.js","../internals/promise-resolve":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-resolve.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js","../internals/species-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/species-constructor.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.js"][0].apply(exports,arguments)
},{"../modules/es.promise.all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.all.js","../modules/es.promise.catch":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.catch.js","../modules/es.promise.constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.constructor.js","../modules/es.promise.race":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.race.js","../modules/es.promise.reject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.reject.js","../modules/es.promise.resolve":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.resolve.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.race.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.race.js"][0].apply(exports,arguments)
},{"../internals/a-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/a-callable.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/iterate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/iterate.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/new-promise-capability.js","../internals/perform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/perform.js","../internals/promise-statics-incorrect-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-statics-incorrect-iteration.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.reject.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.reject.js"][0].apply(exports,arguments)
},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/new-promise-capability":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/new-promise-capability.js","../internals/promise-constructor-detection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-constructor-detection.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.resolve.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.promise.resolve.js"][0].apply(exports,arguments)
},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-pure.js","../internals/promise-constructor-detection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-constructor-detection.js","../internals/promise-native-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-native-constructor.js","../internals/promise-resolve":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/promise-resolve.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.constructor.js":[function(require,module,exports){
var DESCRIPTORS = require('../internals/descriptors');
var global = require('../internals/global');
var uncurryThis = require('../internals/function-uncurry-this');
var isForced = require('../internals/is-forced');
var inheritIfRequired = require('../internals/inherit-if-required');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var getOwnPropertyNames = require('../internals/object-get-own-property-names').f;
var isPrototypeOf = require('../internals/object-is-prototype-of');
var isRegExp = require('../internals/is-regexp');
var toString = require('../internals/to-string');
var getRegExpFlags = require('../internals/regexp-get-flags');
var stickyHelpers = require('../internals/regexp-sticky-helpers');
var proxyAccessor = require('../internals/proxy-accessor');
var redefine = require('../internals/redefine');
var fails = require('../internals/fails');
var hasOwn = require('../internals/has-own-property');
var enforceInternalState = require('../internals/internal-state').enforce;
var setSpecies = require('../internals/set-species');
var wellKnownSymbol = require('../internals/well-known-symbol');
var UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');
var UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');

var MATCH = wellKnownSymbol('match');
var NativeRegExp = global.RegExp;
var RegExpPrototype = NativeRegExp.prototype;
var SyntaxError = global.SyntaxError;
var exec = uncurryThis(RegExpPrototype.exec);
var charAt = uncurryThis(''.charAt);
var replace = uncurryThis(''.replace);
var stringIndexOf = uncurryThis(''.indexOf);
var stringSlice = uncurryThis(''.slice);
// TODO: Use only propper RegExpIdentifierName
var IS_NCG = /^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/;
var re1 = /a/g;
var re2 = /a/g;

// "new" should create a new object, old webkit bug
var CORRECT_NEW = new NativeRegExp(re1) !== re1;

var MISSED_STICKY = stickyHelpers.MISSED_STICKY;
var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;

var BASE_FORCED = DESCRIPTORS &&
  (!CORRECT_NEW || MISSED_STICKY || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () {
    re2[MATCH] = false;
    // RegExp constructor can alter flags and IsRegExp works correct with @@match
    return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';
  }));

var handleDotAll = function (string) {
  var length = string.length;
  var index = 0;
  var result = '';
  var brackets = false;
  var chr;
  for (; index <= length; index++) {
    chr = charAt(string, index);
    if (chr === '\\') {
      result += chr + charAt(string, ++index);
      continue;
    }
    if (!brackets && chr === '.') {
      result += '[\\s\\S]';
    } else {
      if (chr === '[') {
        brackets = true;
      } else if (chr === ']') {
        brackets = false;
      } result += chr;
    }
  } return result;
};

var handleNCG = function (string) {
  var length = string.length;
  var index = 0;
  var result = '';
  var named = [];
  var names = {};
  var brackets = false;
  var ncg = false;
  var groupid = 0;
  var groupname = '';
  var chr;
  for (; index <= length; index++) {
    chr = charAt(string, index);
    if (chr === '\\') {
      chr = chr + charAt(string, ++index);
    } else if (chr === ']') {
      brackets = false;
    } else if (!brackets) switch (true) {
      case chr === '[':
        brackets = true;
        break;
      case chr === '(':
        if (exec(IS_NCG, stringSlice(string, index + 1))) {
          index += 2;
          ncg = true;
        }
        result += chr;
        groupid++;
        continue;
      case chr === '>' && ncg:
        if (groupname === '' || hasOwn(names, groupname)) {
          throw new SyntaxError('Invalid capture group name');
        }
        names[groupname] = true;
        named[named.length] = [groupname, groupid];
        ncg = false;
        groupname = '';
        continue;
    }
    if (ncg) groupname += chr;
    else result += chr;
  } return [result, named];
};

// `RegExp` constructor
// https://tc39.es/ecma262/#sec-regexp-constructor
if (isForced('RegExp', BASE_FORCED)) {
  var RegExpWrapper = function RegExp(pattern, flags) {
    var thisIsRegExp = isPrototypeOf(RegExpPrototype, this);
    var patternIsRegExp = isRegExp(pattern);
    var flagsAreUndefined = flags === undefined;
    var groups = [];
    var rawPattern = pattern;
    var rawFlags, dotAll, sticky, handled, result, state;

    if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {
      return pattern;
    }

    if (patternIsRegExp || isPrototypeOf(RegExpPrototype, pattern)) {
      pattern = pattern.source;
      if (flagsAreUndefined) flags = getRegExpFlags(rawPattern);
    }

    pattern = pattern === undefined ? '' : toString(pattern);
    flags = flags === undefined ? '' : toString(flags);
    rawPattern = pattern;

    if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) {
      dotAll = !!flags && stringIndexOf(flags, 's') > -1;
      if (dotAll) flags = replace(flags, /s/g, '');
    }

    rawFlags = flags;

    if (MISSED_STICKY && 'sticky' in re1) {
      sticky = !!flags && stringIndexOf(flags, 'y') > -1;
      if (sticky && UNSUPPORTED_Y) flags = replace(flags, /y/g, '');
    }

    if (UNSUPPORTED_NCG) {
      handled = handleNCG(pattern);
      pattern = handled[0];
      groups = handled[1];
    }

    result = inheritIfRequired(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype, RegExpWrapper);

    if (dotAll || sticky || groups.length) {
      state = enforceInternalState(result);
      if (dotAll) {
        state.dotAll = true;
        state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);
      }
      if (sticky) state.sticky = true;
      if (groups.length) state.groups = groups;
    }

    if (pattern !== rawPattern) try {
      // fails in old engines, but we have no alternatives for unsupported regex syntax
      createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);
    } catch (error) { /* empty */ }

    return result;
  };

  for (var keys = getOwnPropertyNames(NativeRegExp), index = 0; keys.length > index;) {
    proxyAccessor(RegExpWrapper, NativeRegExp, keys[index++]);
  }

  RegExpPrototype.constructor = RegExpWrapper;
  RegExpWrapper.prototype = RegExpPrototype;
  redefine(global, 'RegExp', RegExpWrapper);
}

// https://tc39.es/ecma262/#sec-get-regexp-@@species
setSpecies('RegExp');

},{"../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-non-enumerable-property.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/inherit-if-required":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/inherit-if-required.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/internal-state.js","../internals/is-forced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-forced.js","../internals/is-regexp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-regexp.js","../internals/object-get-own-property-names":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-names.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-is-prototype-of.js","../internals/proxy-accessor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/proxy-accessor.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js","../internals/regexp-get-flags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-get-flags.js","../internals/regexp-sticky-helpers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-sticky-helpers.js","../internals/regexp-unsupported-dot-all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-unsupported-dot-all.js","../internals/regexp-unsupported-ncg":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-unsupported-ncg.js","../internals/set-species":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-species.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.exec.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var exec = require('../internals/regexp-exec');

// `RegExp.prototype.exec` method
// https://tc39.es/ecma262/#sec-regexp.prototype.exec
$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {
  exec: exec
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/regexp-exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-exec.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.regexp.to-string.js":[function(require,module,exports){
'use strict';
var PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;
var redefine = require('../internals/redefine');
var anObject = require('../internals/an-object');
var $toString = require('../internals/to-string');
var fails = require('../internals/fails');
var getRegExpFlags = require('../internals/regexp-get-flags');

var TO_STRING = 'toString';
var RegExpPrototype = RegExp.prototype;
var n$ToString = RegExpPrototype[TO_STRING];

var NOT_GENERIC = fails(function () { return n$ToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });
// FF44- RegExp#toString has a wrong name
var INCORRECT_NAME = PROPER_FUNCTION_NAME && n$ToString.name != TO_STRING;

// `RegExp.prototype.toString` method
// https://tc39.es/ecma262/#sec-regexp.prototype.tostring
if (NOT_GENERIC || INCORRECT_NAME) {
  redefine(RegExp.prototype, TO_STRING, function toString() {
    var R = anObject(this);
    var pattern = $toString(R.source);
    var flags = $toString(getRegExpFlags(R));
    return '/' + pattern + '/' + flags;
  }, { unsafe: true });
}

},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/function-name":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-name.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js","../internals/regexp-get-flags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-get-flags.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.iterator.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.string.iterator.js"][0].apply(exports,arguments)
},{"../internals/define-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/define-iterator.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/internal-state.js","../internals/string-multibyte":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/string-multibyte.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.match.js":[function(require,module,exports){
'use strict';
var call = require('../internals/function-call');
var fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');
var anObject = require('../internals/an-object');
var toLength = require('../internals/to-length');
var toString = require('../internals/to-string');
var requireObjectCoercible = require('../internals/require-object-coercible');
var getMethod = require('../internals/get-method');
var advanceStringIndex = require('../internals/advance-string-index');
var regExpExec = require('../internals/regexp-exec-abstract');

// @@match logic
fixRegExpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {
  return [
    // `String.prototype.match` method
    // https://tc39.es/ecma262/#sec-string.prototype.match
    function match(regexp) {
      var O = requireObjectCoercible(this);
      var matcher = regexp == undefined ? undefined : getMethod(regexp, MATCH);
      return matcher ? call(matcher, regexp, O) : new RegExp(regexp)[MATCH](toString(O));
    },
    // `RegExp.prototype[@@match]` method
    // https://tc39.es/ecma262/#sec-regexp.prototype-@@match
    function (string) {
      var rx = anObject(this);
      var S = toString(string);
      var res = maybeCallNative(nativeMatch, rx, S);

      if (res.done) return res.value;

      if (!rx.global) return regExpExec(rx, S);

      var fullUnicode = rx.unicode;
      rx.lastIndex = 0;
      var A = [];
      var n = 0;
      var result;
      while ((result = regExpExec(rx, S)) !== null) {
        var matchStr = toString(result[0]);
        A[n] = matchStr;
        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
        n++;
      }
      return n === 0 ? null : A;
    }
  ];
});

},{"../internals/advance-string-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/advance-string-index.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/fix-regexp-well-known-symbol-logic":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/get-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-method.js","../internals/regexp-exec-abstract":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-exec-abstract.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/require-object-coercible.js","../internals/to-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-length.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.replace.js":[function(require,module,exports){
'use strict';
var apply = require('../internals/function-apply');
var call = require('../internals/function-call');
var uncurryThis = require('../internals/function-uncurry-this');
var fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');
var fails = require('../internals/fails');
var anObject = require('../internals/an-object');
var isCallable = require('../internals/is-callable');
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
var toLength = require('../internals/to-length');
var toString = require('../internals/to-string');
var requireObjectCoercible = require('../internals/require-object-coercible');
var advanceStringIndex = require('../internals/advance-string-index');
var getMethod = require('../internals/get-method');
var getSubstitution = require('../internals/get-substitution');
var regExpExec = require('../internals/regexp-exec-abstract');
var wellKnownSymbol = require('../internals/well-known-symbol');

var REPLACE = wellKnownSymbol('replace');
var max = Math.max;
var min = Math.min;
var concat = uncurryThis([].concat);
var push = uncurryThis([].push);
var stringIndexOf = uncurryThis(''.indexOf);
var stringSlice = uncurryThis(''.slice);

var maybeToString = function (it) {
  return it === undefined ? it : String(it);
};

// IE <= 11 replaces $0 with the whole match, as if it was $&
// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0
var REPLACE_KEEPS_$0 = (function () {
  // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing
  return 'a'.replace(/./, '$0') === '$0';
})();

// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string
var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {
  if (/./[REPLACE]) {
    return /./[REPLACE]('a', '$0') === '';
  }
  return false;
})();

var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {
  var re = /./;
  re.exec = function () {
    var result = [];
    result.groups = { a: '7' };
    return result;
  };
  // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive
  return ''.replace(re, '$<a>') !== '7';
});

// @@replace logic
fixRegExpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {
  var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';

  return [
    // `String.prototype.replace` method
    // https://tc39.es/ecma262/#sec-string.prototype.replace
    function replace(searchValue, replaceValue) {
      var O = requireObjectCoercible(this);
      var replacer = searchValue == undefined ? undefined : getMethod(searchValue, REPLACE);
      return replacer
        ? call(replacer, searchValue, O, replaceValue)
        : call(nativeReplace, toString(O), searchValue, replaceValue);
    },
    // `RegExp.prototype[@@replace]` method
    // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace
    function (string, replaceValue) {
      var rx = anObject(this);
      var S = toString(string);

      if (
        typeof replaceValue == 'string' &&
        stringIndexOf(replaceValue, UNSAFE_SUBSTITUTE) === -1 &&
        stringIndexOf(replaceValue, '$<') === -1
      ) {
        var res = maybeCallNative(nativeReplace, rx, S, replaceValue);
        if (res.done) return res.value;
      }

      var functionalReplace = isCallable(replaceValue);
      if (!functionalReplace) replaceValue = toString(replaceValue);

      var global = rx.global;
      if (global) {
        var fullUnicode = rx.unicode;
        rx.lastIndex = 0;
      }
      var results = [];
      while (true) {
        var result = regExpExec(rx, S);
        if (result === null) break;

        push(results, result);
        if (!global) break;

        var matchStr = toString(result[0]);
        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
      }

      var accumulatedResult = '';
      var nextSourcePosition = 0;
      for (var i = 0; i < results.length; i++) {
        result = results[i];

        var matched = toString(result[0]);
        var position = max(min(toIntegerOrInfinity(result.index), S.length), 0);
        var captures = [];
        // NOTE: This is equivalent to
        //   captures = result.slice(1).map(maybeToString)
        // but for some reason `nativeSlice.call(result, 1, result.length)` (called in
        // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and
        // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.
        for (var j = 1; j < result.length; j++) push(captures, maybeToString(result[j]));
        var namedCaptures = result.groups;
        if (functionalReplace) {
          var replacerArgs = concat([matched], captures, position, S);
          if (namedCaptures !== undefined) push(replacerArgs, namedCaptures);
          var replacement = toString(apply(replaceValue, undefined, replacerArgs));
        } else {
          replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);
        }
        if (position >= nextSourcePosition) {
          accumulatedResult += stringSlice(S, nextSourcePosition, position) + replacement;
          nextSourcePosition = position + matched.length;
        }
      }
      return accumulatedResult + stringSlice(S, nextSourcePosition);
    }
  ];
}, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);

},{"../internals/advance-string-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/advance-string-index.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/fix-regexp-well-known-symbol-logic":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","../internals/function-apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-apply.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/get-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-method.js","../internals/get-substitution":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-substitution.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/regexp-exec-abstract":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-exec-abstract.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/require-object-coercible.js","../internals/to-integer-or-infinity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-integer-or-infinity.js","../internals/to-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-length.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.string.split.js":[function(require,module,exports){
'use strict';
var apply = require('../internals/function-apply');
var call = require('../internals/function-call');
var uncurryThis = require('../internals/function-uncurry-this');
var fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');
var isRegExp = require('../internals/is-regexp');
var anObject = require('../internals/an-object');
var requireObjectCoercible = require('../internals/require-object-coercible');
var speciesConstructor = require('../internals/species-constructor');
var advanceStringIndex = require('../internals/advance-string-index');
var toLength = require('../internals/to-length');
var toString = require('../internals/to-string');
var getMethod = require('../internals/get-method');
var arraySlice = require('../internals/array-slice-simple');
var callRegExpExec = require('../internals/regexp-exec-abstract');
var regexpExec = require('../internals/regexp-exec');
var stickyHelpers = require('../internals/regexp-sticky-helpers');
var fails = require('../internals/fails');

var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;
var MAX_UINT32 = 0xFFFFFFFF;
var min = Math.min;
var $push = [].push;
var exec = uncurryThis(/./.exec);
var push = uncurryThis($push);
var stringSlice = uncurryThis(''.slice);

// Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec
// Weex JS has frozen built-in prototypes, so use try / catch wrapper
var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {
  // eslint-disable-next-line regexp/no-empty-group -- required for testing
  var re = /(?:)/;
  var originalExec = re.exec;
  re.exec = function () { return originalExec.apply(this, arguments); };
  var result = 'ab'.split(re);
  return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';
});

// @@split logic
fixRegExpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) {
  var internalSplit;
  if (
    'abbc'.split(/(b)*/)[1] == 'c' ||
    // eslint-disable-next-line regexp/no-empty-group -- required for testing
    'test'.split(/(?:)/, -1).length != 4 ||
    'ab'.split(/(?:ab)*/).length != 2 ||
    '.'.split(/(.?)(.?)/).length != 4 ||
    // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing
    '.'.split(/()()/).length > 1 ||
    ''.split(/.?/).length
  ) {
    // based on es5-shim implementation, need to rework it
    internalSplit = function (separator, limit) {
      var string = toString(requireObjectCoercible(this));
      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
      if (lim === 0) return [];
      if (separator === undefined) return [string];
      // If `separator` is not a regex, use native split
      if (!isRegExp(separator)) {
        return call(nativeSplit, string, separator, lim);
      }
      var output = [];
      var flags = (separator.ignoreCase ? 'i' : '') +
                  (separator.multiline ? 'm' : '') +
                  (separator.unicode ? 'u' : '') +
                  (separator.sticky ? 'y' : '');
      var lastLastIndex = 0;
      // Make `global` and avoid `lastIndex` issues by working with a copy
      var separatorCopy = new RegExp(separator.source, flags + 'g');
      var match, lastIndex, lastLength;
      while (match = call(regexpExec, separatorCopy, string)) {
        lastIndex = separatorCopy.lastIndex;
        if (lastIndex > lastLastIndex) {
          push(output, stringSlice(string, lastLastIndex, match.index));
          if (match.length > 1 && match.index < string.length) apply($push, output, arraySlice(match, 1));
          lastLength = match[0].length;
          lastLastIndex = lastIndex;
          if (output.length >= lim) break;
        }
        if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop
      }
      if (lastLastIndex === string.length) {
        if (lastLength || !exec(separatorCopy, '')) push(output, '');
      } else push(output, stringSlice(string, lastLastIndex));
      return output.length > lim ? arraySlice(output, 0, lim) : output;
    };
  // Chakra, V8
  } else if ('0'.split(undefined, 0).length) {
    internalSplit = function (separator, limit) {
      return separator === undefined && limit === 0 ? [] : call(nativeSplit, this, separator, limit);
    };
  } else internalSplit = nativeSplit;

  return [
    // `String.prototype.split` method
    // https://tc39.es/ecma262/#sec-string.prototype.split
    function split(separator, limit) {
      var O = requireObjectCoercible(this);
      var splitter = separator == undefined ? undefined : getMethod(separator, SPLIT);
      return splitter
        ? call(splitter, separator, O, limit)
        : call(internalSplit, toString(O), separator, limit);
    },
    // `RegExp.prototype[@@split]` method
    // https://tc39.es/ecma262/#sec-regexp.prototype-@@split
    //
    // NOTE: This cannot be properly polyfilled in engines that don't support
    // the 'y' flag.
    function (string, limit) {
      var rx = anObject(this);
      var S = toString(string);
      var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);

      if (res.done) return res.value;

      var C = speciesConstructor(rx, RegExp);

      var unicodeMatching = rx.unicode;
      var flags = (rx.ignoreCase ? 'i' : '') +
                  (rx.multiline ? 'm' : '') +
                  (rx.unicode ? 'u' : '') +
                  (UNSUPPORTED_Y ? 'g' : 'y');

      // ^(? + rx + ) is needed, in combination with some S slicing, to
      // simulate the 'y' flag.
      var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags);
      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
      if (lim === 0) return [];
      if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];
      var p = 0;
      var q = 0;
      var A = [];
      while (q < S.length) {
        splitter.lastIndex = UNSUPPORTED_Y ? 0 : q;
        var z = callRegExpExec(splitter, UNSUPPORTED_Y ? stringSlice(S, q) : S);
        var e;
        if (
          z === null ||
          (e = min(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p
        ) {
          q = advanceStringIndex(S, q, unicodeMatching);
        } else {
          push(A, stringSlice(S, p, q));
          if (A.length === lim) return A;
          for (var i = 1; i <= z.length - 1; i++) {
            push(A, z[i]);
            if (A.length === lim) return A;
          }
          q = p = e;
        }
      }
      push(A, stringSlice(S, p));
      return A;
    }
  ];
}, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y);

},{"../internals/advance-string-index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/advance-string-index.js","../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/array-slice-simple":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-slice-simple.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/fix-regexp-well-known-symbol-logic":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","../internals/function-apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-apply.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/get-method":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-method.js","../internals/is-regexp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-regexp.js","../internals/regexp-exec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-exec.js","../internals/regexp-exec-abstract":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-exec-abstract.js","../internals/regexp-sticky-helpers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/regexp-sticky-helpers.js","../internals/require-object-coercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/require-object-coercible.js","../internals/species-constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/species-constructor.js","../internals/to-length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-length.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.constructor.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.constructor.js"][0].apply(exports,arguments)
},{"../internals/an-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/an-object.js","../internals/array-iteration":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/array-iteration.js","../internals/create-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-property-descriptor.js","../internals/define-well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/define-well-known-symbol.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/fails":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/fails.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/hidden-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/hidden-keys.js","../internals/internal-state":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/internal-state.js","../internals/is-pure":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-pure.js","../internals/native-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-symbol.js","../internals/object-create":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-create.js","../internals/object-define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-properties.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js","../internals/object-get-own-property-descriptor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-descriptor.js","../internals/object-get-own-property-names":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-names.js","../internals/object-get-own-property-names-external":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-names-external.js","../internals/object-get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-get-own-property-symbols.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-is-prototype-of.js","../internals/object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-keys.js","../internals/object-property-is-enumerable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-property-is-enumerable.js","../internals/redefine":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/redefine.js","../internals/set-to-string-tag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/set-to-string-tag.js","../internals/shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared.js","../internals/shared-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared-key.js","../internals/symbol-define-to-primitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/symbol-define-to-primitive.js","../internals/to-indexed-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-indexed-object.js","../internals/to-property-key":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-property-key.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js","../internals/uid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/uid.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js","../internals/well-known-symbol-wrapped":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol-wrapped.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.description.js":[function(require,module,exports){
// `Symbol.prototype.description` getter
// https://tc39.es/ecma262/#sec-symbol.prototype.description
'use strict';
var $ = require('../internals/export');
var DESCRIPTORS = require('../internals/descriptors');
var global = require('../internals/global');
var uncurryThis = require('../internals/function-uncurry-this');
var hasOwn = require('../internals/has-own-property');
var isCallable = require('../internals/is-callable');
var isPrototypeOf = require('../internals/object-is-prototype-of');
var toString = require('../internals/to-string');
var defineProperty = require('../internals/object-define-property').f;
var copyConstructorProperties = require('../internals/copy-constructor-properties');

var NativeSymbol = global.Symbol;
var SymbolPrototype = NativeSymbol && NativeSymbol.prototype;

if (DESCRIPTORS && isCallable(NativeSymbol) && (!('description' in SymbolPrototype) ||
  // Safari 12 bug
  NativeSymbol().description !== undefined
)) {
  var EmptyStringDescriptionStore = {};
  // wrap Symbol constructor for correct work with undefined description
  var SymbolWrapper = function Symbol() {
    var description = arguments.length < 1 || arguments[0] === undefined ? undefined : toString(arguments[0]);
    var result = isPrototypeOf(SymbolPrototype, this)
      ? new NativeSymbol(description)
      // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'
      : description === undefined ? NativeSymbol() : NativeSymbol(description);
    if (description === '') EmptyStringDescriptionStore[result] = true;
    return result;
  };

  copyConstructorProperties(SymbolWrapper, NativeSymbol);
  SymbolWrapper.prototype = SymbolPrototype;
  SymbolPrototype.constructor = SymbolWrapper;

  var NATIVE_SYMBOL = String(NativeSymbol('test')) == 'Symbol(test)';
  var symbolToString = uncurryThis(SymbolPrototype.toString);
  var symbolValueOf = uncurryThis(SymbolPrototype.valueOf);
  var regexp = /^Symbol\((.*)\)[^)]+$/;
  var replace = uncurryThis(''.replace);
  var stringSlice = uncurryThis(''.slice);

  defineProperty(SymbolPrototype, 'description', {
    configurable: true,
    get: function description() {
      var symbol = symbolValueOf(this);
      var string = symbolToString(symbol);
      if (hasOwn(EmptyStringDescriptionStore, symbol)) return '';
      var desc = NATIVE_SYMBOL ? stringSlice(string, 7, -1) : replace(string, regexp, '$1');
      return desc === '' ? undefined : desc;
    }
  });

  $({ global: true, forced: true }, {
    Symbol: SymbolWrapper
  });
}

},{"../internals/copy-constructor-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/copy-constructor-properties.js","../internals/descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/descriptors.js","../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/function-uncurry-this":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-uncurry-this.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/is-callable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-callable.js","../internals/object-define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-define-property.js","../internals/object-is-prototype-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/object-is-prototype-of.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.for.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.for.js"][0].apply(exports,arguments)
},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/get-built-in":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/get-built-in.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/native-symbol-registry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-symbol-registry.js","../internals/shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared.js","../internals/to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.js"][0].apply(exports,arguments)
},{"../modules/es.json.stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.json.stringify.js","../modules/es.object.get-own-property-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.object.get-own-property-symbols.js","../modules/es.symbol.constructor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.constructor.js","../modules/es.symbol.for":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.for.js","../modules/es.symbol.key-for":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.key-for.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.symbol.key-for.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/es.symbol.key-for.js"][0].apply(exports,arguments)
},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/has-own-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/has-own-property.js","../internals/is-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/is-symbol.js","../internals/native-symbol-registry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/native-symbol-registry.js","../internals/shared":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/shared.js","../internals/try-to-string":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/try-to-string.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/esnext.promise.all-settled.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js-pure/modules/esnext.promise.all-settled.js"][0].apply(exports,arguments)
},{"../modules/es.promise.all-settled.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.promise.all-settled.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.dom-collections.iterator.js":[function(require,module,exports){
var global = require('../internals/global');
var DOMIterables = require('../internals/dom-iterables');
var DOMTokenListPrototype = require('../internals/dom-token-list-prototype');
var ArrayIteratorMethods = require('../modules/es.array.iterator');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var wellKnownSymbol = require('../internals/well-known-symbol');

var ITERATOR = wellKnownSymbol('iterator');
var TO_STRING_TAG = wellKnownSymbol('toStringTag');
var ArrayValues = ArrayIteratorMethods.values;

var handlePrototype = function (CollectionPrototype, COLLECTION_NAME) {
  if (CollectionPrototype) {
    // some Chrome versions have non-configurable methods on DOMTokenList
    if (CollectionPrototype[ITERATOR] !== ArrayValues) try {
      createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);
    } catch (error) {
      CollectionPrototype[ITERATOR] = ArrayValues;
    }
    if (!CollectionPrototype[TO_STRING_TAG]) {
      createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);
    }
    if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {
      // some Chrome versions have non-configurable methods on DOMTokenList
      if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {
        createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);
      } catch (error) {
        CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];
      }
    }
  }
};

for (var COLLECTION_NAME in DOMIterables) {
  handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype, COLLECTION_NAME);
}

handlePrototype(DOMTokenListPrototype, 'DOMTokenList');

},{"../internals/create-non-enumerable-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/create-non-enumerable-property.js","../internals/dom-iterables":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/dom-iterables.js","../internals/dom-token-list-prototype":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/dom-token-list-prototype.js","../internals/global":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/global.js","../internals/well-known-symbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/well-known-symbol.js","../modules/es.array.iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/es.array.iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/modules/web.url.to-json.js":[function(require,module,exports){
'use strict';
var $ = require('../internals/export');
var call = require('../internals/function-call');

// `URL.prototype.toJSON` method
// https://url.spec.whatwg.org/#dom-url-tojson
$({ target: 'URL', proto: true, enumerable: true }, {
  toJSON: function toJSON() {
    return call(URL.prototype.toString, this);
  }
});

},{"../internals/export":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/export.js","../internals/function-call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-js/internals/function-call.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-util-is/lib/util.js":[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.

function isArray(arg) {
  if (Array.isArray) {
    return Array.isArray(arg);
  }
  return objectToString(arg) === '[object Array]';
}
exports.isArray = isArray;

function isBoolean(arg) {
  return typeof arg === 'boolean';
}
exports.isBoolean = isBoolean;

function isNull(arg) {
  return arg === null;
}
exports.isNull = isNull;

function isNullOrUndefined(arg) {
  return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;

function isNumber(arg) {
  return typeof arg === 'number';
}
exports.isNumber = isNumber;

function isString(arg) {
  return typeof arg === 'string';
}
exports.isString = isString;

function isSymbol(arg) {
  return typeof arg === 'symbol';
}
exports.isSymbol = isSymbol;

function isUndefined(arg) {
  return arg === void 0;
}
exports.isUndefined = isUndefined;

function isRegExp(re) {
  return objectToString(re) === '[object RegExp]';
}
exports.isRegExp = isRegExp;

function isObject(arg) {
  return typeof arg === 'object' && arg !== null;
}
exports.isObject = isObject;

function isDate(d) {
  return objectToString(d) === '[object Date]';
}
exports.isDate = isDate;

function isError(e) {
  return (objectToString(e) === '[object Error]' || e instanceof Error);
}
exports.isError = isError;

function isFunction(arg) {
  return typeof arg === 'function';
}
exports.isFunction = isFunction;

function isPrimitive(arg) {
  return arg === null ||
         typeof arg === 'boolean' ||
         typeof arg === 'number' ||
         typeof arg === 'string' ||
         typeof arg === 'symbol' ||  // ES6 symbol
         typeof arg === 'undefined';
}
exports.isPrimitive = isPrimitive;

exports.isBuffer = require('buffer').Buffer.isBuffer;

function objectToString(o) {
  return Object.prototype.toString.call(o);
}

},{"buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc1.js":[function(require,module,exports){
'use strict';

module.exports = require('./es6/crc1').default;

},{"./es6/crc1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc16.js":[function(require,module,exports){
'use strict';

module.exports = require('./es6/crc16').default;

},{"./es6/crc16":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc16.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc16_ccitt.js":[function(require,module,exports){
'use strict';

module.exports = require('./es6/crc16ccitt').default;

},{"./es6/crc16ccitt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc16ccitt.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc16_kermit.js":[function(require,module,exports){
'use strict';

module.exports = require('./es6/crc16kermit').default;

},{"./es6/crc16kermit":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc16kermit.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc16_modbus.js":[function(require,module,exports){
'use strict';

module.exports = require('./es6/crc16modbus').default;

},{"./es6/crc16modbus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc16modbus.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc16_xmodem.js":[function(require,module,exports){
'use strict';

module.exports = require('./es6/crc16xmodem').default;

},{"./es6/crc16xmodem":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc16xmodem.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc24.js":[function(require,module,exports){
'use strict';

module.exports = require('./es6/crc24').default;

},{"./es6/crc24":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc24.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc32.js":[function(require,module,exports){
'use strict';

module.exports = require('./es6/crc32').default;

},{"./es6/crc32":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc32.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc8.js":[function(require,module,exports){
'use strict';

module.exports = require('./es6/crc8').default;

},{"./es6/crc8":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc8.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc8_1wire.js":[function(require,module,exports){
'use strict';

module.exports = require('./es6/crc81wire').default;

},{"./es6/crc81wire":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc81wire.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crcjam.js":[function(require,module,exports){
'use strict';

module.exports = require('./es6/crcjam').default;

},{"./es6/crcjam":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crcjam.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc1.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var _create_buffer = require('./create_buffer');

var _create_buffer2 = _interopRequireDefault(_create_buffer);

var _define_crc = require('./define_crc');

var _define_crc2 = _interopRequireDefault(_define_crc);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var crc1 = (0, _define_crc2.default)('crc1', function (buf, previous) {
  if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf);

  var crc = ~~previous;
  var accum = 0;

  for (var index = 0; index < buf.length; index++) {
    var byte = buf[index];
    accum += byte;
  }

  crc += accum % 256;
  return crc % 256;
});

exports.default = crc1;

},{"./create_buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js","./define_crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc16.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var _create_buffer = require('./create_buffer');

var _create_buffer2 = _interopRequireDefault(_create_buffer);

var _define_crc = require('./define_crc');

var _define_crc2 = _interopRequireDefault(_define_crc);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// Generated by `./pycrc.py --algorithm=table-driven --model=crc-16 --generate=c`
// prettier-ignore
var TABLE = [0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840, 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441, 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041, 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040];

if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE);

var crc16 = (0, _define_crc2.default)('crc-16', function (buf, previous) {
  if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf);

  var crc = ~~previous;

  for (var index = 0; index < buf.length; index++) {
    var byte = buf[index];
    crc = (TABLE[(crc ^ byte) & 0xff] ^ crc >> 8) & 0xffff;
  }

  return crc;
});

exports.default = crc16;

},{"./create_buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js","./define_crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc16ccitt.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var _create_buffer = require('./create_buffer');

var _create_buffer2 = _interopRequireDefault(_create_buffer);

var _define_crc = require('./define_crc');

var _define_crc2 = _interopRequireDefault(_define_crc);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// Generated by `./pycrc.py --algorithm=table-driven --model=ccitt --generate=c`
// prettier-ignore
var TABLE = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0];

if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE);

var crc16ccitt = (0, _define_crc2.default)('ccitt', function (buf, previous) {
  if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf);

  var crc = typeof previous !== 'undefined' ? ~~previous : 0xffff;

  for (var index = 0; index < buf.length; index++) {
    var byte = buf[index];
    crc = (TABLE[(crc >> 8 ^ byte) & 0xff] ^ crc << 8) & 0xffff;
  }

  return crc;
});

exports.default = crc16ccitt;

},{"./create_buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js","./define_crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc16kermit.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var _create_buffer = require('./create_buffer');

var _create_buffer2 = _interopRequireDefault(_create_buffer);

var _define_crc = require('./define_crc');

var _define_crc2 = _interopRequireDefault(_define_crc);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// Generated by `./pycrc.py --algorithm=table-driven --model=kermit --generate=c`
// prettier-ignore
var TABLE = [0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78];

if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE);

var crc16kermit = (0, _define_crc2.default)('kermit', function (buf, previous) {
  if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf);

  var crc = typeof previous !== 'undefined' ? ~~previous : 0x0000;

  for (var index = 0; index < buf.length; index++) {
    var byte = buf[index];
    crc = (TABLE[(crc ^ byte) & 0xff] ^ crc >> 8) & 0xffff;
  }

  return crc;
});

exports.default = crc16kermit;

},{"./create_buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js","./define_crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc16modbus.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var _create_buffer = require('./create_buffer');

var _create_buffer2 = _interopRequireDefault(_create_buffer);

var _define_crc = require('./define_crc');

var _define_crc2 = _interopRequireDefault(_define_crc);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// Generated by `./pycrc.py --algorithm=table-driven --model=crc-16-modbus --generate=c`
// prettier-ignore
var TABLE = [0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840, 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441, 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041, 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040];

if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE);

var crc16modbus = (0, _define_crc2.default)('crc-16-modbus', function (buf, previous) {
  if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf);

  var crc = typeof previous !== 'undefined' ? ~~previous : 0xffff;

  for (var index = 0; index < buf.length; index++) {
    var byte = buf[index];
    crc = (TABLE[(crc ^ byte) & 0xff] ^ crc >> 8) & 0xffff;
  }

  return crc;
});

exports.default = crc16modbus;

},{"./create_buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js","./define_crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc16xmodem.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var _create_buffer = require('./create_buffer');

var _create_buffer2 = _interopRequireDefault(_create_buffer);

var _define_crc = require('./define_crc');

var _define_crc2 = _interopRequireDefault(_define_crc);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var crc16xmodem = (0, _define_crc2.default)('xmodem', function (buf, previous) {
  if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf);

  var crc = typeof previous !== 'undefined' ? ~~previous : 0x0;

  for (var index = 0; index < buf.length; index++) {
    var byte = buf[index];
    var code = crc >>> 8 & 0xff;

    code ^= byte & 0xff;
    code ^= code >>> 4;
    crc = crc << 8 & 0xffff;
    crc ^= code;
    code = code << 5 & 0xffff;
    crc ^= code;
    code = code << 7 & 0xffff;
    crc ^= code;
  }

  return crc;
});

exports.default = crc16xmodem;

},{"./create_buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js","./define_crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc24.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var _create_buffer = require('./create_buffer');

var _create_buffer2 = _interopRequireDefault(_create_buffer);

var _define_crc = require('./define_crc');

var _define_crc2 = _interopRequireDefault(_define_crc);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// Generated by `./pycrc.py --algorithm=table-drive --model=crc-24 --generate=c`
// prettier-ignore
var TABLE = [0x000000, 0x864cfb, 0x8ad50d, 0x0c99f6, 0x93e6e1, 0x15aa1a, 0x1933ec, 0x9f7f17, 0xa18139, 0x27cdc2, 0x2b5434, 0xad18cf, 0x3267d8, 0xb42b23, 0xb8b2d5, 0x3efe2e, 0xc54e89, 0x430272, 0x4f9b84, 0xc9d77f, 0x56a868, 0xd0e493, 0xdc7d65, 0x5a319e, 0x64cfb0, 0xe2834b, 0xee1abd, 0x685646, 0xf72951, 0x7165aa, 0x7dfc5c, 0xfbb0a7, 0x0cd1e9, 0x8a9d12, 0x8604e4, 0x00481f, 0x9f3708, 0x197bf3, 0x15e205, 0x93aefe, 0xad50d0, 0x2b1c2b, 0x2785dd, 0xa1c926, 0x3eb631, 0xb8faca, 0xb4633c, 0x322fc7, 0xc99f60, 0x4fd39b, 0x434a6d, 0xc50696, 0x5a7981, 0xdc357a, 0xd0ac8c, 0x56e077, 0x681e59, 0xee52a2, 0xe2cb54, 0x6487af, 0xfbf8b8, 0x7db443, 0x712db5, 0xf7614e, 0x19a3d2, 0x9fef29, 0x9376df, 0x153a24, 0x8a4533, 0x0c09c8, 0x00903e, 0x86dcc5, 0xb822eb, 0x3e6e10, 0x32f7e6, 0xb4bb1d, 0x2bc40a, 0xad88f1, 0xa11107, 0x275dfc, 0xdced5b, 0x5aa1a0, 0x563856, 0xd074ad, 0x4f0bba, 0xc94741, 0xc5deb7, 0x43924c, 0x7d6c62, 0xfb2099, 0xf7b96f, 0x71f594, 0xee8a83, 0x68c678, 0x645f8e, 0xe21375, 0x15723b, 0x933ec0, 0x9fa736, 0x19ebcd, 0x8694da, 0x00d821, 0x0c41d7, 0x8a0d2c, 0xb4f302, 0x32bff9, 0x3e260f, 0xb86af4, 0x2715e3, 0xa15918, 0xadc0ee, 0x2b8c15, 0xd03cb2, 0x567049, 0x5ae9bf, 0xdca544, 0x43da53, 0xc596a8, 0xc90f5e, 0x4f43a5, 0x71bd8b, 0xf7f170, 0xfb6886, 0x7d247d, 0xe25b6a, 0x641791, 0x688e67, 0xeec29c, 0x3347a4, 0xb50b5f, 0xb992a9, 0x3fde52, 0xa0a145, 0x26edbe, 0x2a7448, 0xac38b3, 0x92c69d, 0x148a66, 0x181390, 0x9e5f6b, 0x01207c, 0x876c87, 0x8bf571, 0x0db98a, 0xf6092d, 0x7045d6, 0x7cdc20, 0xfa90db, 0x65efcc, 0xe3a337, 0xef3ac1, 0x69763a, 0x578814, 0xd1c4ef, 0xdd5d19, 0x5b11e2, 0xc46ef5, 0x42220e, 0x4ebbf8, 0xc8f703, 0x3f964d, 0xb9dab6, 0xb54340, 0x330fbb, 0xac70ac, 0x2a3c57, 0x26a5a1, 0xa0e95a, 0x9e1774, 0x185b8f, 0x14c279, 0x928e82, 0x0df195, 0x8bbd6e, 0x872498, 0x016863, 0xfad8c4, 0x7c943f, 0x700dc9, 0xf64132, 0x693e25, 0xef72de, 0xe3eb28, 0x65a7d3, 0x5b59fd, 0xdd1506, 0xd18cf0, 0x57c00b, 0xc8bf1c, 0x4ef3e7, 0x426a11, 0xc426ea, 0x2ae476, 0xaca88d, 0xa0317b, 0x267d80, 0xb90297, 0x3f4e6c, 0x33d79a, 0xb59b61, 0x8b654f, 0x0d29b4, 0x01b042, 0x87fcb9, 0x1883ae, 0x9ecf55, 0x9256a3, 0x141a58, 0xefaaff, 0x69e604, 0x657ff2, 0xe33309, 0x7c4c1e, 0xfa00e5, 0xf69913, 0x70d5e8, 0x4e2bc6, 0xc8673d, 0xc4fecb, 0x42b230, 0xddcd27, 0x5b81dc, 0x57182a, 0xd154d1, 0x26359f, 0xa07964, 0xace092, 0x2aac69, 0xb5d37e, 0x339f85, 0x3f0673, 0xb94a88, 0x87b4a6, 0x01f85d, 0x0d61ab, 0x8b2d50, 0x145247, 0x921ebc, 0x9e874a, 0x18cbb1, 0xe37b16, 0x6537ed, 0x69ae1b, 0xefe2e0, 0x709df7, 0xf6d10c, 0xfa48fa, 0x7c0401, 0x42fa2f, 0xc4b6d4, 0xc82f22, 0x4e63d9, 0xd11cce, 0x575035, 0x5bc9c3, 0xdd8538];

if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE);

var crc24 = (0, _define_crc2.default)('crc-24', function (buf, previous) {
  if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf);

  var crc = typeof previous !== 'undefined' ? ~~previous : 0xb704ce;

  for (var index = 0; index < buf.length; index++) {
    var byte = buf[index];
    crc = (TABLE[(crc >> 16 ^ byte) & 0xff] ^ crc << 8) & 0xffffff;
  }

  return crc;
});

exports.default = crc24;

},{"./create_buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js","./define_crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc32.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var _create_buffer = require('./create_buffer');

var _create_buffer2 = _interopRequireDefault(_create_buffer);

var _define_crc = require('./define_crc');

var _define_crc2 = _interopRequireDefault(_define_crc);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// Generated by `./pycrc.py --algorithm=table-driven --model=crc-32 --generate=c`
// prettier-ignore
var TABLE = [0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d];

if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE);

var crc32 = (0, _define_crc2.default)('crc-32', function (buf, previous) {
  if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf);

  var crc = previous === 0 ? 0 : ~~previous ^ -1;

  for (var index = 0; index < buf.length; index++) {
    var byte = buf[index];
    crc = TABLE[(crc ^ byte) & 0xff] ^ crc >>> 8;
  }

  return crc ^ -1;
});

exports.default = crc32;

},{"./create_buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js","./define_crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc8.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var _create_buffer = require('./create_buffer');

var _create_buffer2 = _interopRequireDefault(_create_buffer);

var _define_crc = require('./define_crc');

var _define_crc2 = _interopRequireDefault(_define_crc);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// Generated by `./pycrc.py --algorithm=table-driven --model=crc-8 --generate=c`
// prettier-ignore
var TABLE = [0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, 0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d, 0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd, 0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd, 0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2, 0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea, 0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, 0xa2, 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a, 0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32, 0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a, 0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42, 0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a, 0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c, 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4, 0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec, 0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4, 0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c, 0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44, 0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c, 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34, 0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b, 0x76, 0x71, 0x78, 0x7f, 0x6a, 0x6d, 0x64, 0x63, 0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b, 0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13, 0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb, 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83, 0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, 0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3];

if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE);

var crc8 = (0, _define_crc2.default)('crc-8', function (buf, previous) {
  if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf);

  var crc = ~~previous;

  for (var index = 0; index < buf.length; index++) {
    var byte = buf[index];
    crc = TABLE[(crc ^ byte) & 0xff] & 0xff;
  }

  return crc;
});

exports.default = crc8;

},{"./create_buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js","./define_crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crc81wire.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var _create_buffer = require('./create_buffer');

var _create_buffer2 = _interopRequireDefault(_create_buffer);

var _define_crc = require('./define_crc');

var _define_crc2 = _interopRequireDefault(_define_crc);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// Generated by `./pycrc.py --algorithm=table-driven --model=dallas-1-wire --generate=c`
// prettier-ignore
var TABLE = [0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83, 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41, 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e, 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc, 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0, 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62, 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d, 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff, 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5, 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07, 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58, 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a, 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6, 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24, 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b, 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9, 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f, 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd, 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92, 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50, 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c, 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee, 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1, 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73, 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49, 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b, 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4, 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16, 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a, 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8, 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7, 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35];

if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE);

var crc81wire = (0, _define_crc2.default)('dallas-1-wire', function (buf, previous) {
  if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf);

  var crc = ~~previous;

  for (var index = 0; index < buf.length; index++) {
    var byte = buf[index];
    crc = TABLE[(crc ^ byte) & 0xff] & 0xff;
  }

  return crc;
});

exports.default = crc81wire;

},{"./create_buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js","./define_crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/crcjam.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var _create_buffer = require('./create_buffer');

var _create_buffer2 = _interopRequireDefault(_create_buffer);

var _define_crc = require('./define_crc');

var _define_crc2 = _interopRequireDefault(_define_crc);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// Generated by `./pycrc.py --algorithm=table-driven --model=jam --generate=c`
// prettier-ignore
var TABLE = [0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d];

if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE);

var crcjam = (0, _define_crc2.default)('jam', function (buf) {
  var previous = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;

  if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf);

  var crc = previous === 0 ? 0 : ~~previous;

  for (var index = 0; index < buf.length; index++) {
    var byte = buf[index];
    crc = TABLE[(crc ^ byte) & 0xff] ^ crc >>> 8;
  }

  return crc;
});

exports.default = crcjam;

},{"./create_buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js","./define_crc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/create_buffer.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _buffer = require('buffer');

var createBuffer = _buffer.Buffer.from && _buffer.Buffer.alloc && _buffer.Buffer.allocUnsafe && _buffer.Buffer.allocUnsafeSlow ? _buffer.Buffer.from : // support for Node < 5.10
function (val) {
  return new _buffer.Buffer(val);
};

exports.default = createBuffer;

},{"buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/es6/define_crc.js":[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});

exports.default = function (model, calc) {
  var fn = function fn(buf, previous) {
    return calc(buf, previous) >>> 0;
  };
  fn.signed = calc;
  fn.unsigned = fn;
  fn.model = model;

  return fn;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/index.js":[function(require,module,exports){
'use strict';

module.exports = {
  crc1: require('./crc1'),
  crc8: require('./crc8'),
  crc81wire: require('./crc8_1wire'),
  crc16: require('./crc16'),
  crc16ccitt: require('./crc16_ccitt'),
  crc16modbus: require('./crc16_modbus'),
  crc16xmodem: require('./crc16_xmodem'),
  crc16kermit: require('./crc16_kermit'),
  crc24: require('./crc24'),
  crc32: require('./crc32'),
  crcjam: require('./crcjam')
};

},{"./crc1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc1.js","./crc16":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc16.js","./crc16_ccitt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc16_ccitt.js","./crc16_kermit":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc16_kermit.js","./crc16_modbus":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc16_modbus.js","./crc16_xmodem":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc16_xmodem.js","./crc24":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc24.js","./crc32":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc32.js","./crc8":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc8.js","./crc8_1wire":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crc8_1wire.js","./crcjam":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crc/lib/crcjam.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crypt/crypt.js":[function(require,module,exports){
(function() {
  var base64map
      = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',

  crypt = {
    // Bit-wise rotation left
    rotl: function(n, b) {
      return (n << b) | (n >>> (32 - b));
    },

    // Bit-wise rotation right
    rotr: function(n, b) {
      return (n << (32 - b)) | (n >>> b);
    },

    // Swap big-endian to little-endian and vice versa
    endian: function(n) {
      // If number given, swap endian
      if (n.constructor == Number) {
        return crypt.rotl(n, 8) & 0x00FF00FF | crypt.rotl(n, 24) & 0xFF00FF00;
      }

      // Else, assume array and swap all items
      for (var i = 0; i < n.length; i++)
        n[i] = crypt.endian(n[i]);
      return n;
    },

    // Generate an array of any length of random bytes
    randomBytes: function(n) {
      for (var bytes = []; n > 0; n--)
        bytes.push(Math.floor(Math.random() * 256));
      return bytes;
    },

    // Convert a byte array to big-endian 32-bit words
    bytesToWords: function(bytes) {
      for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)
        words[b >>> 5] |= bytes[i] << (24 - b % 32);
      return words;
    },

    // Convert big-endian 32-bit words to a byte array
    wordsToBytes: function(words) {
      for (var bytes = [], b = 0; b < words.length * 32; b += 8)
        bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
      return bytes;
    },

    // Convert a byte array to a hex string
    bytesToHex: function(bytes) {
      for (var hex = [], i = 0; i < bytes.length; i++) {
        hex.push((bytes[i] >>> 4).toString(16));
        hex.push((bytes[i] & 0xF).toString(16));
      }
      return hex.join('');
    },

    // Convert a hex string to a byte array
    hexToBytes: function(hex) {
      for (var bytes = [], c = 0; c < hex.length; c += 2)
        bytes.push(parseInt(hex.substr(c, 2), 16));
      return bytes;
    },

    // Convert a byte array to a base-64 string
    bytesToBase64: function(bytes) {
      for (var base64 = [], i = 0; i < bytes.length; i += 3) {
        var triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
        for (var j = 0; j < 4; j++)
          if (i * 8 + j * 6 <= bytes.length * 8)
            base64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F));
          else
            base64.push('=');
      }
      return base64.join('');
    },

    // Convert a base-64 string to a byte array
    base64ToBytes: function(base64) {
      // Remove non-base-64 characters
      base64 = base64.replace(/[^A-Z0-9+\/]/ig, '');

      for (var bytes = [], i = 0, imod4 = 0; i < base64.length;
          imod4 = ++i % 4) {
        if (imod4 == 0) continue;
        bytes.push(((base64map.indexOf(base64.charAt(i - 1))
            & (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2))
            | (base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2)));
      }
      return bytes;
    }
  };

  module.exports = crypt;
})();

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/deep-equal/index.js":[function(require,module,exports){
var objectKeys = require('object-keys');
var isArguments = require('is-arguments');
var is = require('object-is');
var isRegex = require('is-regex');
var flags = require('regexp.prototype.flags');
var isDate = require('is-date-object');

var getTime = Date.prototype.getTime;

function deepEqual(actual, expected, options) {
  var opts = options || {};

  // 7.1. All identical values are equivalent, as determined by ===.
  if (opts.strict ? is(actual, expected) : actual === expected) {
    return true;
  }

  // 7.3. Other pairs that do not both pass typeof value == 'object', equivalence is determined by ==.
  if (!actual || !expected || (typeof actual !== 'object' && typeof expected !== 'object')) {
    return opts.strict ? is(actual, expected) : actual == expected;
  }

  /*
   * 7.4. For all other Object pairs, including Array objects, equivalence is
   * determined by having the same number of owned properties (as verified
   * with Object.prototype.hasOwnProperty.call), the same set of keys
   * (although not necessarily the same order), equivalent values for every
   * corresponding key, and an identical 'prototype' property. Note: this
   * accounts for both named and indexed properties on Arrays.
   */
  // eslint-disable-next-line no-use-before-define
  return objEquiv(actual, expected, opts);
}

function isUndefinedOrNull(value) {
  return value === null || value === undefined;
}

function isBuffer(x) {
  if (!x || typeof x !== 'object' || typeof x.length !== 'number') {
    return false;
  }
  if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
    return false;
  }
  if (x.length > 0 && typeof x[0] !== 'number') {
    return false;
  }
  return true;
}

function objEquiv(a, b, opts) {
  /* eslint max-statements: [2, 50] */
  var i, key;
  if (typeof a !== typeof b) { return false; }
  if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) { return false; }

  // an identical 'prototype' property.
  if (a.prototype !== b.prototype) { return false; }

  if (isArguments(a) !== isArguments(b)) { return false; }

  var aIsRegex = isRegex(a);
  var bIsRegex = isRegex(b);
  if (aIsRegex !== bIsRegex) { return false; }
  if (aIsRegex || bIsRegex) {
    return a.source === b.source && flags(a) === flags(b);
  }

  if (isDate(a) && isDate(b)) {
    return getTime.call(a) === getTime.call(b);
  }

  var aIsBuffer = isBuffer(a);
  var bIsBuffer = isBuffer(b);
  if (aIsBuffer !== bIsBuffer) { return false; }
  if (aIsBuffer || bIsBuffer) { // && would work too, because both are true or both false here
    if (a.length !== b.length) { return false; }
    for (i = 0; i < a.length; i++) {
      if (a[i] !== b[i]) { return false; }
    }
    return true;
  }

  if (typeof a !== typeof b) { return false; }

  try {
    var ka = objectKeys(a);
    var kb = objectKeys(b);
  } catch (e) { // happens when one is a string literal and the other isn't
    return false;
  }
  // having the same number of owned properties (keys incorporates hasOwnProperty)
  if (ka.length !== kb.length) { return false; }

  // the same set of keys (although not necessarily the same order),
  ka.sort();
  kb.sort();
  // ~~~cheap key test
  for (i = ka.length - 1; i >= 0; i--) {
    if (ka[i] != kb[i]) { return false; }
  }
  // equivalent values for every corresponding key, and ~~~possibly expensive deep test
  for (i = ka.length - 1; i >= 0; i--) {
    key = ka[i];
    if (!deepEqual(a[key], b[key], opts)) { return false; }
  }

  return true;
}

module.exports = deepEqual;

},{"is-arguments":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-arguments/index.js","is-date-object":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-date-object/index.js","is-regex":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-regex/index.js","object-is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-is/index.js","object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-keys/index.js","regexp.prototype.flags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regexp.prototype.flags/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/define-properties/index.js":[function(require,module,exports){
'use strict';

var keys = require('object-keys');
var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';

var toStr = Object.prototype.toString;
var concat = Array.prototype.concat;
var origDefineProperty = Object.defineProperty;

var isFunction = function (fn) {
	return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
};

var hasPropertyDescriptors = require('has-property-descriptors')();

var supportsDescriptors = origDefineProperty && hasPropertyDescriptors;

var defineProperty = function (object, name, value, predicate) {
	if (name in object && (!isFunction(predicate) || !predicate())) {
		return;
	}
	if (supportsDescriptors) {
		origDefineProperty(object, name, {
			configurable: true,
			enumerable: false,
			value: value,
			writable: true
		});
	} else {
		object[name] = value; // eslint-disable-line no-param-reassign
	}
};

var defineProperties = function (object, map) {
	var predicates = arguments.length > 2 ? arguments[2] : {};
	var props = keys(map);
	if (hasSymbols) {
		props = concat.call(props, Object.getOwnPropertySymbols(map));
	}
	for (var i = 0; i < props.length; i += 1) {
		defineProperty(object, props[i], map[props[i]], predicates[props[i]]);
	}
};

defineProperties.supportsDescriptors = !!supportsDescriptors;

module.exports = defineProperties;

},{"has-property-descriptors":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has-property-descriptors/index.js","object-keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-keys/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/es6-promise/dist/es6-promise.js":[function(require,module,exports){
(function (process,global){(function (){
/*!
 * @overview es6-promise - a tiny implementation of Promises/A+.
 * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
 * @license   Licensed under MIT license
 *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
 * @version   v4.2.8+1e68dce6
 */

(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
	typeof define === 'function' && define.amd ? define(factory) :
	(global.ES6Promise = factory());
}(this, (function () { 'use strict';

function objectOrFunction(x) {
  var type = typeof x;
  return x !== null && (type === 'object' || type === 'function');
}

function isFunction(x) {
  return typeof x === 'function';
}



var _isArray = void 0;
if (Array.isArray) {
  _isArray = Array.isArray;
} else {
  _isArray = function (x) {
    return Object.prototype.toString.call(x) === '[object Array]';
  };
}

var isArray = _isArray;

var len = 0;
var vertxNext = void 0;
var customSchedulerFn = void 0;

var asap = function asap(callback, arg) {
  queue[len] = callback;
  queue[len + 1] = arg;
  len += 2;
  if (len === 2) {
    // If len is 2, that means that we need to schedule an async flush.
    // If additional callbacks are queued before the queue is flushed, they
    // will be processed by this flush that we are scheduling.
    if (customSchedulerFn) {
      customSchedulerFn(flush);
    } else {
      scheduleFlush();
    }
  }
};

function setScheduler(scheduleFn) {
  customSchedulerFn = scheduleFn;
}

function setAsap(asapFn) {
  asap = asapFn;
}

var browserWindow = typeof window !== 'undefined' ? window : undefined;
var browserGlobal = browserWindow || {};
var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';

// test for web worker but not in IE10
var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';

// node
function useNextTick() {
  // node version 0.10.x displays a deprecation warning when nextTick is used recursively
  // see https://github.com/cujojs/when/issues/410 for details
  return function () {
    return process.nextTick(flush);
  };
}

// vertx
function useVertxTimer() {
  if (typeof vertxNext !== 'undefined') {
    return function () {
      vertxNext(flush);
    };
  }

  return useSetTimeout();
}

function useMutationObserver() {
  var iterations = 0;
  var observer = new BrowserMutationObserver(flush);
  var node = document.createTextNode('');
  observer.observe(node, { characterData: true });

  return function () {
    node.data = iterations = ++iterations % 2;
  };
}

// web worker
function useMessageChannel() {
  var channel = new MessageChannel();
  channel.port1.onmessage = flush;
  return function () {
    return channel.port2.postMessage(0);
  };
}

function useSetTimeout() {
  // Store setTimeout reference so es6-promise will be unaffected by
  // other code modifying setTimeout (like sinon.useFakeTimers())
  var globalSetTimeout = setTimeout;
  return function () {
    return globalSetTimeout(flush, 1);
  };
}

var queue = new Array(1000);
function flush() {
  for (var i = 0; i < len; i += 2) {
    var callback = queue[i];
    var arg = queue[i + 1];

    callback(arg);

    queue[i] = undefined;
    queue[i + 1] = undefined;
  }

  len = 0;
}

function attemptVertx() {
  try {
    var vertx = Function('return this')().require('vertx');
    vertxNext = vertx.runOnLoop || vertx.runOnContext;
    return useVertxTimer();
  } catch (e) {
    return useSetTimeout();
  }
}

var scheduleFlush = void 0;
// Decide what async method to use to triggering processing of queued callbacks:
if (isNode) {
  scheduleFlush = useNextTick();
} else if (BrowserMutationObserver) {
  scheduleFlush = useMutationObserver();
} else if (isWorker) {
  scheduleFlush = useMessageChannel();
} else if (browserWindow === undefined && typeof require === 'function') {
  scheduleFlush = attemptVertx();
} else {
  scheduleFlush = useSetTimeout();
}

function then(onFulfillment, onRejection) {
  var parent = this;

  var child = new this.constructor(noop);

  if (child[PROMISE_ID] === undefined) {
    makePromise(child);
  }

  var _state = parent._state;


  if (_state) {
    var callback = arguments[_state - 1];
    asap(function () {
      return invokeCallback(_state, child, callback, parent._result);
    });
  } else {
    subscribe(parent, child, onFulfillment, onRejection);
  }

  return child;
}

/**
  `Promise.resolve` returns a promise that will become resolved with the
  passed `value`. It is shorthand for the following:

  ```javascript
  let promise = new Promise(function(resolve, reject){
    resolve(1);
  });

  promise.then(function(value){
    // value === 1
  });
  ```

  Instead of writing the above, your code now simply becomes the following:

  ```javascript
  let promise = Promise.resolve(1);

  promise.then(function(value){
    // value === 1
  });
  ```

  @method resolve
  @static
  @param {Any} value value that the returned promise will be resolved with
  Useful for tooling.
  @return {Promise} a promise that will become fulfilled with the given
  `value`
*/
function resolve$1(object) {
  /*jshint validthis:true */
  var Constructor = this;

  if (object && typeof object === 'object' && object.constructor === Constructor) {
    return object;
  }

  var promise = new Constructor(noop);
  resolve(promise, object);
  return promise;
}

var PROMISE_ID = Math.random().toString(36).substring(2);

function noop() {}

var PENDING = void 0;
var FULFILLED = 1;
var REJECTED = 2;

function selfFulfillment() {
  return new TypeError("You cannot resolve a promise with itself");
}

function cannotReturnOwn() {
  return new TypeError('A promises callback cannot return that same promise.');
}

function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {
  try {
    then$$1.call(value, fulfillmentHandler, rejectionHandler);
  } catch (e) {
    return e;
  }
}

function handleForeignThenable(promise, thenable, then$$1) {
  asap(function (promise) {
    var sealed = false;
    var error = tryThen(then$$1, thenable, function (value) {
      if (sealed) {
        return;
      }
      sealed = true;
      if (thenable !== value) {
        resolve(promise, value);
      } else {
        fulfill(promise, value);
      }
    }, function (reason) {
      if (sealed) {
        return;
      }
      sealed = true;

      reject(promise, reason);
    }, 'Settle: ' + (promise._label || ' unknown promise'));

    if (!sealed && error) {
      sealed = true;
      reject(promise, error);
    }
  }, promise);
}

function handleOwnThenable(promise, thenable) {
  if (thenable._state === FULFILLED) {
    fulfill(promise, thenable._result);
  } else if (thenable._state === REJECTED) {
    reject(promise, thenable._result);
  } else {
    subscribe(thenable, undefined, function (value) {
      return resolve(promise, value);
    }, function (reason) {
      return reject(promise, reason);
    });
  }
}

function handleMaybeThenable(promise, maybeThenable, then$$1) {
  if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {
    handleOwnThenable(promise, maybeThenable);
  } else {
    if (then$$1 === undefined) {
      fulfill(promise, maybeThenable);
    } else if (isFunction(then$$1)) {
      handleForeignThenable(promise, maybeThenable, then$$1);
    } else {
      fulfill(promise, maybeThenable);
    }
  }
}

function resolve(promise, value) {
  if (promise === value) {
    reject(promise, selfFulfillment());
  } else if (objectOrFunction(value)) {
    var then$$1 = void 0;
    try {
      then$$1 = value.then;
    } catch (error) {
      reject(promise, error);
      return;
    }
    handleMaybeThenable(promise, value, then$$1);
  } else {
    fulfill(promise, value);
  }
}

function publishRejection(promise) {
  if (promise._onerror) {
    promise._onerror(promise._result);
  }

  publish(promise);
}

function fulfill(promise, value) {
  if (promise._state !== PENDING) {
    return;
  }

  promise._result = value;
  promise._state = FULFILLED;

  if (promise._subscribers.length !== 0) {
    asap(publish, promise);
  }
}

function reject(promise, reason) {
  if (promise._state !== PENDING) {
    return;
  }
  promise._state = REJECTED;
  promise._result = reason;

  asap(publishRejection, promise);
}

function subscribe(parent, child, onFulfillment, onRejection) {
  var _subscribers = parent._subscribers;
  var length = _subscribers.length;


  parent._onerror = null;

  _subscribers[length] = child;
  _subscribers[length + FULFILLED] = onFulfillment;
  _subscribers[length + REJECTED] = onRejection;

  if (length === 0 && parent._state) {
    asap(publish, parent);
  }
}

function publish(promise) {
  var subscribers = promise._subscribers;
  var settled = promise._state;

  if (subscribers.length === 0) {
    return;
  }

  var child = void 0,
      callback = void 0,
      detail = promise._result;

  for (var i = 0; i < subscribers.length; i += 3) {
    child = subscribers[i];
    callback = subscribers[i + settled];

    if (child) {
      invokeCallback(settled, child, callback, detail);
    } else {
      callback(detail);
    }
  }

  promise._subscribers.length = 0;
}

function invokeCallback(settled, promise, callback, detail) {
  var hasCallback = isFunction(callback),
      value = void 0,
      error = void 0,
      succeeded = true;

  if (hasCallback) {
    try {
      value = callback(detail);
    } catch (e) {
      succeeded = false;
      error = e;
    }

    if (promise === value) {
      reject(promise, cannotReturnOwn());
      return;
    }
  } else {
    value = detail;
  }

  if (promise._state !== PENDING) {
    // noop
  } else if (hasCallback && succeeded) {
    resolve(promise, value);
  } else if (succeeded === false) {
    reject(promise, error);
  } else if (settled === FULFILLED) {
    fulfill(promise, value);
  } else if (settled === REJECTED) {
    reject(promise, value);
  }
}

function initializePromise(promise, resolver) {
  try {
    resolver(function resolvePromise(value) {
      resolve(promise, value);
    }, function rejectPromise(reason) {
      reject(promise, reason);
    });
  } catch (e) {
    reject(promise, e);
  }
}

var id = 0;
function nextId() {
  return id++;
}

function makePromise(promise) {
  promise[PROMISE_ID] = id++;
  promise._state = undefined;
  promise._result = undefined;
  promise._subscribers = [];
}

function validationError() {
  return new Error('Array Methods must be provided an Array');
}

var Enumerator = function () {
  function Enumerator(Constructor, input) {
    this._instanceConstructor = Constructor;
    this.promise = new Constructor(noop);

    if (!this.promise[PROMISE_ID]) {
      makePromise(this.promise);
    }

    if (isArray(input)) {
      this.length = input.length;
      this._remaining = input.length;

      this._result = new Array(this.length);

      if (this.length === 0) {
        fulfill(this.promise, this._result);
      } else {
        this.length = this.length || 0;
        this._enumerate(input);
        if (this._remaining === 0) {
          fulfill(this.promise, this._result);
        }
      }
    } else {
      reject(this.promise, validationError());
    }
  }

  Enumerator.prototype._enumerate = function _enumerate(input) {
    for (var i = 0; this._state === PENDING && i < input.length; i++) {
      this._eachEntry(input[i], i);
    }
  };

  Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {
    var c = this._instanceConstructor;
    var resolve$$1 = c.resolve;


    if (resolve$$1 === resolve$1) {
      var _then = void 0;
      var error = void 0;
      var didError = false;
      try {
        _then = entry.then;
      } catch (e) {
        didError = true;
        error = e;
      }

      if (_then === then && entry._state !== PENDING) {
        this._settledAt(entry._state, i, entry._result);
      } else if (typeof _then !== 'function') {
        this._remaining--;
        this._result[i] = entry;
      } else if (c === Promise$1) {
        var promise = new c(noop);
        if (didError) {
          reject(promise, error);
        } else {
          handleMaybeThenable(promise, entry, _then);
        }
        this._willSettleAt(promise, i);
      } else {
        this._willSettleAt(new c(function (resolve$$1) {
          return resolve$$1(entry);
        }), i);
      }
    } else {
      this._willSettleAt(resolve$$1(entry), i);
    }
  };

  Enumerator.prototype._settledAt = function _settledAt(state, i, value) {
    var promise = this.promise;


    if (promise._state === PENDING) {
      this._remaining--;

      if (state === REJECTED) {
        reject(promise, value);
      } else {
        this._result[i] = value;
      }
    }

    if (this._remaining === 0) {
      fulfill(promise, this._result);
    }
  };

  Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {
    var enumerator = this;

    subscribe(promise, undefined, function (value) {
      return enumerator._settledAt(FULFILLED, i, value);
    }, function (reason) {
      return enumerator._settledAt(REJECTED, i, reason);
    });
  };

  return Enumerator;
}();

/**
  `Promise.all` accepts an array of promises, and returns a new promise which
  is fulfilled with an array of fulfillment values for the passed promises, or
  rejected with the reason of the first passed promise to be rejected. It casts all
  elements of the passed iterable to promises as it runs this algorithm.

  Example:

  ```javascript
  let promise1 = resolve(1);
  let promise2 = resolve(2);
  let promise3 = resolve(3);
  let promises = [ promise1, promise2, promise3 ];

  Promise.all(promises).then(function(array){
    // The array here would be [ 1, 2, 3 ];
  });
  ```

  If any of the `promises` given to `all` are rejected, the first promise
  that is rejected will be given as an argument to the returned promises's
  rejection handler. For example:

  Example:

  ```javascript
  let promise1 = resolve(1);
  let promise2 = reject(new Error("2"));
  let promise3 = reject(new Error("3"));
  let promises = [ promise1, promise2, promise3 ];

  Promise.all(promises).then(function(array){
    // Code here never runs because there are rejected promises!
  }, function(error) {
    // error.message === "2"
  });
  ```

  @method all
  @static
  @param {Array} entries array of promises
  @param {String} label optional string for labeling the promise.
  Useful for tooling.
  @return {Promise} promise that is fulfilled when all `promises` have been
  fulfilled, or rejected if any of them become rejected.
  @static
*/
function all(entries) {
  return new Enumerator(this, entries).promise;
}

/**
  `Promise.race` returns a new promise which is settled in the same way as the
  first passed promise to settle.

  Example:

  ```javascript
  let promise1 = new Promise(function(resolve, reject){
    setTimeout(function(){
      resolve('promise 1');
    }, 200);
  });

  let promise2 = new Promise(function(resolve, reject){
    setTimeout(function(){
      resolve('promise 2');
    }, 100);
  });

  Promise.race([promise1, promise2]).then(function(result){
    // result === 'promise 2' because it was resolved before promise1
    // was resolved.
  });
  ```

  `Promise.race` is deterministic in that only the state of the first
  settled promise matters. For example, even if other promises given to the
  `promises` array argument are resolved, but the first settled promise has
  become rejected before the other promises became fulfilled, the returned
  promise will become rejected:

  ```javascript
  let promise1 = new Promise(function(resolve, reject){
    setTimeout(function(){
      resolve('promise 1');
    }, 200);
  });

  let promise2 = new Promise(function(resolve, reject){
    setTimeout(function(){
      reject(new Error('promise 2'));
    }, 100);
  });

  Promise.race([promise1, promise2]).then(function(result){
    // Code here never runs
  }, function(reason){
    // reason.message === 'promise 2' because promise 2 became rejected before
    // promise 1 became fulfilled
  });
  ```

  An example real-world use case is implementing timeouts:

  ```javascript
  Promise.race([ajax('foo.json'), timeout(5000)])
  ```

  @method race
  @static
  @param {Array} promises array of promises to observe
  Useful for tooling.
  @return {Promise} a promise which settles in the same way as the first passed
  promise to settle.
*/
function race(entries) {
  /*jshint validthis:true */
  var Constructor = this;

  if (!isArray(entries)) {
    return new Constructor(function (_, reject) {
      return reject(new TypeError('You must pass an array to race.'));
    });
  } else {
    return new Constructor(function (resolve, reject) {
      var length = entries.length;
      for (var i = 0; i < length; i++) {
        Constructor.resolve(entries[i]).then(resolve, reject);
      }
    });
  }
}

/**
  `Promise.reject` returns a promise rejected with the passed `reason`.
  It is shorthand for the following:

  ```javascript
  let promise = new Promise(function(resolve, reject){
    reject(new Error('WHOOPS'));
  });

  promise.then(function(value){
    // Code here doesn't run because the promise is rejected!
  }, function(reason){
    // reason.message === 'WHOOPS'
  });
  ```

  Instead of writing the above, your code now simply becomes the following:

  ```javascript
  let promise = Promise.reject(new Error('WHOOPS'));

  promise.then(function(value){
    // Code here doesn't run because the promise is rejected!
  }, function(reason){
    // reason.message === 'WHOOPS'
  });
  ```

  @method reject
  @static
  @param {Any} reason value that the returned promise will be rejected with.
  Useful for tooling.
  @return {Promise} a promise rejected with the given `reason`.
*/
function reject$1(reason) {
  /*jshint validthis:true */
  var Constructor = this;
  var promise = new Constructor(noop);
  reject(promise, reason);
  return promise;
}

function needsResolver() {
  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
}

function needsNew() {
  throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
}

/**
  Promise objects represent the eventual result of an asynchronous operation. The
  primary way of interacting with a promise is through its `then` method, which
  registers callbacks to receive either a promise's eventual value or the reason
  why the promise cannot be fulfilled.

  Terminology
  -----------

  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
  - `thenable` is an object or function that defines a `then` method.
  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
  - `exception` is a value that is thrown using the throw statement.
  - `reason` is a value that indicates why a promise was rejected.
  - `settled` the final resting state of a promise, fulfilled or rejected.

  A promise can be in one of three states: pending, fulfilled, or rejected.

  Promises that are fulfilled have a fulfillment value and are in the fulfilled
  state.  Promises that are rejected have a rejection reason and are in the
  rejected state.  A fulfillment value is never a thenable.

  Promises can also be said to *resolve* a value.  If this value is also a
  promise, then the original promise's settled state will match the value's
  settled state.  So a promise that *resolves* a promise that rejects will
  itself reject, and a promise that *resolves* a promise that fulfills will
  itself fulfill.


  Basic Usage:
  ------------

  ```js
  let promise = new Promise(function(resolve, reject) {
    // on success
    resolve(value);

    // on failure
    reject(reason);
  });

  promise.then(function(value) {
    // on fulfillment
  }, function(reason) {
    // on rejection
  });
  ```

  Advanced Usage:
  ---------------

  Promises shine when abstracting away asynchronous interactions such as
  `XMLHttpRequest`s.

  ```js
  function getJSON(url) {
    return new Promise(function(resolve, reject){
      let xhr = new XMLHttpRequest();

      xhr.open('GET', url);
      xhr.onreadystatechange = handler;
      xhr.responseType = 'json';
      xhr.setRequestHeader('Accept', 'application/json');
      xhr.send();

      function handler() {
        if (this.readyState === this.DONE) {
          if (this.status === 200) {
            resolve(this.response);
          } else {
            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
          }
        }
      };
    });
  }

  getJSON('/posts.json').then(function(json) {
    // on fulfillment
  }, function(reason) {
    // on rejection
  });
  ```

  Unlike callbacks, promises are great composable primitives.

  ```js
  Promise.all([
    getJSON('/posts'),
    getJSON('/comments')
  ]).then(function(values){
    values[0] // => postsJSON
    values[1] // => commentsJSON

    return values;
  });
  ```

  @class Promise
  @param {Function} resolver
  Useful for tooling.
  @constructor
*/

var Promise$1 = function () {
  function Promise(resolver) {
    this[PROMISE_ID] = nextId();
    this._result = this._state = undefined;
    this._subscribers = [];

    if (noop !== resolver) {
      typeof resolver !== 'function' && needsResolver();
      this instanceof Promise ? initializePromise(this, resolver) : needsNew();
    }
  }

  /**
  The primary way of interacting with a promise is through its `then` method,
  which registers callbacks to receive either a promise's eventual value or the
  reason why the promise cannot be fulfilled.
   ```js
  findUser().then(function(user){
    // user is available
  }, function(reason){
    // user is unavailable, and you are given the reason why
  });
  ```
   Chaining
  --------
   The return value of `then` is itself a promise.  This second, 'downstream'
  promise is resolved with the return value of the first promise's fulfillment
  or rejection handler, or rejected if the handler throws an exception.
   ```js
  findUser().then(function (user) {
    return user.name;
  }, function (reason) {
    return 'default name';
  }).then(function (userName) {
    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
    // will be `'default name'`
  });
   findUser().then(function (user) {
    throw new Error('Found user, but still unhappy');
  }, function (reason) {
    throw new Error('`findUser` rejected and we're unhappy');
  }).then(function (value) {
    // never reached
  }, function (reason) {
    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
  });
  ```
  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
   ```js
  findUser().then(function (user) {
    throw new PedagogicalException('Upstream error');
  }).then(function (value) {
    // never reached
  }).then(function (value) {
    // never reached
  }, function (reason) {
    // The `PedgagocialException` is propagated all the way down to here
  });
  ```
   Assimilation
  ------------
   Sometimes the value you want to propagate to a downstream promise can only be
  retrieved asynchronously. This can be achieved by returning a promise in the
  fulfillment or rejection handler. The downstream promise will then be pending
  until the returned promise is settled. This is called *assimilation*.
   ```js
  findUser().then(function (user) {
    return findCommentsByAuthor(user);
  }).then(function (comments) {
    // The user's comments are now available
  });
  ```
   If the assimliated promise rejects, then the downstream promise will also reject.
   ```js
  findUser().then(function (user) {
    return findCommentsByAuthor(user);
  }).then(function (comments) {
    // If `findCommentsByAuthor` fulfills, we'll have the value here
  }, function (reason) {
    // If `findCommentsByAuthor` rejects, we'll have the reason here
  });
  ```
   Simple Example
  --------------
   Synchronous Example
   ```javascript
  let result;
   try {
    result = findResult();
    // success
  } catch(reason) {
    // failure
  }
  ```
   Errback Example
   ```js
  findResult(function(result, err){
    if (err) {
      // failure
    } else {
      // success
    }
  });
  ```
   Promise Example;
   ```javascript
  findResult().then(function(result){
    // success
  }, function(reason){
    // failure
  });
  ```
   Advanced Example
  --------------
   Synchronous Example
   ```javascript
  let author, books;
   try {
    author = findAuthor();
    books  = findBooksByAuthor(author);
    // success
  } catch(reason) {
    // failure
  }
  ```
   Errback Example
   ```js
   function foundBooks(books) {
   }
   function failure(reason) {
   }
   findAuthor(function(author, err){
    if (err) {
      failure(err);
      // failure
    } else {
      try {
        findBoooksByAuthor(author, function(books, err) {
          if (err) {
            failure(err);
          } else {
            try {
              foundBooks(books);
            } catch(reason) {
              failure(reason);
            }
          }
        });
      } catch(error) {
        failure(err);
      }
      // success
    }
  });
  ```
   Promise Example;
   ```javascript
  findAuthor().
    then(findBooksByAuthor).
    then(function(books){
      // found books
  }).catch(function(reason){
    // something went wrong
  });
  ```
   @method then
  @param {Function} onFulfilled
  @param {Function} onRejected
  Useful for tooling.
  @return {Promise}
  */

  /**
  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
  as the catch block of a try/catch statement.
  ```js
  function findAuthor(){
  throw new Error('couldn't find that author');
  }
  // synchronous
  try {
  findAuthor();
  } catch(reason) {
  // something went wrong
  }
  // async with promises
  findAuthor().catch(function(reason){
  // something went wrong
  });
  ```
  @method catch
  @param {Function} onRejection
  Useful for tooling.
  @return {Promise}
  */


  Promise.prototype.catch = function _catch(onRejection) {
    return this.then(null, onRejection);
  };

  /**
    `finally` will be invoked regardless of the promise's fate just as native
    try/catch/finally behaves
  
    Synchronous example:
  
    ```js
    findAuthor() {
      if (Math.random() > 0.5) {
        throw new Error();
      }
      return new Author();
    }
  
    try {
      return findAuthor(); // succeed or fail
    } catch(error) {
      return findOtherAuther();
    } finally {
      // always runs
      // doesn't affect the return value
    }
    ```
  
    Asynchronous example:
  
    ```js
    findAuthor().catch(function(reason){
      return findOtherAuther();
    }).finally(function(){
      // author was either found, or not
    });
    ```
  
    @method finally
    @param {Function} callback
    @return {Promise}
  */


  Promise.prototype.finally = function _finally(callback) {
    var promise = this;
    var constructor = promise.constructor;

    if (isFunction(callback)) {
      return promise.then(function (value) {
        return constructor.resolve(callback()).then(function () {
          return value;
        });
      }, function (reason) {
        return constructor.resolve(callback()).then(function () {
          throw reason;
        });
      });
    }

    return promise.then(callback, callback);
  };

  return Promise;
}();

Promise$1.prototype.then = then;
Promise$1.all = all;
Promise$1.race = race;
Promise$1.resolve = resolve$1;
Promise$1.reject = reject$1;
Promise$1._setScheduler = setScheduler;
Promise$1._setAsap = setAsap;
Promise$1._asap = asap;

/*global self*/
function polyfill() {
  var local = void 0;

  if (typeof global !== 'undefined') {
    local = global;
  } else if (typeof self !== 'undefined') {
    local = self;
  } else {
    try {
      local = Function('return this')();
    } catch (e) {
      throw new Error('polyfill failed because global object is unavailable in this environment');
    }
  }

  var P = local.Promise;

  if (P) {
    var promiseToString = null;
    try {
      promiseToString = Object.prototype.toString.call(P.resolve());
    } catch (e) {
      // silently ignored
    }

    if (promiseToString === '[object Promise]' && !P.cast) {
      return;
    }
  }

  local.Promise = Promise$1;
}

// Strange compat..
Promise$1.polyfill = polyfill;
Promise$1.Promise = Promise$1;

return Promise$1;

})));





}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/esutils/lib/ast.js":[function(require,module,exports){
/*
  Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com>

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

(function () {
    'use strict';

    function isExpression(node) {
        if (node == null) { return false; }
        switch (node.type) {
            case 'ArrayExpression':
            case 'AssignmentExpression':
            case 'BinaryExpression':
            case 'CallExpression':
            case 'ConditionalExpression':
            case 'FunctionExpression':
            case 'Identifier':
            case 'Literal':
            case 'LogicalExpression':
            case 'MemberExpression':
            case 'NewExpression':
            case 'ObjectExpression':
            case 'SequenceExpression':
            case 'ThisExpression':
            case 'UnaryExpression':
            case 'UpdateExpression':
                return true;
        }
        return false;
    }

    function isIterationStatement(node) {
        if (node == null) { return false; }
        switch (node.type) {
            case 'DoWhileStatement':
            case 'ForInStatement':
            case 'ForStatement':
            case 'WhileStatement':
                return true;
        }
        return false;
    }

    function isStatement(node) {
        if (node == null) { return false; }
        switch (node.type) {
            case 'BlockStatement':
            case 'BreakStatement':
            case 'ContinueStatement':
            case 'DebuggerStatement':
            case 'DoWhileStatement':
            case 'EmptyStatement':
            case 'ExpressionStatement':
            case 'ForInStatement':
            case 'ForStatement':
            case 'IfStatement':
            case 'LabeledStatement':
            case 'ReturnStatement':
            case 'SwitchStatement':
            case 'ThrowStatement':
            case 'TryStatement':
            case 'VariableDeclaration':
            case 'WhileStatement':
            case 'WithStatement':
                return true;
        }
        return false;
    }

    function isSourceElement(node) {
      return isStatement(node) || node != null && node.type === 'FunctionDeclaration';
    }

    function trailingStatement(node) {
        switch (node.type) {
        case 'IfStatement':
            if (node.alternate != null) {
                return node.alternate;
            }
            return node.consequent;

        case 'LabeledStatement':
        case 'ForStatement':
        case 'ForInStatement':
        case 'WhileStatement':
        case 'WithStatement':
            return node.body;
        }
        return null;
    }

    function isProblematicIfStatement(node) {
        var current;

        if (node.type !== 'IfStatement') {
            return false;
        }
        if (node.alternate == null) {
            return false;
        }
        current = node.consequent;
        do {
            if (current.type === 'IfStatement') {
                if (current.alternate == null)  {
                    return true;
                }
            }
            current = trailingStatement(current);
        } while (current);

        return false;
    }

    module.exports = {
        isExpression: isExpression,
        isStatement: isStatement,
        isIterationStatement: isIterationStatement,
        isSourceElement: isSourceElement,
        isProblematicIfStatement: isProblematicIfStatement,

        trailingStatement: trailingStatement
    };
}());
/* vim: set sw=4 ts=4 et tw=80 : */

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/esutils/lib/code.js":[function(require,module,exports){
/*
  Copyright (C) 2013-2014 Yusuke Suzuki <utatane.tea@gmail.com>
  Copyright (C) 2014 Ivan Nikulin <ifaaan@gmail.com>

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

(function () {
    'use strict';

    var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch;

    // See `tools/generate-identifier-regex.js`.
    ES5Regex = {
        // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierStart:
        NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,
        // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierPart:
        NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/
    };

    ES6Regex = {
        // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierStart:
        NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
        // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierPart:
        NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
    };

    function isDecimalDigit(ch) {
        return 0x30 <= ch && ch <= 0x39;  // 0..9
    }

    function isHexDigit(ch) {
        return 0x30 <= ch && ch <= 0x39 ||  // 0..9
            0x61 <= ch && ch <= 0x66 ||     // a..f
            0x41 <= ch && ch <= 0x46;       // A..F
    }

    function isOctalDigit(ch) {
        return ch >= 0x30 && ch <= 0x37;  // 0..7
    }

    // 7.2 White Space

    NON_ASCII_WHITESPACES = [
        0x1680,
        0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A,
        0x202F, 0x205F,
        0x3000,
        0xFEFF
    ];

    function isWhiteSpace(ch) {
        return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 ||
            ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0;
    }

    // 7.3 Line Terminators

    function isLineTerminator(ch) {
        return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;
    }

    // 7.6 Identifier Names and Identifiers

    function fromCodePoint(cp) {
        if (cp <= 0xFFFF) { return String.fromCharCode(cp); }
        var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800);
        var cu2 = String.fromCharCode(((cp - 0x10000) % 0x400) + 0xDC00);
        return cu1 + cu2;
    }

    IDENTIFIER_START = new Array(0x80);
    for(ch = 0; ch < 0x80; ++ch) {
        IDENTIFIER_START[ch] =
            ch >= 0x61 && ch <= 0x7A ||  // a..z
            ch >= 0x41 && ch <= 0x5A ||  // A..Z
            ch === 0x24 || ch === 0x5F;  // $ (dollar) and _ (underscore)
    }

    IDENTIFIER_PART = new Array(0x80);
    for(ch = 0; ch < 0x80; ++ch) {
        IDENTIFIER_PART[ch] =
            ch >= 0x61 && ch <= 0x7A ||  // a..z
            ch >= 0x41 && ch <= 0x5A ||  // A..Z
            ch >= 0x30 && ch <= 0x39 ||  // 0..9
            ch === 0x24 || ch === 0x5F;  // $ (dollar) and _ (underscore)
    }

    function isIdentifierStartES5(ch) {
        return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
    }

    function isIdentifierPartES5(ch) {
        return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
    }

    function isIdentifierStartES6(ch) {
        return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
    }

    function isIdentifierPartES6(ch) {
        return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
    }

    module.exports = {
        isDecimalDigit: isDecimalDigit,
        isHexDigit: isHexDigit,
        isOctalDigit: isOctalDigit,
        isWhiteSpace: isWhiteSpace,
        isLineTerminator: isLineTerminator,
        isIdentifierStartES5: isIdentifierStartES5,
        isIdentifierPartES5: isIdentifierPartES5,
        isIdentifierStartES6: isIdentifierStartES6,
        isIdentifierPartES6: isIdentifierPartES6
    };
}());
/* vim: set sw=4 ts=4 et tw=80 : */

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/esutils/lib/keyword.js":[function(require,module,exports){
/*
  Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com>

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

(function () {
    'use strict';

    var code = require('./code');

    function isStrictModeReservedWordES6(id) {
        switch (id) {
        case 'implements':
        case 'interface':
        case 'package':
        case 'private':
        case 'protected':
        case 'public':
        case 'static':
        case 'let':
            return true;
        default:
            return false;
        }
    }

    function isKeywordES5(id, strict) {
        // yield should not be treated as keyword under non-strict mode.
        if (!strict && id === 'yield') {
            return false;
        }
        return isKeywordES6(id, strict);
    }

    function isKeywordES6(id, strict) {
        if (strict && isStrictModeReservedWordES6(id)) {
            return true;
        }

        switch (id.length) {
        case 2:
            return (id === 'if') || (id === 'in') || (id === 'do');
        case 3:
            return (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try');
        case 4:
            return (id === 'this') || (id === 'else') || (id === 'case') ||
                (id === 'void') || (id === 'with') || (id === 'enum');
        case 5:
            return (id === 'while') || (id === 'break') || (id === 'catch') ||
                (id === 'throw') || (id === 'const') || (id === 'yield') ||
                (id === 'class') || (id === 'super');
        case 6:
            return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
                (id === 'switch') || (id === 'export') || (id === 'import');
        case 7:
            return (id === 'default') || (id === 'finally') || (id === 'extends');
        case 8:
            return (id === 'function') || (id === 'continue') || (id === 'debugger');
        case 10:
            return (id === 'instanceof');
        default:
            return false;
        }
    }

    function isReservedWordES5(id, strict) {
        return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict);
    }

    function isReservedWordES6(id, strict) {
        return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict);
    }

    function isRestrictedWord(id) {
        return id === 'eval' || id === 'arguments';
    }

    function isIdentifierNameES5(id) {
        var i, iz, ch;

        if (id.length === 0) { return false; }

        ch = id.charCodeAt(0);
        if (!code.isIdentifierStartES5(ch)) {
            return false;
        }

        for (i = 1, iz = id.length; i < iz; ++i) {
            ch = id.charCodeAt(i);
            if (!code.isIdentifierPartES5(ch)) {
                return false;
            }
        }
        return true;
    }

    function decodeUtf16(lead, trail) {
        return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
    }

    function isIdentifierNameES6(id) {
        var i, iz, ch, lowCh, check;

        if (id.length === 0) { return false; }

        check = code.isIdentifierStartES6;
        for (i = 0, iz = id.length; i < iz; ++i) {
            ch = id.charCodeAt(i);
            if (0xD800 <= ch && ch <= 0xDBFF) {
                ++i;
                if (i >= iz) { return false; }
                lowCh = id.charCodeAt(i);
                if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) {
                    return false;
                }
                ch = decodeUtf16(ch, lowCh);
            }
            if (!check(ch)) {
                return false;
            }
            check = code.isIdentifierPartES6;
        }
        return true;
    }

    function isIdentifierES5(id, strict) {
        return isIdentifierNameES5(id) && !isReservedWordES5(id, strict);
    }

    function isIdentifierES6(id, strict) {
        return isIdentifierNameES6(id) && !isReservedWordES6(id, strict);
    }

    module.exports = {
        isKeywordES5: isKeywordES5,
        isKeywordES6: isKeywordES6,
        isReservedWordES5: isReservedWordES5,
        isReservedWordES6: isReservedWordES6,
        isRestrictedWord: isRestrictedWord,
        isIdentifierNameES5: isIdentifierNameES5,
        isIdentifierNameES6: isIdentifierNameES6,
        isIdentifierES5: isIdentifierES5,
        isIdentifierES6: isIdentifierES6
    };
}());
/* vim: set sw=4 ts=4 et tw=80 : */

},{"./code":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/esutils/lib/code.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/esutils/lib/utils.js":[function(require,module,exports){
/*
  Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com>

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/


(function () {
    'use strict';

    exports.ast = require('./ast');
    exports.code = require('./code');
    exports.keyword = require('./keyword');
}());
/* vim: set sw=4 ts=4 et tw=80 : */

},{"./ast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/esutils/lib/ast.js","./code":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/esutils/lib/code.js","./keyword":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/esutils/lib/keyword.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js":[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var objectCreate = Object.create || objectCreatePolyfill
var objectKeys = Object.keys || objectKeysPolyfill
var bind = Function.prototype.bind || functionBindPolyfill

function EventEmitter() {
  if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) {
    this._events = objectCreate(null);
    this._eventsCount = 0;
  }

  this._maxListeners = this._maxListeners || undefined;
}
module.exports = EventEmitter;

// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;

EventEmitter.prototype._events = undefined;
EventEmitter.prototype._maxListeners = undefined;

// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
var defaultMaxListeners = 10;

var hasDefineProperty;
try {
  var o = {};
  if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 });
  hasDefineProperty = o.x === 0;
} catch (err) { hasDefineProperty = false }
if (hasDefineProperty) {
  Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
    enumerable: true,
    get: function() {
      return defaultMaxListeners;
    },
    set: function(arg) {
      // check whether the input is a positive number (whose value is zero or
      // greater and not a NaN).
      if (typeof arg !== 'number' || arg < 0 || arg !== arg)
        throw new TypeError('"defaultMaxListeners" must be a positive number');
      defaultMaxListeners = arg;
    }
  });
} else {
  EventEmitter.defaultMaxListeners = defaultMaxListeners;
}

// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
  if (typeof n !== 'number' || n < 0 || isNaN(n))
    throw new TypeError('"n" argument must be a positive number');
  this._maxListeners = n;
  return this;
};

function $getMaxListeners(that) {
  if (that._maxListeners === undefined)
    return EventEmitter.defaultMaxListeners;
  return that._maxListeners;
}

EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
  return $getMaxListeners(this);
};

// These standalone emit* functions are used to optimize calling of event
// handlers for fast cases because emit() itself often has a variable number of
// arguments and can be deoptimized because of that. These functions always have
// the same number of arguments and thus do not get deoptimized, so the code
// inside them can execute faster.
function emitNone(handler, isFn, self) {
  if (isFn)
    handler.call(self);
  else {
    var len = handler.length;
    var listeners = arrayClone(handler, len);
    for (var i = 0; i < len; ++i)
      listeners[i].call(self);
  }
}
function emitOne(handler, isFn, self, arg1) {
  if (isFn)
    handler.call(self, arg1);
  else {
    var len = handler.length;
    var listeners = arrayClone(handler, len);
    for (var i = 0; i < len; ++i)
      listeners[i].call(self, arg1);
  }
}
function emitTwo(handler, isFn, self, arg1, arg2) {
  if (isFn)
    handler.call(self, arg1, arg2);
  else {
    var len = handler.length;
    var listeners = arrayClone(handler, len);
    for (var i = 0; i < len; ++i)
      listeners[i].call(self, arg1, arg2);
  }
}
function emitThree(handler, isFn, self, arg1, arg2, arg3) {
  if (isFn)
    handler.call(self, arg1, arg2, arg3);
  else {
    var len = handler.length;
    var listeners = arrayClone(handler, len);
    for (var i = 0; i < len; ++i)
      listeners[i].call(self, arg1, arg2, arg3);
  }
}

function emitMany(handler, isFn, self, args) {
  if (isFn)
    handler.apply(self, args);
  else {
    var len = handler.length;
    var listeners = arrayClone(handler, len);
    for (var i = 0; i < len; ++i)
      listeners[i].apply(self, args);
  }
}

EventEmitter.prototype.emit = function emit(type) {
  var er, handler, len, args, i, events;
  var doError = (type === 'error');

  events = this._events;
  if (events)
    doError = (doError && events.error == null);
  else if (!doError)
    return false;

  // If there is no 'error' event listener then throw.
  if (doError) {
    if (arguments.length > 1)
      er = arguments[1];
    if (er instanceof Error) {
      throw er; // Unhandled 'error' event
    } else {
      // At least give some kind of context to the user
      var err = new Error('Unhandled "error" event. (' + er + ')');
      err.context = er;
      throw err;
    }
    return false;
  }

  handler = events[type];

  if (!handler)
    return false;

  var isFn = typeof handler === 'function';
  len = arguments.length;
  switch (len) {
      // fast cases
    case 1:
      emitNone(handler, isFn, this);
      break;
    case 2:
      emitOne(handler, isFn, this, arguments[1]);
      break;
    case 3:
      emitTwo(handler, isFn, this, arguments[1], arguments[2]);
      break;
    case 4:
      emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);
      break;
      // slower
    default:
      args = new Array(len - 1);
      for (i = 1; i < len; i++)
        args[i - 1] = arguments[i];
      emitMany(handler, isFn, this, args);
  }

  return true;
};

function _addListener(target, type, listener, prepend) {
  var m;
  var events;
  var existing;

  if (typeof listener !== 'function')
    throw new TypeError('"listener" argument must be a function');

  events = target._events;
  if (!events) {
    events = target._events = objectCreate(null);
    target._eventsCount = 0;
  } else {
    // To avoid recursion in the case that type === "newListener"! Before
    // adding it to the listeners, first emit "newListener".
    if (events.newListener) {
      target.emit('newListener', type,
          listener.listener ? listener.listener : listener);

      // Re-assign `events` because a newListener handler could have caused the
      // this._events to be assigned to a new object
      events = target._events;
    }
    existing = events[type];
  }

  if (!existing) {
    // Optimize the case of one listener. Don't need the extra array object.
    existing = events[type] = listener;
    ++target._eventsCount;
  } else {
    if (typeof existing === 'function') {
      // Adding the second element, need to change to array.
      existing = events[type] =
          prepend ? [listener, existing] : [existing, listener];
    } else {
      // If we've already got an array, just append.
      if (prepend) {
        existing.unshift(listener);
      } else {
        existing.push(listener);
      }
    }

    // Check for listener leak
    if (!existing.warned) {
      m = $getMaxListeners(target);
      if (m && m > 0 && existing.length > m) {
        existing.warned = true;
        var w = new Error('Possible EventEmitter memory leak detected. ' +
            existing.length + ' "' + String(type) + '" listeners ' +
            'added. Use emitter.setMaxListeners() to ' +
            'increase limit.');
        w.name = 'MaxListenersExceededWarning';
        w.emitter = target;
        w.type = type;
        w.count = existing.length;
        if (typeof console === 'object' && console.warn) {
          console.warn('%s: %s', w.name, w.message);
        }
      }
    }
  }

  return target;
}

EventEmitter.prototype.addListener = function addListener(type, listener) {
  return _addListener(this, type, listener, false);
};

EventEmitter.prototype.on = EventEmitter.prototype.addListener;

EventEmitter.prototype.prependListener =
    function prependListener(type, listener) {
      return _addListener(this, type, listener, true);
    };

function onceWrapper() {
  if (!this.fired) {
    this.target.removeListener(this.type, this.wrapFn);
    this.fired = true;
    switch (arguments.length) {
      case 0:
        return this.listener.call(this.target);
      case 1:
        return this.listener.call(this.target, arguments[0]);
      case 2:
        return this.listener.call(this.target, arguments[0], arguments[1]);
      case 3:
        return this.listener.call(this.target, arguments[0], arguments[1],
            arguments[2]);
      default:
        var args = new Array(arguments.length);
        for (var i = 0; i < args.length; ++i)
          args[i] = arguments[i];
        this.listener.apply(this.target, args);
    }
  }
}

function _onceWrap(target, type, listener) {
  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
  var wrapped = bind.call(onceWrapper, state);
  wrapped.listener = listener;
  state.wrapFn = wrapped;
  return wrapped;
}

EventEmitter.prototype.once = function once(type, listener) {
  if (typeof listener !== 'function')
    throw new TypeError('"listener" argument must be a function');
  this.on(type, _onceWrap(this, type, listener));
  return this;
};

EventEmitter.prototype.prependOnceListener =
    function prependOnceListener(type, listener) {
      if (typeof listener !== 'function')
        throw new TypeError('"listener" argument must be a function');
      this.prependListener(type, _onceWrap(this, type, listener));
      return this;
    };

// Emits a 'removeListener' event if and only if the listener was removed.
EventEmitter.prototype.removeListener =
    function removeListener(type, listener) {
      var list, events, position, i, originalListener;

      if (typeof listener !== 'function')
        throw new TypeError('"listener" argument must be a function');

      events = this._events;
      if (!events)
        return this;

      list = events[type];
      if (!list)
        return this;

      if (list === listener || list.listener === listener) {
        if (--this._eventsCount === 0)
          this._events = objectCreate(null);
        else {
          delete events[type];
          if (events.removeListener)
            this.emit('removeListener', type, list.listener || listener);
        }
      } else if (typeof list !== 'function') {
        position = -1;

        for (i = list.length - 1; i >= 0; i--) {
          if (list[i] === listener || list[i].listener === listener) {
            originalListener = list[i].listener;
            position = i;
            break;
          }
        }

        if (position < 0)
          return this;

        if (position === 0)
          list.shift();
        else
          spliceOne(list, position);

        if (list.length === 1)
          events[type] = list[0];

        if (events.removeListener)
          this.emit('removeListener', type, originalListener || listener);
      }

      return this;
    };

EventEmitter.prototype.removeAllListeners =
    function removeAllListeners(type) {
      var listeners, events, i;

      events = this._events;
      if (!events)
        return this;

      // not listening for removeListener, no need to emit
      if (!events.removeListener) {
        if (arguments.length === 0) {
          this._events = objectCreate(null);
          this._eventsCount = 0;
        } else if (events[type]) {
          if (--this._eventsCount === 0)
            this._events = objectCreate(null);
          else
            delete events[type];
        }
        return this;
      }

      // emit removeListener for all listeners on all events
      if (arguments.length === 0) {
        var keys = objectKeys(events);
        var key;
        for (i = 0; i < keys.length; ++i) {
          key = keys[i];
          if (key === 'removeListener') continue;
          this.removeAllListeners(key);
        }
        this.removeAllListeners('removeListener');
        this._events = objectCreate(null);
        this._eventsCount = 0;
        return this;
      }

      listeners = events[type];

      if (typeof listeners === 'function') {
        this.removeListener(type, listeners);
      } else if (listeners) {
        // LIFO order
        for (i = listeners.length - 1; i >= 0; i--) {
          this.removeListener(type, listeners[i]);
        }
      }

      return this;
    };

function _listeners(target, type, unwrap) {
  var events = target._events;

  if (!events)
    return [];

  var evlistener = events[type];
  if (!evlistener)
    return [];

  if (typeof evlistener === 'function')
    return unwrap ? [evlistener.listener || evlistener] : [evlistener];

  return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
}

EventEmitter.prototype.listeners = function listeners(type) {
  return _listeners(this, type, true);
};

EventEmitter.prototype.rawListeners = function rawListeners(type) {
  return _listeners(this, type, false);
};

EventEmitter.listenerCount = function(emitter, type) {
  if (typeof emitter.listenerCount === 'function') {
    return emitter.listenerCount(type);
  } else {
    return listenerCount.call(emitter, type);
  }
};

EventEmitter.prototype.listenerCount = listenerCount;
function listenerCount(type) {
  var events = this._events;

  if (events) {
    var evlistener = events[type];

    if (typeof evlistener === 'function') {
      return 1;
    } else if (evlistener) {
      return evlistener.length;
    }
  }

  return 0;
}

EventEmitter.prototype.eventNames = function eventNames() {
  return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
};

// About 1.5x faster than the two-arg version of Array#splice().
function spliceOne(list, index) {
  for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)
    list[i] = list[k];
  list.pop();
}

function arrayClone(arr, n) {
  var copy = new Array(n);
  for (var i = 0; i < n; ++i)
    copy[i] = arr[i];
  return copy;
}

function unwrapListeners(arr) {
  var ret = new Array(arr.length);
  for (var i = 0; i < ret.length; ++i) {
    ret[i] = arr[i].listener || arr[i];
  }
  return ret;
}

function objectCreatePolyfill(proto) {
  var F = function() {};
  F.prototype = proto;
  return new F;
}
function objectKeysPolyfill(obj) {
  var keys = [];
  for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) {
    keys.push(k);
  }
  return k;
}
function functionBindPolyfill(context) {
  var fn = this;
  return function () {
    return fn.apply(context, arguments);
  };
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/function-bind/implementation.js":[function(require,module,exports){
'use strict';

/* eslint no-invalid-this: 1 */

var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var funcType = '[object Function]';

module.exports = function bind(that) {
    var target = this;
    if (typeof target !== 'function' || toStr.call(target) !== funcType) {
        throw new TypeError(ERROR_MESSAGE + target);
    }
    var args = slice.call(arguments, 1);

    var bound;
    var binder = function () {
        if (this instanceof bound) {
            var result = target.apply(
                this,
                args.concat(slice.call(arguments))
            );
            if (Object(result) === result) {
                return result;
            }
            return this;
        } else {
            return target.apply(
                that,
                args.concat(slice.call(arguments))
            );
        }
    };

    var boundLength = Math.max(0, target.length - args.length);
    var boundArgs = [];
    for (var i = 0; i < boundLength; i++) {
        boundArgs.push('$' + i);
    }

    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);

    if (target.prototype) {
        var Empty = function Empty() {};
        Empty.prototype = target.prototype;
        bound.prototype = new Empty();
        Empty.prototype = null;
    }

    return bound;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/function-bind/index.js":[function(require,module,exports){
'use strict';

var implementation = require('./implementation');

module.exports = Function.prototype.bind || implementation;

},{"./implementation":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/function-bind/implementation.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/functions-have-names/index.js":[function(require,module,exports){
'use strict';

var functionsHaveNames = function functionsHaveNames() {
	return typeof function f() {}.name === 'string';
};

var gOPD = Object.getOwnPropertyDescriptor;
if (gOPD) {
	try {
		gOPD([], 'length');
	} catch (e) {
		// IE 8 has a broken gOPD
		gOPD = null;
	}
}

functionsHaveNames.functionsHaveConfigurableNames = function functionsHaveConfigurableNames() {
	if (!functionsHaveNames() || !gOPD) {
		return false;
	}
	var desc = gOPD(function () {}, 'name');
	return !!desc && !!desc.configurable;
};

var $bind = Function.prototype.bind;

functionsHaveNames.boundFunctionsHaveNames = function boundFunctionsHaveNames() {
	return functionsHaveNames() && typeof $bind === 'function' && function f() {}.bind().name !== '';
};

module.exports = functionsHaveNames;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/get-intrinsic/index.js":[function(require,module,exports){
'use strict';

var undefined;

var $SyntaxError = SyntaxError;
var $Function = Function;
var $TypeError = TypeError;

// eslint-disable-next-line consistent-return
var getEvalledConstructor = function (expressionSyntax) {
	try {
		return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
	} catch (e) {}
};

var $gOPD = Object.getOwnPropertyDescriptor;
if ($gOPD) {
	try {
		$gOPD({}, '');
	} catch (e) {
		$gOPD = null; // this is IE 8, which has a broken gOPD
	}
}

var throwTypeError = function () {
	throw new $TypeError();
};
var ThrowTypeError = $gOPD
	? (function () {
		try {
			// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
			arguments.callee; // IE 8 does not throw here
			return throwTypeError;
		} catch (calleeThrows) {
			try {
				// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
				return $gOPD(arguments, 'callee').get;
			} catch (gOPDthrows) {
				return throwTypeError;
			}
		}
	}())
	: throwTypeError;

var hasSymbols = require('has-symbols')();

var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto

var needsEval = {};

var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);

var INTRINSICS = {
	'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
	'%Array%': Array,
	'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
	'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,
	'%AsyncFromSyncIteratorPrototype%': undefined,
	'%AsyncFunction%': needsEval,
	'%AsyncGenerator%': needsEval,
	'%AsyncGeneratorFunction%': needsEval,
	'%AsyncIteratorPrototype%': needsEval,
	'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
	'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
	'%Boolean%': Boolean,
	'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
	'%Date%': Date,
	'%decodeURI%': decodeURI,
	'%decodeURIComponent%': decodeURIComponent,
	'%encodeURI%': encodeURI,
	'%encodeURIComponent%': encodeURIComponent,
	'%Error%': Error,
	'%eval%': eval, // eslint-disable-line no-eval
	'%EvalError%': EvalError,
	'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
	'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
	'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
	'%Function%': $Function,
	'%GeneratorFunction%': needsEval,
	'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
	'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
	'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
	'%isFinite%': isFinite,
	'%isNaN%': isNaN,
	'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,
	'%JSON%': typeof JSON === 'object' ? JSON : undefined,
	'%Map%': typeof Map === 'undefined' ? undefined : Map,
	'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),
	'%Math%': Math,
	'%Number%': Number,
	'%Object%': Object,
	'%parseFloat%': parseFloat,
	'%parseInt%': parseInt,
	'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
	'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
	'%RangeError%': RangeError,
	'%ReferenceError%': ReferenceError,
	'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
	'%RegExp%': RegExp,
	'%Set%': typeof Set === 'undefined' ? undefined : Set,
	'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),
	'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
	'%String%': String,
	'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,
	'%Symbol%': hasSymbols ? Symbol : undefined,
	'%SyntaxError%': $SyntaxError,
	'%ThrowTypeError%': ThrowTypeError,
	'%TypedArray%': TypedArray,
	'%TypeError%': $TypeError,
	'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
	'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
	'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
	'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
	'%URIError%': URIError,
	'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
	'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
	'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet
};

var doEval = function doEval(name) {
	var value;
	if (name === '%AsyncFunction%') {
		value = getEvalledConstructor('async function () {}');
	} else if (name === '%GeneratorFunction%') {
		value = getEvalledConstructor('function* () {}');
	} else if (name === '%AsyncGeneratorFunction%') {
		value = getEvalledConstructor('async function* () {}');
	} else if (name === '%AsyncGenerator%') {
		var fn = doEval('%AsyncGeneratorFunction%');
		if (fn) {
			value = fn.prototype;
		}
	} else if (name === '%AsyncIteratorPrototype%') {
		var gen = doEval('%AsyncGenerator%');
		if (gen) {
			value = getProto(gen.prototype);
		}
	}

	INTRINSICS[name] = value;

	return value;
};

var LEGACY_ALIASES = {
	'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
	'%ArrayPrototype%': ['Array', 'prototype'],
	'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
	'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
	'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
	'%ArrayProto_values%': ['Array', 'prototype', 'values'],
	'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
	'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
	'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
	'%BooleanPrototype%': ['Boolean', 'prototype'],
	'%DataViewPrototype%': ['DataView', 'prototype'],
	'%DatePrototype%': ['Date', 'prototype'],
	'%ErrorPrototype%': ['Error', 'prototype'],
	'%EvalErrorPrototype%': ['EvalError', 'prototype'],
	'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
	'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
	'%FunctionPrototype%': ['Function', 'prototype'],
	'%Generator%': ['GeneratorFunction', 'prototype'],
	'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
	'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
	'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
	'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
	'%JSONParse%': ['JSON', 'parse'],
	'%JSONStringify%': ['JSON', 'stringify'],
	'%MapPrototype%': ['Map', 'prototype'],
	'%NumberPrototype%': ['Number', 'prototype'],
	'%ObjectPrototype%': ['Object', 'prototype'],
	'%ObjProto_toString%': ['Object', 'prototype', 'toString'],
	'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
	'%PromisePrototype%': ['Promise', 'prototype'],
	'%PromiseProto_then%': ['Promise', 'prototype', 'then'],
	'%Promise_all%': ['Promise', 'all'],
	'%Promise_reject%': ['Promise', 'reject'],
	'%Promise_resolve%': ['Promise', 'resolve'],
	'%RangeErrorPrototype%': ['RangeError', 'prototype'],
	'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
	'%RegExpPrototype%': ['RegExp', 'prototype'],
	'%SetPrototype%': ['Set', 'prototype'],
	'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
	'%StringPrototype%': ['String', 'prototype'],
	'%SymbolPrototype%': ['Symbol', 'prototype'],
	'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
	'%TypedArrayPrototype%': ['TypedArray', 'prototype'],
	'%TypeErrorPrototype%': ['TypeError', 'prototype'],
	'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
	'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
	'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
	'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
	'%URIErrorPrototype%': ['URIError', 'prototype'],
	'%WeakMapPrototype%': ['WeakMap', 'prototype'],
	'%WeakSetPrototype%': ['WeakSet', 'prototype']
};

var bind = require('function-bind');
var hasOwn = require('has');
var $concat = bind.call(Function.call, Array.prototype.concat);
var $spliceApply = bind.call(Function.apply, Array.prototype.splice);
var $replace = bind.call(Function.call, String.prototype.replace);
var $strSlice = bind.call(Function.call, String.prototype.slice);

/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
var stringToPath = function stringToPath(string) {
	var first = $strSlice(string, 0, 1);
	var last = $strSlice(string, -1);
	if (first === '%' && last !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`');
	} else if (last === '%' && first !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`');
	}
	var result = [];
	$replace(string, rePropName, function (match, number, quote, subString) {
		result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
	});
	return result;
};
/* end adaptation */

var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
	var intrinsicName = name;
	var alias;
	if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
		alias = LEGACY_ALIASES[intrinsicName];
		intrinsicName = '%' + alias[0] + '%';
	}

	if (hasOwn(INTRINSICS, intrinsicName)) {
		var value = INTRINSICS[intrinsicName];
		if (value === needsEval) {
			value = doEval(intrinsicName);
		}
		if (typeof value === 'undefined' && !allowMissing) {
			throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
		}

		return {
			alias: alias,
			name: intrinsicName,
			value: value
		};
	}

	throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
};

module.exports = function GetIntrinsic(name, allowMissing) {
	if (typeof name !== 'string' || name.length === 0) {
		throw new $TypeError('intrinsic name must be a non-empty string');
	}
	if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
		throw new $TypeError('"allowMissing" argument must be a boolean');
	}

	var parts = stringToPath(name);
	var intrinsicBaseName = parts.length > 0 ? parts[0] : '';

	var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
	var intrinsicRealName = intrinsic.name;
	var value = intrinsic.value;
	var skipFurtherCaching = false;

	var alias = intrinsic.alias;
	if (alias) {
		intrinsicBaseName = alias[0];
		$spliceApply(parts, $concat([0, 1], alias));
	}

	for (var i = 1, isOwn = true; i < parts.length; i += 1) {
		var part = parts[i];
		var first = $strSlice(part, 0, 1);
		var last = $strSlice(part, -1);
		if (
			(
				(first === '"' || first === "'" || first === '`')
				|| (last === '"' || last === "'" || last === '`')
			)
			&& first !== last
		) {
			throw new $SyntaxError('property names with quotes must have matching quotes');
		}
		if (part === 'constructor' || !isOwn) {
			skipFurtherCaching = true;
		}

		intrinsicBaseName += '.' + part;
		intrinsicRealName = '%' + intrinsicBaseName + '%';

		if (hasOwn(INTRINSICS, intrinsicRealName)) {
			value = INTRINSICS[intrinsicRealName];
		} else if (value != null) {
			if (!(part in value)) {
				if (!allowMissing) {
					throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
				}
				return void undefined;
			}
			if ($gOPD && (i + 1) >= parts.length) {
				var desc = $gOPD(value, part);
				isOwn = !!desc;

				// By convention, when a data property is converted to an accessor
				// property to emulate a data property that does not suffer from
				// the override mistake, that accessor's getter is marked with
				// an `originalValue` property. Here, when we detect this, we
				// uphold the illusion by pretending to see that original data
				// property, i.e., returning the value rather than the getter
				// itself.
				if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
					value = desc.get;
				} else {
					value = value[part];
				}
			} else {
				isOwn = hasOwn(value, part);
				value = value[part];
			}

			if (isOwn && !skipFurtherCaching) {
				INTRINSICS[intrinsicRealName] = value;
			}
		}
	}
	return value;
};

},{"function-bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/function-bind/index.js","has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has/src/index.js","has-symbols":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has-symbols/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has-property-descriptors/index.js":[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);

var hasPropertyDescriptors = function hasPropertyDescriptors() {
	if ($defineProperty) {
		try {
			$defineProperty({}, 'a', { value: 1 });
			return true;
		} catch (e) {
			// IE 8 has a broken defineProperty
			return false;
		}
	}
	return false;
};

hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() {
	// node v0.6 has a bug where array lengths can be Set but not Defined
	if (!hasPropertyDescriptors()) {
		return null;
	}
	try {
		return $defineProperty([], 'length', { value: 1 }).length !== 1;
	} catch (e) {
		// In Firefox 4-22, defining length on an array throws an exception.
		return true;
	}
};

module.exports = hasPropertyDescriptors;

},{"get-intrinsic":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/get-intrinsic/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has-symbols/index.js":[function(require,module,exports){
'use strict';

var origSymbol = typeof Symbol !== 'undefined' && Symbol;
var hasSymbolSham = require('./shams');

module.exports = function hasNativeSymbols() {
	if (typeof origSymbol !== 'function') { return false; }
	if (typeof Symbol !== 'function') { return false; }
	if (typeof origSymbol('foo') !== 'symbol') { return false; }
	if (typeof Symbol('bar') !== 'symbol') { return false; }

	return hasSymbolSham();
};

},{"./shams":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has-symbols/shams.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has-symbols/shams.js":[function(require,module,exports){
'use strict';

/* eslint complexity: [2, 18], max-statements: [2, 33] */
module.exports = function hasSymbols() {
	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
	if (typeof Symbol.iterator === 'symbol') { return true; }

	var obj = {};
	var sym = Symbol('test');
	var symObj = Object(sym);
	if (typeof sym === 'string') { return false; }

	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }

	// temp disabled per https://github.com/ljharb/object.assign/issues/17
	// if (sym instanceof Symbol) { return false; }
	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
	// if (!(symObj instanceof Symbol)) { return false; }

	// if (typeof Symbol.prototype.toString !== 'function') { return false; }
	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }

	var symVal = 42;
	obj[sym] = symVal;
	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }

	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }

	var syms = Object.getOwnPropertySymbols(obj);
	if (syms.length !== 1 || syms[0] !== sym) { return false; }

	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }

	if (typeof Object.getOwnPropertyDescriptor === 'function') {
		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
	}

	return true;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has-tostringtag/shams.js":[function(require,module,exports){
'use strict';

var hasSymbols = require('has-symbols/shams');

module.exports = function hasToStringTagShams() {
	return hasSymbols() && !!Symbol.toStringTag;
};

},{"has-symbols/shams":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has-symbols/shams.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has/src/index.js":[function(require,module,exports){
'use strict';

var bind = require('function-bind');

module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);

},{"function-bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/function-bind/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ieee754/index.js":[function(require,module,exports){
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
  var e, m
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var nBits = -7
  var i = isLE ? (nBytes - 1) : 0
  var d = isLE ? -1 : 1
  var s = buffer[offset + i]

  i += d

  e = s & ((1 << (-nBits)) - 1)
  s >>= (-nBits)
  nBits += eLen
  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  m = e & ((1 << (-nBits)) - 1)
  e >>= (-nBits)
  nBits += mLen
  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  if (e === 0) {
    e = 1 - eBias
  } else if (e === eMax) {
    return m ? NaN : ((s ? -1 : 1) * Infinity)
  } else {
    m = m + Math.pow(2, mLen)
    e = e - eBias
  }
  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}

exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
  var e, m, c
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
  var i = isLE ? 0 : (nBytes - 1)
  var d = isLE ? 1 : -1
  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0

  value = Math.abs(value)

  if (isNaN(value) || value === Infinity) {
    m = isNaN(value) ? 1 : 0
    e = eMax
  } else {
    e = Math.floor(Math.log(value) / Math.LN2)
    if (value * (c = Math.pow(2, -e)) < 1) {
      e--
      c *= 2
    }
    if (e + eBias >= 1) {
      value += rt / c
    } else {
      value += rt * Math.pow(2, 1 - eBias)
    }
    if (value * c >= 2) {
      e++
      c /= 2
    }

    if (e + eBias >= eMax) {
      m = 0
      e = eMax
    } else if (e + eBias >= 1) {
      m = ((value * c) - 1) * Math.pow(2, mLen)
      e = e + eBias
    } else {
      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
      e = 0
    }
  }

  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}

  e = (e << mLen) | m
  eLen += mLen
  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}

  buffer[offset + i - d] |= s * 128
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/inherits/inherits_browser.js":[function(require,module,exports){
if (typeof Object.create === 'function') {
  // implementation from standard node.js 'util' module
  module.exports = function inherits(ctor, superCtor) {
    if (superCtor) {
      ctor.super_ = superCtor
      ctor.prototype = Object.create(superCtor.prototype, {
        constructor: {
          value: ctor,
          enumerable: false,
          writable: true,
          configurable: true
        }
      })
    }
  };
} else {
  // old school shim for old browsers
  module.exports = function inherits(ctor, superCtor) {
    if (superCtor) {
      ctor.super_ = superCtor
      var TempCtor = function () {}
      TempCtor.prototype = superCtor.prototype
      ctor.prototype = new TempCtor()
      ctor.prototype.constructor = ctor
    }
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-arguments/index.js":[function(require,module,exports){
'use strict';

var hasToStringTag = require('has-tostringtag/shams')();
var callBound = require('call-bind/callBound');

var $toString = callBound('Object.prototype.toString');

var isStandardArguments = function isArguments(value) {
	if (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {
		return false;
	}
	return $toString(value) === '[object Arguments]';
};

var isLegacyArguments = function isArguments(value) {
	if (isStandardArguments(value)) {
		return true;
	}
	return value !== null &&
		typeof value === 'object' &&
		typeof value.length === 'number' &&
		value.length >= 0 &&
		$toString(value) !== '[object Array]' &&
		$toString(value.callee) === '[object Function]';
};

var supportsStandardArguments = (function () {
	return isStandardArguments(arguments);
}());

isStandardArguments.isLegacyArguments = isLegacyArguments; // for tests

module.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;

},{"call-bind/callBound":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/call-bind/callBound.js","has-tostringtag/shams":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has-tostringtag/shams.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-buffer/index.js":[function(require,module,exports){
/*!
 * Determine if an object is a Buffer
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */

// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
}

function isBuffer (obj) {
  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}

// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-date-object/index.js":[function(require,module,exports){
'use strict';

var getDay = Date.prototype.getDay;
var tryDateObject = function tryDateGetDayCall(value) {
	try {
		getDay.call(value);
		return true;
	} catch (e) {
		return false;
	}
};

var toStr = Object.prototype.toString;
var dateClass = '[object Date]';
var hasToStringTag = require('has-tostringtag/shams')();

module.exports = function isDateObject(value) {
	if (typeof value !== 'object' || value === null) {
		return false;
	}
	return hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;
};

},{"has-tostringtag/shams":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has-tostringtag/shams.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-regex/index.js":[function(require,module,exports){
'use strict';

var callBound = require('call-bind/callBound');
var hasToStringTag = require('has-tostringtag/shams')();
var has;
var $exec;
var isRegexMarker;
var badStringifier;

if (hasToStringTag) {
	has = callBound('Object.prototype.hasOwnProperty');
	$exec = callBound('RegExp.prototype.exec');
	isRegexMarker = {};

	var throwRegexMarker = function () {
		throw isRegexMarker;
	};
	badStringifier = {
		toString: throwRegexMarker,
		valueOf: throwRegexMarker
	};

	if (typeof Symbol.toPrimitive === 'symbol') {
		badStringifier[Symbol.toPrimitive] = throwRegexMarker;
	}
}

var $toString = callBound('Object.prototype.toString');
var gOPD = Object.getOwnPropertyDescriptor;
var regexClass = '[object RegExp]';

module.exports = hasToStringTag
	// eslint-disable-next-line consistent-return
	? function isRegex(value) {
		if (!value || typeof value !== 'object') {
			return false;
		}

		var descriptor = gOPD(value, 'lastIndex');
		var hasLastIndexDataProperty = descriptor && has(descriptor, 'value');
		if (!hasLastIndexDataProperty) {
			return false;
		}

		try {
			$exec(value, badStringifier);
		} catch (e) {
			return e === isRegexMarker;
		}
	}
	: function isRegex(value) {
		// In older browsers, typeof regex incorrectly returns 'function'
		if (!value || (typeof value !== 'object' && typeof value !== 'function')) {
			return false;
		}

		return $toString(value) === regexClass;
	};

},{"call-bind/callBound":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/call-bind/callBound.js","has-tostringtag/shams":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/has-tostringtag/shams.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/isarray/index.js":[function(require,module,exports){
var toString = {}.toString;

module.exports = Array.isArray || function (arr) {
  return toString.call(arr) == '[object Array]';
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/generated/aesprim-browser.js":[function(require,module,exports){
/*
  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>
  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>
  Copyright (C) 2013 Mathias Bynens <mathias@qiwi.be>
  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>
  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>
  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>
  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>
  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*jslint bitwise:true plusplus:true */
/*global esprima:true, define:true, exports:true, window: true,
throwErrorTolerant: true,
throwError: true, generateStatement: true, peek: true,
parseAssignmentExpression: true, parseBlock: true, parseExpression: true,
parseFunctionDeclaration: true, parseFunctionExpression: true,
parseFunctionSourceElements: true, parseVariableIdentifier: true,
parseLeftHandSideExpression: true,
parseUnaryExpression: true,
parseStatement: true, parseSourceElement: true */

(function (root, factory) {
    'use strict';

    // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,
    // Rhino, and plain browser loading.

    /* istanbul ignore next */
    if (typeof define === 'function' && define.amd) {
        define(['exports'], factory);
    } else if (typeof exports !== 'undefined') {
        factory(exports);
    } else {
        factory((root.esprima = {}));
    }
}(this, function (exports) {
    'use strict';

    var Token,
        TokenName,
        FnExprTokens,
        Syntax,
        PropertyKind,
        Messages,
        Regex,
        SyntaxTreeDelegate,
        source,
        strict,
        index,
        lineNumber,
        lineStart,
        length,
        delegate,
        lookahead,
        state,
        extra;

    Token = {
        BooleanLiteral: 1,
        EOF: 2,
        Identifier: 3,
        Keyword: 4,
        NullLiteral: 5,
        NumericLiteral: 6,
        Punctuator: 7,
        StringLiteral: 8,
        RegularExpression: 9
    };

    TokenName = {};
    TokenName[Token.BooleanLiteral] = 'Boolean';
    TokenName[Token.EOF] = '<end>';
    TokenName[Token.Identifier] = 'Identifier';
    TokenName[Token.Keyword] = 'Keyword';
    TokenName[Token.NullLiteral] = 'Null';
    TokenName[Token.NumericLiteral] = 'Numeric';
    TokenName[Token.Punctuator] = 'Punctuator';
    TokenName[Token.StringLiteral] = 'String';
    TokenName[Token.RegularExpression] = 'RegularExpression';

    // A function following one of those tokens is an expression.
    FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',
                    'return', 'case', 'delete', 'throw', 'void',
                    // assignment operators
                    '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=',
                    '&=', '|=', '^=', ',',
                    // binary/unary operators
                    '+', '-', '*', '/', '%', '++', '--', '<<', '>>', '>>>', '&',
                    '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',
                    '<=', '<', '>', '!=', '!=='];

    Syntax = {
        AssignmentExpression: 'AssignmentExpression',
        ArrayExpression: 'ArrayExpression',
        BlockStatement: 'BlockStatement',
        BinaryExpression: 'BinaryExpression',
        BreakStatement: 'BreakStatement',
        CallExpression: 'CallExpression',
        CatchClause: 'CatchClause',
        ConditionalExpression: 'ConditionalExpression',
        ContinueStatement: 'ContinueStatement',
        DoWhileStatement: 'DoWhileStatement',
        DebuggerStatement: 'DebuggerStatement',
        EmptyStatement: 'EmptyStatement',
        ExpressionStatement: 'ExpressionStatement',
        ForStatement: 'ForStatement',
        ForInStatement: 'ForInStatement',
        FunctionDeclaration: 'FunctionDeclaration',
        FunctionExpression: 'FunctionExpression',
        Identifier: 'Identifier',
        IfStatement: 'IfStatement',
        Literal: 'Literal',
        LabeledStatement: 'LabeledStatement',
        LogicalExpression: 'LogicalExpression',
        MemberExpression: 'MemberExpression',
        NewExpression: 'NewExpression',
        ObjectExpression: 'ObjectExpression',
        Program: 'Program',
        Property: 'Property',
        ReturnStatement: 'ReturnStatement',
        SequenceExpression: 'SequenceExpression',
        SwitchStatement: 'SwitchStatement',
        SwitchCase: 'SwitchCase',
        ThisExpression: 'ThisExpression',
        ThrowStatement: 'ThrowStatement',
        TryStatement: 'TryStatement',
        UnaryExpression: 'UnaryExpression',
        UpdateExpression: 'UpdateExpression',
        VariableDeclaration: 'VariableDeclaration',
        VariableDeclarator: 'VariableDeclarator',
        WhileStatement: 'WhileStatement',
        WithStatement: 'WithStatement'
    };

    PropertyKind = {
        Data: 1,
        Get: 2,
        Set: 4
    };

    // Error messages should be identical to V8.
    Messages = {
        UnexpectedToken:  'Unexpected token %0',
        UnexpectedNumber:  'Unexpected number',
        UnexpectedString:  'Unexpected string',
        UnexpectedIdentifier:  'Unexpected identifier',
        UnexpectedReserved:  'Unexpected reserved word',
        UnexpectedEOS:  'Unexpected end of input',
        NewlineAfterThrow:  'Illegal newline after throw',
        InvalidRegExp: 'Invalid regular expression',
        UnterminatedRegExp:  'Invalid regular expression: missing /',
        InvalidLHSInAssignment:  'Invalid left-hand side in assignment',
        InvalidLHSInForIn:  'Invalid left-hand side in for-in',
        MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
        NoCatchOrFinally:  'Missing catch or finally after try',
        UnknownLabel: 'Undefined label \'%0\'',
        Redeclaration: '%0 \'%1\' has already been declared',
        IllegalContinue: 'Illegal continue statement',
        IllegalBreak: 'Illegal break statement',
        IllegalReturn: 'Illegal return statement',
        StrictModeWith:  'Strict mode code may not include a with statement',
        StrictCatchVariable:  'Catch variable may not be eval or arguments in strict mode',
        StrictVarName:  'Variable name may not be eval or arguments in strict mode',
        StrictParamName:  'Parameter name eval or arguments is not allowed in strict mode',
        StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
        StrictFunctionName:  'Function name may not be eval or arguments in strict mode',
        StrictOctalLiteral:  'Octal literals are not allowed in strict mode.',
        StrictDelete:  'Delete of an unqualified identifier in strict mode.',
        StrictDuplicateProperty:  'Duplicate data property in object literal not allowed in strict mode',
        AccessorDataProperty:  'Object literal may not have data and accessor property with the same name',
        AccessorGetSet:  'Object literal may not have multiple get/set accessors with the same name',
        StrictLHSAssignment:  'Assignment to eval or arguments is not allowed in strict mode',
        StrictLHSPostfix:  'Postfix increment/decrement may not have eval or arguments operand in strict mode',
        StrictLHSPrefix:  'Prefix increment/decrement may not have eval or arguments operand in strict mode',
        StrictReservedWord:  'Use of future reserved word in strict mode'
    };

    // See also tools/generate-unicode-regex.py.
    Regex = {
        NonAsciiIdentifierStart: new RegExp('[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]'),
        NonAsciiIdentifierPart: new RegExp('[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0\u08A2-\u08AC\u08E4-\u08FE\u0900-\u0963\u0966-\u096F\u0971-\u0977\u0979-\u097F\u0981-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C82\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D02\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191C\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1D00-\u1DE6\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA697\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7B\uAA80-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE26\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]')
    };

    // Ensure the condition is true, otherwise throw an error.
    // This is only to have a better contract semantic, i.e. another safety net
    // to catch a logic error. The condition shall be fulfilled in normal case.
    // Do NOT use this to enforce a certain condition on any user input.

    function assert(condition, message) {
        /* istanbul ignore if */
        if (!condition) {
            throw new Error('ASSERT: ' + message);
        }
    }

    function isDecimalDigit(ch) {
        return (ch >= 48 && ch <= 57);   // 0..9
    }

    function isHexDigit(ch) {
        return '0123456789abcdefABCDEF'.indexOf(ch) >= 0;
    }

    function isOctalDigit(ch) {
        return '01234567'.indexOf(ch) >= 0;
    }


    // 7.2 White Space

    function isWhiteSpace(ch) {
        return (ch === 0x20) || (ch === 0x09) || (ch === 0x0B) || (ch === 0x0C) || (ch === 0xA0) ||
            (ch >= 0x1680 && [0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(ch) >= 0);
    }

    // 7.3 Line Terminators

    function isLineTerminator(ch) {
        return (ch === 0x0A) || (ch === 0x0D) || (ch === 0x2028) || (ch === 0x2029);
    }

    // 7.6 Identifier Names and Identifiers

    function isIdentifierStart(ch) {
        return (ch == 0x40) ||  (ch === 0x24) || (ch === 0x5F) ||  // $ (dollar) and _ (underscore)
            (ch >= 0x41 && ch <= 0x5A) ||         // A..Z
            (ch >= 0x61 && ch <= 0x7A) ||         // a..z
            (ch === 0x5C) ||                      // \ (backslash)
            ((ch >= 0x80) && Regex.NonAsciiIdentifierStart.test(String.fromCharCode(ch)));
    }

    function isIdentifierPart(ch) {
        return (ch === 0x24) || (ch === 0x5F) ||  // $ (dollar) and _ (underscore)
            (ch >= 0x41 && ch <= 0x5A) ||         // A..Z
            (ch >= 0x61 && ch <= 0x7A) ||         // a..z
            (ch >= 0x30 && ch <= 0x39) ||         // 0..9
            (ch === 0x5C) ||                      // \ (backslash)
            ((ch >= 0x80) && Regex.NonAsciiIdentifierPart.test(String.fromCharCode(ch)));
    }

    // 7.6.1.2 Future Reserved Words

    function isFutureReservedWord(id) {
        switch (id) {
        case 'class':
        case 'enum':
        case 'export':
        case 'extends':
        case 'import':
        case 'super':
            return true;
        default:
            return false;
        }
    }

    function isStrictModeReservedWord(id) {
        switch (id) {
        case 'implements':
        case 'interface':
        case 'package':
        case 'private':
        case 'protected':
        case 'public':
        case 'static':
        case 'yield':
        case 'let':
            return true;
        default:
            return false;
        }
    }

    function isRestrictedWord(id) {
        return id === 'eval' || id === 'arguments';
    }

    // 7.6.1.1 Keywords

    function isKeyword(id) {
        if (strict && isStrictModeReservedWord(id)) {
            return true;
        }

        // 'const' is specialized as Keyword in V8.
        // 'yield' and 'let' are for compatiblity with SpiderMonkey and ES.next.
        // Some others are from future reserved words.

        switch (id.length) {
        case 2:
            return (id === 'if') || (id === 'in') || (id === 'do');
        case 3:
            return (id === 'var') || (id === 'for') || (id === 'new') ||
                (id === 'try') || (id === 'let');
        case 4:
            return (id === 'this') || (id === 'else') || (id === 'case') ||
                (id === 'void') || (id === 'with') || (id === 'enum');
        case 5:
            return (id === 'while') || (id === 'break') || (id === 'catch') ||
                (id === 'throw') || (id === 'const') || (id === 'yield') ||
                (id === 'class') || (id === 'super');
        case 6:
            return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
                (id === 'switch') || (id === 'export') || (id === 'import');
        case 7:
            return (id === 'default') || (id === 'finally') || (id === 'extends');
        case 8:
            return (id === 'function') || (id === 'continue') || (id === 'debugger');
        case 10:
            return (id === 'instanceof');
        default:
            return false;
        }
    }

    // 7.4 Comments

    function addComment(type, value, start, end, loc) {
        var comment, attacher;

        assert(typeof start === 'number', 'Comment must have valid position');

        // Because the way the actual token is scanned, often the comments
        // (if any) are skipped twice during the lexical analysis.
        // Thus, we need to skip adding a comment if the comment array already
        // handled it.
        if (state.lastCommentStart >= start) {
            return;
        }
        state.lastCommentStart = start;

        comment = {
            type: type,
            value: value
        };
        if (extra.range) {
            comment.range = [start, end];
        }
        if (extra.loc) {
            comment.loc = loc;
        }
        extra.comments.push(comment);
        if (extra.attachComment) {
            extra.leadingComments.push(comment);
            extra.trailingComments.push(comment);
        }
    }

    function skipSingleLineComment(offset) {
        var start, loc, ch, comment;

        start = index - offset;
        loc = {
            start: {
                line: lineNumber,
                column: index - lineStart - offset
            }
        };

        while (index < length) {
            ch = source.charCodeAt(index);
            ++index;
            if (isLineTerminator(ch)) {
                if (extra.comments) {
                    comment = source.slice(start + offset, index - 1);
                    loc.end = {
                        line: lineNumber,
                        column: index - lineStart - 1
                    };
                    addComment('Line', comment, start, index - 1, loc);
                }
                if (ch === 13 && source.charCodeAt(index) === 10) {
                    ++index;
                }
                ++lineNumber;
                lineStart = index;
                return;
            }
        }

        if (extra.comments) {
            comment = source.slice(start + offset, index);
            loc.end = {
                line: lineNumber,
                column: index - lineStart
            };
            addComment('Line', comment, start, index, loc);
        }
    }

    function skipMultiLineComment() {
        var start, loc, ch, comment;

        if (extra.comments) {
            start = index - 2;
            loc = {
                start: {
                    line: lineNumber,
                    column: index - lineStart - 2
                }
            };
        }

        while (index < length) {
            ch = source.charCodeAt(index);
            if (isLineTerminator(ch)) {
                if (ch === 0x0D && source.charCodeAt(index + 1) === 0x0A) {
                    ++index;
                }
                ++lineNumber;
                ++index;
                lineStart = index;
                if (index >= length) {
                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
                }
            } else if (ch === 0x2A) {
                // Block comment ends with '*/'.
                if (source.charCodeAt(index + 1) === 0x2F) {
                    ++index;
                    ++index;
                    if (extra.comments) {
                        comment = source.slice(start + 2, index - 2);
                        loc.end = {
                            line: lineNumber,
                            column: index - lineStart
                        };
                        addComment('Block', comment, start, index, loc);
                    }
                    return;
                }
                ++index;
            } else {
                ++index;
            }
        }

        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
    }

    function skipComment() {
        var ch, start;

        start = (index === 0);
        while (index < length) {
            ch = source.charCodeAt(index);

            if (isWhiteSpace(ch)) {
                ++index;
            } else if (isLineTerminator(ch)) {
                ++index;
                if (ch === 0x0D && source.charCodeAt(index) === 0x0A) {
                    ++index;
                }
                ++lineNumber;
                lineStart = index;
                start = true;
            } else if (ch === 0x2F) { // U+002F is '/'
                ch = source.charCodeAt(index + 1);
                if (ch === 0x2F) {
                    ++index;
                    ++index;
                    skipSingleLineComment(2);
                    start = true;
                } else if (ch === 0x2A) {  // U+002A is '*'
                    ++index;
                    ++index;
                    skipMultiLineComment();
                } else {
                    break;
                }
            } else if (start && ch === 0x2D) { // U+002D is '-'
                // U+003E is '>'
                if ((source.charCodeAt(index + 1) === 0x2D) && (source.charCodeAt(index + 2) === 0x3E)) {
                    // '-->' is a single-line comment
                    index += 3;
                    skipSingleLineComment(3);
                } else {
                    break;
                }
            } else if (ch === 0x3C) { // U+003C is '<'
                if (source.slice(index + 1, index + 4) === '!--') {
                    ++index; // `<`
                    ++index; // `!`
                    ++index; // `-`
                    ++index; // `-`
                    skipSingleLineComment(4);
                } else {
                    break;
                }
            } else {
                break;
            }
        }
    }

    function scanHexEscape(prefix) {
        var i, len, ch, code = 0;

        len = (prefix === 'u') ? 4 : 2;
        for (i = 0; i < len; ++i) {
            if (index < length && isHexDigit(source[index])) {
                ch = source[index++];
                code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());
            } else {
                return '';
            }
        }
        return String.fromCharCode(code);
    }

    function getEscapedIdentifier() {
        var ch, id;

        ch = source.charCodeAt(index++);
        id = String.fromCharCode(ch);

        // '\u' (U+005C, U+0075) denotes an escaped character.
        if (ch === 0x5C) {
            if (source.charCodeAt(index) !== 0x75) {
                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
            }
            ++index;
            ch = scanHexEscape('u');
            if (!ch || ch === '\\' || !isIdentifierStart(ch.charCodeAt(0))) {
                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
            }
            id = ch;
        }

        while (index < length) {
            ch = source.charCodeAt(index);
            if (!isIdentifierPart(ch)) {
                break;
            }
            ++index;
            id += String.fromCharCode(ch);

            // '\u' (U+005C, U+0075) denotes an escaped character.
            if (ch === 0x5C) {
                id = id.substr(0, id.length - 1);
                if (source.charCodeAt(index) !== 0x75) {
                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
                }
                ++index;
                ch = scanHexEscape('u');
                if (!ch || ch === '\\' || !isIdentifierPart(ch.charCodeAt(0))) {
                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
                }
                id += ch;
            }
        }

        return id;
    }

    function getIdentifier() {
        var start, ch;

        start = index++;
        while (index < length) {
            ch = source.charCodeAt(index);
            if (ch === 0x5C) {
                // Blackslash (U+005C) marks Unicode escape sequence.
                index = start;
                return getEscapedIdentifier();
            }
            if (isIdentifierPart(ch)) {
                ++index;
            } else {
                break;
            }
        }

        return source.slice(start, index);
    }

    function scanIdentifier() {
        var start, id, type;

        start = index;

        // Backslash (U+005C) starts an escaped character.
        id = (source.charCodeAt(index) === 0x5C) ? getEscapedIdentifier() : getIdentifier();

        // There is no keyword or literal with only one character.
        // Thus, it must be an identifier.
        if (id.length === 1) {
            type = Token.Identifier;
        } else if (isKeyword(id)) {
            type = Token.Keyword;
        } else if (id === 'null') {
            type = Token.NullLiteral;
        } else if (id === 'true' || id === 'false') {
            type = Token.BooleanLiteral;
        } else {
            type = Token.Identifier;
        }

        return {
            type: type,
            value: id,
            lineNumber: lineNumber,
            lineStart: lineStart,
            start: start,
            end: index
        };
    }


    // 7.7 Punctuators

    function scanPunctuator() {
        var start = index,
            code = source.charCodeAt(index),
            code2,
            ch1 = source[index],
            ch2,
            ch3,
            ch4;

        switch (code) {

        // Check for most common single-character punctuators.
        case 0x2E:  // . dot
        case 0x28:  // ( open bracket
        case 0x29:  // ) close bracket
        case 0x3B:  // ; semicolon
        case 0x2C:  // , comma
        case 0x7B:  // { open curly brace
        case 0x7D:  // } close curly brace
        case 0x5B:  // [
        case 0x5D:  // ]
        case 0x3A:  // :
        case 0x3F:  // ?
        case 0x7E:  // ~
            ++index;
            if (extra.tokenize) {
                if (code === 0x28) {
                    extra.openParenToken = extra.tokens.length;
                } else if (code === 0x7B) {
                    extra.openCurlyToken = extra.tokens.length;
                }
            }
            return {
                type: Token.Punctuator,
                value: String.fromCharCode(code),
                lineNumber: lineNumber,
                lineStart: lineStart,
                start: start,
                end: index
            };

        default:
            code2 = source.charCodeAt(index + 1);

            // '=' (U+003D) marks an assignment or comparison operator.
            if (code2 === 0x3D) {
                switch (code) {
                case 0x2B:  // +
                case 0x2D:  // -
                case 0x2F:  // /
                case 0x3C:  // <
                case 0x3E:  // >
                case 0x5E:  // ^
                case 0x7C:  // |
                case 0x25:  // %
                case 0x26:  // &
                case 0x2A:  // *
                    index += 2;
                    return {
                        type: Token.Punctuator,
                        value: String.fromCharCode(code) + String.fromCharCode(code2),
                        lineNumber: lineNumber,
                        lineStart: lineStart,
                        start: start,
                        end: index
                    };

                case 0x21: // !
                case 0x3D: // =
                    index += 2;

                    // !== and ===
                    if (source.charCodeAt(index) === 0x3D) {
                        ++index;
                    }
                    return {
                        type: Token.Punctuator,
                        value: source.slice(start, index),
                        lineNumber: lineNumber,
                        lineStart: lineStart,
                        start: start,
                        end: index
                    };
                }
            }
        }

        // 4-character punctuator: >>>=

        ch4 = source.substr(index, 4);

        if (ch4 === '>>>=') {
            index += 4;
            return {
                type: Token.Punctuator,
                value: ch4,
                lineNumber: lineNumber,
                lineStart: lineStart,
                start: start,
                end: index
            };
        }

        // 3-character punctuators: === !== >>> <<= >>=

        ch3 = ch4.substr(0, 3);

        if (ch3 === '>>>' || ch3 === '<<=' || ch3 === '>>=') {
            index += 3;
            return {
                type: Token.Punctuator,
                value: ch3,
                lineNumber: lineNumber,
                lineStart: lineStart,
                start: start,
                end: index
            };
        }

        // Other 2-character punctuators: ++ -- << >> && ||
        ch2 = ch3.substr(0, 2);

        if ((ch1 === ch2[1] && ('+-<>&|'.indexOf(ch1) >= 0)) || ch2 === '=>') {
            index += 2;
            return {
                type: Token.Punctuator,
                value: ch2,
                lineNumber: lineNumber,
                lineStart: lineStart,
                start: start,
                end: index
            };
        }

        // 1-character punctuators: < > = ! + - * % & | ^ /
        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {
            ++index;
            return {
                type: Token.Punctuator,
                value: ch1,
                lineNumber: lineNumber,
                lineStart: lineStart,
                start: start,
                end: index
            };
        }

        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
    }

    // 7.8.3 Numeric Literals

    function scanHexLiteral(start) {
        var number = '';

        while (index < length) {
            if (!isHexDigit(source[index])) {
                break;
            }
            number += source[index++];
        }

        if (number.length === 0) {
            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
        }

        if (isIdentifierStart(source.charCodeAt(index))) {
            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
        }

        return {
            type: Token.NumericLiteral,
            value: parseInt('0x' + number, 16),
            lineNumber: lineNumber,
            lineStart: lineStart,
            start: start,
            end: index
        };
    }

    function scanOctalLiteral(start) {
        var number = '0' + source[index++];
        while (index < length) {
            if (!isOctalDigit(source[index])) {
                break;
            }
            number += source[index++];
        }

        if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) {
            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
        }

        return {
            type: Token.NumericLiteral,
            value: parseInt(number, 8),
            octal: true,
            lineNumber: lineNumber,
            lineStart: lineStart,
            start: start,
            end: index
        };
    }

    function scanNumericLiteral() {
        var number, start, ch;

        ch = source[index];
        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),
            'Numeric literal must start with a decimal digit or a decimal point');

        start = index;
        number = '';
        if (ch !== '.') {
            number = source[index++];
            ch = source[index];

            // Hex number starts with '0x'.
            // Octal number starts with '0'.
            if (number === '0') {
                if (ch === 'x' || ch === 'X') {
                    ++index;
                    return scanHexLiteral(start);
                }
                if (isOctalDigit(ch)) {
                    return scanOctalLiteral(start);
                }

                // decimal number starts with '0' such as '09' is illegal.
                if (ch && isDecimalDigit(ch.charCodeAt(0))) {
                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
                }
            }

            while (isDecimalDigit(source.charCodeAt(index))) {
                number += source[index++];
            }
            ch = source[index];
        }

        if (ch === '.') {
            number += source[index++];
            while (isDecimalDigit(source.charCodeAt(index))) {
                number += source[index++];
            }
            ch = source[index];
        }

        if (ch === 'e' || ch === 'E') {
            number += source[index++];

            ch = source[index];
            if (ch === '+' || ch === '-') {
                number += source[index++];
            }
            if (isDecimalDigit(source.charCodeAt(index))) {
                while (isDecimalDigit(source.charCodeAt(index))) {
                    number += source[index++];
                }
            } else {
                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
            }
        }

        if (isIdentifierStart(source.charCodeAt(index))) {
            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
        }

        return {
            type: Token.NumericLiteral,
            value: parseFloat(number),
            lineNumber: lineNumber,
            lineStart: lineStart,
            start: start,
            end: index
        };
    }

    // 7.8.4 String Literals

    function scanStringLiteral() {
        var str = '', quote, start, ch, code, unescaped, restore, octal = false, startLineNumber, startLineStart;
        startLineNumber = lineNumber;
        startLineStart = lineStart;

        quote = source[index];
        assert((quote === '\'' || quote === '"'),
            'String literal must starts with a quote');

        start = index;
        ++index;

        while (index < length) {
            ch = source[index++];

            if (ch === quote) {
                quote = '';
                break;
            } else if (ch === '\\') {
                ch = source[index++];
                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {
                    switch (ch) {
                    case 'u':
                    case 'x':
                        restore = index;
                        unescaped = scanHexEscape(ch);
                        if (unescaped) {
                            str += unescaped;
                        } else {
                            index = restore;
                            str += ch;
                        }
                        break;
                    case 'n':
                        str += '\n';
                        break;
                    case 'r':
                        str += '\r';
                        break;
                    case 't':
                        str += '\t';
                        break;
                    case 'b':
                        str += '\b';
                        break;
                    case 'f':
                        str += '\f';
                        break;
                    case 'v':
                        str += '\x0B';
                        break;

                    default:
                        if (isOctalDigit(ch)) {
                            code = '01234567'.indexOf(ch);

                            // \0 is not octal escape sequence
                            if (code !== 0) {
                                octal = true;
                            }

                            if (index < length && isOctalDigit(source[index])) {
                                octal = true;
                                code = code * 8 + '01234567'.indexOf(source[index++]);

                                // 3 digits are only allowed when string starts
                                // with 0, 1, 2, 3
                                if ('0123'.indexOf(ch) >= 0 &&
                                        index < length &&
                                        isOctalDigit(source[index])) {
                                    code = code * 8 + '01234567'.indexOf(source[index++]);
                                }
                            }
                            str += String.fromCharCode(code);
                        } else {
                            str += ch;
                        }
                        break;
                    }
                } else {
                    ++lineNumber;
                    if (ch ===  '\r' && source[index] === '\n') {
                        ++index;
                    }
                    lineStart = index;
                }
            } else if (isLineTerminator(ch.charCodeAt(0))) {
                break;
            } else {
                str += ch;
            }
        }

        if (quote !== '') {
            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
        }

        return {
            type: Token.StringLiteral,
            value: str,
            octal: octal,
            startLineNumber: startLineNumber,
            startLineStart: startLineStart,
            lineNumber: lineNumber,
            lineStart: lineStart,
            start: start,
            end: index
        };
    }

    function testRegExp(pattern, flags) {
        var value;
        try {
            value = new RegExp(pattern, flags);
        } catch (e) {
            throwError({}, Messages.InvalidRegExp);
        }
        return value;
    }

    function scanRegExpBody() {
        var ch, str, classMarker, terminated, body;

        ch = source[index];
        assert(ch === '/', 'Regular expression literal must start with a slash');
        str = source[index++];

        classMarker = false;
        terminated = false;
        while (index < length) {
            ch = source[index++];
            str += ch;
            if (ch === '\\') {
                ch = source[index++];
                // ECMA-262 7.8.5
                if (isLineTerminator(ch.charCodeAt(0))) {
                    throwError({}, Messages.UnterminatedRegExp);
                }
                str += ch;
            } else if (isLineTerminator(ch.charCodeAt(0))) {
                throwError({}, Messages.UnterminatedRegExp);
            } else if (classMarker) {
                if (ch === ']') {
                    classMarker = false;
                }
            } else {
                if (ch === '/') {
                    terminated = true;
                    break;
                } else if (ch === '[') {
                    classMarker = true;
                }
            }
        }

        if (!terminated) {
            throwError({}, Messages.UnterminatedRegExp);
        }

        // Exclude leading and trailing slash.
        body = str.substr(1, str.length - 2);
        return {
            value: body,
            literal: str
        };
    }

    function scanRegExpFlags() {
        var ch, str, flags, restore;

        str = '';
        flags = '';
        while (index < length) {
            ch = source[index];
            if (!isIdentifierPart(ch.charCodeAt(0))) {
                break;
            }

            ++index;
            if (ch === '\\' && index < length) {
                ch = source[index];
                if (ch === 'u') {
                    ++index;
                    restore = index;
                    ch = scanHexEscape('u');
                    if (ch) {
                        flags += ch;
                        for (str += '\\u'; restore < index; ++restore) {
                            str += source[restore];
                        }
                    } else {
                        index = restore;
                        flags += 'u';
                        str += '\\u';
                    }
                    throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL');
                } else {
                    str += '\\';
                    throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL');
                }
            } else {
                flags += ch;
                str += ch;
            }
        }

        return {
            value: flags,
            literal: str
        };
    }

    function scanRegExp() {
        var start, body, flags, pattern, value;

        lookahead = null;
        skipComment();
        start = index;

        body = scanRegExpBody();
        flags = scanRegExpFlags();
        value = testRegExp(body.value, flags.value);

        if (extra.tokenize) {
            return {
                type: Token.RegularExpression,
                value: value,
                lineNumber: lineNumber,
                lineStart: lineStart,
                start: start,
                end: index
            };
        }

        return {
            literal: body.literal + flags.literal,
            value: value,
            start: start,
            end: index
        };
    }

    function collectRegex() {
        var pos, loc, regex, token;

        skipComment();

        pos = index;
        loc = {
            start: {
                line: lineNumber,
                column: index - lineStart
            }
        };

        regex = scanRegExp();
        loc.end = {
            line: lineNumber,
            column: index - lineStart
        };

        /* istanbul ignore next */
        if (!extra.tokenize) {
            // Pop the previous token, which is likely '/' or '/='
            if (extra.tokens.length > 0) {
                token = extra.tokens[extra.tokens.length - 1];
                if (token.range[0] === pos && token.type === 'Punctuator') {
                    if (token.value === '/' || token.value === '/=') {
                        extra.tokens.pop();
                    }
                }
            }

            extra.tokens.push({
                type: 'RegularExpression',
                value: regex.literal,
                range: [pos, index],
                loc: loc
            });
        }

        return regex;
    }

    function isIdentifierName(token) {
        return token.type === Token.Identifier ||
            token.type === Token.Keyword ||
            token.type === Token.BooleanLiteral ||
            token.type === Token.NullLiteral;
    }

    function advanceSlash() {
        var prevToken,
            checkToken;
        // Using the following algorithm:
        // https://github.com/mozilla/sweet.js/wiki/design
        prevToken = extra.tokens[extra.tokens.length - 1];
        if (!prevToken) {
            // Nothing before that: it cannot be a division.
            return collectRegex();
        }
        if (prevToken.type === 'Punctuator') {
            if (prevToken.value === ']') {
                return scanPunctuator();
            }
            if (prevToken.value === ')') {
                checkToken = extra.tokens[extra.openParenToken - 1];
                if (checkToken &&
                        checkToken.type === 'Keyword' &&
                        (checkToken.value === 'if' ||
                         checkToken.value === 'while' ||
                         checkToken.value === 'for' ||
                         checkToken.value === 'with')) {
                    return collectRegex();
                }
                return scanPunctuator();
            }
            if (prevToken.value === '}') {
                // Dividing a function by anything makes little sense,
                // but we have to check for that.
                if (extra.tokens[extra.openCurlyToken - 3] &&
                        extra.tokens[extra.openCurlyToken - 3].type === 'Keyword') {
                    // Anonymous function.
                    checkToken = extra.tokens[extra.openCurlyToken - 4];
                    if (!checkToken) {
                        return scanPunctuator();
                    }
                } else if (extra.tokens[extra.openCurlyToken - 4] &&
                        extra.tokens[extra.openCurlyToken - 4].type === 'Keyword') {
                    // Named function.
                    checkToken = extra.tokens[extra.openCurlyToken - 5];
                    if (!checkToken) {
                        return collectRegex();
                    }
                } else {
                    return scanPunctuator();
                }
                // checkToken determines whether the function is
                // a declaration or an expression.
                if (FnExprTokens.indexOf(checkToken.value) >= 0) {
                    // It is an expression.
                    return scanPunctuator();
                }
                // It is a declaration.
                return collectRegex();
            }
            return collectRegex();
        }
        if (prevToken.type === 'Keyword') {
            return collectRegex();
        }
        return scanPunctuator();
    }

    function advance() {
        var ch;

        skipComment();

        if (index >= length) {
            return {
                type: Token.EOF,
                lineNumber: lineNumber,
                lineStart: lineStart,
                start: index,
                end: index
            };
        }

        ch = source.charCodeAt(index);

        if (isIdentifierStart(ch)) {
            return scanIdentifier();
        }

        // Very common: ( and ) and ;
        if (ch === 0x28 || ch === 0x29 || ch === 0x3B) {
            return scanPunctuator();
        }

        // String literal starts with single quote (U+0027) or double quote (U+0022).
        if (ch === 0x27 || ch === 0x22) {
            return scanStringLiteral();
        }


        // Dot (.) U+002E can also start a floating-point number, hence the need
        // to check the next character.
        if (ch === 0x2E) {
            if (isDecimalDigit(source.charCodeAt(index + 1))) {
                return scanNumericLiteral();
            }
            return scanPunctuator();
        }

        if (isDecimalDigit(ch)) {
            return scanNumericLiteral();
        }

        // Slash (/) U+002F can also start a regex.
        if (extra.tokenize && ch === 0x2F) {
            return advanceSlash();
        }

        return scanPunctuator();
    }

    function collectToken() {
        var loc, token, range, value;

        skipComment();
        loc = {
            start: {
                line: lineNumber,
                column: index - lineStart
            }
        };

        token = advance();
        loc.end = {
            line: lineNumber,
            column: index - lineStart
        };

        if (token.type !== Token.EOF) {
            value = source.slice(token.start, token.end);
            extra.tokens.push({
                type: TokenName[token.type],
                value: value,
                range: [token.start, token.end],
                loc: loc
            });
        }

        return token;
    }

    function lex() {
        var token;

        token = lookahead;
        index = token.end;
        lineNumber = token.lineNumber;
        lineStart = token.lineStart;

        lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();

        index = token.end;
        lineNumber = token.lineNumber;
        lineStart = token.lineStart;

        return token;
    }

    function peek() {
        var pos, line, start;

        pos = index;
        line = lineNumber;
        start = lineStart;
        lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();
        index = pos;
        lineNumber = line;
        lineStart = start;
    }

    function Position(line, column) {
        this.line = line;
        this.column = column;
    }

    function SourceLocation(startLine, startColumn, line, column) {
        this.start = new Position(startLine, startColumn);
        this.end = new Position(line, column);
    }

    SyntaxTreeDelegate = {

        name: 'SyntaxTree',

        processComment: function (node) {
            var lastChild, trailingComments;

            if (node.type === Syntax.Program) {
                if (node.body.length > 0) {
                    return;
                }
            }

            if (extra.trailingComments.length > 0) {
                if (extra.trailingComments[0].range[0] >= node.range[1]) {
                    trailingComments = extra.trailingComments;
                    extra.trailingComments = [];
                } else {
                    extra.trailingComments.length = 0;
                }
            } else {
                if (extra.bottomRightStack.length > 0 &&
                        extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments &&
                        extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments[0].range[0] >= node.range[1]) {
                    trailingComments = extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;
                    delete extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;
                }
            }

            // Eating the stack.
            while (extra.bottomRightStack.length > 0 && extra.bottomRightStack[extra.bottomRightStack.length - 1].range[0] >= node.range[0]) {
                lastChild = extra.bottomRightStack.pop();
            }

            if (lastChild) {
                if (lastChild.leadingComments && lastChild.leadingComments[lastChild.leadingComments.length - 1].range[1] <= node.range[0]) {
                    node.leadingComments = lastChild.leadingComments;
                    delete lastChild.leadingComments;
                }
            } else if (extra.leadingComments.length > 0 && extra.leadingComments[extra.leadingComments.length - 1].range[1] <= node.range[0]) {
                node.leadingComments = extra.leadingComments;
                extra.leadingComments = [];
            }


            if (trailingComments) {
                node.trailingComments = trailingComments;
            }

            extra.bottomRightStack.push(node);
        },

        markEnd: function (node, startToken) {
            if (extra.range) {
                node.range = [startToken.start, index];
            }
            if (extra.loc) {
                node.loc = new SourceLocation(
                    startToken.startLineNumber === undefined ?  startToken.lineNumber : startToken.startLineNumber,
                    startToken.start - (startToken.startLineStart === undefined ?  startToken.lineStart : startToken.startLineStart),
                    lineNumber,
                    index - lineStart
                );
                this.postProcess(node);
            }

            if (extra.attachComment) {
                this.processComment(node);
            }
            return node;
        },

        postProcess: function (node) {
            if (extra.source) {
                node.loc.source = extra.source;
            }
            return node;
        },

        createArrayExpression: function (elements) {
            return {
                type: Syntax.ArrayExpression,
                elements: elements
            };
        },

        createAssignmentExpression: function (operator, left, right) {
            return {
                type: Syntax.AssignmentExpression,
                operator: operator,
                left: left,
                right: right
            };
        },

        createBinaryExpression: function (operator, left, right) {
            var type = (operator === '||' || operator === '&&') ? Syntax.LogicalExpression :
                        Syntax.BinaryExpression;
            return {
                type: type,
                operator: operator,
                left: left,
                right: right
            };
        },

        createBlockStatement: function (body) {
            return {
                type: Syntax.BlockStatement,
                body: body
            };
        },

        createBreakStatement: function (label) {
            return {
                type: Syntax.BreakStatement,
                label: label
            };
        },

        createCallExpression: function (callee, args) {
            return {
                type: Syntax.CallExpression,
                callee: callee,
                'arguments': args
            };
        },

        createCatchClause: function (param, body) {
            return {
                type: Syntax.CatchClause,
                param: param,
                body: body
            };
        },

        createConditionalExpression: function (test, consequent, alternate) {
            return {
                type: Syntax.ConditionalExpression,
                test: test,
                consequent: consequent,
                alternate: alternate
            };
        },

        createContinueStatement: function (label) {
            return {
                type: Syntax.ContinueStatement,
                label: label
            };
        },

        createDebuggerStatement: function () {
            return {
                type: Syntax.DebuggerStatement
            };
        },

        createDoWhileStatement: function (body, test) {
            return {
                type: Syntax.DoWhileStatement,
                body: body,
                test: test
            };
        },

        createEmptyStatement: function () {
            return {
                type: Syntax.EmptyStatement
            };
        },

        createExpressionStatement: function (expression) {
            return {
                type: Syntax.ExpressionStatement,
                expression: expression
            };
        },

        createForStatement: function (init, test, update, body) {
            return {
                type: Syntax.ForStatement,
                init: init,
                test: test,
                update: update,
                body: body
            };
        },

        createForInStatement: function (left, right, body) {
            return {
                type: Syntax.ForInStatement,
                left: left,
                right: right,
                body: body,
                each: false
            };
        },

        createFunctionDeclaration: function (id, params, defaults, body) {
            return {
                type: Syntax.FunctionDeclaration,
                id: id,
                params: params,
                defaults: defaults,
                body: body,
                rest: null,
                generator: false,
                expression: false
            };
        },

        createFunctionExpression: function (id, params, defaults, body) {
            return {
                type: Syntax.FunctionExpression,
                id: id,
                params: params,
                defaults: defaults,
                body: body,
                rest: null,
                generator: false,
                expression: false
            };
        },

        createIdentifier: function (name) {
            return {
                type: Syntax.Identifier,
                name: name
            };
        },

        createIfStatement: function (test, consequent, alternate) {
            return {
                type: Syntax.IfStatement,
                test: test,
                consequent: consequent,
                alternate: alternate
            };
        },

        createLabeledStatement: function (label, body) {
            return {
                type: Syntax.LabeledStatement,
                label: label,
                body: body
            };
        },

        createLiteral: function (token) {
            return {
                type: Syntax.Literal,
                value: token.value,
                raw: source.slice(token.start, token.end)
            };
        },

        createMemberExpression: function (accessor, object, property) {
            return {
                type: Syntax.MemberExpression,
                computed: accessor === '[',
                object: object,
                property: property
            };
        },

        createNewExpression: function (callee, args) {
            return {
                type: Syntax.NewExpression,
                callee: callee,
                'arguments': args
            };
        },

        createObjectExpression: function (properties) {
            return {
                type: Syntax.ObjectExpression,
                properties: properties
            };
        },

        createPostfixExpression: function (operator, argument) {
            return {
                type: Syntax.UpdateExpression,
                operator: operator,
                argument: argument,
                prefix: false
            };
        },

        createProgram: function (body) {
            return {
                type: Syntax.Program,
                body: body
            };
        },

        createProperty: function (kind, key, value) {
            return {
                type: Syntax.Property,
                key: key,
                value: value,
                kind: kind
            };
        },

        createReturnStatement: function (argument) {
            return {
                type: Syntax.ReturnStatement,
                argument: argument
            };
        },

        createSequenceExpression: function (expressions) {
            return {
                type: Syntax.SequenceExpression,
                expressions: expressions
            };
        },

        createSwitchCase: function (test, consequent) {
            return {
                type: Syntax.SwitchCase,
                test: test,
                consequent: consequent
            };
        },

        createSwitchStatement: function (discriminant, cases) {
            return {
                type: Syntax.SwitchStatement,
                discriminant: discriminant,
                cases: cases
            };
        },

        createThisExpression: function () {
            return {
                type: Syntax.ThisExpression
            };
        },

        createThrowStatement: function (argument) {
            return {
                type: Syntax.ThrowStatement,
                argument: argument
            };
        },

        createTryStatement: function (block, guardedHandlers, handlers, finalizer) {
            return {
                type: Syntax.TryStatement,
                block: block,
                guardedHandlers: guardedHandlers,
                handlers: handlers,
                finalizer: finalizer
            };
        },

        createUnaryExpression: function (operator, argument) {
            if (operator === '++' || operator === '--') {
                return {
                    type: Syntax.UpdateExpression,
                    operator: operator,
                    argument: argument,
                    prefix: true
                };
            }
            return {
                type: Syntax.UnaryExpression,
                operator: operator,
                argument: argument,
                prefix: true
            };
        },

        createVariableDeclaration: function (declarations, kind) {
            return {
                type: Syntax.VariableDeclaration,
                declarations: declarations,
                kind: kind
            };
        },

        createVariableDeclarator: function (id, init) {
            return {
                type: Syntax.VariableDeclarator,
                id: id,
                init: init
            };
        },

        createWhileStatement: function (test, body) {
            return {
                type: Syntax.WhileStatement,
                test: test,
                body: body
            };
        },

        createWithStatement: function (object, body) {
            return {
                type: Syntax.WithStatement,
                object: object,
                body: body
            };
        }
    };

    // Return true if there is a line terminator before the next token.

    function peekLineTerminator() {
        var pos, line, start, found;

        pos = index;
        line = lineNumber;
        start = lineStart;
        skipComment();
        found = lineNumber !== line;
        index = pos;
        lineNumber = line;
        lineStart = start;

        return found;
    }

    // Throw an exception

    function throwError(token, messageFormat) {
        var error,
            args = Array.prototype.slice.call(arguments, 2),
            msg = messageFormat.replace(
                /%(\d)/g,
                function (whole, index) {
                    assert(index < args.length, 'Message reference must be in range');
                    return args[index];
                }
            );

        if (typeof token.lineNumber === 'number') {
            error = new Error('Line ' + token.lineNumber + ': ' + msg);
            error.index = token.start;
            error.lineNumber = token.lineNumber;
            error.column = token.start - lineStart + 1;
        } else {
            error = new Error('Line ' + lineNumber + ': ' + msg);
            error.index = index;
            error.lineNumber = lineNumber;
            error.column = index - lineStart + 1;
        }

        error.description = msg;
        throw error;
    }

    function throwErrorTolerant() {
        try {
            throwError.apply(null, arguments);
        } catch (e) {
            if (extra.errors) {
                extra.errors.push(e);
            } else {
                throw e;
            }
        }
    }


    // Throw an exception because of the token.

    function throwUnexpected(token) {
        if (token.type === Token.EOF) {
            throwError(token, Messages.UnexpectedEOS);
        }

        if (token.type === Token.NumericLiteral) {
            throwError(token, Messages.UnexpectedNumber);
        }

        if (token.type === Token.StringLiteral) {
            throwError(token, Messages.UnexpectedString);
        }

        if (token.type === Token.Identifier) {
            throwError(token, Messages.UnexpectedIdentifier);
        }

        if (token.type === Token.Keyword) {
            if (isFutureReservedWord(token.value)) {
                throwError(token, Messages.UnexpectedReserved);
            } else if (strict && isStrictModeReservedWord(token.value)) {
                throwErrorTolerant(token, Messages.StrictReservedWord);
                return;
            }
            throwError(token, Messages.UnexpectedToken, token.value);
        }

        // BooleanLiteral, NullLiteral, or Punctuator.
        throwError(token, Messages.UnexpectedToken, token.value);
    }

    // Expect the next token to match the specified punctuator.
    // If not, an exception will be thrown.

    function expect(value) {
        var token = lex();
        if (token.type !== Token.Punctuator || token.value !== value) {
            throwUnexpected(token);
        }
    }

    // Expect the next token to match the specified keyword.
    // If not, an exception will be thrown.

    function expectKeyword(keyword) {
        var token = lex();
        if (token.type !== Token.Keyword || token.value !== keyword) {
            throwUnexpected(token);
        }
    }

    // Return true if the next token matches the specified punctuator.

    function match(value) {
        return lookahead.type === Token.Punctuator && lookahead.value === value;
    }

    // Return true if the next token matches the specified keyword

    function matchKeyword(keyword) {
        return lookahead.type === Token.Keyword && lookahead.value === keyword;
    }

    // Return true if the next token is an assignment operator

    function matchAssign() {
        var op;

        if (lookahead.type !== Token.Punctuator) {
            return false;
        }
        op = lookahead.value;
        return op === '=' ||
            op === '*=' ||
            op === '/=' ||
            op === '%=' ||
            op === '+=' ||
            op === '-=' ||
            op === '<<=' ||
            op === '>>=' ||
            op === '>>>=' ||
            op === '&=' ||
            op === '^=' ||
            op === '|=';
    }

    function consumeSemicolon() {
        var line;

        // Catch the very common case first: immediately a semicolon (U+003B).
        if (source.charCodeAt(index) === 0x3B || match(';')) {
            lex();
            return;
        }

        line = lineNumber;
        skipComment();
        if (lineNumber !== line) {
            return;
        }

        if (lookahead.type !== Token.EOF && !match('}')) {
            throwUnexpected(lookahead);
        }
    }

    // Return true if provided expression is LeftHandSideExpression

    function isLeftHandSide(expr) {
        return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression;
    }

    // 11.1.4 Array Initialiser

    function parseArrayInitialiser() {
        var elements = [], startToken;

        startToken = lookahead;
        expect('[');

        while (!match(']')) {
            if (match(',')) {
                lex();
                elements.push(null);
            } else {
                elements.push(parseAssignmentExpression());

                if (!match(']')) {
                    expect(',');
                }
            }
        }

        lex();

        return delegate.markEnd(delegate.createArrayExpression(elements), startToken);
    }

    // 11.1.5 Object Initialiser

    function parsePropertyFunction(param, first) {
        var previousStrict, body, startToken;

        previousStrict = strict;
        startToken = lookahead;
        body = parseFunctionSourceElements();
        if (first && strict && isRestrictedWord(param[0].name)) {
            throwErrorTolerant(first, Messages.StrictParamName);
        }
        strict = previousStrict;
        return delegate.markEnd(delegate.createFunctionExpression(null, param, [], body), startToken);
    }

    function parseObjectPropertyKey() {
        var token, startToken;

        startToken = lookahead;
        token = lex();

        // Note: This function is called only from parseObjectProperty(), where
        // EOF and Punctuator tokens are already filtered out.

        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {
            if (strict && token.octal) {
                throwErrorTolerant(token, Messages.StrictOctalLiteral);
            }
            return delegate.markEnd(delegate.createLiteral(token), startToken);
        }

        return delegate.markEnd(delegate.createIdentifier(token.value), startToken);
    }

    function parseObjectProperty() {
        var token, key, id, value, param, startToken;

        token = lookahead;
        startToken = lookahead;

        if (token.type === Token.Identifier) {

            id = parseObjectPropertyKey();

            // Property Assignment: Getter and Setter.

            if (token.value === 'get' && !match(':')) {
                key = parseObjectPropertyKey();
                expect('(');
                expect(')');
                value = parsePropertyFunction([]);
                return delegate.markEnd(delegate.createProperty('get', key, value), startToken);
            }
            if (token.value === 'set' && !match(':')) {
                key = parseObjectPropertyKey();
                expect('(');
                token = lookahead;
                if (token.type !== Token.Identifier) {
                    expect(')');
                    throwErrorTolerant(token, Messages.UnexpectedToken, token.value);
                    value = parsePropertyFunction([]);
                } else {
                    param = [ parseVariableIdentifier() ];
                    expect(')');
                    value = parsePropertyFunction(param, token);
                }
                return delegate.markEnd(delegate.createProperty('set', key, value), startToken);
            }
            expect(':');
            value = parseAssignmentExpression();
            return delegate.markEnd(delegate.createProperty('init', id, value), startToken);
        }
        if (token.type === Token.EOF || token.type === Token.Punctuator) {
            throwUnexpected(token);
        } else {
            key = parseObjectPropertyKey();
            expect(':');
            value = parseAssignmentExpression();
            return delegate.markEnd(delegate.createProperty('init', key, value), startToken);
        }
    }

    function parseObjectInitialiser() {
        var properties = [], property, name, key, kind, map = {}, toString = String, startToken;

        startToken = lookahead;

        expect('{');

        while (!match('}')) {
            property = parseObjectProperty();

            if (property.key.type === Syntax.Identifier) {
                name = property.key.name;
            } else {
                name = toString(property.key.value);
            }
            kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set;

            key = '$' + name;
            if (Object.prototype.hasOwnProperty.call(map, key)) {
                if (map[key] === PropertyKind.Data) {
                    if (strict && kind === PropertyKind.Data) {
                        throwErrorTolerant({}, Messages.StrictDuplicateProperty);
                    } else if (kind !== PropertyKind.Data) {
                        throwErrorTolerant({}, Messages.AccessorDataProperty);
                    }
                } else {
                    if (kind === PropertyKind.Data) {
                        throwErrorTolerant({}, Messages.AccessorDataProperty);
                    } else if (map[key] & kind) {
                        throwErrorTolerant({}, Messages.AccessorGetSet);
                    }
                }
                map[key] |= kind;
            } else {
                map[key] = kind;
            }

            properties.push(property);

            if (!match('}')) {
                expect(',');
            }
        }

        expect('}');

        return delegate.markEnd(delegate.createObjectExpression(properties), startToken);
    }

    // 11.1.6 The Grouping Operator

    function parseGroupExpression() {
        var expr;

        expect('(');

        expr = parseExpression();

        expect(')');

        return expr;
    }


    // 11.1 Primary Expressions

    function parsePrimaryExpression() {
        var type, token, expr, startToken;

        if (match('(')) {
            return parseGroupExpression();
        }

        if (match('[')) {
            return parseArrayInitialiser();
        }

        if (match('{')) {
            return parseObjectInitialiser();
        }

        type = lookahead.type;
        startToken = lookahead;

        if (type === Token.Identifier) {
            expr =  delegate.createIdentifier(lex().value);
        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {
            if (strict && lookahead.octal) {
                throwErrorTolerant(lookahead, Messages.StrictOctalLiteral);
            }
            expr = delegate.createLiteral(lex());
        } else if (type === Token.Keyword) {
            if (matchKeyword('function')) {
                return parseFunctionExpression();
            }
            if (matchKeyword('this')) {
                lex();
                expr = delegate.createThisExpression();
            } else {
                throwUnexpected(lex());
            }
        } else if (type === Token.BooleanLiteral) {
            token = lex();
            token.value = (token.value === 'true');
            expr = delegate.createLiteral(token);
        } else if (type === Token.NullLiteral) {
            token = lex();
            token.value = null;
            expr = delegate.createLiteral(token);
        } else if (match('/') || match('/=')) {
            if (typeof extra.tokens !== 'undefined') {
                expr = delegate.createLiteral(collectRegex());
            } else {
                expr = delegate.createLiteral(scanRegExp());
            }
            peek();
        } else {
            throwUnexpected(lex());
        }

        return delegate.markEnd(expr, startToken);
    }

    // 11.2 Left-Hand-Side Expressions

    function parseArguments() {
        var args = [];

        expect('(');

        if (!match(')')) {
            while (index < length) {
                args.push(parseAssignmentExpression());
                if (match(')')) {
                    break;
                }
                expect(',');
            }
        }

        expect(')');

        return args;
    }

    function parseNonComputedProperty() {
        var token, startToken;

        startToken = lookahead;
        token = lex();

        if (!isIdentifierName(token)) {
            throwUnexpected(token);
        }

        return delegate.markEnd(delegate.createIdentifier(token.value), startToken);
    }

    function parseNonComputedMember() {
        expect('.');

        return parseNonComputedProperty();
    }

    function parseComputedMember() {
        var expr;

        expect('[');

        expr = parseExpression();

        expect(']');

        return expr;
    }

    function parseNewExpression() {
        var callee, args, startToken;

        startToken = lookahead;
        expectKeyword('new');
        callee = parseLeftHandSideExpression();
        args = match('(') ? parseArguments() : [];

        return delegate.markEnd(delegate.createNewExpression(callee, args), startToken);
    }

    function parseLeftHandSideExpressionAllowCall() {
        var previousAllowIn, expr, args, property, startToken;

        startToken = lookahead;

        previousAllowIn = state.allowIn;
        state.allowIn = true;
        expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();
        state.allowIn = previousAllowIn;

        for (;;) {
            if (match('.')) {
                property = parseNonComputedMember();
                expr = delegate.createMemberExpression('.', expr, property);
            } else if (match('(')) {
                args = parseArguments();
                expr = delegate.createCallExpression(expr, args);
            } else if (match('[')) {
                property = parseComputedMember();
                expr = delegate.createMemberExpression('[', expr, property);
            } else {
                break;
            }
            delegate.markEnd(expr, startToken);
        }

        return expr;
    }

    function parseLeftHandSideExpression() {
        var previousAllowIn, expr, property, startToken;

        startToken = lookahead;

        previousAllowIn = state.allowIn;
        expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();
        state.allowIn = previousAllowIn;

        while (match('.') || match('[')) {
            if (match('[')) {
                property = parseComputedMember();
                expr = delegate.createMemberExpression('[', expr, property);
            } else {
                property = parseNonComputedMember();
                expr = delegate.createMemberExpression('.', expr, property);
            }
            delegate.markEnd(expr, startToken);
        }

        return expr;
    }

    // 11.3 Postfix Expressions

    function parsePostfixExpression() {
        var expr, token, startToken = lookahead;

        expr = parseLeftHandSideExpressionAllowCall();

        if (lookahead.type === Token.Punctuator) {
            if ((match('++') || match('--')) && !peekLineTerminator()) {
                // 11.3.1, 11.3.2
                if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
                    throwErrorTolerant({}, Messages.StrictLHSPostfix);
                }

                if (!isLeftHandSide(expr)) {
                    throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
                }

                token = lex();
                expr = delegate.markEnd(delegate.createPostfixExpression(token.value, expr), startToken);
            }
        }

        return expr;
    }

    // 11.4 Unary Operators

    function parseUnaryExpression() {
        var token, expr, startToken;

        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {
            expr = parsePostfixExpression();
        } else if (match('++') || match('--')) {
            startToken = lookahead;
            token = lex();
            expr = parseUnaryExpression();
            // 11.4.4, 11.4.5
            if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
                throwErrorTolerant({}, Messages.StrictLHSPrefix);
            }

            if (!isLeftHandSide(expr)) {
                throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
            }

            expr = delegate.createUnaryExpression(token.value, expr);
            expr = delegate.markEnd(expr, startToken);
        } else if (match('+') || match('-') || match('~') || match('!')) {
            startToken = lookahead;
            token = lex();
            expr = parseUnaryExpression();
            expr = delegate.createUnaryExpression(token.value, expr);
            expr = delegate.markEnd(expr, startToken);
        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {
            startToken = lookahead;
            token = lex();
            expr = parseUnaryExpression();
            expr = delegate.createUnaryExpression(token.value, expr);
            expr = delegate.markEnd(expr, startToken);
            if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) {
                throwErrorTolerant({}, Messages.StrictDelete);
            }
        } else {
            expr = parsePostfixExpression();
        }

        return expr;
    }

    function binaryPrecedence(token, allowIn) {
        var prec = 0;

        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {
            return 0;
        }

        switch (token.value) {
        case '||':
            prec = 1;
            break;

        case '&&':
            prec = 2;
            break;

        case '|':
            prec = 3;
            break;

        case '^':
            prec = 4;
            break;

        case '&':
            prec = 5;
            break;

        case '==':
        case '!=':
        case '===':
        case '!==':
            prec = 6;
            break;

        case '<':
        case '>':
        case '<=':
        case '>=':
        case 'instanceof':
            prec = 7;
            break;

        case 'in':
            prec = allowIn ? 7 : 0;
            break;

        case '<<':
        case '>>':
        case '>>>':
            prec = 8;
            break;

        case '+':
        case '-':
            prec = 9;
            break;

        case '*':
        case '/':
        case '%':
            prec = 11;
            break;

        default:
            break;
        }

        return prec;
    }

    // 11.5 Multiplicative Operators
    // 11.6 Additive Operators
    // 11.7 Bitwise Shift Operators
    // 11.8 Relational Operators
    // 11.9 Equality Operators
    // 11.10 Binary Bitwise Operators
    // 11.11 Binary Logical Operators

    function parseBinaryExpression() {
        var marker, markers, expr, token, prec, stack, right, operator, left, i;

        marker = lookahead;
        left = parseUnaryExpression();

        token = lookahead;
        prec = binaryPrecedence(token, state.allowIn);
        if (prec === 0) {
            return left;
        }
        token.prec = prec;
        lex();

        markers = [marker, lookahead];
        right = parseUnaryExpression();

        stack = [left, token, right];

        while ((prec = binaryPrecedence(lookahead, state.allowIn)) > 0) {

            // Reduce: make a binary expression from the three topmost entries.
            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {
                right = stack.pop();
                operator = stack.pop().value;
                left = stack.pop();
                expr = delegate.createBinaryExpression(operator, left, right);
                markers.pop();
                marker = markers[markers.length - 1];
                delegate.markEnd(expr, marker);
                stack.push(expr);
            }

            // Shift.
            token = lex();
            token.prec = prec;
            stack.push(token);
            markers.push(lookahead);
            expr = parseUnaryExpression();
            stack.push(expr);
        }

        // Final reduce to clean-up the stack.
        i = stack.length - 1;
        expr = stack[i];
        markers.pop();
        while (i > 1) {
            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);
            i -= 2;
            marker = markers.pop();
            delegate.markEnd(expr, marker);
        }

        return expr;
    }


    // 11.12 Conditional Operator

    function parseConditionalExpression() {
        var expr, previousAllowIn, consequent, alternate, startToken;

        startToken = lookahead;

        expr = parseBinaryExpression();

        if (match('?')) {
            lex();
            previousAllowIn = state.allowIn;
            state.allowIn = true;
            consequent = parseAssignmentExpression();
            state.allowIn = previousAllowIn;
            expect(':');
            alternate = parseAssignmentExpression();

            expr = delegate.createConditionalExpression(expr, consequent, alternate);
            delegate.markEnd(expr, startToken);
        }

        return expr;
    }

    // 11.13 Assignment Operators

    function parseAssignmentExpression() {
        var token, left, right, node, startToken;

        token = lookahead;
        startToken = lookahead;

        node = left = parseConditionalExpression();

        if (matchAssign()) {
            // LeftHandSideExpression
            if (!isLeftHandSide(left)) {
                throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
            }

            // 11.13.1
            if (strict && left.type === Syntax.Identifier && isRestrictedWord(left.name)) {
                throwErrorTolerant(token, Messages.StrictLHSAssignment);
            }

            token = lex();
            right = parseAssignmentExpression();
            node = delegate.markEnd(delegate.createAssignmentExpression(token.value, left, right), startToken);
        }

        return node;
    }

    // 11.14 Comma Operator

    function parseExpression() {
        var expr, startToken = lookahead;

        expr = parseAssignmentExpression();

        if (match(',')) {
            expr = delegate.createSequenceExpression([ expr ]);

            while (index < length) {
                if (!match(',')) {
                    break;
                }
                lex();
                expr.expressions.push(parseAssignmentExpression());
            }

            delegate.markEnd(expr, startToken);
        }

        return expr;
    }

    // 12.1 Block

    function parseStatementList() {
        var list = [],
            statement;

        while (index < length) {
            if (match('}')) {
                break;
            }
            statement = parseSourceElement();
            if (typeof statement === 'undefined') {
                break;
            }
            list.push(statement);
        }

        return list;
    }

    function parseBlock() {
        var block, startToken;

        startToken = lookahead;
        expect('{');

        block = parseStatementList();

        expect('}');

        return delegate.markEnd(delegate.createBlockStatement(block), startToken);
    }

    // 12.2 Variable Statement

    function parseVariableIdentifier() {
        var token, startToken;

        startToken = lookahead;
        token = lex();

        if (token.type !== Token.Identifier) {
            throwUnexpected(token);
        }

        return delegate.markEnd(delegate.createIdentifier(token.value), startToken);
    }

    function parseVariableDeclaration(kind) {
        var init = null, id, startToken;

        startToken = lookahead;
        id = parseVariableIdentifier();

        // 12.2.1
        if (strict && isRestrictedWord(id.name)) {
            throwErrorTolerant({}, Messages.StrictVarName);
        }

        if (kind === 'const') {
            expect('=');
            init = parseAssignmentExpression();
        } else if (match('=')) {
            lex();
            init = parseAssignmentExpression();
        }

        return delegate.markEnd(delegate.createVariableDeclarator(id, init), startToken);
    }

    function parseVariableDeclarationList(kind) {
        var list = [];

        do {
            list.push(parseVariableDeclaration(kind));
            if (!match(',')) {
                break;
            }
            lex();
        } while (index < length);

        return list;
    }

    function parseVariableStatement() {
        var declarations;

        expectKeyword('var');

        declarations = parseVariableDeclarationList();

        consumeSemicolon();

        return delegate.createVariableDeclaration(declarations, 'var');
    }

    // kind may be `const` or `let`
    // Both are experimental and not in the specification yet.
    // see http://wiki.ecmascript.org/doku.php?id=harmony:const
    // and http://wiki.ecmascript.org/doku.php?id=harmony:let
    function parseConstLetDeclaration(kind) {
        var declarations, startToken;

        startToken = lookahead;

        expectKeyword(kind);

        declarations = parseVariableDeclarationList(kind);

        consumeSemicolon();

        return delegate.markEnd(delegate.createVariableDeclaration(declarations, kind), startToken);
    }

    // 12.3 Empty Statement

    function parseEmptyStatement() {
        expect(';');
        return delegate.createEmptyStatement();
    }

    // 12.4 Expression Statement

    function parseExpressionStatement() {
        var expr = parseExpression();
        consumeSemicolon();
        return delegate.createExpressionStatement(expr);
    }

    // 12.5 If statement

    function parseIfStatement() {
        var test, consequent, alternate;

        expectKeyword('if');

        expect('(');

        test = parseExpression();

        expect(')');

        consequent = parseStatement();

        if (matchKeyword('else')) {
            lex();
            alternate = parseStatement();
        } else {
            alternate = null;
        }

        return delegate.createIfStatement(test, consequent, alternate);
    }

    // 12.6 Iteration Statements

    function parseDoWhileStatement() {
        var body, test, oldInIteration;

        expectKeyword('do');

        oldInIteration = state.inIteration;
        state.inIteration = true;

        body = parseStatement();

        state.inIteration = oldInIteration;

        expectKeyword('while');

        expect('(');

        test = parseExpression();

        expect(')');

        if (match(';')) {
            lex();
        }

        return delegate.createDoWhileStatement(body, test);
    }

    function parseWhileStatement() {
        var test, body, oldInIteration;

        expectKeyword('while');

        expect('(');

        test = parseExpression();

        expect(')');

        oldInIteration = state.inIteration;
        state.inIteration = true;

        body = parseStatement();

        state.inIteration = oldInIteration;

        return delegate.createWhileStatement(test, body);
    }

    function parseForVariableDeclaration() {
        var token, declarations, startToken;

        startToken = lookahead;
        token = lex();
        declarations = parseVariableDeclarationList();

        return delegate.markEnd(delegate.createVariableDeclaration(declarations, token.value), startToken);
    }

    function parseForStatement() {
        var init, test, update, left, right, body, oldInIteration;

        init = test = update = null;

        expectKeyword('for');

        expect('(');

        if (match(';')) {
            lex();
        } else {
            if (matchKeyword('var') || matchKeyword('let')) {
                state.allowIn = false;
                init = parseForVariableDeclaration();
                state.allowIn = true;

                if (init.declarations.length === 1 && matchKeyword('in')) {
                    lex();
                    left = init;
                    right = parseExpression();
                    init = null;
                }
            } else {
                state.allowIn = false;
                init = parseExpression();
                state.allowIn = true;

                if (matchKeyword('in')) {
                    // LeftHandSideExpression
                    if (!isLeftHandSide(init)) {
                        throwErrorTolerant({}, Messages.InvalidLHSInForIn);
                    }

                    lex();
                    left = init;
                    right = parseExpression();
                    init = null;
                }
            }

            if (typeof left === 'undefined') {
                expect(';');
            }
        }

        if (typeof left === 'undefined') {

            if (!match(';')) {
                test = parseExpression();
            }
            expect(';');

            if (!match(')')) {
                update = parseExpression();
            }
        }

        expect(')');

        oldInIteration = state.inIteration;
        state.inIteration = true;

        body = parseStatement();

        state.inIteration = oldInIteration;

        return (typeof left === 'undefined') ?
                delegate.createForStatement(init, test, update, body) :
                delegate.createForInStatement(left, right, body);
    }

    // 12.7 The continue statement

    function parseContinueStatement() {
        var label = null, key;

        expectKeyword('continue');

        // Optimize the most common form: 'continue;'.
        if (source.charCodeAt(index) === 0x3B) {
            lex();

            if (!state.inIteration) {
                throwError({}, Messages.IllegalContinue);
            }

            return delegate.createContinueStatement(null);
        }

        if (peekLineTerminator()) {
            if (!state.inIteration) {
                throwError({}, Messages.IllegalContinue);
            }

            return delegate.createContinueStatement(null);
        }

        if (lookahead.type === Token.Identifier) {
            label = parseVariableIdentifier();

            key = '$' + label.name;
            if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {
                throwError({}, Messages.UnknownLabel, label.name);
            }
        }

        consumeSemicolon();

        if (label === null && !state.inIteration) {
            throwError({}, Messages.IllegalContinue);
        }

        return delegate.createContinueStatement(label);
    }

    // 12.8 The break statement

    function parseBreakStatement() {
        var label = null, key;

        expectKeyword('break');

        // Catch the very common case first: immediately a semicolon (U+003B).
        if (source.charCodeAt(index) === 0x3B) {
            lex();

            if (!(state.inIteration || state.inSwitch)) {
                throwError({}, Messages.IllegalBreak);
            }

            return delegate.createBreakStatement(null);
        }

        if (peekLineTerminator()) {
            if (!(state.inIteration || state.inSwitch)) {
                throwError({}, Messages.IllegalBreak);
            }

            return delegate.createBreakStatement(null);
        }

        if (lookahead.type === Token.Identifier) {
            label = parseVariableIdentifier();

            key = '$' + label.name;
            if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {
                throwError({}, Messages.UnknownLabel, label.name);
            }
        }

        consumeSemicolon();

        if (label === null && !(state.inIteration || state.inSwitch)) {
            throwError({}, Messages.IllegalBreak);
        }

        return delegate.createBreakStatement(label);
    }

    // 12.9 The return statement

    function parseReturnStatement() {
        var argument = null;

        expectKeyword('return');

        if (!state.inFunctionBody) {
            throwErrorTolerant({}, Messages.IllegalReturn);
        }

        // 'return' followed by a space and an identifier is very common.
        if (source.charCodeAt(index) === 0x20) {
            if (isIdentifierStart(source.charCodeAt(index + 1))) {
                argument = parseExpression();
                consumeSemicolon();
                return delegate.createReturnStatement(argument);
            }
        }

        if (peekLineTerminator()) {
            return delegate.createReturnStatement(null);
        }

        if (!match(';')) {
            if (!match('}') && lookahead.type !== Token.EOF) {
                argument = parseExpression();
            }
        }

        consumeSemicolon();

        return delegate.createReturnStatement(argument);
    }

    // 12.10 The with statement

    function parseWithStatement() {
        var object, body;

        if (strict) {
            // TODO(ikarienator): Should we update the test cases instead?
            skipComment();
            throwErrorTolerant({}, Messages.StrictModeWith);
        }

        expectKeyword('with');

        expect('(');

        object = parseExpression();

        expect(')');

        body = parseStatement();

        return delegate.createWithStatement(object, body);
    }

    // 12.10 The swith statement

    function parseSwitchCase() {
        var test, consequent = [], statement, startToken;

        startToken = lookahead;
        if (matchKeyword('default')) {
            lex();
            test = null;
        } else {
            expectKeyword('case');
            test = parseExpression();
        }
        expect(':');

        while (index < length) {
            if (match('}') || matchKeyword('default') || matchKeyword('case')) {
                break;
            }
            statement = parseStatement();
            consequent.push(statement);
        }

        return delegate.markEnd(delegate.createSwitchCase(test, consequent), startToken);
    }

    function parseSwitchStatement() {
        var discriminant, cases, clause, oldInSwitch, defaultFound;

        expectKeyword('switch');

        expect('(');

        discriminant = parseExpression();

        expect(')');

        expect('{');

        cases = [];

        if (match('}')) {
            lex();
            return delegate.createSwitchStatement(discriminant, cases);
        }

        oldInSwitch = state.inSwitch;
        state.inSwitch = true;
        defaultFound = false;

        while (index < length) {
            if (match('}')) {
                break;
            }
            clause = parseSwitchCase();
            if (clause.test === null) {
                if (defaultFound) {
                    throwError({}, Messages.MultipleDefaultsInSwitch);
                }
                defaultFound = true;
            }
            cases.push(clause);
        }

        state.inSwitch = oldInSwitch;

        expect('}');

        return delegate.createSwitchStatement(discriminant, cases);
    }

    // 12.13 The throw statement

    function parseThrowStatement() {
        var argument;

        expectKeyword('throw');

        if (peekLineTerminator()) {
            throwError({}, Messages.NewlineAfterThrow);
        }

        argument = parseExpression();

        consumeSemicolon();

        return delegate.createThrowStatement(argument);
    }

    // 12.14 The try statement

    function parseCatchClause() {
        var param, body, startToken;

        startToken = lookahead;
        expectKeyword('catch');

        expect('(');
        if (match(')')) {
            throwUnexpected(lookahead);
        }

        param = parseVariableIdentifier();
        // 12.14.1
        if (strict && isRestrictedWord(param.name)) {
            throwErrorTolerant({}, Messages.StrictCatchVariable);
        }

        expect(')');
        body = parseBlock();
        return delegate.markEnd(delegate.createCatchClause(param, body), startToken);
    }

    function parseTryStatement() {
        var block, handlers = [], finalizer = null;

        expectKeyword('try');

        block = parseBlock();

        if (matchKeyword('catch')) {
            handlers.push(parseCatchClause());
        }

        if (matchKeyword('finally')) {
            lex();
            finalizer = parseBlock();
        }

        if (handlers.length === 0 && !finalizer) {
            throwError({}, Messages.NoCatchOrFinally);
        }

        return delegate.createTryStatement(block, [], handlers, finalizer);
    }

    // 12.15 The debugger statement

    function parseDebuggerStatement() {
        expectKeyword('debugger');

        consumeSemicolon();

        return delegate.createDebuggerStatement();
    }

    // 12 Statements

    function parseStatement() {
        var type = lookahead.type,
            expr,
            labeledBody,
            key,
            startToken;

        if (type === Token.EOF) {
            throwUnexpected(lookahead);
        }

        if (type === Token.Punctuator && lookahead.value === '{') {
            return parseBlock();
        }

        startToken = lookahead;

        if (type === Token.Punctuator) {
            switch (lookahead.value) {
            case ';':
                return delegate.markEnd(parseEmptyStatement(), startToken);
            case '(':
                return delegate.markEnd(parseExpressionStatement(), startToken);
            default:
                break;
            }
        }

        if (type === Token.Keyword) {
            switch (lookahead.value) {
            case 'break':
                return delegate.markEnd(parseBreakStatement(), startToken);
            case 'continue':
                return delegate.markEnd(parseContinueStatement(), startToken);
            case 'debugger':
                return delegate.markEnd(parseDebuggerStatement(), startToken);
            case 'do':
                return delegate.markEnd(parseDoWhileStatement(), startToken);
            case 'for':
                return delegate.markEnd(parseForStatement(), startToken);
            case 'function':
                return delegate.markEnd(parseFunctionDeclaration(), startToken);
            case 'if':
                return delegate.markEnd(parseIfStatement(), startToken);
            case 'return':
                return delegate.markEnd(parseReturnStatement(), startToken);
            case 'switch':
                return delegate.markEnd(parseSwitchStatement(), startToken);
            case 'throw':
                return delegate.markEnd(parseThrowStatement(), startToken);
            case 'try':
                return delegate.markEnd(parseTryStatement(), startToken);
            case 'var':
                return delegate.markEnd(parseVariableStatement(), startToken);
            case 'while':
                return delegate.markEnd(parseWhileStatement(), startToken);
            case 'with':
                return delegate.markEnd(parseWithStatement(), startToken);
            default:
                break;
            }
        }

        expr = parseExpression();

        // 12.12 Labelled Statements
        if ((expr.type === Syntax.Identifier) && match(':')) {
            lex();

            key = '$' + expr.name;
            if (Object.prototype.hasOwnProperty.call(state.labelSet, key)) {
                throwError({}, Messages.Redeclaration, 'Label', expr.name);
            }

            state.labelSet[key] = true;
            labeledBody = parseStatement();
            delete state.labelSet[key];
            return delegate.markEnd(delegate.createLabeledStatement(expr, labeledBody), startToken);
        }

        consumeSemicolon();

        return delegate.markEnd(delegate.createExpressionStatement(expr), startToken);
    }

    // 13 Function Definition

    function parseFunctionSourceElements() {
        var sourceElement, sourceElements = [], token, directive, firstRestricted,
            oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody, startToken;

        startToken = lookahead;
        expect('{');

        while (index < length) {
            if (lookahead.type !== Token.StringLiteral) {
                break;
            }
            token = lookahead;

            sourceElement = parseSourceElement();
            sourceElements.push(sourceElement);
            if (sourceElement.expression.type !== Syntax.Literal) {
                // this is not directive
                break;
            }
            directive = source.slice(token.start + 1, token.end - 1);
            if (directive === 'use strict') {
                strict = true;
                if (firstRestricted) {
                    throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);
                }
            } else {
                if (!firstRestricted && token.octal) {
                    firstRestricted = token;
                }
            }
        }

        oldLabelSet = state.labelSet;
        oldInIteration = state.inIteration;
        oldInSwitch = state.inSwitch;
        oldInFunctionBody = state.inFunctionBody;

        state.labelSet = {};
        state.inIteration = false;
        state.inSwitch = false;
        state.inFunctionBody = true;

        while (index < length) {
            if (match('}')) {
                break;
            }
            sourceElement = parseSourceElement();
            if (typeof sourceElement === 'undefined') {
                break;
            }
            sourceElements.push(sourceElement);
        }

        expect('}');

        state.labelSet = oldLabelSet;
        state.inIteration = oldInIteration;
        state.inSwitch = oldInSwitch;
        state.inFunctionBody = oldInFunctionBody;

        return delegate.markEnd(delegate.createBlockStatement(sourceElements), startToken);
    }

    function parseParams(firstRestricted) {
        var param, params = [], token, stricted, paramSet, key, message;
        expect('(');

        if (!match(')')) {
            paramSet = {};
            while (index < length) {
                token = lookahead;
                param = parseVariableIdentifier();
                key = '$' + token.value;
                if (strict) {
                    if (isRestrictedWord(token.value)) {
                        stricted = token;
                        message = Messages.StrictParamName;
                    }
                    if (Object.prototype.hasOwnProperty.call(paramSet, key)) {
                        stricted = token;
                        message = Messages.StrictParamDupe;
                    }
                } else if (!firstRestricted) {
                    if (isRestrictedWord(token.value)) {
                        firstRestricted = token;
                        message = Messages.StrictParamName;
                    } else if (isStrictModeReservedWord(token.value)) {
                        firstRestricted = token;
                        message = Messages.StrictReservedWord;
                    } else if (Object.prototype.hasOwnProperty.call(paramSet, key)) {
                        firstRestricted = token;
                        message = Messages.StrictParamDupe;
                    }
                }
                params.push(param);
                paramSet[key] = true;
                if (match(')')) {
                    break;
                }
                expect(',');
            }
        }

        expect(')');

        return {
            params: params,
            stricted: stricted,
            firstRestricted: firstRestricted,
            message: message
        };
    }

    function parseFunctionDeclaration() {
        var id, params = [], body, token, stricted, tmp, firstRestricted, message, previousStrict, startToken;

        startToken = lookahead;

        expectKeyword('function');
        token = lookahead;
        id = parseVariableIdentifier();
        if (strict) {
            if (isRestrictedWord(token.value)) {
                throwErrorTolerant(token, Messages.StrictFunctionName);
            }
        } else {
            if (isRestrictedWord(token.value)) {
                firstRestricted = token;
                message = Messages.StrictFunctionName;
            } else if (isStrictModeReservedWord(token.value)) {
                firstRestricted = token;
                message = Messages.StrictReservedWord;
            }
        }

        tmp = parseParams(firstRestricted);
        params = tmp.params;
        stricted = tmp.stricted;
        firstRestricted = tmp.firstRestricted;
        if (tmp.message) {
            message = tmp.message;
        }

        previousStrict = strict;
        body = parseFunctionSourceElements();
        if (strict && firstRestricted) {
            throwError(firstRestricted, message);
        }
        if (strict && stricted) {
            throwErrorTolerant(stricted, message);
        }
        strict = previousStrict;

        return delegate.markEnd(delegate.createFunctionDeclaration(id, params, [], body), startToken);
    }

    function parseFunctionExpression() {
        var token, id = null, stricted, firstRestricted, message, tmp, params = [], body, previousStrict, startToken;

        startToken = lookahead;
        expectKeyword('function');

        if (!match('(')) {
            token = lookahead;
            id = parseVariableIdentifier();
            if (strict) {
                if (isRestrictedWord(token.value)) {
                    throwErrorTolerant(token, Messages.StrictFunctionName);
                }
            } else {
                if (isRestrictedWord(token.value)) {
                    firstRestricted = token;
                    message = Messages.StrictFunctionName;
                } else if (isStrictModeReservedWord(token.value)) {
                    firstRestricted = token;
                    message = Messages.StrictReservedWord;
                }
            }
        }

        tmp = parseParams(firstRestricted);
        params = tmp.params;
        stricted = tmp.stricted;
        firstRestricted = tmp.firstRestricted;
        if (tmp.message) {
            message = tmp.message;
        }

        previousStrict = strict;
        body = parseFunctionSourceElements();
        if (strict && firstRestricted) {
            throwError(firstRestricted, message);
        }
        if (strict && stricted) {
            throwErrorTolerant(stricted, message);
        }
        strict = previousStrict;

        return delegate.markEnd(delegate.createFunctionExpression(id, params, [], body), startToken);
    }

    // 14 Program

    function parseSourceElement() {
        if (lookahead.type === Token.Keyword) {
            switch (lookahead.value) {
            case 'const':
            case 'let':
                return parseConstLetDeclaration(lookahead.value);
            case 'function':
                return parseFunctionDeclaration();
            default:
                return parseStatement();
            }
        }

        if (lookahead.type !== Token.EOF) {
            return parseStatement();
        }
    }

    function parseSourceElements() {
        var sourceElement, sourceElements = [], token, directive, firstRestricted;

        while (index < length) {
            token = lookahead;
            if (token.type !== Token.StringLiteral) {
                break;
            }

            sourceElement = parseSourceElement();
            sourceElements.push(sourceElement);
            if (sourceElement.expression.type !== Syntax.Literal) {
                // this is not directive
                break;
            }
            directive = source.slice(token.start + 1, token.end - 1);
            if (directive === 'use strict') {
                strict = true;
                if (firstRestricted) {
                    throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);
                }
            } else {
                if (!firstRestricted && token.octal) {
                    firstRestricted = token;
                }
            }
        }

        while (index < length) {
            sourceElement = parseSourceElement();
            /* istanbul ignore if */
            if (typeof sourceElement === 'undefined') {
                break;
            }
            sourceElements.push(sourceElement);
        }
        return sourceElements;
    }

    function parseProgram() {
        var body, startToken;

        skipComment();
        peek();
        startToken = lookahead;
        strict = false;

        body = parseSourceElements();
        return delegate.markEnd(delegate.createProgram(body), startToken);
    }

    function filterTokenLocation() {
        var i, entry, token, tokens = [];

        for (i = 0; i < extra.tokens.length; ++i) {
            entry = extra.tokens[i];
            token = {
                type: entry.type,
                value: entry.value
            };
            if (extra.range) {
                token.range = entry.range;
            }
            if (extra.loc) {
                token.loc = entry.loc;
            }
            tokens.push(token);
        }

        extra.tokens = tokens;
    }

    function tokenize(code, options) {
        var toString,
            token,
            tokens;

        toString = String;
        if (typeof code !== 'string' && !(code instanceof String)) {
            code = toString(code);
        }

        delegate = SyntaxTreeDelegate;
        source = code;
        index = 0;
        lineNumber = (source.length > 0) ? 1 : 0;
        lineStart = 0;
        length = source.length;
        lookahead = null;
        state = {
            allowIn: true,
            labelSet: {},
            inFunctionBody: false,
            inIteration: false,
            inSwitch: false,
            lastCommentStart: -1
        };

        extra = {};

        // Options matching.
        options = options || {};

        // Of course we collect tokens here.
        options.tokens = true;
        extra.tokens = [];
        extra.tokenize = true;
        // The following two fields are necessary to compute the Regex tokens.
        extra.openParenToken = -1;
        extra.openCurlyToken = -1;

        extra.range = (typeof options.range === 'boolean') && options.range;
        extra.loc = (typeof options.loc === 'boolean') && options.loc;

        if (typeof options.comment === 'boolean' && options.comment) {
            extra.comments = [];
        }
        if (typeof options.tolerant === 'boolean' && options.tolerant) {
            extra.errors = [];
        }

        try {
            peek();
            if (lookahead.type === Token.EOF) {
                return extra.tokens;
            }

            token = lex();
            while (lookahead.type !== Token.EOF) {
                try {
                    token = lex();
                } catch (lexError) {
                    token = lookahead;
                    if (extra.errors) {
                        extra.errors.push(lexError);
                        // We have to break on the first error
                        // to avoid infinite loops.
                        break;
                    } else {
                        throw lexError;
                    }
                }
            }

            filterTokenLocation();
            tokens = extra.tokens;
            if (typeof extra.comments !== 'undefined') {
                tokens.comments = extra.comments;
            }
            if (typeof extra.errors !== 'undefined') {
                tokens.errors = extra.errors;
            }
        } catch (e) {
            throw e;
        } finally {
            extra = {};
        }
        return tokens;
    }

    function parse(code, options) {
        var program, toString;

        toString = String;
        if (typeof code !== 'string' && !(code instanceof String)) {
            code = toString(code);
        }

        delegate = SyntaxTreeDelegate;
        source = code;
        index = 0;
        lineNumber = (source.length > 0) ? 1 : 0;
        lineStart = 0;
        length = source.length;
        lookahead = null;
        state = {
            allowIn: true,
            labelSet: {},
            inFunctionBody: false,
            inIteration: false,
            inSwitch: false,
            lastCommentStart: -1
        };

        extra = {};
        if (typeof options !== 'undefined') {
            extra.range = (typeof options.range === 'boolean') && options.range;
            extra.loc = (typeof options.loc === 'boolean') && options.loc;
            extra.attachComment = (typeof options.attachComment === 'boolean') && options.attachComment;

            if (extra.loc && options.source !== null && options.source !== undefined) {
                extra.source = toString(options.source);
            }

            if (typeof options.tokens === 'boolean' && options.tokens) {
                extra.tokens = [];
            }
            if (typeof options.comment === 'boolean' && options.comment) {
                extra.comments = [];
            }
            if (typeof options.tolerant === 'boolean' && options.tolerant) {
                extra.errors = [];
            }
            if (extra.attachComment) {
                extra.range = true;
                extra.comments = [];
                extra.bottomRightStack = [];
                extra.trailingComments = [];
                extra.leadingComments = [];
            }
        }

        try {
            program = parseProgram();
            if (typeof extra.comments !== 'undefined') {
                program.comments = extra.comments;
            }
            if (typeof extra.tokens !== 'undefined') {
                filterTokenLocation();
                program.tokens = extra.tokens;
            }
            if (typeof extra.errors !== 'undefined') {
                program.errors = extra.errors;
            }
        } catch (e) {
            throw e;
        } finally {
            extra = {};
        }

        return program;
    }

    // Sync with *.json manifests.
    exports.version = '1.2.2';

    exports.tokenize = tokenize;

    exports.parse = parse;

    // Deep copy.
   /* istanbul ignore next */
    exports.Syntax = (function () {
        var name, types = {};

        if (typeof Object.create === 'function') {
            types = Object.create(null);
        }

        for (name in Syntax) {
            if (Syntax.hasOwnProperty(name)) {
                types[name] = Syntax[name];
            }
        }

        if (typeof Object.freeze === 'function') {
            Object.freeze(types);
        }

        return types;
    }());

}));
/* vim: set sw=4 ts=4 et tw=80 : */


},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/generated/parser.js":[function(require,module,exports){
(function (process){(function (){
/* parser generated by jison 0.4.13 */
/*
  Returns a Parser object of the following structure:

  Parser: {
    yy: {}
  }

  Parser.prototype: {
    yy: {},
    trace: function(),
    symbols_: {associative list: name ==> number},
    terminals_: {associative list: number ==> name},
    productions_: [...],
    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
    table: [...],
    defaultActions: {...},
    parseError: function(str, hash),
    parse: function(input),

    lexer: {
        EOF: 1,
        parseError: function(str, hash),
        setInput: function(input),
        input: function(),
        unput: function(str),
        more: function(),
        less: function(n),
        pastInput: function(),
        upcomingInput: function(),
        showPosition: function(),
        test_match: function(regex_match_array, rule_index),
        next: function(),
        lex: function(),
        begin: function(condition),
        popState: function(),
        _currentRules: function(),
        topState: function(),
        pushState: function(condition),

        options: {
            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
        },

        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
        rules: [...],
        conditions: {associative list: name ==> set},
    }
  }


  token location info (@$, _$, etc.): {
    first_line: n,
    last_line: n,
    first_column: n,
    last_column: n,
    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
  }


  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
    text:        (matched text)
    token:       (the produced terminal token, if any)
    line:        (yylineno)
  }
  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
    loc:         (yylloc)
    expected:    (string describing the set of expected tokens)
    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
  }
*/
var parser = (function(){
var parser = {trace: function trace() { },
yy: {},
symbols_: {"error":2,"JSON_PATH":3,"DOLLAR":4,"PATH_COMPONENTS":5,"LEADING_CHILD_MEMBER_EXPRESSION":6,"PATH_COMPONENT":7,"MEMBER_COMPONENT":8,"SUBSCRIPT_COMPONENT":9,"CHILD_MEMBER_COMPONENT":10,"DESCENDANT_MEMBER_COMPONENT":11,"DOT":12,"MEMBER_EXPRESSION":13,"DOT_DOT":14,"STAR":15,"IDENTIFIER":16,"SCRIPT_EXPRESSION":17,"INTEGER":18,"END":19,"CHILD_SUBSCRIPT_COMPONENT":20,"DESCENDANT_SUBSCRIPT_COMPONENT":21,"[":22,"SUBSCRIPT":23,"]":24,"SUBSCRIPT_EXPRESSION":25,"SUBSCRIPT_EXPRESSION_LIST":26,"SUBSCRIPT_EXPRESSION_LISTABLE":27,",":28,"STRING_LITERAL":29,"ARRAY_SLICE":30,"FILTER_EXPRESSION":31,"QQ_STRING":32,"Q_STRING":33,"$accept":0,"$end":1},
terminals_: {2:"error",4:"DOLLAR",12:"DOT",14:"DOT_DOT",15:"STAR",16:"IDENTIFIER",17:"SCRIPT_EXPRESSION",18:"INTEGER",19:"END",22:"[",24:"]",28:",",30:"ARRAY_SLICE",31:"FILTER_EXPRESSION",32:"QQ_STRING",33:"Q_STRING"},
productions_: [0,[3,1],[3,2],[3,1],[3,2],[5,1],[5,2],[7,1],[7,1],[8,1],[8,1],[10,2],[6,1],[11,2],[13,1],[13,1],[13,1],[13,1],[13,1],[9,1],[9,1],[20,3],[21,4],[23,1],[23,1],[26,1],[26,3],[27,1],[27,1],[27,1],[25,1],[25,1],[25,1],[29,1],[29,1]],
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */
/**/) {
/* this == yyval */
if (!yy.ast) {
    yy.ast = _ast;
    _ast.initialize();
}

var $0 = $$.length - 1;
switch (yystate) {
case 1:yy.ast.set({ expression: { type: "root", value: $$[$0] } }); yy.ast.unshift(); return yy.ast.yield()
break;
case 2:yy.ast.set({ expression: { type: "root", value: $$[$0-1] } }); yy.ast.unshift(); return yy.ast.yield()
break;
case 3:yy.ast.unshift(); return yy.ast.yield()
break;
case 4:yy.ast.set({ operation: "member", scope: "child", expression: { type: "identifier", value: $$[$0-1] }}); yy.ast.unshift(); return yy.ast.yield()
break;
case 5:
break;
case 6:
break;
case 7:yy.ast.set({ operation: "member" }); yy.ast.push()
break;
case 8:yy.ast.set({ operation: "subscript" }); yy.ast.push() 
break;
case 9:yy.ast.set({ scope: "child" })
break;
case 10:yy.ast.set({ scope: "descendant" })
break;
case 11:
break;
case 12:yy.ast.set({ scope: "child", operation: "member" })
break;
case 13:
break;
case 14:yy.ast.set({ expression: { type: "wildcard", value: $$[$0] } })
break;
case 15:yy.ast.set({ expression: { type: "identifier", value: $$[$0] } })
break;
case 16:yy.ast.set({ expression: { type: "script_expression", value: $$[$0] } })
break;
case 17:yy.ast.set({ expression: { type: "numeric_literal", value: parseInt($$[$0]) } })
break;
case 18:
break;
case 19:yy.ast.set({ scope: "child" })
break;
case 20:yy.ast.set({ scope: "descendant" })
break;
case 21:
break;
case 22:
break;
case 23:
break;
case 24:$$[$0].length > 1? yy.ast.set({ expression: { type: "union", value: $$[$0] } }) : this.$ = $$[$0]
break;
case 25:this.$ = [$$[$0]]
break;
case 26:this.$ = $$[$0-2].concat($$[$0])
break;
case 27:this.$ = { expression: { type: "numeric_literal", value: parseInt($$[$0]) } }; yy.ast.set(this.$)
break;
case 28:this.$ = { expression: { type: "string_literal", value: $$[$0] } }; yy.ast.set(this.$)
break;
case 29:this.$ = { expression: { type: "slice", value: $$[$0] } }; yy.ast.set(this.$)
break;
case 30:this.$ = { expression: { type: "wildcard", value: $$[$0] } }; yy.ast.set(this.$)
break;
case 31:this.$ = { expression: { type: "script_expression", value: $$[$0] } }; yy.ast.set(this.$)
break;
case 32:this.$ = { expression: { type: "filter_expression", value: $$[$0] } }; yy.ast.set(this.$)
break;
case 33:this.$ = $$[$0]
break;
case 34:this.$ = $$[$0]
break;
}
},
table: [{3:1,4:[1,2],6:3,13:4,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{1:[3]},{1:[2,1],5:10,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,3],5:21,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,12],12:[2,12],14:[2,12],22:[2,12]},{1:[2,14],12:[2,14],14:[2,14],22:[2,14]},{1:[2,15],12:[2,15],14:[2,15],22:[2,15]},{1:[2,16],12:[2,16],14:[2,16],22:[2,16]},{1:[2,17],12:[2,17],14:[2,17],22:[2,17]},{1:[2,18],12:[2,18],14:[2,18],22:[2,18]},{1:[2,2],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,5],12:[2,5],14:[2,5],22:[2,5]},{1:[2,7],12:[2,7],14:[2,7],22:[2,7]},{1:[2,8],12:[2,8],14:[2,8],22:[2,8]},{1:[2,9],12:[2,9],14:[2,9],22:[2,9]},{1:[2,10],12:[2,10],14:[2,10],22:[2,10]},{1:[2,19],12:[2,19],14:[2,19],22:[2,19]},{1:[2,20],12:[2,20],14:[2,20],22:[2,20]},{13:23,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{13:24,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9],22:[1,25]},{15:[1,29],17:[1,30],18:[1,33],23:26,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{1:[2,4],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,6],12:[2,6],14:[2,6],22:[2,6]},{1:[2,11],12:[2,11],14:[2,11],22:[2,11]},{1:[2,13],12:[2,13],14:[2,13],22:[2,13]},{15:[1,29],17:[1,30],18:[1,33],23:38,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{24:[1,39]},{24:[2,23]},{24:[2,24],28:[1,40]},{24:[2,30]},{24:[2,31]},{24:[2,32]},{24:[2,25],28:[2,25]},{24:[2,27],28:[2,27]},{24:[2,28],28:[2,28]},{24:[2,29],28:[2,29]},{24:[2,33],28:[2,33]},{24:[2,34],28:[2,34]},{24:[1,41]},{1:[2,21],12:[2,21],14:[2,21],22:[2,21]},{18:[1,33],27:42,29:34,30:[1,35],32:[1,36],33:[1,37]},{1:[2,22],12:[2,22],14:[2,22],22:[2,22]},{24:[2,26],28:[2,26]}],
defaultActions: {27:[2,23],29:[2,30],30:[2,31],31:[2,32]},
parseError: function parseError(str, hash) {
    if (hash.recoverable) {
        this.trace(str);
    } else {
        throw new Error(str);
    }
},
parse: function parse(input) {
    var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
    var args = lstack.slice.call(arguments, 1);
    this.lexer.setInput(input);
    this.lexer.yy = this.yy;
    this.yy.lexer = this.lexer;
    this.yy.parser = this;
    if (typeof this.lexer.yylloc == 'undefined') {
        this.lexer.yylloc = {};
    }
    var yyloc = this.lexer.yylloc;
    lstack.push(yyloc);
    var ranges = this.lexer.options && this.lexer.options.ranges;
    if (typeof this.yy.parseError === 'function') {
        this.parseError = this.yy.parseError;
    } else {
        this.parseError = Object.getPrototypeOf(this).parseError;
    }
    function popStack(n) {
        stack.length = stack.length - 2 * n;
        vstack.length = vstack.length - n;
        lstack.length = lstack.length - n;
    }
    function lex() {
        var token;
        token = self.lexer.lex() || EOF;
        if (typeof token !== 'number') {
            token = self.symbols_[token] || token;
        }
        return token;
    }
    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
    while (true) {
        state = stack[stack.length - 1];
        if (this.defaultActions[state]) {
            action = this.defaultActions[state];
        } else {
            if (symbol === null || typeof symbol == 'undefined') {
                symbol = lex();
            }
            action = table[state] && table[state][symbol];
        }
                    if (typeof action === 'undefined' || !action.length || !action[0]) {
                var errStr = '';
                expected = [];
                for (p in table[state]) {
                    if (this.terminals_[p] && p > TERROR) {
                        expected.push('\'' + this.terminals_[p] + '\'');
                    }
                }
                if (this.lexer.showPosition) {
                    errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + this.lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
                } else {
                    errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
                }
                this.parseError(errStr, {
                    text: this.lexer.match,
                    token: this.terminals_[symbol] || symbol,
                    line: this.lexer.yylineno,
                    loc: yyloc,
                    expected: expected
                });
            }
        if (action[0] instanceof Array && action.length > 1) {
            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
        }
        switch (action[0]) {
        case 1:
            stack.push(symbol);
            vstack.push(this.lexer.yytext);
            lstack.push(this.lexer.yylloc);
            stack.push(action[1]);
            symbol = null;
            if (!preErrorSymbol) {
                yyleng = this.lexer.yyleng;
                yytext = this.lexer.yytext;
                yylineno = this.lexer.yylineno;
                yyloc = this.lexer.yylloc;
                if (recovering > 0) {
                    recovering--;
                }
            } else {
                symbol = preErrorSymbol;
                preErrorSymbol = null;
            }
            break;
        case 2:
            len = this.productions_[action[1]][1];
            yyval.$ = vstack[vstack.length - len];
            yyval._$ = {
                first_line: lstack[lstack.length - (len || 1)].first_line,
                last_line: lstack[lstack.length - 1].last_line,
                first_column: lstack[lstack.length - (len || 1)].first_column,
                last_column: lstack[lstack.length - 1].last_column
            };
            if (ranges) {
                yyval._$.range = [
                    lstack[lstack.length - (len || 1)].range[0],
                    lstack[lstack.length - 1].range[1]
                ];
            }
            r = this.performAction.apply(yyval, [
                yytext,
                yyleng,
                yylineno,
                this.yy,
                action[1],
                vstack,
                lstack
            ].concat(args));
            if (typeof r !== 'undefined') {
                return r;
            }
            if (len) {
                stack = stack.slice(0, -1 * len * 2);
                vstack = vstack.slice(0, -1 * len);
                lstack = lstack.slice(0, -1 * len);
            }
            stack.push(this.productions_[action[1]][0]);
            vstack.push(yyval.$);
            lstack.push(yyval._$);
            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
            stack.push(newState);
            break;
        case 3:
            return true;
        }
    }
    return true;
}};
var _ast = {

  initialize: function() {
    this._nodes = [];
    this._node = {};
    this._stash = [];
  },

  set: function(props) {
    for (var k in props) this._node[k] = props[k];
    return this._node;
  },

  node: function(obj) {
    if (arguments.length) this._node = obj;
    return this._node;
  },

  push: function() {
    this._nodes.push(this._node);
    this._node = {};
  },

  unshift: function() {
    this._nodes.unshift(this._node);
    this._node = {};
  },

  yield: function() {
    var _nodes = this._nodes;
    this.initialize();
    return _nodes;
  }
};
/* generated by jison-lex 0.2.1 */
var lexer = (function(){
var lexer = {

EOF:1,

parseError:function parseError(str, hash) {
        if (this.yy.parser) {
            this.yy.parser.parseError(str, hash);
        } else {
            throw new Error(str);
        }
    },

// resets the lexer, sets new input
setInput:function (input) {
        this._input = input;
        this._more = this._backtrack = this.done = false;
        this.yylineno = this.yyleng = 0;
        this.yytext = this.matched = this.match = '';
        this.conditionStack = ['INITIAL'];
        this.yylloc = {
            first_line: 1,
            first_column: 0,
            last_line: 1,
            last_column: 0
        };
        if (this.options.ranges) {
            this.yylloc.range = [0,0];
        }
        this.offset = 0;
        return this;
    },

// consumes and returns one char from the input
input:function () {
        var ch = this._input[0];
        this.yytext += ch;
        this.yyleng++;
        this.offset++;
        this.match += ch;
        this.matched += ch;
        var lines = ch.match(/(?:\r\n?|\n).*/g);
        if (lines) {
            this.yylineno++;
            this.yylloc.last_line++;
        } else {
            this.yylloc.last_column++;
        }
        if (this.options.ranges) {
            this.yylloc.range[1]++;
        }

        this._input = this._input.slice(1);
        return ch;
    },

// unshifts one char (or a string) into the input
unput:function (ch) {
        var len = ch.length;
        var lines = ch.split(/(?:\r\n?|\n)/g);

        this._input = ch + this._input;
        this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);
        //this.yyleng -= len;
        this.offset -= len;
        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
        this.match = this.match.substr(0, this.match.length - 1);
        this.matched = this.matched.substr(0, this.matched.length - 1);

        if (lines.length - 1) {
            this.yylineno -= lines.length - 1;
        }
        var r = this.yylloc.range;

        this.yylloc = {
            first_line: this.yylloc.first_line,
            last_line: this.yylineno + 1,
            first_column: this.yylloc.first_column,
            last_column: lines ?
                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
              this.yylloc.first_column - len
        };

        if (this.options.ranges) {
            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
        }
        this.yyleng = this.yytext.length;
        return this;
    },

// When called from action, caches matched text and appends it on next action
more:function () {
        this._more = true;
        return this;
    },

// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
reject:function () {
        if (this.options.backtrack_lexer) {
            this._backtrack = true;
        } else {
            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
                text: "",
                token: null,
                line: this.yylineno
            });

        }
        return this;
    },

// retain first n characters of the match
less:function (n) {
        this.unput(this.match.slice(n));
    },

// displays already matched input, i.e. for error messages
pastInput:function () {
        var past = this.matched.substr(0, this.matched.length - this.match.length);
        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
    },

// displays upcoming input, i.e. for error messages
upcomingInput:function () {
        var next = this.match;
        if (next.length < 20) {
            next += this._input.substr(0, 20-next.length);
        }
        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
    },

// displays the character position where the lexing error occurred, i.e. for error messages
showPosition:function () {
        var pre = this.pastInput();
        var c = new Array(pre.length + 1).join("-");
        return pre + this.upcomingInput() + "\n" + c + "^";
    },

// test the lexed token: return FALSE when not a match, otherwise return token
test_match:function (match, indexed_rule) {
        var token,
            lines,
            backup;

        if (this.options.backtrack_lexer) {
            // save context
            backup = {
                yylineno: this.yylineno,
                yylloc: {
                    first_line: this.yylloc.first_line,
                    last_line: this.last_line,
                    first_column: this.yylloc.first_column,
                    last_column: this.yylloc.last_column
                },
                yytext: this.yytext,
                match: this.match,
                matches: this.matches,
                matched: this.matched,
                yyleng: this.yyleng,
                offset: this.offset,
                _more: this._more,
                _input: this._input,
                yy: this.yy,
                conditionStack: this.conditionStack.slice(0),
                done: this.done
            };
            if (this.options.ranges) {
                backup.yylloc.range = this.yylloc.range.slice(0);
            }
        }

        lines = match[0].match(/(?:\r\n?|\n).*/g);
        if (lines) {
            this.yylineno += lines.length;
        }
        this.yylloc = {
            first_line: this.yylloc.last_line,
            last_line: this.yylineno + 1,
            first_column: this.yylloc.last_column,
            last_column: lines ?
                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
                         this.yylloc.last_column + match[0].length
        };
        this.yytext += match[0];
        this.match += match[0];
        this.matches = match;
        this.yyleng = this.yytext.length;
        if (this.options.ranges) {
            this.yylloc.range = [this.offset, this.offset += this.yyleng];
        }
        this._more = false;
        this._backtrack = false;
        this._input = this._input.slice(match[0].length);
        this.matched += match[0];
        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
        if (this.done && this._input) {
            this.done = false;
        }
        if (token) {
            return token;
        } else if (this._backtrack) {
            // recover context
            for (var k in backup) {
                this[k] = backup[k];
            }
            return false; // rule action called reject() implying the next rule should be tested instead.
        }
        return false;
    },

// return next match in input
next:function () {
        if (this.done) {
            return this.EOF;
        }
        if (!this._input) {
            this.done = true;
        }

        var token,
            match,
            tempMatch,
            index;
        if (!this._more) {
            this.yytext = '';
            this.match = '';
        }
        var rules = this._currentRules();
        for (var i = 0; i < rules.length; i++) {
            tempMatch = this._input.match(this.rules[rules[i]]);
            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
                match = tempMatch;
                index = i;
                if (this.options.backtrack_lexer) {
                    token = this.test_match(tempMatch, rules[i]);
                    if (token !== false) {
                        return token;
                    } else if (this._backtrack) {
                        match = false;
                        continue; // rule action called reject() implying a rule MISmatch.
                    } else {
                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
                        return false;
                    }
                } else if (!this.options.flex) {
                    break;
                }
            }
        }
        if (match) {
            token = this.test_match(match, rules[index]);
            if (token !== false) {
                return token;
            }
            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
            return false;
        }
        if (this._input === "") {
            return this.EOF;
        } else {
            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
                text: "",
                token: null,
                line: this.yylineno
            });
        }
    },

// return next match that has a token
lex:function lex() {
        var r = this.next();
        if (r) {
            return r;
        } else {
            return this.lex();
        }
    },

// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
begin:function begin(condition) {
        this.conditionStack.push(condition);
    },

// pop the previously active lexer condition state off the condition stack
popState:function popState() {
        var n = this.conditionStack.length - 1;
        if (n > 0) {
            return this.conditionStack.pop();
        } else {
            return this.conditionStack[0];
        }
    },

// produce the lexer rule set which is active for the currently active lexer condition state
_currentRules:function _currentRules() {
        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
        } else {
            return this.conditions["INITIAL"].rules;
        }
    },

// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
topState:function topState(n) {
        n = this.conditionStack.length - 1 - Math.abs(n || 0);
        if (n >= 0) {
            return this.conditionStack[n];
        } else {
            return "INITIAL";
        }
    },

// alias for begin(condition)
pushState:function pushState(condition) {
        this.begin(condition);
    },

// return the number of states currently on the stack
stateStackSize:function stateStackSize() {
        return this.conditionStack.length;
    },
options: {},
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START
/**/) {

var YYSTATE=YY_START;
switch($avoiding_name_collisions) {
case 0:return 4
break;
case 1:return 14
break;
case 2:return 12
break;
case 3:return 15
break;
case 4:return 16
break;
case 5:return 22
break;
case 6:return 24
break;
case 7:return 28
break;
case 8:return 30
break;
case 9:return 18
break;
case 10:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 32;
break;
case 11:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 33;
break;
case 12:return 17
break;
case 13:return 31
break;
}
},
rules: [/^(?:\$)/,/^(?:\.\.)/,/^(?:\.)/,/^(?:\*)/,/^(?:[a-zA-Z_]+[a-zA-Z0-9_]*)/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?:((-?(?:0|[1-9][0-9]*)))?\:((-?(?:0|[1-9][0-9]*)))?(\:((-?(?:0|[1-9][0-9]*)))?)?)/,/^(?:(-?(?:0|[1-9][0-9]*)))/,/^(?:"(?:\\["bfnrt/\\]|\\u[a-fA-F0-9]{4}|[^"\\])*")/,/^(?:'(?:\\['bfnrt/\\]|\\u[a-fA-F0-9]{4}|[^'\\])*')/,/^(?:\(.+?\)(?=\]))/,/^(?:\?\(.+?\)(?=\]))/],
conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"inclusive":true}}
};
return lexer;
})();
parser.lexer = lexer;
function Parser () {
  this.yy = {};
}
Parser.prototype = parser;parser.Parser = Parser;
return new Parser;
})();


if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
exports.parser = parser;
exports.Parser = parser.Parser;
exports.parse = function () { return parser.parse.apply(parser, arguments); };
exports.main = function commonjsMain(args) {
    if (!args[1]) {
        console.log('Usage: '+args[0]+' FILE');
        process.exit(1);
    }
    var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
    return exports.parser.parse(source);
};
if (typeof module !== 'undefined' && require.main === module) {
  exports.main(process.argv.slice(1));
}
}

}).call(this)}).call(this,require('_process'))
},{"_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","fs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/lib/_empty.js","path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/path-browserify/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/index.js":[function(require,module,exports){
module.exports = require('./lib/index');

},{"./lib/index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/dict.js":[function(require,module,exports){
module.exports = {
  identifier: "[a-zA-Z_]+[a-zA-Z0-9_]*",
  integer: "-?(?:0|[1-9][0-9]*)",
  qq_string: "\"(?:\\\\[\"bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\"\\\\])*\"",
  q_string: "'(?:\\\\[\'bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\'\\\\])*'"
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/grammar.js":[function(require,module,exports){
var dict = require('./dict');
var fs = require('fs');
var grammar = {

    lex: {

        macros: {
            esc: "\\\\",
            int: dict.integer
        },

        rules: [
            ["\\$", "return 'DOLLAR'"],
            ["\\.\\.", "return 'DOT_DOT'"],
            ["\\.", "return 'DOT'"],
            ["\\*", "return 'STAR'"],
            [dict.identifier, "return 'IDENTIFIER'"],
            ["\\[", "return '['"],
            ["\\]", "return ']'"],
            [",", "return ','"],
            ["({int})?\\:({int})?(\\:({int})?)?", "return 'ARRAY_SLICE'"],
            ["{int}", "return 'INTEGER'"],
            [dict.qq_string, "yytext = yytext.substr(1,yyleng-2); return 'QQ_STRING';"],
            [dict.q_string, "yytext = yytext.substr(1,yyleng-2); return 'Q_STRING';"],
            ["\\(.+?\\)(?=\\])", "return 'SCRIPT_EXPRESSION'"],
            ["\\?\\(.+?\\)(?=\\])", "return 'FILTER_EXPRESSION'"]
        ]
    },

    start: "JSON_PATH",

    bnf: {

        JSON_PATH: [
                [ 'DOLLAR',                 'yy.ast.set({ expression: { type: "root", value: $1 } }); yy.ast.unshift(); return yy.ast.yield()' ],
                [ 'DOLLAR PATH_COMPONENTS', 'yy.ast.set({ expression: { type: "root", value: $1 } }); yy.ast.unshift(); return yy.ast.yield()' ],
                [ 'LEADING_CHILD_MEMBER_EXPRESSION',                 'yy.ast.unshift(); return yy.ast.yield()' ],
                [ 'LEADING_CHILD_MEMBER_EXPRESSION PATH_COMPONENTS', 'yy.ast.set({ operation: "member", scope: "child", expression: { type: "identifier", value: $1 }}); yy.ast.unshift(); return yy.ast.yield()' ] ],

        PATH_COMPONENTS: [
                [ 'PATH_COMPONENT',                 '' ],
                [ 'PATH_COMPONENTS PATH_COMPONENT', '' ] ],

        PATH_COMPONENT: [
                [ 'MEMBER_COMPONENT',    'yy.ast.set({ operation: "member" }); yy.ast.push()' ],
                [ 'SUBSCRIPT_COMPONENT', 'yy.ast.set({ operation: "subscript" }); yy.ast.push() ' ] ],

        MEMBER_COMPONENT: [
                [ 'CHILD_MEMBER_COMPONENT',      'yy.ast.set({ scope: "child" })' ],
                [ 'DESCENDANT_MEMBER_COMPONENT', 'yy.ast.set({ scope: "descendant" })' ] ],

        CHILD_MEMBER_COMPONENT: [
                [ 'DOT MEMBER_EXPRESSION', '' ] ],

        LEADING_CHILD_MEMBER_EXPRESSION: [
                [ 'MEMBER_EXPRESSION', 'yy.ast.set({ scope: "child", operation: "member" })' ] ],

        DESCENDANT_MEMBER_COMPONENT: [
                [ 'DOT_DOT MEMBER_EXPRESSION', '' ] ],

        MEMBER_EXPRESSION: [
                [ 'STAR',              'yy.ast.set({ expression: { type: "wildcard", value: $1 } })' ],
                [ 'IDENTIFIER',        'yy.ast.set({ expression: { type: "identifier", value: $1 } })' ],
                [ 'SCRIPT_EXPRESSION', 'yy.ast.set({ expression: { type: "script_expression", value: $1 } })' ],
                [ 'INTEGER',           'yy.ast.set({ expression: { type: "numeric_literal", value: parseInt($1) } })' ],
                [ 'END',               '' ] ],

        SUBSCRIPT_COMPONENT: [
                [ 'CHILD_SUBSCRIPT_COMPONENT',      'yy.ast.set({ scope: "child" })' ],
                [ 'DESCENDANT_SUBSCRIPT_COMPONENT', 'yy.ast.set({ scope: "descendant" })' ] ],

        CHILD_SUBSCRIPT_COMPONENT: [
                [ '[ SUBSCRIPT ]', '' ] ],

        DESCENDANT_SUBSCRIPT_COMPONENT: [
                [ 'DOT_DOT [ SUBSCRIPT ]', '' ] ],

        SUBSCRIPT: [
                [ 'SUBSCRIPT_EXPRESSION', '' ],
                [ 'SUBSCRIPT_EXPRESSION_LIST', '$1.length > 1? yy.ast.set({ expression: { type: "union", value: $1 } }) : $$ = $1' ] ],

        SUBSCRIPT_EXPRESSION_LIST: [
                [ 'SUBSCRIPT_EXPRESSION_LISTABLE', '$$ = [$1]'],
                [ 'SUBSCRIPT_EXPRESSION_LIST , SUBSCRIPT_EXPRESSION_LISTABLE', '$$ = $1.concat($3)' ] ],

        SUBSCRIPT_EXPRESSION_LISTABLE: [
                [ 'INTEGER',           '$$ = { expression: { type: "numeric_literal", value: parseInt($1) } }; yy.ast.set($$)' ],
                [ 'STRING_LITERAL',    '$$ = { expression: { type: "string_literal", value: $1 } }; yy.ast.set($$)' ],
                [ 'ARRAY_SLICE',       '$$ = { expression: { type: "slice", value: $1 } }; yy.ast.set($$)' ] ],

        SUBSCRIPT_EXPRESSION: [
                [ 'STAR',              '$$ = { expression: { type: "wildcard", value: $1 } }; yy.ast.set($$)' ],
                [ 'SCRIPT_EXPRESSION', '$$ = { expression: { type: "script_expression", value: $1 } }; yy.ast.set($$)' ],
                [ 'FILTER_EXPRESSION', '$$ = { expression: { type: "filter_expression", value: $1 } }; yy.ast.set($$)' ] ],

        STRING_LITERAL: [
                [ 'QQ_STRING', "$$ = $1" ],
                [ 'Q_STRING',  "$$ = $1" ] ]
    }
};
if (fs.readFileSync) {
  grammar.moduleInclude = fs.readFileSync(require.resolve("../include/module.js"));
  grammar.actionInclude = fs.readFileSync(require.resolve("../include/action.js"));
}

module.exports = grammar;

},{"./dict":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/dict.js","fs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/lib/_empty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/handlers.js":[function(require,module,exports){
var aesprim = require('./aesprim');
var slice = require('./slice');
var _evaluate = require('static-eval');
var _uniq = require('underscore').uniq;

var Handlers = function() {
  return this.initialize.apply(this, arguments);
}

Handlers.prototype.initialize = function() {
  this.traverse = traverser(true);
  this.descend = traverser();
}

Handlers.prototype.keys = Object.keys;

Handlers.prototype.resolve = function(component) {

  var key = [ component.operation, component.scope, component.expression.type ].join('-');
  var method = this._fns[key];

  if (!method) throw new Error("couldn't resolve key: " + key);
  return method.bind(this);
};

Handlers.prototype.register = function(key, handler) {

  if (!handler instanceof Function) {
    throw new Error("handler must be a function");
  }

  this._fns[key] = handler;
};

Handlers.prototype._fns = {

  'member-child-identifier': function(component, partial) {
    var key = component.expression.value;
    var value = partial.value;
    if (value instanceof Object && key in value) {
      return [ { value: value[key], path: partial.path.concat(key) } ]
    }
  },

  'member-descendant-identifier':
    _traverse(function(key, value, ref) { return key == ref }),

  'subscript-child-numeric_literal':
    _descend(function(key, value, ref) { return key === ref }),

  'member-child-numeric_literal':
    _descend(function(key, value, ref) { return String(key) === String(ref) }),

  'subscript-descendant-numeric_literal':
    _traverse(function(key, value, ref) { return key === ref }),

  'member-child-wildcard':
    _descend(function() { return true }),

  'member-descendant-wildcard':
    _traverse(function() { return true }),

  'subscript-descendant-wildcard':
    _traverse(function() { return true }),

  'subscript-child-wildcard':
    _descend(function() { return true }),

  'subscript-child-slice': function(component, partial) {
    if (is_array(partial.value)) {
      var args = component.expression.value.split(':').map(_parse_nullable_int);
      var values = partial.value.map(function(v, i) { return { value: v, path: partial.path.concat(i) } });
      return slice.apply(null, [values].concat(args));
    }
  },

  'subscript-child-union': function(component, partial) {
    var results = [];
    component.expression.value.forEach(function(component) {
      var _component = { operation: 'subscript', scope: 'child', expression: component.expression };
      var handler = this.resolve(_component);
      var _results = handler(_component, partial);
      if (_results) {
        results = results.concat(_results);
      }
    }, this);

    return unique(results);
  },

  'subscript-descendant-union': function(component, partial, count) {

    var jp = require('..');
    var self = this;

    var results = [];
    var nodes = jp.nodes(partial, '$..*').slice(1);

    nodes.forEach(function(node) {
      if (results.length >= count) return;
      component.expression.value.forEach(function(component) {
        var _component = { operation: 'subscript', scope: 'child', expression: component.expression };
        var handler = self.resolve(_component);
        var _results = handler(_component, node);
        results = results.concat(_results);
      });
    });

    return unique(results);
  },

  'subscript-child-filter_expression': function(component, partial, count) {

    // slice out the expression from ?(expression)
    var src = component.expression.value.slice(2, -1);
    var ast = aesprim.parse(src).body[0].expression;

    var passable = function(key, value) {
      return evaluate(ast, { '@': value });
    }

    return this.descend(partial, null, passable, count);

  },

  'subscript-descendant-filter_expression': function(component, partial, count) {

    // slice out the expression from ?(expression)
    var src = component.expression.value.slice(2, -1);
    var ast = aesprim.parse(src).body[0].expression;

    var passable = function(key, value) {
      return evaluate(ast, { '@': value });
    }

    return this.traverse(partial, null, passable, count);
  },

  'subscript-child-script_expression': function(component, partial) {
    var exp = component.expression.value.slice(1, -1);
    return eval_recurse(partial, exp, '$[{{value}}]');
  },

  'member-child-script_expression': function(component, partial) {
    var exp = component.expression.value.slice(1, -1);
    return eval_recurse(partial, exp, '$.{{value}}');
  },

  'member-descendant-script_expression': function(component, partial) {
    var exp = component.expression.value.slice(1, -1);
    return eval_recurse(partial, exp, '$..value');
  }
};

Handlers.prototype._fns['subscript-child-string_literal'] =
	Handlers.prototype._fns['member-child-identifier'];

Handlers.prototype._fns['member-descendant-numeric_literal'] =
    Handlers.prototype._fns['subscript-descendant-string_literal'] =
    Handlers.prototype._fns['member-descendant-identifier'];

function eval_recurse(partial, src, template) {

  var jp = require('./index');
  var ast = aesprim.parse(src).body[0].expression;
  var value = evaluate(ast, { '@': partial.value });
  var path = template.replace(/\{\{\s*value\s*\}\}/g, value);

  var results = jp.nodes(partial.value, path);
  results.forEach(function(r) {
    r.path = partial.path.concat(r.path.slice(1));
  });

  return results;
}

function is_array(val) {
  return Array.isArray(val);
}

function is_object(val) {
  // is this a non-array, non-null object?
  return val && !(val instanceof Array) && val instanceof Object;
}

function traverser(recurse) {

  return function(partial, ref, passable, count) {

    var value = partial.value;
    var path = partial.path;

    var results = [];

    var descend = function(value, path) {

      if (is_array(value)) {
        value.forEach(function(element, index) {
          if (results.length >= count) { return }
          if (passable(index, element, ref)) {
            results.push({ path: path.concat(index), value: element });
          }
        });
        value.forEach(function(element, index) {
          if (results.length >= count) { return }
          if (recurse) {
            descend(element, path.concat(index));
          }
        });
      } else if (is_object(value)) {
        this.keys(value).forEach(function(k) {
          if (results.length >= count) { return }
          if (passable(k, value[k], ref)) {
            results.push({ path: path.concat(k), value: value[k] });
          }
        })
        this.keys(value).forEach(function(k) {
          if (results.length >= count) { return }
          if (recurse) {
            descend(value[k], path.concat(k));
          }
        });
      }
    }.bind(this);
    descend(value, path);
    return results;
  }
}

function _descend(passable) {
  return function(component, partial, count) {
    return this.descend(partial, component.expression.value, passable, count);
  }
}

function _traverse(passable) {
  return function(component, partial, count) {
    return this.traverse(partial, component.expression.value, passable, count);
  }
}

function evaluate() {
  try { return _evaluate.apply(this, arguments) }
  catch (e) { }
}

function unique(results) {
  results = results.filter(function(d) { return d })
  return _uniq(
    results,
    function(r) { return r.path.map(function(c) { return String(c).replace('-', '--') }).join('-') }
  );
}

function _parse_nullable_int(val) {
  var sval = String(val);
  return sval.match(/^-?[0-9]+$/) ? parseInt(sval) : null;
}

module.exports = Handlers;

},{"..":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/index.js","./aesprim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/generated/aesprim-browser.js","./index":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/index.js","./slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/slice.js","static-eval":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval/index.js","underscore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/underscore/underscore.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/index.js":[function(require,module,exports){
var assert = require('assert');
var dict = require('./dict');
var Parser = require('./parser');
var Handlers = require('./handlers');

var JSONPath = function() {
  this.initialize.apply(this, arguments);
};

JSONPath.prototype.initialize = function() {
  this.parser = new Parser();
  this.handlers = new Handlers();
};

JSONPath.prototype.parse = function(string) {
  assert.ok(_is_string(string), "we need a path");
  return this.parser.parse(string);
};

JSONPath.prototype.parent = function(obj, string) {

  assert.ok(obj instanceof Object, "obj needs to be an object");
  assert.ok(string, "we need a path");

  var node = this.nodes(obj, string)[0];
  var key = node.path.pop(); /* jshint unused:false */
  return this.value(obj, node.path);
}

JSONPath.prototype.apply = function(obj, string, fn) {

  assert.ok(obj instanceof Object, "obj needs to be an object");
  assert.ok(string, "we need a path");
  assert.equal(typeof fn, "function", "fn needs to be function")

  var nodes = this.nodes(obj, string).sort(function(a, b) {
    // sort nodes so we apply from the bottom up
    return b.path.length - a.path.length;
  });

  nodes.forEach(function(node) {
    var key = node.path.pop();
    var parent = this.value(obj, this.stringify(node.path));
    var val = node.value = fn.call(obj, parent[key]);
    parent[key] = val;
  }, this);

  return nodes;
}

JSONPath.prototype.value = function(obj, path, value) {

  assert.ok(obj instanceof Object, "obj needs to be an object");
  assert.ok(path, "we need a path");

  if (arguments.length >= 3) {
    var node = this.nodes(obj, path).shift();
    if (!node) return this._vivify(obj, path, value);
    var key = node.path.slice(-1).shift();
    var parent = this.parent(obj, this.stringify(node.path));
    parent[key] = value;
  }
  return this.query(obj, this.stringify(path), 1).shift();
}

JSONPath.prototype._vivify = function(obj, string, value) {

  var self = this;

  assert.ok(obj instanceof Object, "obj needs to be an object");
  assert.ok(string, "we need a path");

  var path = this.parser.parse(string)
    .map(function(component) { return component.expression.value });

  var setValue = function(path, value) {
    var key = path.pop();
    var node = self.value(obj, path);
    if (!node) {
      setValue(path.concat(), typeof key === 'string' ? {} : []);
      node = self.value(obj, path);
    }
    node[key] = value;
  }
  setValue(path, value);
  return this.query(obj, string)[0];
}

JSONPath.prototype.query = function(obj, string, count) {

  assert.ok(obj instanceof Object, "obj needs to be an object");
  assert.ok(_is_string(string), "we need a path");

  var results = this.nodes(obj, string, count)
    .map(function(r) { return r.value });

  return results;
};

JSONPath.prototype.paths = function(obj, string, count) {

  assert.ok(obj instanceof Object, "obj needs to be an object");
  assert.ok(string, "we need a path");

  var results = this.nodes(obj, string, count)
    .map(function(r) { return r.path });

  return results;
};

JSONPath.prototype.nodes = function(obj, string, count) {

  assert.ok(obj instanceof Object, "obj needs to be an object");
  assert.ok(string, "we need a path");

  if (count === 0) return [];

  var path = this.parser.parse(string);
  var handlers = this.handlers;

  var partials = [ { path: ['$'], value: obj } ];
  var matches = [];

  if (path.length && path[0].expression.type == 'root') path.shift();

  if (!path.length) return partials;

  path.forEach(function(component, index) {

    if (matches.length >= count) return;
    var handler = handlers.resolve(component);
    var _partials = [];

    partials.forEach(function(p) {

      if (matches.length >= count) return;
      var results = handler(component, p, count);

      if (index == path.length - 1) {
        // if we're through the components we're done
        matches = matches.concat(results || []);
      } else {
        // otherwise accumulate and carry on through
        _partials = _partials.concat(results || []);
      }
    });

    partials = _partials;

  });

  return count ? matches.slice(0, count) : matches;
};

JSONPath.prototype.stringify = function(path) {

  assert.ok(path, "we need a path");

  var string = '$';

  var templates = {
    'descendant-member': '..{{value}}',
    'child-member': '.{{value}}',
    'descendant-subscript': '..[{{value}}]',
    'child-subscript': '[{{value}}]'
  };

  path = this._normalize(path);

  path.forEach(function(component) {

    if (component.expression.type == 'root') return;

    var key = [component.scope, component.operation].join('-');
    var template = templates[key];
    var value;

    if (component.expression.type == 'string_literal') {
      value = JSON.stringify(component.expression.value)
    } else {
      value = component.expression.value;
    }

    if (!template) throw new Error("couldn't find template " + key);

    string += template.replace(/{{value}}/, value);
  });

  return string;
}

JSONPath.prototype._normalize = function(path) {

  assert.ok(path, "we need a path");

  if (typeof path == "string") {

    return this.parser.parse(path);

  } else if (Array.isArray(path) && typeof path[0] == "string") {

    var _path = [ { expression: { type: "root", value: "$" } } ];

    path.forEach(function(component, index) {

      if (component == '$' && index === 0) return;

      if (typeof component == "string" && component.match("^" + dict.identifier + "$")) {

        _path.push({
          operation: 'member',
          scope: 'child',
          expression: { value: component, type: 'identifier' }
        });

      } else {

        var type = typeof component == "number" ?
          'numeric_literal' : 'string_literal';

        _path.push({
          operation: 'subscript',
          scope: 'child',
          expression: { value: component, type: type }
        });
      }
    });

    return _path;

  } else if (Array.isArray(path) && typeof path[0] == "object") {

    return path
  }

  throw new Error("couldn't understand path " + path);
}

function _is_string(obj) {
  return Object.prototype.toString.call(obj) == '[object String]';
}

JSONPath.Handlers = Handlers;
JSONPath.Parser = Parser;

var instance = new JSONPath;
instance.JSONPath = JSONPath;

module.exports = instance;

},{"./dict":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/dict.js","./handlers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/handlers.js","./parser":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/parser.js","assert":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/assert.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/parser.js":[function(require,module,exports){
var grammar = require('./grammar');
var gparser = require('../generated/parser');

var Parser = function() {

  var parser = new gparser.Parser();

  var _parseError = parser.parseError;
  parser.yy.parseError = function() {
    if (parser.yy.ast) {
      parser.yy.ast.initialize();
    }
    _parseError.apply(parser, arguments);
  }

  return parser;

};

Parser.grammar = grammar;
module.exports = Parser;

},{"../generated/parser":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/generated/parser.js","./grammar":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/grammar.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/jsonpath/lib/slice.js":[function(require,module,exports){
module.exports = function(arr, start, end, step) {

  if (typeof start == 'string') throw new Error("start cannot be a string");
  if (typeof end == 'string') throw new Error("end cannot be a string");
  if (typeof step == 'string') throw new Error("step cannot be a string");

  var len = arr.length;

  if (step === 0) throw new Error("step cannot be zero");
  step = step ? integer(step) : 1;

  // normalize negative values
  start = start < 0 ? len + start : start;
  end = end < 0 ? len + end : end;

  // default extents to extents
  start = integer(start === 0 ? 0 : !start ? (step > 0 ? 0 : len - 1) : start);
  end = integer(end === 0 ? 0 : !end ? (step > 0 ? len : -1) : end);

  // clamp extents
  start = step > 0 ? Math.max(0, start) : Math.min(len, start);
  end = step > 0 ? Math.min(end, len) : Math.max(-1, end);

  // return empty if extents are backwards
  if (step > 0 && end <= start) return [];
  if (step < 0 && start <= end) return [];

  var result = [];

  for (var i = start; i != end; i += step) {
    if ((step < 0 && i <= end) || (step > 0 && i >= end)) break;
    result.push(arr[i]);
  }

  return result;
}

function integer(val) {
  return String(val).match(/^[0-9]+$/) ? parseInt(val) :
    Number.isFinite(val) ? parseInt(val, 10) : 0;
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/l10n-manticore/index.js":[function(require,module,exports){
'use strict';

var parse = require('es6-template-strings/compile');

/**
 * Lazy loading wouldn't really help here because we're mostly just using browserify and that's
 * going to pack the whole bundle. We would need tighter native integration to delay load stuff.
 * TODO see if this matters
 */
var Log = require('manticore-log')('l10n'),
    cultureOrder = ['en-US','en'];

/**
 * Return an instance of l10n against the specified JSON settings
 * @param allCultures
 * @returns {Function}
 */
module.exports = function (allCultures) {
    /**
     * Look from most specific culture to least specific for a value
     * for the given string key. The values are stored in JSON files
     * with a hierarchical structure (e.g. category.screen.stringName: value)
     * and accessed with dotted notation keys.
     * @param key The name of the string value you seek
     * @param substitutions If present, the values used to substitute template values in the string
     * @returns string The string value for the key, or the key if there isn't one.
     */
    return function l10n(key, substitutions) {
        var parts = key.split('.');
        var rawValue = key;
        for (var i = 0; i < cultureOrder.length; i++) {
            var vals = allCultures[cultureOrder[i]];
            if (vals) {
                var value = vals, j = 0;
                for (j = 0; j < parts.length && value; j++) {
                    value = value[parts[j]];
                }
                if (j === parts.length && value) {
                    rawValue = value;
                    break;
                }
            }
        }
        if (substitutions) {
            return subst(rawValue, substitutions);
        }
        return rawValue;
    };
};

var fnPattern = /^\s*l10n\s*\(\s*['"](.*)['"]\s*\)\s*$/;

function subst(rawValue, substitutions) {
    var parsed = parse(rawValue), l = parsed.literals;
    var merged = [];
    for (var lit = 0, len = l.length-1; lit < len; lit++) {
        merged.push(l[lit]);
        var s = (parsed.substitutions[lit] === null || parsed.substitutions[lit] === undefined) ? '' : parsed.substitutions[lit];
        // You can't use full expressions in l10n strings, but you can use
        // l10n(keyname) to at least compose strings
        if (s.indexOf('l10n(') === 0) {
            s = module.exports(s.match(fnPattern)[1], substitutions);
        } else {
            s = (substitutions[s] === null || substitutions[s] === undefined) ? '' : substitutions[s];
        }
        merged.push(s);
    }
    merged.push(l[l.length-1]);
    return merged.join('');
}

/**
 * Change the active culture order
 * @param culture
 */
module.exports.setCultures = function (cultures) {
    cultureOrder = cultures;
};

/**
 * Run straight variable substitution
 */
module.exports.subst = subst;

},{"es6-template-strings/compile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/l10n-manticore/node_modules/es6-template-strings/compile.js","manticore-log":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-log/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/l10n-manticore/node_modules/es6-template-strings/compile.js":[function(require,module,exports){
'use strict';

var current, literals, substitutions, sOut, sEscape, sAhead, sIn, sInEscape;

sOut = function (char) {
	if (char === '\\') return sEscape;
	if (char === '$') return sAhead;
	current += char;
	return sOut;
};
sEscape = function (char) {
	if ((char !== '\\') && (char !== '$')) current += '\\';
	current += char;
	return sOut;
};
sAhead = function (char) {
	if (char === '{') {
		literals.push(current);
		current = '';
		return sIn;
	}
	if (char === '$') {
		current += '$';
		return sAhead;
	}
	current += '$' + char;
	return sOut;
};
sIn = function (char) {
	if (char === '\\') return sInEscape;
	if (char === '}') {
		substitutions.push(current);
		current = '';
		return sOut;
	}
	current += char;
	return sIn;
};
sInEscape = function (char) {
	if ((char !== '\\') && (char !== '}')) current += '\\';
	current += char;
	return sIn;
};

module.exports = function (str) {
	var length, state, i, result;
	current = '';
	literals = [];
	substitutions = [];

	str = String(str);
	length = str.length;

	state = sOut;
	for (i = 0; i < length; ++i) state = state(str[i]);
	if (state === sOut) {
		literals.push(current);
	} else if (state === sEscape) {
		literals.push(current + '\\');
	} else if (state === sAhead) {
		literals.push(current + '$');
	} else if (state === sIn) {
		literals[literals.length - 1] += '${' + current;
	} else if (state === sInEscape) {
		literals[literals.length - 1] += '${' + current + '\\';
	}
	result = { literals: literals, substitutions: substitutions };
	literals = substitutions = null;
	return result;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js":[function(require,module,exports){
(function (global){(function (){
/**
 * @license
 * Lodash <https://lodash.com/>
 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */
;(function() {

  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
  var undefined;

  /** Used as the semantic version number. */
  var VERSION = '4.17.21';

  /** Used as the size to enable large array optimizations. */
  var LARGE_ARRAY_SIZE = 200;

  /** Error message constants. */
  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
      FUNC_ERROR_TEXT = 'Expected a function',
      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';

  /** Used to stand-in for `undefined` hash values. */
  var HASH_UNDEFINED = '__lodash_hash_undefined__';

  /** Used as the maximum memoize cache size. */
  var MAX_MEMOIZE_SIZE = 500;

  /** Used as the internal argument placeholder. */
  var PLACEHOLDER = '__lodash_placeholder__';

  /** Used to compose bitmasks for cloning. */
  var CLONE_DEEP_FLAG = 1,
      CLONE_FLAT_FLAG = 2,
      CLONE_SYMBOLS_FLAG = 4;

  /** Used to compose bitmasks for value comparisons. */
  var COMPARE_PARTIAL_FLAG = 1,
      COMPARE_UNORDERED_FLAG = 2;

  /** Used to compose bitmasks for function metadata. */
  var WRAP_BIND_FLAG = 1,
      WRAP_BIND_KEY_FLAG = 2,
      WRAP_CURRY_BOUND_FLAG = 4,
      WRAP_CURRY_FLAG = 8,
      WRAP_CURRY_RIGHT_FLAG = 16,
      WRAP_PARTIAL_FLAG = 32,
      WRAP_PARTIAL_RIGHT_FLAG = 64,
      WRAP_ARY_FLAG = 128,
      WRAP_REARG_FLAG = 256,
      WRAP_FLIP_FLAG = 512;

  /** Used as default options for `_.truncate`. */
  var DEFAULT_TRUNC_LENGTH = 30,
      DEFAULT_TRUNC_OMISSION = '...';

  /** Used to detect hot functions by number of calls within a span of milliseconds. */
  var HOT_COUNT = 800,
      HOT_SPAN = 16;

  /** Used to indicate the type of lazy iteratees. */
  var LAZY_FILTER_FLAG = 1,
      LAZY_MAP_FLAG = 2,
      LAZY_WHILE_FLAG = 3;

  /** Used as references for various `Number` constants. */
  var INFINITY = 1 / 0,
      MAX_SAFE_INTEGER = 9007199254740991,
      MAX_INTEGER = 1.7976931348623157e+308,
      NAN = 0 / 0;

  /** Used as references for the maximum length and index of an array. */
  var MAX_ARRAY_LENGTH = 4294967295,
      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;

  /** Used to associate wrap methods with their bit flags. */
  var wrapFlags = [
    ['ary', WRAP_ARY_FLAG],
    ['bind', WRAP_BIND_FLAG],
    ['bindKey', WRAP_BIND_KEY_FLAG],
    ['curry', WRAP_CURRY_FLAG],
    ['curryRight', WRAP_CURRY_RIGHT_FLAG],
    ['flip', WRAP_FLIP_FLAG],
    ['partial', WRAP_PARTIAL_FLAG],
    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
    ['rearg', WRAP_REARG_FLAG]
  ];

  /** `Object#toString` result references. */
  var argsTag = '[object Arguments]',
      arrayTag = '[object Array]',
      asyncTag = '[object AsyncFunction]',
      boolTag = '[object Boolean]',
      dateTag = '[object Date]',
      domExcTag = '[object DOMException]',
      errorTag = '[object Error]',
      funcTag = '[object Function]',
      genTag = '[object GeneratorFunction]',
      mapTag = '[object Map]',
      numberTag = '[object Number]',
      nullTag = '[object Null]',
      objectTag = '[object Object]',
      promiseTag = '[object Promise]',
      proxyTag = '[object Proxy]',
      regexpTag = '[object RegExp]',
      setTag = '[object Set]',
      stringTag = '[object String]',
      symbolTag = '[object Symbol]',
      undefinedTag = '[object Undefined]',
      weakMapTag = '[object WeakMap]',
      weakSetTag = '[object WeakSet]';

  var arrayBufferTag = '[object ArrayBuffer]',
      dataViewTag = '[object DataView]',
      float32Tag = '[object Float32Array]',
      float64Tag = '[object Float64Array]',
      int8Tag = '[object Int8Array]',
      int16Tag = '[object Int16Array]',
      int32Tag = '[object Int32Array]',
      uint8Tag = '[object Uint8Array]',
      uint8ClampedTag = '[object Uint8ClampedArray]',
      uint16Tag = '[object Uint16Array]',
      uint32Tag = '[object Uint32Array]';

  /** Used to match empty string literals in compiled template source. */
  var reEmptyStringLeading = /\b__p \+= '';/g,
      reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
      reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;

  /** Used to match HTML entities and HTML characters. */
  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
      reUnescapedHtml = /[&<>"']/g,
      reHasEscapedHtml = RegExp(reEscapedHtml.source),
      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);

  /** Used to match template delimiters. */
  var reEscape = /<%-([\s\S]+?)%>/g,
      reEvaluate = /<%([\s\S]+?)%>/g,
      reInterpolate = /<%=([\s\S]+?)%>/g;

  /** Used to match property names within property paths. */
  var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
      reIsPlainProp = /^\w*$/,
      rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;

  /**
   * Used to match `RegExp`
   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
   */
  var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
      reHasRegExpChar = RegExp(reRegExpChar.source);

  /** Used to match leading whitespace. */
  var reTrimStart = /^\s+/;

  /** Used to match a single whitespace character. */
  var reWhitespace = /\s/;

  /** Used to match wrap detail comments. */
  var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
      reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
      reSplitDetails = /,? & /;

  /** Used to match words composed of alphanumeric characters. */
  var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;

  /**
   * Used to validate the `validate` option in `_.template` variable.
   *
   * Forbids characters which could potentially change the meaning of the function argument definition:
   * - "()," (modification of function parameters)
   * - "=" (default value)
   * - "[]{}" (destructuring of function parameters)
   * - "/" (beginning of a comment)
   * - whitespace
   */
  var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;

  /** Used to match backslashes in property paths. */
  var reEscapeChar = /\\(\\)?/g;

  /**
   * Used to match
   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
   */
  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;

  /** Used to match `RegExp` flags from their coerced string values. */
  var reFlags = /\w*$/;

  /** Used to detect bad signed hexadecimal string values. */
  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;

  /** Used to detect binary string values. */
  var reIsBinary = /^0b[01]+$/i;

  /** Used to detect host constructors (Safari). */
  var reIsHostCtor = /^\[object .+?Constructor\]$/;

  /** Used to detect octal string values. */
  var reIsOctal = /^0o[0-7]+$/i;

  /** Used to detect unsigned integer values. */
  var reIsUint = /^(?:0|[1-9]\d*)$/;

  /** Used to match Latin Unicode letters (excluding mathematical operators). */
  var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;

  /** Used to ensure capturing order of template delimiters. */
  var reNoMatch = /($^)/;

  /** Used to match unescaped characters in compiled string literals. */
  var reUnescapedString = /['\n\r\u2028\u2029\\]/g;

  /** Used to compose unicode character classes. */
  var rsAstralRange = '\\ud800-\\udfff',
      rsComboMarksRange = '\\u0300-\\u036f',
      reComboHalfMarksRange = '\\ufe20-\\ufe2f',
      rsComboSymbolsRange = '\\u20d0-\\u20ff',
      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
      rsDingbatRange = '\\u2700-\\u27bf',
      rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
      rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
      rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
      rsPunctuationRange = '\\u2000-\\u206f',
      rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
      rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
      rsVarRange = '\\ufe0e\\ufe0f',
      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;

  /** Used to compose unicode capture groups. */
  var rsApos = "['\u2019]",
      rsAstral = '[' + rsAstralRange + ']',
      rsBreak = '[' + rsBreakRange + ']',
      rsCombo = '[' + rsComboRange + ']',
      rsDigits = '\\d+',
      rsDingbat = '[' + rsDingbatRange + ']',
      rsLower = '[' + rsLowerRange + ']',
      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
      rsFitz = '\\ud83c[\\udffb-\\udfff]',
      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
      rsNonAstral = '[^' + rsAstralRange + ']',
      rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
      rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
      rsUpper = '[' + rsUpperRange + ']',
      rsZWJ = '\\u200d';

  /** Used to compose unicode regexes. */
  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
      reOptMod = rsModifier + '?',
      rsOptVar = '[' + rsVarRange + ']?',
      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
      rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
      rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
      rsSeq = rsOptVar + reOptMod + rsOptJoin,
      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';

  /** Used to match apostrophes. */
  var reApos = RegExp(rsApos, 'g');

  /**
   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
   */
  var reComboMark = RegExp(rsCombo, 'g');

  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');

  /** Used to match complex or compound words. */
  var reUnicodeWord = RegExp([
    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
    rsUpper + '+' + rsOptContrUpper,
    rsOrdUpper,
    rsOrdLower,
    rsDigits,
    rsEmoji
  ].join('|'), 'g');

  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');

  /** Used to detect strings that need a more robust regexp to match words. */
  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;

  /** Used to assign default `context` object properties. */
  var contextProps = [
    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
  ];

  /** Used to make template sourceURLs easier to identify. */
  var templateCounter = -1;

  /** Used to identify `toStringTag` values of typed arrays. */
  var typedArrayTags = {};
  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
  typedArrayTags[uint32Tag] = true;
  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
  typedArrayTags[errorTag] = typedArrayTags[funcTag] =
  typedArrayTags[mapTag] = typedArrayTags[numberTag] =
  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
  typedArrayTags[setTag] = typedArrayTags[stringTag] =
  typedArrayTags[weakMapTag] = false;

  /** Used to identify `toStringTag` values supported by `_.clone`. */
  var cloneableTags = {};
  cloneableTags[argsTag] = cloneableTags[arrayTag] =
  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
  cloneableTags[boolTag] = cloneableTags[dateTag] =
  cloneableTags[float32Tag] = cloneableTags[float64Tag] =
  cloneableTags[int8Tag] = cloneableTags[int16Tag] =
  cloneableTags[int32Tag] = cloneableTags[mapTag] =
  cloneableTags[numberTag] = cloneableTags[objectTag] =
  cloneableTags[regexpTag] = cloneableTags[setTag] =
  cloneableTags[stringTag] = cloneableTags[symbolTag] =
  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
  cloneableTags[errorTag] = cloneableTags[funcTag] =
  cloneableTags[weakMapTag] = false;

  /** Used to map Latin Unicode letters to basic Latin letters. */
  var deburredLetters = {
    // Latin-1 Supplement block.
    '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
    '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
    '\xc7': 'C',  '\xe7': 'c',
    '\xd0': 'D',  '\xf0': 'd',
    '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
    '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
    '\xcc': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
    '\xec': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
    '\xd1': 'N',  '\xf1': 'n',
    '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
    '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
    '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
    '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
    '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
    '\xc6': 'Ae', '\xe6': 'ae',
    '\xde': 'Th', '\xfe': 'th',
    '\xdf': 'ss',
    // Latin Extended-A block.
    '\u0100': 'A',  '\u0102': 'A', '\u0104': 'A',
    '\u0101': 'a',  '\u0103': 'a', '\u0105': 'a',
    '\u0106': 'C',  '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
    '\u0107': 'c',  '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
    '\u010e': 'D',  '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
    '\u0112': 'E',  '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
    '\u0113': 'e',  '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
    '\u011c': 'G',  '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
    '\u011d': 'g',  '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
    '\u0124': 'H',  '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
    '\u0128': 'I',  '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
    '\u0129': 'i',  '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
    '\u0134': 'J',  '\u0135': 'j',
    '\u0136': 'K',  '\u0137': 'k', '\u0138': 'k',
    '\u0139': 'L',  '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
    '\u013a': 'l',  '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
    '\u0143': 'N',  '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
    '\u0144': 'n',  '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
    '\u014c': 'O',  '\u014e': 'O', '\u0150': 'O',
    '\u014d': 'o',  '\u014f': 'o', '\u0151': 'o',
    '\u0154': 'R',  '\u0156': 'R', '\u0158': 'R',
    '\u0155': 'r',  '\u0157': 'r', '\u0159': 'r',
    '\u015a': 'S',  '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
    '\u015b': 's',  '\u015d': 's', '\u015f': 's', '\u0161': 's',
    '\u0162': 'T',  '\u0164': 'T', '\u0166': 'T',
    '\u0163': 't',  '\u0165': 't', '\u0167': 't',
    '\u0168': 'U',  '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
    '\u0169': 'u',  '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
    '\u0174': 'W',  '\u0175': 'w',
    '\u0176': 'Y',  '\u0177': 'y', '\u0178': 'Y',
    '\u0179': 'Z',  '\u017b': 'Z', '\u017d': 'Z',
    '\u017a': 'z',  '\u017c': 'z', '\u017e': 'z',
    '\u0132': 'IJ', '\u0133': 'ij',
    '\u0152': 'Oe', '\u0153': 'oe',
    '\u0149': "'n", '\u017f': 's'
  };

  /** Used to map characters to HTML entities. */
  var htmlEscapes = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#39;'
  };

  /** Used to map HTML entities to characters. */
  var htmlUnescapes = {
    '&amp;': '&',
    '&lt;': '<',
    '&gt;': '>',
    '&quot;': '"',
    '&#39;': "'"
  };

  /** Used to escape characters for inclusion in compiled string literals. */
  var stringEscapes = {
    '\\': '\\',
    "'": "'",
    '\n': 'n',
    '\r': 'r',
    '\u2028': 'u2028',
    '\u2029': 'u2029'
  };

  /** Built-in method references without a dependency on `root`. */
  var freeParseFloat = parseFloat,
      freeParseInt = parseInt;

  /** Detect free variable `global` from Node.js. */
  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;

  /** Detect free variable `self`. */
  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;

  /** Used as a reference to the global object. */
  var root = freeGlobal || freeSelf || Function('return this')();

  /** Detect free variable `exports`. */
  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;

  /** Detect free variable `module`. */
  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

  /** Detect the popular CommonJS extension `module.exports`. */
  var moduleExports = freeModule && freeModule.exports === freeExports;

  /** Detect free variable `process` from Node.js. */
  var freeProcess = moduleExports && freeGlobal.process;

  /** Used to access faster Node.js helpers. */
  var nodeUtil = (function() {
    try {
      // Use `util.types` for Node.js 10+.
      var types = freeModule && freeModule.require && freeModule.require('util').types;

      if (types) {
        return types;
      }

      // Legacy `process.binding('util')` for Node.js < 10.
      return freeProcess && freeProcess.binding && freeProcess.binding('util');
    } catch (e) {}
  }());

  /* Node.js helper references. */
  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
      nodeIsDate = nodeUtil && nodeUtil.isDate,
      nodeIsMap = nodeUtil && nodeUtil.isMap,
      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
      nodeIsSet = nodeUtil && nodeUtil.isSet,
      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;

  /*--------------------------------------------------------------------------*/

  /**
   * A faster alternative to `Function#apply`, this function invokes `func`
   * with the `this` binding of `thisArg` and the arguments of `args`.
   *
   * @private
   * @param {Function} func The function to invoke.
   * @param {*} thisArg The `this` binding of `func`.
   * @param {Array} args The arguments to invoke `func` with.
   * @returns {*} Returns the result of `func`.
   */
  function apply(func, thisArg, args) {
    switch (args.length) {
      case 0: return func.call(thisArg);
      case 1: return func.call(thisArg, args[0]);
      case 2: return func.call(thisArg, args[0], args[1]);
      case 3: return func.call(thisArg, args[0], args[1], args[2]);
    }
    return func.apply(thisArg, args);
  }

  /**
   * A specialized version of `baseAggregator` for arrays.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} setter The function to set `accumulator` values.
   * @param {Function} iteratee The iteratee to transform keys.
   * @param {Object} accumulator The initial aggregated object.
   * @returns {Function} Returns `accumulator`.
   */
  function arrayAggregator(array, setter, iteratee, accumulator) {
    var index = -1,
        length = array == null ? 0 : array.length;

    while (++index < length) {
      var value = array[index];
      setter(accumulator, value, iteratee(value), array);
    }
    return accumulator;
  }

  /**
   * A specialized version of `_.forEach` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array} Returns `array`.
   */
  function arrayEach(array, iteratee) {
    var index = -1,
        length = array == null ? 0 : array.length;

    while (++index < length) {
      if (iteratee(array[index], index, array) === false) {
        break;
      }
    }
    return array;
  }

  /**
   * A specialized version of `_.forEachRight` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array} Returns `array`.
   */
  function arrayEachRight(array, iteratee) {
    var length = array == null ? 0 : array.length;

    while (length--) {
      if (iteratee(array[length], length, array) === false) {
        break;
      }
    }
    return array;
  }

  /**
   * A specialized version of `_.every` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {boolean} Returns `true` if all elements pass the predicate check,
   *  else `false`.
   */
  function arrayEvery(array, predicate) {
    var index = -1,
        length = array == null ? 0 : array.length;

    while (++index < length) {
      if (!predicate(array[index], index, array)) {
        return false;
      }
    }
    return true;
  }

  /**
   * A specialized version of `_.filter` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {Array} Returns the new filtered array.
   */
  function arrayFilter(array, predicate) {
    var index = -1,
        length = array == null ? 0 : array.length,
        resIndex = 0,
        result = [];

    while (++index < length) {
      var value = array[index];
      if (predicate(value, index, array)) {
        result[resIndex++] = value;
      }
    }
    return result;
  }

  /**
   * A specialized version of `_.includes` for arrays without support for
   * specifying an index to search from.
   *
   * @private
   * @param {Array} [array] The array to inspect.
   * @param {*} target The value to search for.
   * @returns {boolean} Returns `true` if `target` is found, else `false`.
   */
  function arrayIncludes(array, value) {
    var length = array == null ? 0 : array.length;
    return !!length && baseIndexOf(array, value, 0) > -1;
  }

  /**
   * This function is like `arrayIncludes` except that it accepts a comparator.
   *
   * @private
   * @param {Array} [array] The array to inspect.
   * @param {*} target The value to search for.
   * @param {Function} comparator The comparator invoked per element.
   * @returns {boolean} Returns `true` if `target` is found, else `false`.
   */
  function arrayIncludesWith(array, value, comparator) {
    var index = -1,
        length = array == null ? 0 : array.length;

    while (++index < length) {
      if (comparator(value, array[index])) {
        return true;
      }
    }
    return false;
  }

  /**
   * A specialized version of `_.map` for arrays without support for iteratee
   * shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array} Returns the new mapped array.
   */
  function arrayMap(array, iteratee) {
    var index = -1,
        length = array == null ? 0 : array.length,
        result = Array(length);

    while (++index < length) {
      result[index] = iteratee(array[index], index, array);
    }
    return result;
  }

  /**
   * Appends the elements of `values` to `array`.
   *
   * @private
   * @param {Array} array The array to modify.
   * @param {Array} values The values to append.
   * @returns {Array} Returns `array`.
   */
  function arrayPush(array, values) {
    var index = -1,
        length = values.length,
        offset = array.length;

    while (++index < length) {
      array[offset + index] = values[index];
    }
    return array;
  }

  /**
   * A specialized version of `_.reduce` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @param {*} [accumulator] The initial value.
   * @param {boolean} [initAccum] Specify using the first element of `array` as
   *  the initial value.
   * @returns {*} Returns the accumulated value.
   */
  function arrayReduce(array, iteratee, accumulator, initAccum) {
    var index = -1,
        length = array == null ? 0 : array.length;

    if (initAccum && length) {
      accumulator = array[++index];
    }
    while (++index < length) {
      accumulator = iteratee(accumulator, array[index], index, array);
    }
    return accumulator;
  }

  /**
   * A specialized version of `_.reduceRight` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @param {*} [accumulator] The initial value.
   * @param {boolean} [initAccum] Specify using the last element of `array` as
   *  the initial value.
   * @returns {*} Returns the accumulated value.
   */
  function arrayReduceRight(array, iteratee, accumulator, initAccum) {
    var length = array == null ? 0 : array.length;
    if (initAccum && length) {
      accumulator = array[--length];
    }
    while (length--) {
      accumulator = iteratee(accumulator, array[length], length, array);
    }
    return accumulator;
  }

  /**
   * A specialized version of `_.some` for arrays without support for iteratee
   * shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {boolean} Returns `true` if any element passes the predicate check,
   *  else `false`.
   */
  function arraySome(array, predicate) {
    var index = -1,
        length = array == null ? 0 : array.length;

    while (++index < length) {
      if (predicate(array[index], index, array)) {
        return true;
      }
    }
    return false;
  }

  /**
   * Gets the size of an ASCII `string`.
   *
   * @private
   * @param {string} string The string inspect.
   * @returns {number} Returns the string size.
   */
  var asciiSize = baseProperty('length');

  /**
   * Converts an ASCII `string` to an array.
   *
   * @private
   * @param {string} string The string to convert.
   * @returns {Array} Returns the converted array.
   */
  function asciiToArray(string) {
    return string.split('');
  }

  /**
   * Splits an ASCII `string` into an array of its words.
   *
   * @private
   * @param {string} The string to inspect.
   * @returns {Array} Returns the words of `string`.
   */
  function asciiWords(string) {
    return string.match(reAsciiWord) || [];
  }

  /**
   * The base implementation of methods like `_.findKey` and `_.findLastKey`,
   * without support for iteratee shorthands, which iterates over `collection`
   * using `eachFunc`.
   *
   * @private
   * @param {Array|Object} collection The collection to inspect.
   * @param {Function} predicate The function invoked per iteration.
   * @param {Function} eachFunc The function to iterate over `collection`.
   * @returns {*} Returns the found element or its key, else `undefined`.
   */
  function baseFindKey(collection, predicate, eachFunc) {
    var result;
    eachFunc(collection, function(value, key, collection) {
      if (predicate(value, key, collection)) {
        result = key;
        return false;
      }
    });
    return result;
  }

  /**
   * The base implementation of `_.findIndex` and `_.findLastIndex` without
   * support for iteratee shorthands.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {Function} predicate The function invoked per iteration.
   * @param {number} fromIndex The index to search from.
   * @param {boolean} [fromRight] Specify iterating from right to left.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function baseFindIndex(array, predicate, fromIndex, fromRight) {
    var length = array.length,
        index = fromIndex + (fromRight ? 1 : -1);

    while ((fromRight ? index-- : ++index < length)) {
      if (predicate(array[index], index, array)) {
        return index;
      }
    }
    return -1;
  }

  /**
   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {*} value The value to search for.
   * @param {number} fromIndex The index to search from.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function baseIndexOf(array, value, fromIndex) {
    return value === value
      ? strictIndexOf(array, value, fromIndex)
      : baseFindIndex(array, baseIsNaN, fromIndex);
  }

  /**
   * This function is like `baseIndexOf` except that it accepts a comparator.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {*} value The value to search for.
   * @param {number} fromIndex The index to search from.
   * @param {Function} comparator The comparator invoked per element.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function baseIndexOfWith(array, value, fromIndex, comparator) {
    var index = fromIndex - 1,
        length = array.length;

    while (++index < length) {
      if (comparator(array[index], value)) {
        return index;
      }
    }
    return -1;
  }

  /**
   * The base implementation of `_.isNaN` without support for number objects.
   *
   * @private
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
   */
  function baseIsNaN(value) {
    return value !== value;
  }

  /**
   * The base implementation of `_.mean` and `_.meanBy` without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} array The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {number} Returns the mean.
   */
  function baseMean(array, iteratee) {
    var length = array == null ? 0 : array.length;
    return length ? (baseSum(array, iteratee) / length) : NAN;
  }

  /**
   * The base implementation of `_.property` without support for deep paths.
   *
   * @private
   * @param {string} key The key of the property to get.
   * @returns {Function} Returns the new accessor function.
   */
  function baseProperty(key) {
    return function(object) {
      return object == null ? undefined : object[key];
    };
  }

  /**
   * The base implementation of `_.propertyOf` without support for deep paths.
   *
   * @private
   * @param {Object} object The object to query.
   * @returns {Function} Returns the new accessor function.
   */
  function basePropertyOf(object) {
    return function(key) {
      return object == null ? undefined : object[key];
    };
  }

  /**
   * The base implementation of `_.reduce` and `_.reduceRight`, without support
   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @param {*} accumulator The initial value.
   * @param {boolean} initAccum Specify using the first or last element of
   *  `collection` as the initial value.
   * @param {Function} eachFunc The function to iterate over `collection`.
   * @returns {*} Returns the accumulated value.
   */
  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
    eachFunc(collection, function(value, index, collection) {
      accumulator = initAccum
        ? (initAccum = false, value)
        : iteratee(accumulator, value, index, collection);
    });
    return accumulator;
  }

  /**
   * The base implementation of `_.sortBy` which uses `comparer` to define the
   * sort order of `array` and replaces criteria objects with their corresponding
   * values.
   *
   * @private
   * @param {Array} array The array to sort.
   * @param {Function} comparer The function to define sort order.
   * @returns {Array} Returns `array`.
   */
  function baseSortBy(array, comparer) {
    var length = array.length;

    array.sort(comparer);
    while (length--) {
      array[length] = array[length].value;
    }
    return array;
  }

  /**
   * The base implementation of `_.sum` and `_.sumBy` without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} array The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {number} Returns the sum.
   */
  function baseSum(array, iteratee) {
    var result,
        index = -1,
        length = array.length;

    while (++index < length) {
      var current = iteratee(array[index]);
      if (current !== undefined) {
        result = result === undefined ? current : (result + current);
      }
    }
    return result;
  }

  /**
   * The base implementation of `_.times` without support for iteratee shorthands
   * or max array length checks.
   *
   * @private
   * @param {number} n The number of times to invoke `iteratee`.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array} Returns the array of results.
   */
  function baseTimes(n, iteratee) {
    var index = -1,
        result = Array(n);

    while (++index < n) {
      result[index] = iteratee(index);
    }
    return result;
  }

  /**
   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
   * of key-value pairs for `object` corresponding to the property names of `props`.
   *
   * @private
   * @param {Object} object The object to query.
   * @param {Array} props The property names to get values for.
   * @returns {Object} Returns the key-value pairs.
   */
  function baseToPairs(object, props) {
    return arrayMap(props, function(key) {
      return [key, object[key]];
    });
  }

  /**
   * The base implementation of `_.trim`.
   *
   * @private
   * @param {string} string The string to trim.
   * @returns {string} Returns the trimmed string.
   */
  function baseTrim(string) {
    return string
      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')
      : string;
  }

  /**
   * The base implementation of `_.unary` without support for storing metadata.
   *
   * @private
   * @param {Function} func The function to cap arguments for.
   * @returns {Function} Returns the new capped function.
   */
  function baseUnary(func) {
    return function(value) {
      return func(value);
    };
  }

  /**
   * The base implementation of `_.values` and `_.valuesIn` which creates an
   * array of `object` property values corresponding to the property names
   * of `props`.
   *
   * @private
   * @param {Object} object The object to query.
   * @param {Array} props The property names to get values for.
   * @returns {Object} Returns the array of property values.
   */
  function baseValues(object, props) {
    return arrayMap(props, function(key) {
      return object[key];
    });
  }

  /**
   * Checks if a `cache` value for `key` exists.
   *
   * @private
   * @param {Object} cache The cache to query.
   * @param {string} key The key of the entry to check.
   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
   */
  function cacheHas(cache, key) {
    return cache.has(key);
  }

  /**
   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
   * that is not found in the character symbols.
   *
   * @private
   * @param {Array} strSymbols The string symbols to inspect.
   * @param {Array} chrSymbols The character symbols to find.
   * @returns {number} Returns the index of the first unmatched string symbol.
   */
  function charsStartIndex(strSymbols, chrSymbols) {
    var index = -1,
        length = strSymbols.length;

    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
    return index;
  }

  /**
   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
   * that is not found in the character symbols.
   *
   * @private
   * @param {Array} strSymbols The string symbols to inspect.
   * @param {Array} chrSymbols The character symbols to find.
   * @returns {number} Returns the index of the last unmatched string symbol.
   */
  function charsEndIndex(strSymbols, chrSymbols) {
    var index = strSymbols.length;

    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
    return index;
  }

  /**
   * Gets the number of `placeholder` occurrences in `array`.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {*} placeholder The placeholder to search for.
   * @returns {number} Returns the placeholder count.
   */
  function countHolders(array, placeholder) {
    var length = array.length,
        result = 0;

    while (length--) {
      if (array[length] === placeholder) {
        ++result;
      }
    }
    return result;
  }

  /**
   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
   * letters to basic Latin letters.
   *
   * @private
   * @param {string} letter The matched letter to deburr.
   * @returns {string} Returns the deburred letter.
   */
  var deburrLetter = basePropertyOf(deburredLetters);

  /**
   * Used by `_.escape` to convert characters to HTML entities.
   *
   * @private
   * @param {string} chr The matched character to escape.
   * @returns {string} Returns the escaped character.
   */
  var escapeHtmlChar = basePropertyOf(htmlEscapes);

  /**
   * Used by `_.template` to escape characters for inclusion in compiled string literals.
   *
   * @private
   * @param {string} chr The matched character to escape.
   * @returns {string} Returns the escaped character.
   */
  function escapeStringChar(chr) {
    return '\\' + stringEscapes[chr];
  }

  /**
   * Gets the value at `key` of `object`.
   *
   * @private
   * @param {Object} [object] The object to query.
   * @param {string} key The key of the property to get.
   * @returns {*} Returns the property value.
   */
  function getValue(object, key) {
    return object == null ? undefined : object[key];
  }

  /**
   * Checks if `string` contains Unicode symbols.
   *
   * @private
   * @param {string} string The string to inspect.
   * @returns {boolean} Returns `true` if a symbol is found, else `false`.
   */
  function hasUnicode(string) {
    return reHasUnicode.test(string);
  }

  /**
   * Checks if `string` contains a word composed of Unicode symbols.
   *
   * @private
   * @param {string} string The string to inspect.
   * @returns {boolean} Returns `true` if a word is found, else `false`.
   */
  function hasUnicodeWord(string) {
    return reHasUnicodeWord.test(string);
  }

  /**
   * Converts `iterator` to an array.
   *
   * @private
   * @param {Object} iterator The iterator to convert.
   * @returns {Array} Returns the converted array.
   */
  function iteratorToArray(iterator) {
    var data,
        result = [];

    while (!(data = iterator.next()).done) {
      result.push(data.value);
    }
    return result;
  }

  /**
   * Converts `map` to its key-value pairs.
   *
   * @private
   * @param {Object} map The map to convert.
   * @returns {Array} Returns the key-value pairs.
   */
  function mapToArray(map) {
    var index = -1,
        result = Array(map.size);

    map.forEach(function(value, key) {
      result[++index] = [key, value];
    });
    return result;
  }

  /**
   * Creates a unary function that invokes `func` with its argument transformed.
   *
   * @private
   * @param {Function} func The function to wrap.
   * @param {Function} transform The argument transform.
   * @returns {Function} Returns the new function.
   */
  function overArg(func, transform) {
    return function(arg) {
      return func(transform(arg));
    };
  }

  /**
   * Replaces all `placeholder` elements in `array` with an internal placeholder
   * and returns an array of their indexes.
   *
   * @private
   * @param {Array} array The array to modify.
   * @param {*} placeholder The placeholder to replace.
   * @returns {Array} Returns the new array of placeholder indexes.
   */
  function replaceHolders(array, placeholder) {
    var index = -1,
        length = array.length,
        resIndex = 0,
        result = [];

    while (++index < length) {
      var value = array[index];
      if (value === placeholder || value === PLACEHOLDER) {
        array[index] = PLACEHOLDER;
        result[resIndex++] = index;
      }
    }
    return result;
  }

  /**
   * Converts `set` to an array of its values.
   *
   * @private
   * @param {Object} set The set to convert.
   * @returns {Array} Returns the values.
   */
  function setToArray(set) {
    var index = -1,
        result = Array(set.size);

    set.forEach(function(value) {
      result[++index] = value;
    });
    return result;
  }

  /**
   * Converts `set` to its value-value pairs.
   *
   * @private
   * @param {Object} set The set to convert.
   * @returns {Array} Returns the value-value pairs.
   */
  function setToPairs(set) {
    var index = -1,
        result = Array(set.size);

    set.forEach(function(value) {
      result[++index] = [value, value];
    });
    return result;
  }

  /**
   * A specialized version of `_.indexOf` which performs strict equality
   * comparisons of values, i.e. `===`.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {*} value The value to search for.
   * @param {number} fromIndex The index to search from.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function strictIndexOf(array, value, fromIndex) {
    var index = fromIndex - 1,
        length = array.length;

    while (++index < length) {
      if (array[index] === value) {
        return index;
      }
    }
    return -1;
  }

  /**
   * A specialized version of `_.lastIndexOf` which performs strict equality
   * comparisons of values, i.e. `===`.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {*} value The value to search for.
   * @param {number} fromIndex The index to search from.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function strictLastIndexOf(array, value, fromIndex) {
    var index = fromIndex + 1;
    while (index--) {
      if (array[index] === value) {
        return index;
      }
    }
    return index;
  }

  /**
   * Gets the number of symbols in `string`.
   *
   * @private
   * @param {string} string The string to inspect.
   * @returns {number} Returns the string size.
   */
  function stringSize(string) {
    return hasUnicode(string)
      ? unicodeSize(string)
      : asciiSize(string);
  }

  /**
   * Converts `string` to an array.
   *
   * @private
   * @param {string} string The string to convert.
   * @returns {Array} Returns the converted array.
   */
  function stringToArray(string) {
    return hasUnicode(string)
      ? unicodeToArray(string)
      : asciiToArray(string);
  }

  /**
   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
   * character of `string`.
   *
   * @private
   * @param {string} string The string to inspect.
   * @returns {number} Returns the index of the last non-whitespace character.
   */
  function trimmedEndIndex(string) {
    var index = string.length;

    while (index-- && reWhitespace.test(string.charAt(index))) {}
    return index;
  }

  /**
   * Used by `_.unescape` to convert HTML entities to characters.
   *
   * @private
   * @param {string} chr The matched character to unescape.
   * @returns {string} Returns the unescaped character.
   */
  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);

  /**
   * Gets the size of a Unicode `string`.
   *
   * @private
   * @param {string} string The string inspect.
   * @returns {number} Returns the string size.
   */
  function unicodeSize(string) {
    var result = reUnicode.lastIndex = 0;
    while (reUnicode.test(string)) {
      ++result;
    }
    return result;
  }

  /**
   * Converts a Unicode `string` to an array.
   *
   * @private
   * @param {string} string The string to convert.
   * @returns {Array} Returns the converted array.
   */
  function unicodeToArray(string) {
    return string.match(reUnicode) || [];
  }

  /**
   * Splits a Unicode `string` into an array of its words.
   *
   * @private
   * @param {string} The string to inspect.
   * @returns {Array} Returns the words of `string`.
   */
  function unicodeWords(string) {
    return string.match(reUnicodeWord) || [];
  }

  /*--------------------------------------------------------------------------*/

  /**
   * Create a new pristine `lodash` function using the `context` object.
   *
   * @static
   * @memberOf _
   * @since 1.1.0
   * @category Util
   * @param {Object} [context=root] The context object.
   * @returns {Function} Returns a new `lodash` function.
   * @example
   *
   * _.mixin({ 'foo': _.constant('foo') });
   *
   * var lodash = _.runInContext();
   * lodash.mixin({ 'bar': lodash.constant('bar') });
   *
   * _.isFunction(_.foo);
   * // => true
   * _.isFunction(_.bar);
   * // => false
   *
   * lodash.isFunction(lodash.foo);
   * // => false
   * lodash.isFunction(lodash.bar);
   * // => true
   *
   * // Create a suped-up `defer` in Node.js.
   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
   */
  var runInContext = (function runInContext(context) {
    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));

    /** Built-in constructor references. */
    var Array = context.Array,
        Date = context.Date,
        Error = context.Error,
        Function = context.Function,
        Math = context.Math,
        Object = context.Object,
        RegExp = context.RegExp,
        String = context.String,
        TypeError = context.TypeError;

    /** Used for built-in method references. */
    var arrayProto = Array.prototype,
        funcProto = Function.prototype,
        objectProto = Object.prototype;

    /** Used to detect overreaching core-js shims. */
    var coreJsData = context['__core-js_shared__'];

    /** Used to resolve the decompiled source of functions. */
    var funcToString = funcProto.toString;

    /** Used to check objects for own properties. */
    var hasOwnProperty = objectProto.hasOwnProperty;

    /** Used to generate unique IDs. */
    var idCounter = 0;

    /** Used to detect methods masquerading as native. */
    var maskSrcKey = (function() {
      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
      return uid ? ('Symbol(src)_1.' + uid) : '';
    }());

    /**
     * Used to resolve the
     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
     * of values.
     */
    var nativeObjectToString = objectProto.toString;

    /** Used to infer the `Object` constructor. */
    var objectCtorString = funcToString.call(Object);

    /** Used to restore the original `_` reference in `_.noConflict`. */
    var oldDash = root._;

    /** Used to detect if a method is native. */
    var reIsNative = RegExp('^' +
      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
      .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
    );

    /** Built-in value references. */
    var Buffer = moduleExports ? context.Buffer : undefined,
        Symbol = context.Symbol,
        Uint8Array = context.Uint8Array,
        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
        getPrototype = overArg(Object.getPrototypeOf, Object),
        objectCreate = Object.create,
        propertyIsEnumerable = objectProto.propertyIsEnumerable,
        splice = arrayProto.splice,
        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
        symIterator = Symbol ? Symbol.iterator : undefined,
        symToStringTag = Symbol ? Symbol.toStringTag : undefined;

    var defineProperty = (function() {
      try {
        var func = getNative(Object, 'defineProperty');
        func({}, '', {});
        return func;
      } catch (e) {}
    }());

    /** Mocked built-ins. */
    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
        ctxNow = Date && Date.now !== root.Date.now && Date.now,
        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;

    /* Built-in method references for those with the same name as other `lodash` methods. */
    var nativeCeil = Math.ceil,
        nativeFloor = Math.floor,
        nativeGetSymbols = Object.getOwnPropertySymbols,
        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
        nativeIsFinite = context.isFinite,
        nativeJoin = arrayProto.join,
        nativeKeys = overArg(Object.keys, Object),
        nativeMax = Math.max,
        nativeMin = Math.min,
        nativeNow = Date.now,
        nativeParseInt = context.parseInt,
        nativeRandom = Math.random,
        nativeReverse = arrayProto.reverse;

    /* Built-in method references that are verified to be native. */
    var DataView = getNative(context, 'DataView'),
        Map = getNative(context, 'Map'),
        Promise = getNative(context, 'Promise'),
        Set = getNative(context, 'Set'),
        WeakMap = getNative(context, 'WeakMap'),
        nativeCreate = getNative(Object, 'create');

    /** Used to store function metadata. */
    var metaMap = WeakMap && new WeakMap;

    /** Used to lookup unminified function names. */
    var realNames = {};

    /** Used to detect maps, sets, and weakmaps. */
    var dataViewCtorString = toSource(DataView),
        mapCtorString = toSource(Map),
        promiseCtorString = toSource(Promise),
        setCtorString = toSource(Set),
        weakMapCtorString = toSource(WeakMap);

    /** Used to convert symbols to primitives and strings. */
    var symbolProto = Symbol ? Symbol.prototype : undefined,
        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
        symbolToString = symbolProto ? symbolProto.toString : undefined;

    /*------------------------------------------------------------------------*/

    /**
     * Creates a `lodash` object which wraps `value` to enable implicit method
     * chain sequences. Methods that operate on and return arrays, collections,
     * and functions can be chained together. Methods that retrieve a single value
     * or may return a primitive value will automatically end the chain sequence
     * and return the unwrapped value. Otherwise, the value must be unwrapped
     * with `_#value`.
     *
     * Explicit chain sequences, which must be unwrapped with `_#value`, may be
     * enabled using `_.chain`.
     *
     * The execution of chained methods is lazy, that is, it's deferred until
     * `_#value` is implicitly or explicitly called.
     *
     * Lazy evaluation allows several methods to support shortcut fusion.
     * Shortcut fusion is an optimization to merge iteratee calls; this avoids
     * the creation of intermediate arrays and can greatly reduce the number of
     * iteratee executions. Sections of a chain sequence qualify for shortcut
     * fusion if the section is applied to an array and iteratees accept only
     * one argument. The heuristic for whether a section qualifies for shortcut
     * fusion is subject to change.
     *
     * Chaining is supported in custom builds as long as the `_#value` method is
     * directly or indirectly included in the build.
     *
     * In addition to lodash methods, wrappers have `Array` and `String` methods.
     *
     * The wrapper `Array` methods are:
     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
     *
     * The wrapper `String` methods are:
     * `replace` and `split`
     *
     * The wrapper methods that support shortcut fusion are:
     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
     *
     * The chainable wrapper methods are:
     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
     * `zipObject`, `zipObjectDeep`, and `zipWith`
     *
     * The wrapper methods that are **not** chainable by default are:
     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
     * `upperFirst`, `value`, and `words`
     *
     * @name _
     * @constructor
     * @category Seq
     * @param {*} value The value to wrap in a `lodash` instance.
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * var wrapped = _([1, 2, 3]);
     *
     * // Returns an unwrapped value.
     * wrapped.reduce(_.add);
     * // => 6
     *
     * // Returns a wrapped value.
     * var squares = wrapped.map(square);
     *
     * _.isArray(squares);
     * // => false
     *
     * _.isArray(squares.value());
     * // => true
     */
    function lodash(value) {
      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
        if (value instanceof LodashWrapper) {
          return value;
        }
        if (hasOwnProperty.call(value, '__wrapped__')) {
          return wrapperClone(value);
        }
      }
      return new LodashWrapper(value);
    }

    /**
     * The base implementation of `_.create` without support for assigning
     * properties to the created object.
     *
     * @private
     * @param {Object} proto The object to inherit from.
     * @returns {Object} Returns the new object.
     */
    var baseCreate = (function() {
      function object() {}
      return function(proto) {
        if (!isObject(proto)) {
          return {};
        }
        if (objectCreate) {
          return objectCreate(proto);
        }
        object.prototype = proto;
        var result = new object;
        object.prototype = undefined;
        return result;
      };
    }());

    /**
     * The function whose prototype chain sequence wrappers inherit from.
     *
     * @private
     */
    function baseLodash() {
      // No operation performed.
    }

    /**
     * The base constructor for creating `lodash` wrapper objects.
     *
     * @private
     * @param {*} value The value to wrap.
     * @param {boolean} [chainAll] Enable explicit method chain sequences.
     */
    function LodashWrapper(value, chainAll) {
      this.__wrapped__ = value;
      this.__actions__ = [];
      this.__chain__ = !!chainAll;
      this.__index__ = 0;
      this.__values__ = undefined;
    }

    /**
     * By default, the template delimiters used by lodash are like those in
     * embedded Ruby (ERB) as well as ES2015 template strings. Change the
     * following template settings to use alternative delimiters.
     *
     * @static
     * @memberOf _
     * @type {Object}
     */
    lodash.templateSettings = {

      /**
       * Used to detect `data` property values to be HTML-escaped.
       *
       * @memberOf _.templateSettings
       * @type {RegExp}
       */
      'escape': reEscape,

      /**
       * Used to detect code to be evaluated.
       *
       * @memberOf _.templateSettings
       * @type {RegExp}
       */
      'evaluate': reEvaluate,

      /**
       * Used to detect `data` property values to inject.
       *
       * @memberOf _.templateSettings
       * @type {RegExp}
       */
      'interpolate': reInterpolate,

      /**
       * Used to reference the data object in the template text.
       *
       * @memberOf _.templateSettings
       * @type {string}
       */
      'variable': '',

      /**
       * Used to import variables into the compiled template.
       *
       * @memberOf _.templateSettings
       * @type {Object}
       */
      'imports': {

        /**
         * A reference to the `lodash` function.
         *
         * @memberOf _.templateSettings.imports
         * @type {Function}
         */
        '_': lodash
      }
    };

    // Ensure wrappers are instances of `baseLodash`.
    lodash.prototype = baseLodash.prototype;
    lodash.prototype.constructor = lodash;

    LodashWrapper.prototype = baseCreate(baseLodash.prototype);
    LodashWrapper.prototype.constructor = LodashWrapper;

    /*------------------------------------------------------------------------*/

    /**
     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
     *
     * @private
     * @constructor
     * @param {*} value The value to wrap.
     */
    function LazyWrapper(value) {
      this.__wrapped__ = value;
      this.__actions__ = [];
      this.__dir__ = 1;
      this.__filtered__ = false;
      this.__iteratees__ = [];
      this.__takeCount__ = MAX_ARRAY_LENGTH;
      this.__views__ = [];
    }

    /**
     * Creates a clone of the lazy wrapper object.
     *
     * @private
     * @name clone
     * @memberOf LazyWrapper
     * @returns {Object} Returns the cloned `LazyWrapper` object.
     */
    function lazyClone() {
      var result = new LazyWrapper(this.__wrapped__);
      result.__actions__ = copyArray(this.__actions__);
      result.__dir__ = this.__dir__;
      result.__filtered__ = this.__filtered__;
      result.__iteratees__ = copyArray(this.__iteratees__);
      result.__takeCount__ = this.__takeCount__;
      result.__views__ = copyArray(this.__views__);
      return result;
    }

    /**
     * Reverses the direction of lazy iteration.
     *
     * @private
     * @name reverse
     * @memberOf LazyWrapper
     * @returns {Object} Returns the new reversed `LazyWrapper` object.
     */
    function lazyReverse() {
      if (this.__filtered__) {
        var result = new LazyWrapper(this);
        result.__dir__ = -1;
        result.__filtered__ = true;
      } else {
        result = this.clone();
        result.__dir__ *= -1;
      }
      return result;
    }

    /**
     * Extracts the unwrapped value from its lazy wrapper.
     *
     * @private
     * @name value
     * @memberOf LazyWrapper
     * @returns {*} Returns the unwrapped value.
     */
    function lazyValue() {
      var array = this.__wrapped__.value(),
          dir = this.__dir__,
          isArr = isArray(array),
          isRight = dir < 0,
          arrLength = isArr ? array.length : 0,
          view = getView(0, arrLength, this.__views__),
          start = view.start,
          end = view.end,
          length = end - start,
          index = isRight ? end : (start - 1),
          iteratees = this.__iteratees__,
          iterLength = iteratees.length,
          resIndex = 0,
          takeCount = nativeMin(length, this.__takeCount__);

      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
        return baseWrapperValue(array, this.__actions__);
      }
      var result = [];

      outer:
      while (length-- && resIndex < takeCount) {
        index += dir;

        var iterIndex = -1,
            value = array[index];

        while (++iterIndex < iterLength) {
          var data = iteratees[iterIndex],
              iteratee = data.iteratee,
              type = data.type,
              computed = iteratee(value);

          if (type == LAZY_MAP_FLAG) {
            value = computed;
          } else if (!computed) {
            if (type == LAZY_FILTER_FLAG) {
              continue outer;
            } else {
              break outer;
            }
          }
        }
        result[resIndex++] = value;
      }
      return result;
    }

    // Ensure `LazyWrapper` is an instance of `baseLodash`.
    LazyWrapper.prototype = baseCreate(baseLodash.prototype);
    LazyWrapper.prototype.constructor = LazyWrapper;

    /*------------------------------------------------------------------------*/

    /**
     * Creates a hash object.
     *
     * @private
     * @constructor
     * @param {Array} [entries] The key-value pairs to cache.
     */
    function Hash(entries) {
      var index = -1,
          length = entries == null ? 0 : entries.length;

      this.clear();
      while (++index < length) {
        var entry = entries[index];
        this.set(entry[0], entry[1]);
      }
    }

    /**
     * Removes all key-value entries from the hash.
     *
     * @private
     * @name clear
     * @memberOf Hash
     */
    function hashClear() {
      this.__data__ = nativeCreate ? nativeCreate(null) : {};
      this.size = 0;
    }

    /**
     * Removes `key` and its value from the hash.
     *
     * @private
     * @name delete
     * @memberOf Hash
     * @param {Object} hash The hash to modify.
     * @param {string} key The key of the value to remove.
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
     */
    function hashDelete(key) {
      var result = this.has(key) && delete this.__data__[key];
      this.size -= result ? 1 : 0;
      return result;
    }

    /**
     * Gets the hash value for `key`.
     *
     * @private
     * @name get
     * @memberOf Hash
     * @param {string} key The key of the value to get.
     * @returns {*} Returns the entry value.
     */
    function hashGet(key) {
      var data = this.__data__;
      if (nativeCreate) {
        var result = data[key];
        return result === HASH_UNDEFINED ? undefined : result;
      }
      return hasOwnProperty.call(data, key) ? data[key] : undefined;
    }

    /**
     * Checks if a hash value for `key` exists.
     *
     * @private
     * @name has
     * @memberOf Hash
     * @param {string} key The key of the entry to check.
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
     */
    function hashHas(key) {
      var data = this.__data__;
      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
    }

    /**
     * Sets the hash `key` to `value`.
     *
     * @private
     * @name set
     * @memberOf Hash
     * @param {string} key The key of the value to set.
     * @param {*} value The value to set.
     * @returns {Object} Returns the hash instance.
     */
    function hashSet(key, value) {
      var data = this.__data__;
      this.size += this.has(key) ? 0 : 1;
      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
      return this;
    }

    // Add methods to `Hash`.
    Hash.prototype.clear = hashClear;
    Hash.prototype['delete'] = hashDelete;
    Hash.prototype.get = hashGet;
    Hash.prototype.has = hashHas;
    Hash.prototype.set = hashSet;

    /*------------------------------------------------------------------------*/

    /**
     * Creates an list cache object.
     *
     * @private
     * @constructor
     * @param {Array} [entries] The key-value pairs to cache.
     */
    function ListCache(entries) {
      var index = -1,
          length = entries == null ? 0 : entries.length;

      this.clear();
      while (++index < length) {
        var entry = entries[index];
        this.set(entry[0], entry[1]);
      }
    }

    /**
     * Removes all key-value entries from the list cache.
     *
     * @private
     * @name clear
     * @memberOf ListCache
     */
    function listCacheClear() {
      this.__data__ = [];
      this.size = 0;
    }

    /**
     * Removes `key` and its value from the list cache.
     *
     * @private
     * @name delete
     * @memberOf ListCache
     * @param {string} key The key of the value to remove.
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
     */
    function listCacheDelete(key) {
      var data = this.__data__,
          index = assocIndexOf(data, key);

      if (index < 0) {
        return false;
      }
      var lastIndex = data.length - 1;
      if (index == lastIndex) {
        data.pop();
      } else {
        splice.call(data, index, 1);
      }
      --this.size;
      return true;
    }

    /**
     * Gets the list cache value for `key`.
     *
     * @private
     * @name get
     * @memberOf ListCache
     * @param {string} key The key of the value to get.
     * @returns {*} Returns the entry value.
     */
    function listCacheGet(key) {
      var data = this.__data__,
          index = assocIndexOf(data, key);

      return index < 0 ? undefined : data[index][1];
    }

    /**
     * Checks if a list cache value for `key` exists.
     *
     * @private
     * @name has
     * @memberOf ListCache
     * @param {string} key The key of the entry to check.
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
     */
    function listCacheHas(key) {
      return assocIndexOf(this.__data__, key) > -1;
    }

    /**
     * Sets the list cache `key` to `value`.
     *
     * @private
     * @name set
     * @memberOf ListCache
     * @param {string} key The key of the value to set.
     * @param {*} value The value to set.
     * @returns {Object} Returns the list cache instance.
     */
    function listCacheSet(key, value) {
      var data = this.__data__,
          index = assocIndexOf(data, key);

      if (index < 0) {
        ++this.size;
        data.push([key, value]);
      } else {
        data[index][1] = value;
      }
      return this;
    }

    // Add methods to `ListCache`.
    ListCache.prototype.clear = listCacheClear;
    ListCache.prototype['delete'] = listCacheDelete;
    ListCache.prototype.get = listCacheGet;
    ListCache.prototype.has = listCacheHas;
    ListCache.prototype.set = listCacheSet;

    /*------------------------------------------------------------------------*/

    /**
     * Creates a map cache object to store key-value pairs.
     *
     * @private
     * @constructor
     * @param {Array} [entries] The key-value pairs to cache.
     */
    function MapCache(entries) {
      var index = -1,
          length = entries == null ? 0 : entries.length;

      this.clear();
      while (++index < length) {
        var entry = entries[index];
        this.set(entry[0], entry[1]);
      }
    }

    /**
     * Removes all key-value entries from the map.
     *
     * @private
     * @name clear
     * @memberOf MapCache
     */
    function mapCacheClear() {
      this.size = 0;
      this.__data__ = {
        'hash': new Hash,
        'map': new (Map || ListCache),
        'string': new Hash
      };
    }

    /**
     * Removes `key` and its value from the map.
     *
     * @private
     * @name delete
     * @memberOf MapCache
     * @param {string} key The key of the value to remove.
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
     */
    function mapCacheDelete(key) {
      var result = getMapData(this, key)['delete'](key);
      this.size -= result ? 1 : 0;
      return result;
    }

    /**
     * Gets the map value for `key`.
     *
     * @private
     * @name get
     * @memberOf MapCache
     * @param {string} key The key of the value to get.
     * @returns {*} Returns the entry value.
     */
    function mapCacheGet(key) {
      return getMapData(this, key).get(key);
    }

    /**
     * Checks if a map value for `key` exists.
     *
     * @private
     * @name has
     * @memberOf MapCache
     * @param {string} key The key of the entry to check.
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
     */
    function mapCacheHas(key) {
      return getMapData(this, key).has(key);
    }

    /**
     * Sets the map `key` to `value`.
     *
     * @private
     * @name set
     * @memberOf MapCache
     * @param {string} key The key of the value to set.
     * @param {*} value The value to set.
     * @returns {Object} Returns the map cache instance.
     */
    function mapCacheSet(key, value) {
      var data = getMapData(this, key),
          size = data.size;

      data.set(key, value);
      this.size += data.size == size ? 0 : 1;
      return this;
    }

    // Add methods to `MapCache`.
    MapCache.prototype.clear = mapCacheClear;
    MapCache.prototype['delete'] = mapCacheDelete;
    MapCache.prototype.get = mapCacheGet;
    MapCache.prototype.has = mapCacheHas;
    MapCache.prototype.set = mapCacheSet;

    /*------------------------------------------------------------------------*/

    /**
     *
     * Creates an array cache object to store unique values.
     *
     * @private
     * @constructor
     * @param {Array} [values] The values to cache.
     */
    function SetCache(values) {
      var index = -1,
          length = values == null ? 0 : values.length;

      this.__data__ = new MapCache;
      while (++index < length) {
        this.add(values[index]);
      }
    }

    /**
     * Adds `value` to the array cache.
     *
     * @private
     * @name add
     * @memberOf SetCache
     * @alias push
     * @param {*} value The value to cache.
     * @returns {Object} Returns the cache instance.
     */
    function setCacheAdd(value) {
      this.__data__.set(value, HASH_UNDEFINED);
      return this;
    }

    /**
     * Checks if `value` is in the array cache.
     *
     * @private
     * @name has
     * @memberOf SetCache
     * @param {*} value The value to search for.
     * @returns {number} Returns `true` if `value` is found, else `false`.
     */
    function setCacheHas(value) {
      return this.__data__.has(value);
    }

    // Add methods to `SetCache`.
    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
    SetCache.prototype.has = setCacheHas;

    /*------------------------------------------------------------------------*/

    /**
     * Creates a stack cache object to store key-value pairs.
     *
     * @private
     * @constructor
     * @param {Array} [entries] The key-value pairs to cache.
     */
    function Stack(entries) {
      var data = this.__data__ = new ListCache(entries);
      this.size = data.size;
    }

    /**
     * Removes all key-value entries from the stack.
     *
     * @private
     * @name clear
     * @memberOf Stack
     */
    function stackClear() {
      this.__data__ = new ListCache;
      this.size = 0;
    }

    /**
     * Removes `key` and its value from the stack.
     *
     * @private
     * @name delete
     * @memberOf Stack
     * @param {string} key The key of the value to remove.
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
     */
    function stackDelete(key) {
      var data = this.__data__,
          result = data['delete'](key);

      this.size = data.size;
      return result;
    }

    /**
     * Gets the stack value for `key`.
     *
     * @private
     * @name get
     * @memberOf Stack
     * @param {string} key The key of the value to get.
     * @returns {*} Returns the entry value.
     */
    function stackGet(key) {
      return this.__data__.get(key);
    }

    /**
     * Checks if a stack value for `key` exists.
     *
     * @private
     * @name has
     * @memberOf Stack
     * @param {string} key The key of the entry to check.
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
     */
    function stackHas(key) {
      return this.__data__.has(key);
    }

    /**
     * Sets the stack `key` to `value`.
     *
     * @private
     * @name set
     * @memberOf Stack
     * @param {string} key The key of the value to set.
     * @param {*} value The value to set.
     * @returns {Object} Returns the stack cache instance.
     */
    function stackSet(key, value) {
      var data = this.__data__;
      if (data instanceof ListCache) {
        var pairs = data.__data__;
        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
          pairs.push([key, value]);
          this.size = ++data.size;
          return this;
        }
        data = this.__data__ = new MapCache(pairs);
      }
      data.set(key, value);
      this.size = data.size;
      return this;
    }

    // Add methods to `Stack`.
    Stack.prototype.clear = stackClear;
    Stack.prototype['delete'] = stackDelete;
    Stack.prototype.get = stackGet;
    Stack.prototype.has = stackHas;
    Stack.prototype.set = stackSet;

    /*------------------------------------------------------------------------*/

    /**
     * Creates an array of the enumerable property names of the array-like `value`.
     *
     * @private
     * @param {*} value The value to query.
     * @param {boolean} inherited Specify returning inherited property names.
     * @returns {Array} Returns the array of property names.
     */
    function arrayLikeKeys(value, inherited) {
      var isArr = isArray(value),
          isArg = !isArr && isArguments(value),
          isBuff = !isArr && !isArg && isBuffer(value),
          isType = !isArr && !isArg && !isBuff && isTypedArray(value),
          skipIndexes = isArr || isArg || isBuff || isType,
          result = skipIndexes ? baseTimes(value.length, String) : [],
          length = result.length;

      for (var key in value) {
        if ((inherited || hasOwnProperty.call(value, key)) &&
            !(skipIndexes && (
               // Safari 9 has enumerable `arguments.length` in strict mode.
               key == 'length' ||
               // Node.js 0.10 has enumerable non-index properties on buffers.
               (isBuff && (key == 'offset' || key == 'parent')) ||
               // PhantomJS 2 has enumerable non-index properties on typed arrays.
               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
               // Skip index properties.
               isIndex(key, length)
            ))) {
          result.push(key);
        }
      }
      return result;
    }

    /**
     * A specialized version of `_.sample` for arrays.
     *
     * @private
     * @param {Array} array The array to sample.
     * @returns {*} Returns the random element.
     */
    function arraySample(array) {
      var length = array.length;
      return length ? array[baseRandom(0, length - 1)] : undefined;
    }

    /**
     * A specialized version of `_.sampleSize` for arrays.
     *
     * @private
     * @param {Array} array The array to sample.
     * @param {number} n The number of elements to sample.
     * @returns {Array} Returns the random elements.
     */
    function arraySampleSize(array, n) {
      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
    }

    /**
     * A specialized version of `_.shuffle` for arrays.
     *
     * @private
     * @param {Array} array The array to shuffle.
     * @returns {Array} Returns the new shuffled array.
     */
    function arrayShuffle(array) {
      return shuffleSelf(copyArray(array));
    }

    /**
     * This function is like `assignValue` except that it doesn't assign
     * `undefined` values.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {string} key The key of the property to assign.
     * @param {*} value The value to assign.
     */
    function assignMergeValue(object, key, value) {
      if ((value !== undefined && !eq(object[key], value)) ||
          (value === undefined && !(key in object))) {
        baseAssignValue(object, key, value);
      }
    }

    /**
     * Assigns `value` to `key` of `object` if the existing value is not equivalent
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {string} key The key of the property to assign.
     * @param {*} value The value to assign.
     */
    function assignValue(object, key, value) {
      var objValue = object[key];
      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
          (value === undefined && !(key in object))) {
        baseAssignValue(object, key, value);
      }
    }

    /**
     * Gets the index at which the `key` is found in `array` of key-value pairs.
     *
     * @private
     * @param {Array} array The array to inspect.
     * @param {*} key The key to search for.
     * @returns {number} Returns the index of the matched value, else `-1`.
     */
    function assocIndexOf(array, key) {
      var length = array.length;
      while (length--) {
        if (eq(array[length][0], key)) {
          return length;
        }
      }
      return -1;
    }

    /**
     * Aggregates elements of `collection` on `accumulator` with keys transformed
     * by `iteratee` and values set by `setter`.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} setter The function to set `accumulator` values.
     * @param {Function} iteratee The iteratee to transform keys.
     * @param {Object} accumulator The initial aggregated object.
     * @returns {Function} Returns `accumulator`.
     */
    function baseAggregator(collection, setter, iteratee, accumulator) {
      baseEach(collection, function(value, key, collection) {
        setter(accumulator, value, iteratee(value), collection);
      });
      return accumulator;
    }

    /**
     * The base implementation of `_.assign` without support for multiple sources
     * or `customizer` functions.
     *
     * @private
     * @param {Object} object The destination object.
     * @param {Object} source The source object.
     * @returns {Object} Returns `object`.
     */
    function baseAssign(object, source) {
      return object && copyObject(source, keys(source), object);
    }

    /**
     * The base implementation of `_.assignIn` without support for multiple sources
     * or `customizer` functions.
     *
     * @private
     * @param {Object} object The destination object.
     * @param {Object} source The source object.
     * @returns {Object} Returns `object`.
     */
    function baseAssignIn(object, source) {
      return object && copyObject(source, keysIn(source), object);
    }

    /**
     * The base implementation of `assignValue` and `assignMergeValue` without
     * value checks.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {string} key The key of the property to assign.
     * @param {*} value The value to assign.
     */
    function baseAssignValue(object, key, value) {
      if (key == '__proto__' && defineProperty) {
        defineProperty(object, key, {
          'configurable': true,
          'enumerable': true,
          'value': value,
          'writable': true
        });
      } else {
        object[key] = value;
      }
    }

    /**
     * The base implementation of `_.at` without support for individual paths.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {string[]} paths The property paths to pick.
     * @returns {Array} Returns the picked elements.
     */
    function baseAt(object, paths) {
      var index = -1,
          length = paths.length,
          result = Array(length),
          skip = object == null;

      while (++index < length) {
        result[index] = skip ? undefined : get(object, paths[index]);
      }
      return result;
    }

    /**
     * The base implementation of `_.clamp` which doesn't coerce arguments.
     *
     * @private
     * @param {number} number The number to clamp.
     * @param {number} [lower] The lower bound.
     * @param {number} upper The upper bound.
     * @returns {number} Returns the clamped number.
     */
    function baseClamp(number, lower, upper) {
      if (number === number) {
        if (upper !== undefined) {
          number = number <= upper ? number : upper;
        }
        if (lower !== undefined) {
          number = number >= lower ? number : lower;
        }
      }
      return number;
    }

    /**
     * The base implementation of `_.clone` and `_.cloneDeep` which tracks
     * traversed objects.
     *
     * @private
     * @param {*} value The value to clone.
     * @param {boolean} bitmask The bitmask flags.
     *  1 - Deep clone
     *  2 - Flatten inherited properties
     *  4 - Clone symbols
     * @param {Function} [customizer] The function to customize cloning.
     * @param {string} [key] The key of `value`.
     * @param {Object} [object] The parent object of `value`.
     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
     * @returns {*} Returns the cloned value.
     */
    function baseClone(value, bitmask, customizer, key, object, stack) {
      var result,
          isDeep = bitmask & CLONE_DEEP_FLAG,
          isFlat = bitmask & CLONE_FLAT_FLAG,
          isFull = bitmask & CLONE_SYMBOLS_FLAG;

      if (customizer) {
        result = object ? customizer(value, key, object, stack) : customizer(value);
      }
      if (result !== undefined) {
        return result;
      }
      if (!isObject(value)) {
        return value;
      }
      var isArr = isArray(value);
      if (isArr) {
        result = initCloneArray(value);
        if (!isDeep) {
          return copyArray(value, result);
        }
      } else {
        var tag = getTag(value),
            isFunc = tag == funcTag || tag == genTag;

        if (isBuffer(value)) {
          return cloneBuffer(value, isDeep);
        }
        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
          result = (isFlat || isFunc) ? {} : initCloneObject(value);
          if (!isDeep) {
            return isFlat
              ? copySymbolsIn(value, baseAssignIn(result, value))
              : copySymbols(value, baseAssign(result, value));
          }
        } else {
          if (!cloneableTags[tag]) {
            return object ? value : {};
          }
          result = initCloneByTag(value, tag, isDeep);
        }
      }
      // Check for circular references and return its corresponding clone.
      stack || (stack = new Stack);
      var stacked = stack.get(value);
      if (stacked) {
        return stacked;
      }
      stack.set(value, result);

      if (isSet(value)) {
        value.forEach(function(subValue) {
          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
        });
      } else if (isMap(value)) {
        value.forEach(function(subValue, key) {
          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
        });
      }

      var keysFunc = isFull
        ? (isFlat ? getAllKeysIn : getAllKeys)
        : (isFlat ? keysIn : keys);

      var props = isArr ? undefined : keysFunc(value);
      arrayEach(props || value, function(subValue, key) {
        if (props) {
          key = subValue;
          subValue = value[key];
        }
        // Recursively populate clone (susceptible to call stack limits).
        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
      });
      return result;
    }

    /**
     * The base implementation of `_.conforms` which doesn't clone `source`.
     *
     * @private
     * @param {Object} source The object of property predicates to conform to.
     * @returns {Function} Returns the new spec function.
     */
    function baseConforms(source) {
      var props = keys(source);
      return function(object) {
        return baseConformsTo(object, source, props);
      };
    }

    /**
     * The base implementation of `_.conformsTo` which accepts `props` to check.
     *
     * @private
     * @param {Object} object The object to inspect.
     * @param {Object} source The object of property predicates to conform to.
     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
     */
    function baseConformsTo(object, source, props) {
      var length = props.length;
      if (object == null) {
        return !length;
      }
      object = Object(object);
      while (length--) {
        var key = props[length],
            predicate = source[key],
            value = object[key];

        if ((value === undefined && !(key in object)) || !predicate(value)) {
          return false;
        }
      }
      return true;
    }

    /**
     * The base implementation of `_.delay` and `_.defer` which accepts `args`
     * to provide to `func`.
     *
     * @private
     * @param {Function} func The function to delay.
     * @param {number} wait The number of milliseconds to delay invocation.
     * @param {Array} args The arguments to provide to `func`.
     * @returns {number|Object} Returns the timer id or timeout object.
     */
    function baseDelay(func, wait, args) {
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      return setTimeout(function() { func.apply(undefined, args); }, wait);
    }

    /**
     * The base implementation of methods like `_.difference` without support
     * for excluding multiple arrays or iteratee shorthands.
     *
     * @private
     * @param {Array} array The array to inspect.
     * @param {Array} values The values to exclude.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of filtered values.
     */
    function baseDifference(array, values, iteratee, comparator) {
      var index = -1,
          includes = arrayIncludes,
          isCommon = true,
          length = array.length,
          result = [],
          valuesLength = values.length;

      if (!length) {
        return result;
      }
      if (iteratee) {
        values = arrayMap(values, baseUnary(iteratee));
      }
      if (comparator) {
        includes = arrayIncludesWith;
        isCommon = false;
      }
      else if (values.length >= LARGE_ARRAY_SIZE) {
        includes = cacheHas;
        isCommon = false;
        values = new SetCache(values);
      }
      outer:
      while (++index < length) {
        var value = array[index],
            computed = iteratee == null ? value : iteratee(value);

        value = (comparator || value !== 0) ? value : 0;
        if (isCommon && computed === computed) {
          var valuesIndex = valuesLength;
          while (valuesIndex--) {
            if (values[valuesIndex] === computed) {
              continue outer;
            }
          }
          result.push(value);
        }
        else if (!includes(values, computed, comparator)) {
          result.push(value);
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.forEach` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @returns {Array|Object} Returns `collection`.
     */
    var baseEach = createBaseEach(baseForOwn);

    /**
     * The base implementation of `_.forEachRight` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @returns {Array|Object} Returns `collection`.
     */
    var baseEachRight = createBaseEach(baseForOwnRight, true);

    /**
     * The base implementation of `_.every` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} predicate The function invoked per iteration.
     * @returns {boolean} Returns `true` if all elements pass the predicate check,
     *  else `false`
     */
    function baseEvery(collection, predicate) {
      var result = true;
      baseEach(collection, function(value, index, collection) {
        result = !!predicate(value, index, collection);
        return result;
      });
      return result;
    }

    /**
     * The base implementation of methods like `_.max` and `_.min` which accepts a
     * `comparator` to determine the extremum value.
     *
     * @private
     * @param {Array} array The array to iterate over.
     * @param {Function} iteratee The iteratee invoked per iteration.
     * @param {Function} comparator The comparator used to compare values.
     * @returns {*} Returns the extremum value.
     */
    function baseExtremum(array, iteratee, comparator) {
      var index = -1,
          length = array.length;

      while (++index < length) {
        var value = array[index],
            current = iteratee(value);

        if (current != null && (computed === undefined
              ? (current === current && !isSymbol(current))
              : comparator(current, computed)
            )) {
          var computed = current,
              result = value;
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.fill` without an iteratee call guard.
     *
     * @private
     * @param {Array} array The array to fill.
     * @param {*} value The value to fill `array` with.
     * @param {number} [start=0] The start position.
     * @param {number} [end=array.length] The end position.
     * @returns {Array} Returns `array`.
     */
    function baseFill(array, value, start, end) {
      var length = array.length;

      start = toInteger(start);
      if (start < 0) {
        start = -start > length ? 0 : (length + start);
      }
      end = (end === undefined || end > length) ? length : toInteger(end);
      if (end < 0) {
        end += length;
      }
      end = start > end ? 0 : toLength(end);
      while (start < end) {
        array[start++] = value;
      }
      return array;
    }

    /**
     * The base implementation of `_.filter` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} predicate The function invoked per iteration.
     * @returns {Array} Returns the new filtered array.
     */
    function baseFilter(collection, predicate) {
      var result = [];
      baseEach(collection, function(value, index, collection) {
        if (predicate(value, index, collection)) {
          result.push(value);
        }
      });
      return result;
    }

    /**
     * The base implementation of `_.flatten` with support for restricting flattening.
     *
     * @private
     * @param {Array} array The array to flatten.
     * @param {number} depth The maximum recursion depth.
     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
     * @param {Array} [result=[]] The initial result value.
     * @returns {Array} Returns the new flattened array.
     */
    function baseFlatten(array, depth, predicate, isStrict, result) {
      var index = -1,
          length = array.length;

      predicate || (predicate = isFlattenable);
      result || (result = []);

      while (++index < length) {
        var value = array[index];
        if (depth > 0 && predicate(value)) {
          if (depth > 1) {
            // Recursively flatten arrays (susceptible to call stack limits).
            baseFlatten(value, depth - 1, predicate, isStrict, result);
          } else {
            arrayPush(result, value);
          }
        } else if (!isStrict) {
          result[result.length] = value;
        }
      }
      return result;
    }

    /**
     * The base implementation of `baseForOwn` which iterates over `object`
     * properties returned by `keysFunc` and invokes `iteratee` for each property.
     * Iteratee functions may exit iteration early by explicitly returning `false`.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @param {Function} keysFunc The function to get the keys of `object`.
     * @returns {Object} Returns `object`.
     */
    var baseFor = createBaseFor();

    /**
     * This function is like `baseFor` except that it iterates over properties
     * in the opposite order.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @param {Function} keysFunc The function to get the keys of `object`.
     * @returns {Object} Returns `object`.
     */
    var baseForRight = createBaseFor(true);

    /**
     * The base implementation of `_.forOwn` without support for iteratee shorthands.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @returns {Object} Returns `object`.
     */
    function baseForOwn(object, iteratee) {
      return object && baseFor(object, iteratee, keys);
    }

    /**
     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @returns {Object} Returns `object`.
     */
    function baseForOwnRight(object, iteratee) {
      return object && baseForRight(object, iteratee, keys);
    }

    /**
     * The base implementation of `_.functions` which creates an array of
     * `object` function property names filtered from `props`.
     *
     * @private
     * @param {Object} object The object to inspect.
     * @param {Array} props The property names to filter.
     * @returns {Array} Returns the function names.
     */
    function baseFunctions(object, props) {
      return arrayFilter(props, function(key) {
        return isFunction(object[key]);
      });
    }

    /**
     * The base implementation of `_.get` without support for default values.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {Array|string} path The path of the property to get.
     * @returns {*} Returns the resolved value.
     */
    function baseGet(object, path) {
      path = castPath(path, object);

      var index = 0,
          length = path.length;

      while (object != null && index < length) {
        object = object[toKey(path[index++])];
      }
      return (index && index == length) ? object : undefined;
    }

    /**
     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
     * `keysFunc` and `symbolsFunc` to get the enumerable property names and
     * symbols of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {Function} keysFunc The function to get the keys of `object`.
     * @param {Function} symbolsFunc The function to get the symbols of `object`.
     * @returns {Array} Returns the array of property names and symbols.
     */
    function baseGetAllKeys(object, keysFunc, symbolsFunc) {
      var result = keysFunc(object);
      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
    }

    /**
     * The base implementation of `getTag` without fallbacks for buggy environments.
     *
     * @private
     * @param {*} value The value to query.
     * @returns {string} Returns the `toStringTag`.
     */
    function baseGetTag(value) {
      if (value == null) {
        return value === undefined ? undefinedTag : nullTag;
      }
      return (symToStringTag && symToStringTag in Object(value))
        ? getRawTag(value)
        : objectToString(value);
    }

    /**
     * The base implementation of `_.gt` which doesn't coerce arguments.
     *
     * @private
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is greater than `other`,
     *  else `false`.
     */
    function baseGt(value, other) {
      return value > other;
    }

    /**
     * The base implementation of `_.has` without support for deep paths.
     *
     * @private
     * @param {Object} [object] The object to query.
     * @param {Array|string} key The key to check.
     * @returns {boolean} Returns `true` if `key` exists, else `false`.
     */
    function baseHas(object, key) {
      return object != null && hasOwnProperty.call(object, key);
    }

    /**
     * The base implementation of `_.hasIn` without support for deep paths.
     *
     * @private
     * @param {Object} [object] The object to query.
     * @param {Array|string} key The key to check.
     * @returns {boolean} Returns `true` if `key` exists, else `false`.
     */
    function baseHasIn(object, key) {
      return object != null && key in Object(object);
    }

    /**
     * The base implementation of `_.inRange` which doesn't coerce arguments.
     *
     * @private
     * @param {number} number The number to check.
     * @param {number} start The start of the range.
     * @param {number} end The end of the range.
     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
     */
    function baseInRange(number, start, end) {
      return number >= nativeMin(start, end) && number < nativeMax(start, end);
    }

    /**
     * The base implementation of methods like `_.intersection`, without support
     * for iteratee shorthands, that accepts an array of arrays to inspect.
     *
     * @private
     * @param {Array} arrays The arrays to inspect.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of shared values.
     */
    function baseIntersection(arrays, iteratee, comparator) {
      var includes = comparator ? arrayIncludesWith : arrayIncludes,
          length = arrays[0].length,
          othLength = arrays.length,
          othIndex = othLength,
          caches = Array(othLength),
          maxLength = Infinity,
          result = [];

      while (othIndex--) {
        var array = arrays[othIndex];
        if (othIndex && iteratee) {
          array = arrayMap(array, baseUnary(iteratee));
        }
        maxLength = nativeMin(array.length, maxLength);
        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
          ? new SetCache(othIndex && array)
          : undefined;
      }
      array = arrays[0];

      var index = -1,
          seen = caches[0];

      outer:
      while (++index < length && result.length < maxLength) {
        var value = array[index],
            computed = iteratee ? iteratee(value) : value;

        value = (comparator || value !== 0) ? value : 0;
        if (!(seen
              ? cacheHas(seen, computed)
              : includes(result, computed, comparator)
            )) {
          othIndex = othLength;
          while (--othIndex) {
            var cache = caches[othIndex];
            if (!(cache
                  ? cacheHas(cache, computed)
                  : includes(arrays[othIndex], computed, comparator))
                ) {
              continue outer;
            }
          }
          if (seen) {
            seen.push(computed);
          }
          result.push(value);
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.invert` and `_.invertBy` which inverts
     * `object` with values transformed by `iteratee` and set by `setter`.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {Function} setter The function to set `accumulator` values.
     * @param {Function} iteratee The iteratee to transform values.
     * @param {Object} accumulator The initial inverted object.
     * @returns {Function} Returns `accumulator`.
     */
    function baseInverter(object, setter, iteratee, accumulator) {
      baseForOwn(object, function(value, key, object) {
        setter(accumulator, iteratee(value), key, object);
      });
      return accumulator;
    }

    /**
     * The base implementation of `_.invoke` without support for individual
     * method arguments.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {Array|string} path The path of the method to invoke.
     * @param {Array} args The arguments to invoke the method with.
     * @returns {*} Returns the result of the invoked method.
     */
    function baseInvoke(object, path, args) {
      path = castPath(path, object);
      object = parent(object, path);
      var func = object == null ? object : object[toKey(last(path))];
      return func == null ? undefined : apply(func, object, args);
    }

    /**
     * The base implementation of `_.isArguments`.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
     */
    function baseIsArguments(value) {
      return isObjectLike(value) && baseGetTag(value) == argsTag;
    }

    /**
     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
     */
    function baseIsArrayBuffer(value) {
      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
    }

    /**
     * The base implementation of `_.isDate` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
     */
    function baseIsDate(value) {
      return isObjectLike(value) && baseGetTag(value) == dateTag;
    }

    /**
     * The base implementation of `_.isEqual` which supports partial comparisons
     * and tracks traversed objects.
     *
     * @private
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @param {boolean} bitmask The bitmask flags.
     *  1 - Unordered comparison
     *  2 - Partial comparison
     * @param {Function} [customizer] The function to customize comparisons.
     * @param {Object} [stack] Tracks traversed `value` and `other` objects.
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
     */
    function baseIsEqual(value, other, bitmask, customizer, stack) {
      if (value === other) {
        return true;
      }
      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
        return value !== value && other !== other;
      }
      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
    }

    /**
     * A specialized version of `baseIsEqual` for arrays and objects which performs
     * deep comparisons and tracks traversed objects enabling objects with circular
     * references to be compared.
     *
     * @private
     * @param {Object} object The object to compare.
     * @param {Object} other The other object to compare.
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
     * @param {Function} customizer The function to customize comparisons.
     * @param {Function} equalFunc The function to determine equivalents of values.
     * @param {Object} [stack] Tracks traversed `object` and `other` objects.
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
     */
    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
      var objIsArr = isArray(object),
          othIsArr = isArray(other),
          objTag = objIsArr ? arrayTag : getTag(object),
          othTag = othIsArr ? arrayTag : getTag(other);

      objTag = objTag == argsTag ? objectTag : objTag;
      othTag = othTag == argsTag ? objectTag : othTag;

      var objIsObj = objTag == objectTag,
          othIsObj = othTag == objectTag,
          isSameTag = objTag == othTag;

      if (isSameTag && isBuffer(object)) {
        if (!isBuffer(other)) {
          return false;
        }
        objIsArr = true;
        objIsObj = false;
      }
      if (isSameTag && !objIsObj) {
        stack || (stack = new Stack);
        return (objIsArr || isTypedArray(object))
          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
      }
      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');

        if (objIsWrapped || othIsWrapped) {
          var objUnwrapped = objIsWrapped ? object.value() : object,
              othUnwrapped = othIsWrapped ? other.value() : other;

          stack || (stack = new Stack);
          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
        }
      }
      if (!isSameTag) {
        return false;
      }
      stack || (stack = new Stack);
      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
    }

    /**
     * The base implementation of `_.isMap` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
     */
    function baseIsMap(value) {
      return isObjectLike(value) && getTag(value) == mapTag;
    }

    /**
     * The base implementation of `_.isMatch` without support for iteratee shorthands.
     *
     * @private
     * @param {Object} object The object to inspect.
     * @param {Object} source The object of property values to match.
     * @param {Array} matchData The property names, values, and compare flags to match.
     * @param {Function} [customizer] The function to customize comparisons.
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
     */
    function baseIsMatch(object, source, matchData, customizer) {
      var index = matchData.length,
          length = index,
          noCustomizer = !customizer;

      if (object == null) {
        return !length;
      }
      object = Object(object);
      while (index--) {
        var data = matchData[index];
        if ((noCustomizer && data[2])
              ? data[1] !== object[data[0]]
              : !(data[0] in object)
            ) {
          return false;
        }
      }
      while (++index < length) {
        data = matchData[index];
        var key = data[0],
            objValue = object[key],
            srcValue = data[1];

        if (noCustomizer && data[2]) {
          if (objValue === undefined && !(key in object)) {
            return false;
          }
        } else {
          var stack = new Stack;
          if (customizer) {
            var result = customizer(objValue, srcValue, key, object, source, stack);
          }
          if (!(result === undefined
                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
                : result
              )) {
            return false;
          }
        }
      }
      return true;
    }

    /**
     * The base implementation of `_.isNative` without bad shim checks.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a native function,
     *  else `false`.
     */
    function baseIsNative(value) {
      if (!isObject(value) || isMasked(value)) {
        return false;
      }
      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
      return pattern.test(toSource(value));
    }

    /**
     * The base implementation of `_.isRegExp` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
     */
    function baseIsRegExp(value) {
      return isObjectLike(value) && baseGetTag(value) == regexpTag;
    }

    /**
     * The base implementation of `_.isSet` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
     */
    function baseIsSet(value) {
      return isObjectLike(value) && getTag(value) == setTag;
    }

    /**
     * The base implementation of `_.isTypedArray` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
     */
    function baseIsTypedArray(value) {
      return isObjectLike(value) &&
        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
    }

    /**
     * The base implementation of `_.iteratee`.
     *
     * @private
     * @param {*} [value=_.identity] The value to convert to an iteratee.
     * @returns {Function} Returns the iteratee.
     */
    function baseIteratee(value) {
      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
      if (typeof value == 'function') {
        return value;
      }
      if (value == null) {
        return identity;
      }
      if (typeof value == 'object') {
        return isArray(value)
          ? baseMatchesProperty(value[0], value[1])
          : baseMatches(value);
      }
      return property(value);
    }

    /**
     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names.
     */
    function baseKeys(object) {
      if (!isPrototype(object)) {
        return nativeKeys(object);
      }
      var result = [];
      for (var key in Object(object)) {
        if (hasOwnProperty.call(object, key) && key != 'constructor') {
          result.push(key);
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names.
     */
    function baseKeysIn(object) {
      if (!isObject(object)) {
        return nativeKeysIn(object);
      }
      var isProto = isPrototype(object),
          result = [];

      for (var key in object) {
        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
          result.push(key);
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.lt` which doesn't coerce arguments.
     *
     * @private
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is less than `other`,
     *  else `false`.
     */
    function baseLt(value, other) {
      return value < other;
    }

    /**
     * The base implementation of `_.map` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @returns {Array} Returns the new mapped array.
     */
    function baseMap(collection, iteratee) {
      var index = -1,
          result = isArrayLike(collection) ? Array(collection.length) : [];

      baseEach(collection, function(value, key, collection) {
        result[++index] = iteratee(value, key, collection);
      });
      return result;
    }

    /**
     * The base implementation of `_.matches` which doesn't clone `source`.
     *
     * @private
     * @param {Object} source The object of property values to match.
     * @returns {Function} Returns the new spec function.
     */
    function baseMatches(source) {
      var matchData = getMatchData(source);
      if (matchData.length == 1 && matchData[0][2]) {
        return matchesStrictComparable(matchData[0][0], matchData[0][1]);
      }
      return function(object) {
        return object === source || baseIsMatch(object, source, matchData);
      };
    }

    /**
     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
     *
     * @private
     * @param {string} path The path of the property to get.
     * @param {*} srcValue The value to match.
     * @returns {Function} Returns the new spec function.
     */
    function baseMatchesProperty(path, srcValue) {
      if (isKey(path) && isStrictComparable(srcValue)) {
        return matchesStrictComparable(toKey(path), srcValue);
      }
      return function(object) {
        var objValue = get(object, path);
        return (objValue === undefined && objValue === srcValue)
          ? hasIn(object, path)
          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
      };
    }

    /**
     * The base implementation of `_.merge` without support for multiple sources.
     *
     * @private
     * @param {Object} object The destination object.
     * @param {Object} source The source object.
     * @param {number} srcIndex The index of `source`.
     * @param {Function} [customizer] The function to customize merged values.
     * @param {Object} [stack] Tracks traversed source values and their merged
     *  counterparts.
     */
    function baseMerge(object, source, srcIndex, customizer, stack) {
      if (object === source) {
        return;
      }
      baseFor(source, function(srcValue, key) {
        stack || (stack = new Stack);
        if (isObject(srcValue)) {
          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
        }
        else {
          var newValue = customizer
            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
            : undefined;

          if (newValue === undefined) {
            newValue = srcValue;
          }
          assignMergeValue(object, key, newValue);
        }
      }, keysIn);
    }

    /**
     * A specialized version of `baseMerge` for arrays and objects which performs
     * deep merges and tracks traversed objects enabling objects with circular
     * references to be merged.
     *
     * @private
     * @param {Object} object The destination object.
     * @param {Object} source The source object.
     * @param {string} key The key of the value to merge.
     * @param {number} srcIndex The index of `source`.
     * @param {Function} mergeFunc The function to merge values.
     * @param {Function} [customizer] The function to customize assigned values.
     * @param {Object} [stack] Tracks traversed source values and their merged
     *  counterparts.
     */
    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
      var objValue = safeGet(object, key),
          srcValue = safeGet(source, key),
          stacked = stack.get(srcValue);

      if (stacked) {
        assignMergeValue(object, key, stacked);
        return;
      }
      var newValue = customizer
        ? customizer(objValue, srcValue, (key + ''), object, source, stack)
        : undefined;

      var isCommon = newValue === undefined;

      if (isCommon) {
        var isArr = isArray(srcValue),
            isBuff = !isArr && isBuffer(srcValue),
            isTyped = !isArr && !isBuff && isTypedArray(srcValue);

        newValue = srcValue;
        if (isArr || isBuff || isTyped) {
          if (isArray(objValue)) {
            newValue = objValue;
          }
          else if (isArrayLikeObject(objValue)) {
            newValue = copyArray(objValue);
          }
          else if (isBuff) {
            isCommon = false;
            newValue = cloneBuffer(srcValue, true);
          }
          else if (isTyped) {
            isCommon = false;
            newValue = cloneTypedArray(srcValue, true);
          }
          else {
            newValue = [];
          }
        }
        else if (isPlainObject(srcValue) || isArguments(srcValue)) {
          newValue = objValue;
          if (isArguments(objValue)) {
            newValue = toPlainObject(objValue);
          }
          else if (!isObject(objValue) || isFunction(objValue)) {
            newValue = initCloneObject(srcValue);
          }
        }
        else {
          isCommon = false;
        }
      }
      if (isCommon) {
        // Recursively merge objects and arrays (susceptible to call stack limits).
        stack.set(srcValue, newValue);
        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
        stack['delete'](srcValue);
      }
      assignMergeValue(object, key, newValue);
    }

    /**
     * The base implementation of `_.nth` which doesn't coerce arguments.
     *
     * @private
     * @param {Array} array The array to query.
     * @param {number} n The index of the element to return.
     * @returns {*} Returns the nth element of `array`.
     */
    function baseNth(array, n) {
      var length = array.length;
      if (!length) {
        return;
      }
      n += n < 0 ? length : 0;
      return isIndex(n, length) ? array[n] : undefined;
    }

    /**
     * The base implementation of `_.orderBy` without param guards.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
     * @param {string[]} orders The sort orders of `iteratees`.
     * @returns {Array} Returns the new sorted array.
     */
    function baseOrderBy(collection, iteratees, orders) {
      if (iteratees.length) {
        iteratees = arrayMap(iteratees, function(iteratee) {
          if (isArray(iteratee)) {
            return function(value) {
              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
            }
          }
          return iteratee;
        });
      } else {
        iteratees = [identity];
      }

      var index = -1;
      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));

      var result = baseMap(collection, function(value, key, collection) {
        var criteria = arrayMap(iteratees, function(iteratee) {
          return iteratee(value);
        });
        return { 'criteria': criteria, 'index': ++index, 'value': value };
      });

      return baseSortBy(result, function(object, other) {
        return compareMultiple(object, other, orders);
      });
    }

    /**
     * The base implementation of `_.pick` without support for individual
     * property identifiers.
     *
     * @private
     * @param {Object} object The source object.
     * @param {string[]} paths The property paths to pick.
     * @returns {Object} Returns the new object.
     */
    function basePick(object, paths) {
      return basePickBy(object, paths, function(value, path) {
        return hasIn(object, path);
      });
    }

    /**
     * The base implementation of  `_.pickBy` without support for iteratee shorthands.
     *
     * @private
     * @param {Object} object The source object.
     * @param {string[]} paths The property paths to pick.
     * @param {Function} predicate The function invoked per property.
     * @returns {Object} Returns the new object.
     */
    function basePickBy(object, paths, predicate) {
      var index = -1,
          length = paths.length,
          result = {};

      while (++index < length) {
        var path = paths[index],
            value = baseGet(object, path);

        if (predicate(value, path)) {
          baseSet(result, castPath(path, object), value);
        }
      }
      return result;
    }

    /**
     * A specialized version of `baseProperty` which supports deep paths.
     *
     * @private
     * @param {Array|string} path The path of the property to get.
     * @returns {Function} Returns the new accessor function.
     */
    function basePropertyDeep(path) {
      return function(object) {
        return baseGet(object, path);
      };
    }

    /**
     * The base implementation of `_.pullAllBy` without support for iteratee
     * shorthands.
     *
     * @private
     * @param {Array} array The array to modify.
     * @param {Array} values The values to remove.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns `array`.
     */
    function basePullAll(array, values, iteratee, comparator) {
      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
          index = -1,
          length = values.length,
          seen = array;

      if (array === values) {
        values = copyArray(values);
      }
      if (iteratee) {
        seen = arrayMap(array, baseUnary(iteratee));
      }
      while (++index < length) {
        var fromIndex = 0,
            value = values[index],
            computed = iteratee ? iteratee(value) : value;

        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
          if (seen !== array) {
            splice.call(seen, fromIndex, 1);
          }
          splice.call(array, fromIndex, 1);
        }
      }
      return array;
    }

    /**
     * The base implementation of `_.pullAt` without support for individual
     * indexes or capturing the removed elements.
     *
     * @private
     * @param {Array} array The array to modify.
     * @param {number[]} indexes The indexes of elements to remove.
     * @returns {Array} Returns `array`.
     */
    function basePullAt(array, indexes) {
      var length = array ? indexes.length : 0,
          lastIndex = length - 1;

      while (length--) {
        var index = indexes[length];
        if (length == lastIndex || index !== previous) {
          var previous = index;
          if (isIndex(index)) {
            splice.call(array, index, 1);
          } else {
            baseUnset(array, index);
          }
        }
      }
      return array;
    }

    /**
     * The base implementation of `_.random` without support for returning
     * floating-point numbers.
     *
     * @private
     * @param {number} lower The lower bound.
     * @param {number} upper The upper bound.
     * @returns {number} Returns the random number.
     */
    function baseRandom(lower, upper) {
      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
    }

    /**
     * The base implementation of `_.range` and `_.rangeRight` which doesn't
     * coerce arguments.
     *
     * @private
     * @param {number} start The start of the range.
     * @param {number} end The end of the range.
     * @param {number} step The value to increment or decrement by.
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Array} Returns the range of numbers.
     */
    function baseRange(start, end, step, fromRight) {
      var index = -1,
          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
          result = Array(length);

      while (length--) {
        result[fromRight ? length : ++index] = start;
        start += step;
      }
      return result;
    }

    /**
     * The base implementation of `_.repeat` which doesn't coerce arguments.
     *
     * @private
     * @param {string} string The string to repeat.
     * @param {number} n The number of times to repeat the string.
     * @returns {string} Returns the repeated string.
     */
    function baseRepeat(string, n) {
      var result = '';
      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
        return result;
      }
      // Leverage the exponentiation by squaring algorithm for a faster repeat.
      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
      do {
        if (n % 2) {
          result += string;
        }
        n = nativeFloor(n / 2);
        if (n) {
          string += string;
        }
      } while (n);

      return result;
    }

    /**
     * The base implementation of `_.rest` which doesn't validate or coerce arguments.
     *
     * @private
     * @param {Function} func The function to apply a rest parameter to.
     * @param {number} [start=func.length-1] The start position of the rest parameter.
     * @returns {Function} Returns the new function.
     */
    function baseRest(func, start) {
      return setToString(overRest(func, start, identity), func + '');
    }

    /**
     * The base implementation of `_.sample`.
     *
     * @private
     * @param {Array|Object} collection The collection to sample.
     * @returns {*} Returns the random element.
     */
    function baseSample(collection) {
      return arraySample(values(collection));
    }

    /**
     * The base implementation of `_.sampleSize` without param guards.
     *
     * @private
     * @param {Array|Object} collection The collection to sample.
     * @param {number} n The number of elements to sample.
     * @returns {Array} Returns the random elements.
     */
    function baseSampleSize(collection, n) {
      var array = values(collection);
      return shuffleSelf(array, baseClamp(n, 0, array.length));
    }

    /**
     * The base implementation of `_.set`.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to set.
     * @param {*} value The value to set.
     * @param {Function} [customizer] The function to customize path creation.
     * @returns {Object} Returns `object`.
     */
    function baseSet(object, path, value, customizer) {
      if (!isObject(object)) {
        return object;
      }
      path = castPath(path, object);

      var index = -1,
          length = path.length,
          lastIndex = length - 1,
          nested = object;

      while (nested != null && ++index < length) {
        var key = toKey(path[index]),
            newValue = value;

        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
          return object;
        }

        if (index != lastIndex) {
          var objValue = nested[key];
          newValue = customizer ? customizer(objValue, key, nested) : undefined;
          if (newValue === undefined) {
            newValue = isObject(objValue)
              ? objValue
              : (isIndex(path[index + 1]) ? [] : {});
          }
        }
        assignValue(nested, key, newValue);
        nested = nested[key];
      }
      return object;
    }

    /**
     * The base implementation of `setData` without support for hot loop shorting.
     *
     * @private
     * @param {Function} func The function to associate metadata with.
     * @param {*} data The metadata.
     * @returns {Function} Returns `func`.
     */
    var baseSetData = !metaMap ? identity : function(func, data) {
      metaMap.set(func, data);
      return func;
    };

    /**
     * The base implementation of `setToString` without support for hot loop shorting.
     *
     * @private
     * @param {Function} func The function to modify.
     * @param {Function} string The `toString` result.
     * @returns {Function} Returns `func`.
     */
    var baseSetToString = !defineProperty ? identity : function(func, string) {
      return defineProperty(func, 'toString', {
        'configurable': true,
        'enumerable': false,
        'value': constant(string),
        'writable': true
      });
    };

    /**
     * The base implementation of `_.shuffle`.
     *
     * @private
     * @param {Array|Object} collection The collection to shuffle.
     * @returns {Array} Returns the new shuffled array.
     */
    function baseShuffle(collection) {
      return shuffleSelf(values(collection));
    }

    /**
     * The base implementation of `_.slice` without an iteratee call guard.
     *
     * @private
     * @param {Array} array The array to slice.
     * @param {number} [start=0] The start position.
     * @param {number} [end=array.length] The end position.
     * @returns {Array} Returns the slice of `array`.
     */
    function baseSlice(array, start, end) {
      var index = -1,
          length = array.length;

      if (start < 0) {
        start = -start > length ? 0 : (length + start);
      }
      end = end > length ? length : end;
      if (end < 0) {
        end += length;
      }
      length = start > end ? 0 : ((end - start) >>> 0);
      start >>>= 0;

      var result = Array(length);
      while (++index < length) {
        result[index] = array[index + start];
      }
      return result;
    }

    /**
     * The base implementation of `_.some` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} predicate The function invoked per iteration.
     * @returns {boolean} Returns `true` if any element passes the predicate check,
     *  else `false`.
     */
    function baseSome(collection, predicate) {
      var result;

      baseEach(collection, function(value, index, collection) {
        result = predicate(value, index, collection);
        return !result;
      });
      return !!result;
    }

    /**
     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
     * performs a binary search of `array` to determine the index at which `value`
     * should be inserted into `array` in order to maintain its sort order.
     *
     * @private
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @param {boolean} [retHighest] Specify returning the highest qualified index.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     */
    function baseSortedIndex(array, value, retHighest) {
      var low = 0,
          high = array == null ? low : array.length;

      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
        while (low < high) {
          var mid = (low + high) >>> 1,
              computed = array[mid];

          if (computed !== null && !isSymbol(computed) &&
              (retHighest ? (computed <= value) : (computed < value))) {
            low = mid + 1;
          } else {
            high = mid;
          }
        }
        return high;
      }
      return baseSortedIndexBy(array, value, identity, retHighest);
    }

    /**
     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
     * which invokes `iteratee` for `value` and each element of `array` to compute
     * their sort ranking. The iteratee is invoked with one argument; (value).
     *
     * @private
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @param {Function} iteratee The iteratee invoked per element.
     * @param {boolean} [retHighest] Specify returning the highest qualified index.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     */
    function baseSortedIndexBy(array, value, iteratee, retHighest) {
      var low = 0,
          high = array == null ? 0 : array.length;
      if (high === 0) {
        return 0;
      }

      value = iteratee(value);
      var valIsNaN = value !== value,
          valIsNull = value === null,
          valIsSymbol = isSymbol(value),
          valIsUndefined = value === undefined;

      while (low < high) {
        var mid = nativeFloor((low + high) / 2),
            computed = iteratee(array[mid]),
            othIsDefined = computed !== undefined,
            othIsNull = computed === null,
            othIsReflexive = computed === computed,
            othIsSymbol = isSymbol(computed);

        if (valIsNaN) {
          var setLow = retHighest || othIsReflexive;
        } else if (valIsUndefined) {
          setLow = othIsReflexive && (retHighest || othIsDefined);
        } else if (valIsNull) {
          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
        } else if (valIsSymbol) {
          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
        } else if (othIsNull || othIsSymbol) {
          setLow = false;
        } else {
          setLow = retHighest ? (computed <= value) : (computed < value);
        }
        if (setLow) {
          low = mid + 1;
        } else {
          high = mid;
        }
      }
      return nativeMin(high, MAX_ARRAY_INDEX);
    }

    /**
     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
     * support for iteratee shorthands.
     *
     * @private
     * @param {Array} array The array to inspect.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @returns {Array} Returns the new duplicate free array.
     */
    function baseSortedUniq(array, iteratee) {
      var index = -1,
          length = array.length,
          resIndex = 0,
          result = [];

      while (++index < length) {
        var value = array[index],
            computed = iteratee ? iteratee(value) : value;

        if (!index || !eq(computed, seen)) {
          var seen = computed;
          result[resIndex++] = value === 0 ? 0 : value;
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.toNumber` which doesn't ensure correct
     * conversions of binary, hexadecimal, or octal string values.
     *
     * @private
     * @param {*} value The value to process.
     * @returns {number} Returns the number.
     */
    function baseToNumber(value) {
      if (typeof value == 'number') {
        return value;
      }
      if (isSymbol(value)) {
        return NAN;
      }
      return +value;
    }

    /**
     * The base implementation of `_.toString` which doesn't convert nullish
     * values to empty strings.
     *
     * @private
     * @param {*} value The value to process.
     * @returns {string} Returns the string.
     */
    function baseToString(value) {
      // Exit early for strings to avoid a performance hit in some environments.
      if (typeof value == 'string') {
        return value;
      }
      if (isArray(value)) {
        // Recursively convert values (susceptible to call stack limits).
        return arrayMap(value, baseToString) + '';
      }
      if (isSymbol(value)) {
        return symbolToString ? symbolToString.call(value) : '';
      }
      var result = (value + '');
      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
    }

    /**
     * The base implementation of `_.uniqBy` without support for iteratee shorthands.
     *
     * @private
     * @param {Array} array The array to inspect.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new duplicate free array.
     */
    function baseUniq(array, iteratee, comparator) {
      var index = -1,
          includes = arrayIncludes,
          length = array.length,
          isCommon = true,
          result = [],
          seen = result;

      if (comparator) {
        isCommon = false;
        includes = arrayIncludesWith;
      }
      else if (length >= LARGE_ARRAY_SIZE) {
        var set = iteratee ? null : createSet(array);
        if (set) {
          return setToArray(set);
        }
        isCommon = false;
        includes = cacheHas;
        seen = new SetCache;
      }
      else {
        seen = iteratee ? [] : result;
      }
      outer:
      while (++index < length) {
        var value = array[index],
            computed = iteratee ? iteratee(value) : value;

        value = (comparator || value !== 0) ? value : 0;
        if (isCommon && computed === computed) {
          var seenIndex = seen.length;
          while (seenIndex--) {
            if (seen[seenIndex] === computed) {
              continue outer;
            }
          }
          if (iteratee) {
            seen.push(computed);
          }
          result.push(value);
        }
        else if (!includes(seen, computed, comparator)) {
          if (seen !== result) {
            seen.push(computed);
          }
          result.push(value);
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.unset`.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {Array|string} path The property path to unset.
     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
     */
    function baseUnset(object, path) {
      path = castPath(path, object);
      object = parent(object, path);
      return object == null || delete object[toKey(last(path))];
    }

    /**
     * The base implementation of `_.update`.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to update.
     * @param {Function} updater The function to produce the updated value.
     * @param {Function} [customizer] The function to customize path creation.
     * @returns {Object} Returns `object`.
     */
    function baseUpdate(object, path, updater, customizer) {
      return baseSet(object, path, updater(baseGet(object, path)), customizer);
    }

    /**
     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
     * without support for iteratee shorthands.
     *
     * @private
     * @param {Array} array The array to query.
     * @param {Function} predicate The function invoked per iteration.
     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Array} Returns the slice of `array`.
     */
    function baseWhile(array, predicate, isDrop, fromRight) {
      var length = array.length,
          index = fromRight ? length : -1;

      while ((fromRight ? index-- : ++index < length) &&
        predicate(array[index], index, array)) {}

      return isDrop
        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
    }

    /**
     * The base implementation of `wrapperValue` which returns the result of
     * performing a sequence of actions on the unwrapped `value`, where each
     * successive action is supplied the return value of the previous.
     *
     * @private
     * @param {*} value The unwrapped value.
     * @param {Array} actions Actions to perform to resolve the unwrapped value.
     * @returns {*} Returns the resolved value.
     */
    function baseWrapperValue(value, actions) {
      var result = value;
      if (result instanceof LazyWrapper) {
        result = result.value();
      }
      return arrayReduce(actions, function(result, action) {
        return action.func.apply(action.thisArg, arrayPush([result], action.args));
      }, result);
    }

    /**
     * The base implementation of methods like `_.xor`, without support for
     * iteratee shorthands, that accepts an array of arrays to inspect.
     *
     * @private
     * @param {Array} arrays The arrays to inspect.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of values.
     */
    function baseXor(arrays, iteratee, comparator) {
      var length = arrays.length;
      if (length < 2) {
        return length ? baseUniq(arrays[0]) : [];
      }
      var index = -1,
          result = Array(length);

      while (++index < length) {
        var array = arrays[index],
            othIndex = -1;

        while (++othIndex < length) {
          if (othIndex != index) {
            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
          }
        }
      }
      return baseUniq(baseFlatten(result, 1), iteratee, comparator);
    }

    /**
     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
     *
     * @private
     * @param {Array} props The property identifiers.
     * @param {Array} values The property values.
     * @param {Function} assignFunc The function to assign values.
     * @returns {Object} Returns the new object.
     */
    function baseZipObject(props, values, assignFunc) {
      var index = -1,
          length = props.length,
          valsLength = values.length,
          result = {};

      while (++index < length) {
        var value = index < valsLength ? values[index] : undefined;
        assignFunc(result, props[index], value);
      }
      return result;
    }

    /**
     * Casts `value` to an empty array if it's not an array like object.
     *
     * @private
     * @param {*} value The value to inspect.
     * @returns {Array|Object} Returns the cast array-like object.
     */
    function castArrayLikeObject(value) {
      return isArrayLikeObject(value) ? value : [];
    }

    /**
     * Casts `value` to `identity` if it's not a function.
     *
     * @private
     * @param {*} value The value to inspect.
     * @returns {Function} Returns cast function.
     */
    function castFunction(value) {
      return typeof value == 'function' ? value : identity;
    }

    /**
     * Casts `value` to a path array if it's not one.
     *
     * @private
     * @param {*} value The value to inspect.
     * @param {Object} [object] The object to query keys on.
     * @returns {Array} Returns the cast property path array.
     */
    function castPath(value, object) {
      if (isArray(value)) {
        return value;
      }
      return isKey(value, object) ? [value] : stringToPath(toString(value));
    }

    /**
     * A `baseRest` alias which can be replaced with `identity` by module
     * replacement plugins.
     *
     * @private
     * @type {Function}
     * @param {Function} func The function to apply a rest parameter to.
     * @returns {Function} Returns the new function.
     */
    var castRest = baseRest;

    /**
     * Casts `array` to a slice if it's needed.
     *
     * @private
     * @param {Array} array The array to inspect.
     * @param {number} start The start position.
     * @param {number} [end=array.length] The end position.
     * @returns {Array} Returns the cast slice.
     */
    function castSlice(array, start, end) {
      var length = array.length;
      end = end === undefined ? length : end;
      return (!start && end >= length) ? array : baseSlice(array, start, end);
    }

    /**
     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
     *
     * @private
     * @param {number|Object} id The timer id or timeout object of the timer to clear.
     */
    var clearTimeout = ctxClearTimeout || function(id) {
      return root.clearTimeout(id);
    };

    /**
     * Creates a clone of  `buffer`.
     *
     * @private
     * @param {Buffer} buffer The buffer to clone.
     * @param {boolean} [isDeep] Specify a deep clone.
     * @returns {Buffer} Returns the cloned buffer.
     */
    function cloneBuffer(buffer, isDeep) {
      if (isDeep) {
        return buffer.slice();
      }
      var length = buffer.length,
          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);

      buffer.copy(result);
      return result;
    }

    /**
     * Creates a clone of `arrayBuffer`.
     *
     * @private
     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
     * @returns {ArrayBuffer} Returns the cloned array buffer.
     */
    function cloneArrayBuffer(arrayBuffer) {
      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
      new Uint8Array(result).set(new Uint8Array(arrayBuffer));
      return result;
    }

    /**
     * Creates a clone of `dataView`.
     *
     * @private
     * @param {Object} dataView The data view to clone.
     * @param {boolean} [isDeep] Specify a deep clone.
     * @returns {Object} Returns the cloned data view.
     */
    function cloneDataView(dataView, isDeep) {
      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
    }

    /**
     * Creates a clone of `regexp`.
     *
     * @private
     * @param {Object} regexp The regexp to clone.
     * @returns {Object} Returns the cloned regexp.
     */
    function cloneRegExp(regexp) {
      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
      result.lastIndex = regexp.lastIndex;
      return result;
    }

    /**
     * Creates a clone of the `symbol` object.
     *
     * @private
     * @param {Object} symbol The symbol object to clone.
     * @returns {Object} Returns the cloned symbol object.
     */
    function cloneSymbol(symbol) {
      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
    }

    /**
     * Creates a clone of `typedArray`.
     *
     * @private
     * @param {Object} typedArray The typed array to clone.
     * @param {boolean} [isDeep] Specify a deep clone.
     * @returns {Object} Returns the cloned typed array.
     */
    function cloneTypedArray(typedArray, isDeep) {
      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
    }

    /**
     * Compares values to sort them in ascending order.
     *
     * @private
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {number} Returns the sort order indicator for `value`.
     */
    function compareAscending(value, other) {
      if (value !== other) {
        var valIsDefined = value !== undefined,
            valIsNull = value === null,
            valIsReflexive = value === value,
            valIsSymbol = isSymbol(value);

        var othIsDefined = other !== undefined,
            othIsNull = other === null,
            othIsReflexive = other === other,
            othIsSymbol = isSymbol(other);

        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
            (valIsNull && othIsDefined && othIsReflexive) ||
            (!valIsDefined && othIsReflexive) ||
            !valIsReflexive) {
          return 1;
        }
        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
            (othIsNull && valIsDefined && valIsReflexive) ||
            (!othIsDefined && valIsReflexive) ||
            !othIsReflexive) {
          return -1;
        }
      }
      return 0;
    }

    /**
     * Used by `_.orderBy` to compare multiple properties of a value to another
     * and stable sort them.
     *
     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
     * specify an order of "desc" for descending or "asc" for ascending sort order
     * of corresponding values.
     *
     * @private
     * @param {Object} object The object to compare.
     * @param {Object} other The other object to compare.
     * @param {boolean[]|string[]} orders The order to sort by for each property.
     * @returns {number} Returns the sort order indicator for `object`.
     */
    function compareMultiple(object, other, orders) {
      var index = -1,
          objCriteria = object.criteria,
          othCriteria = other.criteria,
          length = objCriteria.length,
          ordersLength = orders.length;

      while (++index < length) {
        var result = compareAscending(objCriteria[index], othCriteria[index]);
        if (result) {
          if (index >= ordersLength) {
            return result;
          }
          var order = orders[index];
          return result * (order == 'desc' ? -1 : 1);
        }
      }
      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
      // that causes it, under certain circumstances, to provide the same value for
      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
      // for more details.
      //
      // This also ensures a stable sort in V8 and other engines.
      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
      return object.index - other.index;
    }

    /**
     * Creates an array that is the composition of partially applied arguments,
     * placeholders, and provided arguments into a single array of arguments.
     *
     * @private
     * @param {Array} args The provided arguments.
     * @param {Array} partials The arguments to prepend to those provided.
     * @param {Array} holders The `partials` placeholder indexes.
     * @params {boolean} [isCurried] Specify composing for a curried function.
     * @returns {Array} Returns the new array of composed arguments.
     */
    function composeArgs(args, partials, holders, isCurried) {
      var argsIndex = -1,
          argsLength = args.length,
          holdersLength = holders.length,
          leftIndex = -1,
          leftLength = partials.length,
          rangeLength = nativeMax(argsLength - holdersLength, 0),
          result = Array(leftLength + rangeLength),
          isUncurried = !isCurried;

      while (++leftIndex < leftLength) {
        result[leftIndex] = partials[leftIndex];
      }
      while (++argsIndex < holdersLength) {
        if (isUncurried || argsIndex < argsLength) {
          result[holders[argsIndex]] = args[argsIndex];
        }
      }
      while (rangeLength--) {
        result[leftIndex++] = args[argsIndex++];
      }
      return result;
    }

    /**
     * This function is like `composeArgs` except that the arguments composition
     * is tailored for `_.partialRight`.
     *
     * @private
     * @param {Array} args The provided arguments.
     * @param {Array} partials The arguments to append to those provided.
     * @param {Array} holders The `partials` placeholder indexes.
     * @params {boolean} [isCurried] Specify composing for a curried function.
     * @returns {Array} Returns the new array of composed arguments.
     */
    function composeArgsRight(args, partials, holders, isCurried) {
      var argsIndex = -1,
          argsLength = args.length,
          holdersIndex = -1,
          holdersLength = holders.length,
          rightIndex = -1,
          rightLength = partials.length,
          rangeLength = nativeMax(argsLength - holdersLength, 0),
          result = Array(rangeLength + rightLength),
          isUncurried = !isCurried;

      while (++argsIndex < rangeLength) {
        result[argsIndex] = args[argsIndex];
      }
      var offset = argsIndex;
      while (++rightIndex < rightLength) {
        result[offset + rightIndex] = partials[rightIndex];
      }
      while (++holdersIndex < holdersLength) {
        if (isUncurried || argsIndex < argsLength) {
          result[offset + holders[holdersIndex]] = args[argsIndex++];
        }
      }
      return result;
    }

    /**
     * Copies the values of `source` to `array`.
     *
     * @private
     * @param {Array} source The array to copy values from.
     * @param {Array} [array=[]] The array to copy values to.
     * @returns {Array} Returns `array`.
     */
    function copyArray(source, array) {
      var index = -1,
          length = source.length;

      array || (array = Array(length));
      while (++index < length) {
        array[index] = source[index];
      }
      return array;
    }

    /**
     * Copies properties of `source` to `object`.
     *
     * @private
     * @param {Object} source The object to copy properties from.
     * @param {Array} props The property identifiers to copy.
     * @param {Object} [object={}] The object to copy properties to.
     * @param {Function} [customizer] The function to customize copied values.
     * @returns {Object} Returns `object`.
     */
    function copyObject(source, props, object, customizer) {
      var isNew = !object;
      object || (object = {});

      var index = -1,
          length = props.length;

      while (++index < length) {
        var key = props[index];

        var newValue = customizer
          ? customizer(object[key], source[key], key, object, source)
          : undefined;

        if (newValue === undefined) {
          newValue = source[key];
        }
        if (isNew) {
          baseAssignValue(object, key, newValue);
        } else {
          assignValue(object, key, newValue);
        }
      }
      return object;
    }

    /**
     * Copies own symbols of `source` to `object`.
     *
     * @private
     * @param {Object} source The object to copy symbols from.
     * @param {Object} [object={}] The object to copy symbols to.
     * @returns {Object} Returns `object`.
     */
    function copySymbols(source, object) {
      return copyObject(source, getSymbols(source), object);
    }

    /**
     * Copies own and inherited symbols of `source` to `object`.
     *
     * @private
     * @param {Object} source The object to copy symbols from.
     * @param {Object} [object={}] The object to copy symbols to.
     * @returns {Object} Returns `object`.
     */
    function copySymbolsIn(source, object) {
      return copyObject(source, getSymbolsIn(source), object);
    }

    /**
     * Creates a function like `_.groupBy`.
     *
     * @private
     * @param {Function} setter The function to set accumulator values.
     * @param {Function} [initializer] The accumulator object initializer.
     * @returns {Function} Returns the new aggregator function.
     */
    function createAggregator(setter, initializer) {
      return function(collection, iteratee) {
        var func = isArray(collection) ? arrayAggregator : baseAggregator,
            accumulator = initializer ? initializer() : {};

        return func(collection, setter, getIteratee(iteratee, 2), accumulator);
      };
    }

    /**
     * Creates a function like `_.assign`.
     *
     * @private
     * @param {Function} assigner The function to assign values.
     * @returns {Function} Returns the new assigner function.
     */
    function createAssigner(assigner) {
      return baseRest(function(object, sources) {
        var index = -1,
            length = sources.length,
            customizer = length > 1 ? sources[length - 1] : undefined,
            guard = length > 2 ? sources[2] : undefined;

        customizer = (assigner.length > 3 && typeof customizer == 'function')
          ? (length--, customizer)
          : undefined;

        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
          customizer = length < 3 ? undefined : customizer;
          length = 1;
        }
        object = Object(object);
        while (++index < length) {
          var source = sources[index];
          if (source) {
            assigner(object, source, index, customizer);
          }
        }
        return object;
      });
    }

    /**
     * Creates a `baseEach` or `baseEachRight` function.
     *
     * @private
     * @param {Function} eachFunc The function to iterate over a collection.
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Function} Returns the new base function.
     */
    function createBaseEach(eachFunc, fromRight) {
      return function(collection, iteratee) {
        if (collection == null) {
          return collection;
        }
        if (!isArrayLike(collection)) {
          return eachFunc(collection, iteratee);
        }
        var length = collection.length,
            index = fromRight ? length : -1,
            iterable = Object(collection);

        while ((fromRight ? index-- : ++index < length)) {
          if (iteratee(iterable[index], index, iterable) === false) {
            break;
          }
        }
        return collection;
      };
    }

    /**
     * Creates a base function for methods like `_.forIn` and `_.forOwn`.
     *
     * @private
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Function} Returns the new base function.
     */
    function createBaseFor(fromRight) {
      return function(object, iteratee, keysFunc) {
        var index = -1,
            iterable = Object(object),
            props = keysFunc(object),
            length = props.length;

        while (length--) {
          var key = props[fromRight ? length : ++index];
          if (iteratee(iterable[key], key, iterable) === false) {
            break;
          }
        }
        return object;
      };
    }

    /**
     * Creates a function that wraps `func` to invoke it with the optional `this`
     * binding of `thisArg`.
     *
     * @private
     * @param {Function} func The function to wrap.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @param {*} [thisArg] The `this` binding of `func`.
     * @returns {Function} Returns the new wrapped function.
     */
    function createBind(func, bitmask, thisArg) {
      var isBind = bitmask & WRAP_BIND_FLAG,
          Ctor = createCtor(func);

      function wrapper() {
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
        return fn.apply(isBind ? thisArg : this, arguments);
      }
      return wrapper;
    }

    /**
     * Creates a function like `_.lowerFirst`.
     *
     * @private
     * @param {string} methodName The name of the `String` case method to use.
     * @returns {Function} Returns the new case function.
     */
    function createCaseFirst(methodName) {
      return function(string) {
        string = toString(string);

        var strSymbols = hasUnicode(string)
          ? stringToArray(string)
          : undefined;

        var chr = strSymbols
          ? strSymbols[0]
          : string.charAt(0);

        var trailing = strSymbols
          ? castSlice(strSymbols, 1).join('')
          : string.slice(1);

        return chr[methodName]() + trailing;
      };
    }

    /**
     * Creates a function like `_.camelCase`.
     *
     * @private
     * @param {Function} callback The function to combine each word.
     * @returns {Function} Returns the new compounder function.
     */
    function createCompounder(callback) {
      return function(string) {
        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
      };
    }

    /**
     * Creates a function that produces an instance of `Ctor` regardless of
     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
     *
     * @private
     * @param {Function} Ctor The constructor to wrap.
     * @returns {Function} Returns the new wrapped function.
     */
    function createCtor(Ctor) {
      return function() {
        // Use a `switch` statement to work with class constructors. See
        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
        // for more details.
        var args = arguments;
        switch (args.length) {
          case 0: return new Ctor;
          case 1: return new Ctor(args[0]);
          case 2: return new Ctor(args[0], args[1]);
          case 3: return new Ctor(args[0], args[1], args[2]);
          case 4: return new Ctor(args[0], args[1], args[2], args[3]);
          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
        }
        var thisBinding = baseCreate(Ctor.prototype),
            result = Ctor.apply(thisBinding, args);

        // Mimic the constructor's `return` behavior.
        // See https://es5.github.io/#x13.2.2 for more details.
        return isObject(result) ? result : thisBinding;
      };
    }

    /**
     * Creates a function that wraps `func` to enable currying.
     *
     * @private
     * @param {Function} func The function to wrap.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @param {number} arity The arity of `func`.
     * @returns {Function} Returns the new wrapped function.
     */
    function createCurry(func, bitmask, arity) {
      var Ctor = createCtor(func);

      function wrapper() {
        var length = arguments.length,
            args = Array(length),
            index = length,
            placeholder = getHolder(wrapper);

        while (index--) {
          args[index] = arguments[index];
        }
        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
          ? []
          : replaceHolders(args, placeholder);

        length -= holders.length;
        if (length < arity) {
          return createRecurry(
            func, bitmask, createHybrid, wrapper.placeholder, undefined,
            args, holders, undefined, undefined, arity - length);
        }
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
        return apply(fn, this, args);
      }
      return wrapper;
    }

    /**
     * Creates a `_.find` or `_.findLast` function.
     *
     * @private
     * @param {Function} findIndexFunc The function to find the collection index.
     * @returns {Function} Returns the new find function.
     */
    function createFind(findIndexFunc) {
      return function(collection, predicate, fromIndex) {
        var iterable = Object(collection);
        if (!isArrayLike(collection)) {
          var iteratee = getIteratee(predicate, 3);
          collection = keys(collection);
          predicate = function(key) { return iteratee(iterable[key], key, iterable); };
        }
        var index = findIndexFunc(collection, predicate, fromIndex);
        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
      };
    }

    /**
     * Creates a `_.flow` or `_.flowRight` function.
     *
     * @private
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Function} Returns the new flow function.
     */
    function createFlow(fromRight) {
      return flatRest(function(funcs) {
        var length = funcs.length,
            index = length,
            prereq = LodashWrapper.prototype.thru;

        if (fromRight) {
          funcs.reverse();
        }
        while (index--) {
          var func = funcs[index];
          if (typeof func != 'function') {
            throw new TypeError(FUNC_ERROR_TEXT);
          }
          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
            var wrapper = new LodashWrapper([], true);
          }
        }
        index = wrapper ? index : length;
        while (++index < length) {
          func = funcs[index];

          var funcName = getFuncName(func),
              data = funcName == 'wrapper' ? getData(func) : undefined;

          if (data && isLaziable(data[0]) &&
                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
                !data[4].length && data[9] == 1
              ) {
            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
          } else {
            wrapper = (func.length == 1 && isLaziable(func))
              ? wrapper[funcName]()
              : wrapper.thru(func);
          }
        }
        return function() {
          var args = arguments,
              value = args[0];

          if (wrapper && args.length == 1 && isArray(value)) {
            return wrapper.plant(value).value();
          }
          var index = 0,
              result = length ? funcs[index].apply(this, args) : value;

          while (++index < length) {
            result = funcs[index].call(this, result);
          }
          return result;
        };
      });
    }

    /**
     * Creates a function that wraps `func` to invoke it with optional `this`
     * binding of `thisArg`, partial application, and currying.
     *
     * @private
     * @param {Function|string} func The function or method name to wrap.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @param {*} [thisArg] The `this` binding of `func`.
     * @param {Array} [partials] The arguments to prepend to those provided to
     *  the new function.
     * @param {Array} [holders] The `partials` placeholder indexes.
     * @param {Array} [partialsRight] The arguments to append to those provided
     *  to the new function.
     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
     * @param {Array} [argPos] The argument positions of the new function.
     * @param {number} [ary] The arity cap of `func`.
     * @param {number} [arity] The arity of `func`.
     * @returns {Function} Returns the new wrapped function.
     */
    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
      var isAry = bitmask & WRAP_ARY_FLAG,
          isBind = bitmask & WRAP_BIND_FLAG,
          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
          isFlip = bitmask & WRAP_FLIP_FLAG,
          Ctor = isBindKey ? undefined : createCtor(func);

      function wrapper() {
        var length = arguments.length,
            args = Array(length),
            index = length;

        while (index--) {
          args[index] = arguments[index];
        }
        if (isCurried) {
          var placeholder = getHolder(wrapper),
              holdersCount = countHolders(args, placeholder);
        }
        if (partials) {
          args = composeArgs(args, partials, holders, isCurried);
        }
        if (partialsRight) {
          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
        }
        length -= holdersCount;
        if (isCurried && length < arity) {
          var newHolders = replaceHolders(args, placeholder);
          return createRecurry(
            func, bitmask, createHybrid, wrapper.placeholder, thisArg,
            args, newHolders, argPos, ary, arity - length
          );
        }
        var thisBinding = isBind ? thisArg : this,
            fn = isBindKey ? thisBinding[func] : func;

        length = args.length;
        if (argPos) {
          args = reorder(args, argPos);
        } else if (isFlip && length > 1) {
          args.reverse();
        }
        if (isAry && ary < length) {
          args.length = ary;
        }
        if (this && this !== root && this instanceof wrapper) {
          fn = Ctor || createCtor(fn);
        }
        return fn.apply(thisBinding, args);
      }
      return wrapper;
    }

    /**
     * Creates a function like `_.invertBy`.
     *
     * @private
     * @param {Function} setter The function to set accumulator values.
     * @param {Function} toIteratee The function to resolve iteratees.
     * @returns {Function} Returns the new inverter function.
     */
    function createInverter(setter, toIteratee) {
      return function(object, iteratee) {
        return baseInverter(object, setter, toIteratee(iteratee), {});
      };
    }

    /**
     * Creates a function that performs a mathematical operation on two values.
     *
     * @private
     * @param {Function} operator The function to perform the operation.
     * @param {number} [defaultValue] The value used for `undefined` arguments.
     * @returns {Function} Returns the new mathematical operation function.
     */
    function createMathOperation(operator, defaultValue) {
      return function(value, other) {
        var result;
        if (value === undefined && other === undefined) {
          return defaultValue;
        }
        if (value !== undefined) {
          result = value;
        }
        if (other !== undefined) {
          if (result === undefined) {
            return other;
          }
          if (typeof value == 'string' || typeof other == 'string') {
            value = baseToString(value);
            other = baseToString(other);
          } else {
            value = baseToNumber(value);
            other = baseToNumber(other);
          }
          result = operator(value, other);
        }
        return result;
      };
    }

    /**
     * Creates a function like `_.over`.
     *
     * @private
     * @param {Function} arrayFunc The function to iterate over iteratees.
     * @returns {Function} Returns the new over function.
     */
    function createOver(arrayFunc) {
      return flatRest(function(iteratees) {
        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
        return baseRest(function(args) {
          var thisArg = this;
          return arrayFunc(iteratees, function(iteratee) {
            return apply(iteratee, thisArg, args);
          });
        });
      });
    }

    /**
     * Creates the padding for `string` based on `length`. The `chars` string
     * is truncated if the number of characters exceeds `length`.
     *
     * @private
     * @param {number} length The padding length.
     * @param {string} [chars=' '] The string used as padding.
     * @returns {string} Returns the padding for `string`.
     */
    function createPadding(length, chars) {
      chars = chars === undefined ? ' ' : baseToString(chars);

      var charsLength = chars.length;
      if (charsLength < 2) {
        return charsLength ? baseRepeat(chars, length) : chars;
      }
      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
      return hasUnicode(chars)
        ? castSlice(stringToArray(result), 0, length).join('')
        : result.slice(0, length);
    }

    /**
     * Creates a function that wraps `func` to invoke it with the `this` binding
     * of `thisArg` and `partials` prepended to the arguments it receives.
     *
     * @private
     * @param {Function} func The function to wrap.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @param {*} thisArg The `this` binding of `func`.
     * @param {Array} partials The arguments to prepend to those provided to
     *  the new function.
     * @returns {Function} Returns the new wrapped function.
     */
    function createPartial(func, bitmask, thisArg, partials) {
      var isBind = bitmask & WRAP_BIND_FLAG,
          Ctor = createCtor(func);

      function wrapper() {
        var argsIndex = -1,
            argsLength = arguments.length,
            leftIndex = -1,
            leftLength = partials.length,
            args = Array(leftLength + argsLength),
            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;

        while (++leftIndex < leftLength) {
          args[leftIndex] = partials[leftIndex];
        }
        while (argsLength--) {
          args[leftIndex++] = arguments[++argsIndex];
        }
        return apply(fn, isBind ? thisArg : this, args);
      }
      return wrapper;
    }

    /**
     * Creates a `_.range` or `_.rangeRight` function.
     *
     * @private
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Function} Returns the new range function.
     */
    function createRange(fromRight) {
      return function(start, end, step) {
        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
          end = step = undefined;
        }
        // Ensure the sign of `-0` is preserved.
        start = toFinite(start);
        if (end === undefined) {
          end = start;
          start = 0;
        } else {
          end = toFinite(end);
        }
        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
        return baseRange(start, end, step, fromRight);
      };
    }

    /**
     * Creates a function that performs a relational operation on two values.
     *
     * @private
     * @param {Function} operator The function to perform the operation.
     * @returns {Function} Returns the new relational operation function.
     */
    function createRelationalOperation(operator) {
      return function(value, other) {
        if (!(typeof value == 'string' && typeof other == 'string')) {
          value = toNumber(value);
          other = toNumber(other);
        }
        return operator(value, other);
      };
    }

    /**
     * Creates a function that wraps `func` to continue currying.
     *
     * @private
     * @param {Function} func The function to wrap.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @param {Function} wrapFunc The function to create the `func` wrapper.
     * @param {*} placeholder The placeholder value.
     * @param {*} [thisArg] The `this` binding of `func`.
     * @param {Array} [partials] The arguments to prepend to those provided to
     *  the new function.
     * @param {Array} [holders] The `partials` placeholder indexes.
     * @param {Array} [argPos] The argument positions of the new function.
     * @param {number} [ary] The arity cap of `func`.
     * @param {number} [arity] The arity of `func`.
     * @returns {Function} Returns the new wrapped function.
     */
    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
      var isCurry = bitmask & WRAP_CURRY_FLAG,
          newHolders = isCurry ? holders : undefined,
          newHoldersRight = isCurry ? undefined : holders,
          newPartials = isCurry ? partials : undefined,
          newPartialsRight = isCurry ? undefined : partials;

      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);

      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
      }
      var newData = [
        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
        newHoldersRight, argPos, ary, arity
      ];

      var result = wrapFunc.apply(undefined, newData);
      if (isLaziable(func)) {
        setData(result, newData);
      }
      result.placeholder = placeholder;
      return setWrapToString(result, func, bitmask);
    }

    /**
     * Creates a function like `_.round`.
     *
     * @private
     * @param {string} methodName The name of the `Math` method to use when rounding.
     * @returns {Function} Returns the new round function.
     */
    function createRound(methodName) {
      var func = Math[methodName];
      return function(number, precision) {
        number = toNumber(number);
        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
        if (precision && nativeIsFinite(number)) {
          // Shift with exponential notation to avoid floating-point issues.
          // See [MDN](https://mdn.io/round#Examples) for more details.
          var pair = (toString(number) + 'e').split('e'),
              value = func(pair[0] + 'e' + (+pair[1] + precision));

          pair = (toString(value) + 'e').split('e');
          return +(pair[0] + 'e' + (+pair[1] - precision));
        }
        return func(number);
      };
    }

    /**
     * Creates a set object of `values`.
     *
     * @private
     * @param {Array} values The values to add to the set.
     * @returns {Object} Returns the new set.
     */
    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
      return new Set(values);
    };

    /**
     * Creates a `_.toPairs` or `_.toPairsIn` function.
     *
     * @private
     * @param {Function} keysFunc The function to get the keys of a given object.
     * @returns {Function} Returns the new pairs function.
     */
    function createToPairs(keysFunc) {
      return function(object) {
        var tag = getTag(object);
        if (tag == mapTag) {
          return mapToArray(object);
        }
        if (tag == setTag) {
          return setToPairs(object);
        }
        return baseToPairs(object, keysFunc(object));
      };
    }

    /**
     * Creates a function that either curries or invokes `func` with optional
     * `this` binding and partially applied arguments.
     *
     * @private
     * @param {Function|string} func The function or method name to wrap.
     * @param {number} bitmask The bitmask flags.
     *    1 - `_.bind`
     *    2 - `_.bindKey`
     *    4 - `_.curry` or `_.curryRight` of a bound function
     *    8 - `_.curry`
     *   16 - `_.curryRight`
     *   32 - `_.partial`
     *   64 - `_.partialRight`
     *  128 - `_.rearg`
     *  256 - `_.ary`
     *  512 - `_.flip`
     * @param {*} [thisArg] The `this` binding of `func`.
     * @param {Array} [partials] The arguments to be partially applied.
     * @param {Array} [holders] The `partials` placeholder indexes.
     * @param {Array} [argPos] The argument positions of the new function.
     * @param {number} [ary] The arity cap of `func`.
     * @param {number} [arity] The arity of `func`.
     * @returns {Function} Returns the new wrapped function.
     */
    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
      if (!isBindKey && typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      var length = partials ? partials.length : 0;
      if (!length) {
        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
        partials = holders = undefined;
      }
      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
      arity = arity === undefined ? arity : toInteger(arity);
      length -= holders ? holders.length : 0;

      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
        var partialsRight = partials,
            holdersRight = holders;

        partials = holders = undefined;
      }
      var data = isBindKey ? undefined : getData(func);

      var newData = [
        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
        argPos, ary, arity
      ];

      if (data) {
        mergeData(newData, data);
      }
      func = newData[0];
      bitmask = newData[1];
      thisArg = newData[2];
      partials = newData[3];
      holders = newData[4];
      arity = newData[9] = newData[9] === undefined
        ? (isBindKey ? 0 : func.length)
        : nativeMax(newData[9] - length, 0);

      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
      }
      if (!bitmask || bitmask == WRAP_BIND_FLAG) {
        var result = createBind(func, bitmask, thisArg);
      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
        result = createCurry(func, bitmask, arity);
      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
        result = createPartial(func, bitmask, thisArg, partials);
      } else {
        result = createHybrid.apply(undefined, newData);
      }
      var setter = data ? baseSetData : setData;
      return setWrapToString(setter(result, newData), func, bitmask);
    }

    /**
     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
     * of source objects to the destination object for all destination properties
     * that resolve to `undefined`.
     *
     * @private
     * @param {*} objValue The destination value.
     * @param {*} srcValue The source value.
     * @param {string} key The key of the property to assign.
     * @param {Object} object The parent object of `objValue`.
     * @returns {*} Returns the value to assign.
     */
    function customDefaultsAssignIn(objValue, srcValue, key, object) {
      if (objValue === undefined ||
          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
        return srcValue;
      }
      return objValue;
    }

    /**
     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
     * objects into destination objects that are passed thru.
     *
     * @private
     * @param {*} objValue The destination value.
     * @param {*} srcValue The source value.
     * @param {string} key The key of the property to merge.
     * @param {Object} object The parent object of `objValue`.
     * @param {Object} source The parent object of `srcValue`.
     * @param {Object} [stack] Tracks traversed source values and their merged
     *  counterparts.
     * @returns {*} Returns the value to assign.
     */
    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
      if (isObject(objValue) && isObject(srcValue)) {
        // Recursively merge objects and arrays (susceptible to call stack limits).
        stack.set(srcValue, objValue);
        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
        stack['delete'](srcValue);
      }
      return objValue;
    }

    /**
     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
     * objects.
     *
     * @private
     * @param {*} value The value to inspect.
     * @param {string} key The key of the property to inspect.
     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
     */
    function customOmitClone(value) {
      return isPlainObject(value) ? undefined : value;
    }

    /**
     * A specialized version of `baseIsEqualDeep` for arrays with support for
     * partial deep comparisons.
     *
     * @private
     * @param {Array} array The array to compare.
     * @param {Array} other The other array to compare.
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
     * @param {Function} customizer The function to customize comparisons.
     * @param {Function} equalFunc The function to determine equivalents of values.
     * @param {Object} stack Tracks traversed `array` and `other` objects.
     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
     */
    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
          arrLength = array.length,
          othLength = other.length;

      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
        return false;
      }
      // Check that cyclic values are equal.
      var arrStacked = stack.get(array);
      var othStacked = stack.get(other);
      if (arrStacked && othStacked) {
        return arrStacked == other && othStacked == array;
      }
      var index = -1,
          result = true,
          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;

      stack.set(array, other);
      stack.set(other, array);

      // Ignore non-index properties.
      while (++index < arrLength) {
        var arrValue = array[index],
            othValue = other[index];

        if (customizer) {
          var compared = isPartial
            ? customizer(othValue, arrValue, index, other, array, stack)
            : customizer(arrValue, othValue, index, array, other, stack);
        }
        if (compared !== undefined) {
          if (compared) {
            continue;
          }
          result = false;
          break;
        }
        // Recursively compare arrays (susceptible to call stack limits).
        if (seen) {
          if (!arraySome(other, function(othValue, othIndex) {
                if (!cacheHas(seen, othIndex) &&
                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
                  return seen.push(othIndex);
                }
              })) {
            result = false;
            break;
          }
        } else if (!(
              arrValue === othValue ||
                equalFunc(arrValue, othValue, bitmask, customizer, stack)
            )) {
          result = false;
          break;
        }
      }
      stack['delete'](array);
      stack['delete'](other);
      return result;
    }

    /**
     * A specialized version of `baseIsEqualDeep` for comparing objects of
     * the same `toStringTag`.
     *
     * **Note:** This function only supports comparing values with tags of
     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
     *
     * @private
     * @param {Object} object The object to compare.
     * @param {Object} other The other object to compare.
     * @param {string} tag The `toStringTag` of the objects to compare.
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
     * @param {Function} customizer The function to customize comparisons.
     * @param {Function} equalFunc The function to determine equivalents of values.
     * @param {Object} stack Tracks traversed `object` and `other` objects.
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
     */
    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
      switch (tag) {
        case dataViewTag:
          if ((object.byteLength != other.byteLength) ||
              (object.byteOffset != other.byteOffset)) {
            return false;
          }
          object = object.buffer;
          other = other.buffer;

        case arrayBufferTag:
          if ((object.byteLength != other.byteLength) ||
              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
            return false;
          }
          return true;

        case boolTag:
        case dateTag:
        case numberTag:
          // Coerce booleans to `1` or `0` and dates to milliseconds.
          // Invalid dates are coerced to `NaN`.
          return eq(+object, +other);

        case errorTag:
          return object.name == other.name && object.message == other.message;

        case regexpTag:
        case stringTag:
          // Coerce regexes to strings and treat strings, primitives and objects,
          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
          // for more details.
          return object == (other + '');

        case mapTag:
          var convert = mapToArray;

        case setTag:
          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
          convert || (convert = setToArray);

          if (object.size != other.size && !isPartial) {
            return false;
          }
          // Assume cyclic values are equal.
          var stacked = stack.get(object);
          if (stacked) {
            return stacked == other;
          }
          bitmask |= COMPARE_UNORDERED_FLAG;

          // Recursively compare objects (susceptible to call stack limits).
          stack.set(object, other);
          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
          stack['delete'](object);
          return result;

        case symbolTag:
          if (symbolValueOf) {
            return symbolValueOf.call(object) == symbolValueOf.call(other);
          }
      }
      return false;
    }

    /**
     * A specialized version of `baseIsEqualDeep` for objects with support for
     * partial deep comparisons.
     *
     * @private
     * @param {Object} object The object to compare.
     * @param {Object} other The other object to compare.
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
     * @param {Function} customizer The function to customize comparisons.
     * @param {Function} equalFunc The function to determine equivalents of values.
     * @param {Object} stack Tracks traversed `object` and `other` objects.
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
     */
    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
          objProps = getAllKeys(object),
          objLength = objProps.length,
          othProps = getAllKeys(other),
          othLength = othProps.length;

      if (objLength != othLength && !isPartial) {
        return false;
      }
      var index = objLength;
      while (index--) {
        var key = objProps[index];
        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
          return false;
        }
      }
      // Check that cyclic values are equal.
      var objStacked = stack.get(object);
      var othStacked = stack.get(other);
      if (objStacked && othStacked) {
        return objStacked == other && othStacked == object;
      }
      var result = true;
      stack.set(object, other);
      stack.set(other, object);

      var skipCtor = isPartial;
      while (++index < objLength) {
        key = objProps[index];
        var objValue = object[key],
            othValue = other[key];

        if (customizer) {
          var compared = isPartial
            ? customizer(othValue, objValue, key, other, object, stack)
            : customizer(objValue, othValue, key, object, other, stack);
        }
        // Recursively compare objects (susceptible to call stack limits).
        if (!(compared === undefined
              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
              : compared
            )) {
          result = false;
          break;
        }
        skipCtor || (skipCtor = key == 'constructor');
      }
      if (result && !skipCtor) {
        var objCtor = object.constructor,
            othCtor = other.constructor;

        // Non `Object` object instances with different constructors are not equal.
        if (objCtor != othCtor &&
            ('constructor' in object && 'constructor' in other) &&
            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
              typeof othCtor == 'function' && othCtor instanceof othCtor)) {
          result = false;
        }
      }
      stack['delete'](object);
      stack['delete'](other);
      return result;
    }

    /**
     * A specialized version of `baseRest` which flattens the rest array.
     *
     * @private
     * @param {Function} func The function to apply a rest parameter to.
     * @returns {Function} Returns the new function.
     */
    function flatRest(func) {
      return setToString(overRest(func, undefined, flatten), func + '');
    }

    /**
     * Creates an array of own enumerable property names and symbols of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names and symbols.
     */
    function getAllKeys(object) {
      return baseGetAllKeys(object, keys, getSymbols);
    }

    /**
     * Creates an array of own and inherited enumerable property names and
     * symbols of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names and symbols.
     */
    function getAllKeysIn(object) {
      return baseGetAllKeys(object, keysIn, getSymbolsIn);
    }

    /**
     * Gets metadata for `func`.
     *
     * @private
     * @param {Function} func The function to query.
     * @returns {*} Returns the metadata for `func`.
     */
    var getData = !metaMap ? noop : function(func) {
      return metaMap.get(func);
    };

    /**
     * Gets the name of `func`.
     *
     * @private
     * @param {Function} func The function to query.
     * @returns {string} Returns the function name.
     */
    function getFuncName(func) {
      var result = (func.name + ''),
          array = realNames[result],
          length = hasOwnProperty.call(realNames, result) ? array.length : 0;

      while (length--) {
        var data = array[length],
            otherFunc = data.func;
        if (otherFunc == null || otherFunc == func) {
          return data.name;
        }
      }
      return result;
    }

    /**
     * Gets the argument placeholder value for `func`.
     *
     * @private
     * @param {Function} func The function to inspect.
     * @returns {*} Returns the placeholder value.
     */
    function getHolder(func) {
      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
      return object.placeholder;
    }

    /**
     * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
     * this function returns the custom method, otherwise it returns `baseIteratee`.
     * If arguments are provided, the chosen function is invoked with them and
     * its result is returned.
     *
     * @private
     * @param {*} [value] The value to convert to an iteratee.
     * @param {number} [arity] The arity of the created iteratee.
     * @returns {Function} Returns the chosen function or its result.
     */
    function getIteratee() {
      var result = lodash.iteratee || iteratee;
      result = result === iteratee ? baseIteratee : result;
      return arguments.length ? result(arguments[0], arguments[1]) : result;
    }

    /**
     * Gets the data for `map`.
     *
     * @private
     * @param {Object} map The map to query.
     * @param {string} key The reference key.
     * @returns {*} Returns the map data.
     */
    function getMapData(map, key) {
      var data = map.__data__;
      return isKeyable(key)
        ? data[typeof key == 'string' ? 'string' : 'hash']
        : data.map;
    }

    /**
     * Gets the property names, values, and compare flags of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the match data of `object`.
     */
    function getMatchData(object) {
      var result = keys(object),
          length = result.length;

      while (length--) {
        var key = result[length],
            value = object[key];

        result[length] = [key, value, isStrictComparable(value)];
      }
      return result;
    }

    /**
     * Gets the native function at `key` of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {string} key The key of the method to get.
     * @returns {*} Returns the function if it's native, else `undefined`.
     */
    function getNative(object, key) {
      var value = getValue(object, key);
      return baseIsNative(value) ? value : undefined;
    }

    /**
     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
     *
     * @private
     * @param {*} value The value to query.
     * @returns {string} Returns the raw `toStringTag`.
     */
    function getRawTag(value) {
      var isOwn = hasOwnProperty.call(value, symToStringTag),
          tag = value[symToStringTag];

      try {
        value[symToStringTag] = undefined;
        var unmasked = true;
      } catch (e) {}

      var result = nativeObjectToString.call(value);
      if (unmasked) {
        if (isOwn) {
          value[symToStringTag] = tag;
        } else {
          delete value[symToStringTag];
        }
      }
      return result;
    }

    /**
     * Creates an array of the own enumerable symbols of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of symbols.
     */
    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
      if (object == null) {
        return [];
      }
      object = Object(object);
      return arrayFilter(nativeGetSymbols(object), function(symbol) {
        return propertyIsEnumerable.call(object, symbol);
      });
    };

    /**
     * Creates an array of the own and inherited enumerable symbols of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of symbols.
     */
    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
      var result = [];
      while (object) {
        arrayPush(result, getSymbols(object));
        object = getPrototype(object);
      }
      return result;
    };

    /**
     * Gets the `toStringTag` of `value`.
     *
     * @private
     * @param {*} value The value to query.
     * @returns {string} Returns the `toStringTag`.
     */
    var getTag = baseGetTag;

    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
        (Map && getTag(new Map) != mapTag) ||
        (Promise && getTag(Promise.resolve()) != promiseTag) ||
        (Set && getTag(new Set) != setTag) ||
        (WeakMap && getTag(new WeakMap) != weakMapTag)) {
      getTag = function(value) {
        var result = baseGetTag(value),
            Ctor = result == objectTag ? value.constructor : undefined,
            ctorString = Ctor ? toSource(Ctor) : '';

        if (ctorString) {
          switch (ctorString) {
            case dataViewCtorString: return dataViewTag;
            case mapCtorString: return mapTag;
            case promiseCtorString: return promiseTag;
            case setCtorString: return setTag;
            case weakMapCtorString: return weakMapTag;
          }
        }
        return result;
      };
    }

    /**
     * Gets the view, applying any `transforms` to the `start` and `end` positions.
     *
     * @private
     * @param {number} start The start of the view.
     * @param {number} end The end of the view.
     * @param {Array} transforms The transformations to apply to the view.
     * @returns {Object} Returns an object containing the `start` and `end`
     *  positions of the view.
     */
    function getView(start, end, transforms) {
      var index = -1,
          length = transforms.length;

      while (++index < length) {
        var data = transforms[index],
            size = data.size;

        switch (data.type) {
          case 'drop':      start += size; break;
          case 'dropRight': end -= size; break;
          case 'take':      end = nativeMin(end, start + size); break;
          case 'takeRight': start = nativeMax(start, end - size); break;
        }
      }
      return { 'start': start, 'end': end };
    }

    /**
     * Extracts wrapper details from the `source` body comment.
     *
     * @private
     * @param {string} source The source to inspect.
     * @returns {Array} Returns the wrapper details.
     */
    function getWrapDetails(source) {
      var match = source.match(reWrapDetails);
      return match ? match[1].split(reSplitDetails) : [];
    }

    /**
     * Checks if `path` exists on `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {Array|string} path The path to check.
     * @param {Function} hasFunc The function to check properties.
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
     */
    function hasPath(object, path, hasFunc) {
      path = castPath(path, object);

      var index = -1,
          length = path.length,
          result = false;

      while (++index < length) {
        var key = toKey(path[index]);
        if (!(result = object != null && hasFunc(object, key))) {
          break;
        }
        object = object[key];
      }
      if (result || ++index != length) {
        return result;
      }
      length = object == null ? 0 : object.length;
      return !!length && isLength(length) && isIndex(key, length) &&
        (isArray(object) || isArguments(object));
    }

    /**
     * Initializes an array clone.
     *
     * @private
     * @param {Array} array The array to clone.
     * @returns {Array} Returns the initialized clone.
     */
    function initCloneArray(array) {
      var length = array.length,
          result = new array.constructor(length);

      // Add properties assigned by `RegExp#exec`.
      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
        result.index = array.index;
        result.input = array.input;
      }
      return result;
    }

    /**
     * Initializes an object clone.
     *
     * @private
     * @param {Object} object The object to clone.
     * @returns {Object} Returns the initialized clone.
     */
    function initCloneObject(object) {
      return (typeof object.constructor == 'function' && !isPrototype(object))
        ? baseCreate(getPrototype(object))
        : {};
    }

    /**
     * Initializes an object clone based on its `toStringTag`.
     *
     * **Note:** This function only supports cloning values with tags of
     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
     *
     * @private
     * @param {Object} object The object to clone.
     * @param {string} tag The `toStringTag` of the object to clone.
     * @param {boolean} [isDeep] Specify a deep clone.
     * @returns {Object} Returns the initialized clone.
     */
    function initCloneByTag(object, tag, isDeep) {
      var Ctor = object.constructor;
      switch (tag) {
        case arrayBufferTag:
          return cloneArrayBuffer(object);

        case boolTag:
        case dateTag:
          return new Ctor(+object);

        case dataViewTag:
          return cloneDataView(object, isDeep);

        case float32Tag: case float64Tag:
        case int8Tag: case int16Tag: case int32Tag:
        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
          return cloneTypedArray(object, isDeep);

        case mapTag:
          return new Ctor;

        case numberTag:
        case stringTag:
          return new Ctor(object);

        case regexpTag:
          return cloneRegExp(object);

        case setTag:
          return new Ctor;

        case symbolTag:
          return cloneSymbol(object);
      }
    }

    /**
     * Inserts wrapper `details` in a comment at the top of the `source` body.
     *
     * @private
     * @param {string} source The source to modify.
     * @returns {Array} details The details to insert.
     * @returns {string} Returns the modified source.
     */
    function insertWrapDetails(source, details) {
      var length = details.length;
      if (!length) {
        return source;
      }
      var lastIndex = length - 1;
      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
      details = details.join(length > 2 ? ', ' : ' ');
      return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
    }

    /**
     * Checks if `value` is a flattenable `arguments` object or array.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
     */
    function isFlattenable(value) {
      return isArray(value) || isArguments(value) ||
        !!(spreadableSymbol && value && value[spreadableSymbol]);
    }

    /**
     * Checks if `value` is a valid array-like index.
     *
     * @private
     * @param {*} value The value to check.
     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
     */
    function isIndex(value, length) {
      var type = typeof value;
      length = length == null ? MAX_SAFE_INTEGER : length;

      return !!length &&
        (type == 'number' ||
          (type != 'symbol' && reIsUint.test(value))) &&
            (value > -1 && value % 1 == 0 && value < length);
    }

    /**
     * Checks if the given arguments are from an iteratee call.
     *
     * @private
     * @param {*} value The potential iteratee value argument.
     * @param {*} index The potential iteratee index or key argument.
     * @param {*} object The potential iteratee object argument.
     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
     *  else `false`.
     */
    function isIterateeCall(value, index, object) {
      if (!isObject(object)) {
        return false;
      }
      var type = typeof index;
      if (type == 'number'
            ? (isArrayLike(object) && isIndex(index, object.length))
            : (type == 'string' && index in object)
          ) {
        return eq(object[index], value);
      }
      return false;
    }

    /**
     * Checks if `value` is a property name and not a property path.
     *
     * @private
     * @param {*} value The value to check.
     * @param {Object} [object] The object to query keys on.
     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
     */
    function isKey(value, object) {
      if (isArray(value)) {
        return false;
      }
      var type = typeof value;
      if (type == 'number' || type == 'symbol' || type == 'boolean' ||
          value == null || isSymbol(value)) {
        return true;
      }
      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
        (object != null && value in Object(object));
    }

    /**
     * Checks if `value` is suitable for use as unique object key.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
     */
    function isKeyable(value) {
      var type = typeof value;
      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
        ? (value !== '__proto__')
        : (value === null);
    }

    /**
     * Checks if `func` has a lazy counterpart.
     *
     * @private
     * @param {Function} func The function to check.
     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
     *  else `false`.
     */
    function isLaziable(func) {
      var funcName = getFuncName(func),
          other = lodash[funcName];

      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
        return false;
      }
      if (func === other) {
        return true;
      }
      var data = getData(other);
      return !!data && func === data[0];
    }

    /**
     * Checks if `func` has its source masked.
     *
     * @private
     * @param {Function} func The function to check.
     * @returns {boolean} Returns `true` if `func` is masked, else `false`.
     */
    function isMasked(func) {
      return !!maskSrcKey && (maskSrcKey in func);
    }

    /**
     * Checks if `func` is capable of being masked.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
     */
    var isMaskable = coreJsData ? isFunction : stubFalse;

    /**
     * Checks if `value` is likely a prototype object.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
     */
    function isPrototype(value) {
      var Ctor = value && value.constructor,
          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;

      return value === proto;
    }

    /**
     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` if suitable for strict
     *  equality comparisons, else `false`.
     */
    function isStrictComparable(value) {
      return value === value && !isObject(value);
    }

    /**
     * A specialized version of `matchesProperty` for source values suitable
     * for strict equality comparisons, i.e. `===`.
     *
     * @private
     * @param {string} key The key of the property to get.
     * @param {*} srcValue The value to match.
     * @returns {Function} Returns the new spec function.
     */
    function matchesStrictComparable(key, srcValue) {
      return function(object) {
        if (object == null) {
          return false;
        }
        return object[key] === srcValue &&
          (srcValue !== undefined || (key in Object(object)));
      };
    }

    /**
     * A specialized version of `_.memoize` which clears the memoized function's
     * cache when it exceeds `MAX_MEMOIZE_SIZE`.
     *
     * @private
     * @param {Function} func The function to have its output memoized.
     * @returns {Function} Returns the new memoized function.
     */
    function memoizeCapped(func) {
      var result = memoize(func, function(key) {
        if (cache.size === MAX_MEMOIZE_SIZE) {
          cache.clear();
        }
        return key;
      });

      var cache = result.cache;
      return result;
    }

    /**
     * Merges the function metadata of `source` into `data`.
     *
     * Merging metadata reduces the number of wrappers used to invoke a function.
     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
     * may be applied regardless of execution order. Methods like `_.ary` and
     * `_.rearg` modify function arguments, making the order in which they are
     * executed important, preventing the merging of metadata. However, we make
     * an exception for a safe combined case where curried functions have `_.ary`
     * and or `_.rearg` applied.
     *
     * @private
     * @param {Array} data The destination metadata.
     * @param {Array} source The source metadata.
     * @returns {Array} Returns `data`.
     */
    function mergeData(data, source) {
      var bitmask = data[1],
          srcBitmask = source[1],
          newBitmask = bitmask | srcBitmask,
          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);

      var isCombo =
        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));

      // Exit early if metadata can't be merged.
      if (!(isCommon || isCombo)) {
        return data;
      }
      // Use source `thisArg` if available.
      if (srcBitmask & WRAP_BIND_FLAG) {
        data[2] = source[2];
        // Set when currying a bound function.
        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
      }
      // Compose partial arguments.
      var value = source[3];
      if (value) {
        var partials = data[3];
        data[3] = partials ? composeArgs(partials, value, source[4]) : value;
        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
      }
      // Compose partial right arguments.
      value = source[5];
      if (value) {
        partials = data[5];
        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
      }
      // Use source `argPos` if available.
      value = source[7];
      if (value) {
        data[7] = value;
      }
      // Use source `ary` if it's smaller.
      if (srcBitmask & WRAP_ARY_FLAG) {
        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
      }
      // Use source `arity` if one is not provided.
      if (data[9] == null) {
        data[9] = source[9];
      }
      // Use source `func` and merge bitmasks.
      data[0] = source[0];
      data[1] = newBitmask;

      return data;
    }

    /**
     * This function is like
     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
     * except that it includes inherited enumerable properties.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names.
     */
    function nativeKeysIn(object) {
      var result = [];
      if (object != null) {
        for (var key in Object(object)) {
          result.push(key);
        }
      }
      return result;
    }

    /**
     * Converts `value` to a string using `Object.prototype.toString`.
     *
     * @private
     * @param {*} value The value to convert.
     * @returns {string} Returns the converted string.
     */
    function objectToString(value) {
      return nativeObjectToString.call(value);
    }

    /**
     * A specialized version of `baseRest` which transforms the rest array.
     *
     * @private
     * @param {Function} func The function to apply a rest parameter to.
     * @param {number} [start=func.length-1] The start position of the rest parameter.
     * @param {Function} transform The rest array transform.
     * @returns {Function} Returns the new function.
     */
    function overRest(func, start, transform) {
      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
      return function() {
        var args = arguments,
            index = -1,
            length = nativeMax(args.length - start, 0),
            array = Array(length);

        while (++index < length) {
          array[index] = args[start + index];
        }
        index = -1;
        var otherArgs = Array(start + 1);
        while (++index < start) {
          otherArgs[index] = args[index];
        }
        otherArgs[start] = transform(array);
        return apply(func, this, otherArgs);
      };
    }

    /**
     * Gets the parent value at `path` of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {Array} path The path to get the parent value of.
     * @returns {*} Returns the parent value.
     */
    function parent(object, path) {
      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
    }

    /**
     * Reorder `array` according to the specified indexes where the element at
     * the first index is assigned as the first element, the element at
     * the second index is assigned as the second element, and so on.
     *
     * @private
     * @param {Array} array The array to reorder.
     * @param {Array} indexes The arranged array indexes.
     * @returns {Array} Returns `array`.
     */
    function reorder(array, indexes) {
      var arrLength = array.length,
          length = nativeMin(indexes.length, arrLength),
          oldArray = copyArray(array);

      while (length--) {
        var index = indexes[length];
        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
      }
      return array;
    }

    /**
     * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
     *
     * @private
     * @param {Object} object The object to query.
     * @param {string} key The key of the property to get.
     * @returns {*} Returns the property value.
     */
    function safeGet(object, key) {
      if (key === 'constructor' && typeof object[key] === 'function') {
        return;
      }

      if (key == '__proto__') {
        return;
      }

      return object[key];
    }

    /**
     * Sets metadata for `func`.
     *
     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
     * period of time, it will trip its breaker and transition to an identity
     * function to avoid garbage collection pauses in V8. See
     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
     * for more details.
     *
     * @private
     * @param {Function} func The function to associate metadata with.
     * @param {*} data The metadata.
     * @returns {Function} Returns `func`.
     */
    var setData = shortOut(baseSetData);

    /**
     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
     *
     * @private
     * @param {Function} func The function to delay.
     * @param {number} wait The number of milliseconds to delay invocation.
     * @returns {number|Object} Returns the timer id or timeout object.
     */
    var setTimeout = ctxSetTimeout || function(func, wait) {
      return root.setTimeout(func, wait);
    };

    /**
     * Sets the `toString` method of `func` to return `string`.
     *
     * @private
     * @param {Function} func The function to modify.
     * @param {Function} string The `toString` result.
     * @returns {Function} Returns `func`.
     */
    var setToString = shortOut(baseSetToString);

    /**
     * Sets the `toString` method of `wrapper` to mimic the source of `reference`
     * with wrapper details in a comment at the top of the source body.
     *
     * @private
     * @param {Function} wrapper The function to modify.
     * @param {Function} reference The reference function.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @returns {Function} Returns `wrapper`.
     */
    function setWrapToString(wrapper, reference, bitmask) {
      var source = (reference + '');
      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
    }

    /**
     * Creates a function that'll short out and invoke `identity` instead
     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
     * milliseconds.
     *
     * @private
     * @param {Function} func The function to restrict.
     * @returns {Function} Returns the new shortable function.
     */
    function shortOut(func) {
      var count = 0,
          lastCalled = 0;

      return function() {
        var stamp = nativeNow(),
            remaining = HOT_SPAN - (stamp - lastCalled);

        lastCalled = stamp;
        if (remaining > 0) {
          if (++count >= HOT_COUNT) {
            return arguments[0];
          }
        } else {
          count = 0;
        }
        return func.apply(undefined, arguments);
      };
    }

    /**
     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
     *
     * @private
     * @param {Array} array The array to shuffle.
     * @param {number} [size=array.length] The size of `array`.
     * @returns {Array} Returns `array`.
     */
    function shuffleSelf(array, size) {
      var index = -1,
          length = array.length,
          lastIndex = length - 1;

      size = size === undefined ? length : size;
      while (++index < size) {
        var rand = baseRandom(index, lastIndex),
            value = array[rand];

        array[rand] = array[index];
        array[index] = value;
      }
      array.length = size;
      return array;
    }

    /**
     * Converts `string` to a property path array.
     *
     * @private
     * @param {string} string The string to convert.
     * @returns {Array} Returns the property path array.
     */
    var stringToPath = memoizeCapped(function(string) {
      var result = [];
      if (string.charCodeAt(0) === 46 /* . */) {
        result.push('');
      }
      string.replace(rePropName, function(match, number, quote, subString) {
        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
      });
      return result;
    });

    /**
     * Converts `value` to a string key if it's not a string or symbol.
     *
     * @private
     * @param {*} value The value to inspect.
     * @returns {string|symbol} Returns the key.
     */
    function toKey(value) {
      if (typeof value == 'string' || isSymbol(value)) {
        return value;
      }
      var result = (value + '');
      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
    }

    /**
     * Converts `func` to its source code.
     *
     * @private
     * @param {Function} func The function to convert.
     * @returns {string} Returns the source code.
     */
    function toSource(func) {
      if (func != null) {
        try {
          return funcToString.call(func);
        } catch (e) {}
        try {
          return (func + '');
        } catch (e) {}
      }
      return '';
    }

    /**
     * Updates wrapper `details` based on `bitmask` flags.
     *
     * @private
     * @returns {Array} details The details to modify.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @returns {Array} Returns `details`.
     */
    function updateWrapDetails(details, bitmask) {
      arrayEach(wrapFlags, function(pair) {
        var value = '_.' + pair[0];
        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
          details.push(value);
        }
      });
      return details.sort();
    }

    /**
     * Creates a clone of `wrapper`.
     *
     * @private
     * @param {Object} wrapper The wrapper to clone.
     * @returns {Object} Returns the cloned wrapper.
     */
    function wrapperClone(wrapper) {
      if (wrapper instanceof LazyWrapper) {
        return wrapper.clone();
      }
      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
      result.__actions__ = copyArray(wrapper.__actions__);
      result.__index__  = wrapper.__index__;
      result.__values__ = wrapper.__values__;
      return result;
    }

    /*------------------------------------------------------------------------*/

    /**
     * Creates an array of elements split into groups the length of `size`.
     * If `array` can't be split evenly, the final chunk will be the remaining
     * elements.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to process.
     * @param {number} [size=1] The length of each chunk
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the new array of chunks.
     * @example
     *
     * _.chunk(['a', 'b', 'c', 'd'], 2);
     * // => [['a', 'b'], ['c', 'd']]
     *
     * _.chunk(['a', 'b', 'c', 'd'], 3);
     * // => [['a', 'b', 'c'], ['d']]
     */
    function chunk(array, size, guard) {
      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
        size = 1;
      } else {
        size = nativeMax(toInteger(size), 0);
      }
      var length = array == null ? 0 : array.length;
      if (!length || size < 1) {
        return [];
      }
      var index = 0,
          resIndex = 0,
          result = Array(nativeCeil(length / size));

      while (index < length) {
        result[resIndex++] = baseSlice(array, index, (index += size));
      }
      return result;
    }

    /**
     * Creates an array with all falsey values removed. The values `false`, `null`,
     * `0`, `""`, `undefined`, and `NaN` are falsey.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to compact.
     * @returns {Array} Returns the new array of filtered values.
     * @example
     *
     * _.compact([0, 1, false, 2, '', 3]);
     * // => [1, 2, 3]
     */
    function compact(array) {
      var index = -1,
          length = array == null ? 0 : array.length,
          resIndex = 0,
          result = [];

      while (++index < length) {
        var value = array[index];
        if (value) {
          result[resIndex++] = value;
        }
      }
      return result;
    }

    /**
     * Creates a new array concatenating `array` with any additional arrays
     * and/or values.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to concatenate.
     * @param {...*} [values] The values to concatenate.
     * @returns {Array} Returns the new concatenated array.
     * @example
     *
     * var array = [1];
     * var other = _.concat(array, 2, [3], [[4]]);
     *
     * console.log(other);
     * // => [1, 2, 3, [4]]
     *
     * console.log(array);
     * // => [1]
     */
    function concat() {
      var length = arguments.length;
      if (!length) {
        return [];
      }
      var args = Array(length - 1),
          array = arguments[0],
          index = length;

      while (index--) {
        args[index - 1] = arguments[index];
      }
      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
    }

    /**
     * Creates an array of `array` values not included in the other given arrays
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons. The order and references of result values are
     * determined by the first array.
     *
     * **Note:** Unlike `_.pullAll`, this method returns a new array.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {...Array} [values] The values to exclude.
     * @returns {Array} Returns the new array of filtered values.
     * @see _.without, _.xor
     * @example
     *
     * _.difference([2, 1], [2, 3]);
     * // => [1]
     */
    var difference = baseRest(function(array, values) {
      return isArrayLikeObject(array)
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
        : [];
    });

    /**
     * This method is like `_.difference` except that it accepts `iteratee` which
     * is invoked for each element of `array` and `values` to generate the criterion
     * by which they're compared. The order and references of result values are
     * determined by the first array. The iteratee is invoked with one argument:
     * (value).
     *
     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {...Array} [values] The values to exclude.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns the new array of filtered values.
     * @example
     *
     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
     * // => [1.2]
     *
     * // The `_.property` iteratee shorthand.
     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
     * // => [{ 'x': 2 }]
     */
    var differenceBy = baseRest(function(array, values) {
      var iteratee = last(values);
      if (isArrayLikeObject(iteratee)) {
        iteratee = undefined;
      }
      return isArrayLikeObject(array)
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
        : [];
    });

    /**
     * This method is like `_.difference` except that it accepts `comparator`
     * which is invoked to compare elements of `array` to `values`. The order and
     * references of result values are determined by the first array. The comparator
     * is invoked with two arguments: (arrVal, othVal).
     *
     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {...Array} [values] The values to exclude.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of filtered values.
     * @example
     *
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
     *
     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
     * // => [{ 'x': 2, 'y': 1 }]
     */
    var differenceWith = baseRest(function(array, values) {
      var comparator = last(values);
      if (isArrayLikeObject(comparator)) {
        comparator = undefined;
      }
      return isArrayLikeObject(array)
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
        : [];
    });

    /**
     * Creates a slice of `array` with `n` elements dropped from the beginning.
     *
     * @static
     * @memberOf _
     * @since 0.5.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {number} [n=1] The number of elements to drop.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.drop([1, 2, 3]);
     * // => [2, 3]
     *
     * _.drop([1, 2, 3], 2);
     * // => [3]
     *
     * _.drop([1, 2, 3], 5);
     * // => []
     *
     * _.drop([1, 2, 3], 0);
     * // => [1, 2, 3]
     */
    function drop(array, n, guard) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      n = (guard || n === undefined) ? 1 : toInteger(n);
      return baseSlice(array, n < 0 ? 0 : n, length);
    }

    /**
     * Creates a slice of `array` with `n` elements dropped from the end.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {number} [n=1] The number of elements to drop.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.dropRight([1, 2, 3]);
     * // => [1, 2]
     *
     * _.dropRight([1, 2, 3], 2);
     * // => [1]
     *
     * _.dropRight([1, 2, 3], 5);
     * // => []
     *
     * _.dropRight([1, 2, 3], 0);
     * // => [1, 2, 3]
     */
    function dropRight(array, n, guard) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      n = (guard || n === undefined) ? 1 : toInteger(n);
      n = length - n;
      return baseSlice(array, 0, n < 0 ? 0 : n);
    }

    /**
     * Creates a slice of `array` excluding elements dropped from the end.
     * Elements are dropped until `predicate` returns falsey. The predicate is
     * invoked with three arguments: (value, index, array).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': true },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': false }
     * ];
     *
     * _.dropRightWhile(users, function(o) { return !o.active; });
     * // => objects for ['barney']
     *
     * // The `_.matches` iteratee shorthand.
     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
     * // => objects for ['barney', 'fred']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.dropRightWhile(users, ['active', false]);
     * // => objects for ['barney']
     *
     * // The `_.property` iteratee shorthand.
     * _.dropRightWhile(users, 'active');
     * // => objects for ['barney', 'fred', 'pebbles']
     */
    function dropRightWhile(array, predicate) {
      return (array && array.length)
        ? baseWhile(array, getIteratee(predicate, 3), true, true)
        : [];
    }

    /**
     * Creates a slice of `array` excluding elements dropped from the beginning.
     * Elements are dropped until `predicate` returns falsey. The predicate is
     * invoked with three arguments: (value, index, array).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': false },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': true }
     * ];
     *
     * _.dropWhile(users, function(o) { return !o.active; });
     * // => objects for ['pebbles']
     *
     * // The `_.matches` iteratee shorthand.
     * _.dropWhile(users, { 'user': 'barney', 'active': false });
     * // => objects for ['fred', 'pebbles']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.dropWhile(users, ['active', false]);
     * // => objects for ['pebbles']
     *
     * // The `_.property` iteratee shorthand.
     * _.dropWhile(users, 'active');
     * // => objects for ['barney', 'fred', 'pebbles']
     */
    function dropWhile(array, predicate) {
      return (array && array.length)
        ? baseWhile(array, getIteratee(predicate, 3), true)
        : [];
    }

    /**
     * Fills elements of `array` with `value` from `start` up to, but not
     * including, `end`.
     *
     * **Note:** This method mutates `array`.
     *
     * @static
     * @memberOf _
     * @since 3.2.0
     * @category Array
     * @param {Array} array The array to fill.
     * @param {*} value The value to fill `array` with.
     * @param {number} [start=0] The start position.
     * @param {number} [end=array.length] The end position.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = [1, 2, 3];
     *
     * _.fill(array, 'a');
     * console.log(array);
     * // => ['a', 'a', 'a']
     *
     * _.fill(Array(3), 2);
     * // => [2, 2, 2]
     *
     * _.fill([4, 6, 8, 10], '*', 1, 3);
     * // => [4, '*', '*', 10]
     */
    function fill(array, value, start, end) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
        start = 0;
        end = length;
      }
      return baseFill(array, value, start, end);
    }

    /**
     * This method is like `_.find` except that it returns the index of the first
     * element `predicate` returns truthy for instead of the element itself.
     *
     * @static
     * @memberOf _
     * @since 1.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param {number} [fromIndex=0] The index to search from.
     * @returns {number} Returns the index of the found element, else `-1`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': false },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': true }
     * ];
     *
     * _.findIndex(users, function(o) { return o.user == 'barney'; });
     * // => 0
     *
     * // The `_.matches` iteratee shorthand.
     * _.findIndex(users, { 'user': 'fred', 'active': false });
     * // => 1
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.findIndex(users, ['active', false]);
     * // => 0
     *
     * // The `_.property` iteratee shorthand.
     * _.findIndex(users, 'active');
     * // => 2
     */
    function findIndex(array, predicate, fromIndex) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return -1;
      }
      var index = fromIndex == null ? 0 : toInteger(fromIndex);
      if (index < 0) {
        index = nativeMax(length + index, 0);
      }
      return baseFindIndex(array, getIteratee(predicate, 3), index);
    }

    /**
     * This method is like `_.findIndex` except that it iterates over elements
     * of `collection` from right to left.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param {number} [fromIndex=array.length-1] The index to search from.
     * @returns {number} Returns the index of the found element, else `-1`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': true },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': false }
     * ];
     *
     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
     * // => 2
     *
     * // The `_.matches` iteratee shorthand.
     * _.findLastIndex(users, { 'user': 'barney', 'active': true });
     * // => 0
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.findLastIndex(users, ['active', false]);
     * // => 2
     *
     * // The `_.property` iteratee shorthand.
     * _.findLastIndex(users, 'active');
     * // => 0
     */
    function findLastIndex(array, predicate, fromIndex) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return -1;
      }
      var index = length - 1;
      if (fromIndex !== undefined) {
        index = toInteger(fromIndex);
        index = fromIndex < 0
          ? nativeMax(length + index, 0)
          : nativeMin(index, length - 1);
      }
      return baseFindIndex(array, getIteratee(predicate, 3), index, true);
    }

    /**
     * Flattens `array` a single level deep.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to flatten.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * _.flatten([1, [2, [3, [4]], 5]]);
     * // => [1, 2, [3, [4]], 5]
     */
    function flatten(array) {
      var length = array == null ? 0 : array.length;
      return length ? baseFlatten(array, 1) : [];
    }

    /**
     * Recursively flattens `array`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to flatten.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * _.flattenDeep([1, [2, [3, [4]], 5]]);
     * // => [1, 2, 3, 4, 5]
     */
    function flattenDeep(array) {
      var length = array == null ? 0 : array.length;
      return length ? baseFlatten(array, INFINITY) : [];
    }

    /**
     * Recursively flatten `array` up to `depth` times.
     *
     * @static
     * @memberOf _
     * @since 4.4.0
     * @category Array
     * @param {Array} array The array to flatten.
     * @param {number} [depth=1] The maximum recursion depth.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * var array = [1, [2, [3, [4]], 5]];
     *
     * _.flattenDepth(array, 1);
     * // => [1, 2, [3, [4]], 5]
     *
     * _.flattenDepth(array, 2);
     * // => [1, 2, 3, [4], 5]
     */
    function flattenDepth(array, depth) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      depth = depth === undefined ? 1 : toInteger(depth);
      return baseFlatten(array, depth);
    }

    /**
     * The inverse of `_.toPairs`; this method returns an object composed
     * from key-value `pairs`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} pairs The key-value pairs.
     * @returns {Object} Returns the new object.
     * @example
     *
     * _.fromPairs([['a', 1], ['b', 2]]);
     * // => { 'a': 1, 'b': 2 }
     */
    function fromPairs(pairs) {
      var index = -1,
          length = pairs == null ? 0 : pairs.length,
          result = {};

      while (++index < length) {
        var pair = pairs[index];
        result[pair[0]] = pair[1];
      }
      return result;
    }

    /**
     * Gets the first element of `array`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @alias first
     * @category Array
     * @param {Array} array The array to query.
     * @returns {*} Returns the first element of `array`.
     * @example
     *
     * _.head([1, 2, 3]);
     * // => 1
     *
     * _.head([]);
     * // => undefined
     */
    function head(array) {
      return (array && array.length) ? array[0] : undefined;
    }

    /**
     * Gets the index at which the first occurrence of `value` is found in `array`
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons. If `fromIndex` is negative, it's used as the
     * offset from the end of `array`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {*} value The value to search for.
     * @param {number} [fromIndex=0] The index to search from.
     * @returns {number} Returns the index of the matched value, else `-1`.
     * @example
     *
     * _.indexOf([1, 2, 1, 2], 2);
     * // => 1
     *
     * // Search from the `fromIndex`.
     * _.indexOf([1, 2, 1, 2], 2, 2);
     * // => 3
     */
    function indexOf(array, value, fromIndex) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return -1;
      }
      var index = fromIndex == null ? 0 : toInteger(fromIndex);
      if (index < 0) {
        index = nativeMax(length + index, 0);
      }
      return baseIndexOf(array, value, index);
    }

    /**
     * Gets all but the last element of `array`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to query.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.initial([1, 2, 3]);
     * // => [1, 2]
     */
    function initial(array) {
      var length = array == null ? 0 : array.length;
      return length ? baseSlice(array, 0, -1) : [];
    }

    /**
     * Creates an array of unique values that are included in all given arrays
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons. The order and references of result values are
     * determined by the first array.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @returns {Array} Returns the new array of intersecting values.
     * @example
     *
     * _.intersection([2, 1], [2, 3]);
     * // => [2]
     */
    var intersection = baseRest(function(arrays) {
      var mapped = arrayMap(arrays, castArrayLikeObject);
      return (mapped.length && mapped[0] === arrays[0])
        ? baseIntersection(mapped)
        : [];
    });

    /**
     * This method is like `_.intersection` except that it accepts `iteratee`
     * which is invoked for each element of each `arrays` to generate the criterion
     * by which they're compared. The order and references of result values are
     * determined by the first array. The iteratee is invoked with one argument:
     * (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns the new array of intersecting values.
     * @example
     *
     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
     * // => [2.1]
     *
     * // The `_.property` iteratee shorthand.
     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
     * // => [{ 'x': 1 }]
     */
    var intersectionBy = baseRest(function(arrays) {
      var iteratee = last(arrays),
          mapped = arrayMap(arrays, castArrayLikeObject);

      if (iteratee === last(mapped)) {
        iteratee = undefined;
      } else {
        mapped.pop();
      }
      return (mapped.length && mapped[0] === arrays[0])
        ? baseIntersection(mapped, getIteratee(iteratee, 2))
        : [];
    });

    /**
     * This method is like `_.intersection` except that it accepts `comparator`
     * which is invoked to compare elements of `arrays`. The order and references
     * of result values are determined by the first array. The comparator is
     * invoked with two arguments: (arrVal, othVal).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of intersecting values.
     * @example
     *
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
     *
     * _.intersectionWith(objects, others, _.isEqual);
     * // => [{ 'x': 1, 'y': 2 }]
     */
    var intersectionWith = baseRest(function(arrays) {
      var comparator = last(arrays),
          mapped = arrayMap(arrays, castArrayLikeObject);

      comparator = typeof comparator == 'function' ? comparator : undefined;
      if (comparator) {
        mapped.pop();
      }
      return (mapped.length && mapped[0] === arrays[0])
        ? baseIntersection(mapped, undefined, comparator)
        : [];
    });

    /**
     * Converts all elements in `array` into a string separated by `separator`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to convert.
     * @param {string} [separator=','] The element separator.
     * @returns {string} Returns the joined string.
     * @example
     *
     * _.join(['a', 'b', 'c'], '~');
     * // => 'a~b~c'
     */
    function join(array, separator) {
      return array == null ? '' : nativeJoin.call(array, separator);
    }

    /**
     * Gets the last element of `array`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to query.
     * @returns {*} Returns the last element of `array`.
     * @example
     *
     * _.last([1, 2, 3]);
     * // => 3
     */
    function last(array) {
      var length = array == null ? 0 : array.length;
      return length ? array[length - 1] : undefined;
    }

    /**
     * This method is like `_.indexOf` except that it iterates over elements of
     * `array` from right to left.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {*} value The value to search for.
     * @param {number} [fromIndex=array.length-1] The index to search from.
     * @returns {number} Returns the index of the matched value, else `-1`.
     * @example
     *
     * _.lastIndexOf([1, 2, 1, 2], 2);
     * // => 3
     *
     * // Search from the `fromIndex`.
     * _.lastIndexOf([1, 2, 1, 2], 2, 2);
     * // => 1
     */
    function lastIndexOf(array, value, fromIndex) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return -1;
      }
      var index = length;
      if (fromIndex !== undefined) {
        index = toInteger(fromIndex);
        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
      }
      return value === value
        ? strictLastIndexOf(array, value, index)
        : baseFindIndex(array, baseIsNaN, index, true);
    }

    /**
     * Gets the element at index `n` of `array`. If `n` is negative, the nth
     * element from the end is returned.
     *
     * @static
     * @memberOf _
     * @since 4.11.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {number} [n=0] The index of the element to return.
     * @returns {*} Returns the nth element of `array`.
     * @example
     *
     * var array = ['a', 'b', 'c', 'd'];
     *
     * _.nth(array, 1);
     * // => 'b'
     *
     * _.nth(array, -2);
     * // => 'c';
     */
    function nth(array, n) {
      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
    }

    /**
     * Removes all given values from `array` using
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons.
     *
     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
     * to remove elements from an array by predicate.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {...*} [values] The values to remove.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
     *
     * _.pull(array, 'a', 'c');
     * console.log(array);
     * // => ['b', 'b']
     */
    var pull = baseRest(pullAll);

    /**
     * This method is like `_.pull` except that it accepts an array of values to remove.
     *
     * **Note:** Unlike `_.difference`, this method mutates `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {Array} values The values to remove.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
     *
     * _.pullAll(array, ['a', 'c']);
     * console.log(array);
     * // => ['b', 'b']
     */
    function pullAll(array, values) {
      return (array && array.length && values && values.length)
        ? basePullAll(array, values)
        : array;
    }

    /**
     * This method is like `_.pullAll` except that it accepts `iteratee` which is
     * invoked for each element of `array` and `values` to generate the criterion
     * by which they're compared. The iteratee is invoked with one argument: (value).
     *
     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {Array} values The values to remove.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
     *
     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
     * console.log(array);
     * // => [{ 'x': 2 }]
     */
    function pullAllBy(array, values, iteratee) {
      return (array && array.length && values && values.length)
        ? basePullAll(array, values, getIteratee(iteratee, 2))
        : array;
    }

    /**
     * This method is like `_.pullAll` except that it accepts `comparator` which
     * is invoked to compare elements of `array` to `values`. The comparator is
     * invoked with two arguments: (arrVal, othVal).
     *
     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
     *
     * @static
     * @memberOf _
     * @since 4.6.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {Array} values The values to remove.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
     *
     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
     * console.log(array);
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
     */
    function pullAllWith(array, values, comparator) {
      return (array && array.length && values && values.length)
        ? basePullAll(array, values, undefined, comparator)
        : array;
    }

    /**
     * Removes elements from `array` corresponding to `indexes` and returns an
     * array of removed elements.
     *
     * **Note:** Unlike `_.at`, this method mutates `array`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {...(number|number[])} [indexes] The indexes of elements to remove.
     * @returns {Array} Returns the new array of removed elements.
     * @example
     *
     * var array = ['a', 'b', 'c', 'd'];
     * var pulled = _.pullAt(array, [1, 3]);
     *
     * console.log(array);
     * // => ['a', 'c']
     *
     * console.log(pulled);
     * // => ['b', 'd']
     */
    var pullAt = flatRest(function(array, indexes) {
      var length = array == null ? 0 : array.length,
          result = baseAt(array, indexes);

      basePullAt(array, arrayMap(indexes, function(index) {
        return isIndex(index, length) ? +index : index;
      }).sort(compareAscending));

      return result;
    });

    /**
     * Removes all elements from `array` that `predicate` returns truthy for
     * and returns an array of the removed elements. The predicate is invoked
     * with three arguments: (value, index, array).
     *
     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
     * to pull elements from an array by value.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new array of removed elements.
     * @example
     *
     * var array = [1, 2, 3, 4];
     * var evens = _.remove(array, function(n) {
     *   return n % 2 == 0;
     * });
     *
     * console.log(array);
     * // => [1, 3]
     *
     * console.log(evens);
     * // => [2, 4]
     */
    function remove(array, predicate) {
      var result = [];
      if (!(array && array.length)) {
        return result;
      }
      var index = -1,
          indexes = [],
          length = array.length;

      predicate = getIteratee(predicate, 3);
      while (++index < length) {
        var value = array[index];
        if (predicate(value, index, array)) {
          result.push(value);
          indexes.push(index);
        }
      }
      basePullAt(array, indexes);
      return result;
    }

    /**
     * Reverses `array` so that the first element becomes the last, the second
     * element becomes the second to last, and so on.
     *
     * **Note:** This method mutates `array` and is based on
     * [`Array#reverse`](https://mdn.io/Array/reverse).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = [1, 2, 3];
     *
     * _.reverse(array);
     * // => [3, 2, 1]
     *
     * console.log(array);
     * // => [3, 2, 1]
     */
    function reverse(array) {
      return array == null ? array : nativeReverse.call(array);
    }

    /**
     * Creates a slice of `array` from `start` up to, but not including, `end`.
     *
     * **Note:** This method is used instead of
     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
     * returned.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to slice.
     * @param {number} [start=0] The start position.
     * @param {number} [end=array.length] The end position.
     * @returns {Array} Returns the slice of `array`.
     */
    function slice(array, start, end) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
        start = 0;
        end = length;
      }
      else {
        start = start == null ? 0 : toInteger(start);
        end = end === undefined ? length : toInteger(end);
      }
      return baseSlice(array, start, end);
    }

    /**
     * Uses a binary search to determine the lowest index at which `value`
     * should be inserted into `array` in order to maintain its sort order.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     * @example
     *
     * _.sortedIndex([30, 50], 40);
     * // => 1
     */
    function sortedIndex(array, value) {
      return baseSortedIndex(array, value);
    }

    /**
     * This method is like `_.sortedIndex` except that it accepts `iteratee`
     * which is invoked for `value` and each element of `array` to compute their
     * sort ranking. The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     * @example
     *
     * var objects = [{ 'x': 4 }, { 'x': 5 }];
     *
     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
     * // => 0
     *
     * // The `_.property` iteratee shorthand.
     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
     * // => 0
     */
    function sortedIndexBy(array, value, iteratee) {
      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
    }

    /**
     * This method is like `_.indexOf` except that it performs a binary
     * search on a sorted `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {*} value The value to search for.
     * @returns {number} Returns the index of the matched value, else `-1`.
     * @example
     *
     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
     * // => 1
     */
    function sortedIndexOf(array, value) {
      var length = array == null ? 0 : array.length;
      if (length) {
        var index = baseSortedIndex(array, value);
        if (index < length && eq(array[index], value)) {
          return index;
        }
      }
      return -1;
    }

    /**
     * This method is like `_.sortedIndex` except that it returns the highest
     * index at which `value` should be inserted into `array` in order to
     * maintain its sort order.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     * @example
     *
     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
     * // => 4
     */
    function sortedLastIndex(array, value) {
      return baseSortedIndex(array, value, true);
    }

    /**
     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
     * which is invoked for `value` and each element of `array` to compute their
     * sort ranking. The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     * @example
     *
     * var objects = [{ 'x': 4 }, { 'x': 5 }];
     *
     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
     * // => 1
     *
     * // The `_.property` iteratee shorthand.
     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
     * // => 1
     */
    function sortedLastIndexBy(array, value, iteratee) {
      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
    }

    /**
     * This method is like `_.lastIndexOf` except that it performs a binary
     * search on a sorted `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {*} value The value to search for.
     * @returns {number} Returns the index of the matched value, else `-1`.
     * @example
     *
     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
     * // => 3
     */
    function sortedLastIndexOf(array, value) {
      var length = array == null ? 0 : array.length;
      if (length) {
        var index = baseSortedIndex(array, value, true) - 1;
        if (eq(array[index], value)) {
          return index;
        }
      }
      return -1;
    }

    /**
     * This method is like `_.uniq` except that it's designed and optimized
     * for sorted arrays.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @returns {Array} Returns the new duplicate free array.
     * @example
     *
     * _.sortedUniq([1, 1, 2]);
     * // => [1, 2]
     */
    function sortedUniq(array) {
      return (array && array.length)
        ? baseSortedUniq(array)
        : [];
    }

    /**
     * This method is like `_.uniqBy` except that it's designed and optimized
     * for sorted arrays.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @returns {Array} Returns the new duplicate free array.
     * @example
     *
     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
     * // => [1.1, 2.3]
     */
    function sortedUniqBy(array, iteratee) {
      return (array && array.length)
        ? baseSortedUniq(array, getIteratee(iteratee, 2))
        : [];
    }

    /**
     * Gets all but the first element of `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.tail([1, 2, 3]);
     * // => [2, 3]
     */
    function tail(array) {
      var length = array == null ? 0 : array.length;
      return length ? baseSlice(array, 1, length) : [];
    }

    /**
     * Creates a slice of `array` with `n` elements taken from the beginning.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {number} [n=1] The number of elements to take.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.take([1, 2, 3]);
     * // => [1]
     *
     * _.take([1, 2, 3], 2);
     * // => [1, 2]
     *
     * _.take([1, 2, 3], 5);
     * // => [1, 2, 3]
     *
     * _.take([1, 2, 3], 0);
     * // => []
     */
    function take(array, n, guard) {
      if (!(array && array.length)) {
        return [];
      }
      n = (guard || n === undefined) ? 1 : toInteger(n);
      return baseSlice(array, 0, n < 0 ? 0 : n);
    }

    /**
     * Creates a slice of `array` with `n` elements taken from the end.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {number} [n=1] The number of elements to take.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.takeRight([1, 2, 3]);
     * // => [3]
     *
     * _.takeRight([1, 2, 3], 2);
     * // => [2, 3]
     *
     * _.takeRight([1, 2, 3], 5);
     * // => [1, 2, 3]
     *
     * _.takeRight([1, 2, 3], 0);
     * // => []
     */
    function takeRight(array, n, guard) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      n = (guard || n === undefined) ? 1 : toInteger(n);
      n = length - n;
      return baseSlice(array, n < 0 ? 0 : n, length);
    }

    /**
     * Creates a slice of `array` with elements taken from the end. Elements are
     * taken until `predicate` returns falsey. The predicate is invoked with
     * three arguments: (value, index, array).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': true },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': false }
     * ];
     *
     * _.takeRightWhile(users, function(o) { return !o.active; });
     * // => objects for ['fred', 'pebbles']
     *
     * // The `_.matches` iteratee shorthand.
     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
     * // => objects for ['pebbles']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.takeRightWhile(users, ['active', false]);
     * // => objects for ['fred', 'pebbles']
     *
     * // The `_.property` iteratee shorthand.
     * _.takeRightWhile(users, 'active');
     * // => []
     */
    function takeRightWhile(array, predicate) {
      return (array && array.length)
        ? baseWhile(array, getIteratee(predicate, 3), false, true)
        : [];
    }

    /**
     * Creates a slice of `array` with elements taken from the beginning. Elements
     * are taken until `predicate` returns falsey. The predicate is invoked with
     * three arguments: (value, index, array).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': false },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': true }
     * ];
     *
     * _.takeWhile(users, function(o) { return !o.active; });
     * // => objects for ['barney', 'fred']
     *
     * // The `_.matches` iteratee shorthand.
     * _.takeWhile(users, { 'user': 'barney', 'active': false });
     * // => objects for ['barney']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.takeWhile(users, ['active', false]);
     * // => objects for ['barney', 'fred']
     *
     * // The `_.property` iteratee shorthand.
     * _.takeWhile(users, 'active');
     * // => []
     */
    function takeWhile(array, predicate) {
      return (array && array.length)
        ? baseWhile(array, getIteratee(predicate, 3))
        : [];
    }

    /**
     * Creates an array of unique values, in order, from all given arrays using
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @returns {Array} Returns the new array of combined values.
     * @example
     *
     * _.union([2], [1, 2]);
     * // => [2, 1]
     */
    var union = baseRest(function(arrays) {
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
    });

    /**
     * This method is like `_.union` except that it accepts `iteratee` which is
     * invoked for each element of each `arrays` to generate the criterion by
     * which uniqueness is computed. Result values are chosen from the first
     * array in which the value occurs. The iteratee is invoked with one argument:
     * (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns the new array of combined values.
     * @example
     *
     * _.unionBy([2.1], [1.2, 2.3], Math.floor);
     * // => [2.1, 1.2]
     *
     * // The `_.property` iteratee shorthand.
     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
     * // => [{ 'x': 1 }, { 'x': 2 }]
     */
    var unionBy = baseRest(function(arrays) {
      var iteratee = last(arrays);
      if (isArrayLikeObject(iteratee)) {
        iteratee = undefined;
      }
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
    });

    /**
     * This method is like `_.union` except that it accepts `comparator` which
     * is invoked to compare elements of `arrays`. Result values are chosen from
     * the first array in which the value occurs. The comparator is invoked
     * with two arguments: (arrVal, othVal).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of combined values.
     * @example
     *
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
     *
     * _.unionWith(objects, others, _.isEqual);
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
     */
    var unionWith = baseRest(function(arrays) {
      var comparator = last(arrays);
      comparator = typeof comparator == 'function' ? comparator : undefined;
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
    });

    /**
     * Creates a duplicate-free version of an array, using
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons, in which only the first occurrence of each element
     * is kept. The order of result values is determined by the order they occur
     * in the array.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @returns {Array} Returns the new duplicate free array.
     * @example
     *
     * _.uniq([2, 1, 2]);
     * // => [2, 1]
     */
    function uniq(array) {
      return (array && array.length) ? baseUniq(array) : [];
    }

    /**
     * This method is like `_.uniq` except that it accepts `iteratee` which is
     * invoked for each element in `array` to generate the criterion by which
     * uniqueness is computed. The order of result values is determined by the
     * order they occur in the array. The iteratee is invoked with one argument:
     * (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns the new duplicate free array.
     * @example
     *
     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
     * // => [2.1, 1.2]
     *
     * // The `_.property` iteratee shorthand.
     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
     * // => [{ 'x': 1 }, { 'x': 2 }]
     */
    function uniqBy(array, iteratee) {
      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
    }

    /**
     * This method is like `_.uniq` except that it accepts `comparator` which
     * is invoked to compare elements of `array`. The order of result values is
     * determined by the order they occur in the array.The comparator is invoked
     * with two arguments: (arrVal, othVal).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new duplicate free array.
     * @example
     *
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
     *
     * _.uniqWith(objects, _.isEqual);
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
     */
    function uniqWith(array, comparator) {
      comparator = typeof comparator == 'function' ? comparator : undefined;
      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
    }

    /**
     * This method is like `_.zip` except that it accepts an array of grouped
     * elements and creates an array regrouping the elements to their pre-zip
     * configuration.
     *
     * @static
     * @memberOf _
     * @since 1.2.0
     * @category Array
     * @param {Array} array The array of grouped elements to process.
     * @returns {Array} Returns the new array of regrouped elements.
     * @example
     *
     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
     * // => [['a', 1, true], ['b', 2, false]]
     *
     * _.unzip(zipped);
     * // => [['a', 'b'], [1, 2], [true, false]]
     */
    function unzip(array) {
      if (!(array && array.length)) {
        return [];
      }
      var length = 0;
      array = arrayFilter(array, function(group) {
        if (isArrayLikeObject(group)) {
          length = nativeMax(group.length, length);
          return true;
        }
      });
      return baseTimes(length, function(index) {
        return arrayMap(array, baseProperty(index));
      });
    }

    /**
     * This method is like `_.unzip` except that it accepts `iteratee` to specify
     * how regrouped values should be combined. The iteratee is invoked with the
     * elements of each group: (...group).
     *
     * @static
     * @memberOf _
     * @since 3.8.0
     * @category Array
     * @param {Array} array The array of grouped elements to process.
     * @param {Function} [iteratee=_.identity] The function to combine
     *  regrouped values.
     * @returns {Array} Returns the new array of regrouped elements.
     * @example
     *
     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
     * // => [[1, 10, 100], [2, 20, 200]]
     *
     * _.unzipWith(zipped, _.add);
     * // => [3, 30, 300]
     */
    function unzipWith(array, iteratee) {
      if (!(array && array.length)) {
        return [];
      }
      var result = unzip(array);
      if (iteratee == null) {
        return result;
      }
      return arrayMap(result, function(group) {
        return apply(iteratee, undefined, group);
      });
    }

    /**
     * Creates an array excluding all given values using
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons.
     *
     * **Note:** Unlike `_.pull`, this method returns a new array.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {...*} [values] The values to exclude.
     * @returns {Array} Returns the new array of filtered values.
     * @see _.difference, _.xor
     * @example
     *
     * _.without([2, 1, 2, 3], 1, 2);
     * // => [3]
     */
    var without = baseRest(function(array, values) {
      return isArrayLikeObject(array)
        ? baseDifference(array, values)
        : [];
    });

    /**
     * Creates an array of unique values that is the
     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
     * of the given arrays. The order of result values is determined by the order
     * they occur in the arrays.
     *
     * @static
     * @memberOf _
     * @since 2.4.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @returns {Array} Returns the new array of filtered values.
     * @see _.difference, _.without
     * @example
     *
     * _.xor([2, 1], [2, 3]);
     * // => [1, 3]
     */
    var xor = baseRest(function(arrays) {
      return baseXor(arrayFilter(arrays, isArrayLikeObject));
    });

    /**
     * This method is like `_.xor` except that it accepts `iteratee` which is
     * invoked for each element of each `arrays` to generate the criterion by
     * which by which they're compared. The order of result values is determined
     * by the order they occur in the arrays. The iteratee is invoked with one
     * argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns the new array of filtered values.
     * @example
     *
     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
     * // => [1.2, 3.4]
     *
     * // The `_.property` iteratee shorthand.
     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
     * // => [{ 'x': 2 }]
     */
    var xorBy = baseRest(function(arrays) {
      var iteratee = last(arrays);
      if (isArrayLikeObject(iteratee)) {
        iteratee = undefined;
      }
      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
    });

    /**
     * This method is like `_.xor` except that it accepts `comparator` which is
     * invoked to compare elements of `arrays`. The order of result values is
     * determined by the order they occur in the arrays. The comparator is invoked
     * with two arguments: (arrVal, othVal).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of filtered values.
     * @example
     *
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
     *
     * _.xorWith(objects, others, _.isEqual);
     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
     */
    var xorWith = baseRest(function(arrays) {
      var comparator = last(arrays);
      comparator = typeof comparator == 'function' ? comparator : undefined;
      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
    });

    /**
     * Creates an array of grouped elements, the first of which contains the
     * first elements of the given arrays, the second of which contains the
     * second elements of the given arrays, and so on.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {...Array} [arrays] The arrays to process.
     * @returns {Array} Returns the new array of grouped elements.
     * @example
     *
     * _.zip(['a', 'b'], [1, 2], [true, false]);
     * // => [['a', 1, true], ['b', 2, false]]
     */
    var zip = baseRest(unzip);

    /**
     * This method is like `_.fromPairs` except that it accepts two arrays,
     * one of property identifiers and one of corresponding values.
     *
     * @static
     * @memberOf _
     * @since 0.4.0
     * @category Array
     * @param {Array} [props=[]] The property identifiers.
     * @param {Array} [values=[]] The property values.
     * @returns {Object} Returns the new object.
     * @example
     *
     * _.zipObject(['a', 'b'], [1, 2]);
     * // => { 'a': 1, 'b': 2 }
     */
    function zipObject(props, values) {
      return baseZipObject(props || [], values || [], assignValue);
    }

    /**
     * This method is like `_.zipObject` except that it supports property paths.
     *
     * @static
     * @memberOf _
     * @since 4.1.0
     * @category Array
     * @param {Array} [props=[]] The property identifiers.
     * @param {Array} [values=[]] The property values.
     * @returns {Object} Returns the new object.
     * @example
     *
     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
     */
    function zipObjectDeep(props, values) {
      return baseZipObject(props || [], values || [], baseSet);
    }

    /**
     * This method is like `_.zip` except that it accepts `iteratee` to specify
     * how grouped values should be combined. The iteratee is invoked with the
     * elements of each group: (...group).
     *
     * @static
     * @memberOf _
     * @since 3.8.0
     * @category Array
     * @param {...Array} [arrays] The arrays to process.
     * @param {Function} [iteratee=_.identity] The function to combine
     *  grouped values.
     * @returns {Array} Returns the new array of grouped elements.
     * @example
     *
     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
     *   return a + b + c;
     * });
     * // => [111, 222]
     */
    var zipWith = baseRest(function(arrays) {
      var length = arrays.length,
          iteratee = length > 1 ? arrays[length - 1] : undefined;

      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
      return unzipWith(arrays, iteratee);
    });

    /*------------------------------------------------------------------------*/

    /**
     * Creates a `lodash` wrapper instance that wraps `value` with explicit method
     * chain sequences enabled. The result of such sequences must be unwrapped
     * with `_#value`.
     *
     * @static
     * @memberOf _
     * @since 1.3.0
     * @category Seq
     * @param {*} value The value to wrap.
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'age': 36 },
     *   { 'user': 'fred',    'age': 40 },
     *   { 'user': 'pebbles', 'age': 1 }
     * ];
     *
     * var youngest = _
     *   .chain(users)
     *   .sortBy('age')
     *   .map(function(o) {
     *     return o.user + ' is ' + o.age;
     *   })
     *   .head()
     *   .value();
     * // => 'pebbles is 1'
     */
    function chain(value) {
      var result = lodash(value);
      result.__chain__ = true;
      return result;
    }

    /**
     * This method invokes `interceptor` and returns `value`. The interceptor
     * is invoked with one argument; (value). The purpose of this method is to
     * "tap into" a method chain sequence in order to modify intermediate results.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Seq
     * @param {*} value The value to provide to `interceptor`.
     * @param {Function} interceptor The function to invoke.
     * @returns {*} Returns `value`.
     * @example
     *
     * _([1, 2, 3])
     *  .tap(function(array) {
     *    // Mutate input array.
     *    array.pop();
     *  })
     *  .reverse()
     *  .value();
     * // => [2, 1]
     */
    function tap(value, interceptor) {
      interceptor(value);
      return value;
    }

    /**
     * This method is like `_.tap` except that it returns the result of `interceptor`.
     * The purpose of this method is to "pass thru" values replacing intermediate
     * results in a method chain sequence.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Seq
     * @param {*} value The value to provide to `interceptor`.
     * @param {Function} interceptor The function to invoke.
     * @returns {*} Returns the result of `interceptor`.
     * @example
     *
     * _('  abc  ')
     *  .chain()
     *  .trim()
     *  .thru(function(value) {
     *    return [value];
     *  })
     *  .value();
     * // => ['abc']
     */
    function thru(value, interceptor) {
      return interceptor(value);
    }

    /**
     * This method is the wrapper version of `_.at`.
     *
     * @name at
     * @memberOf _
     * @since 1.0.0
     * @category Seq
     * @param {...(string|string[])} [paths] The property paths to pick.
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
     *
     * _(object).at(['a[0].b.c', 'a[1]']).value();
     * // => [3, 4]
     */
    var wrapperAt = flatRest(function(paths) {
      var length = paths.length,
          start = length ? paths[0] : 0,
          value = this.__wrapped__,
          interceptor = function(object) { return baseAt(object, paths); };

      if (length > 1 || this.__actions__.length ||
          !(value instanceof LazyWrapper) || !isIndex(start)) {
        return this.thru(interceptor);
      }
      value = value.slice(start, +start + (length ? 1 : 0));
      value.__actions__.push({
        'func': thru,
        'args': [interceptor],
        'thisArg': undefined
      });
      return new LodashWrapper(value, this.__chain__).thru(function(array) {
        if (length && !array.length) {
          array.push(undefined);
        }
        return array;
      });
    });

    /**
     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
     *
     * @name chain
     * @memberOf _
     * @since 0.1.0
     * @category Seq
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * var users = [
     *   { 'user': 'barney', 'age': 36 },
     *   { 'user': 'fred',   'age': 40 }
     * ];
     *
     * // A sequence without explicit chaining.
     * _(users).head();
     * // => { 'user': 'barney', 'age': 36 }
     *
     * // A sequence with explicit chaining.
     * _(users)
     *   .chain()
     *   .head()
     *   .pick('user')
     *   .value();
     * // => { 'user': 'barney' }
     */
    function wrapperChain() {
      return chain(this);
    }

    /**
     * Executes the chain sequence and returns the wrapped result.
     *
     * @name commit
     * @memberOf _
     * @since 3.2.0
     * @category Seq
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * var array = [1, 2];
     * var wrapped = _(array).push(3);
     *
     * console.log(array);
     * // => [1, 2]
     *
     * wrapped = wrapped.commit();
     * console.log(array);
     * // => [1, 2, 3]
     *
     * wrapped.last();
     * // => 3
     *
     * console.log(array);
     * // => [1, 2, 3]
     */
    function wrapperCommit() {
      return new LodashWrapper(this.value(), this.__chain__);
    }

    /**
     * Gets the next value on a wrapped object following the
     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
     *
     * @name next
     * @memberOf _
     * @since 4.0.0
     * @category Seq
     * @returns {Object} Returns the next iterator value.
     * @example
     *
     * var wrapped = _([1, 2]);
     *
     * wrapped.next();
     * // => { 'done': false, 'value': 1 }
     *
     * wrapped.next();
     * // => { 'done': false, 'value': 2 }
     *
     * wrapped.next();
     * // => { 'done': true, 'value': undefined }
     */
    function wrapperNext() {
      if (this.__values__ === undefined) {
        this.__values__ = toArray(this.value());
      }
      var done = this.__index__ >= this.__values__.length,
          value = done ? undefined : this.__values__[this.__index__++];

      return { 'done': done, 'value': value };
    }

    /**
     * Enables the wrapper to be iterable.
     *
     * @name Symbol.iterator
     * @memberOf _
     * @since 4.0.0
     * @category Seq
     * @returns {Object} Returns the wrapper object.
     * @example
     *
     * var wrapped = _([1, 2]);
     *
     * wrapped[Symbol.iterator]() === wrapped;
     * // => true
     *
     * Array.from(wrapped);
     * // => [1, 2]
     */
    function wrapperToIterator() {
      return this;
    }

    /**
     * Creates a clone of the chain sequence planting `value` as the wrapped value.
     *
     * @name plant
     * @memberOf _
     * @since 3.2.0
     * @category Seq
     * @param {*} value The value to plant.
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * var wrapped = _([1, 2]).map(square);
     * var other = wrapped.plant([3, 4]);
     *
     * other.value();
     * // => [9, 16]
     *
     * wrapped.value();
     * // => [1, 4]
     */
    function wrapperPlant(value) {
      var result,
          parent = this;

      while (parent instanceof baseLodash) {
        var clone = wrapperClone(parent);
        clone.__index__ = 0;
        clone.__values__ = undefined;
        if (result) {
          previous.__wrapped__ = clone;
        } else {
          result = clone;
        }
        var previous = clone;
        parent = parent.__wrapped__;
      }
      previous.__wrapped__ = value;
      return result;
    }

    /**
     * This method is the wrapper version of `_.reverse`.
     *
     * **Note:** This method mutates the wrapped array.
     *
     * @name reverse
     * @memberOf _
     * @since 0.1.0
     * @category Seq
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * var array = [1, 2, 3];
     *
     * _(array).reverse().value()
     * // => [3, 2, 1]
     *
     * console.log(array);
     * // => [3, 2, 1]
     */
    function wrapperReverse() {
      var value = this.__wrapped__;
      if (value instanceof LazyWrapper) {
        var wrapped = value;
        if (this.__actions__.length) {
          wrapped = new LazyWrapper(this);
        }
        wrapped = wrapped.reverse();
        wrapped.__actions__.push({
          'func': thru,
          'args': [reverse],
          'thisArg': undefined
        });
        return new LodashWrapper(wrapped, this.__chain__);
      }
      return this.thru(reverse);
    }

    /**
     * Executes the chain sequence to resolve the unwrapped value.
     *
     * @name value
     * @memberOf _
     * @since 0.1.0
     * @alias toJSON, valueOf
     * @category Seq
     * @returns {*} Returns the resolved unwrapped value.
     * @example
     *
     * _([1, 2, 3]).value();
     * // => [1, 2, 3]
     */
    function wrapperValue() {
      return baseWrapperValue(this.__wrapped__, this.__actions__);
    }

    /*------------------------------------------------------------------------*/

    /**
     * Creates an object composed of keys generated from the results of running
     * each element of `collection` thru `iteratee`. The corresponding value of
     * each key is the number of times the key was returned by `iteratee`. The
     * iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 0.5.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
     * @returns {Object} Returns the composed aggregate object.
     * @example
     *
     * _.countBy([6.1, 4.2, 6.3], Math.floor);
     * // => { '4': 1, '6': 2 }
     *
     * // The `_.property` iteratee shorthand.
     * _.countBy(['one', 'two', 'three'], 'length');
     * // => { '3': 2, '5': 1 }
     */
    var countBy = createAggregator(function(result, value, key) {
      if (hasOwnProperty.call(result, key)) {
        ++result[key];
      } else {
        baseAssignValue(result, key, 1);
      }
    });

    /**
     * Checks if `predicate` returns truthy for **all** elements of `collection`.
     * Iteration is stopped once `predicate` returns falsey. The predicate is
     * invoked with three arguments: (value, index|key, collection).
     *
     * **Note:** This method returns `true` for
     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
     * elements of empty collections.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {boolean} Returns `true` if all elements pass the predicate check,
     *  else `false`.
     * @example
     *
     * _.every([true, 1, null, 'yes'], Boolean);
     * // => false
     *
     * var users = [
     *   { 'user': 'barney', 'age': 36, 'active': false },
     *   { 'user': 'fred',   'age': 40, 'active': false }
     * ];
     *
     * // The `_.matches` iteratee shorthand.
     * _.every(users, { 'user': 'barney', 'active': false });
     * // => false
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.every(users, ['active', false]);
     * // => true
     *
     * // The `_.property` iteratee shorthand.
     * _.every(users, 'active');
     * // => false
     */
    function every(collection, predicate, guard) {
      var func = isArray(collection) ? arrayEvery : baseEvery;
      if (guard && isIterateeCall(collection, predicate, guard)) {
        predicate = undefined;
      }
      return func(collection, getIteratee(predicate, 3));
    }

    /**
     * Iterates over elements of `collection`, returning an array of all elements
     * `predicate` returns truthy for. The predicate is invoked with three
     * arguments: (value, index|key, collection).
     *
     * **Note:** Unlike `_.remove`, this method returns a new array.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new filtered array.
     * @see _.reject
     * @example
     *
     * var users = [
     *   { 'user': 'barney', 'age': 36, 'active': true },
     *   { 'user': 'fred',   'age': 40, 'active': false }
     * ];
     *
     * _.filter(users, function(o) { return !o.active; });
     * // => objects for ['fred']
     *
     * // The `_.matches` iteratee shorthand.
     * _.filter(users, { 'age': 36, 'active': true });
     * // => objects for ['barney']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.filter(users, ['active', false]);
     * // => objects for ['fred']
     *
     * // The `_.property` iteratee shorthand.
     * _.filter(users, 'active');
     * // => objects for ['barney']
     *
     * // Combining several predicates using `_.overEvery` or `_.overSome`.
     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
     * // => objects for ['fred', 'barney']
     */
    function filter(collection, predicate) {
      var func = isArray(collection) ? arrayFilter : baseFilter;
      return func(collection, getIteratee(predicate, 3));
    }

    /**
     * Iterates over elements of `collection`, returning the first element
     * `predicate` returns truthy for. The predicate is invoked with three
     * arguments: (value, index|key, collection).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param {number} [fromIndex=0] The index to search from.
     * @returns {*} Returns the matched element, else `undefined`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'age': 36, 'active': true },
     *   { 'user': 'fred',    'age': 40, 'active': false },
     *   { 'user': 'pebbles', 'age': 1,  'active': true }
     * ];
     *
     * _.find(users, function(o) { return o.age < 40; });
     * // => object for 'barney'
     *
     * // The `_.matches` iteratee shorthand.
     * _.find(users, { 'age': 1, 'active': true });
     * // => object for 'pebbles'
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.find(users, ['active', false]);
     * // => object for 'fred'
     *
     * // The `_.property` iteratee shorthand.
     * _.find(users, 'active');
     * // => object for 'barney'
     */
    var find = createFind(findIndex);

    /**
     * This method is like `_.find` except that it iterates over elements of
     * `collection` from right to left.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param {number} [fromIndex=collection.length-1] The index to search from.
     * @returns {*} Returns the matched element, else `undefined`.
     * @example
     *
     * _.findLast([1, 2, 3, 4], function(n) {
     *   return n % 2 == 1;
     * });
     * // => 3
     */
    var findLast = createFind(findLastIndex);

    /**
     * Creates a flattened array of values by running each element in `collection`
     * thru `iteratee` and flattening the mapped results. The iteratee is invoked
     * with three arguments: (value, index|key, collection).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * function duplicate(n) {
     *   return [n, n];
     * }
     *
     * _.flatMap([1, 2], duplicate);
     * // => [1, 1, 2, 2]
     */
    function flatMap(collection, iteratee) {
      return baseFlatten(map(collection, iteratee), 1);
    }

    /**
     * This method is like `_.flatMap` except that it recursively flattens the
     * mapped results.
     *
     * @static
     * @memberOf _
     * @since 4.7.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * function duplicate(n) {
     *   return [[[n, n]]];
     * }
     *
     * _.flatMapDeep([1, 2], duplicate);
     * // => [1, 1, 2, 2]
     */
    function flatMapDeep(collection, iteratee) {
      return baseFlatten(map(collection, iteratee), INFINITY);
    }

    /**
     * This method is like `_.flatMap` except that it recursively flattens the
     * mapped results up to `depth` times.
     *
     * @static
     * @memberOf _
     * @since 4.7.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @param {number} [depth=1] The maximum recursion depth.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * function duplicate(n) {
     *   return [[[n, n]]];
     * }
     *
     * _.flatMapDepth([1, 2], duplicate, 2);
     * // => [[1, 1], [2, 2]]
     */
    function flatMapDepth(collection, iteratee, depth) {
      depth = depth === undefined ? 1 : toInteger(depth);
      return baseFlatten(map(collection, iteratee), depth);
    }

    /**
     * Iterates over elements of `collection` and invokes `iteratee` for each element.
     * The iteratee is invoked with three arguments: (value, index|key, collection).
     * Iteratee functions may exit iteration early by explicitly returning `false`.
     *
     * **Note:** As with other "Collections" methods, objects with a "length"
     * property are iterated like arrays. To avoid this behavior use `_.forIn`
     * or `_.forOwn` for object iteration.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @alias each
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array|Object} Returns `collection`.
     * @see _.forEachRight
     * @example
     *
     * _.forEach([1, 2], function(value) {
     *   console.log(value);
     * });
     * // => Logs `1` then `2`.
     *
     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
     *   console.log(key);
     * });
     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
     */
    function forEach(collection, iteratee) {
      var func = isArray(collection) ? arrayEach : baseEach;
      return func(collection, getIteratee(iteratee, 3));
    }

    /**
     * This method is like `_.forEach` except that it iterates over elements of
     * `collection` from right to left.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @alias eachRight
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array|Object} Returns `collection`.
     * @see _.forEach
     * @example
     *
     * _.forEachRight([1, 2], function(value) {
     *   console.log(value);
     * });
     * // => Logs `2` then `1`.
     */
    function forEachRight(collection, iteratee) {
      var func = isArray(collection) ? arrayEachRight : baseEachRight;
      return func(collection, getIteratee(iteratee, 3));
    }

    /**
     * Creates an object composed of keys generated from the results of running
     * each element of `collection` thru `iteratee`. The order of grouped values
     * is determined by the order they occur in `collection`. The corresponding
     * value of each key is an array of elements responsible for generating the
     * key. The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
     * @returns {Object} Returns the composed aggregate object.
     * @example
     *
     * _.groupBy([6.1, 4.2, 6.3], Math.floor);
     * // => { '4': [4.2], '6': [6.1, 6.3] }
     *
     * // The `_.property` iteratee shorthand.
     * _.groupBy(['one', 'two', 'three'], 'length');
     * // => { '3': ['one', 'two'], '5': ['three'] }
     */
    var groupBy = createAggregator(function(result, value, key) {
      if (hasOwnProperty.call(result, key)) {
        result[key].push(value);
      } else {
        baseAssignValue(result, key, [value]);
      }
    });

    /**
     * Checks if `value` is in `collection`. If `collection` is a string, it's
     * checked for a substring of `value`, otherwise
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * is used for equality comparisons. If `fromIndex` is negative, it's used as
     * the offset from the end of `collection`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object|string} collection The collection to inspect.
     * @param {*} value The value to search for.
     * @param {number} [fromIndex=0] The index to search from.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
     * @returns {boolean} Returns `true` if `value` is found, else `false`.
     * @example
     *
     * _.includes([1, 2, 3], 1);
     * // => true
     *
     * _.includes([1, 2, 3], 1, 2);
     * // => false
     *
     * _.includes({ 'a': 1, 'b': 2 }, 1);
     * // => true
     *
     * _.includes('abcd', 'bc');
     * // => true
     */
    function includes(collection, value, fromIndex, guard) {
      collection = isArrayLike(collection) ? collection : values(collection);
      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;

      var length = collection.length;
      if (fromIndex < 0) {
        fromIndex = nativeMax(length + fromIndex, 0);
      }
      return isString(collection)
        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
    }

    /**
     * Invokes the method at `path` of each element in `collection`, returning
     * an array of the results of each invoked method. Any additional arguments
     * are provided to each invoked method. If `path` is a function, it's invoked
     * for, and `this` bound to, each element in `collection`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Array|Function|string} path The path of the method to invoke or
     *  the function invoked per iteration.
     * @param {...*} [args] The arguments to invoke each method with.
     * @returns {Array} Returns the array of results.
     * @example
     *
     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
     * // => [[1, 5, 7], [1, 2, 3]]
     *
     * _.invokeMap([123, 456], String.prototype.split, '');
     * // => [['1', '2', '3'], ['4', '5', '6']]
     */
    var invokeMap = baseRest(function(collection, path, args) {
      var index = -1,
          isFunc = typeof path == 'function',
          result = isArrayLike(collection) ? Array(collection.length) : [];

      baseEach(collection, function(value) {
        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
      });
      return result;
    });

    /**
     * Creates an object composed of keys generated from the results of running
     * each element of `collection` thru `iteratee`. The corresponding value of
     * each key is the last element responsible for generating the key. The
     * iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
     * @returns {Object} Returns the composed aggregate object.
     * @example
     *
     * var array = [
     *   { 'dir': 'left', 'code': 97 },
     *   { 'dir': 'right', 'code': 100 }
     * ];
     *
     * _.keyBy(array, function(o) {
     *   return String.fromCharCode(o.code);
     * });
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
     *
     * _.keyBy(array, 'dir');
     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
     */
    var keyBy = createAggregator(function(result, value, key) {
      baseAssignValue(result, key, value);
    });

    /**
     * Creates an array of values by running each element in `collection` thru
     * `iteratee`. The iteratee is invoked with three arguments:
     * (value, index|key, collection).
     *
     * Many lodash methods are guarded to work as iteratees for methods like
     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
     *
     * The guarded methods are:
     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new mapped array.
     * @example
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * _.map([4, 8], square);
     * // => [16, 64]
     *
     * _.map({ 'a': 4, 'b': 8 }, square);
     * // => [16, 64] (iteration order is not guaranteed)
     *
     * var users = [
     *   { 'user': 'barney' },
     *   { 'user': 'fred' }
     * ];
     *
     * // The `_.property` iteratee shorthand.
     * _.map(users, 'user');
     * // => ['barney', 'fred']
     */
    function map(collection, iteratee) {
      var func = isArray(collection) ? arrayMap : baseMap;
      return func(collection, getIteratee(iteratee, 3));
    }

    /**
     * This method is like `_.sortBy` except that it allows specifying the sort
     * orders of the iteratees to sort by. If `orders` is unspecified, all values
     * are sorted in ascending order. Otherwise, specify an order of "desc" for
     * descending or "asc" for ascending sort order of corresponding values.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
     *  The iteratees to sort by.
     * @param {string[]} [orders] The sort orders of `iteratees`.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
     * @returns {Array} Returns the new sorted array.
     * @example
     *
     * var users = [
     *   { 'user': 'fred',   'age': 48 },
     *   { 'user': 'barney', 'age': 34 },
     *   { 'user': 'fred',   'age': 40 },
     *   { 'user': 'barney', 'age': 36 }
     * ];
     *
     * // Sort by `user` in ascending order and by `age` in descending order.
     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
     */
    function orderBy(collection, iteratees, orders, guard) {
      if (collection == null) {
        return [];
      }
      if (!isArray(iteratees)) {
        iteratees = iteratees == null ? [] : [iteratees];
      }
      orders = guard ? undefined : orders;
      if (!isArray(orders)) {
        orders = orders == null ? [] : [orders];
      }
      return baseOrderBy(collection, iteratees, orders);
    }

    /**
     * Creates an array of elements split into two groups, the first of which
     * contains elements `predicate` returns truthy for, the second of which
     * contains elements `predicate` returns falsey for. The predicate is
     * invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the array of grouped elements.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'age': 36, 'active': false },
     *   { 'user': 'fred',    'age': 40, 'active': true },
     *   { 'user': 'pebbles', 'age': 1,  'active': false }
     * ];
     *
     * _.partition(users, function(o) { return o.active; });
     * // => objects for [['fred'], ['barney', 'pebbles']]
     *
     * // The `_.matches` iteratee shorthand.
     * _.partition(users, { 'age': 1, 'active': false });
     * // => objects for [['pebbles'], ['barney', 'fred']]
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.partition(users, ['active', false]);
     * // => objects for [['barney', 'pebbles'], ['fred']]
     *
     * // The `_.property` iteratee shorthand.
     * _.partition(users, 'active');
     * // => objects for [['fred'], ['barney', 'pebbles']]
     */
    var partition = createAggregator(function(result, value, key) {
      result[key ? 0 : 1].push(value);
    }, function() { return [[], []]; });

    /**
     * Reduces `collection` to a value which is the accumulated result of running
     * each element in `collection` thru `iteratee`, where each successive
     * invocation is supplied the return value of the previous. If `accumulator`
     * is not given, the first element of `collection` is used as the initial
     * value. The iteratee is invoked with four arguments:
     * (accumulator, value, index|key, collection).
     *
     * Many lodash methods are guarded to work as iteratees for methods like
     * `_.reduce`, `_.reduceRight`, and `_.transform`.
     *
     * The guarded methods are:
     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
     * and `sortBy`
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @param {*} [accumulator] The initial value.
     * @returns {*} Returns the accumulated value.
     * @see _.reduceRight
     * @example
     *
     * _.reduce([1, 2], function(sum, n) {
     *   return sum + n;
     * }, 0);
     * // => 3
     *
     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
     *   (result[value] || (result[value] = [])).push(key);
     *   return result;
     * }, {});
     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
     */
    function reduce(collection, iteratee, accumulator) {
      var func = isArray(collection) ? arrayReduce : baseReduce,
          initAccum = arguments.length < 3;

      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
    }

    /**
     * This method is like `_.reduce` except that it iterates over elements of
     * `collection` from right to left.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @param {*} [accumulator] The initial value.
     * @returns {*} Returns the accumulated value.
     * @see _.reduce
     * @example
     *
     * var array = [[0, 1], [2, 3], [4, 5]];
     *
     * _.reduceRight(array, function(flattened, other) {
     *   return flattened.concat(other);
     * }, []);
     * // => [4, 5, 2, 3, 0, 1]
     */
    function reduceRight(collection, iteratee, accumulator) {
      var func = isArray(collection) ? arrayReduceRight : baseReduce,
          initAccum = arguments.length < 3;

      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
    }

    /**
     * The opposite of `_.filter`; this method returns the elements of `collection`
     * that `predicate` does **not** return truthy for.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new filtered array.
     * @see _.filter
     * @example
     *
     * var users = [
     *   { 'user': 'barney', 'age': 36, 'active': false },
     *   { 'user': 'fred',   'age': 40, 'active': true }
     * ];
     *
     * _.reject(users, function(o) { return !o.active; });
     * // => objects for ['fred']
     *
     * // The `_.matches` iteratee shorthand.
     * _.reject(users, { 'age': 40, 'active': true });
     * // => objects for ['barney']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.reject(users, ['active', false]);
     * // => objects for ['fred']
     *
     * // The `_.property` iteratee shorthand.
     * _.reject(users, 'active');
     * // => objects for ['barney']
     */
    function reject(collection, predicate) {
      var func = isArray(collection) ? arrayFilter : baseFilter;
      return func(collection, negate(getIteratee(predicate, 3)));
    }

    /**
     * Gets a random element from `collection`.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to sample.
     * @returns {*} Returns the random element.
     * @example
     *
     * _.sample([1, 2, 3, 4]);
     * // => 2
     */
    function sample(collection) {
      var func = isArray(collection) ? arraySample : baseSample;
      return func(collection);
    }

    /**
     * Gets `n` random elements at unique keys from `collection` up to the
     * size of `collection`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to sample.
     * @param {number} [n=1] The number of elements to sample.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the random elements.
     * @example
     *
     * _.sampleSize([1, 2, 3], 2);
     * // => [3, 1]
     *
     * _.sampleSize([1, 2, 3], 4);
     * // => [2, 3, 1]
     */
    function sampleSize(collection, n, guard) {
      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
        n = 1;
      } else {
        n = toInteger(n);
      }
      var func = isArray(collection) ? arraySampleSize : baseSampleSize;
      return func(collection, n);
    }

    /**
     * Creates an array of shuffled values, using a version of the
     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to shuffle.
     * @returns {Array} Returns the new shuffled array.
     * @example
     *
     * _.shuffle([1, 2, 3, 4]);
     * // => [4, 1, 3, 2]
     */
    function shuffle(collection) {
      var func = isArray(collection) ? arrayShuffle : baseShuffle;
      return func(collection);
    }

    /**
     * Gets the size of `collection` by returning its length for array-like
     * values or the number of own enumerable string keyed properties for objects.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object|string} collection The collection to inspect.
     * @returns {number} Returns the collection size.
     * @example
     *
     * _.size([1, 2, 3]);
     * // => 3
     *
     * _.size({ 'a': 1, 'b': 2 });
     * // => 2
     *
     * _.size('pebbles');
     * // => 7
     */
    function size(collection) {
      if (collection == null) {
        return 0;
      }
      if (isArrayLike(collection)) {
        return isString(collection) ? stringSize(collection) : collection.length;
      }
      var tag = getTag(collection);
      if (tag == mapTag || tag == setTag) {
        return collection.size;
      }
      return baseKeys(collection).length;
    }

    /**
     * Checks if `predicate` returns truthy for **any** element of `collection`.
     * Iteration is stopped once `predicate` returns truthy. The predicate is
     * invoked with three arguments: (value, index|key, collection).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {boolean} Returns `true` if any element passes the predicate check,
     *  else `false`.
     * @example
     *
     * _.some([null, 0, 'yes', false], Boolean);
     * // => true
     *
     * var users = [
     *   { 'user': 'barney', 'active': true },
     *   { 'user': 'fred',   'active': false }
     * ];
     *
     * // The `_.matches` iteratee shorthand.
     * _.some(users, { 'user': 'barney', 'active': false });
     * // => false
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.some(users, ['active', false]);
     * // => true
     *
     * // The `_.property` iteratee shorthand.
     * _.some(users, 'active');
     * // => true
     */
    function some(collection, predicate, guard) {
      var func = isArray(collection) ? arraySome : baseSome;
      if (guard && isIterateeCall(collection, predicate, guard)) {
        predicate = undefined;
      }
      return func(collection, getIteratee(predicate, 3));
    }

    /**
     * Creates an array of elements, sorted in ascending order by the results of
     * running each element in a collection thru each iteratee. This method
     * performs a stable sort, that is, it preserves the original sort order of
     * equal elements. The iteratees are invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {...(Function|Function[])} [iteratees=[_.identity]]
     *  The iteratees to sort by.
     * @returns {Array} Returns the new sorted array.
     * @example
     *
     * var users = [
     *   { 'user': 'fred',   'age': 48 },
     *   { 'user': 'barney', 'age': 36 },
     *   { 'user': 'fred',   'age': 30 },
     *   { 'user': 'barney', 'age': 34 }
     * ];
     *
     * _.sortBy(users, [function(o) { return o.user; }]);
     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
     *
     * _.sortBy(users, ['user', 'age']);
     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
     */
    var sortBy = baseRest(function(collection, iteratees) {
      if (collection == null) {
        return [];
      }
      var length = iteratees.length;
      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
        iteratees = [];
      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
        iteratees = [iteratees[0]];
      }
      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
    });

    /*------------------------------------------------------------------------*/

    /**
     * Gets the timestamp of the number of milliseconds that have elapsed since
     * the Unix epoch (1 January 1970 00:00:00 UTC).
     *
     * @static
     * @memberOf _
     * @since 2.4.0
     * @category Date
     * @returns {number} Returns the timestamp.
     * @example
     *
     * _.defer(function(stamp) {
     *   console.log(_.now() - stamp);
     * }, _.now());
     * // => Logs the number of milliseconds it took for the deferred invocation.
     */
    var now = ctxNow || function() {
      return root.Date.now();
    };

    /*------------------------------------------------------------------------*/

    /**
     * The opposite of `_.before`; this method creates a function that invokes
     * `func` once it's called `n` or more times.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {number} n The number of calls before `func` is invoked.
     * @param {Function} func The function to restrict.
     * @returns {Function} Returns the new restricted function.
     * @example
     *
     * var saves = ['profile', 'settings'];
     *
     * var done = _.after(saves.length, function() {
     *   console.log('done saving!');
     * });
     *
     * _.forEach(saves, function(type) {
     *   asyncSave({ 'type': type, 'complete': done });
     * });
     * // => Logs 'done saving!' after the two async saves have completed.
     */
    function after(n, func) {
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      n = toInteger(n);
      return function() {
        if (--n < 1) {
          return func.apply(this, arguments);
        }
      };
    }

    /**
     * Creates a function that invokes `func`, with up to `n` arguments,
     * ignoring any additional arguments.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Function
     * @param {Function} func The function to cap arguments for.
     * @param {number} [n=func.length] The arity cap.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Function} Returns the new capped function.
     * @example
     *
     * _.map(['6', '8', '10'], _.ary(parseInt, 1));
     * // => [6, 8, 10]
     */
    function ary(func, n, guard) {
      n = guard ? undefined : n;
      n = (func && n == null) ? func.length : n;
      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
    }

    /**
     * Creates a function that invokes `func`, with the `this` binding and arguments
     * of the created function, while it's called less than `n` times. Subsequent
     * calls to the created function return the result of the last `func` invocation.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Function
     * @param {number} n The number of calls at which `func` is no longer invoked.
     * @param {Function} func The function to restrict.
     * @returns {Function} Returns the new restricted function.
     * @example
     *
     * jQuery(element).on('click', _.before(5, addContactToList));
     * // => Allows adding up to 4 contacts to the list.
     */
    function before(n, func) {
      var result;
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      n = toInteger(n);
      return function() {
        if (--n > 0) {
          result = func.apply(this, arguments);
        }
        if (n <= 1) {
          func = undefined;
        }
        return result;
      };
    }

    /**
     * Creates a function that invokes `func` with the `this` binding of `thisArg`
     * and `partials` prepended to the arguments it receives.
     *
     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
     * may be used as a placeholder for partially applied arguments.
     *
     * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
     * property of bound functions.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to bind.
     * @param {*} thisArg The `this` binding of `func`.
     * @param {...*} [partials] The arguments to be partially applied.
     * @returns {Function} Returns the new bound function.
     * @example
     *
     * function greet(greeting, punctuation) {
     *   return greeting + ' ' + this.user + punctuation;
     * }
     *
     * var object = { 'user': 'fred' };
     *
     * var bound = _.bind(greet, object, 'hi');
     * bound('!');
     * // => 'hi fred!'
     *
     * // Bound with placeholders.
     * var bound = _.bind(greet, object, _, '!');
     * bound('hi');
     * // => 'hi fred!'
     */
    var bind = baseRest(function(func, thisArg, partials) {
      var bitmask = WRAP_BIND_FLAG;
      if (partials.length) {
        var holders = replaceHolders(partials, getHolder(bind));
        bitmask |= WRAP_PARTIAL_FLAG;
      }
      return createWrap(func, bitmask, thisArg, partials, holders);
    });

    /**
     * Creates a function that invokes the method at `object[key]` with `partials`
     * prepended to the arguments it receives.
     *
     * This method differs from `_.bind` by allowing bound functions to reference
     * methods that may be redefined or don't yet exist. See
     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
     * for more details.
     *
     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
     * builds, may be used as a placeholder for partially applied arguments.
     *
     * @static
     * @memberOf _
     * @since 0.10.0
     * @category Function
     * @param {Object} object The object to invoke the method on.
     * @param {string} key The key of the method.
     * @param {...*} [partials] The arguments to be partially applied.
     * @returns {Function} Returns the new bound function.
     * @example
     *
     * var object = {
     *   'user': 'fred',
     *   'greet': function(greeting, punctuation) {
     *     return greeting + ' ' + this.user + punctuation;
     *   }
     * };
     *
     * var bound = _.bindKey(object, 'greet', 'hi');
     * bound('!');
     * // => 'hi fred!'
     *
     * object.greet = function(greeting, punctuation) {
     *   return greeting + 'ya ' + this.user + punctuation;
     * };
     *
     * bound('!');
     * // => 'hiya fred!'
     *
     * // Bound with placeholders.
     * var bound = _.bindKey(object, 'greet', _, '!');
     * bound('hi');
     * // => 'hiya fred!'
     */
    var bindKey = baseRest(function(object, key, partials) {
      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
      if (partials.length) {
        var holders = replaceHolders(partials, getHolder(bindKey));
        bitmask |= WRAP_PARTIAL_FLAG;
      }
      return createWrap(key, bitmask, object, partials, holders);
    });

    /**
     * Creates a function that accepts arguments of `func` and either invokes
     * `func` returning its result, if at least `arity` number of arguments have
     * been provided, or returns a function that accepts the remaining `func`
     * arguments, and so on. The arity of `func` may be specified if `func.length`
     * is not sufficient.
     *
     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
     * may be used as a placeholder for provided arguments.
     *
     * **Note:** This method doesn't set the "length" property of curried functions.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Function
     * @param {Function} func The function to curry.
     * @param {number} [arity=func.length] The arity of `func`.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Function} Returns the new curried function.
     * @example
     *
     * var abc = function(a, b, c) {
     *   return [a, b, c];
     * };
     *
     * var curried = _.curry(abc);
     *
     * curried(1)(2)(3);
     * // => [1, 2, 3]
     *
     * curried(1, 2)(3);
     * // => [1, 2, 3]
     *
     * curried(1, 2, 3);
     * // => [1, 2, 3]
     *
     * // Curried with placeholders.
     * curried(1)(_, 3)(2);
     * // => [1, 2, 3]
     */
    function curry(func, arity, guard) {
      arity = guard ? undefined : arity;
      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
      result.placeholder = curry.placeholder;
      return result;
    }

    /**
     * This method is like `_.curry` except that arguments are applied to `func`
     * in the manner of `_.partialRight` instead of `_.partial`.
     *
     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
     * builds, may be used as a placeholder for provided arguments.
     *
     * **Note:** This method doesn't set the "length" property of curried functions.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Function
     * @param {Function} func The function to curry.
     * @param {number} [arity=func.length] The arity of `func`.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Function} Returns the new curried function.
     * @example
     *
     * var abc = function(a, b, c) {
     *   return [a, b, c];
     * };
     *
     * var curried = _.curryRight(abc);
     *
     * curried(3)(2)(1);
     * // => [1, 2, 3]
     *
     * curried(2, 3)(1);
     * // => [1, 2, 3]
     *
     * curried(1, 2, 3);
     * // => [1, 2, 3]
     *
     * // Curried with placeholders.
     * curried(3)(1, _)(2);
     * // => [1, 2, 3]
     */
    function curryRight(func, arity, guard) {
      arity = guard ? undefined : arity;
      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
      result.placeholder = curryRight.placeholder;
      return result;
    }

    /**
     * Creates a debounced function that delays invoking `func` until after `wait`
     * milliseconds have elapsed since the last time the debounced function was
     * invoked. The debounced function comes with a `cancel` method to cancel
     * delayed `func` invocations and a `flush` method to immediately invoke them.
     * Provide `options` to indicate whether `func` should be invoked on the
     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
     * with the last arguments provided to the debounced function. Subsequent
     * calls to the debounced function return the result of the last `func`
     * invocation.
     *
     * **Note:** If `leading` and `trailing` options are `true`, `func` is
     * invoked on the trailing edge of the timeout only if the debounced function
     * is invoked more than once during the `wait` timeout.
     *
     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
     *
     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
     * for details over the differences between `_.debounce` and `_.throttle`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to debounce.
     * @param {number} [wait=0] The number of milliseconds to delay.
     * @param {Object} [options={}] The options object.
     * @param {boolean} [options.leading=false]
     *  Specify invoking on the leading edge of the timeout.
     * @param {number} [options.maxWait]
     *  The maximum time `func` is allowed to be delayed before it's invoked.
     * @param {boolean} [options.trailing=true]
     *  Specify invoking on the trailing edge of the timeout.
     * @returns {Function} Returns the new debounced function.
     * @example
     *
     * // Avoid costly calculations while the window size is in flux.
     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
     *
     * // Invoke `sendMail` when clicked, debouncing subsequent calls.
     * jQuery(element).on('click', _.debounce(sendMail, 300, {
     *   'leading': true,
     *   'trailing': false
     * }));
     *
     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
     * var source = new EventSource('/stream');
     * jQuery(source).on('message', debounced);
     *
     * // Cancel the trailing debounced invocation.
     * jQuery(window).on('popstate', debounced.cancel);
     */
    function debounce(func, wait, options) {
      var lastArgs,
          lastThis,
          maxWait,
          result,
          timerId,
          lastCallTime,
          lastInvokeTime = 0,
          leading = false,
          maxing = false,
          trailing = true;

      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      wait = toNumber(wait) || 0;
      if (isObject(options)) {
        leading = !!options.leading;
        maxing = 'maxWait' in options;
        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
        trailing = 'trailing' in options ? !!options.trailing : trailing;
      }

      function invokeFunc(time) {
        var args = lastArgs,
            thisArg = lastThis;

        lastArgs = lastThis = undefined;
        lastInvokeTime = time;
        result = func.apply(thisArg, args);
        return result;
      }

      function leadingEdge(time) {
        // Reset any `maxWait` timer.
        lastInvokeTime = time;
        // Start the timer for the trailing edge.
        timerId = setTimeout(timerExpired, wait);
        // Invoke the leading edge.
        return leading ? invokeFunc(time) : result;
      }

      function remainingWait(time) {
        var timeSinceLastCall = time - lastCallTime,
            timeSinceLastInvoke = time - lastInvokeTime,
            timeWaiting = wait - timeSinceLastCall;

        return maxing
          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
          : timeWaiting;
      }

      function shouldInvoke(time) {
        var timeSinceLastCall = time - lastCallTime,
            timeSinceLastInvoke = time - lastInvokeTime;

        // Either this is the first call, activity has stopped and we're at the
        // trailing edge, the system time has gone backwards and we're treating
        // it as the trailing edge, or we've hit the `maxWait` limit.
        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
      }

      function timerExpired() {
        var time = now();
        if (shouldInvoke(time)) {
          return trailingEdge(time);
        }
        // Restart the timer.
        timerId = setTimeout(timerExpired, remainingWait(time));
      }

      function trailingEdge(time) {
        timerId = undefined;

        // Only invoke if we have `lastArgs` which means `func` has been
        // debounced at least once.
        if (trailing && lastArgs) {
          return invokeFunc(time);
        }
        lastArgs = lastThis = undefined;
        return result;
      }

      function cancel() {
        if (timerId !== undefined) {
          clearTimeout(timerId);
        }
        lastInvokeTime = 0;
        lastArgs = lastCallTime = lastThis = timerId = undefined;
      }

      function flush() {
        return timerId === undefined ? result : trailingEdge(now());
      }

      function debounced() {
        var time = now(),
            isInvoking = shouldInvoke(time);

        lastArgs = arguments;
        lastThis = this;
        lastCallTime = time;

        if (isInvoking) {
          if (timerId === undefined) {
            return leadingEdge(lastCallTime);
          }
          if (maxing) {
            // Handle invocations in a tight loop.
            clearTimeout(timerId);
            timerId = setTimeout(timerExpired, wait);
            return invokeFunc(lastCallTime);
          }
        }
        if (timerId === undefined) {
          timerId = setTimeout(timerExpired, wait);
        }
        return result;
      }
      debounced.cancel = cancel;
      debounced.flush = flush;
      return debounced;
    }

    /**
     * Defers invoking the `func` until the current call stack has cleared. Any
     * additional arguments are provided to `func` when it's invoked.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to defer.
     * @param {...*} [args] The arguments to invoke `func` with.
     * @returns {number} Returns the timer id.
     * @example
     *
     * _.defer(function(text) {
     *   console.log(text);
     * }, 'deferred');
     * // => Logs 'deferred' after one millisecond.
     */
    var defer = baseRest(function(func, args) {
      return baseDelay(func, 1, args);
    });

    /**
     * Invokes `func` after `wait` milliseconds. Any additional arguments are
     * provided to `func` when it's invoked.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to delay.
     * @param {number} wait The number of milliseconds to delay invocation.
     * @param {...*} [args] The arguments to invoke `func` with.
     * @returns {number} Returns the timer id.
     * @example
     *
     * _.delay(function(text) {
     *   console.log(text);
     * }, 1000, 'later');
     * // => Logs 'later' after one second.
     */
    var delay = baseRest(function(func, wait, args) {
      return baseDelay(func, toNumber(wait) || 0, args);
    });

    /**
     * Creates a function that invokes `func` with arguments reversed.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Function
     * @param {Function} func The function to flip arguments for.
     * @returns {Function} Returns the new flipped function.
     * @example
     *
     * var flipped = _.flip(function() {
     *   return _.toArray(arguments);
     * });
     *
     * flipped('a', 'b', 'c', 'd');
     * // => ['d', 'c', 'b', 'a']
     */
    function flip(func) {
      return createWrap(func, WRAP_FLIP_FLAG);
    }

    /**
     * Creates a function that memoizes the result of `func`. If `resolver` is
     * provided, it determines the cache key for storing the result based on the
     * arguments provided to the memoized function. By default, the first argument
     * provided to the memoized function is used as the map cache key. The `func`
     * is invoked with the `this` binding of the memoized function.
     *
     * **Note:** The cache is exposed as the `cache` property on the memoized
     * function. Its creation may be customized by replacing the `_.memoize.Cache`
     * constructor with one whose instances implement the
     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
     * method interface of `clear`, `delete`, `get`, `has`, and `set`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to have its output memoized.
     * @param {Function} [resolver] The function to resolve the cache key.
     * @returns {Function} Returns the new memoized function.
     * @example
     *
     * var object = { 'a': 1, 'b': 2 };
     * var other = { 'c': 3, 'd': 4 };
     *
     * var values = _.memoize(_.values);
     * values(object);
     * // => [1, 2]
     *
     * values(other);
     * // => [3, 4]
     *
     * object.a = 2;
     * values(object);
     * // => [1, 2]
     *
     * // Modify the result cache.
     * values.cache.set(object, ['a', 'b']);
     * values(object);
     * // => ['a', 'b']
     *
     * // Replace `_.memoize.Cache`.
     * _.memoize.Cache = WeakMap;
     */
    function memoize(func, resolver) {
      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      var memoized = function() {
        var args = arguments,
            key = resolver ? resolver.apply(this, args) : args[0],
            cache = memoized.cache;

        if (cache.has(key)) {
          return cache.get(key);
        }
        var result = func.apply(this, args);
        memoized.cache = cache.set(key, result) || cache;
        return result;
      };
      memoized.cache = new (memoize.Cache || MapCache);
      return memoized;
    }

    // Expose `MapCache`.
    memoize.Cache = MapCache;

    /**
     * Creates a function that negates the result of the predicate `func`. The
     * `func` predicate is invoked with the `this` binding and arguments of the
     * created function.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Function
     * @param {Function} predicate The predicate to negate.
     * @returns {Function} Returns the new negated function.
     * @example
     *
     * function isEven(n) {
     *   return n % 2 == 0;
     * }
     *
     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
     * // => [1, 3, 5]
     */
    function negate(predicate) {
      if (typeof predicate != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      return function() {
        var args = arguments;
        switch (args.length) {
          case 0: return !predicate.call(this);
          case 1: return !predicate.call(this, args[0]);
          case 2: return !predicate.call(this, args[0], args[1]);
          case 3: return !predicate.call(this, args[0], args[1], args[2]);
        }
        return !predicate.apply(this, args);
      };
    }

    /**
     * Creates a function that is restricted to invoking `func` once. Repeat calls
     * to the function return the value of the first invocation. The `func` is
     * invoked with the `this` binding and arguments of the created function.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to restrict.
     * @returns {Function} Returns the new restricted function.
     * @example
     *
     * var initialize = _.once(createApplication);
     * initialize();
     * initialize();
     * // => `createApplication` is invoked once
     */
    function once(func) {
      return before(2, func);
    }

    /**
     * Creates a function that invokes `func` with its arguments transformed.
     *
     * @static
     * @since 4.0.0
     * @memberOf _
     * @category Function
     * @param {Function} func The function to wrap.
     * @param {...(Function|Function[])} [transforms=[_.identity]]
     *  The argument transforms.
     * @returns {Function} Returns the new function.
     * @example
     *
     * function doubled(n) {
     *   return n * 2;
     * }
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * var func = _.overArgs(function(x, y) {
     *   return [x, y];
     * }, [square, doubled]);
     *
     * func(9, 3);
     * // => [81, 6]
     *
     * func(10, 5);
     * // => [100, 10]
     */
    var overArgs = castRest(function(func, transforms) {
      transforms = (transforms.length == 1 && isArray(transforms[0]))
        ? arrayMap(transforms[0], baseUnary(getIteratee()))
        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));

      var funcsLength = transforms.length;
      return baseRest(function(args) {
        var index = -1,
            length = nativeMin(args.length, funcsLength);

        while (++index < length) {
          args[index] = transforms[index].call(this, args[index]);
        }
        return apply(func, this, args);
      });
    });

    /**
     * Creates a function that invokes `func` with `partials` prepended to the
     * arguments it receives. This method is like `_.bind` except it does **not**
     * alter the `this` binding.
     *
     * The `_.partial.placeholder` value, which defaults to `_` in monolithic
     * builds, may be used as a placeholder for partially applied arguments.
     *
     * **Note:** This method doesn't set the "length" property of partially
     * applied functions.
     *
     * @static
     * @memberOf _
     * @since 0.2.0
     * @category Function
     * @param {Function} func The function to partially apply arguments to.
     * @param {...*} [partials] The arguments to be partially applied.
     * @returns {Function} Returns the new partially applied function.
     * @example
     *
     * function greet(greeting, name) {
     *   return greeting + ' ' + name;
     * }
     *
     * var sayHelloTo = _.partial(greet, 'hello');
     * sayHelloTo('fred');
     * // => 'hello fred'
     *
     * // Partially applied with placeholders.
     * var greetFred = _.partial(greet, _, 'fred');
     * greetFred('hi');
     * // => 'hi fred'
     */
    var partial = baseRest(function(func, partials) {
      var holders = replaceHolders(partials, getHolder(partial));
      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
    });

    /**
     * This method is like `_.partial` except that partially applied arguments
     * are appended to the arguments it receives.
     *
     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
     * builds, may be used as a placeholder for partially applied arguments.
     *
     * **Note:** This method doesn't set the "length" property of partially
     * applied functions.
     *
     * @static
     * @memberOf _
     * @since 1.0.0
     * @category Function
     * @param {Function} func The function to partially apply arguments to.
     * @param {...*} [partials] The arguments to be partially applied.
     * @returns {Function} Returns the new partially applied function.
     * @example
     *
     * function greet(greeting, name) {
     *   return greeting + ' ' + name;
     * }
     *
     * var greetFred = _.partialRight(greet, 'fred');
     * greetFred('hi');
     * // => 'hi fred'
     *
     * // Partially applied with placeholders.
     * var sayHelloTo = _.partialRight(greet, 'hello', _);
     * sayHelloTo('fred');
     * // => 'hello fred'
     */
    var partialRight = baseRest(function(func, partials) {
      var holders = replaceHolders(partials, getHolder(partialRight));
      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
    });

    /**
     * Creates a function that invokes `func` with arguments arranged according
     * to the specified `indexes` where the argument value at the first index is
     * provided as the first argument, the argument value at the second index is
     * provided as the second argument, and so on.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Function
     * @param {Function} func The function to rearrange arguments for.
     * @param {...(number|number[])} indexes The arranged argument indexes.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var rearged = _.rearg(function(a, b, c) {
     *   return [a, b, c];
     * }, [2, 0, 1]);
     *
     * rearged('b', 'c', 'a')
     * // => ['a', 'b', 'c']
     */
    var rearg = flatRest(function(func, indexes) {
      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
    });

    /**
     * Creates a function that invokes `func` with the `this` binding of the
     * created function and arguments from `start` and beyond provided as
     * an array.
     *
     * **Note:** This method is based on the
     * [rest parameter](https://mdn.io/rest_parameters).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Function
     * @param {Function} func The function to apply a rest parameter to.
     * @param {number} [start=func.length-1] The start position of the rest parameter.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var say = _.rest(function(what, names) {
     *   return what + ' ' + _.initial(names).join(', ') +
     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
     * });
     *
     * say('hello', 'fred', 'barney', 'pebbles');
     * // => 'hello fred, barney, & pebbles'
     */
    function rest(func, start) {
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      start = start === undefined ? start : toInteger(start);
      return baseRest(func, start);
    }

    /**
     * Creates a function that invokes `func` with the `this` binding of the
     * create function and an array of arguments much like
     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
     *
     * **Note:** This method is based on the
     * [spread operator](https://mdn.io/spread_operator).
     *
     * @static
     * @memberOf _
     * @since 3.2.0
     * @category Function
     * @param {Function} func The function to spread arguments over.
     * @param {number} [start=0] The start position of the spread.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var say = _.spread(function(who, what) {
     *   return who + ' says ' + what;
     * });
     *
     * say(['fred', 'hello']);
     * // => 'fred says hello'
     *
     * var numbers = Promise.all([
     *   Promise.resolve(40),
     *   Promise.resolve(36)
     * ]);
     *
     * numbers.then(_.spread(function(x, y) {
     *   return x + y;
     * }));
     * // => a Promise of 76
     */
    function spread(func, start) {
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      start = start == null ? 0 : nativeMax(toInteger(start), 0);
      return baseRest(function(args) {
        var array = args[start],
            otherArgs = castSlice(args, 0, start);

        if (array) {
          arrayPush(otherArgs, array);
        }
        return apply(func, this, otherArgs);
      });
    }

    /**
     * Creates a throttled function that only invokes `func` at most once per
     * every `wait` milliseconds. The throttled function comes with a `cancel`
     * method to cancel delayed `func` invocations and a `flush` method to
     * immediately invoke them. Provide `options` to indicate whether `func`
     * should be invoked on the leading and/or trailing edge of the `wait`
     * timeout. The `func` is invoked with the last arguments provided to the
     * throttled function. Subsequent calls to the throttled function return the
     * result of the last `func` invocation.
     *
     * **Note:** If `leading` and `trailing` options are `true`, `func` is
     * invoked on the trailing edge of the timeout only if the throttled function
     * is invoked more than once during the `wait` timeout.
     *
     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
     *
     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
     * for details over the differences between `_.throttle` and `_.debounce`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to throttle.
     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
     * @param {Object} [options={}] The options object.
     * @param {boolean} [options.leading=true]
     *  Specify invoking on the leading edge of the timeout.
     * @param {boolean} [options.trailing=true]
     *  Specify invoking on the trailing edge of the timeout.
     * @returns {Function} Returns the new throttled function.
     * @example
     *
     * // Avoid excessively updating the position while scrolling.
     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
     *
     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
     * jQuery(element).on('click', throttled);
     *
     * // Cancel the trailing throttled invocation.
     * jQuery(window).on('popstate', throttled.cancel);
     */
    function throttle(func, wait, options) {
      var leading = true,
          trailing = true;

      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      if (isObject(options)) {
        leading = 'leading' in options ? !!options.leading : leading;
        trailing = 'trailing' in options ? !!options.trailing : trailing;
      }
      return debounce(func, wait, {
        'leading': leading,
        'maxWait': wait,
        'trailing': trailing
      });
    }

    /**
     * Creates a function that accepts up to one argument, ignoring any
     * additional arguments.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Function
     * @param {Function} func The function to cap arguments for.
     * @returns {Function} Returns the new capped function.
     * @example
     *
     * _.map(['6', '8', '10'], _.unary(parseInt));
     * // => [6, 8, 10]
     */
    function unary(func) {
      return ary(func, 1);
    }

    /**
     * Creates a function that provides `value` to `wrapper` as its first
     * argument. Any additional arguments provided to the function are appended
     * to those provided to the `wrapper`. The wrapper is invoked with the `this`
     * binding of the created function.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {*} value The value to wrap.
     * @param {Function} [wrapper=identity] The wrapper function.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var p = _.wrap(_.escape, function(func, text) {
     *   return '<p>' + func(text) + '</p>';
     * });
     *
     * p('fred, barney, & pebbles');
     * // => '<p>fred, barney, &amp; pebbles</p>'
     */
    function wrap(value, wrapper) {
      return partial(castFunction(wrapper), value);
    }

    /*------------------------------------------------------------------------*/

    /**
     * Casts `value` as an array if it's not one.
     *
     * @static
     * @memberOf _
     * @since 4.4.0
     * @category Lang
     * @param {*} value The value to inspect.
     * @returns {Array} Returns the cast array.
     * @example
     *
     * _.castArray(1);
     * // => [1]
     *
     * _.castArray({ 'a': 1 });
     * // => [{ 'a': 1 }]
     *
     * _.castArray('abc');
     * // => ['abc']
     *
     * _.castArray(null);
     * // => [null]
     *
     * _.castArray(undefined);
     * // => [undefined]
     *
     * _.castArray();
     * // => []
     *
     * var array = [1, 2, 3];
     * console.log(_.castArray(array) === array);
     * // => true
     */
    function castArray() {
      if (!arguments.length) {
        return [];
      }
      var value = arguments[0];
      return isArray(value) ? value : [value];
    }

    /**
     * Creates a shallow clone of `value`.
     *
     * **Note:** This method is loosely based on the
     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
     * and supports cloning arrays, array buffers, booleans, date objects, maps,
     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
     * arrays. The own enumerable properties of `arguments` objects are cloned
     * as plain objects. An empty object is returned for uncloneable values such
     * as error objects, functions, DOM nodes, and WeakMaps.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to clone.
     * @returns {*} Returns the cloned value.
     * @see _.cloneDeep
     * @example
     *
     * var objects = [{ 'a': 1 }, { 'b': 2 }];
     *
     * var shallow = _.clone(objects);
     * console.log(shallow[0] === objects[0]);
     * // => true
     */
    function clone(value) {
      return baseClone(value, CLONE_SYMBOLS_FLAG);
    }

    /**
     * This method is like `_.clone` except that it accepts `customizer` which
     * is invoked to produce the cloned value. If `customizer` returns `undefined`,
     * cloning is handled by the method instead. The `customizer` is invoked with
     * up to four arguments; (value [, index|key, object, stack]).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to clone.
     * @param {Function} [customizer] The function to customize cloning.
     * @returns {*} Returns the cloned value.
     * @see _.cloneDeepWith
     * @example
     *
     * function customizer(value) {
     *   if (_.isElement(value)) {
     *     return value.cloneNode(false);
     *   }
     * }
     *
     * var el = _.cloneWith(document.body, customizer);
     *
     * console.log(el === document.body);
     * // => false
     * console.log(el.nodeName);
     * // => 'BODY'
     * console.log(el.childNodes.length);
     * // => 0
     */
    function cloneWith(value, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
    }

    /**
     * This method is like `_.clone` except that it recursively clones `value`.
     *
     * @static
     * @memberOf _
     * @since 1.0.0
     * @category Lang
     * @param {*} value The value to recursively clone.
     * @returns {*} Returns the deep cloned value.
     * @see _.clone
     * @example
     *
     * var objects = [{ 'a': 1 }, { 'b': 2 }];
     *
     * var deep = _.cloneDeep(objects);
     * console.log(deep[0] === objects[0]);
     * // => false
     */
    function cloneDeep(value) {
      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
    }

    /**
     * This method is like `_.cloneWith` except that it recursively clones `value`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to recursively clone.
     * @param {Function} [customizer] The function to customize cloning.
     * @returns {*} Returns the deep cloned value.
     * @see _.cloneWith
     * @example
     *
     * function customizer(value) {
     *   if (_.isElement(value)) {
     *     return value.cloneNode(true);
     *   }
     * }
     *
     * var el = _.cloneDeepWith(document.body, customizer);
     *
     * console.log(el === document.body);
     * // => false
     * console.log(el.nodeName);
     * // => 'BODY'
     * console.log(el.childNodes.length);
     * // => 20
     */
    function cloneDeepWith(value, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
    }

    /**
     * Checks if `object` conforms to `source` by invoking the predicate
     * properties of `source` with the corresponding property values of `object`.
     *
     * **Note:** This method is equivalent to `_.conforms` when `source` is
     * partially applied.
     *
     * @static
     * @memberOf _
     * @since 4.14.0
     * @category Lang
     * @param {Object} object The object to inspect.
     * @param {Object} source The object of property predicates to conform to.
     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
     * @example
     *
     * var object = { 'a': 1, 'b': 2 };
     *
     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
     * // => true
     *
     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
     * // => false
     */
    function conformsTo(object, source) {
      return source == null || baseConformsTo(object, source, keys(source));
    }

    /**
     * Performs a
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * comparison between two values to determine if they are equivalent.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
     * @example
     *
     * var object = { 'a': 1 };
     * var other = { 'a': 1 };
     *
     * _.eq(object, object);
     * // => true
     *
     * _.eq(object, other);
     * // => false
     *
     * _.eq('a', 'a');
     * // => true
     *
     * _.eq('a', Object('a'));
     * // => false
     *
     * _.eq(NaN, NaN);
     * // => true
     */
    function eq(value, other) {
      return value === other || (value !== value && other !== other);
    }

    /**
     * Checks if `value` is greater than `other`.
     *
     * @static
     * @memberOf _
     * @since 3.9.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is greater than `other`,
     *  else `false`.
     * @see _.lt
     * @example
     *
     * _.gt(3, 1);
     * // => true
     *
     * _.gt(3, 3);
     * // => false
     *
     * _.gt(1, 3);
     * // => false
     */
    var gt = createRelationalOperation(baseGt);

    /**
     * Checks if `value` is greater than or equal to `other`.
     *
     * @static
     * @memberOf _
     * @since 3.9.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is greater than or equal to
     *  `other`, else `false`.
     * @see _.lte
     * @example
     *
     * _.gte(3, 1);
     * // => true
     *
     * _.gte(3, 3);
     * // => true
     *
     * _.gte(1, 3);
     * // => false
     */
    var gte = createRelationalOperation(function(value, other) {
      return value >= other;
    });

    /**
     * Checks if `value` is likely an `arguments` object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
     *  else `false`.
     * @example
     *
     * _.isArguments(function() { return arguments; }());
     * // => true
     *
     * _.isArguments([1, 2, 3]);
     * // => false
     */
    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
        !propertyIsEnumerable.call(value, 'callee');
    };

    /**
     * Checks if `value` is classified as an `Array` object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an array, else `false`.
     * @example
     *
     * _.isArray([1, 2, 3]);
     * // => true
     *
     * _.isArray(document.body.children);
     * // => false
     *
     * _.isArray('abc');
     * // => false
     *
     * _.isArray(_.noop);
     * // => false
     */
    var isArray = Array.isArray;

    /**
     * Checks if `value` is classified as an `ArrayBuffer` object.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
     * @example
     *
     * _.isArrayBuffer(new ArrayBuffer(2));
     * // => true
     *
     * _.isArrayBuffer(new Array(2));
     * // => false
     */
    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;

    /**
     * Checks if `value` is array-like. A value is considered array-like if it's
     * not a function and has a `value.length` that's an integer greater than or
     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
     * @example
     *
     * _.isArrayLike([1, 2, 3]);
     * // => true
     *
     * _.isArrayLike(document.body.children);
     * // => true
     *
     * _.isArrayLike('abc');
     * // => true
     *
     * _.isArrayLike(_.noop);
     * // => false
     */
    function isArrayLike(value) {
      return value != null && isLength(value.length) && !isFunction(value);
    }

    /**
     * This method is like `_.isArrayLike` except that it also checks if `value`
     * is an object.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an array-like object,
     *  else `false`.
     * @example
     *
     * _.isArrayLikeObject([1, 2, 3]);
     * // => true
     *
     * _.isArrayLikeObject(document.body.children);
     * // => true
     *
     * _.isArrayLikeObject('abc');
     * // => false
     *
     * _.isArrayLikeObject(_.noop);
     * // => false
     */
    function isArrayLikeObject(value) {
      return isObjectLike(value) && isArrayLike(value);
    }

    /**
     * Checks if `value` is classified as a boolean primitive or object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
     * @example
     *
     * _.isBoolean(false);
     * // => true
     *
     * _.isBoolean(null);
     * // => false
     */
    function isBoolean(value) {
      return value === true || value === false ||
        (isObjectLike(value) && baseGetTag(value) == boolTag);
    }

    /**
     * Checks if `value` is a buffer.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
     * @example
     *
     * _.isBuffer(new Buffer(2));
     * // => true
     *
     * _.isBuffer(new Uint8Array(2));
     * // => false
     */
    var isBuffer = nativeIsBuffer || stubFalse;

    /**
     * Checks if `value` is classified as a `Date` object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
     * @example
     *
     * _.isDate(new Date);
     * // => true
     *
     * _.isDate('Mon April 23 2012');
     * // => false
     */
    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;

    /**
     * Checks if `value` is likely a DOM element.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
     * @example
     *
     * _.isElement(document.body);
     * // => true
     *
     * _.isElement('<body>');
     * // => false
     */
    function isElement(value) {
      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
    }

    /**
     * Checks if `value` is an empty object, collection, map, or set.
     *
     * Objects are considered empty if they have no own enumerable string keyed
     * properties.
     *
     * Array-like values such as `arguments` objects, arrays, buffers, strings, or
     * jQuery-like collections are considered empty if they have a `length` of `0`.
     * Similarly, maps and sets are considered empty if they have a `size` of `0`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
     * @example
     *
     * _.isEmpty(null);
     * // => true
     *
     * _.isEmpty(true);
     * // => true
     *
     * _.isEmpty(1);
     * // => true
     *
     * _.isEmpty([1, 2, 3]);
     * // => false
     *
     * _.isEmpty({ 'a': 1 });
     * // => false
     */
    function isEmpty(value) {
      if (value == null) {
        return true;
      }
      if (isArrayLike(value) &&
          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
            isBuffer(value) || isTypedArray(value) || isArguments(value))) {
        return !value.length;
      }
      var tag = getTag(value);
      if (tag == mapTag || tag == setTag) {
        return !value.size;
      }
      if (isPrototype(value)) {
        return !baseKeys(value).length;
      }
      for (var key in value) {
        if (hasOwnProperty.call(value, key)) {
          return false;
        }
      }
      return true;
    }

    /**
     * Performs a deep comparison between two values to determine if they are
     * equivalent.
     *
     * **Note:** This method supports comparing arrays, array buffers, booleans,
     * date objects, error objects, maps, numbers, `Object` objects, regexes,
     * sets, strings, symbols, and typed arrays. `Object` objects are compared
     * by their own, not inherited, enumerable properties. Functions and DOM
     * nodes are compared by strict equality, i.e. `===`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
     * @example
     *
     * var object = { 'a': 1 };
     * var other = { 'a': 1 };
     *
     * _.isEqual(object, other);
     * // => true
     *
     * object === other;
     * // => false
     */
    function isEqual(value, other) {
      return baseIsEqual(value, other);
    }

    /**
     * This method is like `_.isEqual` except that it accepts `customizer` which
     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
     * are handled by the method instead. The `customizer` is invoked with up to
     * six arguments: (objValue, othValue [, index|key, object, other, stack]).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @param {Function} [customizer] The function to customize comparisons.
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
     * @example
     *
     * function isGreeting(value) {
     *   return /^h(?:i|ello)$/.test(value);
     * }
     *
     * function customizer(objValue, othValue) {
     *   if (isGreeting(objValue) && isGreeting(othValue)) {
     *     return true;
     *   }
     * }
     *
     * var array = ['hello', 'goodbye'];
     * var other = ['hi', 'goodbye'];
     *
     * _.isEqualWith(array, other, customizer);
     * // => true
     */
    function isEqualWith(value, other, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      var result = customizer ? customizer(value, other) : undefined;
      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
    }

    /**
     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
     * `SyntaxError`, `TypeError`, or `URIError` object.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
     * @example
     *
     * _.isError(new Error);
     * // => true
     *
     * _.isError(Error);
     * // => false
     */
    function isError(value) {
      if (!isObjectLike(value)) {
        return false;
      }
      var tag = baseGetTag(value);
      return tag == errorTag || tag == domExcTag ||
        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
    }

    /**
     * Checks if `value` is a finite primitive number.
     *
     * **Note:** This method is based on
     * [`Number.isFinite`](https://mdn.io/Number/isFinite).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
     * @example
     *
     * _.isFinite(3);
     * // => true
     *
     * _.isFinite(Number.MIN_VALUE);
     * // => true
     *
     * _.isFinite(Infinity);
     * // => false
     *
     * _.isFinite('3');
     * // => false
     */
    function isFinite(value) {
      return typeof value == 'number' && nativeIsFinite(value);
    }

    /**
     * Checks if `value` is classified as a `Function` object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a function, else `false`.
     * @example
     *
     * _.isFunction(_);
     * // => true
     *
     * _.isFunction(/abc/);
     * // => false
     */
    function isFunction(value) {
      if (!isObject(value)) {
        return false;
      }
      // The use of `Object#toString` avoids issues with the `typeof` operator
      // in Safari 9 which returns 'object' for typed arrays and other constructors.
      var tag = baseGetTag(value);
      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
    }

    /**
     * Checks if `value` is an integer.
     *
     * **Note:** This method is based on
     * [`Number.isInteger`](https://mdn.io/Number/isInteger).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
     * @example
     *
     * _.isInteger(3);
     * // => true
     *
     * _.isInteger(Number.MIN_VALUE);
     * // => false
     *
     * _.isInteger(Infinity);
     * // => false
     *
     * _.isInteger('3');
     * // => false
     */
    function isInteger(value) {
      return typeof value == 'number' && value == toInteger(value);
    }

    /**
     * Checks if `value` is a valid array-like length.
     *
     * **Note:** This method is loosely based on
     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
     * @example
     *
     * _.isLength(3);
     * // => true
     *
     * _.isLength(Number.MIN_VALUE);
     * // => false
     *
     * _.isLength(Infinity);
     * // => false
     *
     * _.isLength('3');
     * // => false
     */
    function isLength(value) {
      return typeof value == 'number' &&
        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
    }

    /**
     * Checks if `value` is the
     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
     * @example
     *
     * _.isObject({});
     * // => true
     *
     * _.isObject([1, 2, 3]);
     * // => true
     *
     * _.isObject(_.noop);
     * // => true
     *
     * _.isObject(null);
     * // => false
     */
    function isObject(value) {
      var type = typeof value;
      return value != null && (type == 'object' || type == 'function');
    }

    /**
     * Checks if `value` is object-like. A value is object-like if it's not `null`
     * and has a `typeof` result of "object".
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
     * @example
     *
     * _.isObjectLike({});
     * // => true
     *
     * _.isObjectLike([1, 2, 3]);
     * // => true
     *
     * _.isObjectLike(_.noop);
     * // => false
     *
     * _.isObjectLike(null);
     * // => false
     */
    function isObjectLike(value) {
      return value != null && typeof value == 'object';
    }

    /**
     * Checks if `value` is classified as a `Map` object.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
     * @example
     *
     * _.isMap(new Map);
     * // => true
     *
     * _.isMap(new WeakMap);
     * // => false
     */
    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;

    /**
     * Performs a partial deep comparison between `object` and `source` to
     * determine if `object` contains equivalent property values.
     *
     * **Note:** This method is equivalent to `_.matches` when `source` is
     * partially applied.
     *
     * Partial comparisons will match empty array and empty object `source`
     * values against any array or object value, respectively. See `_.isEqual`
     * for a list of supported value comparisons.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Lang
     * @param {Object} object The object to inspect.
     * @param {Object} source The object of property values to match.
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
     * @example
     *
     * var object = { 'a': 1, 'b': 2 };
     *
     * _.isMatch(object, { 'b': 2 });
     * // => true
     *
     * _.isMatch(object, { 'b': 1 });
     * // => false
     */
    function isMatch(object, source) {
      return object === source || baseIsMatch(object, source, getMatchData(source));
    }

    /**
     * This method is like `_.isMatch` except that it accepts `customizer` which
     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
     * are handled by the method instead. The `customizer` is invoked with five
     * arguments: (objValue, srcValue, index|key, object, source).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {Object} object The object to inspect.
     * @param {Object} source The object of property values to match.
     * @param {Function} [customizer] The function to customize comparisons.
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
     * @example
     *
     * function isGreeting(value) {
     *   return /^h(?:i|ello)$/.test(value);
     * }
     *
     * function customizer(objValue, srcValue) {
     *   if (isGreeting(objValue) && isGreeting(srcValue)) {
     *     return true;
     *   }
     * }
     *
     * var object = { 'greeting': 'hello' };
     * var source = { 'greeting': 'hi' };
     *
     * _.isMatchWith(object, source, customizer);
     * // => true
     */
    function isMatchWith(object, source, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      return baseIsMatch(object, source, getMatchData(source), customizer);
    }

    /**
     * Checks if `value` is `NaN`.
     *
     * **Note:** This method is based on
     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
     * `undefined` and other non-number values.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
     * @example
     *
     * _.isNaN(NaN);
     * // => true
     *
     * _.isNaN(new Number(NaN));
     * // => true
     *
     * isNaN(undefined);
     * // => true
     *
     * _.isNaN(undefined);
     * // => false
     */
    function isNaN(value) {
      // An `NaN` primitive is the only value that is not equal to itself.
      // Perform the `toStringTag` check first to avoid errors with some
      // ActiveX objects in IE.
      return isNumber(value) && value != +value;
    }

    /**
     * Checks if `value` is a pristine native function.
     *
     * **Note:** This method can't reliably detect native functions in the presence
     * of the core-js package because core-js circumvents this kind of detection.
     * Despite multiple requests, the core-js maintainer has made it clear: any
     * attempt to fix the detection will be obstructed. As a result, we're left
     * with little choice but to throw an error. Unfortunately, this also affects
     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
     * which rely on core-js.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a native function,
     *  else `false`.
     * @example
     *
     * _.isNative(Array.prototype.push);
     * // => true
     *
     * _.isNative(_);
     * // => false
     */
    function isNative(value) {
      if (isMaskable(value)) {
        throw new Error(CORE_ERROR_TEXT);
      }
      return baseIsNative(value);
    }

    /**
     * Checks if `value` is `null`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
     * @example
     *
     * _.isNull(null);
     * // => true
     *
     * _.isNull(void 0);
     * // => false
     */
    function isNull(value) {
      return value === null;
    }

    /**
     * Checks if `value` is `null` or `undefined`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
     * @example
     *
     * _.isNil(null);
     * // => true
     *
     * _.isNil(void 0);
     * // => true
     *
     * _.isNil(NaN);
     * // => false
     */
    function isNil(value) {
      return value == null;
    }

    /**
     * Checks if `value` is classified as a `Number` primitive or object.
     *
     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
     * classified as numbers, use the `_.isFinite` method.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a number, else `false`.
     * @example
     *
     * _.isNumber(3);
     * // => true
     *
     * _.isNumber(Number.MIN_VALUE);
     * // => true
     *
     * _.isNumber(Infinity);
     * // => true
     *
     * _.isNumber('3');
     * // => false
     */
    function isNumber(value) {
      return typeof value == 'number' ||
        (isObjectLike(value) && baseGetTag(value) == numberTag);
    }

    /**
     * Checks if `value` is a plain object, that is, an object created by the
     * `Object` constructor or one with a `[[Prototype]]` of `null`.
     *
     * @static
     * @memberOf _
     * @since 0.8.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     * }
     *
     * _.isPlainObject(new Foo);
     * // => false
     *
     * _.isPlainObject([1, 2, 3]);
     * // => false
     *
     * _.isPlainObject({ 'x': 0, 'y': 0 });
     * // => true
     *
     * _.isPlainObject(Object.create(null));
     * // => true
     */
    function isPlainObject(value) {
      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
        return false;
      }
      var proto = getPrototype(value);
      if (proto === null) {
        return true;
      }
      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
      return typeof Ctor == 'function' && Ctor instanceof Ctor &&
        funcToString.call(Ctor) == objectCtorString;
    }

    /**
     * Checks if `value` is classified as a `RegExp` object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
     * @example
     *
     * _.isRegExp(/abc/);
     * // => true
     *
     * _.isRegExp('/abc/');
     * // => false
     */
    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;

    /**
     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
     * double precision number which isn't the result of a rounded unsafe integer.
     *
     * **Note:** This method is based on
     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
     * @example
     *
     * _.isSafeInteger(3);
     * // => true
     *
     * _.isSafeInteger(Number.MIN_VALUE);
     * // => false
     *
     * _.isSafeInteger(Infinity);
     * // => false
     *
     * _.isSafeInteger('3');
     * // => false
     */
    function isSafeInteger(value) {
      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
    }

    /**
     * Checks if `value` is classified as a `Set` object.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
     * @example
     *
     * _.isSet(new Set);
     * // => true
     *
     * _.isSet(new WeakSet);
     * // => false
     */
    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;

    /**
     * Checks if `value` is classified as a `String` primitive or object.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a string, else `false`.
     * @example
     *
     * _.isString('abc');
     * // => true
     *
     * _.isString(1);
     * // => false
     */
    function isString(value) {
      return typeof value == 'string' ||
        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
    }

    /**
     * Checks if `value` is classified as a `Symbol` primitive or object.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
     * @example
     *
     * _.isSymbol(Symbol.iterator);
     * // => true
     *
     * _.isSymbol('abc');
     * // => false
     */
    function isSymbol(value) {
      return typeof value == 'symbol' ||
        (isObjectLike(value) && baseGetTag(value) == symbolTag);
    }

    /**
     * Checks if `value` is classified as a typed array.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
     * @example
     *
     * _.isTypedArray(new Uint8Array);
     * // => true
     *
     * _.isTypedArray([]);
     * // => false
     */
    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;

    /**
     * Checks if `value` is `undefined`.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
     * @example
     *
     * _.isUndefined(void 0);
     * // => true
     *
     * _.isUndefined(null);
     * // => false
     */
    function isUndefined(value) {
      return value === undefined;
    }

    /**
     * Checks if `value` is classified as a `WeakMap` object.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
     * @example
     *
     * _.isWeakMap(new WeakMap);
     * // => true
     *
     * _.isWeakMap(new Map);
     * // => false
     */
    function isWeakMap(value) {
      return isObjectLike(value) && getTag(value) == weakMapTag;
    }

    /**
     * Checks if `value` is classified as a `WeakSet` object.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
     * @example
     *
     * _.isWeakSet(new WeakSet);
     * // => true
     *
     * _.isWeakSet(new Set);
     * // => false
     */
    function isWeakSet(value) {
      return isObjectLike(value) && baseGetTag(value) == weakSetTag;
    }

    /**
     * Checks if `value` is less than `other`.
     *
     * @static
     * @memberOf _
     * @since 3.9.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is less than `other`,
     *  else `false`.
     * @see _.gt
     * @example
     *
     * _.lt(1, 3);
     * // => true
     *
     * _.lt(3, 3);
     * // => false
     *
     * _.lt(3, 1);
     * // => false
     */
    var lt = createRelationalOperation(baseLt);

    /**
     * Checks if `value` is less than or equal to `other`.
     *
     * @static
     * @memberOf _
     * @since 3.9.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is less than or equal to
     *  `other`, else `false`.
     * @see _.gte
     * @example
     *
     * _.lte(1, 3);
     * // => true
     *
     * _.lte(3, 3);
     * // => true
     *
     * _.lte(3, 1);
     * // => false
     */
    var lte = createRelationalOperation(function(value, other) {
      return value <= other;
    });

    /**
     * Converts `value` to an array.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {Array} Returns the converted array.
     * @example
     *
     * _.toArray({ 'a': 1, 'b': 2 });
     * // => [1, 2]
     *
     * _.toArray('abc');
     * // => ['a', 'b', 'c']
     *
     * _.toArray(1);
     * // => []
     *
     * _.toArray(null);
     * // => []
     */
    function toArray(value) {
      if (!value) {
        return [];
      }
      if (isArrayLike(value)) {
        return isString(value) ? stringToArray(value) : copyArray(value);
      }
      if (symIterator && value[symIterator]) {
        return iteratorToArray(value[symIterator]());
      }
      var tag = getTag(value),
          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);

      return func(value);
    }

    /**
     * Converts `value` to a finite number.
     *
     * @static
     * @memberOf _
     * @since 4.12.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {number} Returns the converted number.
     * @example
     *
     * _.toFinite(3.2);
     * // => 3.2
     *
     * _.toFinite(Number.MIN_VALUE);
     * // => 5e-324
     *
     * _.toFinite(Infinity);
     * // => 1.7976931348623157e+308
     *
     * _.toFinite('3.2');
     * // => 3.2
     */
    function toFinite(value) {
      if (!value) {
        return value === 0 ? value : 0;
      }
      value = toNumber(value);
      if (value === INFINITY || value === -INFINITY) {
        var sign = (value < 0 ? -1 : 1);
        return sign * MAX_INTEGER;
      }
      return value === value ? value : 0;
    }

    /**
     * Converts `value` to an integer.
     *
     * **Note:** This method is loosely based on
     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {number} Returns the converted integer.
     * @example
     *
     * _.toInteger(3.2);
     * // => 3
     *
     * _.toInteger(Number.MIN_VALUE);
     * // => 0
     *
     * _.toInteger(Infinity);
     * // => 1.7976931348623157e+308
     *
     * _.toInteger('3.2');
     * // => 3
     */
    function toInteger(value) {
      var result = toFinite(value),
          remainder = result % 1;

      return result === result ? (remainder ? result - remainder : result) : 0;
    }

    /**
     * Converts `value` to an integer suitable for use as the length of an
     * array-like object.
     *
     * **Note:** This method is based on
     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {number} Returns the converted integer.
     * @example
     *
     * _.toLength(3.2);
     * // => 3
     *
     * _.toLength(Number.MIN_VALUE);
     * // => 0
     *
     * _.toLength(Infinity);
     * // => 4294967295
     *
     * _.toLength('3.2');
     * // => 3
     */
    function toLength(value) {
      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
    }

    /**
     * Converts `value` to a number.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to process.
     * @returns {number} Returns the number.
     * @example
     *
     * _.toNumber(3.2);
     * // => 3.2
     *
     * _.toNumber(Number.MIN_VALUE);
     * // => 5e-324
     *
     * _.toNumber(Infinity);
     * // => Infinity
     *
     * _.toNumber('3.2');
     * // => 3.2
     */
    function toNumber(value) {
      if (typeof value == 'number') {
        return value;
      }
      if (isSymbol(value)) {
        return NAN;
      }
      if (isObject(value)) {
        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
        value = isObject(other) ? (other + '') : other;
      }
      if (typeof value != 'string') {
        return value === 0 ? value : +value;
      }
      value = baseTrim(value);
      var isBinary = reIsBinary.test(value);
      return (isBinary || reIsOctal.test(value))
        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
        : (reIsBadHex.test(value) ? NAN : +value);
    }

    /**
     * Converts `value` to a plain object flattening inherited enumerable string
     * keyed properties of `value` to own properties of the plain object.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {Object} Returns the converted plain object.
     * @example
     *
     * function Foo() {
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.assign({ 'a': 1 }, new Foo);
     * // => { 'a': 1, 'b': 2 }
     *
     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
     * // => { 'a': 1, 'b': 2, 'c': 3 }
     */
    function toPlainObject(value) {
      return copyObject(value, keysIn(value));
    }

    /**
     * Converts `value` to a safe integer. A safe integer can be compared and
     * represented correctly.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {number} Returns the converted integer.
     * @example
     *
     * _.toSafeInteger(3.2);
     * // => 3
     *
     * _.toSafeInteger(Number.MIN_VALUE);
     * // => 0
     *
     * _.toSafeInteger(Infinity);
     * // => 9007199254740991
     *
     * _.toSafeInteger('3.2');
     * // => 3
     */
    function toSafeInteger(value) {
      return value
        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
        : (value === 0 ? value : 0);
    }

    /**
     * Converts `value` to a string. An empty string is returned for `null`
     * and `undefined` values. The sign of `-0` is preserved.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {string} Returns the converted string.
     * @example
     *
     * _.toString(null);
     * // => ''
     *
     * _.toString(-0);
     * // => '-0'
     *
     * _.toString([1, 2, 3]);
     * // => '1,2,3'
     */
    function toString(value) {
      return value == null ? '' : baseToString(value);
    }

    /*------------------------------------------------------------------------*/

    /**
     * Assigns own enumerable string keyed properties of source objects to the
     * destination object. Source objects are applied from left to right.
     * Subsequent sources overwrite property assignments of previous sources.
     *
     * **Note:** This method mutates `object` and is loosely based on
     * [`Object.assign`](https://mdn.io/Object/assign).
     *
     * @static
     * @memberOf _
     * @since 0.10.0
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} [sources] The source objects.
     * @returns {Object} Returns `object`.
     * @see _.assignIn
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     * }
     *
     * function Bar() {
     *   this.c = 3;
     * }
     *
     * Foo.prototype.b = 2;
     * Bar.prototype.d = 4;
     *
     * _.assign({ 'a': 0 }, new Foo, new Bar);
     * // => { 'a': 1, 'c': 3 }
     */
    var assign = createAssigner(function(object, source) {
      if (isPrototype(source) || isArrayLike(source)) {
        copyObject(source, keys(source), object);
        return;
      }
      for (var key in source) {
        if (hasOwnProperty.call(source, key)) {
          assignValue(object, key, source[key]);
        }
      }
    });

    /**
     * This method is like `_.assign` except that it iterates over own and
     * inherited source properties.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @alias extend
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} [sources] The source objects.
     * @returns {Object} Returns `object`.
     * @see _.assign
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     * }
     *
     * function Bar() {
     *   this.c = 3;
     * }
     *
     * Foo.prototype.b = 2;
     * Bar.prototype.d = 4;
     *
     * _.assignIn({ 'a': 0 }, new Foo, new Bar);
     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
     */
    var assignIn = createAssigner(function(object, source) {
      copyObject(source, keysIn(source), object);
    });

    /**
     * This method is like `_.assignIn` except that it accepts `customizer`
     * which is invoked to produce the assigned values. If `customizer` returns
     * `undefined`, assignment is handled by the method instead. The `customizer`
     * is invoked with five arguments: (objValue, srcValue, key, object, source).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @alias extendWith
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} sources The source objects.
     * @param {Function} [customizer] The function to customize assigned values.
     * @returns {Object} Returns `object`.
     * @see _.assignWith
     * @example
     *
     * function customizer(objValue, srcValue) {
     *   return _.isUndefined(objValue) ? srcValue : objValue;
     * }
     *
     * var defaults = _.partialRight(_.assignInWith, customizer);
     *
     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
     * // => { 'a': 1, 'b': 2 }
     */
    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
      copyObject(source, keysIn(source), object, customizer);
    });

    /**
     * This method is like `_.assign` except that it accepts `customizer`
     * which is invoked to produce the assigned values. If `customizer` returns
     * `undefined`, assignment is handled by the method instead. The `customizer`
     * is invoked with five arguments: (objValue, srcValue, key, object, source).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} sources The source objects.
     * @param {Function} [customizer] The function to customize assigned values.
     * @returns {Object} Returns `object`.
     * @see _.assignInWith
     * @example
     *
     * function customizer(objValue, srcValue) {
     *   return _.isUndefined(objValue) ? srcValue : objValue;
     * }
     *
     * var defaults = _.partialRight(_.assignWith, customizer);
     *
     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
     * // => { 'a': 1, 'b': 2 }
     */
    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
      copyObject(source, keys(source), object, customizer);
    });

    /**
     * Creates an array of values corresponding to `paths` of `object`.
     *
     * @static
     * @memberOf _
     * @since 1.0.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {...(string|string[])} [paths] The property paths to pick.
     * @returns {Array} Returns the picked values.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
     *
     * _.at(object, ['a[0].b.c', 'a[1]']);
     * // => [3, 4]
     */
    var at = flatRest(baseAt);

    /**
     * Creates an object that inherits from the `prototype` object. If a
     * `properties` object is given, its own enumerable string keyed properties
     * are assigned to the created object.
     *
     * @static
     * @memberOf _
     * @since 2.3.0
     * @category Object
     * @param {Object} prototype The object to inherit from.
     * @param {Object} [properties] The properties to assign to the object.
     * @returns {Object} Returns the new object.
     * @example
     *
     * function Shape() {
     *   this.x = 0;
     *   this.y = 0;
     * }
     *
     * function Circle() {
     *   Shape.call(this);
     * }
     *
     * Circle.prototype = _.create(Shape.prototype, {
     *   'constructor': Circle
     * });
     *
     * var circle = new Circle;
     * circle instanceof Circle;
     * // => true
     *
     * circle instanceof Shape;
     * // => true
     */
    function create(prototype, properties) {
      var result = baseCreate(prototype);
      return properties == null ? result : baseAssign(result, properties);
    }

    /**
     * Assigns own and inherited enumerable string keyed properties of source
     * objects to the destination object for all destination properties that
     * resolve to `undefined`. Source objects are applied from left to right.
     * Once a property is set, additional values of the same property are ignored.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} [sources] The source objects.
     * @returns {Object} Returns `object`.
     * @see _.defaultsDeep
     * @example
     *
     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
     * // => { 'a': 1, 'b': 2 }
     */
    var defaults = baseRest(function(object, sources) {
      object = Object(object);

      var index = -1;
      var length = sources.length;
      var guard = length > 2 ? sources[2] : undefined;

      if (guard && isIterateeCall(sources[0], sources[1], guard)) {
        length = 1;
      }

      while (++index < length) {
        var source = sources[index];
        var props = keysIn(source);
        var propsIndex = -1;
        var propsLength = props.length;

        while (++propsIndex < propsLength) {
          var key = props[propsIndex];
          var value = object[key];

          if (value === undefined ||
              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
            object[key] = source[key];
          }
        }
      }

      return object;
    });

    /**
     * This method is like `_.defaults` except that it recursively assigns
     * default properties.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 3.10.0
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} [sources] The source objects.
     * @returns {Object} Returns `object`.
     * @see _.defaults
     * @example
     *
     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
     * // => { 'a': { 'b': 2, 'c': 3 } }
     */
    var defaultsDeep = baseRest(function(args) {
      args.push(undefined, customDefaultsMerge);
      return apply(mergeWith, undefined, args);
    });

    /**
     * This method is like `_.find` except that it returns the key of the first
     * element `predicate` returns truthy for instead of the element itself.
     *
     * @static
     * @memberOf _
     * @since 1.1.0
     * @category Object
     * @param {Object} object The object to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {string|undefined} Returns the key of the matched element,
     *  else `undefined`.
     * @example
     *
     * var users = {
     *   'barney':  { 'age': 36, 'active': true },
     *   'fred':    { 'age': 40, 'active': false },
     *   'pebbles': { 'age': 1,  'active': true }
     * };
     *
     * _.findKey(users, function(o) { return o.age < 40; });
     * // => 'barney' (iteration order is not guaranteed)
     *
     * // The `_.matches` iteratee shorthand.
     * _.findKey(users, { 'age': 1, 'active': true });
     * // => 'pebbles'
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.findKey(users, ['active', false]);
     * // => 'fred'
     *
     * // The `_.property` iteratee shorthand.
     * _.findKey(users, 'active');
     * // => 'barney'
     */
    function findKey(object, predicate) {
      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
    }

    /**
     * This method is like `_.findKey` except that it iterates over elements of
     * a collection in the opposite order.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Object
     * @param {Object} object The object to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {string|undefined} Returns the key of the matched element,
     *  else `undefined`.
     * @example
     *
     * var users = {
     *   'barney':  { 'age': 36, 'active': true },
     *   'fred':    { 'age': 40, 'active': false },
     *   'pebbles': { 'age': 1,  'active': true }
     * };
     *
     * _.findLastKey(users, function(o) { return o.age < 40; });
     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
     *
     * // The `_.matches` iteratee shorthand.
     * _.findLastKey(users, { 'age': 36, 'active': true });
     * // => 'barney'
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.findLastKey(users, ['active', false]);
     * // => 'fred'
     *
     * // The `_.property` iteratee shorthand.
     * _.findLastKey(users, 'active');
     * // => 'pebbles'
     */
    function findLastKey(object, predicate) {
      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
    }

    /**
     * Iterates over own and inherited enumerable string keyed properties of an
     * object and invokes `iteratee` for each property. The iteratee is invoked
     * with three arguments: (value, key, object). Iteratee functions may exit
     * iteration early by explicitly returning `false`.
     *
     * @static
     * @memberOf _
     * @since 0.3.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns `object`.
     * @see _.forInRight
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.forIn(new Foo, function(value, key) {
     *   console.log(key);
     * });
     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
     */
    function forIn(object, iteratee) {
      return object == null
        ? object
        : baseFor(object, getIteratee(iteratee, 3), keysIn);
    }

    /**
     * This method is like `_.forIn` except that it iterates over properties of
     * `object` in the opposite order.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns `object`.
     * @see _.forIn
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.forInRight(new Foo, function(value, key) {
     *   console.log(key);
     * });
     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
     */
    function forInRight(object, iteratee) {
      return object == null
        ? object
        : baseForRight(object, getIteratee(iteratee, 3), keysIn);
    }

    /**
     * Iterates over own enumerable string keyed properties of an object and
     * invokes `iteratee` for each property. The iteratee is invoked with three
     * arguments: (value, key, object). Iteratee functions may exit iteration
     * early by explicitly returning `false`.
     *
     * @static
     * @memberOf _
     * @since 0.3.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns `object`.
     * @see _.forOwnRight
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.forOwn(new Foo, function(value, key) {
     *   console.log(key);
     * });
     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
     */
    function forOwn(object, iteratee) {
      return object && baseForOwn(object, getIteratee(iteratee, 3));
    }

    /**
     * This method is like `_.forOwn` except that it iterates over properties of
     * `object` in the opposite order.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns `object`.
     * @see _.forOwn
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.forOwnRight(new Foo, function(value, key) {
     *   console.log(key);
     * });
     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
     */
    function forOwnRight(object, iteratee) {
      return object && baseForOwnRight(object, getIteratee(iteratee, 3));
    }

    /**
     * Creates an array of function property names from own enumerable properties
     * of `object`.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The object to inspect.
     * @returns {Array} Returns the function names.
     * @see _.functionsIn
     * @example
     *
     * function Foo() {
     *   this.a = _.constant('a');
     *   this.b = _.constant('b');
     * }
     *
     * Foo.prototype.c = _.constant('c');
     *
     * _.functions(new Foo);
     * // => ['a', 'b']
     */
    function functions(object) {
      return object == null ? [] : baseFunctions(object, keys(object));
    }

    /**
     * Creates an array of function property names from own and inherited
     * enumerable properties of `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The object to inspect.
     * @returns {Array} Returns the function names.
     * @see _.functions
     * @example
     *
     * function Foo() {
     *   this.a = _.constant('a');
     *   this.b = _.constant('b');
     * }
     *
     * Foo.prototype.c = _.constant('c');
     *
     * _.functionsIn(new Foo);
     * // => ['a', 'b', 'c']
     */
    function functionsIn(object) {
      return object == null ? [] : baseFunctions(object, keysIn(object));
    }

    /**
     * Gets the value at `path` of `object`. If the resolved value is
     * `undefined`, the `defaultValue` is returned in its place.
     *
     * @static
     * @memberOf _
     * @since 3.7.0
     * @category Object
     * @param {Object} object The object to query.
     * @param {Array|string} path The path of the property to get.
     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
     * @returns {*} Returns the resolved value.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
     *
     * _.get(object, 'a[0].b.c');
     * // => 3
     *
     * _.get(object, ['a', '0', 'b', 'c']);
     * // => 3
     *
     * _.get(object, 'a.b.c', 'default');
     * // => 'default'
     */
    function get(object, path, defaultValue) {
      var result = object == null ? undefined : baseGet(object, path);
      return result === undefined ? defaultValue : result;
    }

    /**
     * Checks if `path` is a direct property of `object`.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The object to query.
     * @param {Array|string} path The path to check.
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
     * @example
     *
     * var object = { 'a': { 'b': 2 } };
     * var other = _.create({ 'a': _.create({ 'b': 2 }) });
     *
     * _.has(object, 'a');
     * // => true
     *
     * _.has(object, 'a.b');
     * // => true
     *
     * _.has(object, ['a', 'b']);
     * // => true
     *
     * _.has(other, 'a');
     * // => false
     */
    function has(object, path) {
      return object != null && hasPath(object, path, baseHas);
    }

    /**
     * Checks if `path` is a direct or inherited property of `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The object to query.
     * @param {Array|string} path The path to check.
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
     * @example
     *
     * var object = _.create({ 'a': _.create({ 'b': 2 }) });
     *
     * _.hasIn(object, 'a');
     * // => true
     *
     * _.hasIn(object, 'a.b');
     * // => true
     *
     * _.hasIn(object, ['a', 'b']);
     * // => true
     *
     * _.hasIn(object, 'b');
     * // => false
     */
    function hasIn(object, path) {
      return object != null && hasPath(object, path, baseHasIn);
    }

    /**
     * Creates an object composed of the inverted keys and values of `object`.
     * If `object` contains duplicate values, subsequent values overwrite
     * property assignments of previous values.
     *
     * @static
     * @memberOf _
     * @since 0.7.0
     * @category Object
     * @param {Object} object The object to invert.
     * @returns {Object} Returns the new inverted object.
     * @example
     *
     * var object = { 'a': 1, 'b': 2, 'c': 1 };
     *
     * _.invert(object);
     * // => { '1': 'c', '2': 'b' }
     */
    var invert = createInverter(function(result, value, key) {
      if (value != null &&
          typeof value.toString != 'function') {
        value = nativeObjectToString.call(value);
      }

      result[value] = key;
    }, constant(identity));

    /**
     * This method is like `_.invert` except that the inverted object is generated
     * from the results of running each element of `object` thru `iteratee`. The
     * corresponding inverted value of each inverted key is an array of keys
     * responsible for generating the inverted value. The iteratee is invoked
     * with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.1.0
     * @category Object
     * @param {Object} object The object to invert.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Object} Returns the new inverted object.
     * @example
     *
     * var object = { 'a': 1, 'b': 2, 'c': 1 };
     *
     * _.invertBy(object);
     * // => { '1': ['a', 'c'], '2': ['b'] }
     *
     * _.invertBy(object, function(value) {
     *   return 'group' + value;
     * });
     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
     */
    var invertBy = createInverter(function(result, value, key) {
      if (value != null &&
          typeof value.toString != 'function') {
        value = nativeObjectToString.call(value);
      }

      if (hasOwnProperty.call(result, value)) {
        result[value].push(key);
      } else {
        result[value] = [key];
      }
    }, getIteratee);

    /**
     * Invokes the method at `path` of `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The object to query.
     * @param {Array|string} path The path of the method to invoke.
     * @param {...*} [args] The arguments to invoke the method with.
     * @returns {*} Returns the result of the invoked method.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
     *
     * _.invoke(object, 'a[0].b.c.slice', 1, 3);
     * // => [2, 3]
     */
    var invoke = baseRest(baseInvoke);

    /**
     * Creates an array of the own enumerable property names of `object`.
     *
     * **Note:** Non-object values are coerced to objects. See the
     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
     * for more details.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.keys(new Foo);
     * // => ['a', 'b'] (iteration order is not guaranteed)
     *
     * _.keys('hi');
     * // => ['0', '1']
     */
    function keys(object) {
      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
    }

    /**
     * Creates an array of the own and inherited enumerable property names of `object`.
     *
     * **Note:** Non-object values are coerced to objects.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.keysIn(new Foo);
     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
     */
    function keysIn(object) {
      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
    }

    /**
     * The opposite of `_.mapValues`; this method creates an object with the
     * same values as `object` and keys generated by running each own enumerable
     * string keyed property of `object` thru `iteratee`. The iteratee is invoked
     * with three arguments: (value, key, object).
     *
     * @static
     * @memberOf _
     * @since 3.8.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns the new mapped object.
     * @see _.mapValues
     * @example
     *
     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
     *   return key + value;
     * });
     * // => { 'a1': 1, 'b2': 2 }
     */
    function mapKeys(object, iteratee) {
      var result = {};
      iteratee = getIteratee(iteratee, 3);

      baseForOwn(object, function(value, key, object) {
        baseAssignValue(result, iteratee(value, key, object), value);
      });
      return result;
    }

    /**
     * Creates an object with the same keys as `object` and values generated
     * by running each own enumerable string keyed property of `object` thru
     * `iteratee`. The iteratee is invoked with three arguments:
     * (value, key, object).
     *
     * @static
     * @memberOf _
     * @since 2.4.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns the new mapped object.
     * @see _.mapKeys
     * @example
     *
     * var users = {
     *   'fred':    { 'user': 'fred',    'age': 40 },
     *   'pebbles': { 'user': 'pebbles', 'age': 1 }
     * };
     *
     * _.mapValues(users, function(o) { return o.age; });
     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
     *
     * // The `_.property` iteratee shorthand.
     * _.mapValues(users, 'age');
     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
     */
    function mapValues(object, iteratee) {
      var result = {};
      iteratee = getIteratee(iteratee, 3);

      baseForOwn(object, function(value, key, object) {
        baseAssignValue(result, key, iteratee(value, key, object));
      });
      return result;
    }

    /**
     * This method is like `_.assign` except that it recursively merges own and
     * inherited enumerable string keyed properties of source objects into the
     * destination object. Source properties that resolve to `undefined` are
     * skipped if a destination value exists. Array and plain object properties
     * are merged recursively. Other objects and value types are overridden by
     * assignment. Source objects are applied from left to right. Subsequent
     * sources overwrite property assignments of previous sources.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 0.5.0
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} [sources] The source objects.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var object = {
     *   'a': [{ 'b': 2 }, { 'd': 4 }]
     * };
     *
     * var other = {
     *   'a': [{ 'c': 3 }, { 'e': 5 }]
     * };
     *
     * _.merge(object, other);
     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
     */
    var merge = createAssigner(function(object, source, srcIndex) {
      baseMerge(object, source, srcIndex);
    });

    /**
     * This method is like `_.merge` except that it accepts `customizer` which
     * is invoked to produce the merged values of the destination and source
     * properties. If `customizer` returns `undefined`, merging is handled by the
     * method instead. The `customizer` is invoked with six arguments:
     * (objValue, srcValue, key, object, source, stack).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} sources The source objects.
     * @param {Function} customizer The function to customize assigned values.
     * @returns {Object} Returns `object`.
     * @example
     *
     * function customizer(objValue, srcValue) {
     *   if (_.isArray(objValue)) {
     *     return objValue.concat(srcValue);
     *   }
     * }
     *
     * var object = { 'a': [1], 'b': [2] };
     * var other = { 'a': [3], 'b': [4] };
     *
     * _.mergeWith(object, other, customizer);
     * // => { 'a': [1, 3], 'b': [2, 4] }
     */
    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
      baseMerge(object, source, srcIndex, customizer);
    });

    /**
     * The opposite of `_.pick`; this method creates an object composed of the
     * own and inherited enumerable property paths of `object` that are not omitted.
     *
     * **Note:** This method is considerably slower than `_.pick`.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The source object.
     * @param {...(string|string[])} [paths] The property paths to omit.
     * @returns {Object} Returns the new object.
     * @example
     *
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
     *
     * _.omit(object, ['a', 'c']);
     * // => { 'b': '2' }
     */
    var omit = flatRest(function(object, paths) {
      var result = {};
      if (object == null) {
        return result;
      }
      var isDeep = false;
      paths = arrayMap(paths, function(path) {
        path = castPath(path, object);
        isDeep || (isDeep = path.length > 1);
        return path;
      });
      copyObject(object, getAllKeysIn(object), result);
      if (isDeep) {
        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
      }
      var length = paths.length;
      while (length--) {
        baseUnset(result, paths[length]);
      }
      return result;
    });

    /**
     * The opposite of `_.pickBy`; this method creates an object composed of
     * the own and inherited enumerable string keyed properties of `object` that
     * `predicate` doesn't return truthy for. The predicate is invoked with two
     * arguments: (value, key).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The source object.
     * @param {Function} [predicate=_.identity] The function invoked per property.
     * @returns {Object} Returns the new object.
     * @example
     *
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
     *
     * _.omitBy(object, _.isNumber);
     * // => { 'b': '2' }
     */
    function omitBy(object, predicate) {
      return pickBy(object, negate(getIteratee(predicate)));
    }

    /**
     * Creates an object composed of the picked `object` properties.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The source object.
     * @param {...(string|string[])} [paths] The property paths to pick.
     * @returns {Object} Returns the new object.
     * @example
     *
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
     *
     * _.pick(object, ['a', 'c']);
     * // => { 'a': 1, 'c': 3 }
     */
    var pick = flatRest(function(object, paths) {
      return object == null ? {} : basePick(object, paths);
    });

    /**
     * Creates an object composed of the `object` properties `predicate` returns
     * truthy for. The predicate is invoked with two arguments: (value, key).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The source object.
     * @param {Function} [predicate=_.identity] The function invoked per property.
     * @returns {Object} Returns the new object.
     * @example
     *
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
     *
     * _.pickBy(object, _.isNumber);
     * // => { 'a': 1, 'c': 3 }
     */
    function pickBy(object, predicate) {
      if (object == null) {
        return {};
      }
      var props = arrayMap(getAllKeysIn(object), function(prop) {
        return [prop];
      });
      predicate = getIteratee(predicate);
      return basePickBy(object, props, function(value, path) {
        return predicate(value, path[0]);
      });
    }

    /**
     * This method is like `_.get` except that if the resolved value is a
     * function it's invoked with the `this` binding of its parent object and
     * its result is returned.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The object to query.
     * @param {Array|string} path The path of the property to resolve.
     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
     * @returns {*} Returns the resolved value.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
     *
     * _.result(object, 'a[0].b.c1');
     * // => 3
     *
     * _.result(object, 'a[0].b.c2');
     * // => 4
     *
     * _.result(object, 'a[0].b.c3', 'default');
     * // => 'default'
     *
     * _.result(object, 'a[0].b.c3', _.constant('default'));
     * // => 'default'
     */
    function result(object, path, defaultValue) {
      path = castPath(path, object);

      var index = -1,
          length = path.length;

      // Ensure the loop is entered when path is empty.
      if (!length) {
        length = 1;
        object = undefined;
      }
      while (++index < length) {
        var value = object == null ? undefined : object[toKey(path[index])];
        if (value === undefined) {
          index = length;
          value = defaultValue;
        }
        object = isFunction(value) ? value.call(object) : value;
      }
      return object;
    }

    /**
     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
     * it's created. Arrays are created for missing index properties while objects
     * are created for all other missing properties. Use `_.setWith` to customize
     * `path` creation.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 3.7.0
     * @category Object
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to set.
     * @param {*} value The value to set.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
     *
     * _.set(object, 'a[0].b.c', 4);
     * console.log(object.a[0].b.c);
     * // => 4
     *
     * _.set(object, ['x', '0', 'y', 'z'], 5);
     * console.log(object.x[0].y.z);
     * // => 5
     */
    function set(object, path, value) {
      return object == null ? object : baseSet(object, path, value);
    }

    /**
     * This method is like `_.set` except that it accepts `customizer` which is
     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
     * path creation is handled by the method instead. The `customizer` is invoked
     * with three arguments: (nsValue, key, nsObject).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to set.
     * @param {*} value The value to set.
     * @param {Function} [customizer] The function to customize assigned values.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var object = {};
     *
     * _.setWith(object, '[0][1]', 'a', Object);
     * // => { '0': { '1': 'a' } }
     */
    function setWith(object, path, value, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      return object == null ? object : baseSet(object, path, value, customizer);
    }

    /**
     * Creates an array of own enumerable string keyed-value pairs for `object`
     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
     * entries are returned.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @alias entries
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the key-value pairs.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.toPairs(new Foo);
     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
     */
    var toPairs = createToPairs(keys);

    /**
     * Creates an array of own and inherited enumerable string keyed-value pairs
     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
     * or set, its entries are returned.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @alias entriesIn
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the key-value pairs.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.toPairsIn(new Foo);
     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
     */
    var toPairsIn = createToPairs(keysIn);

    /**
     * An alternative to `_.reduce`; this method transforms `object` to a new
     * `accumulator` object which is the result of running each of its own
     * enumerable string keyed properties thru `iteratee`, with each invocation
     * potentially mutating the `accumulator` object. If `accumulator` is not
     * provided, a new object with the same `[[Prototype]]` will be used. The
     * iteratee is invoked with four arguments: (accumulator, value, key, object).
     * Iteratee functions may exit iteration early by explicitly returning `false`.
     *
     * @static
     * @memberOf _
     * @since 1.3.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @param {*} [accumulator] The custom accumulator value.
     * @returns {*} Returns the accumulated value.
     * @example
     *
     * _.transform([2, 3, 4], function(result, n) {
     *   result.push(n *= n);
     *   return n % 2 == 0;
     * }, []);
     * // => [4, 9]
     *
     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
     *   (result[value] || (result[value] = [])).push(key);
     * }, {});
     * // => { '1': ['a', 'c'], '2': ['b'] }
     */
    function transform(object, iteratee, accumulator) {
      var isArr = isArray(object),
          isArrLike = isArr || isBuffer(object) || isTypedArray(object);

      iteratee = getIteratee(iteratee, 4);
      if (accumulator == null) {
        var Ctor = object && object.constructor;
        if (isArrLike) {
          accumulator = isArr ? new Ctor : [];
        }
        else if (isObject(object)) {
          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
        }
        else {
          accumulator = {};
        }
      }
      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
        return iteratee(accumulator, value, index, object);
      });
      return accumulator;
    }

    /**
     * Removes the property at `path` of `object`.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to unset.
     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 7 } }] };
     * _.unset(object, 'a[0].b.c');
     * // => true
     *
     * console.log(object);
     * // => { 'a': [{ 'b': {} }] };
     *
     * _.unset(object, ['a', '0', 'b', 'c']);
     * // => true
     *
     * console.log(object);
     * // => { 'a': [{ 'b': {} }] };
     */
    function unset(object, path) {
      return object == null ? true : baseUnset(object, path);
    }

    /**
     * This method is like `_.set` except that accepts `updater` to produce the
     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
     * is invoked with one argument: (value).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.6.0
     * @category Object
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to set.
     * @param {Function} updater The function to produce the updated value.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
     *
     * _.update(object, 'a[0].b.c', function(n) { return n * n; });
     * console.log(object.a[0].b.c);
     * // => 9
     *
     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
     * console.log(object.x[0].y.z);
     * // => 0
     */
    function update(object, path, updater) {
      return object == null ? object : baseUpdate(object, path, castFunction(updater));
    }

    /**
     * This method is like `_.update` except that it accepts `customizer` which is
     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
     * path creation is handled by the method instead. The `customizer` is invoked
     * with three arguments: (nsValue, key, nsObject).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.6.0
     * @category Object
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to set.
     * @param {Function} updater The function to produce the updated value.
     * @param {Function} [customizer] The function to customize assigned values.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var object = {};
     *
     * _.updateWith(object, '[0][1]', _.constant('a'), Object);
     * // => { '0': { '1': 'a' } }
     */
    function updateWith(object, path, updater, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
    }

    /**
     * Creates an array of the own enumerable string keyed property values of `object`.
     *
     * **Note:** Non-object values are coerced to objects.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property values.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.values(new Foo);
     * // => [1, 2] (iteration order is not guaranteed)
     *
     * _.values('hi');
     * // => ['h', 'i']
     */
    function values(object) {
      return object == null ? [] : baseValues(object, keys(object));
    }

    /**
     * Creates an array of the own and inherited enumerable string keyed property
     * values of `object`.
     *
     * **Note:** Non-object values are coerced to objects.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property values.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.valuesIn(new Foo);
     * // => [1, 2, 3] (iteration order is not guaranteed)
     */
    function valuesIn(object) {
      return object == null ? [] : baseValues(object, keysIn(object));
    }

    /*------------------------------------------------------------------------*/

    /**
     * Clamps `number` within the inclusive `lower` and `upper` bounds.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Number
     * @param {number} number The number to clamp.
     * @param {number} [lower] The lower bound.
     * @param {number} upper The upper bound.
     * @returns {number} Returns the clamped number.
     * @example
     *
     * _.clamp(-10, -5, 5);
     * // => -5
     *
     * _.clamp(10, -5, 5);
     * // => 5
     */
    function clamp(number, lower, upper) {
      if (upper === undefined) {
        upper = lower;
        lower = undefined;
      }
      if (upper !== undefined) {
        upper = toNumber(upper);
        upper = upper === upper ? upper : 0;
      }
      if (lower !== undefined) {
        lower = toNumber(lower);
        lower = lower === lower ? lower : 0;
      }
      return baseClamp(toNumber(number), lower, upper);
    }

    /**
     * Checks if `n` is between `start` and up to, but not including, `end`. If
     * `end` is not specified, it's set to `start` with `start` then set to `0`.
     * If `start` is greater than `end` the params are swapped to support
     * negative ranges.
     *
     * @static
     * @memberOf _
     * @since 3.3.0
     * @category Number
     * @param {number} number The number to check.
     * @param {number} [start=0] The start of the range.
     * @param {number} end The end of the range.
     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
     * @see _.range, _.rangeRight
     * @example
     *
     * _.inRange(3, 2, 4);
     * // => true
     *
     * _.inRange(4, 8);
     * // => true
     *
     * _.inRange(4, 2);
     * // => false
     *
     * _.inRange(2, 2);
     * // => false
     *
     * _.inRange(1.2, 2);
     * // => true
     *
     * _.inRange(5.2, 4);
     * // => false
     *
     * _.inRange(-3, -2, -6);
     * // => true
     */
    function inRange(number, start, end) {
      start = toFinite(start);
      if (end === undefined) {
        end = start;
        start = 0;
      } else {
        end = toFinite(end);
      }
      number = toNumber(number);
      return baseInRange(number, start, end);
    }

    /**
     * Produces a random number between the inclusive `lower` and `upper` bounds.
     * If only one argument is provided a number between `0` and the given number
     * is returned. If `floating` is `true`, or either `lower` or `upper` are
     * floats, a floating-point number is returned instead of an integer.
     *
     * **Note:** JavaScript follows the IEEE-754 standard for resolving
     * floating-point values which can produce unexpected results.
     *
     * @static
     * @memberOf _
     * @since 0.7.0
     * @category Number
     * @param {number} [lower=0] The lower bound.
     * @param {number} [upper=1] The upper bound.
     * @param {boolean} [floating] Specify returning a floating-point number.
     * @returns {number} Returns the random number.
     * @example
     *
     * _.random(0, 5);
     * // => an integer between 0 and 5
     *
     * _.random(5);
     * // => also an integer between 0 and 5
     *
     * _.random(5, true);
     * // => a floating-point number between 0 and 5
     *
     * _.random(1.2, 5.2);
     * // => a floating-point number between 1.2 and 5.2
     */
    function random(lower, upper, floating) {
      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
        upper = floating = undefined;
      }
      if (floating === undefined) {
        if (typeof upper == 'boolean') {
          floating = upper;
          upper = undefined;
        }
        else if (typeof lower == 'boolean') {
          floating = lower;
          lower = undefined;
        }
      }
      if (lower === undefined && upper === undefined) {
        lower = 0;
        upper = 1;
      }
      else {
        lower = toFinite(lower);
        if (upper === undefined) {
          upper = lower;
          lower = 0;
        } else {
          upper = toFinite(upper);
        }
      }
      if (lower > upper) {
        var temp = lower;
        lower = upper;
        upper = temp;
      }
      if (floating || lower % 1 || upper % 1) {
        var rand = nativeRandom();
        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
      }
      return baseRandom(lower, upper);
    }

    /*------------------------------------------------------------------------*/

    /**
     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the camel cased string.
     * @example
     *
     * _.camelCase('Foo Bar');
     * // => 'fooBar'
     *
     * _.camelCase('--foo-bar--');
     * // => 'fooBar'
     *
     * _.camelCase('__FOO_BAR__');
     * // => 'fooBar'
     */
    var camelCase = createCompounder(function(result, word, index) {
      word = word.toLowerCase();
      return result + (index ? capitalize(word) : word);
    });

    /**
     * Converts the first character of `string` to upper case and the remaining
     * to lower case.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to capitalize.
     * @returns {string} Returns the capitalized string.
     * @example
     *
     * _.capitalize('FRED');
     * // => 'Fred'
     */
    function capitalize(string) {
      return upperFirst(toString(string).toLowerCase());
    }

    /**
     * Deburrs `string` by converting
     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
     * letters to basic Latin letters and removing
     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to deburr.
     * @returns {string} Returns the deburred string.
     * @example
     *
     * _.deburr('déjà vu');
     * // => 'deja vu'
     */
    function deburr(string) {
      string = toString(string);
      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
    }

    /**
     * Checks if `string` ends with the given target string.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to inspect.
     * @param {string} [target] The string to search for.
     * @param {number} [position=string.length] The position to search up to.
     * @returns {boolean} Returns `true` if `string` ends with `target`,
     *  else `false`.
     * @example
     *
     * _.endsWith('abc', 'c');
     * // => true
     *
     * _.endsWith('abc', 'b');
     * // => false
     *
     * _.endsWith('abc', 'b', 2);
     * // => true
     */
    function endsWith(string, target, position) {
      string = toString(string);
      target = baseToString(target);

      var length = string.length;
      position = position === undefined
        ? length
        : baseClamp(toInteger(position), 0, length);

      var end = position;
      position -= target.length;
      return position >= 0 && string.slice(position, end) == target;
    }

    /**
     * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
     * corresponding HTML entities.
     *
     * **Note:** No other characters are escaped. To escape additional
     * characters use a third-party library like [_he_](https://mths.be/he).
     *
     * Though the ">" character is escaped for symmetry, characters like
     * ">" and "/" don't need escaping in HTML and have no special meaning
     * unless they're part of a tag or unquoted attribute value. See
     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
     * (under "semi-related fun fact") for more details.
     *
     * When working with HTML you should always
     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
     * XSS vectors.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category String
     * @param {string} [string=''] The string to escape.
     * @returns {string} Returns the escaped string.
     * @example
     *
     * _.escape('fred, barney, & pebbles');
     * // => 'fred, barney, &amp; pebbles'
     */
    function escape(string) {
      string = toString(string);
      return (string && reHasUnescapedHtml.test(string))
        ? string.replace(reUnescapedHtml, escapeHtmlChar)
        : string;
    }

    /**
     * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
     * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to escape.
     * @returns {string} Returns the escaped string.
     * @example
     *
     * _.escapeRegExp('[lodash](https://lodash.com/)');
     * // => '\[lodash\]\(https://lodash\.com/\)'
     */
    function escapeRegExp(string) {
      string = toString(string);
      return (string && reHasRegExpChar.test(string))
        ? string.replace(reRegExpChar, '\\$&')
        : string;
    }

    /**
     * Converts `string` to
     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the kebab cased string.
     * @example
     *
     * _.kebabCase('Foo Bar');
     * // => 'foo-bar'
     *
     * _.kebabCase('fooBar');
     * // => 'foo-bar'
     *
     * _.kebabCase('__FOO_BAR__');
     * // => 'foo-bar'
     */
    var kebabCase = createCompounder(function(result, word, index) {
      return result + (index ? '-' : '') + word.toLowerCase();
    });

    /**
     * Converts `string`, as space separated words, to lower case.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the lower cased string.
     * @example
     *
     * _.lowerCase('--Foo-Bar--');
     * // => 'foo bar'
     *
     * _.lowerCase('fooBar');
     * // => 'foo bar'
     *
     * _.lowerCase('__FOO_BAR__');
     * // => 'foo bar'
     */
    var lowerCase = createCompounder(function(result, word, index) {
      return result + (index ? ' ' : '') + word.toLowerCase();
    });

    /**
     * Converts the first character of `string` to lower case.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the converted string.
     * @example
     *
     * _.lowerFirst('Fred');
     * // => 'fred'
     *
     * _.lowerFirst('FRED');
     * // => 'fRED'
     */
    var lowerFirst = createCaseFirst('toLowerCase');

    /**
     * Pads `string` on the left and right sides if it's shorter than `length`.
     * Padding characters are truncated if they can't be evenly divided by `length`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to pad.
     * @param {number} [length=0] The padding length.
     * @param {string} [chars=' '] The string used as padding.
     * @returns {string} Returns the padded string.
     * @example
     *
     * _.pad('abc', 8);
     * // => '  abc   '
     *
     * _.pad('abc', 8, '_-');
     * // => '_-abc_-_'
     *
     * _.pad('abc', 3);
     * // => 'abc'
     */
    function pad(string, length, chars) {
      string = toString(string);
      length = toInteger(length);

      var strLength = length ? stringSize(string) : 0;
      if (!length || strLength >= length) {
        return string;
      }
      var mid = (length - strLength) / 2;
      return (
        createPadding(nativeFloor(mid), chars) +
        string +
        createPadding(nativeCeil(mid), chars)
      );
    }

    /**
     * Pads `string` on the right side if it's shorter than `length`. Padding
     * characters are truncated if they exceed `length`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to pad.
     * @param {number} [length=0] The padding length.
     * @param {string} [chars=' '] The string used as padding.
     * @returns {string} Returns the padded string.
     * @example
     *
     * _.padEnd('abc', 6);
     * // => 'abc   '
     *
     * _.padEnd('abc', 6, '_-');
     * // => 'abc_-_'
     *
     * _.padEnd('abc', 3);
     * // => 'abc'
     */
    function padEnd(string, length, chars) {
      string = toString(string);
      length = toInteger(length);

      var strLength = length ? stringSize(string) : 0;
      return (length && strLength < length)
        ? (string + createPadding(length - strLength, chars))
        : string;
    }

    /**
     * Pads `string` on the left side if it's shorter than `length`. Padding
     * characters are truncated if they exceed `length`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to pad.
     * @param {number} [length=0] The padding length.
     * @param {string} [chars=' '] The string used as padding.
     * @returns {string} Returns the padded string.
     * @example
     *
     * _.padStart('abc', 6);
     * // => '   abc'
     *
     * _.padStart('abc', 6, '_-');
     * // => '_-_abc'
     *
     * _.padStart('abc', 3);
     * // => 'abc'
     */
    function padStart(string, length, chars) {
      string = toString(string);
      length = toInteger(length);

      var strLength = length ? stringSize(string) : 0;
      return (length && strLength < length)
        ? (createPadding(length - strLength, chars) + string)
        : string;
    }

    /**
     * Converts `string` to an integer of the specified radix. If `radix` is
     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
     * hexadecimal, in which case a `radix` of `16` is used.
     *
     * **Note:** This method aligns with the
     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
     *
     * @static
     * @memberOf _
     * @since 1.1.0
     * @category String
     * @param {string} string The string to convert.
     * @param {number} [radix=10] The radix to interpret `value` by.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {number} Returns the converted integer.
     * @example
     *
     * _.parseInt('08');
     * // => 8
     *
     * _.map(['6', '08', '10'], _.parseInt);
     * // => [6, 8, 10]
     */
    function parseInt(string, radix, guard) {
      if (guard || radix == null) {
        radix = 0;
      } else if (radix) {
        radix = +radix;
      }
      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
    }

    /**
     * Repeats the given string `n` times.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to repeat.
     * @param {number} [n=1] The number of times to repeat the string.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {string} Returns the repeated string.
     * @example
     *
     * _.repeat('*', 3);
     * // => '***'
     *
     * _.repeat('abc', 2);
     * // => 'abcabc'
     *
     * _.repeat('abc', 0);
     * // => ''
     */
    function repeat(string, n, guard) {
      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
        n = 1;
      } else {
        n = toInteger(n);
      }
      return baseRepeat(toString(string), n);
    }

    /**
     * Replaces matches for `pattern` in `string` with `replacement`.
     *
     * **Note:** This method is based on
     * [`String#replace`](https://mdn.io/String/replace).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to modify.
     * @param {RegExp|string} pattern The pattern to replace.
     * @param {Function|string} replacement The match replacement.
     * @returns {string} Returns the modified string.
     * @example
     *
     * _.replace('Hi Fred', 'Fred', 'Barney');
     * // => 'Hi Barney'
     */
    function replace() {
      var args = arguments,
          string = toString(args[0]);

      return args.length < 3 ? string : string.replace(args[1], args[2]);
    }

    /**
     * Converts `string` to
     * [snake case](https://en.wikipedia.org/wiki/Snake_case).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the snake cased string.
     * @example
     *
     * _.snakeCase('Foo Bar');
     * // => 'foo_bar'
     *
     * _.snakeCase('fooBar');
     * // => 'foo_bar'
     *
     * _.snakeCase('--FOO-BAR--');
     * // => 'foo_bar'
     */
    var snakeCase = createCompounder(function(result, word, index) {
      return result + (index ? '_' : '') + word.toLowerCase();
    });

    /**
     * Splits `string` by `separator`.
     *
     * **Note:** This method is based on
     * [`String#split`](https://mdn.io/String/split).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to split.
     * @param {RegExp|string} separator The separator pattern to split by.
     * @param {number} [limit] The length to truncate results to.
     * @returns {Array} Returns the string segments.
     * @example
     *
     * _.split('a-b-c', '-', 2);
     * // => ['a', 'b']
     */
    function split(string, separator, limit) {
      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
        separator = limit = undefined;
      }
      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
      if (!limit) {
        return [];
      }
      string = toString(string);
      if (string && (
            typeof separator == 'string' ||
            (separator != null && !isRegExp(separator))
          )) {
        separator = baseToString(separator);
        if (!separator && hasUnicode(string)) {
          return castSlice(stringToArray(string), 0, limit);
        }
      }
      return string.split(separator, limit);
    }

    /**
     * Converts `string` to
     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
     *
     * @static
     * @memberOf _
     * @since 3.1.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the start cased string.
     * @example
     *
     * _.startCase('--foo-bar--');
     * // => 'Foo Bar'
     *
     * _.startCase('fooBar');
     * // => 'Foo Bar'
     *
     * _.startCase('__FOO_BAR__');
     * // => 'FOO BAR'
     */
    var startCase = createCompounder(function(result, word, index) {
      return result + (index ? ' ' : '') + upperFirst(word);
    });

    /**
     * Checks if `string` starts with the given target string.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to inspect.
     * @param {string} [target] The string to search for.
     * @param {number} [position=0] The position to search from.
     * @returns {boolean} Returns `true` if `string` starts with `target`,
     *  else `false`.
     * @example
     *
     * _.startsWith('abc', 'a');
     * // => true
     *
     * _.startsWith('abc', 'b');
     * // => false
     *
     * _.startsWith('abc', 'b', 1);
     * // => true
     */
    function startsWith(string, target, position) {
      string = toString(string);
      position = position == null
        ? 0
        : baseClamp(toInteger(position), 0, string.length);

      target = baseToString(target);
      return string.slice(position, position + target.length) == target;
    }

    /**
     * Creates a compiled template function that can interpolate data properties
     * in "interpolate" delimiters, HTML-escape interpolated data properties in
     * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
     * properties may be accessed as free variables in the template. If a setting
     * object is given, it takes precedence over `_.templateSettings` values.
     *
     * **Note:** In the development build `_.template` utilizes
     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
     * for easier debugging.
     *
     * For more information on precompiling templates see
     * [lodash's custom builds documentation](https://lodash.com/custom-builds).
     *
     * For more information on Chrome extension sandboxes see
     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category String
     * @param {string} [string=''] The template string.
     * @param {Object} [options={}] The options object.
     * @param {RegExp} [options.escape=_.templateSettings.escape]
     *  The HTML "escape" delimiter.
     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
     *  The "evaluate" delimiter.
     * @param {Object} [options.imports=_.templateSettings.imports]
     *  An object to import into the template as free variables.
     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
     *  The "interpolate" delimiter.
     * @param {string} [options.sourceURL='lodash.templateSources[n]']
     *  The sourceURL of the compiled template.
     * @param {string} [options.variable='obj']
     *  The data object variable name.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Function} Returns the compiled template function.
     * @example
     *
     * // Use the "interpolate" delimiter to create a compiled template.
     * var compiled = _.template('hello <%= user %>!');
     * compiled({ 'user': 'fred' });
     * // => 'hello fred!'
     *
     * // Use the HTML "escape" delimiter to escape data property values.
     * var compiled = _.template('<b><%- value %></b>');
     * compiled({ 'value': '<script>' });
     * // => '<b>&lt;script&gt;</b>'
     *
     * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
     * compiled({ 'users': ['fred', 'barney'] });
     * // => '<li>fred</li><li>barney</li>'
     *
     * // Use the internal `print` function in "evaluate" delimiters.
     * var compiled = _.template('<% print("hello " + user); %>!');
     * compiled({ 'user': 'barney' });
     * // => 'hello barney!'
     *
     * // Use the ES template literal delimiter as an "interpolate" delimiter.
     * // Disable support by replacing the "interpolate" delimiter.
     * var compiled = _.template('hello ${ user }!');
     * compiled({ 'user': 'pebbles' });
     * // => 'hello pebbles!'
     *
     * // Use backslashes to treat delimiters as plain text.
     * var compiled = _.template('<%= "\\<%- value %\\>" %>');
     * compiled({ 'value': 'ignored' });
     * // => '<%- value %>'
     *
     * // Use the `imports` option to import `jQuery` as `jq`.
     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
     * compiled({ 'users': ['fred', 'barney'] });
     * // => '<li>fred</li><li>barney</li>'
     *
     * // Use the `sourceURL` option to specify a custom sourceURL for the template.
     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
     * compiled(data);
     * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
     *
     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
     * compiled.source;
     * // => function(data) {
     * //   var __t, __p = '';
     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
     * //   return __p;
     * // }
     *
     * // Use custom template delimiters.
     * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
     * var compiled = _.template('hello {{ user }}!');
     * compiled({ 'user': 'mustache' });
     * // => 'hello mustache!'
     *
     * // Use the `source` property to inline compiled templates for meaningful
     * // line numbers in error messages and stack traces.
     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
     *   var JST = {\
     *     "main": ' + _.template(mainText).source + '\
     *   };\
     * ');
     */
    function template(string, options, guard) {
      // Based on John Resig's `tmpl` implementation
      // (http://ejohn.org/blog/javascript-micro-templating/)
      // and Laura Doktorova's doT.js (https://github.com/olado/doT).
      var settings = lodash.templateSettings;

      if (guard && isIterateeCall(string, options, guard)) {
        options = undefined;
      }
      string = toString(string);
      options = assignInWith({}, options, settings, customDefaultsAssignIn);

      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
          importsKeys = keys(imports),
          importsValues = baseValues(imports, importsKeys);

      var isEscaping,
          isEvaluating,
          index = 0,
          interpolate = options.interpolate || reNoMatch,
          source = "__p += '";

      // Compile the regexp to match each delimiter.
      var reDelimiters = RegExp(
        (options.escape || reNoMatch).source + '|' +
        interpolate.source + '|' +
        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
        (options.evaluate || reNoMatch).source + '|$'
      , 'g');

      // Use a sourceURL for easier debugging.
      // The sourceURL gets injected into the source that's eval-ed, so be careful
      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in
      // and escape the comment, thus injecting code that gets evaled.
      var sourceURL = '//# sourceURL=' +
        (hasOwnProperty.call(options, 'sourceURL')
          ? (options.sourceURL + '').replace(/\s/g, ' ')
          : ('lodash.templateSources[' + (++templateCounter) + ']')
        ) + '\n';

      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
        interpolateValue || (interpolateValue = esTemplateValue);

        // Escape characters that can't be included in string literals.
        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);

        // Replace delimiters with snippets.
        if (escapeValue) {
          isEscaping = true;
          source += "' +\n__e(" + escapeValue + ") +\n'";
        }
        if (evaluateValue) {
          isEvaluating = true;
          source += "';\n" + evaluateValue + ";\n__p += '";
        }
        if (interpolateValue) {
          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
        }
        index = offset + match.length;

        // The JS engine embedded in Adobe products needs `match` returned in
        // order to produce the correct `offset` value.
        return match;
      });

      source += "';\n";

      // If `variable` is not specified wrap a with-statement around the generated
      // code to add the data object to the top of the scope chain.
      var variable = hasOwnProperty.call(options, 'variable') && options.variable;
      if (!variable) {
        source = 'with (obj) {\n' + source + '\n}\n';
      }
      // Throw an error if a forbidden character was found in `variable`, to prevent
      // potential command injection attacks.
      else if (reForbiddenIdentifierChars.test(variable)) {
        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);
      }

      // Cleanup code by stripping empty strings.
      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
        .replace(reEmptyStringMiddle, '$1')
        .replace(reEmptyStringTrailing, '$1;');

      // Frame code as the function body.
      source = 'function(' + (variable || 'obj') + ') {\n' +
        (variable
          ? ''
          : 'obj || (obj = {});\n'
        ) +
        "var __t, __p = ''" +
        (isEscaping
           ? ', __e = _.escape'
           : ''
        ) +
        (isEvaluating
          ? ', __j = Array.prototype.join;\n' +
            "function print() { __p += __j.call(arguments, '') }\n"
          : ';\n'
        ) +
        source +
        'return __p\n}';

      var result = attempt(function() {
        return Function(importsKeys, sourceURL + 'return ' + source)
          .apply(undefined, importsValues);
      });

      // Provide the compiled function's source by its `toString` method or
      // the `source` property as a convenience for inlining compiled templates.
      result.source = source;
      if (isError(result)) {
        throw result;
      }
      return result;
    }

    /**
     * Converts `string`, as a whole, to lower case just like
     * [String#toLowerCase](https://mdn.io/toLowerCase).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the lower cased string.
     * @example
     *
     * _.toLower('--Foo-Bar--');
     * // => '--foo-bar--'
     *
     * _.toLower('fooBar');
     * // => 'foobar'
     *
     * _.toLower('__FOO_BAR__');
     * // => '__foo_bar__'
     */
    function toLower(value) {
      return toString(value).toLowerCase();
    }

    /**
     * Converts `string`, as a whole, to upper case just like
     * [String#toUpperCase](https://mdn.io/toUpperCase).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the upper cased string.
     * @example
     *
     * _.toUpper('--foo-bar--');
     * // => '--FOO-BAR--'
     *
     * _.toUpper('fooBar');
     * // => 'FOOBAR'
     *
     * _.toUpper('__foo_bar__');
     * // => '__FOO_BAR__'
     */
    function toUpper(value) {
      return toString(value).toUpperCase();
    }

    /**
     * Removes leading and trailing whitespace or specified characters from `string`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to trim.
     * @param {string} [chars=whitespace] The characters to trim.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {string} Returns the trimmed string.
     * @example
     *
     * _.trim('  abc  ');
     * // => 'abc'
     *
     * _.trim('-_-abc-_-', '_-');
     * // => 'abc'
     *
     * _.map(['  foo  ', '  bar  '], _.trim);
     * // => ['foo', 'bar']
     */
    function trim(string, chars, guard) {
      string = toString(string);
      if (string && (guard || chars === undefined)) {
        return baseTrim(string);
      }
      if (!string || !(chars = baseToString(chars))) {
        return string;
      }
      var strSymbols = stringToArray(string),
          chrSymbols = stringToArray(chars),
          start = charsStartIndex(strSymbols, chrSymbols),
          end = charsEndIndex(strSymbols, chrSymbols) + 1;

      return castSlice(strSymbols, start, end).join('');
    }

    /**
     * Removes trailing whitespace or specified characters from `string`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to trim.
     * @param {string} [chars=whitespace] The characters to trim.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {string} Returns the trimmed string.
     * @example
     *
     * _.trimEnd('  abc  ');
     * // => '  abc'
     *
     * _.trimEnd('-_-abc-_-', '_-');
     * // => '-_-abc'
     */
    function trimEnd(string, chars, guard) {
      string = toString(string);
      if (string && (guard || chars === undefined)) {
        return string.slice(0, trimmedEndIndex(string) + 1);
      }
      if (!string || !(chars = baseToString(chars))) {
        return string;
      }
      var strSymbols = stringToArray(string),
          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;

      return castSlice(strSymbols, 0, end).join('');
    }

    /**
     * Removes leading whitespace or specified characters from `string`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to trim.
     * @param {string} [chars=whitespace] The characters to trim.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {string} Returns the trimmed string.
     * @example
     *
     * _.trimStart('  abc  ');
     * // => 'abc  '
     *
     * _.trimStart('-_-abc-_-', '_-');
     * // => 'abc-_-'
     */
    function trimStart(string, chars, guard) {
      string = toString(string);
      if (string && (guard || chars === undefined)) {
        return string.replace(reTrimStart, '');
      }
      if (!string || !(chars = baseToString(chars))) {
        return string;
      }
      var strSymbols = stringToArray(string),
          start = charsStartIndex(strSymbols, stringToArray(chars));

      return castSlice(strSymbols, start).join('');
    }

    /**
     * Truncates `string` if it's longer than the given maximum string length.
     * The last characters of the truncated string are replaced with the omission
     * string which defaults to "...".
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to truncate.
     * @param {Object} [options={}] The options object.
     * @param {number} [options.length=30] The maximum string length.
     * @param {string} [options.omission='...'] The string to indicate text is omitted.
     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
     * @returns {string} Returns the truncated string.
     * @example
     *
     * _.truncate('hi-diddly-ho there, neighborino');
     * // => 'hi-diddly-ho there, neighbo...'
     *
     * _.truncate('hi-diddly-ho there, neighborino', {
     *   'length': 24,
     *   'separator': ' '
     * });
     * // => 'hi-diddly-ho there,...'
     *
     * _.truncate('hi-diddly-ho there, neighborino', {
     *   'length': 24,
     *   'separator': /,? +/
     * });
     * // => 'hi-diddly-ho there...'
     *
     * _.truncate('hi-diddly-ho there, neighborino', {
     *   'omission': ' [...]'
     * });
     * // => 'hi-diddly-ho there, neig [...]'
     */
    function truncate(string, options) {
      var length = DEFAULT_TRUNC_LENGTH,
          omission = DEFAULT_TRUNC_OMISSION;

      if (isObject(options)) {
        var separator = 'separator' in options ? options.separator : separator;
        length = 'length' in options ? toInteger(options.length) : length;
        omission = 'omission' in options ? baseToString(options.omission) : omission;
      }
      string = toString(string);

      var strLength = string.length;
      if (hasUnicode(string)) {
        var strSymbols = stringToArray(string);
        strLength = strSymbols.length;
      }
      if (length >= strLength) {
        return string;
      }
      var end = length - stringSize(omission);
      if (end < 1) {
        return omission;
      }
      var result = strSymbols
        ? castSlice(strSymbols, 0, end).join('')
        : string.slice(0, end);

      if (separator === undefined) {
        return result + omission;
      }
      if (strSymbols) {
        end += (result.length - end);
      }
      if (isRegExp(separator)) {
        if (string.slice(end).search(separator)) {
          var match,
              substring = result;

          if (!separator.global) {
            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
          }
          separator.lastIndex = 0;
          while ((match = separator.exec(substring))) {
            var newEnd = match.index;
          }
          result = result.slice(0, newEnd === undefined ? end : newEnd);
        }
      } else if (string.indexOf(baseToString(separator), end) != end) {
        var index = result.lastIndexOf(separator);
        if (index > -1) {
          result = result.slice(0, index);
        }
      }
      return result + omission;
    }

    /**
     * The inverse of `_.escape`; this method converts the HTML entities
     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
     * their corresponding characters.
     *
     * **Note:** No other HTML entities are unescaped. To unescape additional
     * HTML entities use a third-party library like [_he_](https://mths.be/he).
     *
     * @static
     * @memberOf _
     * @since 0.6.0
     * @category String
     * @param {string} [string=''] The string to unescape.
     * @returns {string} Returns the unescaped string.
     * @example
     *
     * _.unescape('fred, barney, &amp; pebbles');
     * // => 'fred, barney, & pebbles'
     */
    function unescape(string) {
      string = toString(string);
      return (string && reHasEscapedHtml.test(string))
        ? string.replace(reEscapedHtml, unescapeHtmlChar)
        : string;
    }

    /**
     * Converts `string`, as space separated words, to upper case.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the upper cased string.
     * @example
     *
     * _.upperCase('--foo-bar');
     * // => 'FOO BAR'
     *
     * _.upperCase('fooBar');
     * // => 'FOO BAR'
     *
     * _.upperCase('__foo_bar__');
     * // => 'FOO BAR'
     */
    var upperCase = createCompounder(function(result, word, index) {
      return result + (index ? ' ' : '') + word.toUpperCase();
    });

    /**
     * Converts the first character of `string` to upper case.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the converted string.
     * @example
     *
     * _.upperFirst('fred');
     * // => 'Fred'
     *
     * _.upperFirst('FRED');
     * // => 'FRED'
     */
    var upperFirst = createCaseFirst('toUpperCase');

    /**
     * Splits `string` into an array of its words.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to inspect.
     * @param {RegExp|string} [pattern] The pattern to match words.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the words of `string`.
     * @example
     *
     * _.words('fred, barney, & pebbles');
     * // => ['fred', 'barney', 'pebbles']
     *
     * _.words('fred, barney, & pebbles', /[^, ]+/g);
     * // => ['fred', 'barney', '&', 'pebbles']
     */
    function words(string, pattern, guard) {
      string = toString(string);
      pattern = guard ? undefined : pattern;

      if (pattern === undefined) {
        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
      }
      return string.match(pattern) || [];
    }

    /*------------------------------------------------------------------------*/

    /**
     * Attempts to invoke `func`, returning either the result or the caught error
     * object. Any additional arguments are provided to `func` when it's invoked.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Util
     * @param {Function} func The function to attempt.
     * @param {...*} [args] The arguments to invoke `func` with.
     * @returns {*} Returns the `func` result or error object.
     * @example
     *
     * // Avoid throwing errors for invalid selectors.
     * var elements = _.attempt(function(selector) {
     *   return document.querySelectorAll(selector);
     * }, '>_>');
     *
     * if (_.isError(elements)) {
     *   elements = [];
     * }
     */
    var attempt = baseRest(function(func, args) {
      try {
        return apply(func, undefined, args);
      } catch (e) {
        return isError(e) ? e : new Error(e);
      }
    });

    /**
     * Binds methods of an object to the object itself, overwriting the existing
     * method.
     *
     * **Note:** This method doesn't set the "length" property of bound functions.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {Object} object The object to bind and assign the bound methods to.
     * @param {...(string|string[])} methodNames The object method names to bind.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var view = {
     *   'label': 'docs',
     *   'click': function() {
     *     console.log('clicked ' + this.label);
     *   }
     * };
     *
     * _.bindAll(view, ['click']);
     * jQuery(element).on('click', view.click);
     * // => Logs 'clicked docs' when clicked.
     */
    var bindAll = flatRest(function(object, methodNames) {
      arrayEach(methodNames, function(key) {
        key = toKey(key);
        baseAssignValue(object, key, bind(object[key], object));
      });
      return object;
    });

    /**
     * Creates a function that iterates over `pairs` and invokes the corresponding
     * function of the first predicate to return truthy. The predicate-function
     * pairs are invoked with the `this` binding and arguments of the created
     * function.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {Array} pairs The predicate-function pairs.
     * @returns {Function} Returns the new composite function.
     * @example
     *
     * var func = _.cond([
     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
     *   [_.stubTrue,                      _.constant('no match')]
     * ]);
     *
     * func({ 'a': 1, 'b': 2 });
     * // => 'matches A'
     *
     * func({ 'a': 0, 'b': 1 });
     * // => 'matches B'
     *
     * func({ 'a': '1', 'b': '2' });
     * // => 'no match'
     */
    function cond(pairs) {
      var length = pairs == null ? 0 : pairs.length,
          toIteratee = getIteratee();

      pairs = !length ? [] : arrayMap(pairs, function(pair) {
        if (typeof pair[1] != 'function') {
          throw new TypeError(FUNC_ERROR_TEXT);
        }
        return [toIteratee(pair[0]), pair[1]];
      });

      return baseRest(function(args) {
        var index = -1;
        while (++index < length) {
          var pair = pairs[index];
          if (apply(pair[0], this, args)) {
            return apply(pair[1], this, args);
          }
        }
      });
    }

    /**
     * Creates a function that invokes the predicate properties of `source` with
     * the corresponding property values of a given object, returning `true` if
     * all predicates return truthy, else `false`.
     *
     * **Note:** The created function is equivalent to `_.conformsTo` with
     * `source` partially applied.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {Object} source The object of property predicates to conform to.
     * @returns {Function} Returns the new spec function.
     * @example
     *
     * var objects = [
     *   { 'a': 2, 'b': 1 },
     *   { 'a': 1, 'b': 2 }
     * ];
     *
     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
     * // => [{ 'a': 1, 'b': 2 }]
     */
    function conforms(source) {
      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
    }

    /**
     * Creates a function that returns `value`.
     *
     * @static
     * @memberOf _
     * @since 2.4.0
     * @category Util
     * @param {*} value The value to return from the new function.
     * @returns {Function} Returns the new constant function.
     * @example
     *
     * var objects = _.times(2, _.constant({ 'a': 1 }));
     *
     * console.log(objects);
     * // => [{ 'a': 1 }, { 'a': 1 }]
     *
     * console.log(objects[0] === objects[1]);
     * // => true
     */
    function constant(value) {
      return function() {
        return value;
      };
    }

    /**
     * Checks `value` to determine whether a default value should be returned in
     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
     * or `undefined`.
     *
     * @static
     * @memberOf _
     * @since 4.14.0
     * @category Util
     * @param {*} value The value to check.
     * @param {*} defaultValue The default value.
     * @returns {*} Returns the resolved value.
     * @example
     *
     * _.defaultTo(1, 10);
     * // => 1
     *
     * _.defaultTo(undefined, 10);
     * // => 10
     */
    function defaultTo(value, defaultValue) {
      return (value == null || value !== value) ? defaultValue : value;
    }

    /**
     * Creates a function that returns the result of invoking the given functions
     * with the `this` binding of the created function, where each successive
     * invocation is supplied the return value of the previous.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Util
     * @param {...(Function|Function[])} [funcs] The functions to invoke.
     * @returns {Function} Returns the new composite function.
     * @see _.flowRight
     * @example
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * var addSquare = _.flow([_.add, square]);
     * addSquare(1, 2);
     * // => 9
     */
    var flow = createFlow();

    /**
     * This method is like `_.flow` except that it creates a function that
     * invokes the given functions from right to left.
     *
     * @static
     * @since 3.0.0
     * @memberOf _
     * @category Util
     * @param {...(Function|Function[])} [funcs] The functions to invoke.
     * @returns {Function} Returns the new composite function.
     * @see _.flow
     * @example
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * var addSquare = _.flowRight([square, _.add]);
     * addSquare(1, 2);
     * // => 9
     */
    var flowRight = createFlow(true);

    /**
     * This method returns the first argument it receives.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {*} value Any value.
     * @returns {*} Returns `value`.
     * @example
     *
     * var object = { 'a': 1 };
     *
     * console.log(_.identity(object) === object);
     * // => true
     */
    function identity(value) {
      return value;
    }

    /**
     * Creates a function that invokes `func` with the arguments of the created
     * function. If `func` is a property name, the created function returns the
     * property value for a given element. If `func` is an array or object, the
     * created function returns `true` for elements that contain the equivalent
     * source properties, otherwise it returns `false`.
     *
     * @static
     * @since 4.0.0
     * @memberOf _
     * @category Util
     * @param {*} [func=_.identity] The value to convert to a callback.
     * @returns {Function} Returns the callback.
     * @example
     *
     * var users = [
     *   { 'user': 'barney', 'age': 36, 'active': true },
     *   { 'user': 'fred',   'age': 40, 'active': false }
     * ];
     *
     * // The `_.matches` iteratee shorthand.
     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.filter(users, _.iteratee(['user', 'fred']));
     * // => [{ 'user': 'fred', 'age': 40 }]
     *
     * // The `_.property` iteratee shorthand.
     * _.map(users, _.iteratee('user'));
     * // => ['barney', 'fred']
     *
     * // Create custom iteratee shorthands.
     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
     *     return func.test(string);
     *   };
     * });
     *
     * _.filter(['abc', 'def'], /ef/);
     * // => ['def']
     */
    function iteratee(func) {
      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
    }

    /**
     * Creates a function that performs a partial deep comparison between a given
     * object and `source`, returning `true` if the given object has equivalent
     * property values, else `false`.
     *
     * **Note:** The created function is equivalent to `_.isMatch` with `source`
     * partially applied.
     *
     * Partial comparisons will match empty array and empty object `source`
     * values against any array or object value, respectively. See `_.isEqual`
     * for a list of supported value comparisons.
     *
     * **Note:** Multiple values can be checked by combining several matchers
     * using `_.overSome`
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Util
     * @param {Object} source The object of property values to match.
     * @returns {Function} Returns the new spec function.
     * @example
     *
     * var objects = [
     *   { 'a': 1, 'b': 2, 'c': 3 },
     *   { 'a': 4, 'b': 5, 'c': 6 }
     * ];
     *
     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
     *
     * // Checking for several possible values
     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
     */
    function matches(source) {
      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
    }

    /**
     * Creates a function that performs a partial deep comparison between the
     * value at `path` of a given object to `srcValue`, returning `true` if the
     * object value is equivalent, else `false`.
     *
     * **Note:** Partial comparisons will match empty array and empty object
     * `srcValue` values against any array or object value, respectively. See
     * `_.isEqual` for a list of supported value comparisons.
     *
     * **Note:** Multiple values can be checked by combining several matchers
     * using `_.overSome`
     *
     * @static
     * @memberOf _
     * @since 3.2.0
     * @category Util
     * @param {Array|string} path The path of the property to get.
     * @param {*} srcValue The value to match.
     * @returns {Function} Returns the new spec function.
     * @example
     *
     * var objects = [
     *   { 'a': 1, 'b': 2, 'c': 3 },
     *   { 'a': 4, 'b': 5, 'c': 6 }
     * ];
     *
     * _.find(objects, _.matchesProperty('a', 4));
     * // => { 'a': 4, 'b': 5, 'c': 6 }
     *
     * // Checking for several possible values
     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));
     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
     */
    function matchesProperty(path, srcValue) {
      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
    }

    /**
     * Creates a function that invokes the method at `path` of a given object.
     * Any additional arguments are provided to the invoked method.
     *
     * @static
     * @memberOf _
     * @since 3.7.0
     * @category Util
     * @param {Array|string} path The path of the method to invoke.
     * @param {...*} [args] The arguments to invoke the method with.
     * @returns {Function} Returns the new invoker function.
     * @example
     *
     * var objects = [
     *   { 'a': { 'b': _.constant(2) } },
     *   { 'a': { 'b': _.constant(1) } }
     * ];
     *
     * _.map(objects, _.method('a.b'));
     * // => [2, 1]
     *
     * _.map(objects, _.method(['a', 'b']));
     * // => [2, 1]
     */
    var method = baseRest(function(path, args) {
      return function(object) {
        return baseInvoke(object, path, args);
      };
    });

    /**
     * The opposite of `_.method`; this method creates a function that invokes
     * the method at a given path of `object`. Any additional arguments are
     * provided to the invoked method.
     *
     * @static
     * @memberOf _
     * @since 3.7.0
     * @category Util
     * @param {Object} object The object to query.
     * @param {...*} [args] The arguments to invoke the method with.
     * @returns {Function} Returns the new invoker function.
     * @example
     *
     * var array = _.times(3, _.constant),
     *     object = { 'a': array, 'b': array, 'c': array };
     *
     * _.map(['a[2]', 'c[0]'], _.methodOf(object));
     * // => [2, 0]
     *
     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
     * // => [2, 0]
     */
    var methodOf = baseRest(function(object, args) {
      return function(path) {
        return baseInvoke(object, path, args);
      };
    });

    /**
     * Adds all own enumerable string keyed function properties of a source
     * object to the destination object. If `object` is a function, then methods
     * are added to its prototype as well.
     *
     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
     * avoid conflicts caused by modifying the original.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {Function|Object} [object=lodash] The destination object.
     * @param {Object} source The object of functions to add.
     * @param {Object} [options={}] The options object.
     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
     * @returns {Function|Object} Returns `object`.
     * @example
     *
     * function vowels(string) {
     *   return _.filter(string, function(v) {
     *     return /[aeiou]/i.test(v);
     *   });
     * }
     *
     * _.mixin({ 'vowels': vowels });
     * _.vowels('fred');
     * // => ['e']
     *
     * _('fred').vowels().value();
     * // => ['e']
     *
     * _.mixin({ 'vowels': vowels }, { 'chain': false });
     * _('fred').vowels();
     * // => ['e']
     */
    function mixin(object, source, options) {
      var props = keys(source),
          methodNames = baseFunctions(source, props);

      if (options == null &&
          !(isObject(source) && (methodNames.length || !props.length))) {
        options = source;
        source = object;
        object = this;
        methodNames = baseFunctions(source, keys(source));
      }
      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
          isFunc = isFunction(object);

      arrayEach(methodNames, function(methodName) {
        var func = source[methodName];
        object[methodName] = func;
        if (isFunc) {
          object.prototype[methodName] = function() {
            var chainAll = this.__chain__;
            if (chain || chainAll) {
              var result = object(this.__wrapped__),
                  actions = result.__actions__ = copyArray(this.__actions__);

              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
              result.__chain__ = chainAll;
              return result;
            }
            return func.apply(object, arrayPush([this.value()], arguments));
          };
        }
      });

      return object;
    }

    /**
     * Reverts the `_` variable to its previous value and returns a reference to
     * the `lodash` function.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @returns {Function} Returns the `lodash` function.
     * @example
     *
     * var lodash = _.noConflict();
     */
    function noConflict() {
      if (root._ === this) {
        root._ = oldDash;
      }
      return this;
    }

    /**
     * This method returns `undefined`.
     *
     * @static
     * @memberOf _
     * @since 2.3.0
     * @category Util
     * @example
     *
     * _.times(2, _.noop);
     * // => [undefined, undefined]
     */
    function noop() {
      // No operation performed.
    }

    /**
     * Creates a function that gets the argument at index `n`. If `n` is negative,
     * the nth argument from the end is returned.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {number} [n=0] The index of the argument to return.
     * @returns {Function} Returns the new pass-thru function.
     * @example
     *
     * var func = _.nthArg(1);
     * func('a', 'b', 'c', 'd');
     * // => 'b'
     *
     * var func = _.nthArg(-2);
     * func('a', 'b', 'c', 'd');
     * // => 'c'
     */
    function nthArg(n) {
      n = toInteger(n);
      return baseRest(function(args) {
        return baseNth(args, n);
      });
    }

    /**
     * Creates a function that invokes `iteratees` with the arguments it receives
     * and returns their results.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {...(Function|Function[])} [iteratees=[_.identity]]
     *  The iteratees to invoke.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var func = _.over([Math.max, Math.min]);
     *
     * func(1, 2, 3, 4);
     * // => [4, 1]
     */
    var over = createOver(arrayMap);

    /**
     * Creates a function that checks if **all** of the `predicates` return
     * truthy when invoked with the arguments it receives.
     *
     * Following shorthands are possible for providing predicates.
     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {...(Function|Function[])} [predicates=[_.identity]]
     *  The predicates to check.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var func = _.overEvery([Boolean, isFinite]);
     *
     * func('1');
     * // => true
     *
     * func(null);
     * // => false
     *
     * func(NaN);
     * // => false
     */
    var overEvery = createOver(arrayEvery);

    /**
     * Creates a function that checks if **any** of the `predicates` return
     * truthy when invoked with the arguments it receives.
     *
     * Following shorthands are possible for providing predicates.
     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {...(Function|Function[])} [predicates=[_.identity]]
     *  The predicates to check.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var func = _.overSome([Boolean, isFinite]);
     *
     * func('1');
     * // => true
     *
     * func(null);
     * // => true
     *
     * func(NaN);
     * // => false
     *
     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])
     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])
     */
    var overSome = createOver(arraySome);

    /**
     * Creates a function that returns the value at `path` of a given object.
     *
     * @static
     * @memberOf _
     * @since 2.4.0
     * @category Util
     * @param {Array|string} path The path of the property to get.
     * @returns {Function} Returns the new accessor function.
     * @example
     *
     * var objects = [
     *   { 'a': { 'b': 2 } },
     *   { 'a': { 'b': 1 } }
     * ];
     *
     * _.map(objects, _.property('a.b'));
     * // => [2, 1]
     *
     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
     * // => [1, 2]
     */
    function property(path) {
      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
    }

    /**
     * The opposite of `_.property`; this method creates a function that returns
     * the value at a given path of `object`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Util
     * @param {Object} object The object to query.
     * @returns {Function} Returns the new accessor function.
     * @example
     *
     * var array = [0, 1, 2],
     *     object = { 'a': array, 'b': array, 'c': array };
     *
     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
     * // => [2, 0]
     *
     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
     * // => [2, 0]
     */
    function propertyOf(object) {
      return function(path) {
        return object == null ? undefined : baseGet(object, path);
      };
    }

    /**
     * Creates an array of numbers (positive and/or negative) progressing from
     * `start` up to, but not including, `end`. A step of `-1` is used if a negative
     * `start` is specified without an `end` or `step`. If `end` is not specified,
     * it's set to `start` with `start` then set to `0`.
     *
     * **Note:** JavaScript follows the IEEE-754 standard for resolving
     * floating-point values which can produce unexpected results.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {number} [start=0] The start of the range.
     * @param {number} end The end of the range.
     * @param {number} [step=1] The value to increment or decrement by.
     * @returns {Array} Returns the range of numbers.
     * @see _.inRange, _.rangeRight
     * @example
     *
     * _.range(4);
     * // => [0, 1, 2, 3]
     *
     * _.range(-4);
     * // => [0, -1, -2, -3]
     *
     * _.range(1, 5);
     * // => [1, 2, 3, 4]
     *
     * _.range(0, 20, 5);
     * // => [0, 5, 10, 15]
     *
     * _.range(0, -4, -1);
     * // => [0, -1, -2, -3]
     *
     * _.range(1, 4, 0);
     * // => [1, 1, 1]
     *
     * _.range(0);
     * // => []
     */
    var range = createRange();

    /**
     * This method is like `_.range` except that it populates values in
     * descending order.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {number} [start=0] The start of the range.
     * @param {number} end The end of the range.
     * @param {number} [step=1] The value to increment or decrement by.
     * @returns {Array} Returns the range of numbers.
     * @see _.inRange, _.range
     * @example
     *
     * _.rangeRight(4);
     * // => [3, 2, 1, 0]
     *
     * _.rangeRight(-4);
     * // => [-3, -2, -1, 0]
     *
     * _.rangeRight(1, 5);
     * // => [4, 3, 2, 1]
     *
     * _.rangeRight(0, 20, 5);
     * // => [15, 10, 5, 0]
     *
     * _.rangeRight(0, -4, -1);
     * // => [-3, -2, -1, 0]
     *
     * _.rangeRight(1, 4, 0);
     * // => [1, 1, 1]
     *
     * _.rangeRight(0);
     * // => []
     */
    var rangeRight = createRange(true);

    /**
     * This method returns a new empty array.
     *
     * @static
     * @memberOf _
     * @since 4.13.0
     * @category Util
     * @returns {Array} Returns the new empty array.
     * @example
     *
     * var arrays = _.times(2, _.stubArray);
     *
     * console.log(arrays);
     * // => [[], []]
     *
     * console.log(arrays[0] === arrays[1]);
     * // => false
     */
    function stubArray() {
      return [];
    }

    /**
     * This method returns `false`.
     *
     * @static
     * @memberOf _
     * @since 4.13.0
     * @category Util
     * @returns {boolean} Returns `false`.
     * @example
     *
     * _.times(2, _.stubFalse);
     * // => [false, false]
     */
    function stubFalse() {
      return false;
    }

    /**
     * This method returns a new empty object.
     *
     * @static
     * @memberOf _
     * @since 4.13.0
     * @category Util
     * @returns {Object} Returns the new empty object.
     * @example
     *
     * var objects = _.times(2, _.stubObject);
     *
     * console.log(objects);
     * // => [{}, {}]
     *
     * console.log(objects[0] === objects[1]);
     * // => false
     */
    function stubObject() {
      return {};
    }

    /**
     * This method returns an empty string.
     *
     * @static
     * @memberOf _
     * @since 4.13.0
     * @category Util
     * @returns {string} Returns the empty string.
     * @example
     *
     * _.times(2, _.stubString);
     * // => ['', '']
     */
    function stubString() {
      return '';
    }

    /**
     * This method returns `true`.
     *
     * @static
     * @memberOf _
     * @since 4.13.0
     * @category Util
     * @returns {boolean} Returns `true`.
     * @example
     *
     * _.times(2, _.stubTrue);
     * // => [true, true]
     */
    function stubTrue() {
      return true;
    }

    /**
     * Invokes the iteratee `n` times, returning an array of the results of
     * each invocation. The iteratee is invoked with one argument; (index).
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {number} n The number of times to invoke `iteratee`.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the array of results.
     * @example
     *
     * _.times(3, String);
     * // => ['0', '1', '2']
     *
     *  _.times(4, _.constant(0));
     * // => [0, 0, 0, 0]
     */
    function times(n, iteratee) {
      n = toInteger(n);
      if (n < 1 || n > MAX_SAFE_INTEGER) {
        return [];
      }
      var index = MAX_ARRAY_LENGTH,
          length = nativeMin(n, MAX_ARRAY_LENGTH);

      iteratee = getIteratee(iteratee);
      n -= MAX_ARRAY_LENGTH;

      var result = baseTimes(length, iteratee);
      while (++index < n) {
        iteratee(index);
      }
      return result;
    }

    /**
     * Converts `value` to a property path array.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {*} value The value to convert.
     * @returns {Array} Returns the new property path array.
     * @example
     *
     * _.toPath('a.b.c');
     * // => ['a', 'b', 'c']
     *
     * _.toPath('a[0].b.c');
     * // => ['a', '0', 'b', 'c']
     */
    function toPath(value) {
      if (isArray(value)) {
        return arrayMap(value, toKey);
      }
      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
    }

    /**
     * Generates a unique ID. If `prefix` is given, the ID is appended to it.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {string} [prefix=''] The value to prefix the ID with.
     * @returns {string} Returns the unique ID.
     * @example
     *
     * _.uniqueId('contact_');
     * // => 'contact_104'
     *
     * _.uniqueId();
     * // => '105'
     */
    function uniqueId(prefix) {
      var id = ++idCounter;
      return toString(prefix) + id;
    }

    /*------------------------------------------------------------------------*/

    /**
     * Adds two numbers.
     *
     * @static
     * @memberOf _
     * @since 3.4.0
     * @category Math
     * @param {number} augend The first number in an addition.
     * @param {number} addend The second number in an addition.
     * @returns {number} Returns the total.
     * @example
     *
     * _.add(6, 4);
     * // => 10
     */
    var add = createMathOperation(function(augend, addend) {
      return augend + addend;
    }, 0);

    /**
     * Computes `number` rounded up to `precision`.
     *
     * @static
     * @memberOf _
     * @since 3.10.0
     * @category Math
     * @param {number} number The number to round up.
     * @param {number} [precision=0] The precision to round up to.
     * @returns {number} Returns the rounded up number.
     * @example
     *
     * _.ceil(4.006);
     * // => 5
     *
     * _.ceil(6.004, 2);
     * // => 6.01
     *
     * _.ceil(6040, -2);
     * // => 6100
     */
    var ceil = createRound('ceil');

    /**
     * Divide two numbers.
     *
     * @static
     * @memberOf _
     * @since 4.7.0
     * @category Math
     * @param {number} dividend The first number in a division.
     * @param {number} divisor The second number in a division.
     * @returns {number} Returns the quotient.
     * @example
     *
     * _.divide(6, 4);
     * // => 1.5
     */
    var divide = createMathOperation(function(dividend, divisor) {
      return dividend / divisor;
    }, 1);

    /**
     * Computes `number` rounded down to `precision`.
     *
     * @static
     * @memberOf _
     * @since 3.10.0
     * @category Math
     * @param {number} number The number to round down.
     * @param {number} [precision=0] The precision to round down to.
     * @returns {number} Returns the rounded down number.
     * @example
     *
     * _.floor(4.006);
     * // => 4
     *
     * _.floor(0.046, 2);
     * // => 0.04
     *
     * _.floor(4060, -2);
     * // => 4000
     */
    var floor = createRound('floor');

    /**
     * Computes the maximum value of `array`. If `array` is empty or falsey,
     * `undefined` is returned.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Math
     * @param {Array} array The array to iterate over.
     * @returns {*} Returns the maximum value.
     * @example
     *
     * _.max([4, 2, 8, 6]);
     * // => 8
     *
     * _.max([]);
     * // => undefined
     */
    function max(array) {
      return (array && array.length)
        ? baseExtremum(array, identity, baseGt)
        : undefined;
    }

    /**
     * This method is like `_.max` except that it accepts `iteratee` which is
     * invoked for each element in `array` to generate the criterion by which
     * the value is ranked. The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {*} Returns the maximum value.
     * @example
     *
     * var objects = [{ 'n': 1 }, { 'n': 2 }];
     *
     * _.maxBy(objects, function(o) { return o.n; });
     * // => { 'n': 2 }
     *
     * // The `_.property` iteratee shorthand.
     * _.maxBy(objects, 'n');
     * // => { 'n': 2 }
     */
    function maxBy(array, iteratee) {
      return (array && array.length)
        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
        : undefined;
    }

    /**
     * Computes the mean of the values in `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @returns {number} Returns the mean.
     * @example
     *
     * _.mean([4, 2, 8, 6]);
     * // => 5
     */
    function mean(array) {
      return baseMean(array, identity);
    }

    /**
     * This method is like `_.mean` except that it accepts `iteratee` which is
     * invoked for each element in `array` to generate the value to be averaged.
     * The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.7.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {number} Returns the mean.
     * @example
     *
     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
     *
     * _.meanBy(objects, function(o) { return o.n; });
     * // => 5
     *
     * // The `_.property` iteratee shorthand.
     * _.meanBy(objects, 'n');
     * // => 5
     */
    function meanBy(array, iteratee) {
      return baseMean(array, getIteratee(iteratee, 2));
    }

    /**
     * Computes the minimum value of `array`. If `array` is empty or falsey,
     * `undefined` is returned.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Math
     * @param {Array} array The array to iterate over.
     * @returns {*} Returns the minimum value.
     * @example
     *
     * _.min([4, 2, 8, 6]);
     * // => 2
     *
     * _.min([]);
     * // => undefined
     */
    function min(array) {
      return (array && array.length)
        ? baseExtremum(array, identity, baseLt)
        : undefined;
    }

    /**
     * This method is like `_.min` except that it accepts `iteratee` which is
     * invoked for each element in `array` to generate the criterion by which
     * the value is ranked. The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {*} Returns the minimum value.
     * @example
     *
     * var objects = [{ 'n': 1 }, { 'n': 2 }];
     *
     * _.minBy(objects, function(o) { return o.n; });
     * // => { 'n': 1 }
     *
     * // The `_.property` iteratee shorthand.
     * _.minBy(objects, 'n');
     * // => { 'n': 1 }
     */
    function minBy(array, iteratee) {
      return (array && array.length)
        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
        : undefined;
    }

    /**
     * Multiply two numbers.
     *
     * @static
     * @memberOf _
     * @since 4.7.0
     * @category Math
     * @param {number} multiplier The first number in a multiplication.
     * @param {number} multiplicand The second number in a multiplication.
     * @returns {number} Returns the product.
     * @example
     *
     * _.multiply(6, 4);
     * // => 24
     */
    var multiply = createMathOperation(function(multiplier, multiplicand) {
      return multiplier * multiplicand;
    }, 1);

    /**
     * Computes `number` rounded to `precision`.
     *
     * @static
     * @memberOf _
     * @since 3.10.0
     * @category Math
     * @param {number} number The number to round.
     * @param {number} [precision=0] The precision to round to.
     * @returns {number} Returns the rounded number.
     * @example
     *
     * _.round(4.006);
     * // => 4
     *
     * _.round(4.006, 2);
     * // => 4.01
     *
     * _.round(4060, -2);
     * // => 4100
     */
    var round = createRound('round');

    /**
     * Subtract two numbers.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Math
     * @param {number} minuend The first number in a subtraction.
     * @param {number} subtrahend The second number in a subtraction.
     * @returns {number} Returns the difference.
     * @example
     *
     * _.subtract(6, 4);
     * // => 2
     */
    var subtract = createMathOperation(function(minuend, subtrahend) {
      return minuend - subtrahend;
    }, 0);

    /**
     * Computes the sum of the values in `array`.
     *
     * @static
     * @memberOf _
     * @since 3.4.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @returns {number} Returns the sum.
     * @example
     *
     * _.sum([4, 2, 8, 6]);
     * // => 20
     */
    function sum(array) {
      return (array && array.length)
        ? baseSum(array, identity)
        : 0;
    }

    /**
     * This method is like `_.sum` except that it accepts `iteratee` which is
     * invoked for each element in `array` to generate the value to be summed.
     * The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {number} Returns the sum.
     * @example
     *
     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
     *
     * _.sumBy(objects, function(o) { return o.n; });
     * // => 20
     *
     * // The `_.property` iteratee shorthand.
     * _.sumBy(objects, 'n');
     * // => 20
     */
    function sumBy(array, iteratee) {
      return (array && array.length)
        ? baseSum(array, getIteratee(iteratee, 2))
        : 0;
    }

    /*------------------------------------------------------------------------*/

    // Add methods that return wrapped values in chain sequences.
    lodash.after = after;
    lodash.ary = ary;
    lodash.assign = assign;
    lodash.assignIn = assignIn;
    lodash.assignInWith = assignInWith;
    lodash.assignWith = assignWith;
    lodash.at = at;
    lodash.before = before;
    lodash.bind = bind;
    lodash.bindAll = bindAll;
    lodash.bindKey = bindKey;
    lodash.castArray = castArray;
    lodash.chain = chain;
    lodash.chunk = chunk;
    lodash.compact = compact;
    lodash.concat = concat;
    lodash.cond = cond;
    lodash.conforms = conforms;
    lodash.constant = constant;
    lodash.countBy = countBy;
    lodash.create = create;
    lodash.curry = curry;
    lodash.curryRight = curryRight;
    lodash.debounce = debounce;
    lodash.defaults = defaults;
    lodash.defaultsDeep = defaultsDeep;
    lodash.defer = defer;
    lodash.delay = delay;
    lodash.difference = difference;
    lodash.differenceBy = differenceBy;
    lodash.differenceWith = differenceWith;
    lodash.drop = drop;
    lodash.dropRight = dropRight;
    lodash.dropRightWhile = dropRightWhile;
    lodash.dropWhile = dropWhile;
    lodash.fill = fill;
    lodash.filter = filter;
    lodash.flatMap = flatMap;
    lodash.flatMapDeep = flatMapDeep;
    lodash.flatMapDepth = flatMapDepth;
    lodash.flatten = flatten;
    lodash.flattenDeep = flattenDeep;
    lodash.flattenDepth = flattenDepth;
    lodash.flip = flip;
    lodash.flow = flow;
    lodash.flowRight = flowRight;
    lodash.fromPairs = fromPairs;
    lodash.functions = functions;
    lodash.functionsIn = functionsIn;
    lodash.groupBy = groupBy;
    lodash.initial = initial;
    lodash.intersection = intersection;
    lodash.intersectionBy = intersectionBy;
    lodash.intersectionWith = intersectionWith;
    lodash.invert = invert;
    lodash.invertBy = invertBy;
    lodash.invokeMap = invokeMap;
    lodash.iteratee = iteratee;
    lodash.keyBy = keyBy;
    lodash.keys = keys;
    lodash.keysIn = keysIn;
    lodash.map = map;
    lodash.mapKeys = mapKeys;
    lodash.mapValues = mapValues;
    lodash.matches = matches;
    lodash.matchesProperty = matchesProperty;
    lodash.memoize = memoize;
    lodash.merge = merge;
    lodash.mergeWith = mergeWith;
    lodash.method = method;
    lodash.methodOf = methodOf;
    lodash.mixin = mixin;
    lodash.negate = negate;
    lodash.nthArg = nthArg;
    lodash.omit = omit;
    lodash.omitBy = omitBy;
    lodash.once = once;
    lodash.orderBy = orderBy;
    lodash.over = over;
    lodash.overArgs = overArgs;
    lodash.overEvery = overEvery;
    lodash.overSome = overSome;
    lodash.partial = partial;
    lodash.partialRight = partialRight;
    lodash.partition = partition;
    lodash.pick = pick;
    lodash.pickBy = pickBy;
    lodash.property = property;
    lodash.propertyOf = propertyOf;
    lodash.pull = pull;
    lodash.pullAll = pullAll;
    lodash.pullAllBy = pullAllBy;
    lodash.pullAllWith = pullAllWith;
    lodash.pullAt = pullAt;
    lodash.range = range;
    lodash.rangeRight = rangeRight;
    lodash.rearg = rearg;
    lodash.reject = reject;
    lodash.remove = remove;
    lodash.rest = rest;
    lodash.reverse = reverse;
    lodash.sampleSize = sampleSize;
    lodash.set = set;
    lodash.setWith = setWith;
    lodash.shuffle = shuffle;
    lodash.slice = slice;
    lodash.sortBy = sortBy;
    lodash.sortedUniq = sortedUniq;
    lodash.sortedUniqBy = sortedUniqBy;
    lodash.split = split;
    lodash.spread = spread;
    lodash.tail = tail;
    lodash.take = take;
    lodash.takeRight = takeRight;
    lodash.takeRightWhile = takeRightWhile;
    lodash.takeWhile = takeWhile;
    lodash.tap = tap;
    lodash.throttle = throttle;
    lodash.thru = thru;
    lodash.toArray = toArray;
    lodash.toPairs = toPairs;
    lodash.toPairsIn = toPairsIn;
    lodash.toPath = toPath;
    lodash.toPlainObject = toPlainObject;
    lodash.transform = transform;
    lodash.unary = unary;
    lodash.union = union;
    lodash.unionBy = unionBy;
    lodash.unionWith = unionWith;
    lodash.uniq = uniq;
    lodash.uniqBy = uniqBy;
    lodash.uniqWith = uniqWith;
    lodash.unset = unset;
    lodash.unzip = unzip;
    lodash.unzipWith = unzipWith;
    lodash.update = update;
    lodash.updateWith = updateWith;
    lodash.values = values;
    lodash.valuesIn = valuesIn;
    lodash.without = without;
    lodash.words = words;
    lodash.wrap = wrap;
    lodash.xor = xor;
    lodash.xorBy = xorBy;
    lodash.xorWith = xorWith;
    lodash.zip = zip;
    lodash.zipObject = zipObject;
    lodash.zipObjectDeep = zipObjectDeep;
    lodash.zipWith = zipWith;

    // Add aliases.
    lodash.entries = toPairs;
    lodash.entriesIn = toPairsIn;
    lodash.extend = assignIn;
    lodash.extendWith = assignInWith;

    // Add methods to `lodash.prototype`.
    mixin(lodash, lodash);

    /*------------------------------------------------------------------------*/

    // Add methods that return unwrapped values in chain sequences.
    lodash.add = add;
    lodash.attempt = attempt;
    lodash.camelCase = camelCase;
    lodash.capitalize = capitalize;
    lodash.ceil = ceil;
    lodash.clamp = clamp;
    lodash.clone = clone;
    lodash.cloneDeep = cloneDeep;
    lodash.cloneDeepWith = cloneDeepWith;
    lodash.cloneWith = cloneWith;
    lodash.conformsTo = conformsTo;
    lodash.deburr = deburr;
    lodash.defaultTo = defaultTo;
    lodash.divide = divide;
    lodash.endsWith = endsWith;
    lodash.eq = eq;
    lodash.escape = escape;
    lodash.escapeRegExp = escapeRegExp;
    lodash.every = every;
    lodash.find = find;
    lodash.findIndex = findIndex;
    lodash.findKey = findKey;
    lodash.findLast = findLast;
    lodash.findLastIndex = findLastIndex;
    lodash.findLastKey = findLastKey;
    lodash.floor = floor;
    lodash.forEach = forEach;
    lodash.forEachRight = forEachRight;
    lodash.forIn = forIn;
    lodash.forInRight = forInRight;
    lodash.forOwn = forOwn;
    lodash.forOwnRight = forOwnRight;
    lodash.get = get;
    lodash.gt = gt;
    lodash.gte = gte;
    lodash.has = has;
    lodash.hasIn = hasIn;
    lodash.head = head;
    lodash.identity = identity;
    lodash.includes = includes;
    lodash.indexOf = indexOf;
    lodash.inRange = inRange;
    lodash.invoke = invoke;
    lodash.isArguments = isArguments;
    lodash.isArray = isArray;
    lodash.isArrayBuffer = isArrayBuffer;
    lodash.isArrayLike = isArrayLike;
    lodash.isArrayLikeObject = isArrayLikeObject;
    lodash.isBoolean = isBoolean;
    lodash.isBuffer = isBuffer;
    lodash.isDate = isDate;
    lodash.isElement = isElement;
    lodash.isEmpty = isEmpty;
    lodash.isEqual = isEqual;
    lodash.isEqualWith = isEqualWith;
    lodash.isError = isError;
    lodash.isFinite = isFinite;
    lodash.isFunction = isFunction;
    lodash.isInteger = isInteger;
    lodash.isLength = isLength;
    lodash.isMap = isMap;
    lodash.isMatch = isMatch;
    lodash.isMatchWith = isMatchWith;
    lodash.isNaN = isNaN;
    lodash.isNative = isNative;
    lodash.isNil = isNil;
    lodash.isNull = isNull;
    lodash.isNumber = isNumber;
    lodash.isObject = isObject;
    lodash.isObjectLike = isObjectLike;
    lodash.isPlainObject = isPlainObject;
    lodash.isRegExp = isRegExp;
    lodash.isSafeInteger = isSafeInteger;
    lodash.isSet = isSet;
    lodash.isString = isString;
    lodash.isSymbol = isSymbol;
    lodash.isTypedArray = isTypedArray;
    lodash.isUndefined = isUndefined;
    lodash.isWeakMap = isWeakMap;
    lodash.isWeakSet = isWeakSet;
    lodash.join = join;
    lodash.kebabCase = kebabCase;
    lodash.last = last;
    lodash.lastIndexOf = lastIndexOf;
    lodash.lowerCase = lowerCase;
    lodash.lowerFirst = lowerFirst;
    lodash.lt = lt;
    lodash.lte = lte;
    lodash.max = max;
    lodash.maxBy = maxBy;
    lodash.mean = mean;
    lodash.meanBy = meanBy;
    lodash.min = min;
    lodash.minBy = minBy;
    lodash.stubArray = stubArray;
    lodash.stubFalse = stubFalse;
    lodash.stubObject = stubObject;
    lodash.stubString = stubString;
    lodash.stubTrue = stubTrue;
    lodash.multiply = multiply;
    lodash.nth = nth;
    lodash.noConflict = noConflict;
    lodash.noop = noop;
    lodash.now = now;
    lodash.pad = pad;
    lodash.padEnd = padEnd;
    lodash.padStart = padStart;
    lodash.parseInt = parseInt;
    lodash.random = random;
    lodash.reduce = reduce;
    lodash.reduceRight = reduceRight;
    lodash.repeat = repeat;
    lodash.replace = replace;
    lodash.result = result;
    lodash.round = round;
    lodash.runInContext = runInContext;
    lodash.sample = sample;
    lodash.size = size;
    lodash.snakeCase = snakeCase;
    lodash.some = some;
    lodash.sortedIndex = sortedIndex;
    lodash.sortedIndexBy = sortedIndexBy;
    lodash.sortedIndexOf = sortedIndexOf;
    lodash.sortedLastIndex = sortedLastIndex;
    lodash.sortedLastIndexBy = sortedLastIndexBy;
    lodash.sortedLastIndexOf = sortedLastIndexOf;
    lodash.startCase = startCase;
    lodash.startsWith = startsWith;
    lodash.subtract = subtract;
    lodash.sum = sum;
    lodash.sumBy = sumBy;
    lodash.template = template;
    lodash.times = times;
    lodash.toFinite = toFinite;
    lodash.toInteger = toInteger;
    lodash.toLength = toLength;
    lodash.toLower = toLower;
    lodash.toNumber = toNumber;
    lodash.toSafeInteger = toSafeInteger;
    lodash.toString = toString;
    lodash.toUpper = toUpper;
    lodash.trim = trim;
    lodash.trimEnd = trimEnd;
    lodash.trimStart = trimStart;
    lodash.truncate = truncate;
    lodash.unescape = unescape;
    lodash.uniqueId = uniqueId;
    lodash.upperCase = upperCase;
    lodash.upperFirst = upperFirst;

    // Add aliases.
    lodash.each = forEach;
    lodash.eachRight = forEachRight;
    lodash.first = head;

    mixin(lodash, (function() {
      var source = {};
      baseForOwn(lodash, function(func, methodName) {
        if (!hasOwnProperty.call(lodash.prototype, methodName)) {
          source[methodName] = func;
        }
      });
      return source;
    }()), { 'chain': false });

    /*------------------------------------------------------------------------*/

    /**
     * The semantic version number.
     *
     * @static
     * @memberOf _
     * @type {string}
     */
    lodash.VERSION = VERSION;

    // Assign default placeholders.
    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
      lodash[methodName].placeholder = lodash;
    });

    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
    arrayEach(['drop', 'take'], function(methodName, index) {
      LazyWrapper.prototype[methodName] = function(n) {
        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);

        var result = (this.__filtered__ && !index)
          ? new LazyWrapper(this)
          : this.clone();

        if (result.__filtered__) {
          result.__takeCount__ = nativeMin(n, result.__takeCount__);
        } else {
          result.__views__.push({
            'size': nativeMin(n, MAX_ARRAY_LENGTH),
            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
          });
        }
        return result;
      };

      LazyWrapper.prototype[methodName + 'Right'] = function(n) {
        return this.reverse()[methodName](n).reverse();
      };
    });

    // Add `LazyWrapper` methods that accept an `iteratee` value.
    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
      var type = index + 1,
          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;

      LazyWrapper.prototype[methodName] = function(iteratee) {
        var result = this.clone();
        result.__iteratees__.push({
          'iteratee': getIteratee(iteratee, 3),
          'type': type
        });
        result.__filtered__ = result.__filtered__ || isFilter;
        return result;
      };
    });

    // Add `LazyWrapper` methods for `_.head` and `_.last`.
    arrayEach(['head', 'last'], function(methodName, index) {
      var takeName = 'take' + (index ? 'Right' : '');

      LazyWrapper.prototype[methodName] = function() {
        return this[takeName](1).value()[0];
      };
    });

    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
    arrayEach(['initial', 'tail'], function(methodName, index) {
      var dropName = 'drop' + (index ? '' : 'Right');

      LazyWrapper.prototype[methodName] = function() {
        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
      };
    });

    LazyWrapper.prototype.compact = function() {
      return this.filter(identity);
    };

    LazyWrapper.prototype.find = function(predicate) {
      return this.filter(predicate).head();
    };

    LazyWrapper.prototype.findLast = function(predicate) {
      return this.reverse().find(predicate);
    };

    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
      if (typeof path == 'function') {
        return new LazyWrapper(this);
      }
      return this.map(function(value) {
        return baseInvoke(value, path, args);
      });
    });

    LazyWrapper.prototype.reject = function(predicate) {
      return this.filter(negate(getIteratee(predicate)));
    };

    LazyWrapper.prototype.slice = function(start, end) {
      start = toInteger(start);

      var result = this;
      if (result.__filtered__ && (start > 0 || end < 0)) {
        return new LazyWrapper(result);
      }
      if (start < 0) {
        result = result.takeRight(-start);
      } else if (start) {
        result = result.drop(start);
      }
      if (end !== undefined) {
        end = toInteger(end);
        result = end < 0 ? result.dropRight(-end) : result.take(end - start);
      }
      return result;
    };

    LazyWrapper.prototype.takeRightWhile = function(predicate) {
      return this.reverse().takeWhile(predicate).reverse();
    };

    LazyWrapper.prototype.toArray = function() {
      return this.take(MAX_ARRAY_LENGTH);
    };

    // Add `LazyWrapper` methods to `lodash.prototype`.
    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
          isTaker = /^(?:head|last)$/.test(methodName),
          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
          retUnwrapped = isTaker || /^find/.test(methodName);

      if (!lodashFunc) {
        return;
      }
      lodash.prototype[methodName] = function() {
        var value = this.__wrapped__,
            args = isTaker ? [1] : arguments,
            isLazy = value instanceof LazyWrapper,
            iteratee = args[0],
            useLazy = isLazy || isArray(value);

        var interceptor = function(value) {
          var result = lodashFunc.apply(lodash, arrayPush([value], args));
          return (isTaker && chainAll) ? result[0] : result;
        };

        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
          // Avoid lazy use if the iteratee has a "length" value other than `1`.
          isLazy = useLazy = false;
        }
        var chainAll = this.__chain__,
            isHybrid = !!this.__actions__.length,
            isUnwrapped = retUnwrapped && !chainAll,
            onlyLazy = isLazy && !isHybrid;

        if (!retUnwrapped && useLazy) {
          value = onlyLazy ? value : new LazyWrapper(this);
          var result = func.apply(value, args);
          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
          return new LodashWrapper(result, chainAll);
        }
        if (isUnwrapped && onlyLazy) {
          return func.apply(this, args);
        }
        result = this.thru(interceptor);
        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
      };
    });

    // Add `Array` methods to `lodash.prototype`.
    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
      var func = arrayProto[methodName],
          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
          retUnwrapped = /^(?:pop|shift)$/.test(methodName);

      lodash.prototype[methodName] = function() {
        var args = arguments;
        if (retUnwrapped && !this.__chain__) {
          var value = this.value();
          return func.apply(isArray(value) ? value : [], args);
        }
        return this[chainName](function(value) {
          return func.apply(isArray(value) ? value : [], args);
        });
      };
    });

    // Map minified method names to their real names.
    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
      var lodashFunc = lodash[methodName];
      if (lodashFunc) {
        var key = lodashFunc.name + '';
        if (!hasOwnProperty.call(realNames, key)) {
          realNames[key] = [];
        }
        realNames[key].push({ 'name': methodName, 'func': lodashFunc });
      }
    });

    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
      'name': 'wrapper',
      'func': undefined
    }];

    // Add methods to `LazyWrapper`.
    LazyWrapper.prototype.clone = lazyClone;
    LazyWrapper.prototype.reverse = lazyReverse;
    LazyWrapper.prototype.value = lazyValue;

    // Add chain sequence methods to the `lodash` wrapper.
    lodash.prototype.at = wrapperAt;
    lodash.prototype.chain = wrapperChain;
    lodash.prototype.commit = wrapperCommit;
    lodash.prototype.next = wrapperNext;
    lodash.prototype.plant = wrapperPlant;
    lodash.prototype.reverse = wrapperReverse;
    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;

    // Add lazy aliases.
    lodash.prototype.first = lodash.prototype.head;

    if (symIterator) {
      lodash.prototype[symIterator] = wrapperToIterator;
    }
    return lodash;
  });

  /*--------------------------------------------------------------------------*/

  // Export lodash.
  var _ = runInContext();

  // Some AMD build optimizers, like r.js, check for condition patterns like:
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
    // Expose Lodash on the global object to prevent errors when Lodash is
    // loaded by a script tag in the presence of an AMD loader.
    // See http://requirejs.org/docs/errors.html#mismatch for more details.
    // Use `_.noConflict` to remove Lodash from the global object.
    root._ = _;

    // Define as an anonymous module so, through path mapping, it can be
    // referenced as the "underscore" module.
    define(function() {
      return _;
    });
  }
  // Check for `exports` after `define` in case a build optimizer adds it.
  else if (freeModule) {
    // Export for Node.js.
    (freeModule.exports = _)._ = _;
    // Export for CommonJS support.
    freeExports._ = _;
  }
  else {
    // Export to the global object.
    root._ = _;
  }
}.call(this));

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/long/src/long.js":[function(require,module,exports){
module.exports = Long;

/**
 * wasm optimizations, to do native i64 multiplication and divide
 */
var wasm = null;

try {
  wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([
    0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11
  ])), {}).exports;
} catch (e) {
  // no wasm support :(
}

/**
 * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.
 *  See the from* functions below for more convenient ways of constructing Longs.
 * @exports Long
 * @class A Long class for representing a 64 bit two's-complement integer value.
 * @param {number} low The low (signed) 32 bits of the long
 * @param {number} high The high (signed) 32 bits of the long
 * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
 * @constructor
 */
function Long(low, high, unsigned) {

    /**
     * The low 32 bits as a signed value.
     * @type {number}
     */
    this.low = low | 0;

    /**
     * The high 32 bits as a signed value.
     * @type {number}
     */
    this.high = high | 0;

    /**
     * Whether unsigned or not.
     * @type {boolean}
     */
    this.unsigned = !!unsigned;
}

// The internal representation of a long is the two given signed, 32-bit values.
// We use 32-bit pieces because these are the size of integers on which
// Javascript performs bit-operations.  For operations like addition and
// multiplication, we split each number into 16 bit pieces, which can easily be
// multiplied within Javascript's floating-point representation without overflow
// or change in sign.
//
// In the algorithms below, we frequently reduce the negative case to the
// positive case by negating the input(s) and then post-processing the result.
// Note that we must ALWAYS check specially whether those values are MIN_VALUE
// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as
// a positive number, it overflows back into a negative).  Not handling this
// case would often result in infinite recursion.
//
// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*
// methods on which they depend.

/**
 * An indicator used to reliably determine if an object is a Long or not.
 * @type {boolean}
 * @const
 * @private
 */
Long.prototype.__isLong__;

Object.defineProperty(Long.prototype, "__isLong__", { value: true });

/**
 * @function
 * @param {*} obj Object
 * @returns {boolean}
 * @inner
 */
function isLong(obj) {
    return (obj && obj["__isLong__"]) === true;
}

/**
 * Tests if the specified object is a Long.
 * @function
 * @param {*} obj Object
 * @returns {boolean}
 */
Long.isLong = isLong;

/**
 * A cache of the Long representations of small integer values.
 * @type {!Object}
 * @inner
 */
var INT_CACHE = {};

/**
 * A cache of the Long representations of small unsigned integer values.
 * @type {!Object}
 * @inner
 */
var UINT_CACHE = {};

/**
 * @param {number} value
 * @param {boolean=} unsigned
 * @returns {!Long}
 * @inner
 */
function fromInt(value, unsigned) {
    var obj, cachedObj, cache;
    if (unsigned) {
        value >>>= 0;
        if (cache = (0 <= value && value < 256)) {
            cachedObj = UINT_CACHE[value];
            if (cachedObj)
                return cachedObj;
        }
        obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);
        if (cache)
            UINT_CACHE[value] = obj;
        return obj;
    } else {
        value |= 0;
        if (cache = (-128 <= value && value < 128)) {
            cachedObj = INT_CACHE[value];
            if (cachedObj)
                return cachedObj;
        }
        obj = fromBits(value, value < 0 ? -1 : 0, false);
        if (cache)
            INT_CACHE[value] = obj;
        return obj;
    }
}

/**
 * Returns a Long representing the given 32 bit integer value.
 * @function
 * @param {number} value The 32 bit integer in question
 * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
 * @returns {!Long} The corresponding Long value
 */
Long.fromInt = fromInt;

/**
 * @param {number} value
 * @param {boolean=} unsigned
 * @returns {!Long}
 * @inner
 */
function fromNumber(value, unsigned) {
    if (isNaN(value))
        return unsigned ? UZERO : ZERO;
    if (unsigned) {
        if (value < 0)
            return UZERO;
        if (value >= TWO_PWR_64_DBL)
            return MAX_UNSIGNED_VALUE;
    } else {
        if (value <= -TWO_PWR_63_DBL)
            return MIN_VALUE;
        if (value + 1 >= TWO_PWR_63_DBL)
            return MAX_VALUE;
    }
    if (value < 0)
        return fromNumber(-value, unsigned).neg();
    return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);
}

/**
 * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.
 * @function
 * @param {number} value The number in question
 * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
 * @returns {!Long} The corresponding Long value
 */
Long.fromNumber = fromNumber;

/**
 * @param {number} lowBits
 * @param {number} highBits
 * @param {boolean=} unsigned
 * @returns {!Long}
 * @inner
 */
function fromBits(lowBits, highBits, unsigned) {
    return new Long(lowBits, highBits, unsigned);
}

/**
 * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is
 *  assumed to use 32 bits.
 * @function
 * @param {number} lowBits The low 32 bits
 * @param {number} highBits The high 32 bits
 * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
 * @returns {!Long} The corresponding Long value
 */
Long.fromBits = fromBits;

/**
 * @function
 * @param {number} base
 * @param {number} exponent
 * @returns {number}
 * @inner
 */
var pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)

/**
 * @param {string} str
 * @param {(boolean|number)=} unsigned
 * @param {number=} radix
 * @returns {!Long}
 * @inner
 */
function fromString(str, unsigned, radix) {
    if (str.length === 0)
        throw Error('empty string');
    if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity")
        return ZERO;
    if (typeof unsigned === 'number') {
        // For goog.math.long compatibility
        radix = unsigned,
        unsigned = false;
    } else {
        unsigned = !! unsigned;
    }
    radix = radix || 10;
    if (radix < 2 || 36 < radix)
        throw RangeError('radix');

    var p;
    if ((p = str.indexOf('-')) > 0)
        throw Error('interior hyphen');
    else if (p === 0) {
        return fromString(str.substring(1), unsigned, radix).neg();
    }

    // Do several (8) digits each time through the loop, so as to
    // minimize the calls to the very expensive emulated div.
    var radixToPower = fromNumber(pow_dbl(radix, 8));

    var result = ZERO;
    for (var i = 0; i < str.length; i += 8) {
        var size = Math.min(8, str.length - i),
            value = parseInt(str.substring(i, i + size), radix);
        if (size < 8) {
            var power = fromNumber(pow_dbl(radix, size));
            result = result.mul(power).add(fromNumber(value));
        } else {
            result = result.mul(radixToPower);
            result = result.add(fromNumber(value));
        }
    }
    result.unsigned = unsigned;
    return result;
}

/**
 * Returns a Long representation of the given string, written using the specified radix.
 * @function
 * @param {string} str The textual representation of the Long
 * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed
 * @param {number=} radix The radix in which the text is written (2-36), defaults to 10
 * @returns {!Long} The corresponding Long value
 */
Long.fromString = fromString;

/**
 * @function
 * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val
 * @param {boolean=} unsigned
 * @returns {!Long}
 * @inner
 */
function fromValue(val, unsigned) {
    if (typeof val === 'number')
        return fromNumber(val, unsigned);
    if (typeof val === 'string')
        return fromString(val, unsigned);
    // Throws for non-objects, converts non-instanceof Long:
    return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);
}

/**
 * Converts the specified value to a Long using the appropriate from* function for its type.
 * @function
 * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value
 * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
 * @returns {!Long}
 */
Long.fromValue = fromValue;

// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be
// no runtime penalty for these.

/**
 * @type {number}
 * @const
 * @inner
 */
var TWO_PWR_16_DBL = 1 << 16;

/**
 * @type {number}
 * @const
 * @inner
 */
var TWO_PWR_24_DBL = 1 << 24;

/**
 * @type {number}
 * @const
 * @inner
 */
var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;

/**
 * @type {number}
 * @const
 * @inner
 */
var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;

/**
 * @type {number}
 * @const
 * @inner
 */
var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;

/**
 * @type {!Long}
 * @const
 * @inner
 */
var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);

/**
 * @type {!Long}
 * @inner
 */
var ZERO = fromInt(0);

/**
 * Signed zero.
 * @type {!Long}
 */
Long.ZERO = ZERO;

/**
 * @type {!Long}
 * @inner
 */
var UZERO = fromInt(0, true);

/**
 * Unsigned zero.
 * @type {!Long}
 */
Long.UZERO = UZERO;

/**
 * @type {!Long}
 * @inner
 */
var ONE = fromInt(1);

/**
 * Signed one.
 * @type {!Long}
 */
Long.ONE = ONE;

/**
 * @type {!Long}
 * @inner
 */
var UONE = fromInt(1, true);

/**
 * Unsigned one.
 * @type {!Long}
 */
Long.UONE = UONE;

/**
 * @type {!Long}
 * @inner
 */
var NEG_ONE = fromInt(-1);

/**
 * Signed negative one.
 * @type {!Long}
 */
Long.NEG_ONE = NEG_ONE;

/**
 * @type {!Long}
 * @inner
 */
var MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);

/**
 * Maximum signed value.
 * @type {!Long}
 */
Long.MAX_VALUE = MAX_VALUE;

/**
 * @type {!Long}
 * @inner
 */
var MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);

/**
 * Maximum unsigned value.
 * @type {!Long}
 */
Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;

/**
 * @type {!Long}
 * @inner
 */
var MIN_VALUE = fromBits(0, 0x80000000|0, false);

/**
 * Minimum signed value.
 * @type {!Long}
 */
Long.MIN_VALUE = MIN_VALUE;

/**
 * @alias Long.prototype
 * @inner
 */
var LongPrototype = Long.prototype;

/**
 * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.
 * @returns {number}
 */
LongPrototype.toInt = function toInt() {
    return this.unsigned ? this.low >>> 0 : this.low;
};

/**
 * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).
 * @returns {number}
 */
LongPrototype.toNumber = function toNumber() {
    if (this.unsigned)
        return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);
    return this.high * TWO_PWR_32_DBL + (this.low >>> 0);
};

/**
 * Converts the Long to a string written in the specified radix.
 * @param {number=} radix Radix (2-36), defaults to 10
 * @returns {string}
 * @override
 * @throws {RangeError} If `radix` is out of range
 */
LongPrototype.toString = function toString(radix) {
    radix = radix || 10;
    if (radix < 2 || 36 < radix)
        throw RangeError('radix');
    if (this.isZero())
        return '0';
    if (this.isNegative()) { // Unsigned Longs are never negative
        if (this.eq(MIN_VALUE)) {
            // We need to change the Long value before it can be negated, so we remove
            // the bottom-most digit in this base and then recurse to do the rest.
            var radixLong = fromNumber(radix),
                div = this.div(radixLong),
                rem1 = div.mul(radixLong).sub(this);
            return div.toString(radix) + rem1.toInt().toString(radix);
        } else
            return '-' + this.neg().toString(radix);
    }

    // Do several (6) digits each time through the loop, so as to
    // minimize the calls to the very expensive emulated div.
    var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),
        rem = this;
    var result = '';
    while (true) {
        var remDiv = rem.div(radixToPower),
            intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,
            digits = intval.toString(radix);
        rem = remDiv;
        if (rem.isZero())
            return digits + result;
        else {
            while (digits.length < 6)
                digits = '0' + digits;
            result = '' + digits + result;
        }
    }
};

/**
 * Gets the high 32 bits as a signed integer.
 * @returns {number} Signed high bits
 */
LongPrototype.getHighBits = function getHighBits() {
    return this.high;
};

/**
 * Gets the high 32 bits as an unsigned integer.
 * @returns {number} Unsigned high bits
 */
LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {
    return this.high >>> 0;
};

/**
 * Gets the low 32 bits as a signed integer.
 * @returns {number} Signed low bits
 */
LongPrototype.getLowBits = function getLowBits() {
    return this.low;
};

/**
 * Gets the low 32 bits as an unsigned integer.
 * @returns {number} Unsigned low bits
 */
LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {
    return this.low >>> 0;
};

/**
 * Gets the number of bits needed to represent the absolute value of this Long.
 * @returns {number}
 */
LongPrototype.getNumBitsAbs = function getNumBitsAbs() {
    if (this.isNegative()) // Unsigned Longs are never negative
        return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();
    var val = this.high != 0 ? this.high : this.low;
    for (var bit = 31; bit > 0; bit--)
        if ((val & (1 << bit)) != 0)
            break;
    return this.high != 0 ? bit + 33 : bit + 1;
};

/**
 * Tests if this Long's value equals zero.
 * @returns {boolean}
 */
LongPrototype.isZero = function isZero() {
    return this.high === 0 && this.low === 0;
};

/**
 * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.
 * @returns {boolean}
 */
LongPrototype.eqz = LongPrototype.isZero;

/**
 * Tests if this Long's value is negative.
 * @returns {boolean}
 */
LongPrototype.isNegative = function isNegative() {
    return !this.unsigned && this.high < 0;
};

/**
 * Tests if this Long's value is positive.
 * @returns {boolean}
 */
LongPrototype.isPositive = function isPositive() {
    return this.unsigned || this.high >= 0;
};

/**
 * Tests if this Long's value is odd.
 * @returns {boolean}
 */
LongPrototype.isOdd = function isOdd() {
    return (this.low & 1) === 1;
};

/**
 * Tests if this Long's value is even.
 * @returns {boolean}
 */
LongPrototype.isEven = function isEven() {
    return (this.low & 1) === 0;
};

/**
 * Tests if this Long's value equals the specified's.
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.equals = function equals(other) {
    if (!isLong(other))
        other = fromValue(other);
    if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)
        return false;
    return this.high === other.high && this.low === other.low;
};

/**
 * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.
 * @function
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.eq = LongPrototype.equals;

/**
 * Tests if this Long's value differs from the specified's.
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.notEquals = function notEquals(other) {
    return !this.eq(/* validates */ other);
};

/**
 * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.
 * @function
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.neq = LongPrototype.notEquals;

/**
 * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.
 * @function
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.ne = LongPrototype.notEquals;

/**
 * Tests if this Long's value is less than the specified's.
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.lessThan = function lessThan(other) {
    return this.comp(/* validates */ other) < 0;
};

/**
 * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.
 * @function
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.lt = LongPrototype.lessThan;

/**
 * Tests if this Long's value is less than or equal the specified's.
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {
    return this.comp(/* validates */ other) <= 0;
};

/**
 * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.
 * @function
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.lte = LongPrototype.lessThanOrEqual;

/**
 * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.
 * @function
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.le = LongPrototype.lessThanOrEqual;

/**
 * Tests if this Long's value is greater than the specified's.
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.greaterThan = function greaterThan(other) {
    return this.comp(/* validates */ other) > 0;
};

/**
 * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.
 * @function
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.gt = LongPrototype.greaterThan;

/**
 * Tests if this Long's value is greater than or equal the specified's.
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {
    return this.comp(/* validates */ other) >= 0;
};

/**
 * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.
 * @function
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.gte = LongPrototype.greaterThanOrEqual;

/**
 * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.
 * @function
 * @param {!Long|number|string} other Other value
 * @returns {boolean}
 */
LongPrototype.ge = LongPrototype.greaterThanOrEqual;

/**
 * Compares this Long's value with the specified's.
 * @param {!Long|number|string} other Other value
 * @returns {number} 0 if they are the same, 1 if the this is greater and -1
 *  if the given one is greater
 */
LongPrototype.compare = function compare(other) {
    if (!isLong(other))
        other = fromValue(other);
    if (this.eq(other))
        return 0;
    var thisNeg = this.isNegative(),
        otherNeg = other.isNegative();
    if (thisNeg && !otherNeg)
        return -1;
    if (!thisNeg && otherNeg)
        return 1;
    // At this point the sign bits are the same
    if (!this.unsigned)
        return this.sub(other).isNegative() ? -1 : 1;
    // Both are positive if at least one is unsigned
    return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;
};

/**
 * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.
 * @function
 * @param {!Long|number|string} other Other value
 * @returns {number} 0 if they are the same, 1 if the this is greater and -1
 *  if the given one is greater
 */
LongPrototype.comp = LongPrototype.compare;

/**
 * Negates this Long's value.
 * @returns {!Long} Negated Long
 */
LongPrototype.negate = function negate() {
    if (!this.unsigned && this.eq(MIN_VALUE))
        return MIN_VALUE;
    return this.not().add(ONE);
};

/**
 * Negates this Long's value. This is an alias of {@link Long#negate}.
 * @function
 * @returns {!Long} Negated Long
 */
LongPrototype.neg = LongPrototype.negate;

/**
 * Returns the sum of this and the specified Long.
 * @param {!Long|number|string} addend Addend
 * @returns {!Long} Sum
 */
LongPrototype.add = function add(addend) {
    if (!isLong(addend))
        addend = fromValue(addend);

    // Divide each number into 4 chunks of 16 bits, and then sum the chunks.

    var a48 = this.high >>> 16;
    var a32 = this.high & 0xFFFF;
    var a16 = this.low >>> 16;
    var a00 = this.low & 0xFFFF;

    var b48 = addend.high >>> 16;
    var b32 = addend.high & 0xFFFF;
    var b16 = addend.low >>> 16;
    var b00 = addend.low & 0xFFFF;

    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
    c00 += a00 + b00;
    c16 += c00 >>> 16;
    c00 &= 0xFFFF;
    c16 += a16 + b16;
    c32 += c16 >>> 16;
    c16 &= 0xFFFF;
    c32 += a32 + b32;
    c48 += c32 >>> 16;
    c32 &= 0xFFFF;
    c48 += a48 + b48;
    c48 &= 0xFFFF;
    return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
};

/**
 * Returns the difference of this and the specified Long.
 * @param {!Long|number|string} subtrahend Subtrahend
 * @returns {!Long} Difference
 */
LongPrototype.subtract = function subtract(subtrahend) {
    if (!isLong(subtrahend))
        subtrahend = fromValue(subtrahend);
    return this.add(subtrahend.neg());
};

/**
 * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.
 * @function
 * @param {!Long|number|string} subtrahend Subtrahend
 * @returns {!Long} Difference
 */
LongPrototype.sub = LongPrototype.subtract;

/**
 * Returns the product of this and the specified Long.
 * @param {!Long|number|string} multiplier Multiplier
 * @returns {!Long} Product
 */
LongPrototype.multiply = function multiply(multiplier) {
    if (this.isZero())
        return ZERO;
    if (!isLong(multiplier))
        multiplier = fromValue(multiplier);

    // use wasm support if present
    if (wasm) {
        var low = wasm.mul(this.low,
                           this.high,
                           multiplier.low,
                           multiplier.high);
        return fromBits(low, wasm.get_high(), this.unsigned);
    }

    if (multiplier.isZero())
        return ZERO;
    if (this.eq(MIN_VALUE))
        return multiplier.isOdd() ? MIN_VALUE : ZERO;
    if (multiplier.eq(MIN_VALUE))
        return this.isOdd() ? MIN_VALUE : ZERO;

    if (this.isNegative()) {
        if (multiplier.isNegative())
            return this.neg().mul(multiplier.neg());
        else
            return this.neg().mul(multiplier).neg();
    } else if (multiplier.isNegative())
        return this.mul(multiplier.neg()).neg();

    // If both longs are small, use float multiplication
    if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))
        return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);

    // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
    // We can skip products that would overflow.

    var a48 = this.high >>> 16;
    var a32 = this.high & 0xFFFF;
    var a16 = this.low >>> 16;
    var a00 = this.low & 0xFFFF;

    var b48 = multiplier.high >>> 16;
    var b32 = multiplier.high & 0xFFFF;
    var b16 = multiplier.low >>> 16;
    var b00 = multiplier.low & 0xFFFF;

    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
    c00 += a00 * b00;
    c16 += c00 >>> 16;
    c00 &= 0xFFFF;
    c16 += a16 * b00;
    c32 += c16 >>> 16;
    c16 &= 0xFFFF;
    c16 += a00 * b16;
    c32 += c16 >>> 16;
    c16 &= 0xFFFF;
    c32 += a32 * b00;
    c48 += c32 >>> 16;
    c32 &= 0xFFFF;
    c32 += a16 * b16;
    c48 += c32 >>> 16;
    c32 &= 0xFFFF;
    c32 += a00 * b32;
    c48 += c32 >>> 16;
    c32 &= 0xFFFF;
    c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;
    c48 &= 0xFFFF;
    return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
};

/**
 * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.
 * @function
 * @param {!Long|number|string} multiplier Multiplier
 * @returns {!Long} Product
 */
LongPrototype.mul = LongPrototype.multiply;

/**
 * Returns this Long divided by the specified. The result is signed if this Long is signed or
 *  unsigned if this Long is unsigned.
 * @param {!Long|number|string} divisor Divisor
 * @returns {!Long} Quotient
 */
LongPrototype.divide = function divide(divisor) {
    if (!isLong(divisor))
        divisor = fromValue(divisor);
    if (divisor.isZero())
        throw Error('division by zero');

    // use wasm support if present
    if (wasm) {
        // guard against signed division overflow: the largest
        // negative number / -1 would be 1 larger than the largest
        // positive number, due to two's complement.
        if (!this.unsigned &&
            this.high === -0x80000000 &&
            divisor.low === -1 && divisor.high === -1) {
            // be consistent with non-wasm code path
            return this;
        }
        var low = (this.unsigned ? wasm.div_u : wasm.div_s)(
            this.low,
            this.high,
            divisor.low,
            divisor.high
        );
        return fromBits(low, wasm.get_high(), this.unsigned);
    }

    if (this.isZero())
        return this.unsigned ? UZERO : ZERO;
    var approx, rem, res;
    if (!this.unsigned) {
        // This section is only relevant for signed longs and is derived from the
        // closure library as a whole.
        if (this.eq(MIN_VALUE)) {
            if (divisor.eq(ONE) || divisor.eq(NEG_ONE))
                return MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE
            else if (divisor.eq(MIN_VALUE))
                return ONE;
            else {
                // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
                var halfThis = this.shr(1);
                approx = halfThis.div(divisor).shl(1);
                if (approx.eq(ZERO)) {
                    return divisor.isNegative() ? ONE : NEG_ONE;
                } else {
                    rem = this.sub(divisor.mul(approx));
                    res = approx.add(rem.div(divisor));
                    return res;
                }
            }
        } else if (divisor.eq(MIN_VALUE))
            return this.unsigned ? UZERO : ZERO;
        if (this.isNegative()) {
            if (divisor.isNegative())
                return this.neg().div(divisor.neg());
            return this.neg().div(divisor).neg();
        } else if (divisor.isNegative())
            return this.div(divisor.neg()).neg();
        res = ZERO;
    } else {
        // The algorithm below has not been made for unsigned longs. It's therefore
        // required to take special care of the MSB prior to running it.
        if (!divisor.unsigned)
            divisor = divisor.toUnsigned();
        if (divisor.gt(this))
            return UZERO;
        if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true
            return UONE;
        res = UZERO;
    }

    // Repeat the following until the remainder is less than other:  find a
    // floating-point that approximates remainder / other *from below*, add this
    // into the result, and subtract it from the remainder.  It is critical that
    // the approximate value is less than or equal to the real value so that the
    // remainder never becomes negative.
    rem = this;
    while (rem.gte(divisor)) {
        // Approximate the result of division. This may be a little greater or
        // smaller than the actual value.
        approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));

        // We will tweak the approximate result by changing it in the 48-th digit or
        // the smallest non-fractional digit, whichever is larger.
        var log2 = Math.ceil(Math.log(approx) / Math.LN2),
            delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),

        // Decrease the approximation until it is smaller than the remainder.  Note
        // that if it is too large, the product overflows and is negative.
            approxRes = fromNumber(approx),
            approxRem = approxRes.mul(divisor);
        while (approxRem.isNegative() || approxRem.gt(rem)) {
            approx -= delta;
            approxRes = fromNumber(approx, this.unsigned);
            approxRem = approxRes.mul(divisor);
        }

        // We know the answer can't be zero... and actually, zero would cause
        // infinite recursion since we would make no progress.
        if (approxRes.isZero())
            approxRes = ONE;

        res = res.add(approxRes);
        rem = rem.sub(approxRem);
    }
    return res;
};

/**
 * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.
 * @function
 * @param {!Long|number|string} divisor Divisor
 * @returns {!Long} Quotient
 */
LongPrototype.div = LongPrototype.divide;

/**
 * Returns this Long modulo the specified.
 * @param {!Long|number|string} divisor Divisor
 * @returns {!Long} Remainder
 */
LongPrototype.modulo = function modulo(divisor) {
    if (!isLong(divisor))
        divisor = fromValue(divisor);

    // use wasm support if present
    if (wasm) {
        var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(
            this.low,
            this.high,
            divisor.low,
            divisor.high
        );
        return fromBits(low, wasm.get_high(), this.unsigned);
    }

    return this.sub(this.div(divisor).mul(divisor));
};

/**
 * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.
 * @function
 * @param {!Long|number|string} divisor Divisor
 * @returns {!Long} Remainder
 */
LongPrototype.mod = LongPrototype.modulo;

/**
 * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.
 * @function
 * @param {!Long|number|string} divisor Divisor
 * @returns {!Long} Remainder
 */
LongPrototype.rem = LongPrototype.modulo;

/**
 * Returns the bitwise NOT of this Long.
 * @returns {!Long}
 */
LongPrototype.not = function not() {
    return fromBits(~this.low, ~this.high, this.unsigned);
};

/**
 * Returns the bitwise AND of this Long and the specified.
 * @param {!Long|number|string} other Other Long
 * @returns {!Long}
 */
LongPrototype.and = function and(other) {
    if (!isLong(other))
        other = fromValue(other);
    return fromBits(this.low & other.low, this.high & other.high, this.unsigned);
};

/**
 * Returns the bitwise OR of this Long and the specified.
 * @param {!Long|number|string} other Other Long
 * @returns {!Long}
 */
LongPrototype.or = function or(other) {
    if (!isLong(other))
        other = fromValue(other);
    return fromBits(this.low | other.low, this.high | other.high, this.unsigned);
};

/**
 * Returns the bitwise XOR of this Long and the given one.
 * @param {!Long|number|string} other Other Long
 * @returns {!Long}
 */
LongPrototype.xor = function xor(other) {
    if (!isLong(other))
        other = fromValue(other);
    return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);
};

/**
 * Returns this Long with bits shifted to the left by the given amount.
 * @param {number|!Long} numBits Number of bits
 * @returns {!Long} Shifted Long
 */
LongPrototype.shiftLeft = function shiftLeft(numBits) {
    if (isLong(numBits))
        numBits = numBits.toInt();
    if ((numBits &= 63) === 0)
        return this;
    else if (numBits < 32)
        return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);
    else
        return fromBits(0, this.low << (numBits - 32), this.unsigned);
};

/**
 * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.
 * @function
 * @param {number|!Long} numBits Number of bits
 * @returns {!Long} Shifted Long
 */
LongPrototype.shl = LongPrototype.shiftLeft;

/**
 * Returns this Long with bits arithmetically shifted to the right by the given amount.
 * @param {number|!Long} numBits Number of bits
 * @returns {!Long} Shifted Long
 */
LongPrototype.shiftRight = function shiftRight(numBits) {
    if (isLong(numBits))
        numBits = numBits.toInt();
    if ((numBits &= 63) === 0)
        return this;
    else if (numBits < 32)
        return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);
    else
        return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);
};

/**
 * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.
 * @function
 * @param {number|!Long} numBits Number of bits
 * @returns {!Long} Shifted Long
 */
LongPrototype.shr = LongPrototype.shiftRight;

/**
 * Returns this Long with bits logically shifted to the right by the given amount.
 * @param {number|!Long} numBits Number of bits
 * @returns {!Long} Shifted Long
 */
LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {
    if (isLong(numBits))
        numBits = numBits.toInt();
    numBits &= 63;
    if (numBits === 0)
        return this;
    else {
        var high = this.high;
        if (numBits < 32) {
            var low = this.low;
            return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);
        } else if (numBits === 32)
            return fromBits(high, 0, this.unsigned);
        else
            return fromBits(high >>> (numBits - 32), 0, this.unsigned);
    }
};

/**
 * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.
 * @function
 * @param {number|!Long} numBits Number of bits
 * @returns {!Long} Shifted Long
 */
LongPrototype.shru = LongPrototype.shiftRightUnsigned;

/**
 * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.
 * @function
 * @param {number|!Long} numBits Number of bits
 * @returns {!Long} Shifted Long
 */
LongPrototype.shr_u = LongPrototype.shiftRightUnsigned;

/**
 * Converts this Long to signed.
 * @returns {!Long} Signed long
 */
LongPrototype.toSigned = function toSigned() {
    if (!this.unsigned)
        return this;
    return fromBits(this.low, this.high, false);
};

/**
 * Converts this Long to unsigned.
 * @returns {!Long} Unsigned long
 */
LongPrototype.toUnsigned = function toUnsigned() {
    if (this.unsigned)
        return this;
    return fromBits(this.low, this.high, true);
};

/**
 * Converts this Long to its byte representation.
 * @param {boolean=} le Whether little or big endian, defaults to big endian
 * @returns {!Array.<number>} Byte representation
 */
LongPrototype.toBytes = function toBytes(le) {
    return le ? this.toBytesLE() : this.toBytesBE();
};

/**
 * Converts this Long to its little endian byte representation.
 * @returns {!Array.<number>} Little endian byte representation
 */
LongPrototype.toBytesLE = function toBytesLE() {
    var hi = this.high,
        lo = this.low;
    return [
        lo        & 0xff,
        lo >>>  8 & 0xff,
        lo >>> 16 & 0xff,
        lo >>> 24       ,
        hi        & 0xff,
        hi >>>  8 & 0xff,
        hi >>> 16 & 0xff,
        hi >>> 24
    ];
};

/**
 * Converts this Long to its big endian byte representation.
 * @returns {!Array.<number>} Big endian byte representation
 */
LongPrototype.toBytesBE = function toBytesBE() {
    var hi = this.high,
        lo = this.low;
    return [
        hi >>> 24       ,
        hi >>> 16 & 0xff,
        hi >>>  8 & 0xff,
        hi        & 0xff,
        lo >>> 24       ,
        lo >>> 16 & 0xff,
        lo >>>  8 & 0xff,
        lo        & 0xff
    ];
};

/**
 * Creates a Long from its byte representation.
 * @param {!Array.<number>} bytes Byte representation
 * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
 * @param {boolean=} le Whether little or big endian, defaults to big endian
 * @returns {Long} The corresponding Long value
 */
Long.fromBytes = function fromBytes(bytes, unsigned, le) {
    return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);
};

/**
 * Creates a Long from its little endian byte representation.
 * @param {!Array.<number>} bytes Little endian byte representation
 * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
 * @returns {Long} The corresponding Long value
 */
Long.fromBytesLE = function fromBytesLE(bytes, unsigned) {
    return new Long(
        bytes[0]       |
        bytes[1] <<  8 |
        bytes[2] << 16 |
        bytes[3] << 24,
        bytes[4]       |
        bytes[5] <<  8 |
        bytes[6] << 16 |
        bytes[7] << 24,
        unsigned
    );
};

/**
 * Creates a Long from its big endian byte representation.
 * @param {!Array.<number>} bytes Big endian byte representation
 * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
 * @returns {Long} The corresponding Long value
 */
Long.fromBytesBE = function fromBytesBE(bytes, unsigned) {
    return new Long(
        bytes[4] << 24 |
        bytes[5] << 16 |
        bytes[6] <<  8 |
        bytes[7],
        bytes[0] << 24 |
        bytes[1] << 16 |
        bytes[2] <<  8 |
        bytes[3],
        unsigned
    );
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/machina/lib/machina.js":[function(require,module,exports){
/*!
 *  * machina - A library for creating powerful and flexible finite state machines. Loosely inspired by Erlang/OTP's gen_fsm behavior.
 *  * Author: Jim Cowart (http://ifandelse.com)
 *  * Version: v4.0.2
 *  * Url: http://machina-js.org/
 *  * License(s): 
 */
(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory(require("lodash"));
	else if(typeof define === 'function' && define.amd)
		define(["lodash"], factory);
	else if(typeof exports === 'object')
		exports["machina"] = factory(require("lodash"));
	else
		root["machina"] = factory(root["_"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;
/******/
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

	var _ = __webpack_require__( 1 );
	var emitter = __webpack_require__( 2 );
	
	module.exports = _.merge( emitter.instance, {
		Fsm: __webpack_require__( 5 ),
		BehavioralFsm: __webpack_require__( 6 ),
		utils: __webpack_require__( 3 ),
		eventListeners: {
			newFsm: []
		}
	} );


/***/ }),
/* 1 */
/***/ (function(module, exports) {

	module.exports = __WEBPACK_EXTERNAL_MODULE_1__;

/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {

	var utils = __webpack_require__( 3 );
	var _ = __webpack_require__( 1 );
	
	function getInstance() {
		return {
			emit: function( eventName ) {
				var args = utils.getLeaklessArgs( arguments );
				if ( this.eventListeners[ "*" ] ) {
					_.each( this.eventListeners[ "*" ], function( callback ) {
						if ( !this.useSafeEmit ) {
							callback.apply( this, args );
						} else {
							try {
								callback.apply( this, args );
							} catch ( exception ) {
								/* istanbul ignore else  */
								if ( console && typeof console.log !== "undefined" ) {
									console.log( exception.stack );
								}
							}
						}
					}.bind( this ) );
				}
				if ( this.eventListeners[ eventName ] ) {
					_.each( this.eventListeners[ eventName ], function( callback ) {
						if ( !this.useSafeEmit ) {
							callback.apply( this, args.slice( 1 ) );
						} else {
							try {
								callback.apply( this, args.slice( 1 ) );
							} catch ( exception ) {
								/* istanbul ignore else  */
								if ( console && typeof console.log !== "undefined" ) {
									console.log( exception.stack );
								}
							}
						}
					}.bind( this ) );
				}
			},
	
			on: function( eventName, callback ) {
				var self = this;
				self.eventListeners = self.eventListeners || { "*": [] };
				if ( !self.eventListeners[ eventName ] ) {
					self.eventListeners[ eventName ] = [];
				}
				self.eventListeners[ eventName ].push( callback );
				return {
					eventName: eventName,
					callback: callback,
					off: function() {
						self.off( eventName, callback );
					}
				};
			},
	
			off: function( eventName, callback ) {
				this.eventListeners = this.eventListeners || { "*": [] };
				if ( !eventName ) {
					this.eventListeners = {};
				} else {
					if ( callback ) {
						this.eventListeners[ eventName ] = _.without( this.eventListeners[ eventName ], callback );
					} else {
						this.eventListeners[ eventName ] = [];
					}
				}
			}
		};
	}
	
	module.exports = {
		getInstance: getInstance,
		instance: getInstance()
	};


/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {

	var slice = [].slice;
	var events = __webpack_require__( 4 );
	var _ = __webpack_require__( 1 );
	
	var makeFsmNamespace = ( function() {
		var machinaCount = 0;
		return function() {
			return "fsm." + machinaCount++;
		};
	} )();
	
	function getDefaultBehavioralOptions() {
		return {
			initialState: "uninitialized",
			eventListeners: {
				"*": []
			},
			states: {},
			namespace: makeFsmNamespace(),
			useSafeEmit: false,
			hierarchy: {},
			pendingDelegations: {}
		};
	}
	
	function getDefaultClientMeta() {
		return {
			inputQueue: [],
			targetReplayState: "",
			state: undefined,
			priorState: undefined,
			priorAction: "",
			currentAction: "",
			currentActionArgs: undefined,
			inExitHandler: false
		};
	}
	
	function getLeaklessArgs( args, startIdx ) {
		var result = [];
		for ( var i = ( startIdx || 0 ); i < args.length; i++ ) {
			result[ i ] = args[ i ];
		}
		return result;
	}
	/*
		handle ->
			child = stateObj._child && stateObj._child.instance;
	
		transition ->
			newStateObj._child = getChildFsmInstance( newStateObj._child );
			child = newStateObj._child && newStateObj._child.instance;
	*/
	function getChildFsmInstance( config ) {
		if ( !config ) {
			return;
		}
		var childFsmDefinition = {};
		if ( typeof config === "object" ) {
			// is this a config object with a factory?
			if ( config.factory ) {
				childFsmDefinition = config;
				childFsmDefinition.instance = childFsmDefinition.factory();
			} else {
				// assuming this is a machina instance
				childFsmDefinition.factory = function() {
					return config;
				};
			}
		} else if ( typeof config === "function" ) {
			childFsmDefinition.factory = config;
		}
		childFsmDefinition.instance = childFsmDefinition.factory();
		return childFsmDefinition;
	}
	
	function listenToChild( fsm, child ) {
		// Need to investigate potential for discarded event
		// listener memory leak in long-running, deeply-nested hierarchies.
		return child.on( "*", function( eventName, data ) {
			switch ( eventName ) {
				case events.NO_HANDLER:
					if ( !data.ticket && !data.delegated && data.namespace !== fsm.namespace ) {
						// Ok - we're dealing w/ a child handling input that should bubble up
						data.args[ 1 ].bubbling = true;
					}
					// we do NOT bubble _reset inputs up to the parent
					if ( data.inputType !== "_reset" ) {
						fsm.handle.apply( fsm, data.args );
					}
					break;
				case events.HANDLING :
					var ticket = data.ticket;
					if ( ticket && fsm.pendingDelegations[ ticket ] ) {
						delete fsm.pendingDelegations[ ticket ];
					}
					fsm.emit( eventName, data ); // possibly transform payload?
					break;
				default:
					fsm.emit( eventName, data ); // possibly transform payload?
					break;
			}
		} );
	}
	
	// _machKeys are members we want to track across the prototype chain of an extended FSM constructor
	// Since we want to eventually merge the aggregate of those values onto the instance so that FSMs
	// that share the same extended prototype won't share state *on* those prototypes.
	var _machKeys = [ "states", "initialState" ];
	var extend = function( protoProps, staticProps ) {
		var parent = this;
		var fsm; // placeholder for instance constructor
		var machObj = {}; // object used to hold initialState & states from prototype for instance-level merging
		var Ctor = function() {}; // placeholder ctor function used to insert level in prototype chain
	
		// The constructor function for the new subclass is either defined by you
		// (the "constructor" property in your `extend` definition), or defaulted
		// by us to simply call the parent's constructor.
		if ( protoProps && protoProps.hasOwnProperty( "constructor" ) ) {
			fsm = protoProps.constructor;
		} else {
			// The default machina constructor (when using inheritance) creates a
			// deep copy of the states/initialState values from the prototype and
			// extends them over the instance so that they'll be instance-level.
			// If an options arg (args[0]) is passed in, a states or intialState
			// value will be preferred over any data pulled up from the prototype.
			fsm = function() {
				var args = slice.call( arguments, 0 );
				args[ 0 ] = args[ 0 ] || {};
				var blendedState;
				var instanceStates = args[ 0 ].states || {};
				blendedState = _.merge( _.cloneDeep( machObj ), { states: instanceStates } );
				blendedState.initialState = args[ 0 ].initialState || this.initialState;
				_.extend( args[ 0 ], blendedState );
				parent.apply( this, args );
			};
		}
	
		// Inherit class (static) properties from parent.
		_.merge( fsm, parent );
	
		// Set the prototype chain to inherit from `parent`, without calling
		// `parent`'s constructor function.
		Ctor.prototype = parent.prototype;
		fsm.prototype = new Ctor();
	
		// Add prototype properties (instance properties) to the subclass,
		// if supplied.
		if ( protoProps ) {
			_.extend( fsm.prototype, protoProps );
			_.merge( machObj, _.transform( protoProps, function( accum, val, key ) {
				if ( _machKeys.indexOf( key ) !== -1 ) {
					accum[ key ] = val;
				}
			} ) );
		}
	
		// Add static properties to the constructor function, if supplied.
		if ( staticProps ) {
			_.merge( fsm, staticProps );
		}
	
		// Correctly set child's `prototype.constructor`.
		fsm.prototype.constructor = fsm;
	
		// Set a convenience property in case the parent's prototype is needed later.
		fsm.__super__ = parent.prototype;
		return fsm;
	};
	
	function createUUID() {
		var s = [];
		var hexDigits = "0123456789abcdef";
		for ( var i = 0; i < 36; i++ ) {
			s[ i ] = hexDigits.substr( Math.floor( Math.random() * 0x10 ), 1 );
		}
		s[ 14 ] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
		/* jshint ignore:start */
		s[ 19 ] = hexDigits.substr( ( s[ 19 ] & 0x3 ) | 0x8, 1 ); // bits 6-7 of the clock_seq_hi_and_reserved to 01
		/* jshint ignore:end */
		s[ 8 ] = s[ 13 ] = s[ 18 ] = s[ 23 ] = "-";
		return s.join( "" );
	}
	
	module.exports = {
		createUUID: createUUID,
		extend: extend,
		getDefaultBehavioralOptions: getDefaultBehavioralOptions,
		getDefaultOptions: getDefaultBehavioralOptions,
		getDefaultClientMeta: getDefaultClientMeta,
		getChildFsmInstance: getChildFsmInstance,
		getLeaklessArgs: getLeaklessArgs,
		listenToChild: listenToChild,
		makeFsmNamespace: makeFsmNamespace
	};


/***/ }),
/* 4 */
/***/ (function(module, exports) {

	module.exports = {
		NEXT_TRANSITION: "transition",
		HANDLING: "handling",
		HANDLED: "handled",
		NO_HANDLER: "nohandler",
		TRANSITION: "transition",
		TRANSITIONED: "transitioned",
		INVALID_STATE: "invalidstate",
		DEFERRED: "deferred",
		NEW_FSM: "newfsm"
	};


/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {

	var BehavioralFsm = __webpack_require__( 6 );
	var utils = __webpack_require__( 3 );
	var _ = __webpack_require__( 1 );
	
	var Fsm = {
		constructor: function() {
			BehavioralFsm.apply( this, arguments );
			this.ensureClientMeta();
		},
		initClient: function initClient() {
			var initialState = this.initialState;
			if ( !initialState ) {
				throw new Error( "You must specify an initial state for this FSM" );
			}
			if ( !this.states[ initialState ] ) {
				throw new Error( "The initial state specified does not exist in the states object." );
			}
			this.transition( initialState );
		},
		ensureClientMeta: function ensureClientMeta() {
			if ( !this._stamped ) {
				this._stamped = true;
				_.defaults( this, _.cloneDeep( utils.getDefaultClientMeta() ) );
				this.initClient();
			}
			return this;
		},
	
		ensureClientArg: function( args ) {
			var _args = args;
			// we need to test the args and verify that if a client arg has
			// been passed, it must be this FSM instance (this isn't a behavioral FSM)
			if ( typeof _args[ 0 ] === "object" && !( "inputType" in _args[ 0 ] ) && _args[ 0 ] !== this ) {
				_args.splice( 0, 1, this );
			} else if ( typeof _args[ 0 ] !== "object" || ( typeof _args[ 0 ] === "object" && ( "inputType" in _args[ 0 ] ) ) ) {
				_args.unshift( this );
			}
			return _args;
		},
	
		getHandlerArgs: function( args, isCatchAll ) {
			// index 0 is the client, index 1 is inputType
			// if we're in a catch-all handler, input type needs to be included in the args
			// inputType might be an object, so we need to just get the inputType string if so
			var _args = args;
			var input = _args[ 1 ];
			if ( typeof inputType === "object" ) {
				_args.splice( 1, 1, input.inputType );
			}
			return isCatchAll ?
				_args.slice( 1 ) :
				_args.slice( 2 );
		},
	
		getSystemHandlerArgs: function( args, client ) {
			return args;
		},
	
		// "classic" machina FSM do not emit the client property on events (which would be the FSM itself)
		buildEventPayload: function() {
			var args = this.ensureClientArg( utils.getLeaklessArgs( arguments ) );
			var data = args[ 1 ];
			if ( _.isPlainObject( data ) ) {
				return _.extend( data, { namespace: this.namespace } );
			} else {
				return { data: data || null, namespace: this.namespace };
			}
		}
	};
	
	_.each( [
		"handle",
		"transition",
		"deferUntilTransition",
		"processQueue",
		"clearQueue"
	], function( methodWithClientInjected ) {
		Fsm[ methodWithClientInjected ] = function() {
			var args = this.ensureClientArg( utils.getLeaklessArgs( arguments ) );
			return BehavioralFsm.prototype[ methodWithClientInjected ].apply( this, args );
		};
	} );
	
	Fsm = BehavioralFsm.extend( Fsm );
	
	module.exports = Fsm;


/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

	var _ = __webpack_require__( 1 );
	var utils = __webpack_require__( 3 );
	var emitter = __webpack_require__( 2 );
	var topLevelEmitter = emitter.instance;
	var events = __webpack_require__( 4 );
	
	var MACHINA_PROP = "__machina__";
	
	function BehavioralFsm( options ) {
		_.extend( this, options );
		_.defaults( this, utils.getDefaultBehavioralOptions() );
		this.initialize.apply( this, arguments );
		topLevelEmitter.emit( events.NEW_FSM, this );
	}
	
	_.extend( BehavioralFsm.prototype, {
		initialize: function() {},
	
		initClient: function initClient( client ) {
			var initialState = this.initialState;
			if ( !initialState ) {
				throw new Error( "You must specify an initial state for this FSM" );
			}
			if ( !this.states[ initialState ] ) {
				throw new Error( "The initial state specified does not exist in the states object." );
			}
			this.transition( client, initialState );
		},
	
		configForState: function configForState( newState ) {
			var newStateObj = this.states[ newState ];
			var child;
			_.each( this.hierarchy, function( childListener, key ) {
				if ( childListener && typeof childListener.off === "function" ) {
					childListener.off();
				}
			} );
	
			if ( newStateObj._child ) {
				newStateObj._child = utils.getChildFsmInstance( newStateObj._child );
				child = newStateObj._child && newStateObj._child.instance;
				this.hierarchy[ child.namespace ] = utils.listenToChild( this, child );
			}
	
			return child;
		},
	
		ensureClientMeta: function ensureClientMeta( client ) {
			if ( typeof client !== "object" ) {
				throw new Error( "An FSM client must be an object." );
			}
			client[ MACHINA_PROP ] = client[ MACHINA_PROP ] || {};
			if ( !client[ MACHINA_PROP ][ this.namespace ] ) {
				client[ MACHINA_PROP ][ this.namespace ] = _.cloneDeep( utils.getDefaultClientMeta() );
				this.initClient( client );
			}
			return client[ MACHINA_PROP ][ this.namespace ];
		},
	
		buildEventPayload: function( client, data ) {
			if ( _.isPlainObject( data ) ) {
				return _.extend( data, { client: client, namespace: this.namespace } );
			} else {
				return { client: client, data: data || null, namespace: this.namespace };
			}
		},
	
		getHandlerArgs: function( args, isCatchAll ) {
			// index 0 is the client, index 1 is inputType
			// if we're in a catch-all handler, input type needs to be included in the args
			// inputType might be an object, so we need to just get the inputType string if so
			var _args = args.slice( 0 );
			var input = _args[ 1 ];
			if ( typeof input === "object" ) {
				_args.splice( 1, 1, input.inputType );
			}
			return isCatchAll ?
				_args :
				[ _args[ 0 ] ].concat( _args.slice( 2 ) );
		},
	
		getSystemHandlerArgs: function( args, client ) {
			return [ client ].concat( args );
		},
	
		handle: function( client, input ) {
			var inputDef = input;
			if ( typeof input === "undefined" ) {
				throw new Error( "The input argument passed to the FSM's handle method is undefined. Did you forget to pass the input name?" );
			}
			if ( typeof input === "string" ) {
				inputDef = { inputType: input, delegated: false, ticket: undefined };
			}
			var clientMeta = this.ensureClientMeta( client );
			var args = utils.getLeaklessArgs( arguments );
			if ( typeof input !== "object" ) {
				args.splice( 1, 1, inputDef );
			}
			clientMeta.currentActionArgs = args.slice( 1 );
			var currentState = clientMeta.state;
			var stateObj = this.states[ currentState ];
			var handlerName;
			var handler;
			var isCatchAll = false;
			var child;
			var result;
			var action;
			if ( !clientMeta.inExitHandler ) {
				child = this.configForState( currentState );
				if ( child && !this.pendingDelegations[ inputDef.ticket ] && !inputDef.bubbling ) {
					inputDef.ticket = ( inputDef.ticket || utils.createUUID() );
					inputDef.delegated = true;
					this.pendingDelegations[ inputDef.ticket ] = { delegatedTo: child.namespace };
					// WARNING - returning a value from `handle` on child FSMs is not really supported.
					// If you need to return values from child FSM input handlers, use events instead.
					result = child.handle.apply( child, args );
				} else {
					if ( inputDef.ticket && this.pendingDelegations[ inputDef.ticket ] ) {
						delete this.pendingDelegations[ inputDef.ticket ];
					}
					handlerName = stateObj[ inputDef.inputType ] ? inputDef.inputType : "*";
					isCatchAll = ( handlerName === "*" );
					handler = ( stateObj[ handlerName ] || this[ handlerName ] ) || this[ "*" ];
					action = clientMeta.state + "." + handlerName;
					clientMeta.currentAction = action;
					var eventPayload = this.buildEventPayload(
						client,
						{ inputType: inputDef.inputType, delegated: inputDef.delegated, ticket: inputDef.ticket }
					);
					if ( !handler ) {
						this.emit( events.NO_HANDLER, _.extend( { args: args }, eventPayload ) );
					} else {
						this.emit( events.HANDLING, eventPayload );
						if ( typeof handler === "function" ) {
							result = handler.apply( this, this.getHandlerArgs( args, isCatchAll ) );
						} else {
							result = handler;
							this.transition( client, handler );
						}
						this.emit( events.HANDLED, eventPayload );
					}
					clientMeta.priorAction = clientMeta.currentAction;
					clientMeta.currentAction = "";
					clientMeta.currentActionArgs = undefined;
				}
			}
			return result;
		},
	
		transition: function( client, newState ) {
			var clientMeta = this.ensureClientMeta( client );
			var curState = clientMeta.state;
			var curStateObj = this.states[ curState ];
			var newStateObj = this.states[ newState ];
			var child;
			var args = utils.getLeaklessArgs( arguments ).slice( 2 );
			if ( !clientMeta.inExitHandler && newState !== curState ) {
				if ( newStateObj ) {
					child = this.configForState( newState );
					if ( curStateObj && curStateObj._onExit ) {
						clientMeta.inExitHandler = true;
						curStateObj._onExit.call( this, client );
						clientMeta.inExitHandler = false;
					}
					clientMeta.targetReplayState = newState;
					clientMeta.priorState = curState;
					clientMeta.state = newState;
					var eventPayload = this.buildEventPayload( client, {
						fromState: clientMeta.priorState,
						action: clientMeta.currentAction,
						toState: newState
					} );
					this.emit( events.TRANSITION, eventPayload );
					if ( newStateObj._onEnter ) {
						newStateObj._onEnter.apply( this, this.getSystemHandlerArgs( args, client ) );
					}
					this.emit( events.TRANSITIONED, eventPayload );
					if ( child ) {
						child.handle( client, "_reset" );
					}
	
					if ( clientMeta.targetReplayState === newState ) {
						this.processQueue( client, events.NEXT_TRANSITION );
					}
					return;
				}
				this.emit( events.INVALID_STATE, this.buildEventPayload( client, {
					state: clientMeta.state,
					attemptedState: newState
				} ) );
			}
		},
	
		deferUntilTransition: function( client, stateName ) {
			var clientMeta = this.ensureClientMeta( client );
			var stateList = _.isArray( stateName ) ? stateName : ( stateName ? [ stateName ] : undefined );
			if ( clientMeta.currentActionArgs ) {
				var queued = {
					type: events.NEXT_TRANSITION,
					untilState: stateList,
					args: clientMeta.currentActionArgs
				};
				clientMeta.inputQueue.push( queued );
				var eventPayload = this.buildEventPayload( client, {
					state: clientMeta.state,
					queuedArgs: queued
				} );
				this.emit( events.DEFERRED, eventPayload );
			}
		},
	
		deferAndTransition: function( client, stateName ) {
			this.deferUntilTransition( client, stateName );
			this.transition( client, stateName );
		},
	
		processQueue: function( client ) {
			var clientMeta = this.ensureClientMeta( client );
			var filterFn = function( item ) {
				return ( ( !item.untilState ) || ( _.includes( item.untilState, clientMeta.state ) ) );
			};
			var toProcess = _.filter( clientMeta.inputQueue, filterFn );
			clientMeta.inputQueue = _.difference( clientMeta.inputQueue, toProcess );
			_.each( toProcess, function( item ) {
				this.handle.apply( this, [ client ].concat( item.args ) );
			}.bind( this ) );
		},
	
		clearQueue: function( client, name ) {
			var clientMeta = this.ensureClientMeta( client );
			if ( !name ) {
				clientMeta.inputQueue = [];
			} else {
				// first pass we remove the target state from any `untilState` array
				_.each( clientMeta.inputQueue, function( item ) {
					item.untilState = _.without( item.untilState, name );
				} );
				// second pass we clear out deferred events with empty untilState arrays
				var filter = function( evnt ) {
					return evnt.untilState.length !== 0;
				};
				clientMeta.inputQueue = _.filter( clientMeta.inputQueue, filter );
			}
		},
	
		compositeState: function( client ) {
			var clientMeta = this.ensureClientMeta( client );
			var state = clientMeta.state;
			var child = this.states[state]._child && this.states[state]._child.instance;
			if ( child ) {
				state += "." + child.compositeState( client );
			}
			return state;
		}
	}, emitter.getInstance() );
	
	BehavioralFsm.extend = utils.extend;
	
	module.exports = BehavioralFsm;


/***/ })
/******/ ])
});
;

},{"lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-log/index.js":[function(require,module,exports){
'use strict';

var manticore = require('manticore');

/**
 * Common logging framework for the SDK. You can pass a string,
 * or use an es6 template INSIDE a function (for best performance).
 * @example
 * // Simple string logging
 * Log.debug('Hello World');
 * @example
 * // Use a template but only evaluate the template when logging is enabled
 * Log.debug(() => `Hello ${world}`);
 * @private
 */

var Level = {
    DEVELOPER: 'DEVELOPER',
    DEBUG: 'DEBUG',
    INFO: 'INFO',
    TRACK: 'TRACK',
    INSTRUMENT: 'INSTRUMENT',
    WARN: 'WARN',
    ERROR: 'ERROR',
};

var Ranks = {
    DEVELOPER: 1,
    DEBUG: 2,
    INFO: 3,
    TRACK: 4,
    INSTRUMENT: 5,
    WARN: 6,
    ERROR: 7,
    QUIET: 8,
};

var Names = {
    1: 'DEVELOPER',
    2: 'DEBUG',
    3: 'INFO',
    4: 'TRACK',
    5: 'INSTRUMENT',
    6: 'WARN',
    7: 'ERROR',
    8: 'QUIET',
};

function manticoreLogger(level, component, message, extraData) {
    manticore.log(level, component.name, message, extraData);
}

// There's probably a smarter way to do this, but at least this is better
// than rampant strings
var RootLogger = {
    name: '*',
    level: 'DEBUG',
    children: {}
}, LogWriters = [manticoreLogger];

function componentLogger(component) {
    var loggers = component.split('.'), myComponent = RootLogger, parent = RootLogger, name;
    for (var i = 0; i < loggers.length; i++) {
        if (name) {
            name += '.' + loggers[i];
        } else {
            name = loggers[i];
        }
        if (!myComponent.children[loggers[i]]) {
            myComponent.children[loggers[i]] = {name: name, children: {}, parent: parent};
        }
        myComponent = myComponent.children[loggers[i]];
        parent = myComponent;
    }
    var closure = {
        debug: function debug(item, extraData) {
            log(Ranks.DEBUG, myComponent, item, extraData);
        },
        developer: function developer(item, extraData) {
          log(Ranks.DEVELOPER, myComponent, item, extraData);
        },
        info: function info(item, extraData) {
            log(Ranks.INFO, myComponent, item, extraData);
        },
        warn: function warn(item, extraData) {
            log(Ranks.WARN, myComponent, item, extraData);
        },
        error: function error(item, extraData) {
            log(Ranks.ERROR, myComponent, item, extraData);
        },
        track: function track(item, extraData) {
            log(Ranks.TRACK, myComponent, item, extraData);
        },
        instrument: function track(item, extraData) {
            log(Ranks.INSTRUMENT, myComponent, item, extraData);
        },
        withContext: function loggerWithBaseData(context) {
            return makeContextualLogger(closure, context);
        },
        Config: myComponent,
        Root: RootLogger
      };
      return closure;
}

function makeContextualLogger(baseLogger, context) {
    var closure = {
        context: context,
        debug: function debug(item, extraData) {
            baseLogger.debug(item, extend(extraData, context));
        },
        info: function info(item, extraData) {
            baseLogger.info(item, extend(extraData, context));
        },
        warn: function warn(item, extraData) {
            baseLogger.warn(item, extend(extraData, context));
        },
        error: function error(item, extraData) {
            baseLogger.error(item, extend(extraData, context));
        },
        withContext: function loggerWithBaseData(context) {
            return makeContextualLogger(closure, context);
        },
        Config: baseLogger.Config,
        Root: RootLogger
    };
    return closure;
}

function extend(dest, src) {
    if (!dest && !src) {
        return null;
    } else if (!dest || !src) {
        return dest || src;
    }
    for (var prop in src) {
        if (!Object.prototype.hasOwnProperty.call(dest, prop)) {
            dest[prop] = src[prop];
        }
    }
    return dest;
}

module.exports = componentLogger;

/**
 * You can build your own hierarchy by passing some other "Root" object as parent.
 * Otherwise we're configuring from RootLogger and then using levelFor
 * @param json Configuration specification for the log subsystem
 * @param parent Typically null, and we will configure the RootLogger.
 */
function configLogging(json, parent) {
    parent = parent || RootLogger;
    for (var c in json) {
        var v = json[c];
        var component = parent.children[c];
        if (!component) {
            component = parent.children[c] = {};
        }
        component.name = v.name || c;
        component.parent = parent;
        component.children = component.children || {};
        if (v.level) {
            component.level = v.level;
        } else {
            delete component.level;
        }
        if (v.children) {
            configLogging(v.children, component);
        }
    }
}

module.exports.configure = configLogging;
module.exports.Config = module.exports.Root = RootLogger;
module.exports.Level = Level;
module.exports.Ranks = Ranks;

/**
 * Add a function that will be "cc'ed" on log messages. Only messages that
 * are configured to be logged will make it to this function (i.e. we still
 * check log levels and such)
 */
module.exports.addLogger = function (fn) {
    LogWriters.push(fn);
};

module.exports.removeLogger = function (fn) {
    var ix = LogWriters.indexOf(fn);
    if (ix >= 0) {
        LogWriters.splice(ix, 1);
    }
};

function log(level, component, fnOrString, extraData) {
    var configuredLevel = levelFor(component);
    if (level >= configuredLevel) {
        if (typeof(fnOrString) === 'function') {
            try {
                fnOrString = fnOrString();
            } catch (err) {
              log(Ranks.ERROR, component, 'Log Error: ' + fnOrString.toString(), extraData);
              return;
            }
        }
        if (!fnOrString) {
          var componentName = component && component.name || 'Unknown';
          var logData = { componentName: componentName, fnOrString: fnOrString, extraData: extraData };
          log(Ranks.ERROR, RootLogger, 'Log Error: no log message', logData);
          return;
        }
        fnOrString = fnOrString.toString();
        var levelName = Names[level];
        for (var eli = 0, len = LogWriters.length; eli < len; eli++) {
            LogWriters[eli](levelName, component, fnOrString, extraData);
        }
    }
}

function levelFor(component) {
    // We will walk up the chain and pick the first level we find,
    // which should always terminate at the RootLogger, but just in case you mess with us...
    var c = component, configuredLevel;
    while (c && !(configuredLevel = c.level)) {
        c = c.parent;
    }
    return Ranks[configuredLevel || RootLogger.level] || 0;
}

module.exports.levelFor = levelFor;

},{"manticore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore-util/build/index.js":[function(require,module,exports){
"use strict";

var _interopRequireDefault2 = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _indexOf = _interopRequireDefault2(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _concat = _interopRequireDefault2(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));

var _forEach = _interopRequireDefault2(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));

var _map = _interopRequireDefault2(require("@babel/runtime-corejs3/core-js-stable/instance/map"));

var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");

var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.getPropertyName = getPropertyName;
exports.extend = extend;
exports.assignSome = assignSome;
exports.assignExcept = assignExcept;
exports.reverseKeysAndValues = reverseKeysAndValues;
exports.clone = clone;
exports.deepToJSON = deepToJSON;
exports.callbackToPromise = callbackToPromise;
exports.keysToCamel = keysToCamel;

var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));

var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));

var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/typeof"));

var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/get-iterator"));

var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/is-array"));
/* eslint-disable */
// There are eslint errors which should be fixed but these functions are too widely used, so will suppress them for now


function getPropertyName(obj, propertyVal) {
  var getVal = function getVal(value) {
    for (var prop in obj) {
      if (obj.hasOwnProperty(prop)) {
        if (obj[prop] === value) {
          return prop;
        }
      }
    }

    return null;
  };

  if ((0, _isArray["default"])(propertyVal)) {
    var result = [];
    var _iteratorNormalCompletion = true;
    var _didIteratorError = false;
    var _iteratorError = undefined;

    try {
      for (var _iterator = (0, _getIterator2["default"])(propertyVal), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
        var value = _step.value;
        var name = getVal(value);

        if (name) {
          result.push(name);
        }
      }
    } catch (err) {
      _didIteratorError = true;
      _iteratorError = err;
    } finally {
      try {
        if (!_iteratorNormalCompletion && _iterator["return"] != null) {
          _iterator["return"]();
        }
      } finally {
        if (_didIteratorError) {
          throw _iteratorError;
        }
      }
    }

    return result.join();
  }

  return getVal(propertyVal);
}

function extend(dest, src) {
  var overwriteExisting = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;

  for (var prop in src) {
    if (overwriteExisting) {
      dest[prop] = src[prop];
      continue;
    }

    if (!Object.prototype.hasOwnProperty.call(dest, prop)) {
      dest[prop] = src[prop];
    }
  }

  return dest;
}

function assignSome(dest, src, keys) {
  var _iteratorNormalCompletion2 = true;
  var _didIteratorError2 = false;
  var _iteratorError2 = undefined;

  try {
    for (var _iterator2 = (0, _getIterator2["default"])(keys), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
      var prop = _step2.value;

      if (src.hasOwnProperty(prop)) {
        dest[prop] = src[prop];
      }
    }
  } catch (err) {
    _didIteratorError2 = true;
    _iteratorError2 = err;
  } finally {
    try {
      if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
        _iterator2["return"]();
      }
    } finally {
      if (_didIteratorError2) {
        throw _iteratorError2;
      }
    }
  }

  return dest;
}

function assignExcept(dest, src, keys) {
  for (var prop in src) {
    if (prop[0] !== '_' && src.hasOwnProperty(prop) && (0, _indexOf["default"])(keys).call(keys, prop) < 0) {
      dest[prop] = src[prop];
    }
  }

  return dest;
}

function reverseKeysAndValues(obj) {
  if (!obj) {
    return obj;
  }

  var newObject = {};

  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObject[obj[key]] = key;
    }
  }

  return newObject;
}

function clone(obj) {
  var copy; // Handle the 3 simple types, and null or undefined

  if (obj === null || (0, _typeof2["default"])(obj) !== 'object') {
    return obj;
  } // Handle Date


  if (obj instanceof Date) {
    copy = new Date();
    copy.setTime(obj.getTime());
    return copy;
  } // Handle Array


  if (obj instanceof Array) {
    copy = [];

    for (var i = 0, len = obj.length; i < len; i++) {
      copy[i] = clone(obj[i]);
    }

    return copy;
  } // Handle Object


  if (obj instanceof Object) {
    copy = {};

    for (var attr in obj) {
      if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
    }

    return copy;
  }

  throw new Error('Unable to copy obj! Its type isn\'t supported.');
} // Like doing JSON.parse(JSON.stringify(obj)), but without the string
// serialization/deserialization overhead.


function deepToJSON(obj) {
  // Handle the 3 simple types, and null or undefined
  if (obj === null || (0, _typeof2["default"])(obj) !== 'object') {
    return obj;
  } // Handle thing that has a toJSON method


  if (obj && typeof obj.toJSON === 'function') {
    return deepToJSON(obj.toJSON());
  }

  var retVal; // Handle Array

  if (obj instanceof Array) {
    retVal = [];

    for (var i = 0, len = obj.length; i < len; i++) {
      retVal[i] = deepToJSON(obj[i]);
    }

    return retVal;
  } // Handle Object


  if (obj instanceof Object) {
    retVal = {};

    for (var attr in obj) {
      if (obj.hasOwnProperty(attr)) retVal[attr] = deepToJSON(obj[attr]);
    }

    return retVal;
  }

  throw new Error('Unable to deepToJSON obj! Its type isn\'t supported.');
}

function callbackToPromise(method) {
  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
    args[_key - 1] = arguments[_key];
  }

  return new _promise["default"](function (resolve, reject) {
    return method.apply(void 0, (0, _concat["default"])(args).call(args, [function (err, result) {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    }]));
  });
}

function toCamel(s) {
  return s.replace(/([-_][a-z])/ig, function ($1) {
    return $1.toUpperCase().replace('-', '').replace('_', '');
  });
}

function isArray(a) {
  return (0, _isArray["default"])(a);
}

function isObject(o) {
  return o === Object(o) && !isArray(o) && typeof o !== 'function';
}

function keysToCamel(o) {
  if (isObject(o)) {
    var _context;

    var n = {};
    (0, _forEach["default"])(_context = (0, _keys["default"])(o)).call(_context, function (k) {
      n[toCamel(k)] = keysToCamel(o[k]);
    });
    return n;
  }

  if (isArray(o)) {
    return (0, _map["default"])(o).call(o, function (i) {
      return keysToCamel(i);
    });
  }

  return o;
}

},{"@babel/runtime-corejs2/core-js/array/is-array":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/array/is-array.js","@babel/runtime-corejs2/core-js/get-iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/get-iterator.js","@babel/runtime-corejs2/core-js/object/define-property":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/object/define-property.js","@babel/runtime-corejs2/core-js/object/keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/object/keys.js","@babel/runtime-corejs2/core-js/promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/core-js/promise.js","@babel/runtime-corejs2/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/helpers/interopRequireDefault.js","@babel/runtime-corejs2/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs2/helpers/typeof.js","@babel/runtime-corejs3/core-js-stable/instance/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js","@babel/runtime-corejs3/core-js-stable/instance/for-each":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/core-js-stable/instance/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/manticore/browser.js":[function(require,module,exports){
module.exports = manticore;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/mcc-mnc-list/index.js":[function(require,module,exports){
'use strict';

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));

var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));

var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/typeof"));

var records = require('./mcc-mnc-list.json');

var statusCodeList = require('./status-codes.json');

function all() {
  return records;
}

function statusCodes() {
  return statusCodeList;
}

function filter(filters) {
  if (filters === undefined || filters === null) {
    return records;
  }

  if ((0, _typeof2["default"])(filters) !== 'object') {
    throw new TypeError('Invalid parameter (object expected)');
  }

  var statusCode, mcc, mnc, countryCode;

  if (filters.statusCode) {
    statusCode = filters.statusCode;

    if ((0, _indexOf["default"])(statusCodeList).call(statusCodeList, statusCode) === -1) {
      throw new TypeError('Invalid statusCode parameter (not found in statusCode list)');
    }
  }

  if (filters.mccmnc) {
    var mccmnc;

    if (typeof filters.mccmnc === 'string' || typeof filters.mccmnc === 'number') {
      mccmnc = String(filters.mccmnc);
    } else {
      throw new TypeError('Invalid mccmnc parameter (string expected)');
    }

    mcc = mccmnc.substr(0, 3);
    mnc = mccmnc.substr(3);
  }

  if (filters.mcc && mcc) {
    throw new TypeError('Don\'t use mccmnc and mcc parameter at once');
  }

  if (filters.mnc && mnc) {
    throw new TypeError('Don\'t use mccmnc and mnc parameter at once');
  }

  if (filters.mcc) {
    if (typeof filters.mcc === 'string' || typeof filters.mcc === 'number') {
      mcc = String(filters.mcc);
    } else {
      throw new TypeError('Invalid mcc parameter (string expected)');
    }
  }

  if (filters.mnc) {
    if (typeof filters.mnc === 'string' || typeof filters.mnc === 'number') {
      mnc = String(filters.mnc);
    } else {
      throw new TypeError('Invalid mnc parameter (string expected)');
    }
  }

  if (filters.countryCode != undefined) {
    if (typeof filters.countryCode === 'string') {
      countryCode = filters.countryCode;
    } else {
      throw new TypeError('Invalid countryCode parameter (string expected)');
    }
  }

  var result = records;

  if (statusCode) {
    result = (0, _filter["default"])(result).call(result, function (record) {
      return record['status'] === statusCode;
    });
  }

  if (countryCode) {
    result = (0, _filter["default"])(result).call(result, function (record) {
      return record['countryCode'] === countryCode;
    });
  }

  if (mcc) {
    result = (0, _filter["default"])(result).call(result, function (record) {
      return record['mcc'] === mcc;
    });
  }

  if (mnc) {
    result = (0, _filter["default"])(result).call(result, function (record) {
      return record['mnc'] === mnc;
    });
  }

  return result;
}

function find(filters) {
  // return the first element of undefined, as filter will always return an array
  return filter(filters)[0];
}

module.exports = {
  all: all,
  statusCodes: statusCodes,
  filter: filter,
  find: find
};

},{"./mcc-mnc-list.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/mcc-mnc-list/mcc-mnc-list.json","./status-codes.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/mcc-mnc-list/status-codes.json","@babel/runtime-corejs3/core-js-stable/instance/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js","@babel/runtime-corejs3/core-js-stable/instance/index-of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js","@babel/runtime-corejs3/helpers/interopRequireDefault":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js","@babel/runtime-corejs3/helpers/typeof":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/@babel/runtime-corejs3/helpers/typeof.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/mcc-mnc-list/mcc-mnc-list.json":[function(require,module,exports){
module.exports=[
  {
    "type": "National",
    "countryName": "Abkhazia",
    "countryCode": "GE-AB",
    "mcc": "289",
    "mnc": "67",
    "brand": "Aquafon",
    "operator": "Aquafon JSC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800",
    "notes": "MCC is not listed by ITU; LTE band 20"
  },
  {
    "type": "National",
    "countryName": "Abkhazia",
    "countryCode": "GE-AB",
    "mcc": "289",
    "mnc": "88",
    "brand": "A-Mobile",
    "operator": "A-Mobile LLSC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": "MCC is not listed by ITU"
  },
  {
    "type": "National",
    "countryName": "Albania",
    "countryCode": "AL",
    "mcc": "276",
    "mnc": "01",
    "brand": "ONE",
    "operator": "One Telecommunications",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": "Former Telekom Albania"
  },
  {
    "type": "National",
    "countryName": "Albania",
    "countryCode": "AL",
    "mcc": "276",
    "mnc": "02",
    "brand": "Vodafone",
    "operator": "Vodafone Albania",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Albania",
    "countryCode": "AL",
    "mcc": "276",
    "mnc": "03",
    "brand": "ALBtelecom",
    "operator": "Albtelecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Eagle Mobile"
  },
  {
    "type": "National",
    "countryName": "Albania",
    "countryCode": "AL",
    "mcc": "276",
    "mnc": "04",
    "brand": "Plus Communication",
    "operator": "Plus Communication",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Shut down Jan 2018; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Andorra",
    "countryCode": "AD",
    "mcc": "213",
    "mnc": "03",
    "brand": "Som, Mobiland",
    "operator": "Andorra Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G",
    "notes": "LTE band 20; former Servei de Telecommunicacions d'Andorra"
  },
  {
    "type": "National",
    "countryName": "Armenia",
    "countryCode": "AM",
    "mcc": "283",
    "mnc": "01",
    "brand": "Beeline",
    "operator": "Veon Armenia CJSC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 450 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Armenia",
    "countryCode": "AM",
    "mcc": "283",
    "mnc": "04",
    "brand": "Karabakh Telecom",
    "operator": "Karabakh Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Armenia",
    "countryCode": "AM",
    "mcc": "283",
    "mnc": "05",
    "brand": "VivaCell-MTS",
    "operator": "K Telecom CJSC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Armenia",
    "countryCode": "AM",
    "mcc": "283",
    "mnc": "10",
    "brand": "Ucom",
    "operator": "Ucom LLC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Former Orange"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "01",
    "brand": "A1.net",
    "operator": "A1 Telekom Austria",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "former A1 / Mobilkom / PTA"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "02",
    "brand": null,
    "operator": "A1 Telekom Austria",
    "status": "Reserved",
    "bands": null,
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "03",
    "brand": "Magenta",
    "operator": "T-Mobile Austria GmbH",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 2100 / 5G 3500",
    "notes": "former Max.Mobil, T-Mobile; national roaming agreement with 232-10: uses Hutchison Drei UMTS where no own coverage"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "04",
    "brand": "Magenta",
    "operator": "T-Mobile Austria GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "former T-Mobile"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "05",
    "brand": "3",
    "operator": "Hutchison Drei Austria",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": "owned by Hutchison Drei Austria / former Orange Austria / One / Connect; GSM 900 / LTE 900 rarely used"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "06",
    "brand": "Orange AT",
    "operator": "Orange Austria GmbH",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "07",
    "brand": "Magenta-T",
    "operator": "T-Mobile Austria",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "former tele.ring"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "08",
    "brand": "Lycamobile",
    "operator": "Lycamobile Austria",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "09",
    "brand": "Tele2Mobil",
    "operator": "A1 Telekom Austria",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "division bought from Tele2 by A1 Telekom Austria; customers \"moved\" to bob (232-11)"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "10",
    "brand": "3",
    "operator": "Hutchison Drei Austria",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500",
    "notes": "national roaming agreement with 232-03: uses T-Mobile GSM where no own coverage"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "11",
    "brand": "bob",
    "operator": "A1 Telekom Austria",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "brand of A1 Telekom Austria"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "12",
    "brand": "yesss!",
    "operator": "A1 Telekom Austria",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "owned by A1 Telekom Austria / one-way national roaming agreement with 232-05"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "13",
    "brand": "Magenta",
    "operator": "T-Mobile Austria GmbH",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former UPC Austria"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "14",
    "brand": null,
    "operator": "Hutchison Drei Austria",
    "status": "Reserved",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "15",
    "brand": "Vectone Mobile",
    "operator": "Mundio Mobile Austria",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "former Barablu Mobile Austria, uses A1"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "16",
    "brand": null,
    "operator": "Hutchison Drei Austria",
    "status": "Reserved",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "17",
    "brand": null,
    "operator": "MASS Response Service GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "18",
    "brand": null,
    "operator": "smartspace GmbH",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "19",
    "brand": null,
    "operator": "Hutchison Drei Austria",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Tele2 Telecommunication GmbH"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "20",
    "brand": "m:tel",
    "operator": "MTEL Austrija GmbH",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "21",
    "brand": null,
    "operator": "Salzburg AG für Energie, Verkehr und Telekommunikation",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "22",
    "brand": null,
    "operator": "Plintron Austria Limited",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "23",
    "brand": "Magenta",
    "operator": "T-Mobile Austria GmbH",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "former T-Mobile; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "24",
    "brand": null,
    "operator": "Smartel Services GmbH",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "25",
    "brand": null,
    "operator": "Holding Graz Kommunale Dienstleistungen GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "26",
    "brand": null,
    "operator": "LIWEST Kabelmedien GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "27",
    "brand": null,
    "operator": "TISMI B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "91",
    "brand": "GSM-R A",
    "operator": "ÖBB",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": "railways communication"
  },
  {
    "type": "National",
    "countryName": "Austria",
    "countryCode": "AT",
    "mcc": "232",
    "mnc": "92",
    "brand": "ArgoNET",
    "operator": "ArgoNET GmbH",
    "status": "Operational",
    "bands": "CDMA450 / LTE450",
    "notes": "machine to machine communication for critical infrastructure"
  },
  {
    "type": "National",
    "countryName": "Belarus",
    "countryCode": "BY",
    "mcc": "257",
    "mnc": "01",
    "brand": "A1",
    "operator": "A1 Belarus",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100",
    "notes": "Former velcom; LTE via beCloud"
  },
  {
    "type": "National",
    "countryName": "Belarus",
    "countryCode": "BY",
    "mcc": "257",
    "mnc": "02",
    "brand": "MTS",
    "operator": "Mobile TeleSystems",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100",
    "notes": "LTE via beCloud"
  },
  {
    "type": "National",
    "countryName": "Belarus",
    "countryCode": "BY",
    "mcc": "257",
    "mnc": "03",
    "brand": "DIALLOG",
    "operator": "BelCel",
    "status": "Not operational",
    "bands": "CDMA 450",
    "notes": "Closed on 21 January 2014"
  },
  {
    "type": "National",
    "countryName": "Belarus",
    "countryCode": "BY",
    "mcc": "257",
    "mnc": "04",
    "brand": "life:)",
    "operator": "Belarusian Telecommunications Network",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former BeST; LTE via beCloud"
  },
  {
    "type": "National",
    "countryName": "Belarus",
    "countryCode": "BY",
    "mcc": "257",
    "mnc": "05",
    "brand": "byfly",
    "operator": "Beltelecom",
    "status": "Not operational",
    "bands": "WiMAX 3500",
    "notes": "Closed on 1 May 2017"
  },
  {
    "type": "National",
    "countryName": "Belarus",
    "countryCode": "BY",
    "mcc": "257",
    "mnc": "06",
    "brand": "beCloud",
    "operator": "Belorussian Cloud Technologies",
    "status": "Operational",
    "bands": "LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Former Yota Bel; wholesale network used by MTS, life:), and A1"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "00",
    "brand": "Proximus",
    "operator": "Belgacom Mobile",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "01",
    "brand": "Proximus",
    "operator": "Belgacom Mobile",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "02",
    "brand": null,
    "operator": "Infrabel",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "03",
    "brand": "Citymesh Connect",
    "operator": "Citymesh NV",
    "status": "Operational",
    "bands": "LTE 2600 / LTE 3500",
    "notes": "MVNO and private network"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "04",
    "brand": "MWingz",
    "operator": "Proximus/Orange Belgium",
    "status": "Planned",
    "bands": "Unknown",
    "notes": "Shared Proximus/Orange Belgium"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "05",
    "brand": "Telenet",
    "operator": "Telenet",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Using Base's Network"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "06",
    "brand": "Lycamobile",
    "operator": "Lycamobile sprl",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "07",
    "brand": "Vectone Mobile",
    "operator": "Mundio Mobile Belgium nv",
    "status": "Reserved",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "08",
    "brand": "VOO",
    "operator": "Nethys",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "09",
    "brand": "Voxbone",
    "operator": "Voxbone mobile",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "10",
    "brand": "Orange Belgium",
    "operator": "Orange S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Former Mobistar"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "11",
    "brand": "L-mobi",
    "operator": "L-Mobi Mobile",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "15",
    "brand": null,
    "operator": "Elephant Talk Communications Schweiz GmbH",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "16",
    "brand": null,
    "operator": "NextGen Mobile Ltd.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "20",
    "brand": "Base",
    "operator": "Telenet",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "22",
    "brand": "Febo.mobi",
    "operator": "FEBO Telecom",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "25",
    "brand": null,
    "operator": "Dense Air Belgium SPRL",
    "status": "Unknown",
    "bands": "TD-LTE 2600",
    "notes": "Former Voyacom"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "28",
    "brand": null,
    "operator": "BICS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "29",
    "brand": null,
    "operator": "TISMI",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "30",
    "brand": "Mobile Vikings",
    "operator": "Unleashed NV",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Orange network"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "33",
    "brand": null,
    "operator": "Ericsson NV",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Test network"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "40",
    "brand": "JOIN",
    "operator": "JOIN Experience (Belgium)",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "50",
    "brand": null,
    "operator": "IP Nexia",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "71",
    "brand": null,
    "operator": "test",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Test network; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "72",
    "brand": null,
    "operator": "test",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Test network; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "73",
    "brand": null,
    "operator": "test",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Test network; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "74",
    "brand": null,
    "operator": "test",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Test network; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "206",
    "mnc": "99",
    "brand": null,
    "operator": "e-BO Enterprises",
    "status": "Not operational",
    "bands": "LTE?",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "270",
    "mnc": "77",
    "brand": null,
    "operator": "Proximus Luxembourg S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Uses Luxembourg MCC"
  },
  {
    "type": "National",
    "countryName": "Belgium",
    "countryCode": "BE",
    "mcc": "270",
    "mnc": "99",
    "brand": null,
    "operator": "Orange Communications Luxembourg S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Uses Luxembourg MCC"
  },
  {
    "type": "National",
    "countryName": "Bosnia and Herzegovina",
    "countryCode": "BA",
    "mcc": "218",
    "mnc": "03",
    "brand": "HT-ERONET",
    "operator": "Public Enterprise Croatian Telecom Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bosnia and Herzegovina",
    "countryCode": "BA",
    "mcc": "218",
    "mnc": "05",
    "brand": "m:tel",
    "operator": "RS Telecommunications JSC Banja Luka",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE",
    "notes": "GSM-MS1, Mobilna Srpske, Mobi's"
  },
  {
    "type": "National",
    "countryName": "Bosnia and Herzegovina",
    "countryCode": "BA",
    "mcc": "218",
    "mnc": "90",
    "brand": "BH Mobile",
    "operator": "BH Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bulgaria",
    "countryCode": "BG",
    "mcc": "284",
    "mnc": "01",
    "brand": "A1 BG",
    "operator": "A1 Bulgaria",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / 5G 3500",
    "notes": "Former Citron, Mobiltel, M-Tel"
  },
  {
    "type": "National",
    "countryName": "Bulgaria",
    "countryCode": "BG",
    "mcc": "284",
    "mnc": "03",
    "brand": "Vivacom",
    "operator": "BTC",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / 5G 1800 / 5G 2100",
    "notes": "Former Vivatel"
  },
  {
    "type": "National",
    "countryName": "Bulgaria",
    "countryCode": "BG",
    "mcc": "284",
    "mnc": "05",
    "brand": "Telenor",
    "operator": "Telenor (Bulgaria)",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / 5G 3500",
    "notes": "Former Globul"
  },
  {
    "type": "National",
    "countryName": "Bulgaria",
    "countryCode": "BG",
    "mcc": "284",
    "mnc": "07",
    "brand": "НКЖИ",
    "operator": "НАЦИОНАЛНА КОМПАНИЯ ЖЕЛЕЗОПЪТНА ИНФРАСТРУКТУРА",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": "(The Bulgarian) National Railway Infrastructure Company"
  },
  {
    "type": "National",
    "countryName": "Bulgaria",
    "countryCode": "BG",
    "mcc": "284",
    "mnc": "09",
    "brand": null,
    "operator": "COMPATEL LIMITED",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Bulgaria",
    "countryCode": "BG",
    "mcc": "284",
    "mnc": "11",
    "brand": null,
    "operator": "Bulsatcom",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bulgaria",
    "countryCode": "BG",
    "mcc": "284",
    "mnc": "13",
    "brand": "Ти.ком",
    "operator": "Ti.com JSC",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": "Former Max Telecom"
  },
  {
    "type": "National",
    "countryName": "Croatia",
    "countryCode": "HR",
    "mcc": "219",
    "mnc": "01",
    "brand": "HT HR",
    "operator": "T-Hrvatski Telekom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Croatia",
    "countryCode": "HR",
    "mcc": "219",
    "mnc": "02",
    "brand": null,
    "operator": "Telemach",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": "Former Tele2"
  },
  {
    "type": "National",
    "countryName": "Croatia",
    "countryCode": "HR",
    "mcc": "219",
    "mnc": "04",
    "brand": null,
    "operator": "NTH Mobile d.o.o.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Croatia",
    "countryCode": "HR",
    "mcc": "219",
    "mnc": "10",
    "brand": "A1 HR",
    "operator": "A1 Hrvatska",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 700 / 5G 3500",
    "notes": "Former Vipnet"
  },
  {
    "type": "National",
    "countryName": "Croatia",
    "countryCode": "HR",
    "mcc": "219",
    "mnc": "12",
    "brand": null,
    "operator": "TELE FOCUS d.o.o.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Croatia",
    "countryCode": "HR",
    "mcc": "219",
    "mnc": "20",
    "brand": "T-Mobile HR",
    "operator": "T-Hrvatski Telekom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cyprus",
    "countryCode": "CY",
    "mcc": "280",
    "mnc": "01",
    "brand": "Cytamobile-Vodafone",
    "operator": "Cyprus Telecommunications Authority",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 700 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cyprus",
    "countryCode": "CY",
    "mcc": "280",
    "mnc": "02",
    "brand": "Cytamobile-Vodafone",
    "operator": "Cyprus Telecommunications Authority",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cyprus",
    "countryCode": "CY",
    "mcc": "280",
    "mnc": "10",
    "brand": "Epic",
    "operator": "Monaco Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Former MTN"
  },
  {
    "type": "National",
    "countryName": "Cyprus",
    "countryCode": "CY",
    "mcc": "280",
    "mnc": "20",
    "brand": "PrimeTel",
    "operator": "PrimeTel PLC",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 900 / LTE 1800",
    "notes": "Originally MVNO, MNO since 2015. Uses Epic for 2G/3G roaming."
  },
  {
    "type": "National",
    "countryName": "Cyprus",
    "countryCode": "CY",
    "mcc": "280",
    "mnc": "22",
    "brand": "lemontel",
    "operator": "Lemontel Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cyprus",
    "countryCode": "CY",
    "mcc": "280",
    "mnc": "23",
    "brand": "Vectone Mobile",
    "operator": "Mundio Mobile Cyprus Ltd.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Czech Republic",
    "countryCode": "CZ",
    "mcc": "230",
    "mnc": "01",
    "brand": "T-Mobile",
    "operator": "T-Mobile Czech Republic",
    "status": "Operational",
    "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2100",
    "notes": "Former Paegas; UMTS shut down Nov 2021"
  },
  {
    "type": "National",
    "countryName": "Czech Republic",
    "countryCode": "CZ",
    "mcc": "230",
    "mnc": "02",
    "brand": "O2",
    "operator": "O2 Czech Republic",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2600 / TD-LTE 2600 / 5G 3500",
    "notes": "Former Eurotel; CDMA 450 shut down June 2019; UMTS shut down Nov 2021"
  },
  {
    "type": "National",
    "countryName": "Czech Republic",
    "countryCode": "CZ",
    "mcc": "230",
    "mnc": "03",
    "brand": "Vodafone",
    "operator": "Vodafone Czech Republic",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 1800 / 5G 2100",
    "notes": "Former Oskar; UMTS shut down Mar 2021"
  },
  {
    "type": "National",
    "countryName": "Czech Republic",
    "countryCode": "CZ",
    "mcc": "230",
    "mnc": "04",
    "brand": null,
    "operator": "Nordic Telecom s.r.o.",
    "status": "Operational",
    "bands": "MVNO / LTE 410",
    "notes": "Former U:fon, Air Telecom; CDMA 410 MHz shut down Dec 2017; LTE 410 for public safety services"
  },
  {
    "type": "National",
    "countryName": "Czech Republic",
    "countryCode": "CZ",
    "mcc": "230",
    "mnc": "05",
    "brand": null,
    "operator": "PODA a.s.",
    "status": "Operational",
    "bands": "TD-LTE 3700",
    "notes": "Former TRAVEL TELEKOMMUNIKATION; fixed wireless"
  },
  {
    "type": "National",
    "countryName": "Czech Republic",
    "countryCode": "CZ",
    "mcc": "230",
    "mnc": "06",
    "brand": null,
    "operator": "Nordic Telecom 5G a.s.",
    "status": "Operational",
    "bands": "TD-LTE 3700",
    "notes": "Former OSNO TELECOMUNICATION"
  },
  {
    "type": "National",
    "countryName": "Czech Republic",
    "countryCode": "CZ",
    "mcc": "230",
    "mnc": "07",
    "brand": "T-Mobile",
    "operator": "T-Mobile Czech Republic",
    "status": "Operational",
    "bands": "LTE 800",
    "notes": "Former ASTELNET"
  },
  {
    "type": "National",
    "countryName": "Czech Republic",
    "countryCode": "CZ",
    "mcc": "230",
    "mnc": "08",
    "brand": null,
    "operator": "Compatel s.r.o.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Czech Republic",
    "countryCode": "CZ",
    "mcc": "230",
    "mnc": "09",
    "brand": "Unimobile",
    "operator": "Uniphone, s.r.o.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": "Former Vectone/Mundio"
  },
  {
    "type": "National",
    "countryName": "Czech Republic",
    "countryCode": "CZ",
    "mcc": "230",
    "mnc": "98",
    "brand": null,
    "operator": "Správa železniční dopravní cesty, s.o.",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": "railways communication"
  },
  {
    "type": "National",
    "countryName": "Czech Republic",
    "countryCode": "CZ",
    "mcc": "230",
    "mnc": "99",
    "brand": "Vodafone",
    "operator": "Vodafone Czech Republic",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "R&D Centre at FEE, CTU (educational, experimental); licence expired Jul 2012"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "01",
    "brand": "TDC",
    "operator": "TDC A/S",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "02",
    "brand": "Telenor",
    "operator": "Telenor Denmark",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "Former Sonofon"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "03",
    "brand": null,
    "operator": "Syniverse Technologies",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former End2End / MIGway A/S / MACH Connectivity"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "04",
    "brand": null,
    "operator": "Nexcon.io ApS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former NextGen Mobile Ltd T/A CardBoardFish"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "05",
    "brand": "TetraNet",
    "operator": "Dansk Beredskabskommunikation A/S",
    "status": "Operational",
    "bands": "TETRA",
    "notes": "Former ApS KBUS 38 nr. 4418; owned by Motorola Solutions"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "06",
    "brand": "3",
    "operator": "Hi3G Denmark ApS",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 700 / 5G 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "07",
    "brand": "Vectone Mobile",
    "operator": "Mundio Mobile (Denmark) Limited",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "Former Barablu; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "08",
    "brand": "Voxbone",
    "operator": "Voxbone mobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Nordisk Mobiltelefon"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "09",
    "brand": "SINE",
    "operator": "Dansk Beredskabskommunikation A/S",
    "status": "Operational",
    "bands": "TETRA",
    "notes": "Owned by Motorola Solutions"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "10",
    "brand": "TDC",
    "operator": "TDC A/S",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Test network"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "11",
    "brand": "SINE",
    "operator": "Dansk Beredskabskommunikation A/S",
    "status": "Operational",
    "bands": "TETRA",
    "notes": "Test network"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "12",
    "brand": "Lycamobile",
    "operator": "Lycamobile Denmark Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "13",
    "brand": null,
    "operator": "Compatel Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "14",
    "brand": null,
    "operator": "Monty UK Global Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "15",
    "brand": "Net 1",
    "operator": "Cibicom",
    "status": "Operational",
    "bands": "LTE 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "16",
    "brand": null,
    "operator": "Tismi B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "17",
    "brand": null,
    "operator": "Gotanet AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Naka AG"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "18",
    "brand": null,
    "operator": "Cubic Telecom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "20",
    "brand": "Telia",
    "operator": "Telia",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "23",
    "brand": "GSM-R DK",
    "operator": "Banedanmark",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "25",
    "brand": "Viahub",
    "operator": "SMS Provider Corp.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "28",
    "brand": null,
    "operator": "LINK Mobile A/S",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former CoolTEL ApS"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "30",
    "brand": null,
    "operator": "Interactive digital media GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Telia"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "40",
    "brand": null,
    "operator": "Ericsson Danmark A/S",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Test network; former Sense Communications Denmark A/S; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "42",
    "brand": null,
    "operator": "Greenwave Mobile IoT ApS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Brandtel ApS, Tel42 ApS"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "43",
    "brand": null,
    "operator": "MobiWeb Limited",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "66",
    "brand": null,
    "operator": "TT-Netværket P/S",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 1800",
    "notes": "Former Telia, now shared network Telia/Telenor"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "73",
    "brand": null,
    "operator": "Onomondo ApS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "77",
    "brand": "Telenor",
    "operator": "Telenor Denmark",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Former Tele2"
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "88",
    "brand": null,
    "operator": "Cobira ApS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Denmark (Kingdom of Denmark)",
    "countryCode": "DK",
    "mcc": "238",
    "mnc": "96",
    "brand": "Telia",
    "operator": "Telia Danmark",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Test network"
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "01",
    "brand": "Telia",
    "operator": "Telia Eesti",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G",
    "notes": "Former EMT"
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "02",
    "brand": "Elisa",
    "operator": "Elisa Eesti",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "03",
    "brand": "Tele2",
    "operator": "Tele2 Eesti",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "04",
    "brand": "Top Connect",
    "operator": "OY Top Connect",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "05",
    "brand": "CSC Telecom",
    "operator": "CSC Telecom Estonia OÜ",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former AS Bravocom Mobiil"
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "06",
    "brand": null,
    "operator": "Progroup Holding",
    "status": "Not operational",
    "bands": "UMTS 2100",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "07",
    "brand": "Kou",
    "operator": "Televõrgu AS",
    "status": "Not operational",
    "bands": "CDMA2000 450",
    "notes": "Acquired by Tele 2 in 2012; shut down in January 2016"
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "08",
    "brand": "VIVEX",
    "operator": "VIVEX OU",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "09",
    "brand": null,
    "operator": "Bravo Telecom",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "10",
    "brand": null,
    "operator": "Telcotrade OÜ",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "11",
    "brand": null,
    "operator": "UAB Raystorm Eesti filiaal",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "12",
    "brand": null,
    "operator": "Ntel Solutions OÜ",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "13",
    "brand": null,
    "operator": "Telia Eesti AS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "14",
    "brand": null,
    "operator": "Estonian Crafts OÜ",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "15",
    "brand": null,
    "operator": "Premium Net International S.R.L. Eesti filiaal",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "16",
    "brand": "dzinga",
    "operator": "SmartTel Plus OÜ",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "17",
    "brand": null,
    "operator": "Baltergo OÜ",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "18",
    "brand": null,
    "operator": "Cloud Communications OÜ",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "19",
    "brand": null,
    "operator": "OkTelecom OÜ",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "20",
    "brand": null,
    "operator": "DOTT Telecom OÜ",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "21",
    "brand": null,
    "operator": "Tismi B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "22",
    "brand": null,
    "operator": "M2MConnect OÜ",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Estonia",
    "countryCode": "EE",
    "mcc": "248",
    "mnc": "71",
    "brand": null,
    "operator": "Siseministeerium (Ministry of Interior)",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Faroe Islands (Kingdom of Denmark)",
    "countryCode": "FO",
    "mcc": "288",
    "mnc": "01",
    "brand": "Føroya Tele",
    "operator": "Føroya Tele",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Faroe Islands (Kingdom of Denmark)",
    "countryCode": "FO",
    "mcc": "288",
    "mnc": "02",
    "brand": "Hey",
    "operator": "Nema",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": "Former Kall, also uses MCC 274 MNC 02 (Iceland)"
  },
  {
    "type": "National",
    "countryName": "Faroe Islands (Kingdom of Denmark)",
    "countryCode": "FO",
    "mcc": "288",
    "mnc": "03",
    "brand": "TOSA",
    "operator": "Tosa Sp/F",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": "Former Edge Mobile"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "03",
    "brand": "DNA",
    "operator": "DNA Oy",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Former Telia"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "04",
    "brand": "DNA",
    "operator": "DNA Oy",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Aina Oyj"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "05",
    "brand": "Elisa",
    "operator": "Elisa Oyj",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 3500",
    "notes": "Former Radiolinja"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "06",
    "brand": "Elisa",
    "operator": "Elisa Oyj",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "07",
    "brand": "Nokia",
    "operator": "Nokia Solutions and Networks Oy",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600 / TD-LTE 2600",
    "notes": "Test network in Espoo Leppävaara and Nokia HQ"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "08",
    "brand": "Nokia",
    "operator": "Nokia Solutions and Networks Oy",
    "status": "Unknown",
    "bands": "GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "09",
    "brand": null,
    "operator": "Nokia Solutions and Networks Oy",
    "status": "Unknown",
    "bands": "GSM 900",
    "notes": "Former Finnet Group"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "10",
    "brand": null,
    "operator": "Traficom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former TDC Oy Finland"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "11",
    "brand": null,
    "operator": "Traficom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Vectone Mobile"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "12",
    "brand": "DNA",
    "operator": "DNA Oy",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "13",
    "brand": "DNA",
    "operator": "DNA Oy",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "14",
    "brand": "Ålcom",
    "operator": "Ålands Telekommunikation Ab",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": "Former Ålands Mobiltelefon (ÅMT); coverage only in Åland"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "15",
    "brand": null,
    "operator": "Telit Wireless Solutions GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former educational network of Satakunta University of Applied Sciences"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "16",
    "brand": null,
    "operator": "Digita Oy",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Tele2"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "17",
    "brand": null,
    "operator": "Liikennevirasto",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": "Finnish Transport Agency"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "19",
    "brand": null,
    "operator": "Nettia Oy",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "20",
    "brand": null,
    "operator": "Elisa Oyj",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Telia"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "21",
    "brand": "Elisa- Saunalahti",
    "operator": "Elisa Oyj",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Internal MVNO-code of Elisa Oyj. Former Saunalahti Group Oyj"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "22",
    "brand": null,
    "operator": "EXFO Oy",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former NetHawk Oyj; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "23",
    "brand": null,
    "operator": "EXFO Oy",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former NetHawk Oyj; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "24",
    "brand": null,
    "operator": "Nord Connect UAB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Tampere University of Technology foundation"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "25",
    "brand": null,
    "operator": "Fortum Power and Heat Oy",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Datame Oy CDMA"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "26",
    "brand": "Compatel",
    "operator": "Compatel Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "27",
    "brand": null,
    "operator": "Teknologian tutkimuskeskus VTT Oy",
    "status": "Not operational",
    "bands": "LTE 450 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500 / 5G mmWave",
    "notes": "VTT Technical Research Centre of Finland; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "28",
    "brand": null,
    "operator": "Teknologian tutkimuskeskus VTT Oy",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "VTT Technical Research Centre of Finland; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "29",
    "brand": null,
    "operator": "Teknologian tutkimuskeskus VTT Oy",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former SCNL Truphone, VTT Technical Research Centre of Finland; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "30",
    "brand": null,
    "operator": "Teknologian tutkimuskeskus VTT Oy",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former Mundio Mobile Oy, VTT Technical Research Centre of Finland; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "31",
    "brand": null,
    "operator": "Teknologian tutkimuskeskus VTT Oy",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former Ukko Mobile Oy, VTT Technical Research Centre of Finland; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "32",
    "brand": "Voxbone",
    "operator": "Voxbone SA",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "33",
    "brand": "VIRVE",
    "operator": "Suomen Turvallisuusverkko Oy",
    "status": "Operational",
    "bands": "TETRA",
    "notes": "Finnish authorities radio network"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "34",
    "brand": "Bittium Wireless",
    "operator": "Bittium Wireless Oy",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "35",
    "brand": null,
    "operator": "Edzcom Oy",
    "status": "Operational",
    "bands": "LTE 450 / TD-LTE 2600",
    "notes": "Former Ukkoverkot; data-only network"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "36",
    "brand": "Telia / DNA",
    "operator": "Telia Finland Oyj / Suomen Yhteisverkko Oy",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": "Joint mobile network in Northern and Eastern Finland areas"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "37",
    "brand": "Tismi",
    "operator": "Tismi BV",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "38",
    "brand": null,
    "operator": "Nokia Solutions and Networks Oy",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Test network"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "39",
    "brand": null,
    "operator": "Nokia Solutions and Networks Oy",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Test network; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "40",
    "brand": null,
    "operator": "Nokia Solutions and Networks Oy",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Test network;"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "41",
    "brand": null,
    "operator": "Nokia Solutions and Networks Oy",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Test network MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "42",
    "brand": null,
    "operator": "SMS Provider Corp.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "43",
    "brand": null,
    "operator": "Telavox AB / Telavox Oy",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "44",
    "brand": null,
    "operator": "Turun ammattikorkeakoulu Oy",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "45",
    "brand": null,
    "operator": "Suomen Turvallisuusverkko Oy",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Public safety network"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "46",
    "brand": null,
    "operator": "Suomen Turvallisuusverkko Oy",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Public safety network"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "47",
    "brand": null,
    "operator": "Suomen Turvallisuusverkko Oy",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Public safety network"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "50",
    "brand": null,
    "operator": "Aalto-korkeakoulusäätiö sr",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "51",
    "brand": null,
    "operator": "Aalto-korkeakoulusäätiö sr",
    "status": "Not operational",
    "bands": "NB-IoT 700",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "52",
    "brand": null,
    "operator": "Aalto-korkeakoulusäätiö sr",
    "status": "Not operational",
    "bands": "5G 3500",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "53",
    "brand": null,
    "operator": "Aalto-korkeakoulusäätiö sr",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "54",
    "brand": null,
    "operator": "Aalto-korkeakoulusäätiö sr",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "55",
    "brand": null,
    "operator": "Aalto-korkeakoulusäätiö sr",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "56",
    "brand": null,
    "operator": "Aalto-korkeakoulusäätiö sr",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "57",
    "brand": null,
    "operator": "Aalto-korkeakoulusäätiö sr",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "58",
    "brand": null,
    "operator": "Aalto-korkeakoulusäätiö sr",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "59",
    "brand": null,
    "operator": "Aalto-korkeakoulusäätiö sr",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "91",
    "brand": "Telia",
    "operator": "Telia Finland Oyj",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500",
    "notes": "Former Sonera"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "92",
    "brand": "Sonera",
    "operator": "TeliaSonera Finland Oyj",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "95",
    "brand": null,
    "operator": "Säteilyturvakeskus",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Finland",
    "countryCode": "FI",
    "mcc": "244",
    "mnc": "99",
    "brand": null,
    "operator": "Oy L M Ericsson Ab",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "01",
    "brand": "Orange",
    "operator": "Orange S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "02",
    "brand": "Orange",
    "operator": "Orange S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "Zones Blanches"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "03",
    "brand": "MobiquiThings",
    "operator": "MobiquiThings",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "04",
    "brand": "Sisteer",
    "operator": "Societe d'ingenierie systeme telecom et reseaux",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "05",
    "brand": null,
    "operator": "Globalstar Europe",
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "06",
    "brand": null,
    "operator": "Globalstar Europe",
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "07",
    "brand": null,
    "operator": "Globalstar Europe",
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "08",
    "brand": "SFR",
    "operator": "Altice",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Completel"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "09",
    "brand": "SFR",
    "operator": "Altice",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "is launched for SFR outbound roaming services"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "10",
    "brand": "SFR",
    "operator": "Altice",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "MNC also used in Monaco"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "11",
    "brand": "SFR",
    "operator": "Altice",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": "Femtocells"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "12",
    "brand": "Truphone",
    "operator": "Truphone France",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Hewlett-Packard France"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "13",
    "brand": "SFR",
    "operator": "Altice",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500",
    "notes": "Zones Blanches"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "14",
    "brand": "SNCF Réseau",
    "operator": "SNCF Réseau",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "15",
    "brand": "Free",
    "operator": "Free Mobile",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600 / 5G 700 / 5G 3500",
    "notes": "Principal Network"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "16",
    "brand": "Free",
    "operator": "Free Mobile",
    "status": "Operational",
    "bands": "LTE 700 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "17",
    "brand": "LEGOS",
    "operator": "Local Exchange Global Operation Services",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "18",
    "brand": "Voxbone",
    "operator": "Voxbone mobile",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "19",
    "brand": null,
    "operator": "Haute-Garonne numérique",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Former Altitude Infrastructure; fixed wireless"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "20",
    "brand": "Bouygues",
    "operator": "Bouygues Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "MNC also used in Monaco"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "21",
    "brand": "Bouygues",
    "operator": "Bouygues Telecom",
    "status": "Unknown",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / UMTS 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "22",
    "brand": "Transatel Mobile",
    "operator": "Transatel",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": "MVNE Uses Orange"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "23",
    "brand": null,
    "operator": "Syndicat mixte ouvert Charente Numérique",
    "status": "Operational",
    "bands": "TD-LTE",
    "notes": "Former Omea Telecom (bought by SFR in 2014); fixed wireless"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "24",
    "brand": "MobiquiThings",
    "operator": "MobiquiThings",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "25",
    "brand": "LycaMobile",
    "operator": "LycaMobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "26",
    "brand": "NRJ Mobile",
    "operator": "Bouygues Telecom - Distribution",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Euro-Information Telecom"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "27",
    "brand": null,
    "operator": "Coriolis Telecom",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Afone"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "28",
    "brand": null,
    "operator": "Airmob Infra Full",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Airbus Defence and Space"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "29",
    "brand": null,
    "operator": "Cubic télécom France",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Société International Mobile Communication"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "30",
    "brand": null,
    "operator": "Syma Mobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "31",
    "brand": "Vectone Mobile",
    "operator": "Mundio Mobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses SFR or RED"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "32",
    "brand": "Orange",
    "operator": "Orange S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "33",
    "brand": "Fibre64",
    "operator": "Département des Pyrénées-Atlantiques",
    "status": "Unknown",
    "bands": "WiMAX",
    "notes": "fixed wireless"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "34",
    "brand": null,
    "operator": "Cellhire France",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "35",
    "brand": "Free",
    "operator": "Free Mobile",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "36",
    "brand": "Free",
    "operator": "Free Mobile",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "37",
    "brand": null,
    "operator": "IP Directions",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "38",
    "brand": null,
    "operator": "Lebara France Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "39",
    "brand": null,
    "operator": "Netwo",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "500",
    "brand": null,
    "operator": "EDF",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "MNC 50 formerly assigned to EDF"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "50168",
    "brand": null,
    "operator": "Butachimie",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "50244",
    "brand": null,
    "operator": "EDF",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former General Electric Digital Services Europe"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "700",
    "brand": null,
    "operator": "Weaccess group",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "701",
    "brand": null,
    "operator": "GIP Vendée numérique",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "702",
    "brand": null,
    "operator": "17-Numerique",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "703",
    "brand": null,
    "operator": "Nivertel",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "704",
    "brand": null,
    "operator": "Axione Limousin",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "705",
    "brand": null,
    "operator": "Hautes-Pyrénées Numérique",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "706",
    "brand": null,
    "operator": "Tours Métropole Numérique",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "707",
    "brand": null,
    "operator": "Sartel THD",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "708",
    "brand": null,
    "operator": "Melis@ territoires ruraux",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "709",
    "brand": null,
    "operator": "Quimper communauté télécom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "710",
    "brand": null,
    "operator": "Losange",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "711",
    "brand": null,
    "operator": "Nomotech",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "712",
    "brand": null,
    "operator": "Syndicat Audois d'énergies et du Numérique",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "713",
    "brand": null,
    "operator": "SD NUM SAS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "714",
    "brand": null,
    "operator": "Département de l'Isère",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "86",
    "brand": null,
    "operator": "SEM@FOR77",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Nomotech"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "87",
    "brand": null,
    "operator": "Airbus defence and space SAS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former RATP"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "88",
    "brand": "Bouygues",
    "operator": "Bouygues Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "Zones Blanches"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "89",
    "brand": null,
    "operator": "Hub One",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Omer Telecom Ltd, Fondation b-com"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "90",
    "brand": null,
    "operator": "Images & Réseaux",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "91",
    "brand": null,
    "operator": "Orange S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "92",
    "brand": "Com4Innov",
    "operator": "Association Plate-forme Télécom",
    "status": "Not operational",
    "bands": "TD-LTE 2300 / LTE 2600",
    "notes": "Test network; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "93",
    "brand": null,
    "operator": "Thales Communications & Security SAS",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former TDF; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "94",
    "brand": null,
    "operator": "Halys",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "95",
    "brand": null,
    "operator": "Orange S.A.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "96",
    "brand": null,
    "operator": "Région Bourgogne-Franche-Comté",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Former Axione; fixed wireless"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "97",
    "brand": null,
    "operator": "Thales Communications & Security SAS",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "France",
    "countryCode": "FR",
    "mcc": "208",
    "mnc": "98",
    "brand": null,
    "operator": "Société Air France",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "01",
    "brand": "Geocell",
    "operator": "Silknet",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "02",
    "brand": "Magti",
    "operator": "MagtiCom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "03",
    "brand": "MagtiFix",
    "operator": "MagtiCom",
    "status": "Operational",
    "bands": "CDMA 450",
    "notes": "License until 2029"
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "04",
    "brand": "Beeline",
    "operator": "Mobitel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "05",
    "brand": "S1",
    "operator": "Silknet",
    "status": "Operational",
    "bands": "CDMA 800",
    "notes": "former UTG"
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "06",
    "brand": null,
    "operator": "JSC Compatel",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "07",
    "brand": "GlobalCell",
    "operator": "GlobalCell",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "08",
    "brand": "Silk LTE",
    "operator": "Silknet",
    "status": "Operational",
    "bands": "LTE 2300",
    "notes": "CDMA 850 shut down Nov 2019"
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "09",
    "brand": null,
    "operator": "Gmobile",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "10",
    "brand": null,
    "operator": "Premium Net International SRL",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "11",
    "brand": null,
    "operator": "Mobilive",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "12",
    "brand": null,
    "operator": "Telecom1 Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Datacomm"
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "13",
    "brand": null,
    "operator": "Asanet Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "14",
    "brand": "DataCell",
    "operator": "DataHouse Global",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Georgia",
    "countryCode": "GE",
    "mcc": "282",
    "mnc": "22",
    "brand": "Myphone",
    "operator": "Myphone Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "01",
    "brand": "Telekom",
    "operator": "Telekom Deutschland GmbH",
    "status": "Operational",
    "bands": "GSM 900 / LTE 700 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "Formerly D1 - DeTeMobil, D1-Telekom, T-D1, T-Mobile; UMTS shut down Jun 2021"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "02",
    "brand": "Vodafone",
    "operator": "Vodafone D2 GmbH",
    "status": "Operational",
    "bands": "GSM 900 / LTE 700 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 3500",
    "notes": "Former D2 Mannesmann; UMTS shut down Jun 2021"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "03",
    "brand": "O2",
    "operator": "Telefónica Germany GmbH & Co. oHG",
    "status": "Operational",
    "bands": "GSM 900 / LTE 700 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500",
    "notes": "Former E-Plus until 2014; UMTS shut down Dec 2021"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "04",
    "brand": "Vodafone",
    "operator": "Vodafone D2 GmbH",
    "status": "Reserved",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "05",
    "brand": "O2",
    "operator": "Telefónica Germany GmbH & Co. oHG",
    "status": "Reserved",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100",
    "notes": "Former E-Plus"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "06",
    "brand": "Telekom",
    "operator": "Telekom Deutschland GmbH",
    "status": "Reserved",
    "bands": "GSM 900 / LTE 800 / LTE 900 / LTE 1500 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "07",
    "brand": "O2",
    "operator": "Telefónica Germany GmbH & Co. oHG",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Merged with E-Plus Mobilfunk in 2014 and uses MNC 262-03 since 2016"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "08",
    "brand": "O2",
    "operator": "Telefónica Germany GmbH & Co. oHG",
    "status": "Reserved",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "09",
    "brand": "Vodafone",
    "operator": "Vodafone D2 GmbH",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 2600",
    "notes": "Internal testing IOT"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "10",
    "brand": null,
    "operator": "DB Netz AG",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": "Former Arcor, Vodafone"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "11",
    "brand": "O2",
    "operator": "Telefónica Germany GmbH & Co. oHG",
    "status": "Reserved",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "12",
    "brand": "Simquadrat",
    "operator": "sipgate GmbH",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "National roaming with O2 (former E-Plus)"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "13",
    "brand": "BAAINBw",
    "operator": "Bundesamt für Ausrüstung, Informationstechnik und Nutzung der Bundeswehr",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Mobilcom"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "14",
    "brand": null,
    "operator": "Lebara Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Group 3G UMTS"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "15",
    "brand": "Airdata",
    "operator": null,
    "status": "Operational",
    "bands": "TD-SCDMA",
    "notes": "data only"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "16",
    "brand": null,
    "operator": "Telogic Germany GmbH",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "formerly Vistream; bankruptcy in 2012"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "17",
    "brand": "O2",
    "operator": "Telefónica Germany GmbH & Co. oHG",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former E-Plus"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "18",
    "brand": null,
    "operator": "NetCologne",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "CDMA 450 shut down"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "19",
    "brand": "450connect",
    "operator": "Alliander AG",
    "status": "Operational",
    "bands": "LTE 450",
    "notes": "Former Inquam"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "20",
    "brand": "Voiceworks",
    "operator": "Voiceworks GmbH",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses O2 (former E-Plus) (262-03)"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "21",
    "brand": null,
    "operator": "Multiconnect GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "22",
    "brand": null,
    "operator": "sipgate Wireless GmbH",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "23",
    "brand": null,
    "operator": "Drillisch Online AG",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "24",
    "brand": null,
    "operator": "TelcoVillage GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "33",
    "brand": "simquadrat",
    "operator": "sipgate GmbH",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "Uses O2 (former E-Plus) (262-03); MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "41",
    "brand": null,
    "operator": "First Telecom GmbH",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "42",
    "brand": "CCC Event",
    "operator": "Chaos Computer Club",
    "status": "Temporary operational",
    "bands": "GSM 1800",
    "notes": "Used on events like Chaos Communication Congress"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "43",
    "brand": "Lycamobile",
    "operator": "Lycamobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Vodafone"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "60",
    "brand": null,
    "operator": "DB Telematik",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "70",
    "brand": null,
    "operator": "BDBOS",
    "status": "Operational",
    "bands": "Tetra",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "71",
    "brand": null,
    "operator": "GSMK",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "72",
    "brand": null,
    "operator": "Ericsson GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "73",
    "brand": null,
    "operator": "Nokia",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Xantaro Deutschland GmbH"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "74",
    "brand": null,
    "operator": "Ericsson GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Qualcomm"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "75",
    "brand": null,
    "operator": "Core Network Dynamics GmbH",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Test network; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "76",
    "brand": null,
    "operator": "BDBOS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Siemens"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "77",
    "brand": "O2",
    "operator": "Telefónica Germany GmbH & Co. oHG",
    "status": "Unknown",
    "bands": "GSM 900",
    "notes": "Former E-Plus; test network"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "78",
    "brand": "Telekom",
    "operator": "Telekom Deutschland GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "79",
    "brand": null,
    "operator": "ng4T GmbH",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Germany",
    "countryCode": "DE",
    "mcc": "262",
    "mnc": "92",
    "brand": null,
    "operator": "Nash Technologies",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100",
    "notes": "Test network; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Gibraltar (United Kingdom)",
    "countryCode": "GI",
    "mcc": "266",
    "mnc": "01",
    "brand": "GibTel",
    "operator": "Gibtelecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Gibraltar (United Kingdom)",
    "countryCode": "GI",
    "mcc": "266",
    "mnc": "03",
    "brand": "Gibfibrespeed",
    "operator": "GibFibre Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Gibraltar (United Kingdom)",
    "countryCode": "GI",
    "mcc": "266",
    "mnc": "06",
    "brand": "CTS Mobile",
    "operator": "CTS Gibraltar",
    "status": "Not operational",
    "bands": "UMTS 2100",
    "notes": "licence withdrawn in February 2013"
  },
  {
    "type": "National",
    "countryName": "Gibraltar (United Kingdom)",
    "countryCode": "GI",
    "mcc": "266",
    "mnc": "09",
    "brand": "Shine",
    "operator": "Eazitelecom",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100",
    "notes": "shut down May 2016"
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "01",
    "brand": "Cosmote",
    "operator": "COSMOTE - Mobile Telecommunications S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 1800 / 5G 2100 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "02",
    "brand": "Cosmote",
    "operator": "COSMOTE - Mobile Telecommunications S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 1800 / 5G 2100 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "03",
    "brand": null,
    "operator": "OTE",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "04",
    "brand": null,
    "operator": "OSE",
    "status": "Unknown",
    "bands": "GSM-R",
    "notes": "Former EDISY"
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "05",
    "brand": "Vodafone",
    "operator": "Vodafone Greece",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "former PanaFon"
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "06",
    "brand": null,
    "operator": "Cosmoline",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "07",
    "brand": null,
    "operator": "AMD Telecom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "09",
    "brand": "Wind",
    "operator": "Wind Hellas Telecommunications S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "former Q-Telecom"
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "10",
    "brand": "Wind",
    "operator": "Wind Hellas Telecommunications S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "former Telestet & TIM"
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "11",
    "brand": null,
    "operator": "interConnect",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "12",
    "brand": null,
    "operator": "Yuboto",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "13",
    "brand": null,
    "operator": "Compatel Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "14",
    "brand": "Cyta Hellas",
    "operator": "CYTA",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO on Vodafone's network"
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "15",
    "brand": null,
    "operator": "BWS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Greece",
    "countryCode": "GR",
    "mcc": "202",
    "mnc": "16",
    "brand": null,
    "operator": "Inter Telecom",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Greenland (Kingdom of Denmark)",
    "countryCode": "GL",
    "mcc": "290",
    "mnc": "01",
    "brand": null,
    "operator": "TELE Greenland A/S",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Greenland (Kingdom of Denmark)",
    "countryCode": "GL",
    "mcc": "290",
    "mnc": "02",
    "brand": "Nanoq Media",
    "operator": "inu:it a/s",
    "status": "Operational",
    "bands": "TD-LTE 2500",
    "notes": "Former Nuuk TV"
  },
  {
    "type": "National",
    "countryName": "Guernsey (United Kingdom)",
    "countryCode": "GG",
    "mcc": "234",
    "mnc": "03",
    "brand": "Airtel-Vodafone",
    "operator": "Guernsey Airtel Ltd",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guernsey (United Kingdom)",
    "countryCode": "GG",
    "mcc": "234",
    "mnc": "50",
    "brand": "JT",
    "operator": "JT Group Limited",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "former Wave Telecom"
  },
  {
    "type": "National",
    "countryName": "Guernsey (United Kingdom)",
    "countryCode": "GG",
    "mcc": "234",
    "mnc": "55",
    "brand": "Sure Mobile",
    "operator": "Sure (Guernsey) Limited",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "former Cable & Wireless"
  },
  {
    "type": "National",
    "countryName": "Hungary",
    "countryCode": "HU",
    "mcc": "216",
    "mnc": "01",
    "brand": "Telenor Hungary",
    "operator": "Telenor Magyarország Zrt.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "Former Pannon, Pannon GSM; MNC has not the same numerical value as the area code"
  },
  {
    "type": "National",
    "countryName": "Hungary",
    "countryCode": "HU",
    "mcc": "216",
    "mnc": "02",
    "brand": null,
    "operator": "MVM Net Ltd.",
    "status": "Operational",
    "bands": "LTE 450",
    "notes": "For government use"
  },
  {
    "type": "National",
    "countryName": "Hungary",
    "countryCode": "HU",
    "mcc": "216",
    "mnc": "03",
    "brand": "DIGI",
    "operator": "DIGI Telecommunication Ltd.",
    "status": "Operational",
    "bands": "LTE 1800 / TD-LTE 3700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hungary",
    "countryCode": "HU",
    "mcc": "216",
    "mnc": "04",
    "brand": null,
    "operator": "Invitech ICT Services Ltd.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Hungary",
    "countryCode": "HU",
    "mcc": "216",
    "mnc": "30",
    "brand": "Telekom",
    "operator": "Magyar Telekom Plc",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "Former WESTEL, Westel 900; MNC has the same numerical value as the area code"
  },
  {
    "type": "National",
    "countryName": "Hungary",
    "countryCode": "HU",
    "mcc": "216",
    "mnc": "70",
    "brand": "Vodafone",
    "operator": "Vodafone Magyarország Zrt.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "MNC has the same numerical value as the area code"
  },
  {
    "type": "National",
    "countryName": "Hungary",
    "countryCode": "HU",
    "mcc": "216",
    "mnc": "71",
    "brand": "upc",
    "operator": "Vodafone Magyarország Zrt.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hungary",
    "countryCode": "HU",
    "mcc": "216",
    "mnc": "99",
    "brand": "MAV GSM-R",
    "operator": "Magyar Államvasutak",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "01",
    "brand": "Síminn",
    "operator": "Iceland Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": "Former Landssimi hf"
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "02",
    "brand": "Vodafone",
    "operator": "Sýn",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100",
    "notes": "Former Islandssimi ehf"
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "03",
    "brand": "Vodafone",
    "operator": "Sýn",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Former Islandssimi ehf"
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "04",
    "brand": "Viking",
    "operator": "IMC Island ehf",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "05",
    "brand": null,
    "operator": "Halló Frjáls fjarskipti hf.",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "06",
    "brand": null,
    "operator": "Núll níu ehf",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "07",
    "brand": "IceCell",
    "operator": "IceCell ehf",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Network only partially built; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "08",
    "brand": "On-waves",
    "operator": "Iceland Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "On ferries and cruise ships"
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "11",
    "brand": "Nova",
    "operator": "Nova ehf",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "12",
    "brand": "Tal",
    "operator": "IP fjarskipti",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "16",
    "brand": null,
    "operator": "Tismi BV",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "22",
    "brand": null,
    "operator": "Landhelgisgæslan (Icelandic Coast Guard)",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "31",
    "brand": "Síminn",
    "operator": "Iceland Telecom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iceland",
    "countryCode": "IS",
    "mcc": "274",
    "mnc": "91",
    "brand": null,
    "operator": "Neyðarlínan",
    "status": "Operational",
    "bands": "Tetra",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "01",
    "brand": "Vodafone",
    "operator": "Vodafone Ireland",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "02",
    "brand": "3",
    "operator": "Hutchison 3G Ireland limited",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": "Former Telefónica O2"
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "03",
    "brand": "Eir",
    "operator": "Eir Group plc",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / 5G 3500",
    "notes": "Former Meteor"
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "04",
    "brand": null,
    "operator": "Access Telecom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "05",
    "brand": "3",
    "operator": "Hutchison 3G Ireland limited",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "07",
    "brand": "Eir",
    "operator": "Eir Group plc",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": "Former eMobile"
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "08",
    "brand": "Eir",
    "operator": "Eir Group plc",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "09",
    "brand": null,
    "operator": "Clever Communications Ltd.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "11",
    "brand": "Tesco Mobile",
    "operator": "Liffey Telecom",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses 3"
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "13",
    "brand": "Lycamobile",
    "operator": "Lycamobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses 3"
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "15",
    "brand": "Virgin Mobile",
    "operator": "UPC",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former upc"
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "16",
    "brand": "Carphone Warehouse",
    "operator": "Carphone Warehouse",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "17",
    "brand": "3",
    "operator": "Hutchison 3G Ireland limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "18",
    "brand": null,
    "operator": "Cubic Telecom Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "21",
    "brand": null,
    "operator": "Net Feasa Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Internet of things"
  },
  {
    "type": "National",
    "countryName": "Ireland",
    "countryCode": "IE",
    "mcc": "272",
    "mnc": "68",
    "brand": null,
    "operator": "Office of the Government Chief Information Officer",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Isle of Man (United Kingdom)",
    "countryCode": "IM",
    "mcc": "234",
    "mnc": "18",
    "brand": "Cloud 9 Mobile",
    "operator": "Cloud 9 Mobile Communications PLC",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100",
    "notes": "Retired"
  },
  {
    "type": "National",
    "countryName": "Isle of Man (United Kingdom)",
    "countryCode": "IM",
    "mcc": "234",
    "mnc": "36",
    "brand": "Sure Mobile",
    "operator": "Sure Isle of Man Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100",
    "notes": "Former Cable & Wireless"
  },
  {
    "type": "National",
    "countryName": "Isle of Man (United Kingdom)",
    "countryCode": "IM",
    "mcc": "234",
    "mnc": "58",
    "brand": "Pronto GSM",
    "operator": "Manx Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Isle of Man (United Kingdom)",
    "countryCode": "IM",
    "mcc": "234",
    "mnc": "73",
    "brand": null,
    "operator": "Bluewave Communications Ltd.",
    "status": "Operational",
    "bands": "TD-LTE 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "01",
    "brand": "TIM",
    "operator": "Telecom Italia S.p.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1500 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "02",
    "brand": "Elsacom",
    "operator": null,
    "status": "Not operational",
    "bands": "Satellite (Globalstar)",
    "notes": "Retired"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "04",
    "brand": "Intermatica",
    "operator": null,
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "05",
    "brand": "Telespazio",
    "operator": null,
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "06",
    "brand": "Vodafone",
    "operator": "Vodafone Italia S.p.A.",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Unknown"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "07",
    "brand": "Kena Mobile",
    "operator": "Noverca",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses TIM Network"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "08",
    "brand": "Fastweb",
    "operator": "Fastweb S.p.A.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses TIM and WindTre Networks"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "10",
    "brand": "Vodafone",
    "operator": "Vodafone Italia S.p.A.",
    "status": "Operational",
    "bands": "GSM 900 / LTE 800  / LTE 1500 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "30",
    "brand": "RFI",
    "operator": "Rete Ferroviaria Italiana",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": "Railways communication"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "33",
    "brand": "Poste Mobile",
    "operator": "Poste Mobile S.p.A.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "uses Wind Tre Network"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "34",
    "brand": "BT Italia",
    "operator": "BT Italia",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "uses TIM Network"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "35",
    "brand": "Lycamobile",
    "operator": "Lycamobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "uses Vodafone Network"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "36",
    "brand": "Digi Mobil",
    "operator": "Digi Italy S.r.l.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "uses TIM Network"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "37",
    "brand": "WINDTRE",
    "operator": "Wind Tre",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former 3 Italia"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "38",
    "brand": "LINKEM",
    "operator": "Linkem S.p.A.",
    "status": "Operational",
    "bands": "TD-LTE 3500 / 5G 3500 / 5G 26000",
    "notes": "spectrum shared with GO Internet"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "39",
    "brand": "SMS Italia",
    "operator": "SMS Italia S.r.l.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "41",
    "brand": "GO internet",
    "operator": "GO internet S.p.A.",
    "status": "Operational",
    "bands": "TD-LTE 3500 / 5G 3500",
    "notes": "spectrum available only in Marche and Emilia-Romagna, roams on Linkem otherwise"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "43",
    "brand": "TIM",
    "operator": "Telecom Italia S.p.A.",
    "status": "Operational",
    "bands": "5G 700 / 5G 3500 / 5G 26000",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "47",
    "brand": "Fastweb",
    "operator": "Fastweb S.p.A.",
    "status": "Operational",
    "bands": "TD-LTE 3500 / 5G 3500 / 5G 26000",
    "notes": "Former Tiscali, acquired by Fastweb in 2018"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "48",
    "brand": "TIM",
    "operator": "Telecom Italia S.p.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "49",
    "brand": "Vianova",
    "operator": "Welcome Italia S.p.A.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "50",
    "brand": "Iliad",
    "operator": "Iliad Italia",
    "status": "Operational",
    "bands": "UMTS 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "53",
    "brand": "COOP Voce",
    "operator": "COOP Voce",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MNC used from Jan, 2020"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "54",
    "brand": "Plintron",
    "operator": null,
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Operates only as MVNE for Rabona, NoiTel and NT Mobile on Vodafone network"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "56",
    "brand": "Spusu",
    "operator": "Mass Response GmbH",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "77",
    "brand": "IPSE 2000",
    "operator": null,
    "status": "Not operational",
    "bands": "UMTS 2100",
    "notes": "Retired"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "88",
    "brand": "WINDTRE",
    "operator": "Wind Tre",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 1800 / 5G 2600 / 5G 3500",
    "notes": "Former Wind"
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "98",
    "brand": "BLU",
    "operator": "BLU S.p.A.",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Italy",
    "countryCode": "IT",
    "mcc": "222",
    "mnc": "99",
    "brand": "WINDTRE",
    "operator": "Wind Tre",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": "Former 3 Italia"
  },
  {
    "type": "National",
    "countryName": "Jersey (United Kingdom)",
    "countryCode": "JE",
    "mcc": "234",
    "mnc": "03",
    "brand": "Airtel-Vodafone",
    "operator": "Jersey Airtel Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Jersey (United Kingdom)",
    "countryCode": "JE",
    "mcc": "234",
    "mnc": "28",
    "brand": null,
    "operator": "Marathon Telecom Limited",
    "status": "Not operational",
    "bands": "UMTS 2100",
    "notes": "holds license but not network built"
  },
  {
    "type": "National",
    "countryName": "Jersey (United Kingdom)",
    "countryCode": "JE",
    "mcc": "234",
    "mnc": "50",
    "brand": "JT",
    "operator": "JT Group Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Jersey (United Kingdom)",
    "countryCode": "JE",
    "mcc": "234",
    "mnc": "55",
    "brand": "Sure Mobile",
    "operator": "Sure (Jersey) Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": "former Cable & Wireless"
  },
  {
    "type": "National",
    "countryName": "Kosovo",
    "countryCode": "XK",
    "mcc": "221",
    "mnc": "01",
    "brand": "Vala",
    "operator": "Telecom of Kosovo J.S.C.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 1800",
    "notes": "Previously the Monaco MCC/MNC 212-01 was used."
  },
  {
    "type": "National",
    "countryName": "Kosovo",
    "countryCode": "XK",
    "mcc": "221",
    "mnc": "02",
    "brand": "IPKO",
    "operator": "IPKO",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 1800",
    "notes": "Previously the Slovenian MCC/MNC 293-41 was used. Used by MVNO D3 Mobile."
  },
  {
    "type": "National",
    "countryName": "Kosovo",
    "countryCode": "XK",
    "mcc": "221",
    "mnc": "06",
    "brand": "Z Mobile",
    "operator": "Dardaphone.Net LLC",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Previously the Monaco MCC/MNC 212-01 was used."
  },
  {
    "type": "National",
    "countryName": "Kosovo",
    "countryCode": "XK",
    "mcc": "221",
    "mnc": "07",
    "brand": "D3 Mobile",
    "operator": "Dukagjini Telecommunications LLC",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Latvia",
    "countryCode": "LV",
    "mcc": "247",
    "mnc": "01",
    "brand": "LMT",
    "operator": "Latvian Mobile Telephone",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Latvia",
    "countryCode": "LV",
    "mcc": "247",
    "mnc": "02",
    "brand": "Tele2",
    "operator": "Tele2",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Latvia",
    "countryCode": "LV",
    "mcc": "247",
    "mnc": "03",
    "brand": "TRIATEL",
    "operator": "Telekom Baltija",
    "status": "Operational",
    "bands": "CDMA 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Latvia",
    "countryCode": "LV",
    "mcc": "247",
    "mnc": "04",
    "brand": null,
    "operator": "Beta Telecom",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former Lattelecom; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Latvia",
    "countryCode": "LV",
    "mcc": "247",
    "mnc": "05",
    "brand": "Bite",
    "operator": "Bite Latvija",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "Bite's postpaid customers are still being assigned SIM cards with 246 02 MNC"
  },
  {
    "type": "National",
    "countryName": "Latvia",
    "countryCode": "LV",
    "mcc": "247",
    "mnc": "06",
    "brand": null,
    "operator": "Rigatta",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Latvia",
    "countryCode": "LV",
    "mcc": "247",
    "mnc": "07",
    "brand": null,
    "operator": "SIA \"MEGATEL\"",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Bite network; former Master Telecom"
  },
  {
    "type": "National",
    "countryName": "Latvia",
    "countryCode": "LV",
    "mcc": "247",
    "mnc": "08",
    "brand": "VMT",
    "operator": "SIA \"VENTAmobile\"",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former IZZI"
  },
  {
    "type": "National",
    "countryName": "Latvia",
    "countryCode": "LV",
    "mcc": "247",
    "mnc": "09",
    "brand": "Xomobile",
    "operator": "Camel Mobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Global Mobile Solutions"
  },
  {
    "type": "National",
    "countryName": "Latvia",
    "countryCode": "LV",
    "mcc": "247",
    "mnc": "10",
    "brand": "LMT",
    "operator": "Latvian Mobile Telephone",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Liechtenstein",
    "countryCode": "LI",
    "mcc": "295",
    "mnc": "01",
    "brand": "Swisscom",
    "operator": "Swisscom Schweiz AG",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Also uses MCC 228 MNC 01 (Switzerland)"
  },
  {
    "type": "National",
    "countryName": "Liechtenstein",
    "countryCode": "LI",
    "mcc": "295",
    "mnc": "02",
    "brand": "7acht",
    "operator": "Salt Liechtenstein AG",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Orange"
  },
  {
    "type": "National",
    "countryName": "Liechtenstein",
    "countryCode": "LI",
    "mcc": "295",
    "mnc": "05",
    "brand": "FL1",
    "operator": "Telecom Liechtenstein AG",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800",
    "notes": "Former Mobilkom"
  },
  {
    "type": "National",
    "countryName": "Liechtenstein",
    "countryCode": "LI",
    "mcc": "295",
    "mnc": "06",
    "brand": "Cubic Telecom",
    "operator": "Cubic Telecom AG",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Liechtenstein",
    "countryCode": "LI",
    "mcc": "295",
    "mnc": "07",
    "brand": null,
    "operator": "First Mobile AG",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Liechtenstein",
    "countryCode": "LI",
    "mcc": "295",
    "mnc": "09",
    "brand": null,
    "operator": "EMnify GmbH",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Liechtenstein",
    "countryCode": "LI",
    "mcc": "295",
    "mnc": "10",
    "brand": null,
    "operator": "Soracom LI Ltd.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Liechtenstein",
    "countryCode": "LI",
    "mcc": "295",
    "mnc": "11",
    "brand": null,
    "operator": "DIMOCO Messaging AG",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Liechtenstein",
    "countryCode": "LI",
    "mcc": "295",
    "mnc": "77",
    "brand": "Alpmobil",
    "operator": "Alpcom AG",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Bankruptcy in February 2012, former Tele2, MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "01",
    "brand": "Telia",
    "operator": "Telia Lietuva",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100",
    "notes": "Former Omnitel; UMTS 2100 shut down end of 2020, UMTS 900 to shut down end of 2022"
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "02",
    "brand": "BITĖ",
    "operator": "UAB Bitė Lietuva",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "03",
    "brand": "Tele2",
    "operator": "UAB Tele2 (Tele2 AB, Sweden)",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "(in Vodafone partnership)"
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "04",
    "brand": null,
    "operator": "LR vidaus reikalų ministerija (Ministry of the Interior)",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "05",
    "brand": "LitRail",
    "operator": "Lietuvos geležinkeliai (Lithuanian Railways)",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "06",
    "brand": "Mediafon",
    "operator": "UAB Mediafon",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "07",
    "brand": null,
    "operator": "Compatel Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "08",
    "brand": "MEZON",
    "operator": "Lietuvos radijo ir televizijos centras",
    "status": "Operational",
    "bands": "WiMAX 3500 / TD-LTE 2300",
    "notes": "acquired by Bitė"
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "09",
    "brand": null,
    "operator": "Interactive Digital Media GmbH",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "11",
    "brand": null,
    "operator": "DATASIM OU",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "12",
    "brand": null,
    "operator": "Nord connect OU",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "13",
    "brand": null,
    "operator": "Travel Communication SIA",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "14",
    "brand": null,
    "operator": "Tismi BV",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lithuania",
    "countryCode": "LT",
    "mcc": "246",
    "mnc": "15",
    "brand": null,
    "operator": "Esim telecom, UAB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "01",
    "brand": "POST",
    "operator": "POST Luxembourg",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 700 / 5G 3500",
    "notes": "Former LuxGSM (P&T Luxembourg)"
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "02",
    "brand": null,
    "operator": "MTX Connect S.a.r.l.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "05",
    "brand": null,
    "operator": "Luxembourg Online S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "07",
    "brand": null,
    "operator": "Bouygues Telecom S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "10",
    "brand": null,
    "operator": "Blue Communications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "71",
    "brand": "CFL",
    "operator": "Société Nationale des Chemins de Fer Luxembourgeois",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "77",
    "brand": "Tango",
    "operator": "Tango SA",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 700 / 5G 3500",
    "notes": "MNC also used in Belgium"
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "78",
    "brand": null,
    "operator": "Interactive digital media GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "79",
    "brand": null,
    "operator": "Mitto AG",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "80",
    "brand": null,
    "operator": "Syniverse Technologies S.à r.l.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "81",
    "brand": null,
    "operator": "E-Lux Mobile Telecommunication S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Luxembourg",
    "countryCode": "LU",
    "mcc": "270",
    "mnc": "99",
    "brand": "Orange",
    "operator": "Orange S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 700 / 5G 3500",
    "notes": "Former VOXmobile; MNC also used in Belgium"
  },
  {
    "type": "National",
    "countryName": "Malta",
    "countryCode": "MT",
    "mcc": "278",
    "mnc": "01",
    "brand": "Epic",
    "operator": "Epic",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800 / 5G",
    "notes": "Former Vodafone; supports MVNOs Redtouch Fone and VFC Mobile"
  },
  {
    "type": "National",
    "countryName": "Malta",
    "countryCode": "MT",
    "mcc": "278",
    "mnc": "11",
    "brand": null,
    "operator": "YOM Ltd.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Malta",
    "countryCode": "MT",
    "mcc": "278",
    "mnc": "21",
    "brand": "GO",
    "operator": "Mobile Communications Limited",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / 5G",
    "notes": "Supports MVNO PING"
  },
  {
    "type": "National",
    "countryName": "Malta",
    "countryCode": "MT",
    "mcc": "278",
    "mnc": "30",
    "brand": "GO",
    "operator": "Mobile Communications Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Malta",
    "countryCode": "MT",
    "mcc": "278",
    "mnc": "77",
    "brand": "Melita",
    "operator": "Melita",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 2100 / 5G",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Moldova",
    "countryCode": "MD",
    "mcc": "255",
    "mnc": "00",
    "brand": "IDC",
    "operator": "Interdnestrcom",
    "status": "Operational",
    "bands": "CDMA 800",
    "notes": "Unofficially using Ukrainian MCC; CDMA 450 shut down Sep 2020"
  },
  {
    "type": "National",
    "countryName": "Moldova",
    "countryCode": "MD",
    "mcc": "259",
    "mnc": "01",
    "brand": "Orange",
    "operator": "Orange Moldova",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Former Voxtel"
  },
  {
    "type": "National",
    "countryName": "Moldova",
    "countryCode": "MD",
    "mcc": "259",
    "mnc": "02",
    "brand": "Moldcell",
    "operator": "Moldcell",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Moldova",
    "countryCode": "MD",
    "mcc": "259",
    "mnc": "03",
    "brand": "Moldtelecom",
    "operator": "Moldtelecom",
    "status": "Operational",
    "bands": "CDMA 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Moldova",
    "countryCode": "MD",
    "mcc": "259",
    "mnc": "04",
    "brand": "Eventis",
    "operator": "Eventis Telecom",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Bankruptcy - License suspended"
  },
  {
    "type": "National",
    "countryName": "Moldova",
    "countryCode": "MD",
    "mcc": "259",
    "mnc": "05",
    "brand": "Moldtelecom",
    "operator": "Moldtelecom",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": "Former Unité"
  },
  {
    "type": "National",
    "countryName": "Moldova",
    "countryCode": "MD",
    "mcc": "259",
    "mnc": "15",
    "brand": "IDC",
    "operator": "Interdnestrcom",
    "status": "Operational",
    "bands": "LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Moldova",
    "countryCode": "MD",
    "mcc": "259",
    "mnc": "99",
    "brand": "Moldtelecom",
    "operator": "Moldtelecom",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": "Former Unité; used for Femtocell service only"
  },
  {
    "type": "National",
    "countryName": "Monaco",
    "countryCode": "MC",
    "mcc": "212",
    "mnc": "10",
    "brand": "Office des Telephones",
    "operator": "Monaco Telecom",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "Used for the Vala network in Kosovo. The GSM Association lists the PTK (P&T Kosovo) website for this network."
  },
  {
    "type": "National",
    "countryName": "Montenegro",
    "countryCode": "ME",
    "mcc": "297",
    "mnc": "01",
    "brand": "Telenor",
    "operator": "Telenor Montenegro",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former ProMonte GSM"
  },
  {
    "type": "National",
    "countryName": "Montenegro",
    "countryCode": "ME",
    "mcc": "297",
    "mnc": "02",
    "brand": "telekom.me",
    "operator": "Crnogorski Telekom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 2100",
    "notes": "Former MoNet"
  },
  {
    "type": "National",
    "countryName": "Montenegro",
    "countryCode": "ME",
    "mcc": "297",
    "mnc": "03",
    "brand": "m:tel",
    "operator": "Mtel Montenegro",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "00",
    "brand": null,
    "operator": "Intovoice B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "01",
    "brand": null,
    "operator": "RadioAccess Network Services",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "02",
    "brand": "Tele2",
    "operator": "T-Mobile Netherlands B.V",
    "status": "Operational",
    "bands": "LTE 800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "03",
    "brand": "Voiceworks",
    "operator": "Voiceworks B.V.",
    "status": "Operational",
    "bands": "MVNE / GSM 1800",
    "notes": "private networks"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "04",
    "brand": "Vodafone",
    "operator": "Vodafone Libertel B.V.",
    "status": "Operational",
    "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 1800",
    "notes": "UMTS shut down February 2020"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "05",
    "brand": null,
    "operator": "Elephant Talk Communications Premium Rate Services",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "acquired by T-Mobile Netherlands B.V"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "06",
    "brand": "Vectone Mobile",
    "operator": "Mundio Mobile (Netherlands) Ltd",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "07",
    "brand": "Teleena",
    "operator": "Tata Communications MOVE B.V.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "08",
    "brand": "KPN",
    "operator": "KPN Mobile The Netherlands B.V.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 700",
    "notes": "UMTS to shut down Jan 2022"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "09",
    "brand": "Lycamobile",
    "operator": "Lycamobile Netherlands Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "10",
    "brand": "KPN",
    "operator": "KPN B.V.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "11",
    "brand": null,
    "operator": "Greenet Netwerk B.V",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Former VoipIT B.V., MNC withdrawn; private networks"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "12",
    "brand": "Telfort",
    "operator": "KPN Mobile The Netherlands B.V.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Subbrand of KPN"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "13",
    "brand": null,
    "operator": "Unica Installatietechniek B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "14",
    "brand": null,
    "operator": "Venus & Mercury Telecom",
    "status": "Unknown",
    "bands": "5G",
    "notes": "Former 6GMOBILE B.V."
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "15",
    "brand": "Ziggo",
    "operator": "Ziggo B.V.",
    "status": "Operational",
    "bands": "LTE 2600",
    "notes": "business users only"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "16",
    "brand": "T-Mobile (BEN)",
    "operator": "T-Mobile Netherlands B.V",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "17",
    "brand": "Intercity Zakelijk",
    "operator": "Intercity Mobile Communications B.V.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "18",
    "brand": "Ziggo",
    "operator": "Ziggo B.V.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former UPC Netherlands"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "19",
    "brand": null,
    "operator": "Mixe Communication Solutions B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "20",
    "brand": "T-Mobile",
    "operator": "T-Mobile Netherlands B.V",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 700",
    "notes": "Former Orange Netherlands MCC/MNC"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "21",
    "brand": null,
    "operator": "ProRail B.V.",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "22",
    "brand": null,
    "operator": "Ministerie van Defensie",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "23",
    "brand": null,
    "operator": "KORE Wireless Nederland B.V.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former ASPIDER Solutions, Wyless"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "24",
    "brand": null,
    "operator": "Private Mobility Nederland B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "25",
    "brand": null,
    "operator": "CapX B.V.",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Private networks"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "26",
    "brand": null,
    "operator": "SpeakUp B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "27",
    "brand": "L-mobi",
    "operator": "L-Mobi Mobile B.V.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Breezz Nederland B.V."
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "28",
    "brand": null,
    "operator": "Lancelot B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "29",
    "brand": null,
    "operator": "Tismi B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Private Mobile Ltd"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "30",
    "brand": null,
    "operator": "ASpider Solutions Nederland B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "32",
    "brand": null,
    "operator": "Cubic Telecom Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "33",
    "brand": null,
    "operator": "Truphone B.V.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "60",
    "brand": null,
    "operator": "Nextgen Mobile Ltd",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "61",
    "brand": null,
    "operator": "Alcadis B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former BodyTrace Netherlands B.V."
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "62",
    "brand": "Voxbone",
    "operator": "Voxbone mobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "63",
    "brand": null,
    "operator": "Messagebird BV",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "64",
    "brand": null,
    "operator": "Zetacom B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "65",
    "brand": null,
    "operator": "AGMS Netherlands B.V.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "66",
    "brand": null,
    "operator": "Utility Connect B.V.",
    "status": "Operational",
    "bands": "CDMA 450",
    "notes": "Subsidiary of Alliander; network operated by KPN"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "67",
    "brand": null,
    "operator": "Koning en Hartman B.V.",
    "status": "Operational",
    "bands": "PrivateGSM 1800",
    "notes": "Former RadioAccess B.V."
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "68",
    "brand": null,
    "operator": "Roamware (Netherlands) B.V.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "69",
    "brand": null,
    "operator": "KPN Mobile The Netherlands B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Netherlands (Kingdom of the Netherlands)",
    "countryCode": "NL",
    "mcc": "204",
    "mnc": "91",
    "brand": null,
    "operator": "Enexis Netbeheer B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "North Macedonia",
    "countryCode": "MK",
    "mcc": "294",
    "mnc": "01",
    "brand": "Telekom.mk",
    "operator": "Makedonski Telekom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": "Former Mobimak"
  },
  {
    "type": "National",
    "countryName": "North Macedonia",
    "countryCode": "MK",
    "mcc": "294",
    "mnc": "02",
    "brand": "vip",
    "operator": "[one.vip]] DOOEL",
    "status": "Not operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": "Former Cosmofon, One (Telekom Slovenija Group)"
  },
  {
    "type": "National",
    "countryName": "North Macedonia",
    "countryCode": "MK",
    "mcc": "294",
    "mnc": "03",
    "brand": "A1 MK",
    "operator": "A1 Macedonia DOOEL",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100",
    "notes": "Former vipoperator; merged with One in 2015 and renamed to one.vip; renamed to A1  MK in 2019"
  },
  {
    "type": "National",
    "countryName": "North Macedonia",
    "countryCode": "MK",
    "mcc": "294",
    "mnc": "04",
    "brand": "Lycamobile",
    "operator": "Lycamobile LLC",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses A1 network"
  },
  {
    "type": "National",
    "countryName": "North Macedonia",
    "countryCode": "MK",
    "mcc": "294",
    "mnc": "10",
    "brand": null,
    "operator": "WTI Macedonia",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "North Macedonia",
    "countryCode": "MK",
    "mcc": "294",
    "mnc": "11",
    "brand": null,
    "operator": "MOBIK TELEKOMUNIKACII DOOEL Skopje",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "01",
    "brand": "Telenor",
    "operator": "Telenor Norge AS",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "UMTS shut down 2021, GSM to shut down 2025"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "02",
    "brand": "Telia",
    "operator": "Telia Norge AS",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2600 / 5G 700",
    "notes": "Former NetCom; UMTS shut down Dec 2021"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "03",
    "brand": null,
    "operator": "Televerket AS",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "04",
    "brand": "Tele2",
    "operator": "Tele2 (Mobile Norway AS)",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "05",
    "brand": "Telia",
    "operator": "Telia Norge AS",
    "status": "Not operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100",
    "notes": "Former Tele2"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "06",
    "brand": "ice",
    "operator": "ICE Norge AS",
    "status": "Operational",
    "bands": "LTE 450",
    "notes": "Former Nordisk Mobiltelefon; data services only"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "07",
    "brand": "Phonero",
    "operator": "Phonero AS",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "Former Ventelo; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "08",
    "brand": "Telia",
    "operator": "Telia Norge AS",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former TDC"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "09",
    "brand": "Com4",
    "operator": "Com4 AS",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Principally M2M services"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "10",
    "brand": null,
    "operator": "Norwegian Communications Authority",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "11",
    "brand": "SystemNet",
    "operator": "SystemNet AS",
    "status": "Not operational",
    "bands": "Test",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "12",
    "brand": "Telenor",
    "operator": "Telenor Norge AS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "14",
    "brand": "ice",
    "operator": "ICE Communication Norge AS",
    "status": "Operational",
    "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2100 / 5G 2100",
    "notes": "UMTS shut down Jan 2021"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "15",
    "brand": null,
    "operator": "eRate Norway AS",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "16",
    "brand": null,
    "operator": "Iristel Norway AS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "20",
    "brand": null,
    "operator": "Jernbaneverket AS",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "21",
    "brand": null,
    "operator": "Jernbaneverket AS",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "22",
    "brand": null,
    "operator": "Altibox AS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Network Norway AS;"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "23",
    "brand": "Lycamobile",
    "operator": "Lyca Mobile Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "24",
    "brand": null,
    "operator": "Mobile Norway AS",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "25",
    "brand": null,
    "operator": "Forsvarets kompetansesenter KKIS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "90",
    "brand": null,
    "operator": "Nokia Solutions and Networks Norge AS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Norway",
    "countryCode": "NO",
    "mcc": "242",
    "mnc": "99",
    "brand": null,
    "operator": "TampNet AS",
    "status": "Operational",
    "bands": "LTE 800 / LTE 1800",
    "notes": "Offshore"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "01",
    "brand": "Plus",
    "operator": "Polkomtel Sp. z o.o.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-5G 2500",
    "notes": "LTE roaming with Aero 2"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "02",
    "brand": "T-Mobile",
    "operator": "T-Mobile Polska S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / 5G 2100",
    "notes": "former Era; see MNC 260-34 for shared LTE network"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "03",
    "brand": "Orange",
    "operator": "Orange Polska S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / 5G 2100",
    "notes": "former Idea; see MNC 260-34 for shared LTE network; CDMA 450 shut down April 2017"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "04",
    "brand": "Plus",
    "operator": "Polkomtel Sp. z o.o.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "former CenterNet, Aero2"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "05",
    "brand": "Orange",
    "operator": "Orange Polska S.A.",
    "status": "Not operational",
    "bands": "UMTS 2100",
    "notes": "not in use, using MNC 03"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "06",
    "brand": "Play",
    "operator": "P4 Sp. z o.o.",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100",
    "notes": "Also roaming on Polkomtel and Orange 2G/3G network"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "07",
    "brand": "Netia",
    "operator": "Netia S.A.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO on Play (P4)"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "08",
    "brand": null,
    "operator": "E-Telko Sp. z o.o.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "09",
    "brand": "Lycamobile",
    "operator": "Lycamobile Sp. z o.o.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "On Polkomtel 2G/3G network"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "10",
    "brand": "T-Mobile",
    "operator": "T-Mobile Polska S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "former Telefony Opalenickie S.A., Sferia; CDMA 800 shut down in 2014; LTE 800 leased to Aero 2;"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "11",
    "brand": "Plus",
    "operator": "Polkomtel Sp. z o.o.",
    "status": "Operational",
    "bands": "CDMA 420",
    "notes": "Former Nordisk Polska"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "12",
    "brand": "Cyfrowy Polsat",
    "operator": "Cyfrowy Polsat S.A.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO on Polkomtel"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "13",
    "brand": null,
    "operator": "Move Telecom S.A.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Sferia"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "14",
    "brand": null,
    "operator": "Telco Leaders Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Sferia"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "15",
    "brand": "Plus",
    "operator": "Polkomtel Sp. z o.o.",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": "former CenterNet, Aero2 ; GSM 1800 shut down in 2010"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "16",
    "brand": "Plus",
    "operator": "Polkomtel Sp. z o.o.",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": "former Mobyland, Aero2 ; GSM 1800 shut down in 2010"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "17",
    "brand": "Plus",
    "operator": "Polkomtel Sp. z o.o.",
    "status": "Operational",
    "bands": "UMTS 900 / TD-LTE 2600",
    "notes": "Former Aero2"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "18",
    "brand": "AMD Telecom",
    "operator": "AMD Telecom S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "19",
    "brand": null,
    "operator": "SIA NetBalt",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": "Former Teleena Holding BV"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "20",
    "brand": null,
    "operator": "TISMI B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Mobile.Net, Wysyłaj SMS Polska"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "21",
    "brand": null,
    "operator": "private networks",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Exteri until May 2014; now used for several private networks with 4-digit MNC 21xx"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "22",
    "brand": null,
    "operator": "Twilio Ireland Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Arcomm until Nov 2018"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "23",
    "brand": null,
    "operator": "PGE Systemy S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Amicomm"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "24",
    "brand": null,
    "operator": "IT Partners Telco Sp. z o.o.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "former WideNet"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "25",
    "brand": "TeleCube.PL",
    "operator": "Claude ICT Poland Sp. z o.o.",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Former Best Solutions & Technology Experience, Polskie Sieci Radiowe"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "26",
    "brand": null,
    "operator": "Vonage B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Advanced Technology & Experience (ATE) until 2016"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "27",
    "brand": null,
    "operator": "SIA Ntel Solutions",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Intertelcom"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "28",
    "brand": null,
    "operator": "CrossMobile Sp. z o.o.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former PhoneNet until 2016"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "29",
    "brand": "Interfonica",
    "operator": "Interfonica Sp. z o.o.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn July 2016"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "30",
    "brand": "GrandTel",
    "operator": "GrandTel Sp. z o.o.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn July 2016"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "31",
    "brand": "Phone IT",
    "operator": "Phone IT Sp. z o.o.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "32",
    "brand": null,
    "operator": "Compatel Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "33",
    "brand": "Truphone",
    "operator": "Truphone Poland Sp. z o.o.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "34",
    "brand": "NetWorkS!",
    "operator": "T-Mobile Polska S.A.",
    "status": "Operational",
    "bands": "LTE 800 / LTE 2600",
    "notes": "Shared network T-Mobile / Orange"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "35",
    "brand": null,
    "operator": "PKP Polskie Linie Kolejowe S.A.",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "36",
    "brand": "Vectone Mobile",
    "operator": "Mundio Mobile",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn May 2014"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "37",
    "brand": null,
    "operator": "NEXTGEN MOBILE LTD",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn Nov 2018"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "38",
    "brand": null,
    "operator": "CALLFREEDOM Sp. z o.o.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdawn Apr 2019"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "39",
    "brand": "Voxbone",
    "operator": "VOXBONE SA",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "40",
    "brand": null,
    "operator": "Interactive Digital Media GmbH",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "41",
    "brand": null,
    "operator": "EZ PHONE MOBILE Sp. z o.o.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "42",
    "brand": null,
    "operator": "MobiWeb Telecom Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "43",
    "brand": null,
    "operator": "Smart Idea International Sp. z o.o.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "44",
    "brand": null,
    "operator": "Rebtel Poland Sp. z o.o.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn Apr 2019"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "45",
    "brand": null,
    "operator": "Virgin Mobile Polska Sp. z o.o.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "46",
    "brand": null,
    "operator": "Terra Telekom Sp. z o.o.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "47",
    "brand": null,
    "operator": "SMShighway Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "48",
    "brand": null,
    "operator": "AGILE TELECOM S.P.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "49",
    "brand": null,
    "operator": "Messagebird B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "90",
    "brand": null,
    "operator": "Polska Spółka Gazownictwa Sp. z o.o.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "97",
    "brand": null,
    "operator": "Politechnika Łódzka Uczelniane Centrum Informatyczne",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Poland",
    "countryCode": "PL",
    "mcc": "260",
    "mnc": "98",
    "brand": "Play",
    "operator": "P4 Sp. z o.o.",
    "status": "Not operational",
    "bands": "LTE 1800",
    "notes": "Test network"
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "01",
    "brand": "Vodafone",
    "operator": "Vodafone Portugal",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "formerly Telecel (2001)"
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "02",
    "brand": "MEO",
    "operator": "Telecomunicações Móveis Nacionais",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "03",
    "brand": "NOS",
    "operator": "NOS Comunicações",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "formerly Optimus (2014)"
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "04",
    "brand": "LycaMobile",
    "operator": "LycaMobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "05",
    "brand": null,
    "operator": "Oniway - Inforcomunicaçôes, S.A.",
    "status": "Not operational",
    "bands": "UMTS 2100",
    "notes": "License withdrawn in 2003; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "06",
    "brand": "MEO",
    "operator": "MEO - Serviços de Comunicações e Multimédia, S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": "formerly TMN (2014)"
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "07",
    "brand": "Vectone Mobile",
    "operator": "Mundio Mobile (Portugal) Limited",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "08",
    "brand": "MEO",
    "operator": "MEO - Serviços de Comunicações e Multimédia, S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "11",
    "brand": null,
    "operator": "Compatel, Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "12",
    "brand": null,
    "operator": "Infraestruturas de Portugal, S.A.",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": "former Refer Telecom, IP Telecom - Serviços de Telecomunicações, S.A."
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "13",
    "brand": null,
    "operator": "G9Telecom, S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "21",
    "brand": "Zapp",
    "operator": "Zapp Portugal",
    "status": "Not operational",
    "bands": "CDMA2000 450",
    "notes": "Closed down in September 2011; MNC withdawn"
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "80",
    "brand": "MEO",
    "operator": "MEO - Serviços de Comunicações e Multimédia, S.A.",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "91",
    "brand": "Vodafone",
    "operator": "Vodafone Portugal",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Portugal",
    "countryCode": "PT",
    "mcc": "268",
    "mnc": "93",
    "brand": "NOS",
    "operator": "NOS Comunicações",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Romania",
    "countryCode": "RO",
    "mcc": "226",
    "mnc": "01",
    "brand": "Vodafone",
    "operator": "Vodafone România",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / TD-LTE 2600 / 5G 3500",
    "notes": "Formerly branded as Connex"
  },
  {
    "type": "National",
    "countryName": "Romania",
    "countryCode": "RO",
    "mcc": "226",
    "mnc": "02",
    "brand": "Clicknet Mobile",
    "operator": "Telekom Romania",
    "status": "Not operational",
    "bands": "CDMA 420",
    "notes": "Licence expired on 1 January 2015, and network was shut down"
  },
  {
    "type": "National",
    "countryName": "Romania",
    "countryCode": "RO",
    "mcc": "226",
    "mnc": "03",
    "brand": "Telekom",
    "operator": "Telekom Romania",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Formerly branded as Cosmote"
  },
  {
    "type": "National",
    "countryName": "Romania",
    "countryCode": "RO",
    "mcc": "226",
    "mnc": "04",
    "brand": "Cosmote/Zapp",
    "operator": "Telekom Romania",
    "status": "Not operational",
    "bands": "CDMA 450",
    "notes": "Licence expired on 24 March 2013, and network was shut down"
  },
  {
    "type": "National",
    "countryName": "Romania",
    "countryCode": "RO",
    "mcc": "226",
    "mnc": "05",
    "brand": "Digi.Mobil",
    "operator": "RCS&RDS",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 900 / LTE 2100 / TD-LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Romania",
    "countryCode": "RO",
    "mcc": "226",
    "mnc": "06",
    "brand": "Telekom/Zapp",
    "operator": "Telekom Romania",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100",
    "notes": "Branded as Telekom for data/voice and Zapp for data only"
  },
  {
    "type": "National",
    "countryName": "Romania",
    "countryCode": "RO",
    "mcc": "226",
    "mnc": "10",
    "brand": "Orange",
    "operator": "Orange România",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "Formerly branded as Dialog"
  },
  {
    "type": "National",
    "countryName": "Romania",
    "countryCode": "RO",
    "mcc": "226",
    "mnc": "11",
    "brand": null,
    "operator": "Enigma-System",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Romania",
    "countryCode": "RO",
    "mcc": "226",
    "mnc": "15",
    "brand": "Idilis",
    "operator": "Idilis",
    "status": "Operational",
    "bands": "WiMAX / TD-LTE 2600",
    "notes": "LTE license is sold to RCS&RDS, but both MNC(226 05 and 226 15) are broadcast by RCS&RDS for business continuity"
  },
  {
    "type": "National",
    "countryName": "Romania",
    "countryCode": "RO",
    "mcc": "226",
    "mnc": "16",
    "brand": "Lycamobile",
    "operator": "Lycamobile Romania",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Telekom Networks"
  },
  {
    "type": "National",
    "countryName": "Romania",
    "countryCode": "RO",
    "mcc": "226",
    "mnc": "19",
    "brand": "CFR",
    "operator": "Căile Ferate Române",
    "status": "Testing",
    "bands": "GSM-R 900",
    "notes": "Dedicated network for safety communication, not for public users. Dedicated band."
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "01",
    "brand": "MTS",
    "operator": "Mobile TeleSystems",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 4700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "02",
    "brand": "MegaFon",
    "operator": "MegaFon PJSC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Former North-West GSM"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "03",
    "brand": "NCC",
    "operator": "Nizhegorodskaya Cellular Communications",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Purchased by Tele2"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "04",
    "brand": "Sibchallenge",
    "operator": "Sibchallenge",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "05",
    "brand": "ETK",
    "operator": "Yeniseytelecom",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / CDMA 450",
    "notes": "Purchased by Tele2"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "06",
    "brand": "Skylink",
    "operator": "CJSC Saratov System of Cellular Communications",
    "status": "Operational",
    "bands": "CDMA 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "07",
    "brand": "SMARTS",
    "operator": "Zao SMARTS",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "08",
    "brand": "Vainah Telecom",
    "operator": "CS \"VainahTelecom\"",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "09",
    "brand": "Skylink",
    "operator": "Khabarovsky Cellular Phone",
    "status": "Operational",
    "bands": "CDMA 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "10",
    "brand": "DTC",
    "operator": "Dontelekom",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "11",
    "brand": "Yota",
    "operator": "Scartel",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "12",
    "brand": "Baykalwestcom",
    "operator": "Baykal Westcom / New Telephone Company / Far Eastern Cellular",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / CDMA 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "12",
    "brand": "Akos",
    "operator": null,
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "13",
    "brand": "KUGSM",
    "operator": "Kuban GSM",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "14",
    "brand": "MegaFon",
    "operator": "MegaFon OJSC",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / TD-LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "15",
    "brand": "SMARTS",
    "operator": "SMARTS Ufa, SMARTS Uljanovsk",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "16",
    "brand": "Miatel",
    "operator": "Miatel",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "17",
    "brand": "Utel",
    "operator": "JSC Uralsvyazinform",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Former Ermak RMS"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "18",
    "brand": "Osnova Telecom",
    "operator": null,
    "status": "Not operational",
    "bands": "TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "19",
    "brand": "INDIGO",
    "operator": "INDIGO",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Since 19 December 2009 merged with Tele2"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "20",
    "brand": "Tele2",
    "operator": "Tele2",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 450 / LTE 800 / LTE 1800 / TD-LTE 2300 / TD-LTE 2500 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "21",
    "brand": "GlobalTel",
    "operator": "JSC \"GlobalTel\"",
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "22",
    "brand": null,
    "operator": "Vainakh Telecom",
    "status": "Operational",
    "bands": "TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "23",
    "brand": "Thuraya",
    "operator": "GTNT",
    "status": "Operational",
    "bands": "Satellite MVNO",
    "notes": "Former Mobicom Novosibirsk"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "26",
    "brand": "VTB Mobile",
    "operator": "VTB Mobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "27",
    "brand": "Letai",
    "operator": "Tattelecom",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "28",
    "brand": "Beeline",
    "operator": "Beeline",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Former EXTEL"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "29",
    "brand": "Iridium",
    "operator": "Iridium Communications",
    "status": "Operational",
    "bands": "Satellite MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "32",
    "brand": "Win Mobile",
    "operator": "K-Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600",
    "notes": "Unapproved use in Crimea only"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "33",
    "brand": "Sevmobile",
    "operator": "Sevtelekom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Unapproved use in Crimea only"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "34",
    "brand": "Krymtelekom",
    "operator": "Krymtelekom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Unapproved use in Crimea only"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "35",
    "brand": "MOTIV",
    "operator": "EKATERINBURG-2000",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 1800 / TD-LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "38",
    "brand": "Tambov GSM",
    "operator": "Central Telecommunication Company",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "39",
    "brand": "Rostelecom",
    "operator": "ROSTELECOM",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / TD-LTE 2300 / LTE 2600",
    "notes": "Tele2 code 250 20 is used since acquiring"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "40",
    "brand": "VTC Mobile",
    "operator": "Voentelecom",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "44",
    "brand": null,
    "operator": "Stavtelesot / North Caucasian GSM",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "45",
    "brand": "Gazprombank Mobile",
    "operator": "PJSC New Mobile Communications",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "50",
    "brand": "SberMobile",
    "operator": "Sberbank-Telecom",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "54",
    "brand": "TTK",
    "operator": "Tattelecom",
    "status": "Not operational",
    "bands": "LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "60",
    "brand": "Volna mobile",
    "operator": "KTK Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600",
    "notes": "Unapproved use in Crimea only"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "61",
    "brand": "Intertelecom",
    "operator": "Intertelecom",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "Unapproved use in Crimea only"
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "62",
    "brand": "Tinkoff Mobile",
    "operator": "Tinkoff Mobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "91",
    "brand": "Sonic Duo",
    "operator": "Sonic Duo CJSC",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "92",
    "brand": null,
    "operator": "Primtelefon",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "93",
    "brand": null,
    "operator": "Telecom XXI",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "99",
    "brand": "Beeline",
    "operator": "OJSC Vimpel-Communications",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Russian Federation",
    "countryCode": "RU",
    "mcc": "250",
    "mnc": "811",
    "brand": null,
    "operator": "Votek Mobile",
    "status": "Not operational",
    "bands": "AMPS / DAMPS / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "San Marino",
    "countryCode": "SM",
    "mcc": "292",
    "mnc": "01",
    "brand": "PRIMA",
    "operator": "San Marino Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Serbia",
    "countryCode": "RS",
    "mcc": "220",
    "mnc": "01",
    "brand": "Telenor",
    "operator": "Telenor Serbia",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": "Former MOBTEL 063"
  },
  {
    "type": "National",
    "countryName": "Serbia",
    "countryCode": "RS",
    "mcc": "220",
    "mnc": "02",
    "brand": "Telenor",
    "operator": "Telenor Montenegro",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former ProMonte GSM; moved to MCC 297 MNC 01 (Montenegro) on 11 November 2011"
  },
  {
    "type": "National",
    "countryName": "Serbia",
    "countryCode": "RS",
    "mcc": "220",
    "mnc": "03",
    "brand": "mt:s",
    "operator": "Telekom Srbija",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / TETRA",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Serbia",
    "countryCode": "RS",
    "mcc": "220",
    "mnc": "04",
    "brand": "telekom.me",
    "operator": "T-Mobile Montenegro LLC",
    "status": "Not operational",
    "bands": "GSM",
    "notes": "Former MoNet; moved to MCC 297 MNC 02 (Montenegro)"
  },
  {
    "type": "National",
    "countryName": "Serbia",
    "countryCode": "RS",
    "mcc": "220",
    "mnc": "05",
    "brand": "A1 SRB",
    "operator": "A1 Srbija d.o.o.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": "Former vip mobile"
  },
  {
    "type": "National",
    "countryName": "Serbia",
    "countryCode": "RS",
    "mcc": "220",
    "mnc": "07",
    "brand": "Orion",
    "operator": "Orion Telekom",
    "status": "Operational",
    "bands": "CDMA 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Serbia",
    "countryCode": "RS",
    "mcc": "220",
    "mnc": "09",
    "brand": "Vectone Mobile",
    "operator": "MUNDIO MOBILE d.o.o.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Serbia",
    "countryCode": "RS",
    "mcc": "220",
    "mnc": "11",
    "brand": "Globaltel",
    "operator": "GLOBALTEL d.o.o.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses A1"
  },
  {
    "type": "National",
    "countryName": "Serbia",
    "countryCode": "RS",
    "mcc": "220",
    "mnc": "20",
    "brand": "Vip",
    "operator": "Vip Mobile",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Serbia",
    "countryCode": "RS",
    "mcc": "220",
    "mnc": "21",
    "brand": null,
    "operator": "Infrastruktura železnice Srbije a.d.",
    "status": "Unknown",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovakia",
    "countryCode": "SK",
    "mcc": "231",
    "mnc": "01",
    "brand": "Orange",
    "operator": "Orange Slovensko",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600 / 5G 3500",
    "notes": "Former Globtel"
  },
  {
    "type": "National",
    "countryName": "Slovakia",
    "countryCode": "SK",
    "mcc": "231",
    "mnc": "02",
    "brand": "Telekom",
    "operator": "Slovak Telekom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 3700 / 5G 2100",
    "notes": "Former Eurotel / T-Mobile"
  },
  {
    "type": "National",
    "countryName": "Slovakia",
    "countryCode": "SK",
    "mcc": "231",
    "mnc": "03",
    "brand": "4ka",
    "operator": "SWAN Mobile, a.s.",
    "status": "Operational",
    "bands": "LTE 1800 / TD-LTE 3500 / TD-LTE 3700 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovakia",
    "countryCode": "SK",
    "mcc": "231",
    "mnc": "04",
    "brand": "Telekom",
    "operator": "Slovak Telekom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former T-Mobile"
  },
  {
    "type": "National",
    "countryName": "Slovakia",
    "countryCode": "SK",
    "mcc": "231",
    "mnc": "05",
    "brand": "Orange",
    "operator": "Orange Slovensko",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovakia",
    "countryCode": "SK",
    "mcc": "231",
    "mnc": "06",
    "brand": "O2",
    "operator": "O2 Slovakia",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / TD-LTE 3500 / TD-LTE 3700 / 5G 3500",
    "notes": "Former Telefónica O2 Slovakia"
  },
  {
    "type": "National",
    "countryName": "Slovakia",
    "countryCode": "SK",
    "mcc": "231",
    "mnc": "07",
    "brand": "Orange",
    "operator": "Orange Slovensko",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Towercom"
  },
  {
    "type": "National",
    "countryName": "Slovakia",
    "countryCode": "SK",
    "mcc": "231",
    "mnc": "08",
    "brand": "Unimobile",
    "operator": "Uniphone, s.r.o.",
    "status": "Testing",
    "bands": "MVNO",
    "notes": "Former IPfon, s.r.o."
  },
  {
    "type": "National",
    "countryName": "Slovakia",
    "countryCode": "SK",
    "mcc": "231",
    "mnc": "09",
    "brand": null,
    "operator": "DSI DATA, a.s.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovakia",
    "countryCode": "SK",
    "mcc": "231",
    "mnc": "10",
    "brand": null,
    "operator": "HMZ RÁDIOKOMUNIKÁCIE, spol. s r.o.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovakia",
    "countryCode": "SK",
    "mcc": "231",
    "mnc": "99",
    "brand": "ŽSR",
    "operator": "Železnice Slovenskej Republiky",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": "Railway communication and signalling"
  },
  {
    "type": "National",
    "countryName": "Slovenia",
    "countryCode": "SI",
    "mcc": "293",
    "mnc": "10",
    "brand": null,
    "operator": "SŽ - Infrastruktura, d.o.o.",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovenia",
    "countryCode": "SI",
    "mcc": "293",
    "mnc": "11",
    "brand": null,
    "operator": "BeeIN d.o.o.",
    "status": "Unknown",
    "bands": "5G 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovenia",
    "countryCode": "SI",
    "mcc": "293",
    "mnc": "20",
    "brand": null,
    "operator": "COMPATEL Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovenia",
    "countryCode": "SI",
    "mcc": "293",
    "mnc": "21",
    "brand": null,
    "operator": "NOVATEL d.o.o.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovenia",
    "countryCode": "SI",
    "mcc": "293",
    "mnc": "40",
    "brand": "A1 SI",
    "operator": "A1 Slovenija",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "Former Si.mobil"
  },
  {
    "type": "National",
    "countryName": "Slovenia",
    "countryCode": "SI",
    "mcc": "293",
    "mnc": "41",
    "brand": "Mobitel",
    "operator": "Telekom Slovenije",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600 / 5G 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovenia",
    "countryCode": "SI",
    "mcc": "293",
    "mnc": "64",
    "brand": "T-2",
    "operator": "T-2 d.o.o.",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 2100 / 5G 3600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovenia",
    "countryCode": "SI",
    "mcc": "293",
    "mnc": "70",
    "brand": "Telemach",
    "operator": "Tušmobil d.o.o.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / 5G 700 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Slovenia",
    "countryCode": "SI",
    "mcc": "293",
    "mnc": "86",
    "brand": null,
    "operator": "ELEKTRO GORENJSKA, d.d",
    "status": "Unknown",
    "bands": "LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "01",
    "brand": "Vodafone",
    "operator": "Vodafone Spain",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 700 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "02",
    "brand": "Altecom/Fibracat",
    "operator": "Alta Tecnologia en Comunicacions SL",
    "status": "Operational",
    "bands": "TD-LTE 2600",
    "notes": "Some MVNO use this MNC (Fibracat, Aircom, Anxanet, Netports)"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "03",
    "brand": "Orange",
    "operator": "Orange Espagne S.A.U",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500",
    "notes": "Also use MNC 33; Some MVNO use this MNC (Euskaltel, móbilR, Hualong, The Phone House Spain, CABLE movil, SUOP)"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "04",
    "brand": "Yoigo",
    "operator": "Xfera Moviles SA",
    "status": "Operational",
    "bands": "LTE 1800 / LTE 2100 / 5G 3500",
    "notes": "Acquired by Grupo MÁSMÓVIL; used by MÁSMÓVIL, Yoigo, Pepephone and LlamaYa; roams on Orange always for 2G/3G and 4G where there is no Yoigo coverage"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "05",
    "brand": "Movistar",
    "operator": "Telefónica Móviles España",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Used by resellers (e.g. Tuenti - Movistar's own low cost virtual operator, TeleCable)"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "06",
    "brand": "Vodafone",
    "operator": "Vodafone Spain",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Used by resellers (e.g. Lowi - Vodafone's own low cost virtual operator, Lebara, Hits)"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "07",
    "brand": "Movistar",
    "operator": "Telefónica Móviles España",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 1800 / 5G 2100 / 5G 3500",
    "notes": "Used by Movistar and O₂ Spain - Movistar's own low cost virtual operator; UMTS to shut down 2025"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "08",
    "brand": "Euskaltel",
    "operator": null,
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Acquired by Grupo MÁSMÓVIL; Some MVNO use this MNC (RACC)"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "09",
    "brand": "Orange",
    "operator": "Orange Espagne S.A.U",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Used by resellers"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "10",
    "brand": null,
    "operator": "ZINNIA TELECOMUNICACIONES, S.L.U.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Operadora de Telecomunicaciones Opera SL"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "11",
    "brand": null,
    "operator": "TELECOM CASTILLA-LA MANCHA, S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Orange (Orange Espagne S.A.U)"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "12",
    "brand": null,
    "operator": "VENUS MOVIL, S.L. UNIPERSONAL",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Contacta Servicios Avanzados de Telecomunicaciones SL; SAC CONVERGENT AGGREGATION SERVICES"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "13",
    "brand": null,
    "operator": "SYMA MOBILE ESPAÑA, S.L.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": "Former Incotel Ingeniera y Consultaria SL"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "14",
    "brand": null,
    "operator": "AVATEL MÓVIL, S.L.U.",
    "status": "Operational",
    "bands": "WiMAX",
    "notes": "Former Incotel Servicioz Avanzados SL"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "15",
    "brand": "BT",
    "operator": "BT Group España Compañia de Servicios Globales de Telecomunicaciones S.A.U.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "16",
    "brand": "TeleCable",
    "operator": "R Cable y Telecomunicaciones Galicia S.A.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Acquired by Euskaltel"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "17",
    "brand": "Móbil R",
    "operator": "R Cable y Telecomunicaciones Galicia S.A.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Acquired by Euskaltel"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "18",
    "brand": "ONO",
    "operator": "Vodafone Spain",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn; acquired by Vodafone"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "19",
    "brand": "Simyo",
    "operator": "Orange España Virtual Sl.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Acquired by Orange"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "20",
    "brand": "Fonyou",
    "operator": "Fonyou Telecom S.L.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "21",
    "brand": "Jazztel",
    "operator": "Orange Espagne S.A.U.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Acquired by Orange in 2014"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "22",
    "brand": "DIGI mobil",
    "operator": "Best Spain Telecom",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "23",
    "brand": null,
    "operator": "Xfera Moviles S.A.U.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "24",
    "brand": null,
    "operator": "VODAFONE ESPAÑA, S.A.U.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Eroski Móvil España, acquired by Vodafone in Feb 2018; some MVNOs use this MNC (Orbitel, Vizzavi)"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "25",
    "brand": "Lycamobile",
    "operator": "LycaMobile S.L.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "26",
    "brand": null,
    "operator": "Lleida Networks Serveis Telemátics, SL",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "27",
    "brand": "Truphone",
    "operator": "SCN Truphone, S.L.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "28",
    "brand": "Murcia4G",
    "operator": "Consorcio de Telecomunicaciones Avanzadas, S.A.",
    "status": "Operational",
    "bands": "TD-LTE 2600",
    "notes": "LTE band 38"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "29",
    "brand": null,
    "operator": "Xfera Moviles S.A.U.",
    "status": "Operational",
    "bands": "TD-LTE 3500",
    "notes": "Former NEO-SKY 2002, S.A."
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "30",
    "brand": null,
    "operator": "Compatel Limited",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "31",
    "brand": null,
    "operator": "Red Digital De Telecomunicaciones de las Islas Baleares, S.L.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "32",
    "brand": "Tuenti",
    "operator": "Telefónica Móviles España",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn, replaced by MNC 05"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "33",
    "brand": null,
    "operator": "Xfera Móviles, S.A.U.",
    "status": "Unknown",
    "bands": "WiMAX",
    "notes": "Former EURONA WIRELESS TELECOM"
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "34",
    "brand": null,
    "operator": "Aire Networks del Mediterráneo, S.L.U.",
    "status": "Operational",
    "bands": "LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "35",
    "brand": null,
    "operator": "INGENIUM OUTSOURCING SERVICES, S.L.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "36",
    "brand": null,
    "operator": "ALAI OPERADOR DE TELECOMUNICACIONES, S.L",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": "Former OPEN CABLE TELECOMUNICACIONES, S.L."
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "37",
    "brand": null,
    "operator": "Vodafone Spain",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "38",
    "brand": null,
    "operator": "Telefónica Móviles España, S.A.U.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Spain",
    "countryCode": "ES",
    "mcc": "214",
    "mnc": "51",
    "brand": "ADIF",
    "operator": "Administrador de Infraestructuras Ferroviarias",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "01",
    "brand": "Telia",
    "operator": "Telia Sverige AB",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2600 / 5G 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "02",
    "brand": "3",
    "operator": "HI3G Access AB",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600 / TD-LTE 2600 / TD-5G 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "03",
    "brand": "Net 1",
    "operator": "Teracom Mobil AB",
    "status": "Operational",
    "bands": "LTE 450",
    "notes": "Former Nordisk Mobiltelefon, Ice.net; CDMA 450 shut down"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "04",
    "brand": "SWEDEN",
    "operator": "3G Infrastructure Services AB",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": "Owned by Hi3G Access (3) and Telenor. Not available in major cities since the owners operate their own city networks."
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "05",
    "brand": "Sweden 3G",
    "operator": "Svenska UMTS-Nät AB",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": "Owned by Telia and Tele2. Available all over Sweden."
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "06",
    "brand": "Telenor",
    "operator": "Telenor Sverige AB",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": "Former Vodafone Sweden"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "07",
    "brand": "Tele2",
    "operator": "Tele2 Sverige AB",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600",
    "notes": "MOCN r6 network"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "08",
    "brand": "Telenor",
    "operator": "Telenor Sverige AB",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Merged with Tele2 into Net4Mobility"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "09",
    "brand": "Com4",
    "operator": "Communication for Devices in Sweden AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former djuice (Telenor MVNO)"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "10",
    "brand": "Spring Mobil",
    "operator": "Tele2 Sverige AB",
    "status": "Operational",
    "bands": null,
    "notes": "Only used on femto- and nanocells"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "11",
    "brand": null,
    "operator": "ComHem AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Lindholmen Science Park AB"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "12",
    "brand": "Lycamobile",
    "operator": "Lycamobile Sweden Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "13",
    "brand": null,
    "operator": "A3 Företag AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Alltele Företag Sverige AB"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "14",
    "brand": null,
    "operator": "Tele2 Sverige AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former TDC Sverige AB (MVNO)"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "15",
    "brand": null,
    "operator": "Sierra Wireless Sweden AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Wireless Maingate Nordic AB"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "16",
    "brand": null,
    "operator": "42 Telecom AB",
    "status": "Operational",
    "bands": "GSM",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "17",
    "brand": "Gotanet",
    "operator": "Götalandsnätet AB",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "18",
    "brand": null,
    "operator": "Generic Mobile Systems Sweden AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "19",
    "brand": "Vectone Mobile",
    "operator": "Mundio Mobile (Sweden) Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO in Telia's network"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "20",
    "brand": null,
    "operator": "Sierra Wireless Messaging AB",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Wireless Maingate Messaging Services AB"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "21",
    "brand": "MobiSir",
    "operator": "Trafikverket ICT",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "22",
    "brand": null,
    "operator": "EuTel AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "23",
    "brand": null,
    "operator": "Infobip Limited (UK)",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "24",
    "brand": "Sweden 2G",
    "operator": "Net4Mobility HB",
    "status": "Operational",
    "bands": "GSM 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "LTE1800 only available in major cities; owned by Telenor and Tele2."
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "25",
    "brand": null,
    "operator": "Monty UK Global Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Digitel Mobile Srl"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "26",
    "brand": null,
    "operator": "Twilio Sweden AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Beepsend AB"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "27",
    "brand": null,
    "operator": "GlobeTouch AB",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Fogg Mobile AB; M2M services only"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "28",
    "brand": null,
    "operator": "LINK Mobile A/S",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former CoolTEL Aps"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "29",
    "brand": null,
    "operator": "Mercury International Carrier Services",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "30",
    "brand": null,
    "operator": "NextGen Mobile Ltd.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "31",
    "brand": null,
    "operator": "RebTel Network AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Mobimax AB"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "32",
    "brand": null,
    "operator": "Compatel Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "33",
    "brand": null,
    "operator": "Mobile Arts AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "34",
    "brand": null,
    "operator": "Trafikverket centralfunktion IT",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Formerly Tigo, Pro Net;"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "35",
    "brand": null,
    "operator": "42 Telecom LTD",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "36",
    "brand": null,
    "operator": "interactive digital media GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "37",
    "brand": null,
    "operator": "Sinch Sweden AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former CLX Networks AB"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "38",
    "brand": "Voxbone",
    "operator": "Voxbone mobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "39",
    "brand": null,
    "operator": "Primlight AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former iCentrex Sweden AB, Borderlight AB"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "40",
    "brand": null,
    "operator": "Netmore Group AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former ReWiCom Scandinavia AB, North net connect AB"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "41",
    "brand": null,
    "operator": "Shyam Telecom UK Ltd.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "42",
    "brand": null,
    "operator": "Telenor Connexion AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "43",
    "brand": null,
    "operator": "MobiWeb Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "44",
    "brand": null,
    "operator": "Telenabler AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Limitless Mobile AB"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "45",
    "brand": null,
    "operator": "Spirius AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "46",
    "brand": "Viahub",
    "operator": "SMS Provider Corp.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "47",
    "brand": null,
    "operator": "Viatel Sweden AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "48",
    "brand": null,
    "operator": "Tismi BV",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "49",
    "brand": null,
    "operator": "Telia Sverige AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "60",
    "brand": null,
    "operator": "Telefonaktiebolaget LM Ericsson",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Test network; temporary license until 31 December 2019"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "61",
    "brand": null,
    "operator": "MessageBird B.V.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "temporary license until 3 November 2019"
  },
  {
    "type": "National",
    "countryName": "Sweden",
    "countryCode": "SE",
    "mcc": "240",
    "mnc": "63",
    "brand": "FTS",
    "operator": "Fink Telecom Services",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "01",
    "brand": "Swisscom",
    "operator": "Swisscom AG",
    "status": "Operational",
    "bands": "UMTS 900 / LTE 700 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 2100 / 5G 3500",
    "notes": "UMTS 2100 shut down Nov 2019, GSM end of 2020; UMTS 900 shutdown planned for 2024"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "02",
    "brand": "Sunrise",
    "operator": "Sunrise Communications AG",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500",
    "notes": "GSM to remain until 2022"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "03",
    "brand": "Salt",
    "operator": "Salt Mobile SA",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500",
    "notes": "Former Orange - GSM was shut down in June 2020"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "05",
    "brand": null,
    "operator": "Comfone AG",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former Togewanet AG"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "06",
    "brand": "SBB-CFF-FFS",
    "operator": "SBB AG",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": "railways communication"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "07",
    "brand": "IN&Phone",
    "operator": "IN&Phone SA",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "MNC withdrawn, bankrupt in 2012"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "08",
    "brand": "Tele4u",
    "operator": "Sunrise Communications AG",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Former Tele2"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "09",
    "brand": null,
    "operator": "Comfone AG",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "10",
    "brand": null,
    "operator": "Stadt Polizei Zürich",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "11",
    "brand": null,
    "operator": "Swisscom Broadcast AG",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "12",
    "brand": "Sunrise",
    "operator": "Sunrise Communications AG",
    "status": "Not operational",
    "bands": null,
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "50",
    "brand": null,
    "operator": "3G Mobile AG",
    "status": "Not operational",
    "bands": "UMTS 2100",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "51",
    "brand": null,
    "operator": "relario AG",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former BebbiCell AG"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "52",
    "brand": "Barablu",
    "operator": "Barablu",
    "status": "Not operational",
    "bands": null,
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "53",
    "brand": "upc cablecom",
    "operator": "Sunrise UPC GmbH",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "54",
    "brand": "Lycamobile",
    "operator": "Lycamobile AG",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "55",
    "brand": null,
    "operator": "WeMobile SA",
    "status": "Unknown",
    "bands": null,
    "notes": "SMS relay only"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "56",
    "brand": null,
    "operator": "SMSRelay AG",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "57",
    "brand": null,
    "operator": "Mitto AG",
    "status": "Unknown",
    "bands": null,
    "notes": "SMS relay only"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "58",
    "brand": "beeone",
    "operator": "Beeone Communications SA",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "59",
    "brand": "Vectone",
    "operator": "Mundio Mobile Limited",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "60",
    "brand": "Sunrise",
    "operator": "Sunrise Communications AG",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former network sharing test with Salt Mobile"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "61",
    "brand": null,
    "operator": "Compatel Ltd.",
    "status": "Not operational",
    "bands": null,
    "notes": "SMS relay only; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "62",
    "brand": null,
    "operator": "Telecom26 AG",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "63",
    "brand": "FTS",
    "operator": "Fink Telecom Services",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "SMS relay only"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "64",
    "brand": null,
    "operator": "Nth AG",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Mobile payment solutions"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "65",
    "brand": null,
    "operator": "Nexphone AG",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "66",
    "brand": null,
    "operator": "Inovia Services SA",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "67",
    "brand": null,
    "operator": "Datatrade Managed AG",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "68",
    "brand": null,
    "operator": "Intellico AG",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "69",
    "brand": null,
    "operator": "MTEL Schweiz GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "70",
    "brand": null,
    "operator": "Tismi BV",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "98",
    "brand": null,
    "operator": "Etablissement Cantonal d'Assurance",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Pilot project"
  },
  {
    "type": "National",
    "countryName": "Switzerland",
    "countryCode": "CH",
    "mcc": "228",
    "mnc": "99",
    "brand": null,
    "operator": "Swisscom Broadcast AG",
    "status": "Not operational",
    "bands": null,
    "notes": "Test network; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Turkey",
    "countryCode": "TR",
    "mcc": "286",
    "mnc": "01",
    "brand": "Turkcell",
    "operator": "Turkcell Iletisim Hizmetleri A.S.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Turkey",
    "countryCode": "TR",
    "mcc": "286",
    "mnc": "02",
    "brand": "Vodafone",
    "operator": "Vodafone Turkey",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600",
    "notes": "Formerly known as Telsim"
  },
  {
    "type": "National",
    "countryName": "Turkey",
    "countryCode": "TR",
    "mcc": "286",
    "mnc": "03",
    "brand": "Türk Telekom",
    "operator": "Türk Telekom",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600 / TD-LTE 2600",
    "notes": "Former Aria, merged with Aycell to form Avea"
  },
  {
    "type": "National",
    "countryName": "Turkey",
    "countryCode": "TR",
    "mcc": "286",
    "mnc": "04",
    "brand": "Aycell",
    "operator": "Aycell",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged into Aria to form Avea"
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "01",
    "brand": "Vodafone",
    "operator": "PRJSC \"VF Ukraine\"",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600",
    "notes": "Former UMC, MTS; CDMA 450 shut down June 2018"
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "02",
    "brand": "Kyivstar",
    "operator": "PRJSC \"Kyivstar\"",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600",
    "notes": "Former Beeline,  WellCOM, URS; taken over by Kyivstar"
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "03",
    "brand": "Kyivstar",
    "operator": "PRJSC \"Kyivstar\"",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "04",
    "brand": "Intertelecom",
    "operator": "Intertelecom LLC",
    "status": "Operational",
    "bands": "CDMA 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "05",
    "brand": "Kyivstar",
    "operator": "PRJSC \"Kyivstar\"",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Former Golden Telecom; taken over by Kyivstar; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "06",
    "brand": "lifecell",
    "operator": "lifecell LLC",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600",
    "notes": "Former life:) / Astelit"
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "07",
    "brand": "3Mob; Lycamobile",
    "operator": "Trimob LLC",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": "Former Utel, GSM / UMTS roaming with Vodafone"
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "08",
    "brand": null,
    "operator": "JSC Ukrtelecom",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC assigned in 2019 for 2 years"
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "09",
    "brand": null,
    "operator": "PRJSC \"Farlep-Invest\"",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC assigned in 2019 for 2 years; part of Vega Telecommunications Group"
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "10",
    "brand": null,
    "operator": "Atlantis Telecom LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "21",
    "brand": "PEOPLEnet",
    "operator": "PRJSC \"Telesystems of Ukraine\"",
    "status": "Operational",
    "bands": "CDMA 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "23",
    "brand": "CDMA Ukraine",
    "operator": "Intertelecom LLC",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "Taken over by Intertelecom; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "25",
    "brand": "NEWTONE",
    "operator": "PRJSC \"Telesystems of Ukraine\"",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "Taken over by PEOPLEnet; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Ukraine",
    "countryCode": "UA",
    "mcc": "255",
    "mnc": "99",
    "brand": "Phoenix",
    "operator": "Phoenix",
    "status": "Operational",
    "bands": "LTE 800",
    "notes": "\"Donetsk People's Republic\" only; MNC not officially assigned"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "00",
    "brand": "BT",
    "operator": "BT Group",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "01",
    "brand": "Vectone Mobile",
    "operator": "Mundio Mobile Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Previously Mapesbury Communications Ltd.; uses EE network"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "02",
    "brand": "O2 (UK)",
    "operator": "Telefónica Europe",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / 5G 700 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "03",
    "brand": "Airtel-Vodafone",
    "operator": "Jersey Airtel Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Guernsey, Jersey"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "04",
    "brand": "FMS Solutions Ltd",
    "operator": "FMS Solutions Ltd",
    "status": "Reserved",
    "bands": "GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "05",
    "brand": null,
    "operator": "COLT Mobile Telecommunications Limited",
    "status": "Not operational",
    "bands": null,
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "06",
    "brand": null,
    "operator": "Internet Computer Bureau Limited",
    "status": "Not operational",
    "bands": null,
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "07",
    "brand": "Vodafone UK",
    "operator": "Vodafone",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Former Cable & Wireless Worldwide; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "08",
    "brand": "BT OnePhone",
    "operator": "BT OnePhone (UK) Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses the EE Network"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "09",
    "brand": null,
    "operator": "Tismi BV",
    "status": "Unknown",
    "bands": null,
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "10",
    "brand": "O2 (UK)",
    "operator": "Telefónica Europe",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / 5G 700 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "11",
    "brand": "O2 (UK)",
    "operator": "Telefónica Europe",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / 5G 700 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "12",
    "brand": "Railtrack",
    "operator": "Network Rail Infrastructure Ltd",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "13",
    "brand": "Railtrack",
    "operator": "Network Rail Infrastructure Ltd",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "14",
    "brand": null,
    "operator": "Link Mobility UK Ltd",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Former Hay Systems Ltd"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "15",
    "brand": "Vodafone UK",
    "operator": "Vodafone",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 2100 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "16",
    "brand": "Talk Talk",
    "operator": "TalkTalk Communications Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Formerly Opal Tel Ltd; uses Vodafone network"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "17",
    "brand": null,
    "operator": "FleXtel Limited",
    "status": "Not operational",
    "bands": null,
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "18",
    "brand": "Cloud9",
    "operator": "Cloud9",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Isle of Man network shut down"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "19",
    "brand": "Private Mobile Networks PMN",
    "operator": "Teleware plc",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Private GSM; roaming with Vodafone"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "20",
    "brand": "3",
    "operator": "Hutchison 3G UK Ltd",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 800 / LTE 1500 / LTE 1800 / LTE 2100 / 5G 3500",
    "notes": "National roaming with Orange (UK)'s 2G network"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "21",
    "brand": null,
    "operator": "LogicStar Ltd",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "22",
    "brand": null,
    "operator": "Telesign Mobile Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Routo Telecommunications Limited"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "23",
    "brand": null,
    "operator": "Icron Network Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "24",
    "brand": "Greenfone",
    "operator": "Stour Marine Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Stour Marine network"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "25",
    "brand": "Truphone",
    "operator": "Truphone",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Vodafone network"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "26",
    "brand": "Lycamobile",
    "operator": "Lycamobile UK Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses O2 Network"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "27",
    "brand": "Teleena",
    "operator": "Tata Communications Move UK Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "28",
    "brand": null,
    "operator": "Marathon Telecom Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Holds unused spectrum in Jersey"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "29",
    "brand": "aql",
    "operator": "(aq) Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "30",
    "brand": "T-Mobile UK",
    "operator": "EE",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500",
    "notes": "Previously owned by Deutsche Telekom; used by MVNOs Asda Mobile & Virgin Mobile"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "31",
    "brand": "T-Mobile UK",
    "operator": "EE",
    "status": "Allocated",
    "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "32",
    "brand": "T-Mobile UK",
    "operator": "EE",
    "status": "Allocated",
    "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "33",
    "brand": "Orange",
    "operator": "EE",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500",
    "notes": "Previously owned by Orange S.A."
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "34",
    "brand": "Orange",
    "operator": "EE",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500",
    "notes": "Previously owned by Orange S.A."
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "35",
    "brand": null,
    "operator": "JSC Ingenium (UK) Limited",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "36",
    "brand": "Sure Mobile",
    "operator": "Sure Isle of Man Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100",
    "notes": "Isle of Man; former Cable & Wireless"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "37",
    "brand": null,
    "operator": "Synectiv Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "38",
    "brand": "Virgin Mobile",
    "operator": "Virgin Media",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "39",
    "brand": null,
    "operator": "Gamma Telecom Holdings Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former SSE Energy Supply Limited"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "50",
    "brand": "JT",
    "operator": "JT Group Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Guernsey, Jersey; former Wave Telecom"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "51",
    "brand": "Relish",
    "operator": "UK Broadband Limited",
    "status": "Operational",
    "bands": "TD-LTE 3500 / TD-LTE 3700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "52",
    "brand": null,
    "operator": "Shyam Telecom UK Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "53",
    "brand": null,
    "operator": "Limitless Mobile Ltd",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "54",
    "brand": "iD Mobile",
    "operator": "The Carphone Warehouse Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Three UK"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "55",
    "brand": "Sure Mobile",
    "operator": "Sure (Guernsey) Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Guernsey, Jersey; former Cable & Wireless"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "56",
    "brand": null,
    "operator": "National Cyber Security Centre",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former CESG"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "57",
    "brand": null,
    "operator": "Sky UK Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "58",
    "brand": "Pronto GSM",
    "operator": "Manx Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": "Isle of Man"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "59",
    "brand": null,
    "operator": "Limitless Mobile Ltd",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "70",
    "brand": null,
    "operator": "AMSUK Ltd.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "71",
    "brand": null,
    "operator": "Home Office",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "72",
    "brand": "Hanhaa Mobile",
    "operator": "Hanhaa Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "M2M applications"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "73",
    "brand": null,
    "operator": "Bluewave Communications Ltd",
    "status": "Operational",
    "bands": "TD-LTE 3500",
    "notes": "Isle of Man"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "74",
    "brand": null,
    "operator": "Pareteum Europe B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "75",
    "brand": null,
    "operator": "Mass Response Service GmbH",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "76",
    "brand": "BT",
    "operator": "BT Group",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "77",
    "brand": "Vodafone UK",
    "operator": "Vodafone United Kingdom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "78",
    "brand": "Airwave",
    "operator": "Airwave Solutions Ltd",
    "status": "Operational",
    "bands": "TETRA",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "234",
    "mnc": "86",
    "brand": null,
    "operator": "EE",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "00",
    "brand": "Vectone Mobile",
    "operator": "Mundio Mobile Limited",
    "status": "Unknown",
    "bands": null,
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "01",
    "brand": null,
    "operator": "EE",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "02",
    "brand": null,
    "operator": "EE",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "03",
    "brand": "Relish",
    "operator": "UK Broadband Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "04",
    "brand": null,
    "operator": "University of Strathclyde",
    "status": "Unknown",
    "bands": "5G",
    "notes": "for more info, see StrathSDR"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "06",
    "brand": null,
    "operator": "University of Strathclyde",
    "status": "Unknown",
    "bands": "5G",
    "notes": "for more info, see StrathSDR"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "07",
    "brand": null,
    "operator": "University of Strathclyde",
    "status": "Unknown",
    "bands": "5G",
    "notes": "for more info, see StrathSDR"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "77",
    "brand": "BT",
    "operator": "BT Group",
    "status": "Unknown",
    "bands": null,
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "88",
    "brand": null,
    "operator": "Telet Research (N.I.) Limited",
    "status": "Unknown",
    "bands": "LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "91",
    "brand": "Vodafone UK",
    "operator": "Vodafone United Kingdom",
    "status": "Unknown",
    "bands": null,
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "92",
    "brand": "Vodafone UK",
    "operator": "Vodafone United Kingdom",
    "status": "Not operational",
    "bands": null,
    "notes": "Former Cable & Wireless UK; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "94",
    "brand": null,
    "operator": "Hutchison 3G UK Ltd",
    "status": "Unknown",
    "bands": null,
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Kingdom",
    "countryCode": "GB",
    "mcc": "235",
    "mnc": "95",
    "brand": null,
    "operator": "Network Rail Infrastructure Limited",
    "status": "Test Network",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Anguilla (United Kingdom)",
    "countryCode": "AI",
    "mcc": "365",
    "mnc": "010",
    "brand": null,
    "operator": "Digicel",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Anguilla (United Kingdom)",
    "countryCode": "AI",
    "mcc": "365",
    "mnc": "840",
    "brand": "FLOW",
    "operator": "Cable & Wireless",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Antigua and Barbuda",
    "countryCode": "AG",
    "mcc": "344",
    "mnc": "030",
    "brand": "APUA",
    "operator": "Antigua Public Utilities Authority",
    "status": "Operational",
    "bands": "GSM 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Antigua and Barbuda",
    "countryCode": "AG",
    "mcc": "344",
    "mnc": "050",
    "brand": "Digicel",
    "operator": "Antigua Wireless Ventures Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1900 / UMTS 850 / LTE 700",
    "notes": "LTE band 17"
  },
  {
    "type": "National",
    "countryName": "Antigua and Barbuda",
    "countryCode": "AG",
    "mcc": "344",
    "mnc": "920",
    "brand": "FLOW",
    "operator": "Cable & Wireless Caribbean Cellular (Antigua) Limited",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1800 / GSM 1900 / UMTS 850 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Antigua and Barbuda",
    "countryCode": "AG",
    "mcc": "344",
    "mnc": "930",
    "brand": null,
    "operator": "AT&T Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Aruba (Kingdom of the Netherlands)",
    "countryCode": "AW",
    "mcc": "363",
    "mnc": "01",
    "brand": "SETAR",
    "operator": "Servicio di Telecomunicacion di Aruba",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / GSM 1900 / UMTS 2100 / LTE 1800 / TDMA 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Aruba (Kingdom of the Netherlands)",
    "countryCode": "AW",
    "mcc": "363",
    "mnc": "02",
    "brand": "Digicel",
    "operator": "Digicel Aruba",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bahamas",
    "countryCode": "BS",
    "mcc": "364",
    "mnc": "39",
    "brand": "BTC",
    "operator": "The Bahamas Telecommunications Company Ltd (BaTelCo)",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700 / LTE 1700",
    "notes": "LTE band 17 and 4"
  },
  {
    "type": "National",
    "countryName": "Bahamas",
    "countryCode": "BS",
    "mcc": "364",
    "mnc": "49",
    "brand": "Aliv",
    "operator": "Cable Bahamas Ltd",
    "status": "Operational",
    "bands": "UMTS 850 / LTE 700 / LTE 1700",
    "notes": "Former NewCo2015; LTE bands 13 and 4; license also covers Band 2"
  },
  {
    "type": "National",
    "countryName": "Barbados",
    "countryCode": "BB",
    "mcc": "342",
    "mnc": "600",
    "brand": "FLOW",
    "operator": "LIME (formerly known as Cable & Wireless)",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 850 / LTE 850 / LTE 1900",
    "notes": "LTE bands 5 / 2"
  },
  {
    "type": "National",
    "countryName": "Barbados",
    "countryCode": "BB",
    "mcc": "342",
    "mnc": "646",
    "brand": null,
    "operator": "KW Telecommunications Inc.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Barbados",
    "countryCode": "BB",
    "mcc": "342",
    "mnc": "750",
    "brand": "Digicel",
    "operator": "Digicel (Barbados) Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1900",
    "notes": "LTE bands 17 / 2"
  },
  {
    "type": "National",
    "countryName": "Barbados",
    "countryCode": "BB",
    "mcc": "342",
    "mnc": "800",
    "brand": "Ozone",
    "operator": "Ozone Wireless Inc.",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "LTE band 13; shut down July 2019"
  },
  {
    "type": "National",
    "countryName": "Barbados",
    "countryCode": "BB",
    "mcc": "342",
    "mnc": "820",
    "brand": null,
    "operator": "Neptune Communications Inc.",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "LTE band 14 Former Sunbeach Communications"
  },
  {
    "type": "National",
    "countryName": "Bermuda",
    "countryCode": "BM",
    "mcc": "310",
    "mnc": "59",
    "brand": "Cellular One",
    "operator": null,
    "status": "Operational",
    "bands": "CDMA",
    "notes": "uses USA MCC"
  },
  {
    "type": "National",
    "countryName": "Bermuda",
    "countryCode": "BM",
    "mcc": "338",
    "mnc": "050",
    "brand": "Digicel Bermuda",
    "operator": null,
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700",
    "notes": "uses Jamaica MCC"
  },
  {
    "type": "National",
    "countryName": "Bermuda",
    "countryCode": "BM",
    "mcc": "350",
    "mnc": "00",
    "brand": "One",
    "operator": "Bermuda Digital Communications Ltd.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 850 / LTE 700",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "Bermuda",
    "countryCode": "BM",
    "mcc": "350",
    "mnc": "007",
    "brand": null,
    "operator": "Paradise Mobile",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bermuda",
    "countryCode": "BM",
    "mcc": "350",
    "mnc": "01",
    "brand": "Digicel Bermuda",
    "operator": "Telecommunications (Bermuda & West Indies) Ltd",
    "status": "Reserved",
    "bands": "GSM 1900",
    "notes": "uses Jamaica MNC/MCC (338-050)"
  },
  {
    "type": "National",
    "countryName": "Bermuda",
    "countryCode": "BM",
    "mcc": "350",
    "mnc": "02",
    "brand": "Mobility",
    "operator": "M3 Wireless",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS",
    "notes": "Merged with CellOne in 2011"
  },
  {
    "type": "National",
    "countryName": "Bermuda",
    "countryCode": "BM",
    "mcc": "350",
    "mnc": "05",
    "brand": null,
    "operator": "Telecom Networks",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bermuda",
    "countryCode": "BM",
    "mcc": "350",
    "mnc": "11",
    "brand": null,
    "operator": "Deltronics",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bermuda",
    "countryCode": "BM",
    "mcc": "350",
    "mnc": "15",
    "brand": null,
    "operator": "FKB Net Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "British Virgin Islands (United Kingdom)",
    "countryCode": "VG",
    "mcc": "348",
    "mnc": "170",
    "brand": "FLOW",
    "operator": "Cable & Wireless",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700 / LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "British Virgin Islands (United Kingdom)",
    "countryCode": "VG",
    "mcc": "348",
    "mnc": "370",
    "brand": null,
    "operator": "BVI Cable TV Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "British Virgin Islands (United Kingdom)",
    "countryCode": "VG",
    "mcc": "348",
    "mnc": "570",
    "brand": "CCT Boatphone",
    "operator": "Caribbean Cellular Telephone",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1900 / UMTS 850 / LTE 900 / LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "British Virgin Islands (United Kingdom)",
    "countryCode": "VG",
    "mcc": "348",
    "mnc": "770",
    "brand": "Digicel",
    "operator": "Digicel (BVI) Limited",
    "status": "Operational",
    "bands": "GSM 1800 / GSM 1900 / UMTS 1900 / LTE 700 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "100",
    "brand": "dotmobile",
    "operator": "Data on Tap Inc.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "130",
    "brand": "Xplornet",
    "operator": "Xplornet Communications",
    "status": "Operational",
    "bands": "TD-LTE 3500 / WiMAX / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "131",
    "brand": "Xplornet",
    "operator": "Xplornet Communications",
    "status": "Operational",
    "bands": "TD-LTE 3500 / WiMAX / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "150",
    "brand": null,
    "operator": "Cogeco Connexion Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "220",
    "brand": "Telus Mobility, Koodo Mobile, Public Mobile",
    "operator": "Telus Mobility",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900 / LTE 1700 / LTE 2600 / 5G 1700",
    "notes": "Used in IMSI to identify Telus subscribers on shared network 302-880"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "221",
    "brand": "Telus",
    "operator": "Telus Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "222",
    "brand": "Telus",
    "operator": "Telus Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "250",
    "brand": "ALO",
    "operator": "ALO Mobile Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "270",
    "brand": "EastLink",
    "operator": "Bragg Communications",
    "status": "Operational",
    "bands": "UMTS 1700 / LTE 700 / LTE 1700",
    "notes": "Nova Scotia and PEI; LTE bands 13, 4"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "290",
    "brand": "Airtel Wireless",
    "operator": "Airtel Wireless",
    "status": "Operational",
    "bands": "iDEN 900",
    "notes": "Calgary, AB"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "300",
    "brand": "ECOTEL",
    "operator": "Ecotel inc.",
    "status": "Operational",
    "bands": "LTE 700 / LTE 850 / LTE 2600",
    "notes": "private LTE networks"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "310",
    "brand": "ECOTEL",
    "operator": "Ecotel inc.",
    "status": "Operational",
    "bands": "LTE 700 / LTE 850 / LTE 2600",
    "notes": "private LTE networks"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "320",
    "brand": "Rogers Wireless",
    "operator": "Rogers Communications",
    "status": "Operational",
    "bands": "UMTS 1700",
    "notes": "Former Mobilicity"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "330",
    "brand": null,
    "operator": "Blue Canada Wireless Inc.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "340",
    "brand": "Execulink",
    "operator": "Execulink",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "350",
    "brand": null,
    "operator": "Naskapi Imuun Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former FIRST Networks"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "360",
    "brand": "MiKe",
    "operator": "Telus Mobility",
    "status": "Not operational",
    "bands": "iDEN 800",
    "notes": "iDEN shut down January 2016"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "361",
    "brand": "Telus",
    "operator": "Telus Mobility",
    "status": "Not operational",
    "bands": "CDMA 800 / CDMA 1900",
    "notes": "CDMA shut down 31 May 2017; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "370",
    "brand": "Fido",
    "operator": "Fido Solutions (Rogers Wireless)",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "former Microcell Telecommunications"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "380",
    "brand": "Keewaytinook Mobile",
    "operator": "Keewaytinook Okimakanak Mobile",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900",
    "notes": "Former Dryden Mobility"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "390",
    "brand": "DMTS",
    "operator": "Dryden Mobility",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Acquired by Tbaytel in 2012; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "420",
    "brand": "ABC",
    "operator": "A.B.C. Allen Business Communications Ltd.",
    "status": "Operational",
    "bands": "TD-LTE 3500",
    "notes": "British Columbia"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "480",
    "brand": "Qiniq",
    "operator": "SSi Connexions",
    "status": "Operational",
    "bands": "GSM 1900 / LTE 2600",
    "notes": "Nunavut"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "490",
    "brand": "Freedom Mobile",
    "operator": "Shaw Communications",
    "status": "Operational",
    "bands": "UMTS 1700 / LTE 700 / LTE 1700 / LTE 2600",
    "notes": "Former Wind Mobile; LTE bands 4, 7, 13, 66"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "491",
    "brand": "Freedom Mobile",
    "operator": "Shaw Communications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "500",
    "brand": "Videotron",
    "operator": "Videotron",
    "status": "Operational",
    "bands": "UMTS 1700 / LTE 700 / LTE 1700 / 5G 600 / 5G 1700 / 5G 2600",
    "notes": "LTE bands 13, 4; 5G bands n71, n66, n7"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "510",
    "brand": "Videotron",
    "operator": "Videotron",
    "status": "Operational",
    "bands": "UMTS 1700 / LTE 700 / LTE 1700 / 5G 600 / 5G 1700 / 5G 2600",
    "notes": "LTE bands 13, 4"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "520",
    "brand": "Videotron",
    "operator": "Videotron",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "530",
    "brand": "Keewaytinook Mobile",
    "operator": "Keewaytinook Okimakanak Mobile",
    "status": "Operational",
    "bands": "GSM",
    "notes": "Northwestern Ontario; also spelled Keewatinook Okimacinac"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "540",
    "brand": null,
    "operator": "Rovvr Communications Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "550",
    "brand": null,
    "operator": "Star Solutions International Inc.",
    "status": "Unknown",
    "bands": "LTE?",
    "notes": "Private LTE"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "560",
    "brand": "Lynx Mobility",
    "operator": "Lynx Mobility",
    "status": "Not operational",
    "bands": "CDMA / GSM",
    "notes": "Northern Quebec, Nunavut, Labrador; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "570",
    "brand": "LightSquared",
    "operator": "LightSquared",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "590",
    "brand": "Quadro Mobility",
    "operator": "Quadro Communications Co-op",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Southwestern Ontario"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "600",
    "brand": null,
    "operator": "Iristel",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "610",
    "brand": "Bell Mobility",
    "operator": "Bell Mobility",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 1900 / LTE 2600 / 5G 1700",
    "notes": "Used in IMSI to identify Bell subscribers on shared network 302-880; LTE bands 17, 29, 4, 2, 7"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "620",
    "brand": "ICE Wireless",
    "operator": "ICE Wireless",
    "status": "Operational",
    "bands": "UMTS 850 / GSM 1900 / LTE 850 / LTE 1900",
    "notes": "Northern Canada"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "630",
    "brand": "Aliant Mobility",
    "operator": "Bell Aliant",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "640",
    "brand": "Bell",
    "operator": "Bell Mobility",
    "status": "Not operational",
    "bands": "CDMA 800 / CDMA 1900",
    "notes": "CDMA shut down in April 2019"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "650",
    "brand": "TBaytel",
    "operator": "Thunder Bay Telephone",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "652",
    "brand": null,
    "operator": "BC Tel Mobility (Telus)",
    "status": "Not operational",
    "bands": "CDMA2000",
    "notes": "CDMA shut down 31 May 2017; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "653",
    "brand": "Telus",
    "operator": "Telus Mobility",
    "status": "Not operational",
    "bands": "CDMA 800 / CDMA 1900",
    "notes": "CDMA shut down 31 May 2017; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "655",
    "brand": "MTS",
    "operator": "Bell MTS",
    "status": "Not operational",
    "bands": "CDMA 800 / CDMA 1900",
    "notes": "former Manitoba Telephone System;  CDMA shut down 30 Apr 2019; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "656",
    "brand": "TBay",
    "operator": "Thunder Bay Telephone Mobility",
    "status": "Not operational",
    "bands": "CDMA",
    "notes": "CDMA shut down 1 October 2014; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "657",
    "brand": "Telus",
    "operator": "Telus Mobility",
    "status": "Not operational",
    "bands": "CDMA 800 / CDMA 1900",
    "notes": "CDMA shut down 31 May 2017; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "660",
    "brand": "MTS",
    "operator": "Bell MTS",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "670",
    "brand": "CityTel Mobility",
    "operator": "CityWest",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "680",
    "brand": "SaskTel",
    "operator": "SaskTel Mobility",
    "status": "Operational",
    "bands": "TD-LTE 2600",
    "notes": "CDMA 850 shut down 5 July 2017"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "681",
    "brand": "SaskTel",
    "operator": "SaskTel Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "690",
    "brand": "Bell",
    "operator": "Bell Mobility",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "701",
    "brand": null,
    "operator": "MB Tel Mobility",
    "status": "Not operational",
    "bands": "CDMA2000",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "702",
    "brand": null,
    "operator": "MT&T Mobility (Aliant)",
    "status": "Not operational",
    "bands": "CDMA2000",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "703",
    "brand": null,
    "operator": "New Tel Mobility (Aliant)",
    "status": "Not operational",
    "bands": "CDMA2000",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "710",
    "brand": "Globalstar",
    "operator": null,
    "status": "Operational",
    "bands": "Satellite CDMA",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "720",
    "brand": "Rogers Wireless",
    "operator": "Rogers Communications",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / LTE 700 / LTE 850 / LTE 1700 / LTE 1900 / LTE 2600 / 5G 600 / 5G 1700 / TD-5G 2600",
    "notes": "former Rogers AT&T Wireless; LTE bands 12, 5, 4, 2, 7; GSM 1900 / UMTS 1900 shut down 7 June 2021, GSM 850 to shut down 31 Dec 2021"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "721",
    "brand": "Rogers Wireless",
    "operator": "Rogers Communications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "730",
    "brand": "TerreStar Solutions",
    "operator": "TerreStar Networks",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "740",
    "brand": "Shaw Telecom",
    "operator": "Shaw Communications",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "750",
    "brand": "SaskTel",
    "operator": "SaskTel Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "760",
    "brand": "Public Mobile",
    "operator": "Telus Mobility",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Acquired by Telus, CDMA network shut down 2014"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "770",
    "brand": "TNW Wireless",
    "operator": "TNW Wireless Inc.",
    "status": "Operational",
    "bands": "UMTS 850",
    "notes": "Former Rural Com; national coverage based on iPCS technology and Wi-Nodes"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "780",
    "brand": "SaskTel",
    "operator": "SaskTel Mobility",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / 5G 3500",
    "notes": "Saskatchewan; LTE bands 13, 4"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "781",
    "brand": "SaskTel",
    "operator": "SaskTel Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "790",
    "brand": null,
    "operator": "NetSet Communications",
    "status": "Operational",
    "bands": "WiMAX / TD-LTE 3500",
    "notes": "Manitoba"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "820",
    "brand": "Rogers Wireless",
    "operator": "Rogers Communications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "860",
    "brand": "Telus",
    "operator": "Telus Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "880",
    "brand": "Bell / Telus / SaskTel",
    "operator": "Shared Telus, Bell, and SaskTel",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "910",
    "brand": null,
    "operator": "Halton Regional Police Service",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Reserved"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "920",
    "brand": "Rogers Wireless",
    "operator": "Rogers Communications",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "940",
    "brand": "Wightman Mobility",
    "operator": "Wightman Telecom",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "990",
    "brand": null,
    "operator": "Ericsson Canada",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "For testing"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "991",
    "brand": null,
    "operator": "Halton Regional Police Service",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "For testing"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "996",
    "brand": null,
    "operator": "Powertech Labs",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "For testing"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "997",
    "brand": null,
    "operator": "Powertech Labs",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Canada",
    "countryCode": "CA",
    "mcc": "302",
    "mnc": "998",
    "brand": null,
    "operator": "Institut de Recherche d’Hydro-Québec",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Powertech Labs; for testing"
  },
  {
    "type": "National",
    "countryName": "Cayman Islands (United Kingdom)",
    "countryCode": "KY",
    "mcc": "346",
    "mnc": "001",
    "brand": "Logic",
    "operator": "WestTel Ltd.",
    "status": "Operational",
    "bands": "LTE 2500",
    "notes": "LTE band 41; fixed wireless access"
  },
  {
    "type": "National",
    "countryName": "Cayman Islands (United Kingdom)",
    "countryCode": "KY",
    "mcc": "346",
    "mnc": "140",
    "brand": "FLOW",
    "operator": "Cable & Wireless (Cayman Islands) Limited",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700 / LTE 1900",
    "notes": "LTE bands 17 / 2"
  },
  {
    "type": "National",
    "countryName": "Cayman Islands (United Kingdom)",
    "countryCode": "KY",
    "mcc": "346",
    "mnc": "050",
    "brand": "Digicel",
    "operator": "Digicel Cayman Ltd.",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 700 / LTE 1800",
    "notes": "LTE bands 13 / 3; GSM shut down July 2020"
  },
  {
    "type": "National",
    "countryName": "Cuba",
    "countryCode": "CU",
    "mcc": "368",
    "mnc": "01",
    "brand": "CUBACEL",
    "operator": "Empresa de Telecomunicaciones de Cuba, SA",
    "status": "Operational",
    "bands": "GSM 900 / GSM 850 / UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": "GSM 850 only available in limited areas (Havana, Varadero, Trinidad and Cayo Coco)"
  },
  {
    "type": "National",
    "countryName": "Dominica",
    "countryCode": "DM",
    "mcc": "366",
    "mnc": "020",
    "brand": "Digicel",
    "operator": "Digicel Group Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1900 / UMTS 900 / UMTS 1900 / LTE 700",
    "notes": "Former Orange Dominica"
  },
  {
    "type": "National",
    "countryName": "Dominica",
    "countryCode": "DM",
    "mcc": "366",
    "mnc": "110",
    "brand": "FLOW",
    "operator": "Cable &  Wireless",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Dominican Republic",
    "countryCode": "DO",
    "mcc": "370",
    "mnc": "01",
    "brand": "Altice",
    "operator": "Altice Group",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / GSM 1900 / UMTS 900 / LTE 850 / LTE 900 / LTE 1700 / LTE 1900",
    "notes": "Former Orange Dominicana"
  },
  {
    "type": "National",
    "countryName": "Dominican Republic",
    "countryCode": "DO",
    "mcc": "370",
    "mnc": "02",
    "brand": "Claro",
    "operator": "Compañía Dominicana de Teléfonos",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1700 / LTE 1900 / LTE 2600 / 5G 3500",
    "notes": "CDMA 1900 shut down in 2014"
  },
  {
    "type": "National",
    "countryName": "Dominican Republic",
    "countryCode": "DO",
    "mcc": "370",
    "mnc": "03",
    "brand": "Altice",
    "operator": "Altice Group",
    "status": "Operational",
    "bands": "AMPS / CDMA 850",
    "notes": "Former Tricom, S.A, 1900 MHz spectrum returned to regulator"
  },
  {
    "type": "National",
    "countryName": "Dominican Republic",
    "countryCode": "DO",
    "mcc": "370",
    "mnc": "04",
    "brand": "Viva",
    "operator": "Trilogy Dominicana, S.A.",
    "status": "Operational",
    "bands": "CDMA 1900 / GSM 1900 / UMTS 1900 / LTE 1700",
    "notes": "Former Centennial Dominicana"
  },
  {
    "type": "National",
    "countryName": "Dominican Republic",
    "countryCode": "DO",
    "mcc": "370",
    "mnc": "05",
    "brand": "Wind",
    "operator": "WIND Telecom, S.A",
    "status": "Operational",
    "bands": "TD-LTE 2600",
    "notes": "LTE band 38"
  },
  {
    "type": "National",
    "countryName": "French Antilles (France)",
    "countryCode": "BL/GF/GP/MF/MQ",
    "mcc": "340",
    "mnc": "01",
    "brand": "Orange",
    "operator": "Orange Caraïbe Mobiles",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": "Guadeloupe, French Guiana, Martinique, Saint Barthélemy, Saint Martin"
  },
  {
    "type": "National",
    "countryName": "French Antilles (France)",
    "countryCode": "BL/GF/GP/MF/MQ",
    "mcc": "340",
    "mnc": "02",
    "brand": "SFR Caraïbe",
    "operator": "Outremer Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Guadeloupe, French Guiana, Martinique; former Only"
  },
  {
    "type": "National",
    "countryName": "French Antilles (France)",
    "countryCode": "BL/GF/GP/MF/MQ",
    "mcc": "340",
    "mnc": "03",
    "brand": "FLOW",
    "operator": "UTS Caraïbe",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS / LTE 1800",
    "notes": "Saint Barthélemy, Saint Martin; former Telcell"
  },
  {
    "type": "National",
    "countryName": "French Antilles (France)",
    "countryCode": "BL/GF/GP/MF/MQ",
    "mcc": "340",
    "mnc": "04",
    "brand": "Free",
    "operator": "Free Caraïbe",
    "status": "Upcoming",
    "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "French Antilles (France)",
    "countryCode": "BL/GF/GP/MF/MQ",
    "mcc": "340",
    "mnc": "08",
    "brand": "Dauphin",
    "operator": "Dauphin Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS / LTE",
    "notes": "Saint Barthélemy, Saint Martin"
  },
  {
    "type": "National",
    "countryName": "French Antilles (France)",
    "countryCode": "BL/GF/GP/MF/MQ",
    "mcc": "340",
    "mnc": "09",
    "brand": "Free",
    "operator": "Free Caraïbe",
    "status": "Upcoming",
    "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "French Antilles (France)",
    "countryCode": "BL/GF/GP/MF/MQ",
    "mcc": "340",
    "mnc": "10",
    "brand": null,
    "operator": "Guadeloupe Téléphone Mobile",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "French Antilles (France)",
    "countryCode": "BL/GF/GP/MF/MQ",
    "mcc": "340",
    "mnc": "11",
    "brand": null,
    "operator": "Guyane Téléphone Mobile",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "French Antilles (France)",
    "countryCode": "BL/GF/GP/MF/MQ",
    "mcc": "340",
    "mnc": "12",
    "brand": null,
    "operator": "Martinique Téléphone Mobile",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "French Antilles (France)",
    "countryCode": "BL/GF/GP/MF/MQ",
    "mcc": "340",
    "mnc": "20",
    "brand": "Digicel",
    "operator": "DIGICEL Antilles Française Guyane",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800",
    "notes": "Guadeloupe, French Guiana, Martinique, Saint Barthélemy, Saint Martin; former Bouygues Telecom Caraïbes"
  },
  {
    "type": "National",
    "countryName": "Grenada",
    "countryCode": "GD",
    "mcc": "352",
    "mnc": "030",
    "brand": "Digicel",
    "operator": "Digicel Grenada Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1900",
    "notes": "Also uses MCC 338 MNC 05 (Jamaica)"
  },
  {
    "type": "National",
    "countryName": "Grenada",
    "countryCode": "GD",
    "mcc": "352",
    "mnc": "110",
    "brand": "FLOW",
    "operator": "Cable & Wireless Grenada Ltd.",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guam (United States of America)",
    "countryCode": "GU",
    "mcc": "310",
    "mnc": "032",
    "brand": "IT&E Wireless",
    "operator": "IT&E Overseas, Inc",
    "status": "Operational",
    "bands": "CDMA 1900 / GSM 1900 / UMTS 1900 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guam (United States of America)",
    "countryCode": "GU",
    "mcc": "310",
    "mnc": "033",
    "brand": null,
    "operator": "Guam Telephone Authority",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guam (United States of America)",
    "countryCode": "GU",
    "mcc": "310",
    "mnc": "140",
    "brand": "GTA Wireless",
    "operator": "Teleguam Holdings, LLC",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1700",
    "notes": "Previously called Guam Telephone Authority mPulse"
  },
  {
    "type": "National",
    "countryName": "Guam (United States of America)",
    "countryCode": "GU",
    "mcc": "310",
    "mnc": "370",
    "brand": "Docomo",
    "operator": "NTT DoCoMo Pacific",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 850 / LTE 700",
    "notes": "Formerly HafaTEL, then Guamcell; CDMA 850 shut down in late 2010"
  },
  {
    "type": "National",
    "countryName": "Guam (United States of America)",
    "countryCode": "GU",
    "mcc": "310",
    "mnc": "400",
    "brand": "IT&E Wireless",
    "operator": "IT&E Overseas, Inc",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 700",
    "notes": "Former iConnect, Wave Runner LLC"
  },
  {
    "type": "National",
    "countryName": "Guam (United States of America)",
    "countryCode": "GU",
    "mcc": "310",
    "mnc": "470",
    "brand": "Docomo",
    "operator": "NTT DoCoMo Pacific",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guam (United States of America)",
    "countryCode": "GU",
    "mcc": "310",
    "mnc": "480",
    "brand": "IT&E Wireless",
    "operator": "IT&E Overseas, Inc",
    "status": "Operational",
    "bands": "iDEN",
    "notes": "Former iConnect, Wave Runner LLC"
  },
  {
    "type": "National",
    "countryName": "Guam (United States of America)",
    "countryCode": "GU",
    "mcc": "311",
    "mnc": "120",
    "brand": "IT&E Wireless",
    "operator": "IT&E Overseas, Inc",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Former iConnect, Wave Runner LLC"
  },
  {
    "type": "National",
    "countryName": "Guam (United States of America)",
    "countryCode": "GU",
    "mcc": "311",
    "mnc": "250",
    "brand": "IT&E Wireless",
    "operator": "IT&E Overseas, Inc",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Former iConnect, Wave Runner LLC"
  },
  {
    "type": "National",
    "countryName": "Haiti",
    "countryCode": "HT",
    "mcc": "372",
    "mnc": "01",
    "brand": "Voila",
    "operator": "Communication Cellulaire d'Haiti S.A.",
    "status": "Not operational",
    "bands": "GSM 850",
    "notes": "Sold to Digicel in 2012"
  },
  {
    "type": "National",
    "countryName": "Haiti",
    "countryCode": "HT",
    "mcc": "372",
    "mnc": "02",
    "brand": "Digicel",
    "operator": "Unigestion Holding S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Haiti",
    "countryCode": "HT",
    "mcc": "372",
    "mnc": "03",
    "brand": "Natcom",
    "operator": "NATCOM S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UTMS 2100 / LTE 800",
    "notes": "60% owned by Viettel"
  },
  {
    "type": "National",
    "countryName": "Jamaica",
    "countryCode": "JM",
    "mcc": "338",
    "mnc": "020",
    "brand": "FLOW",
    "operator": "LIME (Cable & Wireless)",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Jamaica",
    "countryCode": "JM",
    "mcc": "338",
    "mnc": "040",
    "brand": "Caricel",
    "operator": "Symbiote Investment Limited",
    "status": "Not operational",
    "bands": "LTE",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Jamaica",
    "countryCode": "JM",
    "mcc": "338",
    "mnc": "050",
    "brand": "Digicel",
    "operator": "Digicel (Jamaica) Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1900 / UMTS 850 / LTE 700 / LTE 1700 / LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Jamaica",
    "countryCode": "JM",
    "mcc": "338",
    "mnc": "070",
    "brand": "Claro",
    "operator": "Oceanic Digital Jamaica Limited",
    "status": "Not operational",
    "bands": "GSM / UMTS / CDMA",
    "notes": "shut down 2012"
  },
  {
    "type": "National",
    "countryName": "Jamaica",
    "countryCode": "JM",
    "mcc": "338",
    "mnc": "080",
    "brand": null,
    "operator": "Rock Mobile Limited",
    "status": "Unknown",
    "bands": "LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Jamaica",
    "countryCode": "JM",
    "mcc": "338",
    "mnc": "110",
    "brand": "FLOW",
    "operator": "Cable & Wireless Communications",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Jamaica",
    "countryCode": "JM",
    "mcc": "338",
    "mnc": "180",
    "brand": "FLOW",
    "operator": "Cable & Wireless Communications",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "001",
    "brand": null,
    "operator": "Comunicaciones Digitales Del Norte, S.A. de C.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "010",
    "brand": "AT&T",
    "operator": "AT&T Mexico",
    "status": "Not operational",
    "bands": "iDEN 800",
    "notes": "Former Nextel; shut down 2017"
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "020",
    "brand": "Telcel",
    "operator": "América Móvil",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900 / LTE 850 / LTE 1700 / LTE 2600",
    "notes": "former Radiomóvil Dipsa; GSM shut down Sep 2020"
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "030",
    "brand": "Movistar",
    "operator": "Telefónica",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "former Pegaso PCS; MVNO on AT&T, own spectrum returned"
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "040",
    "brand": "Unefon",
    "operator": "AT&T Mexico",
    "status": "Not operational",
    "bands": "CDMA 850 / CDMA 1900",
    "notes": "Shut down 2016"
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "050",
    "brand": "AT&T / Unefon",
    "operator": "AT&T Mexico",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900 / UMTS 1700 / LTE 850 / LTE 1700 / LTE 2600 / TD-LTE 2600 / 5G 2600",
    "notes": "Former Iusacell; GSM shut down 2019"
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "060",
    "brand": null,
    "operator": "Servicios de Acceso Inalambrico, S.A. de C.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "066",
    "brand": null,
    "operator": "Telefonos de México, S.A.B. de C.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "070",
    "brand": "Unefon",
    "operator": "AT&T Mexico",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "080",
    "brand": "Unefon",
    "operator": "AT&T Mexico",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "090",
    "brand": "AT&T",
    "operator": "AT&T Mexico",
    "status": "Operational",
    "bands": "UMTS 1700 / LTE 850 / LTE 1700",
    "notes": "Former Nextel"
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "100",
    "brand": null,
    "operator": "Telecomunicaciones de México",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "110",
    "brand": null,
    "operator": "Maxcom Telecomunicaciones, S.A.B. de C.V.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "120",
    "brand": null,
    "operator": "Quickly Phone, S.A. de C.V.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "130",
    "brand": null,
    "operator": "Axtel, S.A.B. de C.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "140",
    "brand": "Altan Redes",
    "operator": "Altán Redes S.A.P.I. de C.V.",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Red compartida"
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "150",
    "brand": "Ultranet",
    "operator": "Ultravisión, S.A. de C.V.",
    "status": "Operational",
    "bands": "LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "160",
    "brand": null,
    "operator": "Cablevisión Red, S.A. de C.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "170",
    "brand": null,
    "operator": "Oxio Mobile, S.A. de C.V.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "180",
    "brand": "FreedomPop",
    "operator": "FREEDOMPOP MÉXICO, S.A. DE C.V.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mexico",
    "countryCode": "MX",
    "mcc": "334",
    "mnc": "190",
    "brand": "Viasat",
    "operator": "VIASAT TECNOLOGÍA, S.A. DE C.V.",
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Montserrat (United Kingdom)",
    "countryCode": "MS",
    "mcc": "354",
    "mnc": "860",
    "brand": "FLOW",
    "operator": "Cable & Wireless",
    "status": "Operational",
    "bands": "GSM 850",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "31",
    "brand": null,
    "operator": "Eutel N.V.",
    "status": "Unknown",
    "bands": "GSM",
    "notes": "Sint Eustatius"
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "33",
    "brand": null,
    "operator": "WICC N.V.",
    "status": "Unknown",
    "bands": "GSM",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "51",
    "brand": "Telcell",
    "operator": "Telcell N.V.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": "Sint Maarten"
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "54",
    "brand": "ECC",
    "operator": "East Caribbean Cellular",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "59",
    "brand": "FLOW",
    "operator": "Liberty Latin America",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Bonaire, Saba, Sint Eustatius, Sint Maarten; former Radcomm N.V., UTS"
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "60",
    "brand": "FLOW",
    "operator": "Liberty Latin America",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 1800",
    "notes": "Bonaire, Saba, Sint Eustatius, Sint Maarten; former Radcomm N.V., UTS"
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "63",
    "brand": null,
    "operator": "CSC N.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "68",
    "brand": "Digicel",
    "operator": "Curaçao Telecom N.V.",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 1800",
    "notes": "Curaçao"
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "69",
    "brand": "Digicel",
    "operator": "Curaçao Telecom N.V.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Curaçao"
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "74",
    "brand": null,
    "operator": "PCS N.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "76",
    "brand": "Digicel",
    "operator": "Antiliano Por N.V.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": "Bonaire"
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "78",
    "brand": "Telbo",
    "operator": "Telefonia Bonairiano N.V.",
    "status": "Operational",
    "bands": "UMTS 900 / LTE 1800",
    "notes": "Bonaire"
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "91",
    "brand": "FLOW",
    "operator": "Liberty Latin America",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800",
    "notes": "Curaçao; former Setel N.V., UTS"
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "94",
    "brand": "Bayòs",
    "operator": "Bòbò Frus N.V.",
    "status": "Operational",
    "bands": "TDMA PCS",
    "notes": "Mobile Solutions"
  },
  {
    "type": "National",
    "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)",
    "countryCode": "BQ/CW/SX",
    "mcc": "362",
    "mnc": "95",
    "brand": "MIO",
    "operator": "E.O.C.G. Wireless",
    "status": "Not operational",
    "bands": "CDMA2000 850",
    "notes": "former GSM Caribbean N.V.; bankrupt in 2013"
  },
  {
    "type": "National",
    "countryName": "Northern Mariana Islands (United States of America)",
    "countryCode": "MP",
    "mcc": "310",
    "mnc": "110",
    "brand": "IT&E Wireless",
    "operator": "PTI Pacifica Inc.",
    "status": "Operational",
    "bands": "CDMA / GSM 850 / UMTS 1900 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Northern Mariana Islands (United States of America)",
    "countryCode": "MP",
    "mcc": "310",
    "mnc": "370",
    "brand": "Docomo",
    "operator": "NTT DoCoMo Pacific",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Puerto Rico",
    "countryCode": "PR",
    "mcc": "310",
    "mnc": "017",
    "brand": "ProxTel",
    "operator": "North Sight Communications Inc.",
    "status": "Not operational",
    "bands": "iDEN",
    "notes": "US MCC; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Puerto Rico",
    "countryCode": "PR",
    "mcc": "310",
    "mnc": "260",
    "brand": "T-Mobile",
    "operator": "T-Mobile US",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / UMTS 1700 / LTE 600 / LTE 1900 / LTE 1700 / 5G 600 / 5G 2500",
    "notes": "US MCC"
  },
  {
    "type": "National",
    "countryName": "Puerto Rico",
    "countryCode": "PR",
    "mcc": "310",
    "mnc": "280",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Former Centennial Puerto Rico; US MCC"
  },
  {
    "type": "National",
    "countryName": "Puerto Rico",
    "countryCode": "PR",
    "mcc": "313",
    "mnc": "510",
    "brand": null,
    "operator": "Puerto Rico Telecom Company",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Uses US MCC"
  },
  {
    "type": "National",
    "countryName": "Puerto Rico",
    "countryCode": "PR",
    "mcc": "313",
    "mnc": "790",
    "brand": "Liberty",
    "operator": "Liberty Cablevision of Puerto Rico LLC",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 1900 / LTE 700 / LTE 850 / LTE 1700 / LTE 1900 / LTE 2300 / 5G 850",
    "notes": "Uses US MCC"
  },
  {
    "type": "National",
    "countryName": "Puerto Rico",
    "countryCode": "PR",
    "mcc": "330",
    "mnc": "000",
    "brand": "Open Mobile",
    "operator": "PR Wireless",
    "status": "Operational",
    "bands": "CDMA 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Puerto Rico",
    "countryCode": "PR",
    "mcc": "330",
    "mnc": "110",
    "brand": "Claro Puerto Rico",
    "operator": "América Móvil",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Puerto Rico",
    "countryCode": "PR",
    "mcc": "330",
    "mnc": "120",
    "brand": "Open Mobile",
    "operator": "PR Wireless",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saint Kitts and Nevis",
    "countryCode": "KN",
    "mcc": "356",
    "mnc": "050",
    "brand": "Digicel",
    "operator": "Wireless Ventures (St Kitts-Nevis) Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saint Kitts and Nevis",
    "countryCode": "KN",
    "mcc": "356",
    "mnc": "070",
    "brand": "FLOW",
    "operator": "UTS",
    "status": "Operational",
    "bands": null,
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saint Kitts and Nevis",
    "countryCode": "KN",
    "mcc": "356",
    "mnc": "110",
    "brand": "FLOW",
    "operator": "Cable & Wireless St. Kitts & Nevis Ltd",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saint Lucia",
    "countryCode": "LC",
    "mcc": "338",
    "mnc": "050",
    "brand": "Digicel",
    "operator": "Digicel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / GSM 1900 / LTE 700",
    "notes": "uses Jamaica MCC"
  },
  {
    "type": "National",
    "countryName": "Saint Lucia",
    "countryCode": "LC",
    "mcc": "358",
    "mnc": "110",
    "brand": "FLOW",
    "operator": "Cable &  Wireless",
    "status": "Operational",
    "bands": "GSM 850 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saint Pierre and Miquelon (France)",
    "countryCode": "PM",
    "mcc": "308",
    "mnc": "01",
    "brand": "Ameris",
    "operator": "St. Pierre-et-Miquelon Télécom",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saint Pierre and Miquelon (France)",
    "countryCode": "PM",
    "mcc": "308",
    "mnc": "02",
    "brand": "GLOBALTEL",
    "operator": "GLOBALTEL",
    "status": "Operational",
    "bands": "GSM 900 / LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saint Pierre and Miquelon (France)",
    "countryCode": "PM",
    "mcc": "308",
    "mnc": "03",
    "brand": "Ameris",
    "operator": "St. Pierre-et-Miquelon Télécom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saint Vincent and the Grenadines",
    "countryCode": "VC",
    "mcc": "360",
    "mnc": "050",
    "brand": "Digicel",
    "operator": "Digicel (St. Vincent and the Grenadines) Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / GSM 1900 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saint Vincent and the Grenadines",
    "countryCode": "VC",
    "mcc": "360",
    "mnc": "100",
    "brand": "Cingular Wireless",
    "operator": null,
    "status": "Unknown",
    "bands": "GSM 850",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saint Vincent and the Grenadines",
    "countryCode": "VC",
    "mcc": "360",
    "mnc": "110",
    "brand": "FLOW",
    "operator": "Cable & Wireless (St. Vincent & the Grenadines) Ltd",
    "status": "Operational",
    "bands": "GSM 850 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Trinidad and Tobago",
    "countryCode": "TT",
    "mcc": "374",
    "mnc": "01",
    "brand": "bmobile",
    "operator": "TSTT",
    "status": "Not operational",
    "bands": "GSM 850 / GSM 1900",
    "notes": "Withdrawn"
  },
  {
    "type": "National",
    "countryName": "Trinidad and Tobago",
    "countryCode": "TT",
    "mcc": "374",
    "mnc": "12",
    "brand": "bmobile",
    "operator": "TSTT",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1900 / TD-LTE 2500 / 5G 2500",
    "notes": "LTE bands 2 / 28 / 41; band 41 used for FWA"
  },
  {
    "type": "National",
    "countryName": "Trinidad and Tobago",
    "countryCode": "TT",
    "mcc": "374",
    "mnc": "13",
    "brand": "Digicel",
    "operator": "Digicel (Trinidad & Tobago) Limited",
    "status": "Not operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900",
    "notes": "Withdrawn"
  },
  {
    "type": "National",
    "countryName": "Trinidad and Tobago",
    "countryCode": "TT",
    "mcc": "374",
    "mnc": "20",
    "brand": "bmobile",
    "operator": "TSTT",
    "status": "Not operational",
    "bands": "GSM 850 / GSM 1900",
    "notes": "Withdrawn"
  },
  {
    "type": "National",
    "countryName": "Trinidad and Tobago",
    "countryCode": "TT",
    "mcc": "374",
    "mnc": "120",
    "brand": "bmobile",
    "operator": "TSTT",
    "status": "Not operational",
    "bands": "GSM 850 / GSM 1900",
    "notes": "Withdrawn"
  },
  {
    "type": "National",
    "countryName": "Trinidad and Tobago",
    "countryCode": "TT",
    "mcc": "374",
    "mnc": "129",
    "brand": "bmobile",
    "operator": "TSTT",
    "status": "Not operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900",
    "notes": "Withdrawn"
  },
  {
    "type": "National",
    "countryName": "Trinidad and Tobago",
    "countryCode": "TT",
    "mcc": "374",
    "mnc": "130",
    "brand": "Digicel",
    "operator": "Digicel (Trinidad & Tobago) Limited",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 1900",
    "notes": "LTE bands 28 / 4 / 2"
  },
  {
    "type": "National",
    "countryName": "Trinidad and Tobago",
    "countryCode": "TT",
    "mcc": "374",
    "mnc": "140",
    "brand": "Laqtel",
    "operator": "LaqTel Ltd.",
    "status": "Not operational",
    "bands": "CDMA",
    "notes": "Shut down 2008; Withdrawn"
  },
  {
    "type": "National",
    "countryName": "Turks and Caicos Islands",
    "countryCode": "TC",
    "mcc": "338",
    "mnc": "050",
    "brand": "Digicel",
    "operator": "Digicel (Turks & Caicos) Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1900 / LTE 700 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Turks and Caicos Islands",
    "countryCode": "TC",
    "mcc": "376",
    "mnc": "350",
    "brand": "FLOW",
    "operator": "Cable & Wireless West Indies Ltd (Turks & Caicos)",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Turks and Caicos Islands",
    "countryCode": "TC",
    "mcc": "376",
    "mnc": "351",
    "brand": "Digicel",
    "operator": "Digicel (Turks & Caicos) Limited",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Turks and Caicos Islands",
    "countryCode": "TC",
    "mcc": "376",
    "mnc": "352",
    "brand": "FLOW",
    "operator": "Cable & Wireless West Indies Ltd (Turks & Caicos)",
    "status": "Not operational",
    "bands": "UMTS 850",
    "notes": "Former IslandCom MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Turks and Caicos Islands",
    "countryCode": "TC",
    "mcc": "376",
    "mnc": "360",
    "brand": "Digicel",
    "operator": "Digicel (Turks & Caicos) Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former IslandCom, Cable & Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "004",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "005",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Operational",
    "bands": "CDMA2000 850 / CDMA2000 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "006",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "010",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former MCI Inc."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "012",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Operational",
    "bands": "LTE 700 / LTE 1700 / LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "013",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former MobileTel, Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "014",
    "brand": null,
    "operator": null,
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "For testing; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "015",
    "brand": "Southern LINC",
    "operator": "Southern Communications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "016",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Not operational",
    "bands": "CDMA2000 1900 / CDMA2000 1700",
    "notes": "Former Cricket Wireless; shut down in September 2015"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "017",
    "brand": "ProxTel",
    "operator": "North Sight Communications Inc.",
    "status": "Not operational",
    "bands": "iDEN",
    "notes": "Puerto Rico; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "020",
    "brand": "Union Wireless",
    "operator": "Union Telephone Company",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "030",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 850",
    "notes": "Former Centennial Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "032",
    "brand": "IT&E Wireless",
    "operator": "IT&E Overseas, Inc",
    "status": "Operational",
    "bands": "CDMA 1900 / GSM 1900 / UMTS 1900 / LTE 700",
    "notes": "Guam"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "033",
    "brand": null,
    "operator": "Guam Telephone Authority",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "034",
    "brand": "Airpeak",
    "operator": "Airpeak",
    "status": "Operational",
    "bands": "iDEN",
    "notes": "Former Nevada Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "035",
    "brand": "ETEX Wireless",
    "operator": "ETEX Communications, LP",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "040",
    "brand": "MTA",
    "operator": "Matanuska Telephone Association, Inc.",
    "status": "Not operational",
    "bands": "CDMA",
    "notes": "Formerly Concho Cellular Telephone Co.; then Alaska, shut down 2017; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "050",
    "brand": "GCI",
    "operator": "Alaska Communications",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Former ACS Wireless Inc."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "053",
    "brand": "Virgin Mobile",
    "operator": "Sprint",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "054",
    "brand": null,
    "operator": "Alltel US",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Uses Sprint's network"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "060",
    "brand": null,
    "operator": "Consolidated Telcom",
    "status": "Not operational",
    "bands": "1900",
    "notes": "North Dakota; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "066",
    "brand": "U.S. Cellular",
    "operator": "U.S. Cellular",
    "status": "Operational",
    "bands": "GSM / CDMA",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "070",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 850",
    "notes": "Former Highland Cellular, Cingular"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "080",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 1900",
    "notes": "Former Corr Wireless Communications LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "090",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 1900",
    "notes": "Former Edge Wireless, Cingular, Cricket Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "100",
    "brand": "Plateau Wireless",
    "operator": "New Mexico RSA 4 East LP",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / UMTS 1700",
    "notes": "Acquired by AT&T"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "110",
    "brand": "IT&E Wireless",
    "operator": "PTI Pacifica Inc.",
    "status": "Operational",
    "bands": "CDMA / GSM 850 / UMTS 1900 / LTE 700",
    "notes": "Northern Mariana Islands"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "120",
    "brand": null,
    "operator": "T-Mobile US",
    "status": "Operational",
    "bands": "CDMA2000 1900 / LTE 850 / LTE 1900",
    "notes": "Former Sprint Corporation"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "130",
    "brand": "Carolina West Wireless",
    "operator": "Carolina West Wireless",
    "status": "Operational",
    "bands": "CDMA2000 1900",
    "notes": "North Carolina"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "140",
    "brand": "GTA Wireless",
    "operator": "Teleguam Holdings, LLC",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1700",
    "notes": "Previously called Guam Telephone Authority mPulse"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "150",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / UMTS 1900",
    "notes": "Originally BellSouth Mobility DCS, then Cingular Wireless, then Aio Wireless, then rebranded as the new GSM Cricket Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "160",
    "brand": "T-Mobile",
    "operator": "T-Mobile US",
    "status": "Operational",
    "bands": "GSM 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "170",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 1900",
    "notes": "Formerly Pacific Bell Wireless, then Cingular Wireless CA/NV known as \"Cingular Orange\""
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "180",
    "brand": "West Central",
    "operator": "West Central Wireless",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / UMTS 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "190",
    "brand": "GCI",
    "operator": "Alaska Communications",
    "status": "Operational",
    "bands": "GSM 850",
    "notes": "Dutch Harbor, Alaska"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "200",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "210",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Iowa"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "220",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Kansas / Oklahoma"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "230",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Utah"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "240",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "New Mexico / Texas / Arizona"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "250",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Hawaii"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "260",
    "brand": "T-Mobile",
    "operator": "T-Mobile US",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / UMTS 1700 / LTE 850 / LTE 700 / LTE 1900 / LTE 1700 / 5G 600",
    "notes": "Former Cook Inlet West Wireless, Voicestream; now universal USA code.  Also used for Mint Mobile, Ting."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "270",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Formerly Powertel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "280",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Former Centennial Puerto Rico"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "290",
    "brand": "nep",
    "operator": "NEP Cellcorp Inc.",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Shut down 22 September 2015"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "300",
    "brand": "Big Sky Mobile",
    "operator": "iSmart Mobile, LLC",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Montana; former Get Mobile Inc., SmartCall, LLC; acquired by T-Mobile in 2017; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "310",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Formerly Aerial Communications"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "311",
    "brand": null,
    "operator": "Farmers Wireless",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "NE Alabama; acquired by AT&T in 2008"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "320",
    "brand": "Cellular One",
    "operator": "Smith Bagley, Inc.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS",
    "notes": "Arizona / New Mexico"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "330",
    "brand": null,
    "operator": "Wireless Partners, LLC",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "Former AN Subsidiary LLC, AWCC, acquired by AT&T, CDMA shut down February 2015"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "340",
    "brand": "Limitless Mobile",
    "operator": "Limitless Mobile, LLC",
    "status": "Operational",
    "bands": "GSM 1900",
    "notes": "Kansas; Former High Plains Midwest LLC dba Westlink Communications, acquired by United Wireless in 2013"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "350",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Not operational",
    "bands": "CDMA",
    "notes": "Former Mohave Cellular L.P."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "360",
    "brand": "Pioneer Cellular",
    "operator": "Cellular Network Partnership",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Oklahoma"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "370",
    "brand": "Docomo",
    "operator": "NTT DoCoMo Pacific",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 850 / LTE 700",
    "notes": "Guam, Northern Mariana Islands; former Guamcell"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "380",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Not operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900",
    "notes": "Former AT&T Wireless Services, then Cingular Wireless (known as \"Cingular Blue\")"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "390",
    "brand": "Cellular One of East Texas",
    "operator": "TX-11 Acquisition, LLC",
    "status": "Operational",
    "bands": "GSM 850 / LTE 700 / CDMA",
    "notes": "Former Yorkville Telephone Cooperative"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "400",
    "brand": "IT&E Wireless",
    "operator": "IT&E Overseas, Inc",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 700",
    "notes": "Guam; former iConnect, Wave Runner LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "410",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900",
    "notes": "Formerly Cingular Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "420",
    "brand": "Cincinnati Bell",
    "operator": "Cincinnati Bell Wireless",
    "status": "Not operational",
    "bands": "GSM 1900 / UMTS 1700",
    "notes": "Shut down 28 February 2015; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "430",
    "brand": "GCI",
    "operator": "GCI Communications Corp.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900",
    "notes": "Former Alaska Digitel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "440",
    "brand": null,
    "operator": "Numerex",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Dobson / Cellular One; M2M only"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "450",
    "brand": "Viaero",
    "operator": "Viaero Wireless",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900",
    "notes": "Formerly North East Cellular Inc., CellONE; Colorado / Kansas / Nebraska"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "460",
    "brand": "Conecto",
    "operator": "NewCore Wireless LLC",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Simmetry / TMP Corporation (shut down 30 June 2012)"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "470",
    "brand": null,
    "operator": "NTT DoCoMo Pacific",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Guam Wireless, nTelos, Shentel, Sprint"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "480",
    "brand": "IT&E Wireless",
    "operator": "IT&E Overseas, Inc",
    "status": "Operational",
    "bands": "iDEN",
    "notes": "Guam; former Choice Phone LLC, iConnect, Wave Runner LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "490",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900",
    "notes": "Former Triton PCS, SunCom"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "500",
    "brand": "Alltel",
    "operator": "Public Service Cellular Inc.",
    "status": "Operational",
    "bands": "CDMA2000 850 / CDMA2000 1900",
    "notes": "Georgia"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "510",
    "brand": "Cellcom",
    "operator": "Nsight",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Formerly Airtel Wireless LLC (iDEN, Montana)"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "520",
    "brand": "TNS",
    "operator": "Transaction Network Services",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Formerly Verisign"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "530",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Formerly West Virginia Wireless, iWireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "540",
    "brand": "Phoenix",
    "operator": "Hilliary Communications",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900",
    "notes": "Oklahoma"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "550",
    "brand": null,
    "operator": "Syniverse Technologies",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Wireless Solutions International"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "560",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Not operational",
    "bands": "GSM 850",
    "notes": "Former Dobson Cellular, Cingular Wireless; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "570",
    "brand": null,
    "operator": "Broadpoint, LLC",
    "status": "Operational",
    "bands": "GSM 850 / LTE 700",
    "notes": "Former TX-10, LLC and Central Louisiana Cellular, LLC (MTPCS) dba Cellular One; Montana network (former Chinook Wireless) shut down in 2014"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "580",
    "brand": null,
    "operator": "Inland Cellular Telephone Company",
    "status": "Operational",
    "bands": "CDMA2000",
    "notes": "Former PCS One"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "590",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "GSM 850 / GSM 1900",
    "notes": "Former Western Wireless Corporation, Alltel, then Verizon"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "591",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "592",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "593",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "594",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "595",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "596",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "597",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "598",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "599",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "600",
    "brand": "Cellcom",
    "operator": "NewCell Inc.",
    "status": "Operational",
    "bands": "CDMA2000 850 / CDMA2000 1900",
    "notes": "Wisconsin"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "610",
    "brand": null,
    "operator": "Mavenir Systems Inc",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Epic PCS, shut down 30 April 2015, sold to PTCI and United Wireless;"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "620",
    "brand": "Cellcom",
    "operator": "Nsighttel Wireless LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Formerly Coleman County Telecom"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "630",
    "brand": "miSpot",
    "operator": "Agri-Valley Communications",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "Shut down 30 November 2014"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "640",
    "brand": null,
    "operator": "Numerex",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "M2M only; formerly Einstein PCS, AirFire / Airadigm, shut down 2 September 2014"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "650",
    "brand": "Jasper",
    "operator": "Jasper Technologies",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "M2M only"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "660",
    "brand": "T-Mobile",
    "operator": null,
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Formerly DigiPhone PCS / DigiPH"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "670",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Northstar"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "680",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900",
    "notes": "Formerly Cellular One DCS, NPI Wireless, Cingular"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "690",
    "brand": "Limitless Mobile",
    "operator": "Limitless Mobile, LLC",
    "status": "Operational",
    "bands": "GSM 1900 / LTE 1900",
    "notes": "Pennsylvania; former Conestoga Wireless, Keystone Wireless d/b/a Immix Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "700",
    "brand": "Bigfoot Cellular",
    "operator": "Cross Valiant Cellular Partnership",
    "status": "Unknown",
    "bands": "GSM",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "710",
    "brand": "ASTAC",
    "operator": "Arctic Slope Telephone Association Cooperative",
    "status": "Operational",
    "bands": "UMTS 850 / LTE",
    "notes": "Alaska; GSM shut down January 2017"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "720",
    "brand": null,
    "operator": "Syniverse Technologies",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Wireless Solutions International"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "730",
    "brand": "U.S. Cellular",
    "operator": "U.S. Cellular",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Formerly Sea Mobile"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "740",
    "brand": "Viaero",
    "operator": "Viaero Wireless",
    "status": "Operational",
    "bands": "LTE 700 / LTE 1700 / LTE 1900",
    "notes": "Former Telemetrix Technologies, Convey Communications Inc., Green Eagle Communications, Inc."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "750",
    "brand": "Appalachian Wireless",
    "operator": "East Kentucky Network, LLC",
    "status": "Operational",
    "bands": "CDMA2000 850 / CDMA2000 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "760",
    "brand": null,
    "operator": "Lynch 3G Communications Corporation",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "770",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former iWireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "780",
    "brand": "Dispatch Direct",
    "operator": "D. D. Inc.",
    "status": "Not operational",
    "bands": "iDEN",
    "notes": "Former Airlink PCS, Connect Net Inc.; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "790",
    "brand": "BLAZE",
    "operator": "PinPoint Communications Inc.",
    "status": "Not operational",
    "bands": "GSM 1900 / UMTS / LTE",
    "notes": "Nebraska; discontinued Dec 2019"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "800",
    "brand": null,
    "operator": "T-Mobile",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Formerly SOL Communications"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "810",
    "brand": null,
    "operator": "Pacific Lightwave Inc.",
    "status": "Unknown",
    "bands": "1900",
    "notes": "Formerly Brazos Cellular Communications Ltd., LCFR LLC (owned by New Dimension Wireless);"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "820",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former South Canaan Cellular"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "830",
    "brand": null,
    "operator": "T-Mobile US",
    "status": "Not operational",
    "bands": "WiMAX",
    "notes": "Former Caprock Cellular (GSM, sold to AT&T in 2010), Clearwire, Sprint Corporation"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "840",
    "brand": "telna Mobile",
    "operator": "Telecom North America Mobile, Inc.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Formerly Edge Mobile LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "850",
    "brand": "Aeris",
    "operator": "Aeris Communications, Inc.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "M2M only; is a Full MVNO despite marketing claims to the contrary"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "860",
    "brand": "Five Star Wireless",
    "operator": "TX RSA 15B2, LP",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Owned by West Central Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "870",
    "brand": "PACE",
    "operator": "Kaplan Telephone Company",
    "status": "Not operational",
    "bands": "GSM 850",
    "notes": "Louisiana; spectrum sold to AT&T in 2014; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "880",
    "brand": "DTC Wireless",
    "operator": "Advantage Cellular Systems, Inc.",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Tennessee; owned by DeKalb Telephone Cooperative; fixed wireless only, GSM 850 discontinued January 2017"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "890",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "GSM 850 / GSM 1900",
    "notes": "Former Unicel / Rural Cellular Corporation"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "891",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "892",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "893",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "894",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "895",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "896",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "897",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "898",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "899",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "900",
    "brand": "Mid-Rivers Wireless",
    "operator": "Cable & Communications Corporation",
    "status": "Operational",
    "bands": "CDMA2000 850 / CDMA2000 1900",
    "notes": "Montana; network to shut down 1 August 2019"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "910",
    "brand": null,
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "GSM 850",
    "notes": "Former First Cellular of Southern Illinois, Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "920",
    "brand": null,
    "operator": "James Valley Wireless, LLC",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "South Dakota; includes NVC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "930",
    "brand": null,
    "operator": "Copper Valley Wireless",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Alaska"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "940",
    "brand": null,
    "operator": "Tyntec Inc.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": "Formerly Poka Lambro Telecommunications Ltd., Iris Wireless LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "950",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 850",
    "notes": "Former Texas RSA 1 d/b/a XIT Cellular"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "960",
    "brand": "STRATA",
    "operator": "UBET Wireless",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Utah"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "970",
    "brand": null,
    "operator": "Globalstar",
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "980",
    "brand": "Peoples Telephone",
    "operator": "Texas RSA 7B3",
    "status": "Not operational",
    "bands": "CDMA / LTE 700",
    "notes": "Texas; spectrum sold to AT&T; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "310",
    "mnc": "990",
    "brand": "Evolve Broadband",
    "operator": "Evolve Cellular Inc.",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "LTE band 17; former Worldcall Interconnect Inc."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "000",
    "brand": "West Central Wireless",
    "operator": "Mid-Tex Cellular Ltd.",
    "status": "Operational",
    "bands": "CDMA2000 850 / CDMA2000 1900",
    "notes": "Texas"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "010",
    "brand": "Chariton Valley",
    "operator": "Chariton Valley Communications",
    "status": "Operational",
    "bands": "CDMA2000 850 / CDMA2000 1900",
    "notes": "Missouri; being acquired by Verizon Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "012",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Operational",
    "bands": "CDMA2000 850 / CDMA2000 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "020",
    "brand": "Chariton Valley",
    "operator": "Missouri RSA 5 Partnership",
    "status": "Operational",
    "bands": "GSM 850",
    "notes": "Missouri; being acquired by Verizon Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "030",
    "brand": "Indigo Wireless",
    "operator": "Americell PA 3 Partnership",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850",
    "notes": "Pennsylvania"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "040",
    "brand": "Choice Wireless",
    "operator": "Commnet Wireless",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / CDMA 2000 / UMTS",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "050",
    "brand": null,
    "operator": "Thumb Cellular LP",
    "status": "Operational",
    "bands": "CDMA2000 850",
    "notes": "Michigan"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "060",
    "brand": null,
    "operator": "Space Data Corporation",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Former Farmers Cellular Telephone Inc."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "070",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 850",
    "notes": "Former Easterbrooke Cellular Corporation, Wisconsin RSA #7 Limited Partnership"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "080",
    "brand": "Pine Cellular",
    "operator": "Pine Telephone Company",
    "status": "Operational",
    "bands": "GSM 850 / LTE",
    "notes": "Oklahoma"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "090",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 1900",
    "notes": "Former Siouxland PCS, Long Lines Wireless, acquired by AT&T Dec. 2013"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "100",
    "brand": null,
    "operator": "Nex-Tech Wireless",
    "status": "Operational",
    "bands": "CDMA2000",
    "notes": "Kansas; former High Plains Wireless L.P."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "110",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former High Plains Wireless L.P., Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "120",
    "brand": "IT&E Wireless",
    "operator": "IT&E Overseas, Inc",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Guam; former Choice Phone LLC, iConnect, Wave Runner LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "130",
    "brand": null,
    "operator": "Black & Veatch",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Cell One Amarillo (Amarillo License L.P.), Lightsquared"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "140",
    "brand": "Bravado Wireless",
    "operator": "Cross Telephone Company",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Oklahoma; former MBO Wireless, Sprocket Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "150",
    "brand": null,
    "operator": "Wilkes Cellular",
    "status": "Operational",
    "bands": "GSM 850",
    "notes": "Georgia"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "160",
    "brand": null,
    "operator": "Lightsquared L.P.",
    "status": "Not operational",
    "bands": "LTE",
    "notes": "Former Endless Mountains Wireless (acquired by Dobson Cellular in 2005) MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "170",
    "brand": null,
    "operator": "Tampnet",
    "status": "Operational",
    "bands": "GSM 850 / LTE",
    "notes": "Gulf of Mexico; former PetroCom, Broadpoint Inc."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "180",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Not operational",
    "bands": "GSM 850 / UMTS 850 / UMTS 1900",
    "notes": "Former Pacific Telesis, Cingular Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "190",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Cellular Properties Inc."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "200",
    "brand": null,
    "operator": "Dish Wireless",
    "status": "Unknown",
    "bands": "5G",
    "notes": "Former ARINC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "210",
    "brand": null,
    "operator": "Telnyx LLC",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Farmers Cellular Telephone, Emery Telcom Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "220",
    "brand": "U.S. Cellular",
    "operator": "U.S. Cellular",
    "status": "Operational",
    "bands": "CDMA",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "230",
    "brand": "C Spire",
    "operator": "Cellular South Inc.",
    "status": "Operational",
    "bands": "CDMA 850 / CDMA 1900 / LTE 700 / LTE 850 / LTE 1700 / LTE 1900 / TD-LTE 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "240",
    "brand": null,
    "operator": "Cordova Wireless",
    "status": "Operational",
    "bands": "GSM / UMTS 850 / WiMAX",
    "notes": "Alaska"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "250",
    "brand": "IT&E Wireless",
    "operator": "IT&E Overseas, Inc",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Guam; former iConnect, Wave Runner LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "260",
    "brand": null,
    "operator": "T-Mobile US",
    "status": "Not operational",
    "bands": "WiMAX",
    "notes": "Former CellularOne of San Luis Obispo (sold to AT&T in 2010, Clearwire, Sprint Corporation"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "270",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "271",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "272",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "273",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "274",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "275",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "276",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "277",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "278",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "279",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "280",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "281",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "282",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "283",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "284",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "285",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "286",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "287",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "288",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "289",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "290",
    "brand": "BLAZE",
    "operator": "PinPoint Communications Inc.",
    "status": "Not operational",
    "bands": "GSM 1900 / UMTS / LTE",
    "notes": "Nebraska; discontinued Dec 2020; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "300",
    "brand": null,
    "operator": "Nexus Communications, Inc.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former Rutal Cellular Corporation; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "310",
    "brand": "NMobile",
    "operator": "Leaco Rural Telephone Company Inc.",
    "status": "Not operational",
    "bands": "CDMA2000",
    "notes": "New Mexico; shut down June 2018"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "320",
    "brand": "Choice Wireless",
    "operator": "Commnet Wireless",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / CDMA 2000 / UMTS",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "330",
    "brand": "Bug Tussel Wireless",
    "operator": "Bug Tussel Wireless LLC",
    "status": "Operational",
    "bands": "GSM 1900 / LTE 1700 / WiMAX 3700",
    "notes": "Wisconsin"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "340",
    "brand": null,
    "operator": "Illinois Valley Cellular",
    "status": "Operational",
    "bands": "CDMA2000 / LTE 850",
    "notes": "Illinois"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "350",
    "brand": "Nemont",
    "operator": "Sagebrush Cellular, Inc.",
    "status": "Operational",
    "bands": "CDMA2000",
    "notes": "Former Torrestar Networks Inc.; Montana"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "360",
    "brand": null,
    "operator": "Stelera Wireless",
    "status": "Not operational",
    "bands": "UMTS 1700",
    "notes": "shut down 30 April 2013"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "370",
    "brand": "GCI Wireless",
    "operator": "General Communication Inc.",
    "status": "Operational",
    "bands": "LTE 1700",
    "notes": "Former Alaska Communications"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "380",
    "brand": null,
    "operator": "New Dimension Wireless Ltd.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "390",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Midwest Wireless Holdings LLC, Alltel"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "400",
    "brand": null,
    "operator": null,
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Salmon PCS LLC, New Cingular Wireless PCS LLC; for testing"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "410",
    "brand": "Chat Mobility",
    "operator": "Iowa RSA No. 2 LP",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Iowa"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "420",
    "brand": "NorthwestCell",
    "operator": "Northwest Missouri Cellular LP",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Missouri"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "430",
    "brand": "Chat Mobility",
    "operator": "RSA 1 LP",
    "status": "Unknown",
    "bands": "CDMA",
    "notes": "Former Cellular 29 Plus; acquired by Chat Mobility in 2009; Iowa"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "440",
    "brand": null,
    "operator": "Bluegrass Cellular LLC",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Kentucky"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "450",
    "brand": "PTCI",
    "operator": "Panhandle Telecommunication Systems Inc.",
    "status": "Operational",
    "bands": "GSM 1900 / LTE 700",
    "notes": "Also known as Panhandle Telephone Cooperative, Inc.; Oklahoma"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "460",
    "brand": null,
    "operator": "Electric Imp Inc.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former Fisher Wireless Services Inc.; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "470",
    "brand": "Viya",
    "operator": "Vitelcom Cellular Inc.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / TD-LTE 2500",
    "notes": "Former Innovative Wireless; US Virgin Islands"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "480",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "C Block"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "481",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "C Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "482",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "C Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "483",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "C Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "484",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "C Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "485",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "C Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "486",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "C Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "487",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "C Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "488",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "C Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "489",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "C Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "490",
    "brand": null,
    "operator": "T-Mobile US",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1900 / TD-LTE 2500",
    "notes": "Former Wirefree Partners LLC, acquired by Sprint in 2010; LTE bands 25, 26, 41"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "500",
    "brand": null,
    "operator": "Mosaic Telecom",
    "status": "Not operational",
    "bands": "UMTS / LTE 700 / LTE 1700",
    "notes": "Former CTC Telecom Inc.; discontinued cellular service in 2016; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "510",
    "brand": null,
    "operator": "Ligado Networks",
    "status": "Not operational",
    "bands": "LTE",
    "notes": "Former Benton-Lian Wireless, Lightsquared L.P."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "520",
    "brand": null,
    "operator": "Lightsquared L.P.",
    "status": "Not operational",
    "bands": "LTE",
    "notes": "Former Crossroads Wireless Inc.; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "530",
    "brand": "NewCore",
    "operator": "NewCore Wireless LLC",
    "status": "Operational",
    "bands": "LTE 1900",
    "notes": "Former Wireless Communications Venture"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "540",
    "brand": null,
    "operator": "Coeur Rochester, Inc",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Keystone Wireless, Proximiti Mobility"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "550",
    "brand": "Choice Wireless",
    "operator": "Commnet Wireless LLC",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / CDMA 2000 / UMTS",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "560",
    "brand": "OTZ Cellular",
    "operator": "OTZ Communications, Inc.",
    "status": "Operational",
    "bands": "GSM 850",
    "notes": "Alaska"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "570",
    "brand": null,
    "operator": "Mediacom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former BendBroadband, shut down 25-July-2014;"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "580",
    "brand": "U.S. Cellular",
    "operator": "U.S. Cellular",
    "status": "Operational",
    "bands": "LTE 700 / LTE 850",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "590",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former California RSA No3 Ltd Partnership d/b/a Golden State Cellular, acquired by Verizon in 2014"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "600",
    "brand": "Limitless Mobile",
    "operator": "Limitless Mobile, LLC",
    "status": "Operational",
    "bands": "LTE 1900",
    "notes": "Former Cox Wireless, shut down in 2012"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "610",
    "brand": "SRT Communications",
    "operator": "North Dakota Network Co.",
    "status": "Not operational",
    "bands": "CDMA",
    "notes": "North Dakota; shut down in 2017"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "620",
    "brand": null,
    "operator": "TerreStar Networks, Inc.",
    "status": "Not operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "630",
    "brand": "C Spire",
    "operator": "Cellular South Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Corr Wireless Communications"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "640",
    "brand": "Rock Wireless",
    "operator": "Standing Rock Telecommunications",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "A Block; covering an American Indian reservation straddling remote parts of North and South Dakota"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "650",
    "brand": "United Wireless",
    "operator": "United Wireless",
    "status": "Operational",
    "bands": "CDMA / LTE 700 / WiMAX 3700",
    "notes": "Kansas"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "660",
    "brand": "Metro",
    "operator": "Metro by T-Mobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former MetroPCS; CDMA2000 1900 / CDMA2000 1700 shut down in 2015; LTE 1700 merged with T-Mobile US"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "670",
    "brand": "Pine Belt Wireless",
    "operator": "Pine Belt Cellular Inc.",
    "status": "Operational",
    "bands": "CDMA / LTE 700",
    "notes": "Alabama"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "680",
    "brand": null,
    "operator": "GreenFly LLC",
    "status": "Unknown",
    "bands": "GSM 1900",
    "notes": "Iowa"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "690",
    "brand": null,
    "operator": "TeleBEEPER of New Mexico",
    "status": "Operational",
    "bands": "paging",
    "notes": "New Mexico; 850 MHz band never used"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "700",
    "brand": null,
    "operator": "Midwest Network Solutions Hub LLC",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "Former TotalSolutions Telecom LLC, Aspenta International, Inc.; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "710",
    "brand": null,
    "operator": "Northeast Wireless Networks LLC",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "720",
    "brand": null,
    "operator": "MainePCS LLC",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Bankrupt in 2009"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "730",
    "brand": null,
    "operator": "Proximiti Mobility Inc.",
    "status": "Not operational",
    "bands": "GSM 850",
    "notes": "Former Keystone Wireless; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "740",
    "brand": null,
    "operator": "Telalaska Cellular",
    "status": "Operational",
    "bands": "GSM 850 / LTE",
    "notes": "Alaska"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "750",
    "brand": "ClearTalk",
    "operator": "Flat Wireless LLC",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former NetAmerica Alliance; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "760",
    "brand": null,
    "operator": "Edigen Inc.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "770",
    "brand": null,
    "operator": "Altiostar Networks, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Geneseo Communications Services Inc., Radio Mobile Access Inc."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "780",
    "brand": "ASTCA",
    "operator": "American Samoa Telecommunications Authority",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Former Cellular Network Partnership d/b/a Pioneer Cellular;"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "790",
    "brand": null,
    "operator": "Coleman County Telephone Cooperative, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Cellular Network Partnership d/b/a Pioneer Cellular"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "800",
    "brand": null,
    "operator": "Bluegrass Cellular LLC",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Kentucky"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "810",
    "brand": null,
    "operator": "Bluegrass Cellular LLC",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Kentucky"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "820",
    "brand": null,
    "operator": "Sonus Networks",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Kineto Wireless Inc."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "830",
    "brand": null,
    "operator": "Thumb Cellular LP",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Michigan"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "840",
    "brand": "Cellcom",
    "operator": "Nsight",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Wisconsin"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "850",
    "brand": "Cellcom",
    "operator": "Nsight",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Wisconsin"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "860",
    "brand": "STRATA",
    "operator": "Uintah Basin Electronic Telecommunications",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Utah"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "870",
    "brand": "Boost Mobile",
    "operator": "Dish Wireless",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Sprint Corporation"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "880",
    "brand": null,
    "operator": "T-Mobile US",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Sprint Corporation"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "882",
    "brand": null,
    "operator": "T-Mobile US",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Sprint Corporation"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "890",
    "brand": null,
    "operator": "Globecomm Network Services Corporation",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "900",
    "brand": null,
    "operator": "GigSky",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "910",
    "brand": "MobileNation",
    "operator": "SI Wireless LLC",
    "status": "Not operational",
    "bands": "CDMA / LTE",
    "notes": "Tennessee; shut down Jan 2020; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "920",
    "brand": "Chariton Valley",
    "operator": "Missouri RSA 5 Partnership",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Missouri; being acquired by Verizon Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "930",
    "brand": null,
    "operator": "Cox Communications",
    "status": "Unknown",
    "bands": "Unknown 3500",
    "notes": "Former Cablevision Systems Corporation, Syringa Wireless (shut down Dec 2015)"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "940",
    "brand": null,
    "operator": "T-Mobile US",
    "status": "Not operational",
    "bands": "WiMAX",
    "notes": "Former Clearwire, Sprint Corporation"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "950",
    "brand": "ETC",
    "operator": "Enhanced Telecommmunications Corp.",
    "status": "Operational",
    "bands": "CDMA / LTE 700",
    "notes": "Former Sunman Telecommunications Corp.; Indiana; fixed broadband"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "960",
    "brand": "Lycamobile",
    "operator": "Lycamobile USA Inc.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "used T-Mobile; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "970",
    "brand": "Big River Broadband",
    "operator": "Big River Broadband, LLC",
    "status": "Operational",
    "bands": "LTE 1700",
    "notes": "Utilizing 20 MHz in A block"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "980",
    "brand": null,
    "operator": "LigTel Communications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "311",
    "mnc": "990",
    "brand": null,
    "operator": "VTel Wireless",
    "status": "Operational",
    "bands": "LTE 700 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "010",
    "brand": "Chariton Valley",
    "operator": "Chariton Valley Communications Corporation, Inc",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Missouri; being acquired by Verizon Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "020",
    "brand": null,
    "operator": "Infrastructure Networks, LLC",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Focused on oil & gas industries"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "030",
    "brand": "Bravado Wireless",
    "operator": "Cross Wireless",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Oklahoma; former MBO Wireless, Sprocket Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "040",
    "brand": null,
    "operator": "Custer Telephone Co-op (CTCI)",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Idaho"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "050",
    "brand": null,
    "operator": "Fuego Wireless",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "fixed broadband; New Mexico; shut down in 2016, spectrum sold to AT&T and Infrastructure Networks; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "060",
    "brand": null,
    "operator": "CoverageCo",
    "status": "Not operational",
    "bands": "CDMA / GSM",
    "notes": "Vermont MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "070",
    "brand": null,
    "operator": "Adams Networks Inc",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "C block fixed broadband; Illinois; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "080",
    "brand": "SyncSouth",
    "operator": "South Georgia Regional Information Technology Authority",
    "status": "Operational",
    "bands": "UMTS-TDD 700",
    "notes": "LTE 700 planned"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "090",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Allied Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "100",
    "brand": null,
    "operator": "ClearSky Technologies, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "110",
    "brand": null,
    "operator": "Texas Energy Network LLC",
    "status": "Not operational",
    "bands": "LTE",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "120",
    "brand": "Appalachian Wireless",
    "operator": "East Kentucky Network, LLC",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "130",
    "brand": "Appalachian Wireless",
    "operator": "East Kentucky Network, LLC",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "140",
    "brand": "Revol Wireless",
    "operator": "Cleveland Unlimited, Inc.",
    "status": "Not operational",
    "bands": "CDMA",
    "notes": "Shut down 2014, acquired by Sprint; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "150",
    "brand": "NorthwestCell",
    "operator": "Northwest Missouri Cellular LP",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Missouri"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "160",
    "brand": "Chat Mobility",
    "operator": "RSA1 Limited Partnership",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Iowa"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "170",
    "brand": "Chat Mobility",
    "operator": "Iowa RSA No. 2 LP",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Iowa"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "180",
    "brand": null,
    "operator": "Limitless Mobile LLC",
    "status": "Operational",
    "bands": "LTE 1900",
    "notes": "Former Keystone Wireless LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "190",
    "brand": null,
    "operator": "T-Mobile US",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Sprint Corporation"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "200",
    "brand": null,
    "operator": "Voyager Mobility LLC",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "Shut down 2015; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "210",
    "brand": null,
    "operator": "Aspenta International, Inc.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "220",
    "brand": "Chariton Valley",
    "operator": "Chariton Valley Communications Corporation, Inc.",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "being acquired by Verizon Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "230",
    "brand": "SRT Communications",
    "operator": "North Dakota Network Co.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "North Dakota; shut down in 2017"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "240",
    "brand": "Sprint",
    "operator": "Sprint Corporation",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Former Clearwire; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "250",
    "brand": null,
    "operator": "T-Mobile US",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Clearwire, Sprint Corporation"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "260",
    "brand": "NewCore",
    "operator": "Central LTE Holdings",
    "status": "Operational",
    "bands": "LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "270",
    "brand": "Pioneer Cellular",
    "operator": "Cellular Network Partnership",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Oklahoma"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "280",
    "brand": "Pioneer Cellular",
    "operator": "Cellular Network Partnership",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Oklahoma"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "290",
    "brand": "STRATA",
    "operator": "Uintah Basin Electronic Telecommunications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "300",
    "brand": "telna Mobile",
    "operator": "Telecom North America Mobile, Inc.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "310",
    "brand": null,
    "operator": "Clear Stream Communications, LLC",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "North Carolina; owned by Carolina West Wireless, Wilkes Communications"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "320",
    "brand": null,
    "operator": "RTC Communications LLC",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Indiana; former S and R Communications LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "330",
    "brand": "Nemont",
    "operator": "Nemont Communications, Inc.",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Montana"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "340",
    "brand": "MTA",
    "operator": "Matanuska Telephone Association, Inc.",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "Alaska; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "350",
    "brand": null,
    "operator": "Triangle Communication System Inc.",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Montana; being acquired by Verizon Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "360",
    "brand": null,
    "operator": "Wes-Tex Telecommunications, Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Texas"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "370",
    "brand": "Choice Wireless",
    "operator": "Commnet Wireless",
    "status": "Operational",
    "bands": "LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "380",
    "brand": null,
    "operator": "Copper Valley Wireless",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Alaska"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "390",
    "brand": "FTC Wireless",
    "operator": "FTC Communications LLC",
    "status": "Operational",
    "bands": "UMTS / LTE",
    "notes": "South Carolina; owned by Farmers Telephone Cooperative"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "400",
    "brand": "Mid-Rivers Wireless",
    "operator": "Mid-Rivers Telephone Cooperative",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Montana; network to shut down 1 August 2019"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "410",
    "brand": null,
    "operator": "Eltopia Communications, LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "420",
    "brand": null,
    "operator": "Nex-Tech Wireless",
    "status": "Operational",
    "bands": "LTE 700 / 5G 600",
    "notes": "Kansas"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "430",
    "brand": null,
    "operator": "Silver Star Communications",
    "status": "Operational",
    "bands": "CDMA / LTE 700",
    "notes": "Wyoming"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "440",
    "brand": null,
    "operator": "Kajeet, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Consolidated Telcom"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "450",
    "brand": null,
    "operator": "Cable & Communications Corporation",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "460",
    "brand": null,
    "operator": "Ketchikan Public Utilities (KPU)",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Alaska"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "470",
    "brand": "Carolina West Wireless",
    "operator": "Carolina West Wireless",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "North Carolina"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "480",
    "brand": "Nemont",
    "operator": "Sagebrush Cellular, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "490",
    "brand": null,
    "operator": "TrustComm, Inc.",
    "status": "Not operational",
    "bands": "Satellite",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "500",
    "brand": null,
    "operator": "AB Spectrum LLC",
    "status": "Not operational",
    "bands": "LTE 700",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "510",
    "brand": null,
    "operator": "WUE Inc.",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "Nevada; CDMA shut down"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "520",
    "brand": null,
    "operator": "ANIN",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "530",
    "brand": null,
    "operator": "T-Mobile US",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Former Sprint Corporation"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "540",
    "brand": null,
    "operator": "Broadband In Hand LLC",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "550",
    "brand": null,
    "operator": "Great Plains Communications, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "560",
    "brand": null,
    "operator": "NHLT Inc.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "570",
    "brand": "Blue Wireless",
    "operator": "Buffalo-Lake Erie Wireless Systems Co., LLC",
    "status": "Not operational",
    "bands": "CDMA / LTE",
    "notes": "shut down July 2020"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "580",
    "brand": null,
    "operator": "Google LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Shuttle Wireless Solutions Inc., Bingham McCutchen LLP, Morgan, Lewis & Bockius"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "590",
    "brand": "NMU",
    "operator": "Northern Michigan University",
    "status": "Operational",
    "bands": "LTE 2600",
    "notes": "EBS Band (LTE band 7)"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "600",
    "brand": "Nemont",
    "operator": "Sagebrush Cellular, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "610",
    "brand": null,
    "operator": "ShawnTech Communications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former nTelos"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "620",
    "brand": null,
    "operator": "GlobeTouch Inc.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Fogg Mobile, Inc."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "630",
    "brand": null,
    "operator": "NetGenuity, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "640",
    "brand": "Nemont",
    "operator": "Sagebrush Cellular, Inc.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "650",
    "brand": null,
    "operator": "Brightlink",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former 365 Wireless LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "660",
    "brand": "nTelos",
    "operator": "nTelos Wireless",
    "status": "Not operational",
    "bands": "LTE 1900",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "670",
    "brand": "FirstNet",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "680",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "690",
    "brand": null,
    "operator": "TGS, LLC",
    "status": "Operational",
    "bands": "MVNO/MVNE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "700",
    "brand": null,
    "operator": "Wireless Partners, LLC",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Maine"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "710",
    "brand": null,
    "operator": "Great North Woods Wireless LLC",
    "status": "Operational",
    "bands": "LTE",
    "notes": "New Hampshire; former Wireless Partners, LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "720",
    "brand": "Southern LINC",
    "operator": "Southern Communications Services",
    "status": "Operational",
    "bands": "LTE 850",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "730",
    "brand": null,
    "operator": "Triangle Communication System Inc.",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Montana; being acquired by Verizon Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "740",
    "brand": "Locus Telecommunications",
    "operator": "KDDI America, Inc.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "750",
    "brand": null,
    "operator": "Artemis Networks LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "760",
    "brand": "ASTAC",
    "operator": "Arctic Slope Telephone Association Cooperative",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Alaska"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "770",
    "brand": "Verizon",
    "operator": "Verizon Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "780",
    "brand": null,
    "operator": "Redzone Wireless",
    "status": "Operational",
    "bands": "TD-LTE 2500",
    "notes": "LTE band 41; Maine"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "790",
    "brand": null,
    "operator": "Gila Electronics",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "800",
    "brand": null,
    "operator": "Cirrus Core Networks",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "810",
    "brand": "BBCP",
    "operator": "Bristol Bay Telephone Cooperative",
    "status": "Operational",
    "bands": "CDMA / LTE",
    "notes": "Alaska"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "820",
    "brand": null,
    "operator": "Santel Communications Cooperative, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "South Dakota"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "830",
    "brand": null,
    "operator": "Kings County Office of Education",
    "status": "Operational",
    "bands": "WiMAX",
    "notes": "California"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "840",
    "brand": null,
    "operator": "South Georgia Regional Information Technology Authority",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Georgia"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "850",
    "brand": null,
    "operator": "Onvoy Spectrum, LLC",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": "Former Emergency Networks LLC"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "860",
    "brand": "ClearTalk",
    "operator": "Flat Wireless, LLC",
    "status": "Not operational",
    "bands": "CDMA / LTE 1900 / LTE 1700",
    "notes": "Texas; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "870",
    "brand": null,
    "operator": "GigSky Mobile, LLC",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "880",
    "brand": null,
    "operator": "Albemarle County Public Schools",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "890",
    "brand": null,
    "operator": "Circle Gx",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "900",
    "brand": "ClearTalk",
    "operator": "Flat West Wireless, LLC",
    "status": "Operational",
    "bands": "CDMA / LTE 1900 / LTE 1700",
    "notes": "Arizona, California"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "910",
    "brand": "Appalachian Wireless",
    "operator": "East Kentucky Network, LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "920",
    "brand": null,
    "operator": "Northeast Wireless Networks LLC",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "930",
    "brand": null,
    "operator": "Hewlett-Packard Communication Services, LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "940",
    "brand": null,
    "operator": "Webformix",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Oregon"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "950",
    "brand": null,
    "operator": "Custer Telephone Co-op (CTCI)",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Idaho"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "960",
    "brand": null,
    "operator": "M&A Technology, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "970",
    "brand": null,
    "operator": "IOSAZ Intellectual Property LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "980",
    "brand": null,
    "operator": "Mark Twain Communications Company",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "312",
    "mnc": "990",
    "brand": "Premier Broadband",
    "operator": "Premier Holdings LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "000",
    "brand": null,
    "operator": "Tennessee Wireless",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "010",
    "brand": "Bravado Wireless",
    "operator": "Cross Wireless LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Sprocket Wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "020",
    "brand": "CTC Wireless",
    "operator": "Cambridge Telephone Company Inc.",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Idaho"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "030",
    "brand": null,
    "operator": "AT&T Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Snake River PCS"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "040",
    "brand": "NNTC Wireless",
    "operator": "Nucla-Naturita Telephone Company",
    "status": "Operational",
    "bands": "CDMA",
    "notes": "Colorado"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "050",
    "brand": "Breakaway Wireless",
    "operator": "Manti Tele Communications Company, Inc.",
    "status": "Not operational",
    "bands": "CDMA",
    "notes": "Utah; shut down 2018; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "060",
    "brand": null,
    "operator": "Country Wireless",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Wisconsin"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "061",
    "brand": null,
    "operator": "Country Wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "070",
    "brand": null,
    "operator": "Midwest Network Solutions Hub LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "080",
    "brand": null,
    "operator": "Speedwavz LLP",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Ohio"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "090",
    "brand": null,
    "operator": "Vivint Wireless, Inc.",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "100",
    "brand": "FirstNet",
    "operator": "AT&T FirstNet",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "D Block"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "110",
    "brand": "FirstNet",
    "operator": "AT&T FirstNet",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "D Block"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "120",
    "brand": "FirstNet",
    "operator": "AT&T FirstNet",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "D Block"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "130",
    "brand": "FirstNet",
    "operator": "AT&T FirstNet",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "D Block"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "140",
    "brand": "FirstNet",
    "operator": "AT&T FirstNet",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "D Block"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "150",
    "brand": "FirstNet",
    "operator": "700 MHz Public Safety Broadband",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "D Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "160",
    "brand": "FirstNet",
    "operator": "700 MHz Public Safety Broadband",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "D Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "170",
    "brand": "FirstNet",
    "operator": "700 MHz Public Safety Broadband",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "D Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "180",
    "brand": "FirstNet",
    "operator": "700 MHz Public Safety Broadband",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "D Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "190",
    "brand": "FirstNet",
    "operator": "700 MHz Public Safety Broadband",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "D Block for future use"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "200",
    "brand": null,
    "operator": "Mercury Network Corporation",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Michigan"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "210",
    "brand": "AT&T",
    "operator": "AT&T Mobility",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "220",
    "brand": null,
    "operator": "Custer Telephone Co-op (CTCI)",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "230",
    "brand": null,
    "operator": "Velocity Communications Inc.",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "Montana"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "240",
    "brand": "Peak Internet",
    "operator": "Fundamental Holdings, Corp.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Colorado"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "250",
    "brand": null,
    "operator": "Imperial County Office of Education",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "California"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "260",
    "brand": null,
    "operator": "Expeto Wireless Inc.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "270",
    "brand": null,
    "operator": "Blackstar Management",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "280",
    "brand": null,
    "operator": "King Street Wireless, LP",
    "status": "Unknown",
    "bands": "LTE 700",
    "notes": "Fixed wireless; mobile service through U.S. Cellular"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "290",
    "brand": null,
    "operator": "Gulf Coast Broadband LLC",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "Fixed wireless; Louisiana"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "300",
    "brand": null,
    "operator": "Cambio WiFi of Delmarva, LLC",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Maryland"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "310",
    "brand": null,
    "operator": "CAL.NET, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "320",
    "brand": null,
    "operator": "Paladin Wireless",
    "status": "Unknown",
    "bands": "LTE 3500",
    "notes": "Fixed wireless; Georgia"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "330",
    "brand": null,
    "operator": "CenturyTel Broadband Services LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "340",
    "brand": "Dish",
    "operator": "Dish Wireless",
    "status": "Operational",
    "bands": "5G 600 / 5G 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "350",
    "brand": "Dish",
    "operator": "Dish Wireless",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "360",
    "brand": "Dish",
    "operator": "Dish Wireless",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "370",
    "brand": null,
    "operator": "Red Truck Wireless, LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Fixed wireless"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "380",
    "brand": null,
    "operator": "OptimERA Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "390",
    "brand": null,
    "operator": "Altice USA Wireless, Inc.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "400",
    "brand": null,
    "operator": "Texoma Communications, LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "410",
    "brand": null,
    "operator": "pdvWireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "420",
    "brand": null,
    "operator": "Hudson Valley Wireless",
    "status": "Unknown",
    "bands": "LTE 3500",
    "notes": "CBRS fixed wireless; New York"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "440",
    "brand": null,
    "operator": "Arvig Enterprises, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Minnesota"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "450",
    "brand": null,
    "operator": "Spectrum Wireless Holdings, LLC",
    "status": "Unknown",
    "bands": "Unknown 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "460",
    "brand": null,
    "operator": "Mobi, Inc.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Hawaii; CDMA / LTE network sold to Verizon in 2014"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "470",
    "brand": null,
    "operator": "San Diego Gas & Electric Company",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "480",
    "brand": null,
    "operator": "Ready Wireless, LLC",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "490",
    "brand": null,
    "operator": "Puloli, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "500",
    "brand": null,
    "operator": "Shelcomm, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "510",
    "brand": "Claro",
    "operator": "Puerto Rico Telephone Company",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "520",
    "brand": null,
    "operator": "Florida Broadband, Inc.",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Fixed wireless; Florida"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "540",
    "brand": null,
    "operator": "Nokia Innovations US LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "550",
    "brand": null,
    "operator": "Mile High Networks LLC",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Fixed wireless; Arizona"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "560",
    "brand": null,
    "operator": "Transit Wireless LLC",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Network for MTA / NYCTA"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "570",
    "brand": "Pioneer Cellular",
    "operator": "Cellular Network Partnership",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "580",
    "brand": null,
    "operator": "Telecall Telecommunications Corp.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "590",
    "brand": "Southern LINC",
    "operator": "Southern Communications Services, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "600",
    "brand": null,
    "operator": "ST Engineering iDirect",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "610",
    "brand": null,
    "operator": "Crystal Automation Systems, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "620",
    "brand": null,
    "operator": "OmniProphis Corporation",
    "status": "Unknown",
    "bands": "Unknown 1700",
    "notes": "Former Screened Images, Inc."
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "630",
    "brand": null,
    "operator": "LICT  Corporation",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "640",
    "brand": null,
    "operator": "Geoverse LLC",
    "status": "Unknown",
    "bands": "LTE 3500",
    "notes": "private networks"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "650",
    "brand": null,
    "operator": "Chevron USA, Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "660",
    "brand": null,
    "operator": "Hudson Valley Wireless",
    "status": "Unknown",
    "bands": "LTE 3500",
    "notes": "CBRS fixed wireless; New York"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "670",
    "brand": null,
    "operator": "Hudson Valley Wireless",
    "status": "Unknown",
    "bands": "LTE 3500",
    "notes": "CBRS fixed wireless; New York"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "680",
    "brand": null,
    "operator": "Hudson Valley Wireless",
    "status": "Unknown",
    "bands": "LTE 3500",
    "notes": "CBRS fixed wireless; New York"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "690",
    "brand": null,
    "operator": "Shenandoah Cable Television, LLC",
    "status": "Operational",
    "bands": "LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "700",
    "brand": null,
    "operator": "Ameren Services Company",
    "status": "Unknown",
    "bands": "800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "710",
    "brand": null,
    "operator": "Extent Systems",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "720",
    "brand": null,
    "operator": "1st Point Communications, LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "730",
    "brand": null,
    "operator": "TruAccess Networks",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "740",
    "brand": null,
    "operator": "RTO Wireless, LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "750",
    "brand": "ZipLink",
    "operator": "CellTex Networks, LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "760",
    "brand": null,
    "operator": "Hologram, Inc.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "770",
    "brand": null,
    "operator": "Tango Networks",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "780",
    "brand": null,
    "operator": "Windstream Holdings",
    "status": "Not operational",
    "bands": "Unknown 3500",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "790",
    "brand": "Liberty",
    "operator": "Liberty Cablevision of Puerto Rico LLC",
    "status": "Not operational",
    "bands": "UMTS 850 / UMTS 1900 / LTE 700 / LTE 850 / LTE 1700 / LTE 1900 / LTE 2300 / 5G 850",
    "notes": "Puerto Rico; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "800",
    "brand": null,
    "operator": "Wireless Technologies of Nebraska",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Nebraska, Iowa; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "810",
    "brand": null,
    "operator": "Watch Communications",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Illinois, Indiana, Kentucky & Ohio; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "820",
    "brand": null,
    "operator": "Inland Cellular Telephone Company",
    "status": "Not operational",
    "bands": "LTE",
    "notes": "Washington; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "830",
    "brand": null,
    "operator": "360 Communications",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "840",
    "brand": null,
    "operator": "CellBlox Acqusitions",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "850",
    "brand": null,
    "operator": "Softcom Internet Communications, Inc",
    "status": "Operational",
    "bands": "LTE",
    "notes": "California"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "860",
    "brand": "Nextlink",
    "operator": "AMG Technology Investment Group",
    "status": "Operational",
    "bands": "Unknown 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "870",
    "brand": null,
    "operator": "ElektraFi LLC",
    "status": "Operational",
    "bands": "5G 3500",
    "notes": "Texas"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "880",
    "brand": null,
    "operator": "Shuttle wireless",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "890",
    "brand": "TCOE",
    "operator": "Tulare County Office of Education",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "California"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "900",
    "brand": null,
    "operator": "Tribal Networks",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "910",
    "brand": null,
    "operator": "San Diego Gas & Electric",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "920",
    "brand": null,
    "operator": "JCI",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "930",
    "brand": "Rock Wireless",
    "operator": "Standing Rock Telecom",
    "status": "Operational",
    "bands": "LTE 2500",
    "notes": "North Dakota"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "940",
    "brand": null,
    "operator": "Motorola Solutions",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "950",
    "brand": null,
    "operator": "Cheyenne and Arapaho Development Group",
    "status": "Unknown",
    "bands": "2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "960",
    "brand": null,
    "operator": "Townes 5G, LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "970",
    "brand": null,
    "operator": "Tycrhron",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "980",
    "brand": null,
    "operator": "Next Generation Application LLC",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "313",
    "mnc": "990",
    "brand": null,
    "operator": "Ericsson US",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "EEC/ATL Private Networks"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "314",
    "mnc": "010",
    "brand": null,
    "operator": "Boingo Wireless Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "314",
    "mnc": "020",
    "brand": null,
    "operator": "Spectrum Wireless Holdings, LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "314",
    "mnc": "030",
    "brand": null,
    "operator": "Baicells Technologies North America Inc.",
    "status": "Unknown",
    "bands": "LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "314",
    "mnc": "060",
    "brand": null,
    "operator": "Texas A&M University",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "314",
    "mnc": "070",
    "brand": null,
    "operator": "Texas A&M University",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "314",
    "mnc": "080",
    "brand": null,
    "operator": "Texas A&M University",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "314",
    "mnc": "090",
    "brand": null,
    "operator": "Southern LINC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "314",
    "mnc": "100 - 190",
    "brand": null,
    "operator": "Reserved for Public Safety",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "314",
    "mnc": "200",
    "brand": null,
    "operator": "XF Wireless Investments, LLC",
    "status": "Unknown",
    "bands": "Unknown 3500",
    "notes": "Owned by Comcast"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "314",
    "mnc": "210",
    "brand": null,
    "operator": "Telecom Resource Center",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "314",
    "mnc": "220",
    "brand": null,
    "operator": "Securus Technologies",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "315",
    "mnc": "010",
    "brand": "CBRS",
    "operator": "Citizens Broadband Radio Service",
    "status": "Unknown",
    "bands": "TD-LTE 3500",
    "notes": "LTE band 48"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "316",
    "mnc": "010",
    "brand": "Nextel",
    "operator": "Nextel Communications",
    "status": "Not operational",
    "bands": "iDEN 800",
    "notes": "Merged with Sprint forming Sprint Nextel; iDEN network shut down June 2013; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "United States of America",
    "countryCode": "US",
    "mcc": "316",
    "mnc": "011",
    "brand": "Southern LINC",
    "operator": "Southern Communications Services",
    "status": "Not operational",
    "bands": "iDEN 800",
    "notes": "shut down 2019"
  },
  {
    "type": "National",
    "countryName": "United States Virgin Islands (United States of America)",
    "countryCode": "VI",
    "mcc": "310",
    "mnc": "120",
    "brand": "Sprint",
    "operator": "Sprint Corporation",
    "status": "Operational",
    "bands": "CDMA2000 1900 / LTE 850 / LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United States Virgin Islands (United States of America)",
    "countryCode": "VI",
    "mcc": "310",
    "mnc": "260",
    "brand": "T-Mobile",
    "operator": "T-Mobile US",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / UMTS 1700 / LTE 850 / LTE 700 / LTE 1900 / LTE 1700 / 5G 600",
    "notes": "Former Cook Inlet West Wireless, Voicestream; now universal USA code.  Also used for Ting."
  },
  {
    "type": "National",
    "countryName": "United States Virgin Islands (United States of America)",
    "countryCode": "VI",
    "mcc": "310",
    "mnc": "410",
    "brand": "AT&T",
    "operator": "Liberty",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900",
    "notes": "Formerly AT&T Mobility; Formerly Cingular Wireless"
  },
  {
    "type": "National",
    "countryName": "United States Virgin Islands (United States of America)",
    "countryCode": "VI",
    "mcc": "311",
    "mnc": "470",
    "brand": "Viya",
    "operator": "Vitelcom Cellular Inc.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / TD-LTE 2500",
    "notes": "Former Innovative Wireless; US Virgin Islands"
  },
  {
    "type": "National",
    "countryName": "Afghanistan",
    "countryCode": "AF",
    "mcc": "412",
    "mnc": "01",
    "brand": "AWCC",
    "operator": "Afghan Wireless Communication Company",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Afghanistan",
    "countryCode": "AF",
    "mcc": "412",
    "mnc": "20",
    "brand": "Roshan",
    "operator": "Telecom Development Company Afghanistan Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Afghanistan",
    "countryCode": "AF",
    "mcc": "412",
    "mnc": "40",
    "brand": "MTN",
    "operator": "MTN Group Afghanistan",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Afghanistan",
    "countryCode": "AF",
    "mcc": "412",
    "mnc": "50",
    "brand": "Etisalat",
    "operator": "Etisalat Afghanistan",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Afghanistan",
    "countryCode": "AF",
    "mcc": "412",
    "mnc": "55",
    "brand": "WASEL",
    "operator": "WASEL Afghanistan",
    "status": "Operational",
    "bands": "CDMA 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Afghanistan",
    "countryCode": "AF",
    "mcc": "412",
    "mnc": "80",
    "brand": "Salaam",
    "operator": "Afghan Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Afghanistan",
    "countryCode": "AF",
    "mcc": "412",
    "mnc": "88",
    "brand": "Salaam",
    "operator": "Afghan Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Azerbaijan",
    "countryCode": "AZ",
    "mcc": "400",
    "mnc": "01",
    "brand": "Azercell",
    "operator": null,
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Azerbaijan",
    "countryCode": "AZ",
    "mcc": "400",
    "mnc": "02",
    "brand": "Bakcell",
    "operator": null,
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Azerbaijan",
    "countryCode": "AZ",
    "mcc": "400",
    "mnc": "03",
    "brand": "FONEX",
    "operator": "CATEL",
    "status": "Operational",
    "bands": "CDMA 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Azerbaijan",
    "countryCode": "AZ",
    "mcc": "400",
    "mnc": "04",
    "brand": "Nar Mobile",
    "operator": "Azerfon",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Azerbaijan",
    "countryCode": "AZ",
    "mcc": "400",
    "mnc": "05",
    "brand": null,
    "operator": "Special State Protection Service of the Republic of Azerbaijan",
    "status": "Unknown",
    "bands": "TETRA?",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Azerbaijan",
    "countryCode": "AZ",
    "mcc": "400",
    "mnc": "06",
    "brand": "Naxtel",
    "operator": "Nakhtel LLC",
    "status": "Operational",
    "bands": "CDMA 800 / LTE 800 / LTE 900 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bahrain",
    "countryCode": "BH",
    "mcc": "426",
    "mnc": "01",
    "brand": "Batelco",
    "operator": "Bahrain Telecommunications Company",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 1800 / 5G 3500",
    "notes": "GSM shut down Dec 2019"
  },
  {
    "type": "National",
    "countryName": "Bahrain",
    "countryCode": "BH",
    "mcc": "426",
    "mnc": "02",
    "brand": "zain BH",
    "operator": "Zain Bahrain",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bahrain",
    "countryCode": "BH",
    "mcc": "426",
    "mnc": "03",
    "brand": null,
    "operator": "Civil Aviation Authority",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bahrain",
    "countryCode": "BH",
    "mcc": "426",
    "mnc": "04",
    "brand": "STC",
    "operator": "STC Bahrain",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 3500",
    "notes": "Former VIVA"
  },
  {
    "type": "National",
    "countryName": "Bahrain",
    "countryCode": "BH",
    "mcc": "426",
    "mnc": "05",
    "brand": "Batelco",
    "operator": "Bahrain Telecommunications Company",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Royal Court use only"
  },
  {
    "type": "National",
    "countryName": "Bangladesh",
    "countryCode": "BD",
    "mcc": "470",
    "mnc": "01",
    "brand": "Grameenphone",
    "operator": "Grameenphone Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bangladesh",
    "countryCode": "BD",
    "mcc": "470",
    "mnc": "02",
    "brand": "Robi",
    "operator": "Axiata Bangladesh Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100",
    "notes": "Formerly Aktel"
  },
  {
    "type": "National",
    "countryName": "Bangladesh",
    "countryCode": "BD",
    "mcc": "470",
    "mnc": "03",
    "brand": "Banglalink",
    "operator": "Banglalink Digital Communications Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "VEON"
  },
  {
    "type": "National",
    "countryName": "Bangladesh",
    "countryCode": "BD",
    "mcc": "470",
    "mnc": "04",
    "brand": "TeleTalk",
    "operator": "Teletalk Bangladesh Limited",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bangladesh",
    "countryCode": "BD",
    "mcc": "470",
    "mnc": "05",
    "brand": "Citycell",
    "operator": "Pacific Bangladesh Telecom Limited",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "Shutdown by Bangladesh Telecommunication Regulatory Commission in 2016"
  },
  {
    "type": "National",
    "countryName": "Bangladesh",
    "countryCode": "BD",
    "mcc": "470",
    "mnc": "07",
    "brand": "Airtel",
    "operator": "Bharti Airtel Bangladesh Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Formerly Warid Telcom, later Airtel. Currently merged with Robi keeping brand name Airtel"
  },
  {
    "type": "National",
    "countryName": "Bangladesh",
    "countryCode": "BD",
    "mcc": "470",
    "mnc": "09",
    "brand": "ollo",
    "operator": "Bangladesh Internet Exchange Limited (BIEL)",
    "status": "Not operational",
    "bands": "LTE 800 / LTE 2600 / WiMAX 3500",
    "notes": "shut down 2019"
  },
  {
    "type": "National",
    "countryName": "Bangladesh",
    "countryCode": "BD",
    "mcc": "470",
    "mnc": "10",
    "brand": "Banglalion",
    "operator": "Banglalion Communications Ltd.",
    "status": "Operational",
    "bands": "TD-LTE 2600 / WiMAX 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bhutan",
    "countryCode": "BT",
    "mcc": "402",
    "mnc": "11",
    "brand": "B-Mobile",
    "operator": "Bhutan Telecom Limited",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 850 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bhutan",
    "countryCode": "BT",
    "mcc": "402",
    "mnc": "17",
    "brand": "B-Mobile",
    "operator": "Bhutan Telecom Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bhutan",
    "countryCode": "BT",
    "mcc": "402",
    "mnc": "77",
    "brand": "TashiCell",
    "operator": "Tashi InfoComm Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850 / LTE 700",
    "notes": "LTE band 28"
  },
  {
    "type": "National",
    "countryName": "Cambodia",
    "countryCode": "KH",
    "mcc": "456",
    "mnc": "01",
    "brand": "Cellcard",
    "operator": "CamGSM / The Royal Group",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Mobitel"
  },
  {
    "type": "National",
    "countryName": "Cambodia",
    "countryCode": "KH",
    "mcc": "456",
    "mnc": "02",
    "brand": "Smart",
    "operator": "Smart Axiata Co. Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cambodia",
    "countryCode": "KH",
    "mcc": "456",
    "mnc": "03",
    "brand": "qb",
    "operator": "Cambodia Advance Communications Co. Ltd",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100",
    "notes": "aka CADCOMMS"
  },
  {
    "type": "National",
    "countryName": "Cambodia",
    "countryCode": "KH",
    "mcc": "456",
    "mnc": "04",
    "brand": "qb",
    "operator": "Cambodia Advance Communications Co. Ltd",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100",
    "notes": "aka CADCOMMS"
  },
  {
    "type": "National",
    "countryName": "Cambodia",
    "countryCode": "KH",
    "mcc": "456",
    "mnc": "05",
    "brand": "Smart",
    "operator": "Smart Axiata Co. Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cambodia",
    "countryCode": "KH",
    "mcc": "456",
    "mnc": "06",
    "brand": "Smart",
    "operator": "Smart Axiata Co. Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cambodia",
    "countryCode": "KH",
    "mcc": "456",
    "mnc": "08",
    "brand": "Metfone",
    "operator": "Viettel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cambodia",
    "countryCode": "KH",
    "mcc": "456",
    "mnc": "09",
    "brand": "Metfone",
    "operator": "Viettel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Beeline"
  },
  {
    "type": "National",
    "countryName": "Cambodia",
    "countryCode": "KH",
    "mcc": "456",
    "mnc": "11",
    "brand": "SEATEL",
    "operator": "SEATEL Cambodia",
    "status": "Operational",
    "bands": "LTE 850 / LTE 2600",
    "notes": "Former Excell CDMA shut down 27 June 2015"
  },
  {
    "type": "National",
    "countryName": "Cambodia",
    "countryCode": "KH",
    "mcc": "456",
    "mnc": "18",
    "brand": "Cellcard",
    "operator": "The Royal Group",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Mfone"
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "00",
    "brand": "China Mobile",
    "operator": "China Mobile",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2500 / 5G 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "01",
    "brand": "China Unicom",
    "operator": "China Unicom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500 / 5G 2100 / 5G 3500",
    "notes": "CDMA network sold to China Telecom"
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "02",
    "brand": "China Mobile",
    "operator": "China Mobile",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "03",
    "brand": "China Telecom",
    "operator": "China Telecom",
    "status": "Operational",
    "bands": "CDMA2000 800",
    "notes": "EV-DO"
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "04",
    "brand": "China Mobile",
    "operator": "Global Star Satellite",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "05",
    "brand": "China Telecom",
    "operator": "China Telecom",
    "status": "Not operational",
    "bands": "CDMA2000 800 / LTE 850 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "06",
    "brand": "China Unicom",
    "operator": "China Unicom",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "07",
    "brand": "China Mobile",
    "operator": "China Mobile",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "08",
    "brand": "China Mobile",
    "operator": "China Mobile",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "09",
    "brand": "China Unicom",
    "operator": "China Unicom",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "11",
    "brand": "China Telecom",
    "operator": "China Telecom",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "China",
    "countryCode": "CN",
    "mcc": "460",
    "mnc": "20",
    "brand": "China Tietong",
    "operator": "China Tietong",
    "status": "Operational",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "00",
    "brand": "1O1O / One2Free / New World Mobility / SUNMobile",
    "operator": "CSL Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "01",
    "brand": null,
    "operator": "CITIC Telecom 1616",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO on CSL network; network code operational only at land borders and Airport to attract inbound roamers to join 454-00"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "02",
    "brand": null,
    "operator": "CSL Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Network code operational only at land borders and Airport to attract inbound roamers to join 454-00"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "03",
    "brand": "3",
    "operator": "Hutchison Telecom",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "04",
    "brand": "3 (2G)",
    "operator": "Hutchison Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "05",
    "brand": "3 (CDMA)",
    "operator": "Hutchison Telecom",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "Defunct CDMA IS-95 network, decommissioned on 19 November 2008 at 23:59"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "06",
    "brand": "SmarTone",
    "operator": "SmarTone Mobile Communications Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "07",
    "brand": "China Unicom",
    "operator": "China Unicom (Hong Kong) Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO on 3 Hong Kong Mobile network code operational only at land borders and Airport to attract inbound roamers to join 454-16 or 454-19"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "08",
    "brand": "Truphone",
    "operator": "Truphone Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former Trident"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "09",
    "brand": null,
    "operator": "China Motion Telecom",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MVNO on CSL network; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "10",
    "brand": "New World Mobility",
    "operator": "CSL Limited",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Signal Combined with 454-00"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "11",
    "brand": null,
    "operator": "China-Hong Kong Telecom",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO on PCCW Mobile and Hutchison Telecom networks"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "12",
    "brand": "CMCC HK",
    "operator": "China Mobile Hong Kong Company Limited",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / TD-SCDMA 2000 / LTE 900 /LTE 1800 / LTE 2100 / TD-LTE 2300 / LTE 2600 / 5G 3500",
    "notes": "Formerly Peoples"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "13",
    "brand": "CMCC HK",
    "operator": "China Mobile Hong Kong Company Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO on PCCW Mobile (3G)"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "14",
    "brand": null,
    "operator": "Hutchison Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Network code operational only at land borders and Airport to attract inbound roamers to join 454-03 or 454-04"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "15",
    "brand": null,
    "operator": "SmarTone Mobile Communications Limited",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Network code operational only at land borders and Airport to attract inbound roamers to join 454-06"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "16",
    "brand": "PCCW Mobile (2G)",
    "operator": "PCCW",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Formerly SUNDAY"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "17",
    "brand": null,
    "operator": "SmarTone Mobile Communications Limited",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Network code operational only at land borders and Airport to attract inbound roamers to join 454-06"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "18",
    "brand": null,
    "operator": "CSL Limited",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "19",
    "brand": "PCCW Mobile (3G)",
    "operator": "PCCW-HKT",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "20",
    "brand": "PCCW Mobile (4G)",
    "operator": "PCCW-HKT",
    "status": "Operational",
    "bands": "LTE 1800 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "21",
    "brand": null,
    "operator": "21Vianet Mobile Ltd.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "Closed on 1 February 2019"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "22",
    "brand": null,
    "operator": "263 Mobile Communications (HongKong) Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Formerly P Plus Communications, Delcom (HK) Ltd"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "23",
    "brand": "Lycamobile",
    "operator": "Lycamobile Hong Kong Ltd",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "Closed on 27 April 2018; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "24",
    "brand": null,
    "operator": "Multibyte Info Technology Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "25",
    "brand": null,
    "operator": "Hong Kong Government",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "26",
    "brand": null,
    "operator": "Hong Kong Government",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "29",
    "brand": "PCCW Mobile (CDMA)",
    "operator": "PCCW-HKT",
    "status": "Operational",
    "bands": "CDMA 800",
    "notes": "CDMA2000 1xEV-DO Rev A network for inbound roamers, with limited coverage"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "30",
    "brand": "CMCC HK",
    "operator": "China Mobile Hong Kong Company Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former China Data Enterprises Ltd"
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "31",
    "brand": "CTExcel",
    "operator": "China Telecom Global Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "32",
    "brand": null,
    "operator": "Hong Kong Broadband Network Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "35",
    "brand": null,
    "operator": "Webbing Hong Kong Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Hong Kong",
    "countryCode": "HK",
    "mcc": "454",
    "mnc": "36",
    "brand": null,
    "operator": "Easco Telecommunications Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "01",
    "brand": "Vi India",
    "operator": "Haryana",
    "status": "Operational",
    "bands": "GSM 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "02",
    "brand": "AirTel",
    "operator": "Punjab",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "03",
    "brand": "AirTel",
    "operator": "Himachal Pradesh",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "04",
    "brand": "Vi India",
    "operator": "Delhi & NCR",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "05",
    "brand": "Vi India",
    "operator": "Gujarat",
    "status": "Operational",
    "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Hutch, Fascel, Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "07",
    "brand": "Vi India",
    "operator": "Andhra Pradesh and Telangana",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "09",
    "brand": "Reliance",
    "operator": "Assam",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "10",
    "brand": "AirTel",
    "operator": "Delhi & NCR",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 850 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "11",
    "brand": "Vi India",
    "operator": "Delhi & NCR",
    "status": "Operational",
    "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "12",
    "brand": "Vi India",
    "operator": "Haryana",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Escotel, IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "13",
    "brand": "Vi India",
    "operator": "Andhra Pradesh and Telangana",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "14",
    "brand": "Vi India",
    "operator": "Punjab",
    "status": "Operational",
    "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Spice, IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "15",
    "brand": "Vi India",
    "operator": "Uttar Pradesh (East)",
    "status": "Operational",
    "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "16",
    "brand": "Airtel",
    "operator": "North East",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": "Former Hexacom"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "17",
    "brand": "AIRCEL",
    "operator": "West Bengal",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "18",
    "brand": "Reliance",
    "operator": "Himachal Pradesh",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "19",
    "brand": "Vi India",
    "operator": "Kerala",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE-2300 / TD-LTE 2500",
    "notes": "Former Escotel, IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "20",
    "brand": "Vi India",
    "operator": "Mumbai",
    "status": "Operational",
    "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Hutchison Maxtouch, Orange, Hutch, Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "21",
    "brand": "Loop Mobile",
    "operator": "Mumbai",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Former BPL Mobile; licence expired 2014"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "22",
    "brand": "Vi India",
    "operator": "Maharashtra & Goa",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "23",
    "brand": "Reliance",
    "operator": "West Bengal",
    "status": "Not operational",
    "bands": "LTE",
    "notes": "Reliance Telecom"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "24",
    "brand": "Vi India",
    "operator": "Gujarat",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "25",
    "brand": "AIRCEL",
    "operator": "Bihar",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "27",
    "brand": "Vi India",
    "operator": "Maharashtra & Goa",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "28",
    "brand": "AIRCEL",
    "operator": "Odisha",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "29",
    "brand": "AIRCEL",
    "operator": "Assam",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "30",
    "brand": "Vi India",
    "operator": "Kolkata",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India, Command, Hutch"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "31",
    "brand": "AirTel",
    "operator": "Kolkata",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "34",
    "brand": "BSNL Mobile",
    "operator": "Haryana",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "35",
    "brand": "Aircel",
    "operator": "Himachal Pradesh",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "36",
    "brand": "Reliance",
    "operator": "Bihar & Jharkhand",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "37",
    "brand": "Aircel",
    "operator": "Jammu & Kashmir",
    "status": "Not operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "38",
    "brand": "BSNL Mobile",
    "operator": "Assam",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "40",
    "brand": "AirTel",
    "operator": "Chennai",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "41",
    "brand": "Aircel",
    "operator": "Chennai",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Former RPG; bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "42",
    "brand": "Aircel",
    "operator": "Tamil Nadu",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "43",
    "brand": "Vi India",
    "operator": "Tamil Nadu",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "44",
    "brand": "Vi India",
    "operator": "Karnataka",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100",
    "notes": "Former Spice, IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "45",
    "brand": "Airtel",
    "operator": "Karnataka",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "46",
    "brand": "Vi India",
    "operator": "Kerala",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE-2300 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "48",
    "brand": "Dishnet Wireless",
    "operator": "Unknown",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "49",
    "brand": "Airtel",
    "operator": "Andhra Pradesh and Telangana",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 850 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "50",
    "brand": "Reliance",
    "operator": "North East",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "51",
    "brand": "BSNL Mobile",
    "operator": "Himachal Pradesh",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "52",
    "brand": "Reliance",
    "operator": "Odisha",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "53",
    "brand": "BSNL Mobile",
    "operator": "Punjab",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "54",
    "brand": "BSNL Mobile",
    "operator": "Uttar Pradesh (West)",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "55",
    "brand": "BSNL Mobile",
    "operator": "Uttar Pradesh (East)",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "56",
    "brand": "Vi India",
    "operator": "Uttar Pradesh (West)",
    "status": "Operational",
    "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "57",
    "brand": "BSNL Mobile",
    "operator": "Gujarat",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "58",
    "brand": "BSNL Mobile",
    "operator": "Madhya Pradesh & Chhattisgarh",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "59",
    "brand": "BSNL Mobile",
    "operator": "Rajasthan",
    "status": "Operational",
    "bands": "CDMA 850 / GSM 900 / UMTS 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "60",
    "brand": "Vi India",
    "operator": "Rajasthan",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "62",
    "brand": "BSNL Mobile",
    "operator": "Jammu & Kashmir",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "64",
    "brand": "BSNL Mobile",
    "operator": "Chennai",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "66",
    "brand": "BSNL Mobile",
    "operator": "Maharashtra & Goa",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "67",
    "brand": "Reliance",
    "operator": "Madhya Pradesh & Chhattisgarh",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "68",
    "brand": "MTNL",
    "operator": "Delhi & NCR",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": "To be merged with BSNL"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "69",
    "brand": "MTNL",
    "operator": "Mumbai",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": "To be merged with BSNL"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "70",
    "brand": "AirTel",
    "operator": "Rajasthan",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "71",
    "brand": "BSNL Mobile",
    "operator": "Karnataka (Bangalore)",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "72",
    "brand": "BSNL Mobile",
    "operator": "Kerala",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "73",
    "brand": "BSNL Mobile",
    "operator": "Andhra Pradesh and Telangana",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "74",
    "brand": "BSNL Mobile",
    "operator": "West Bengal",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "75",
    "brand": "BSNL Mobile",
    "operator": "Bihar",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "76",
    "brand": "BSNL Mobile",
    "operator": "Odisha",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "77",
    "brand": "BSNL Mobile",
    "operator": "North East",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "78",
    "brand": "Vi India",
    "operator": "Madhya Pradesh & Chattishgarh",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "79",
    "brand": "BSNL Mobile",
    "operator": "Andaman Nicobar",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "80",
    "brand": "BSNL Mobile",
    "operator": "Tamil Nadu",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "81",
    "brand": "BSNL Mobile",
    "operator": "Kolkata",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": "Former CellOne"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "82",
    "brand": "Vi India",
    "operator": "Himachal Pradesh",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "83",
    "brand": "Reliance",
    "operator": "Kolkata",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "84",
    "brand": "Vi India",
    "operator": "Chennai",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "85",
    "brand": "Reliance",
    "operator": "West Bengal",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "86",
    "brand": "Vi India",
    "operator": "Karnataka",
    "status": "Operational",
    "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "87",
    "brand": "Vi India",
    "operator": "Rajasthan",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "88",
    "brand": "Vi India",
    "operator": "Punjab",
    "status": "Not operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "89",
    "brand": "Vi India",
    "operator": "Uttar Pradesh (East)",
    "status": "Not operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "90",
    "brand": "AirTel",
    "operator": "Maharashtra",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 850 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "91",
    "brand": "AIRCEL",
    "operator": "Kolkata",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "92",
    "brand": "AirTel",
    "operator": "Mumbai",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 850 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "93",
    "brand": "AirTel",
    "operator": "Madhya Pradesh",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "94",
    "brand": "AirTel",
    "operator": "Tamil Nadu",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "95",
    "brand": "AirTel",
    "operator": "Kerala",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "96",
    "brand": "AirTel",
    "operator": "Haryana",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 850 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "97",
    "brand": "AirTel",
    "operator": "Uttar Pradesh (West)",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "404",
    "mnc": "98",
    "brand": "AirTel",
    "operator": "Gujarat",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "01",
    "brand": "Reliance",
    "operator": "Andhra Pradesh and Telangana",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "025",
    "brand": "TATA DOCOMO",
    "operator": "Andhra Pradesh and Telangana",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "026",
    "brand": "TATA DOCOMO",
    "operator": "Assam",
    "status": "Not operational",
    "bands": "CDMA 850",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "027",
    "brand": "TATA DOCOMO",
    "operator": "Bihar/Jharkhand",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "028",
    "brand": "TATA DOCOMO",
    "operator": "Chennai",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "029",
    "brand": "TATA DOCOMO",
    "operator": "Delhi",
    "status": "Not operational",
    "bands": "CDMA 850",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "03",
    "brand": "Reliance",
    "operator": "Bihar",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "030",
    "brand": "TATA DOCOMO",
    "operator": "Gujarat",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "031",
    "brand": "TATA DOCOMO",
    "operator": "Haryana",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "032",
    "brand": "TATA DOCOMO",
    "operator": "Himachal Pradesh",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "033",
    "brand": "TATA DOCOMO",
    "operator": "Jammu & Kashmir",
    "status": "Not operational",
    "bands": "CDMA 850",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "034",
    "brand": "TATA DOCOMO",
    "operator": "Karnataka",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "035",
    "brand": "TATA DOCOMO",
    "operator": "Kerala",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "036",
    "brand": "TATA DOCOMO",
    "operator": "Kolkata",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "037",
    "brand": "TATA DOCOMO",
    "operator": "Maharashtra & Goa",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "038",
    "brand": "TATA DOCOMO",
    "operator": "Madhya Pradesh",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "039",
    "brand": "TATA DOCOMO",
    "operator": "Mumbai",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "04",
    "brand": "Reliance",
    "operator": "Chennai",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "041",
    "brand": "TATA DOCOMO",
    "operator": "Odisha",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "042",
    "brand": "TATA DOCOMO",
    "operator": "Punjab",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "043",
    "brand": "TATA DOCOMO",
    "operator": "Rajasthan",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "044",
    "brand": "TATA DOCOMO",
    "operator": "Tamil Nadu including Chennai",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "045",
    "brand": "TATA DOCOMO",
    "operator": "Uttar Pradesh (East)",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "046",
    "brand": "TATA DOCOMO",
    "operator": "Uttar Pradesh (West) & Uttarakhand",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "047",
    "brand": "TATA DOCOMO",
    "operator": "West Bengal",
    "status": "Not operational",
    "bands": "CDMA 850 / GSM 1800",
    "notes": "Merged with Airtel in 2019"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "05",
    "brand": "Reliance",
    "operator": "Delhi & NCR",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "06",
    "brand": "Reliance",
    "operator": "Gujarat",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "07",
    "brand": "Reliance",
    "operator": "Haryana",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "08",
    "brand": "Reliance",
    "operator": "Himachal Pradesh",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "09",
    "brand": "Reliance",
    "operator": "Jammu & Kashmir",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "10",
    "brand": "Reliance",
    "operator": "Karnataka",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "11",
    "brand": "Reliance",
    "operator": "Kerala",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "12",
    "brand": "Reliance",
    "operator": "Kolkata",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "13",
    "brand": "Reliance",
    "operator": "Maharashtra & Goa",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "14",
    "brand": "Reliance",
    "operator": "Madhya Pradesh",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "15",
    "brand": "Reliance",
    "operator": "Mumbai",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "17",
    "brand": "Reliance",
    "operator": "Odisha",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "18",
    "brand": "Reliance",
    "operator": "Punjab",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "19",
    "brand": "Reliance",
    "operator": "Rajasthan",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "20",
    "brand": "Reliance",
    "operator": "Tamil Nadu",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "21",
    "brand": "Reliance",
    "operator": "Uttar Pradesh (East)",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "22",
    "brand": "Reliance",
    "operator": "Uttar Pradesh (West)",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "23",
    "brand": "Reliance",
    "operator": "West Bengal",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Data-only as of 2020"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "51",
    "brand": "AirTel",
    "operator": "West Bengal",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "52",
    "brand": "AirTel",
    "operator": "Bihar & Jharkhand",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "53",
    "brand": "AirTel",
    "operator": "Odisha",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "54",
    "brand": "AirTel",
    "operator": "Uttar Pradesh (East)",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "55",
    "brand": "Airtel",
    "operator": "Jammu & Kashmir",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "56",
    "brand": "AirTel",
    "operator": "Assam",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "66",
    "brand": "Vi India",
    "operator": "Uttar Pradesh (West)",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "67",
    "brand": "Vi India",
    "operator": "West Bengal",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "70",
    "brand": "Vi India",
    "operator": "Bihar & Jharkhand",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "750",
    "brand": "Vi India",
    "operator": "Jammu & Kashmir",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "751",
    "brand": "Vi India",
    "operator": "Assam",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "752",
    "brand": "Vi India",
    "operator": "Bihar & Jharkhand",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "753",
    "brand": "Vi India",
    "operator": "Odisha",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "754",
    "brand": "Vi India",
    "operator": "Himachal Pradesh",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "755",
    "brand": "Vi India",
    "operator": "North East",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "756",
    "brand": "Vi India",
    "operator": "Madhya Pradesh & Chhattisgarh",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500",
    "notes": "Former Vodafone India"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "799",
    "brand": "Vi India",
    "operator": "Mumbai",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "800",
    "brand": "AIRCEL",
    "operator": "Delhi & NCR",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "801",
    "brand": "AIRCEL",
    "operator": "Andhra Pradesh and Telangana",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "802",
    "brand": "AIRCEL",
    "operator": "Gujarat",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "803",
    "brand": "AIRCEL",
    "operator": "Karnataka",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "804",
    "brand": "AIRCEL",
    "operator": "Maharashtra & Goa",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "805",
    "brand": "AIRCEL",
    "operator": "Mumbai",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "806",
    "brand": "AIRCEL",
    "operator": "Rajasthan",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "807",
    "brand": "AIRCEL",
    "operator": "Haryana",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "808",
    "brand": "AIRCEL",
    "operator": "Madhya Pradesh",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "809",
    "brand": "AIRCEL",
    "operator": "Kerala",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "810",
    "brand": "AIRCEL",
    "operator": "Uttar Pradesh (East)",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "811",
    "brand": "AIRCEL",
    "operator": "Uttar Pradesh (West)",
    "status": "Not operational",
    "bands": "GSM",
    "notes": "Bankrupt in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "812",
    "brand": "AIRCEL",
    "operator": "Punjab",
    "status": "Not operational",
    "bands": "GSM",
    "notes": "License cancelled by Supreme Court"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "819",
    "brand": "Uninor",
    "operator": "Andhra Pradesh and Telangana",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Airtel in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "818",
    "brand": "Uninor",
    "operator": "Uttar Pradesh (West)",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Airtel in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "820",
    "brand": "Uninor",
    "operator": "Karnataka",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Airtel in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "821",
    "brand": "Uninor",
    "operator": "Kerala",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Airtel in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "822",
    "brand": "Uninor",
    "operator": "Kolkata",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Airtel in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "824",
    "brand": "Videocon Telecom",
    "operator": "Assam",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Shut down in 2016"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "827",
    "brand": "Videocon Telecom",
    "operator": "Gujarat",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Shut down in 2016"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "834",
    "brand": "Videocon Telecom",
    "operator": "Madhya Pradesh",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Shut down in 2016"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "844",
    "brand": "Uninor",
    "operator": "Delhi & NCR",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Airtel in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "840",
    "brand": "Jio",
    "operator": "West Bengal",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "845",
    "brand": "Vi India",
    "operator": "Assam",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "846",
    "brand": "Vi India",
    "operator": "Jammu & Kashmir",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "847",
    "brand": "Vi India",
    "operator": "Karnataka",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "848",
    "brand": "Vi India",
    "operator": "Kolkata",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "849",
    "brand": "Vi India",
    "operator": "North East",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "850",
    "brand": "Vi India",
    "operator": "Odisha",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "851",
    "brand": "Vi India",
    "operator": "Punjab",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "852",
    "brand": "Vi India",
    "operator": "Tamil Nadu",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "853",
    "brand": "Vi India",
    "operator": "West Bengal",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "854",
    "brand": "Jio",
    "operator": "Andhra Pradesh",
    "status": "Operational",
    "bands": "LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "855",
    "brand": "Jio",
    "operator": "Assam",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "856",
    "brand": "Jio",
    "operator": "Bihar",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "857",
    "brand": "Jio",
    "operator": "Gujarat",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "858",
    "brand": "Jio",
    "operator": "Haryana",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "859",
    "brand": "Jio",
    "operator": "Himachal Pradesh",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "860",
    "brand": "Jio",
    "operator": "Jammu & Kashmir",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "861",
    "brand": "Jio",
    "operator": "Karnataka",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "862",
    "brand": "Jio",
    "operator": "Kerala",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "863",
    "brand": "Jio",
    "operator": "Madhya Pradesh",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "864",
    "brand": "Jio",
    "operator": "Maharashtra",
    "status": "Operational",
    "bands": "LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "865",
    "brand": "Jio",
    "operator": "North East",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "866",
    "brand": "Jio",
    "operator": "Odisha",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "867",
    "brand": "Jio",
    "operator": "Punjab",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "868",
    "brand": "Jio",
    "operator": "Rajasthan",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "869",
    "brand": "Jio",
    "operator": "Tamil Nadu (incl. Chennai)",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "870",
    "brand": "Jio",
    "operator": "Uttar Pradesh (West)",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "871",
    "brand": "Jio",
    "operator": "Uttar Pradesh (East)",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "872",
    "brand": "Jio",
    "operator": "Delhi",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "873",
    "brand": "Jio",
    "operator": "Kolkata",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "874",
    "brand": "Jio",
    "operator": "Mumbai",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "875",
    "brand": "Uninor",
    "operator": "Assam",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Airtel in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "880",
    "brand": "Uninor",
    "operator": "West Bengal",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Airtel in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "881",
    "brand": "S Tel",
    "operator": "Assam",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "License cancelled in 2012"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "908",
    "brand": "Vi India",
    "operator": "Andhra Pradesh and Telangana",
    "status": "Operational",
    "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "909",
    "brand": "Vi India",
    "operator": "Delhi",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "910",
    "brand": "Vi India",
    "operator": "Haryana",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500",
    "notes": "Former IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "911",
    "brand": "Vi India",
    "operator": "Maharashtra",
    "status": "Not operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500",
    "notes": "Former SPICE IDEA"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "912",
    "brand": "Etisalat DB (cheers)",
    "operator": "Andhra Pradesh and Telangana",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "License cancelled in 2012"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "913",
    "brand": "Etisalat DB (cheers)",
    "operator": "Delhi & NCR",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "License cancelled in 2012"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "914",
    "brand": "Etisalat DB (cheers)",
    "operator": "Gujarat",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "License cancelled in 2012"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "917",
    "brand": "Etisalat DB (cheers)",
    "operator": "Kerala",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "License cancelled in 2012"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "927",
    "brand": "Uninor",
    "operator": "Gujarat",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Airtel in 2018"
  },
  {
    "type": "National",
    "countryName": "India",
    "countryCode": "IN",
    "mcc": "405",
    "mnc": "929",
    "brand": "Uninor",
    "operator": "Maharashtra",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Airtel in 2018"
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "01",
    "brand": "Uname",
    "operator": "Ertebatat Iran",
    "status": "Operational",
    "bands": "LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "02",
    "brand": "ApTel, AzarTel",
    "operator": "NeginTel",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "06",
    "brand": "Arian-Tel",
    "operator": "Ertebatat-e Arian Tel Co.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "08",
    "brand": "Shatel Mobile",
    "operator": "Shatel Group",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Multi MNO (connected to 3 MNO's RAN with PLMN casting in Rightel RAN)"
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "10",
    "brand": "Samantel",
    "operator": "Samantel Mobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "11",
    "brand": "IR-TCI (Hamrah-e-Avval)",
    "operator": "Mobile Communications Company of Iran (MCI)",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "12",
    "brand": "Avacell(HiWEB)",
    "operator": "Dadeh Dostar asr Novin p.j.s. co & Information Technology Company of Iran",
    "status": "Operational",
    "bands": "LTE 800 / TD-LTE 2600",
    "notes": "Mostly used in rural areas with poor telephone line and cable equipment"
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "14",
    "brand": "TKC/KFZO",
    "operator": "Telecommunication Kish Company",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "19",
    "brand": "Espadan (JV-PJS)",
    "operator": "Mobile Telecommunications Company of Esfahan",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "20",
    "brand": "RighTel",
    "operator": "Social Security Investment Co.",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "21",
    "brand": "RighTel",
    "operator": "Social Security Investment Co.",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "32",
    "brand": "Taliya",
    "operator": "TCI of Iran and Iran Mobin",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Roaming TKC & TCI"
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "35",
    "brand": "MTN Irancell",
    "operator": "MTN Irancell Telecommunications Services Company",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 3500 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "40",
    "brand": "Mobinnet",
    "operator": "Ertebatat Mobinnet",
    "status": "Operational",
    "bands": "WiMAX / LTE 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "45",
    "brand": "Zi-Tel",
    "operator": "Farabord Dadeh Haye Iranian Co.",
    "status": "Operational",
    "bands": "TD-LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "50",
    "brand": "Shatel Mobile",
    "operator": "Shatel Group",
    "status": "Operational",
    "bands": "TD-LTE 2600 MHz",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "70",
    "brand": "MTCE",
    "operator": "Telephone Communications Company of Iran",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": "Mostly used in rural areas with poor telephone lines and cable equipment (WLL)"
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "71",
    "brand": "KOOHE NOOR",
    "operator": "Telephone Communications Company of Iran",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": "Mostly used in rural areas with poor telephone lines and cable equipment (WLL)"
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "90",
    "brand": "Iraphone",
    "operator": "IRAPHONE GHESHM of Iran",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Mobile Phone"
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "93",
    "brand": "Iraphone",
    "operator": "Iraphone",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Mostly used in rural areas with poor telephone line and cable equipments, instead of telephone"
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "93",
    "brand": "Farzanegan Pars",
    "operator": "Farzanegan Pars",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Fixed Communication Provider (FCP)"
  },
  {
    "type": "National",
    "countryName": "Iran",
    "countryCode": "IR",
    "mcc": "432",
    "mnc": "99",
    "brand": "TCI (GSM WLL)",
    "operator": "TCI of Iran and Rightel",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900",
    "notes": "Roaming IR70 & TCI & RIGHTEL"
  },
  {
    "type": "National",
    "countryName": "Iraq",
    "countryCode": "IQ",
    "mcc": "418",
    "mnc": "00",
    "brand": "Asia Cell",
    "operator": "Asia Cell Telecommunications Company",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iraq",
    "countryCode": "IQ",
    "mcc": "418",
    "mnc": "05",
    "brand": "Asia Cell",
    "operator": "Asia Cell Telecommunications Company",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iraq",
    "countryCode": "IQ",
    "mcc": "418",
    "mnc": "08",
    "brand": "SanaTel",
    "operator": null,
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iraq",
    "countryCode": "IQ",
    "mcc": "418",
    "mnc": "20",
    "brand": "Zain",
    "operator": "Zain Iraq",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former MTC Atheer"
  },
  {
    "type": "National",
    "countryName": "Iraq",
    "countryCode": "IQ",
    "mcc": "418",
    "mnc": "30",
    "brand": "Zain",
    "operator": "Zain Iraq",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former Orascom Telecom (Iraqna)"
  },
  {
    "type": "National",
    "countryName": "Iraq",
    "countryCode": "IQ",
    "mcc": "418",
    "mnc": "40",
    "brand": "Korek",
    "operator": "Telecom Ltd",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iraq",
    "countryCode": "IQ",
    "mcc": "418",
    "mnc": "45",
    "brand": "Mobitel",
    "operator": "Mobitel Co. Ltd.",
    "status": "Operational",
    "bands": "UMTS",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iraq",
    "countryCode": "IQ",
    "mcc": "418",
    "mnc": "62",
    "brand": "Itisaluna",
    "operator": "Itisaluna Wireless CO.",
    "status": "Operational",
    "bands": "CDMA 800 / CDMA 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Iraq",
    "countryCode": "IQ",
    "mcc": "418",
    "mnc": "92",
    "brand": "Omnnea",
    "operator": "Omnnea Wireless",
    "status": "Operational",
    "bands": "CDMA",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "01",
    "brand": "Partner",
    "operator": "Partner Communications Company Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / 5G 3500",
    "notes": "Former Orange (until 2016)"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "02",
    "brand": "Cellcom",
    "operator": "Cellcom Israel Ltd.",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "03",
    "brand": "Pelephone",
    "operator": "Pelephone Communications Ltd.",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 2100 / LTE 1800 / 5G 3500",
    "notes": "CDMA 850 shut down July 2017"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "04",
    "brand": null,
    "operator": "Globalsim Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "05",
    "brand": "Jawwal",
    "operator": "Palestine Cellular Communications Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": "Covering the Palestinian territories"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "06",
    "brand": "Wataniya Mobile",
    "operator": "Wataniya Palestine Ltd. (Ooredoo)",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Covering the Palestinian territories"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "07",
    "brand": "Hot Mobile",
    "operator": "Hot Mobile Ltd.",
    "status": "Operational",
    "bands": "iDEN 800 / UMTS 2100 / LTE 1800 / LTE 2100 / 5G 3500",
    "notes": "Former Mirs Communications; uses Pelephone network for roaming"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "08",
    "brand": "Golan Telecom",
    "operator": "Golan Telecom Ltd.",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 1800",
    "notes": "Acquired by Cellcom in Aug 2020"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "09",
    "brand": "We4G",
    "operator": "Marathon 018 Xphone Ltd.",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "10",
    "brand": "Partner",
    "operator": "Partner Communications Company Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": "Former Orange (until 2016)"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "11",
    "brand": null,
    "operator": "365 Telecom",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "12",
    "brand": "x2one",
    "operator": "Free Telecom",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "13",
    "brand": null,
    "operator": "Ituran Cellular Communications",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "14",
    "brand": "Youphone",
    "operator": "Alon Cellular Ltd.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "15",
    "brand": "Home Cellular",
    "operator": "Home Cellular Ltd.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MVNO (Cellcom)"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "16",
    "brand": "Rami Levy",
    "operator": "Rami Levy Communications Ltd.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO (Pelephone)"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "17",
    "brand": "Sipme",
    "operator": "Gale Phone",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "18",
    "brand": "Cellact Communications",
    "operator": "Cellact Communications Ltd.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO (Pelephone)"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "19",
    "brand": "019 Mobile",
    "operator": "019 Communication Services Ltd. / TELZAR",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "20",
    "brand": "Bezeq",
    "operator": "Bezeq The Israeli Telecommunication Corp Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "21",
    "brand": "Bezeq International",
    "operator": "B.I.P. Communications Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "22",
    "brand": null,
    "operator": "Maskyoo Telephonia Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "23",
    "brand": null,
    "operator": "Beezz Communication Solutions Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "24",
    "brand": "012 Mobile",
    "operator": "Partner Communications Company Ltd.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO (Partner)"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "25",
    "brand": "IMOD",
    "operator": "Israel Ministry of Defense",
    "status": "Operational",
    "bands": "LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "26",
    "brand": "Annatel",
    "operator": "LB Annatel Ltd.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "28",
    "brand": null,
    "operator": "PHI Networks",
    "status": "Unknown",
    "bands": "LTE 1800",
    "notes": "Joint venture between Partner Communications Company and Hot Mobile"
  },
  {
    "type": "National",
    "countryName": "Israel",
    "countryCode": "IL",
    "mcc": "425",
    "mnc": "29",
    "brand": null,
    "operator": "CG Networks",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Joint venture between Cellcom, Golan Telecom and Exphone"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "00",
    "brand": "Y!Mobile",
    "operator": "SoftBank Corp.",
    "status": "Operational",
    "bands": "UMTS 1800",
    "notes": "band 3"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "01",
    "brand": "UQ WiMAX",
    "operator": "UQ Communications Inc.",
    "status": "Operational",
    "bands": "TD-LTE 2500",
    "notes": "band 41; WiMAX 2500 shut down 31 Mar 2020"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "02",
    "brand": null,
    "operator": "Hanshin Cable Engineering Co., Ltd.",
    "status": "Unknown",
    "bands": "WiMAX 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "03",
    "brand": "IIJmio",
    "operator": "Internet Initiative Japan Inc.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "04",
    "brand": null,
    "operator": "Japan Radio Company, Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "05",
    "brand": null,
    "operator": "Wireless City Planning Inc.",
    "status": "Operational",
    "bands": "TD-LTE 2500",
    "notes": "band 41; owned by SoftBank"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "06",
    "brand": null,
    "operator": "SAKURA Internet Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "07",
    "brand": null,
    "operator": "closip, Inc.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": "Former LTE-X"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "08",
    "brand": null,
    "operator": "Panasonic Systems Solutions Japan Co., Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "09",
    "brand": null,
    "operator": "Marubeni Wireless Communications Inc.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "10",
    "brand": "NTT docomo",
    "operator": "NTT DoCoMo, Inc.",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 3500 / 5G 3500 / 5G 4700 / 5G 28000",
    "notes": "bands 1, 3, 19, 21, 28, 42"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "11",
    "brand": "Rakuten Mobile",
    "operator": "Rakuten Mobile Network, Inc.",
    "status": "Operational",
    "bands": "LTE 1800 / 5G 3700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "12",
    "brand": null,
    "operator": "Cable media waiwai Co., Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "13",
    "brand": null,
    "operator": "NTT Communications Corporation",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "14",
    "brand": null,
    "operator": "Grape One Co., Ltd.",
    "status": "Unknown",
    "bands": "5G",
    "notes": "Private 5G networks"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "15",
    "brand": null,
    "operator": "BB Backbone Corp.",
    "status": "Unknown",
    "bands": "LTE",
    "notes": "Private LTE networks"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "16",
    "brand": null,
    "operator": "Nokia Innovations Japan G.K.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "17",
    "brand": null,
    "operator": "Osaka Gas Business Create Co., Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "18",
    "brand": null,
    "operator": "Kintetsu Cable Network Co., Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "19",
    "brand": null,
    "operator": "NEC Networks & System Integration Corporation",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "20",
    "brand": "SoftBank",
    "operator": "SoftBank Corp.",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 900 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 3700 / 5G 28000",
    "notes": "bands 1, 3, 8, 11, 28, 41, 42"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "21",
    "brand": "SoftBank",
    "operator": "SoftBank Corp.",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 900 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 3700 / 5G 28000",
    "notes": "bands 1, 3, 8, 11, 28, 41, 42"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "22",
    "brand": null,
    "operator": "JTOWER Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "23",
    "brand": null,
    "operator": "Fujitsu Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "50",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 800 / 5G 3500 / 5G 3700 / 5G 28000",
    "notes": "bands 1, 3, 11, 18, 28, 41, 42"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "51",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 800 / 5G 3500 / 5G 3700 / 5G 28000",
    "notes": "bands 1, 3, 11, 18, 28, 41, 42"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "52",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 800 / 5G 3500 / 5G 3700 / 5G 28000",
    "notes": "bands 1, 3, 11, 18, 28, 41, 42"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "53",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 800 / 5G 3500 / 5G 3700 / 5G 28000",
    "notes": "bands 1, 3, 11, 18, 28, 41, 42"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "54",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / CDMA 2000",
    "notes": "CDMA to shut down 31 Mar 2022"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "70",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / CDMA 2000",
    "notes": "CDMA to shut down 31 Mar 2022"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "71",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / CDMA 2000",
    "notes": "CDMA to shut down 31 Mar 2022"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "72",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / CDMA 2000",
    "notes": "CDMA to shut down 31 Mar 2022"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "73",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / CDMA 2000",
    "notes": "CDMA to shut down 31 Mar 2022"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "74",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / CDMA 2000",
    "notes": "CDMA to shut down 31 Mar 2022"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "75",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / CDMA 2000",
    "notes": "CDMA to shut down 31 Mar 2022"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "76",
    "brand": "au",
    "operator": "KDDI Corporation",
    "status": "Operational",
    "bands": "CDMA 850 / CDMA 2000",
    "notes": "CDMA to shut down 31 Mar 2022"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "440",
    "mnc": "78",
    "brand": "au",
    "operator": "Okinawa Cellular Telephone",
    "status": "Operational",
    "bands": "CDMA 850 / CDMA 2000",
    "notes": "CDMA to shut down 31 Mar 2022"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "441",
    "mnc": "00",
    "brand": null,
    "operator": "Wireless City Planning Inc.",
    "status": "Operational",
    "bands": "TD-LTE 2500",
    "notes": "band 41; owned by SoftBank"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "441",
    "mnc": "01",
    "brand": "SoftBank",
    "operator": "SoftBank Corp.",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 900 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 3700",
    "notes": "bands 1, 3, 8, 11, 28, 41, 42"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "441",
    "mnc": "10",
    "brand": "UQ WiMAX",
    "operator": "UQ Communications Inc.",
    "status": "Not operational",
    "bands": "TD-LTE 2500",
    "notes": "band 41; WiMAX 2500 shut down 31 Mar 2020; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "441",
    "mnc": "200",
    "brand": null,
    "operator": "Soracom Inc.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "IoT"
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "441",
    "mnc": "201",
    "brand": null,
    "operator": "Aurens Co., Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "441",
    "mnc": "202",
    "brand": null,
    "operator": "Sony Wireless Communications Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "441",
    "mnc": "203",
    "brand": null,
    "operator": "Gujo City",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "441",
    "mnc": "204",
    "brand": null,
    "operator": "Wicom Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "441",
    "mnc": "205",
    "brand": null,
    "operator": "Katch Network Inc.",
    "status": "Operational",
    "bands": "5G 4700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "441",
    "mnc": "206",
    "brand": null,
    "operator": "Mitsubishi Electric Corp.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Japan",
    "countryCode": "JP",
    "mcc": "441",
    "mnc": "91",
    "brand": null,
    "operator": "Tokyo Organising Committee of the Olympic and Paralympic Games",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Jordan",
    "countryCode": "JO",
    "mcc": "416",
    "mnc": "01",
    "brand": "zain JO",
    "operator": "Jordan Mobile Telephone Services",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": "Former Fastlink"
  },
  {
    "type": "National",
    "countryName": "Jordan",
    "countryCode": "JO",
    "mcc": "416",
    "mnc": "02",
    "brand": "XPress Telecom",
    "operator": "XPress Telecom",
    "status": "Not operational",
    "bands": "iDEN 800",
    "notes": "Shut down in 2010"
  },
  {
    "type": "National",
    "countryName": "Jordan",
    "countryCode": "JO",
    "mcc": "416",
    "mnc": "03",
    "brand": "Umniah",
    "operator": "Umniah Mobile Company",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Jordan",
    "countryCode": "JO",
    "mcc": "416",
    "mnc": "77",
    "brand": "Orange",
    "operator": "Petra Jordanian Mobile Telecommunications Company (MobileCom)",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kazakhstan",
    "countryCode": "KZ",
    "mcc": "401",
    "mnc": "01",
    "brand": "Beeline",
    "operator": "KaR-Tel LLP",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kazakhstan",
    "countryCode": "KZ",
    "mcc": "401",
    "mnc": "02",
    "brand": "Kcell",
    "operator": "Kcell JSC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kazakhstan",
    "countryCode": "KZ",
    "mcc": "401",
    "mnc": "07",
    "brand": "Altel",
    "operator": "Altel",
    "status": "Operational",
    "bands": "UMTS 850 / GSM 1800 / LTE 1800",
    "notes": "CDMA 800 closed 1 July 2015; acquired by Tele2"
  },
  {
    "type": "National",
    "countryName": "Kazakhstan",
    "countryCode": "KZ",
    "mcc": "401",
    "mnc": "08",
    "brand": "Kazakhtelecom",
    "operator": null,
    "status": "Operational",
    "bands": "CDMA 450 / CDMA 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kazakhstan",
    "countryCode": "KZ",
    "mcc": "401",
    "mnc": "77",
    "brand": "Tele2.kz",
    "operator": "MTS",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / 5G",
    "notes": "Called Mobile Telecom Service before its acquisition by Tele2"
  },
  {
    "type": "National",
    "countryName": "North Korea",
    "countryCode": "KP",
    "mcc": "467",
    "mnc": "05",
    "brand": "Koryolink",
    "operator": "Cheo Technology Jv Company",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": "for foreigners"
  },
  {
    "type": "National",
    "countryName": "North Korea",
    "countryCode": "KP",
    "mcc": "467",
    "mnc": "06",
    "brand": "Koryolink",
    "operator": "Cheo Technology Jv Company",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": "for DPRK citizens"
  },
  {
    "type": "National",
    "countryName": "North Korea",
    "countryCode": "KP",
    "mcc": "467",
    "mnc": "193",
    "brand": "SunNet",
    "operator": "Korea Posts and Telecommunications Corporation",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Korea",
    "countryCode": "KR",
    "mcc": "450",
    "mnc": "01",
    "brand": null,
    "operator": "Globalstar Asia Pacific",
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Korea",
    "countryCode": "KR",
    "mcc": "450",
    "mnc": "02",
    "brand": "KT",
    "operator": "KT",
    "status": "Operational",
    "bands": "5G 3500 / 5G 28000",
    "notes": "former Hansol PCS (CDMA 1800), merged with KT in 2002"
  },
  {
    "type": "National",
    "countryName": "South Korea",
    "countryCode": "KR",
    "mcc": "450",
    "mnc": "03",
    "brand": "Power 017",
    "operator": "Shinsegi Telecom, Inc.",
    "status": "Not operational",
    "bands": "CDMA 850",
    "notes": "Merged with SK Telecom in 2002; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "South Korea",
    "countryCode": "KR",
    "mcc": "450",
    "mnc": "04",
    "brand": "KT",
    "operator": "KT",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": "NB-IoT network (LTE Cat NB1); former CDMA 1800"
  },
  {
    "type": "National",
    "countryName": "South Korea",
    "countryCode": "KR",
    "mcc": "450",
    "mnc": "05",
    "brand": "SKTelecom",
    "operator": "SK Telecom",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 850 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500 / 5G 28000",
    "notes": "CDMA 850 shut down June 2020"
  },
  {
    "type": "National",
    "countryName": "South Korea",
    "countryCode": "KR",
    "mcc": "450",
    "mnc": "06",
    "brand": "LG U+",
    "operator": "LG Telecom",
    "status": "Operational",
    "bands": "LTE 850 / LTE 2100 / LTE 2600 / 5G 3500 / 5G 28000",
    "notes": "CDMA 1800 shut down June 2021"
  },
  {
    "type": "National",
    "countryName": "South Korea",
    "countryCode": "KR",
    "mcc": "450",
    "mnc": "07",
    "brand": "KT",
    "operator": "KT",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Korea",
    "countryCode": "KR",
    "mcc": "450",
    "mnc": "08",
    "brand": "olleh",
    "operator": "KT",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Korea",
    "countryCode": "KR",
    "mcc": "450",
    "mnc": "11",
    "brand": "Tplus",
    "operator": "Korea Cable Telecom",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "MVNO of SK Telecom"
  },
  {
    "type": "National",
    "countryName": "South Korea",
    "countryCode": "KR",
    "mcc": "450",
    "mnc": "12",
    "brand": "SKTelecom",
    "operator": "SK Telecom",
    "status": "Operational",
    "bands": "LTE 850 / LTE 1800",
    "notes": "IoT network (LTE Cat M1)"
  },
  {
    "type": "National",
    "countryName": "Kuwait",
    "countryCode": "KW",
    "mcc": "419",
    "mnc": "02",
    "brand": "zain KW",
    "operator": "Zain Kuwait",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kuwait",
    "countryCode": "KW",
    "mcc": "419",
    "mnc": "03",
    "brand": "Ooredoo",
    "operator": "National Mobile Telecommunications",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kuwait",
    "countryCode": "KW",
    "mcc": "419",
    "mnc": "04",
    "brand": "STC",
    "operator": "Saudi Telecom Company",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 2100 / 5G 3500",
    "notes": "Former VIVA"
  },
  {
    "type": "National",
    "countryName": "Kyrgyzstan",
    "countryCode": "KG",
    "mcc": "437",
    "mnc": "01",
    "brand": "Beeline",
    "operator": "Sky Mobile LLC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800",
    "notes": "Former Bitel"
  },
  {
    "type": "National",
    "countryName": "Kyrgyzstan",
    "countryCode": "KG",
    "mcc": "437",
    "mnc": "03",
    "brand": null,
    "operator": "7 Mobile",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Fonex/Aktel"
  },
  {
    "type": "National",
    "countryName": "Kyrgyzstan",
    "countryCode": "KG",
    "mcc": "437",
    "mnc": "05",
    "brand": "MegaCom",
    "operator": "Alfa Telecom CJSC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kyrgyzstan",
    "countryCode": "KG",
    "mcc": "437",
    "mnc": "09",
    "brand": "O!",
    "operator": "NurTelecom LLC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kyrgyzstan",
    "countryCode": "KG",
    "mcc": "437",
    "mnc": "10",
    "brand": null,
    "operator": "Saima Telecom",
    "status": "Operational",
    "bands": "LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kyrgyzstan",
    "countryCode": "KG",
    "mcc": "437",
    "mnc": "11",
    "brand": null,
    "operator": "iTel",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Laos",
    "countryCode": "LA",
    "mcc": "457",
    "mnc": "01",
    "brand": "LaoTel",
    "operator": "Lao Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Laos",
    "countryCode": "LA",
    "mcc": "457",
    "mnc": "02",
    "brand": "ETL",
    "operator": "Enterprise of Telecommunications Lao",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Laos",
    "countryCode": "LA",
    "mcc": "457",
    "mnc": "03",
    "brand": "Unitel",
    "operator": "Star Telecom Co., Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Lao-Asia Telecom Company (LAT); owned by Viettel"
  },
  {
    "type": "National",
    "countryName": "Laos",
    "countryCode": "LA",
    "mcc": "457",
    "mnc": "07",
    "brand": "Best",
    "operator": "Best Telecom Co., Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Laos",
    "countryCode": "LA",
    "mcc": "457",
    "mnc": "08",
    "brand": "Beeline",
    "operator": "VimpelCom Lao Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former Millicom Lao Co Ltd (Tigo)"
  },
  {
    "type": "National",
    "countryName": "Lebanon",
    "countryCode": "LB",
    "mcc": "415",
    "mnc": "01",
    "brand": "Alfa",
    "operator": "MIC 1",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lebanon",
    "countryCode": "LB",
    "mcc": "415",
    "mnc": "03",
    "brand": "Touch",
    "operator": "MIC 2",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lebanon",
    "countryCode": "LB",
    "mcc": "415",
    "mnc": "05",
    "brand": "Ogero Mobile",
    "operator": "Ogero Telecom",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Macau (People's Republic of China)",
    "countryCode": "MO",
    "mcc": "455",
    "mnc": "00",
    "brand": "SmarTone",
    "operator": "Smartone – Comunicações Móveis, S.A.",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 1800",
    "notes": "GSM shut down 1 Aug 2019"
  },
  {
    "type": "National",
    "countryName": "Macau (People's Republic of China)",
    "countryCode": "MO",
    "mcc": "455",
    "mnc": "01",
    "brand": "CTM",
    "operator": "Companhia de Telecomunicações de Macau, S.A.R.L.",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": "GSM shut down 1 Aug 2019"
  },
  {
    "type": "National",
    "countryName": "Macau (People's Republic of China)",
    "countryCode": "MO",
    "mcc": "455",
    "mnc": "02",
    "brand": "China Telecom",
    "operator": "China Telecom (Macau) Company Limited",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "Shut down 2010"
  },
  {
    "type": "National",
    "countryName": "Macau (People's Republic of China)",
    "countryCode": "MO",
    "mcc": "455",
    "mnc": "03",
    "brand": "3",
    "operator": "Hutchison Telephone (Macau), Limitada",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "GSM shut down 1 Aug 2019"
  },
  {
    "type": "National",
    "countryName": "Macau (People's Republic of China)",
    "countryCode": "MO",
    "mcc": "455",
    "mnc": "04",
    "brand": "CTM",
    "operator": "Companhia de Telecomunicações de Macau, S.A.R.L.",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": "GSM shut down 1 Aug 2019"
  },
  {
    "type": "National",
    "countryName": "Macau (People's Republic of China)",
    "countryCode": "MO",
    "mcc": "455",
    "mnc": "05",
    "brand": "3",
    "operator": "Hutchison Telephone (Macau), Limitada",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Macau (People's Republic of China)",
    "countryCode": "MO",
    "mcc": "455",
    "mnc": "06",
    "brand": "SmarTone",
    "operator": "Smartone – Comunicações Móveis, S.A.",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": "GSM shut down 1 Aug 2019"
  },
  {
    "type": "National",
    "countryName": "Macau (People's Republic of China)",
    "countryCode": "MO",
    "mcc": "455",
    "mnc": "07",
    "brand": "China Telecom",
    "operator": "China Telecom (Macau) Limitada",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Maldives",
    "countryCode": "MV",
    "mcc": "472",
    "mnc": "01",
    "brand": "Dhiraagu",
    "operator": "Dhivehi Raajjeyge Gulhun",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Maldives",
    "countryCode": "MV",
    "mcc": "472",
    "mnc": "02",
    "brand": "Ooredoo",
    "operator": "Ooredoo Maldives",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": "Former Wataniya Telecom"
  },
  {
    "type": "National",
    "countryName": "Mongolia",
    "countryCode": "MN",
    "mcc": "428",
    "mnc": "88",
    "brand": "Unitel",
    "operator": "Unitel LLC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mongolia",
    "countryCode": "MN",
    "mcc": "428",
    "mnc": "91",
    "brand": "Skytel",
    "operator": "Skytel LLC",
    "status": "Operational",
    "bands": "CDMA 850 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mongolia",
    "countryCode": "MN",
    "mcc": "428",
    "mnc": "98",
    "brand": "G-Mobile",
    "operator": "G-Mobile LLC",
    "status": "Operational",
    "bands": "CDMA 450 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mongolia",
    "countryCode": "MN",
    "mcc": "428",
    "mnc": "99",
    "brand": "Mobicom",
    "operator": "Mobicom Corporation",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 700 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "00",
    "brand": "MPT",
    "operator": "Myanmar Posts and Telecommunications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "01",
    "brand": "MPT",
    "operator": "Myanmar Posts and Telecommunications",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "02",
    "brand": "MPT",
    "operator": "Myanmar Posts and Telecommunications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "03",
    "brand": "CDMA800",
    "operator": "Myanmar Economic Corporation",
    "status": "Operational",
    "bands": "CDMA 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "04",
    "brand": "MPT",
    "operator": "Myanmar Posts and Telecommunications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "05",
    "brand": "Ooredoo",
    "operator": "Ooredoo Myanmar",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "06",
    "brand": "Telenor",
    "operator": "Telenor Myanmar",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "09",
    "brand": "Mytel",
    "operator": "Myanmar National Tele & Communication Co., Ltd",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "20",
    "brand": "ACS",
    "operator": "Amara Communication Co., Ltd",
    "status": "Operational",
    "bands": "TD-LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "21",
    "brand": "ACS",
    "operator": "Amara Communication Co., Ltd",
    "status": "Operational",
    "bands": "TD-LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "22",
    "brand": null,
    "operator": "Fortune Telecom Co., Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Myanmar",
    "countryCode": "MM",
    "mcc": "414",
    "mnc": "23",
    "brand": null,
    "operator": "Global Technology Co., Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Nepal",
    "countryCode": "NP",
    "mcc": "429",
    "mnc": "01",
    "brand": "Namaste / NT Mobile / Sky Phone",
    "operator": "Nepal Telecom (NDCL)",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800 / CDMA 850 / WiMAX",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Nepal",
    "countryCode": "NP",
    "mcc": "429",
    "mnc": "02",
    "brand": "Ncell",
    "operator": "Ncell Pvt. Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Nepal",
    "countryCode": "NP",
    "mcc": "429",
    "mnc": "03",
    "brand": "UTL",
    "operator": "United Telecom Limited",
    "status": "Operational",
    "bands": "CDMA2000 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Nepal",
    "countryCode": "NP",
    "mcc": "429",
    "mnc": "04",
    "brand": "SmartCell",
    "operator": "Smart Telecom Pvt. Ltd. (STPL)",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Oman",
    "countryCode": "OM",
    "mcc": "422",
    "mnc": "02",
    "brand": "Omantel",
    "operator": "Oman Telecommunications Company",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 1800 / TD-LTE 2300 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Oman",
    "countryCode": "OM",
    "mcc": "422",
    "mnc": "03",
    "brand": "Ooredoo",
    "operator": "Omani Qatari Telecommunications Company SAOC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 1800 / TD-LTE 2300 / 5G 3500",
    "notes": "Former Nawras"
  },
  {
    "type": "National",
    "countryName": "Oman",
    "countryCode": "OM",
    "mcc": "422",
    "mnc": "04",
    "brand": "Omantel",
    "operator": "Oman Telecommunications Company",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Oman",
    "countryCode": "OM",
    "mcc": "422",
    "mnc": "06",
    "brand": "Vodafone",
    "operator": "Oman Telecommunication Company SAOC",
    "status": "Operational",
    "bands": "5G 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Pakistan",
    "countryCode": "PK",
    "mcc": "410",
    "mnc": "01",
    "brand": "Jazz",
    "operator": "Mobilink-PMCL",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800",
    "notes": "Former Mobilink"
  },
  {
    "type": "National",
    "countryName": "Pakistan",
    "countryCode": "PK",
    "mcc": "410",
    "mnc": "02",
    "brand": "3G EVO / CharJi 4G",
    "operator": "PTCL",
    "status": "Operational",
    "bands": "CDMA2000 1900 / TD-LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Pakistan",
    "countryCode": "PK",
    "mcc": "410",
    "mnc": "03",
    "brand": "Ufone",
    "operator": "Pakistan Telecommunication Mobile Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Pakistan",
    "countryCode": "PK",
    "mcc": "410",
    "mnc": "04",
    "brand": "Zong",
    "operator": "China Mobile",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": "Former Paktel"
  },
  {
    "type": "National",
    "countryName": "Pakistan",
    "countryCode": "PK",
    "mcc": "410",
    "mnc": "05",
    "brand": "SCO Mobile",
    "operator": "SCO Mobile Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Pakistan",
    "countryCode": "PK",
    "mcc": "410",
    "mnc": "06",
    "brand": "Telenor",
    "operator": "Telenor Pakistan",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 850 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Pakistan",
    "countryCode": "PK",
    "mcc": "410",
    "mnc": "07",
    "brand": "Jazz",
    "operator": "WaridTel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Warid Pakistan"
  },
  {
    "type": "National",
    "countryName": "Pakistan",
    "countryCode": "PK",
    "mcc": "410",
    "mnc": "08",
    "brand": "SCO Mobile",
    "operator": "SCO Mobile Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Palestine",
    "countryCode": "PS",
    "mcc": "425",
    "mnc": "05",
    "brand": "Jawwal",
    "operator": "Palestine Cellular Communications, Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Palestine",
    "countryCode": "PS",
    "mcc": "425",
    "mnc": "06",
    "brand": "Ooredoo",
    "operator": "Ooredoo Palestine",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former Wataniya"
  },
  {
    "type": "National",
    "countryName": "Qatar",
    "countryCode": "QA",
    "mcc": "427",
    "mnc": "01",
    "brand": "Ooredoo",
    "operator": "Ooredoo",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": "Former Qtel (Qatar Telecom)"
  },
  {
    "type": "National",
    "countryName": "Qatar",
    "countryCode": "QA",
    "mcc": "427",
    "mnc": "02",
    "brand": "Vodafone",
    "operator": "Vodafone Qatar",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Qatar",
    "countryCode": "QA",
    "mcc": "427",
    "mnc": "05",
    "brand": "Ministry of Interior",
    "operator": "Ministry of Interior",
    "status": "Operational",
    "bands": "TETRA 380",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Qatar",
    "countryCode": "QA",
    "mcc": "427",
    "mnc": "06",
    "brand": "Ministry of Interior",
    "operator": "Ministry of Interior",
    "status": "Operational",
    "bands": "LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saudi Arabia",
    "countryCode": "SA",
    "mcc": "420",
    "mnc": "01",
    "brand": "Al Jawal (STC )",
    "operator": "Saudi Telecom Company",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / TD-LTE 2300 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saudi Arabia",
    "countryCode": "SA",
    "mcc": "420",
    "mnc": "03",
    "brand": "Mobily",
    "operator": "Etihad Etisalat Company",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / TD-LTE 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saudi Arabia",
    "countryCode": "SA",
    "mcc": "420",
    "mnc": "04",
    "brand": "Zain SA",
    "operator": "Zain Saudi Arabia",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500 / 5G 2500 / 5G 3500",
    "notes": "Active September 2008"
  },
  {
    "type": "National",
    "countryName": "Saudi Arabia",
    "countryCode": "SA",
    "mcc": "420",
    "mnc": "05",
    "brand": "Virgin Mobile",
    "operator": "Virgin Mobile Saudi Arabia",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Al Jawal network"
  },
  {
    "type": "National",
    "countryName": "Saudi Arabia",
    "countryCode": "SA",
    "mcc": "420",
    "mnc": "06",
    "brand": "Lebara Mobile",
    "operator": "Lebara Mobile",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Saudi Arabia",
    "countryCode": "SA",
    "mcc": "420",
    "mnc": "21",
    "brand": "RGSM",
    "operator": "Saudi Railways GSM",
    "status": "Operational",
    "bands": "GSM-R 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sri Lanka",
    "countryCode": "LK",
    "mcc": "413",
    "mnc": "01",
    "brand": "Mobitel",
    "operator": "Mobitel (Pvt) Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 850 / LTE 900 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sri Lanka",
    "countryCode": "LK",
    "mcc": "413",
    "mnc": "02",
    "brand": "Dialog",
    "operator": "Dialog Axiata PLC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former MTN"
  },
  {
    "type": "National",
    "countryName": "Sri Lanka",
    "countryCode": "LK",
    "mcc": "413",
    "mnc": "03",
    "brand": "Hutch",
    "operator": "Hutchison Telecommunications Lanka (Pvt) Ltd",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former Etisalat; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Sri Lanka",
    "countryCode": "LK",
    "mcc": "413",
    "mnc": "04",
    "brand": "Lanka Bell",
    "operator": "Lanka Bell Ltd",
    "status": "Operational",
    "bands": "CDMA / WiMAX / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sri Lanka",
    "countryCode": "LK",
    "mcc": "413",
    "mnc": "05",
    "brand": "Airtel",
    "operator": "Bharti Airtel Lanka (Pvt) Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 850 / LTE 2100 / TD-LTE 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sri Lanka",
    "countryCode": "LK",
    "mcc": "413",
    "mnc": "08",
    "brand": "Hutch",
    "operator": "Hutchison Telecommunications Lanka (Pvt) Ltd",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sri Lanka",
    "countryCode": "LK",
    "mcc": "413",
    "mnc": "09",
    "brand": "Hutch",
    "operator": "Hutchison Telecommunications Lanka (Pvt) Ltd",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Sri Lanka",
    "countryCode": "LK",
    "mcc": "413",
    "mnc": "11",
    "brand": "Dialog",
    "operator": "Dialog Broadband Networks (Pvt) Ltd",
    "status": "Operational",
    "bands": "CDMA / WiMAX / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sri Lanka",
    "countryCode": "LK",
    "mcc": "413",
    "mnc": "12",
    "brand": "SLT",
    "operator": "Sri Lanka Telecom PLC",
    "status": "Operational",
    "bands": "TD-LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Syria",
    "countryCode": "SY",
    "mcc": "417",
    "mnc": "01",
    "brand": "Syriatel",
    "operator": "Syriatel Mobile Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Syria",
    "countryCode": "SY",
    "mcc": "417",
    "mnc": "02",
    "brand": "MTN",
    "operator": "MTN Syria",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Spacetel"
  },
  {
    "type": "National",
    "countryName": "Syria",
    "countryCode": "SY",
    "mcc": "417",
    "mnc": "09",
    "brand": null,
    "operator": "Syrian Telecom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "01",
    "brand": "FarEasTone",
    "operator": "Far EasTone Telecommunications Co Ltd",
    "status": "Operational",
    "bands": "LTE 700 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "LTE band 28;"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "02",
    "brand": "FarEasTone",
    "operator": "Far EasTone Telecommunications Co Ltd",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "GSM shut down July 2017"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "03",
    "brand": "FarEasTone",
    "operator": "Far EasTone Telecommunications Co Ltd",
    "status": "Not operational",
    "bands": "UMTS 2100",
    "notes": "UMTS shut down Dec 2018"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "05",
    "brand": "Gt",
    "operator": "Asia Pacific Telecom",
    "status": "Operational",
    "bands": "LTE 700 / LTE 900 / TD-LTE 2600 / 5G 3500 / 5G 28000",
    "notes": "LTE bands 28 / 8 / 41; CDMA 850 MHz shut down Dec 2017"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "06",
    "brand": "FarEasTone",
    "operator": "Far EasTone Telecommunications Co Ltd",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Former KG Telecom until 2004"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "07",
    "brand": "FarEasTone",
    "operator": "Far EasTone Telecommunications Co Ltd",
    "status": "Not operational",
    "bands": "WiMAX 2600",
    "notes": "Shut down in 2015"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "09",
    "brand": "VMAX",
    "operator": "Vmax Telecom",
    "status": "Operational",
    "bands": "WiMAX 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "10",
    "brand": "G1",
    "operator": "Global Mobile Corp.",
    "status": "Operational",
    "bands": "WiMAX 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "11",
    "brand": "Chunghwa LDM",
    "operator": "LDTA/Chunghwa Telecom",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Also known as \"Long Distance & Mobile Business Group\""
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "12",
    "brand": null,
    "operator": "Ambit Microsystems",
    "status": "Operational",
    "bands": "LTE 700 / LTE 900",
    "notes": "Subsidiary of Foxconn; LTE band 28"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "56",
    "brand": "FITEL",
    "operator": "First International Telecom",
    "status": "Not operational",
    "bands": "WiMAX 2600 / PHS",
    "notes": "Bankruptcy in 2014"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "68",
    "brand": null,
    "operator": "Tatung InfoComm",
    "status": "Not operational",
    "bands": "WiMAX 2600",
    "notes": "License expired in 2014"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "88",
    "brand": "FarEasTone",
    "operator": "Far EasTone Telecommunications Co Ltd",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Former KG Telecom until 2004, KG Telecom brand used until 2009"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "89",
    "brand": "T Star",
    "operator": "Taiwan Star Telecom",
    "status": "Operational",
    "bands": "LTE 900 / LTE 2600 / 5G 3500",
    "notes": "UMTS shut down Dec 2018"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "90",
    "brand": "T Star",
    "operator": "Taiwan Star Telecom",
    "status": "Unknown",
    "bands": "LTE 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "92",
    "brand": "Chunghwa",
    "operator": "Chunghwa Telecom",
    "status": "Operational",
    "bands": "LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "GSM shut down July 2017; UMTS shut down Dec 2018"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "93",
    "brand": "MobiTai",
    "operator": "Mobitai Communications",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Acquired by Taiwan Mobile in 2004, MobiTai brand used until 2008"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "97",
    "brand": "Taiwan Mobile",
    "operator": "Taiwan Mobile Co. Ltd",
    "status": "Operational",
    "bands": "LTE 700 / LTE 1800 / LTE 2100 / 5G 3500",
    "notes": "LTE band 28; GSM shut down July 2017; UMTS shut down Dec 2018"
  },
  {
    "type": "National",
    "countryName": "Taiwan",
    "countryCode": "TW",
    "mcc": "466",
    "mnc": "99",
    "brand": "TransAsia",
    "operator": "TransAsia Telecoms",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Acquired by Taiwan Mobile in 2002, TransAsia brand used until 2008"
  },
  {
    "type": "National",
    "countryName": "Tajikistan",
    "countryCode": "TJ",
    "mcc": "436",
    "mnc": "01",
    "brand": "Tcell",
    "operator": "JV Somoncom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tajikistan",
    "countryCode": "TJ",
    "mcc": "436",
    "mnc": "02",
    "brand": "Tcell",
    "operator": "Indigo Tajikistan",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tajikistan",
    "countryCode": "TJ",
    "mcc": "436",
    "mnc": "03",
    "brand": "MegaFon",
    "operator": "TT Mobile",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tajikistan",
    "countryCode": "TJ",
    "mcc": "436",
    "mnc": "04",
    "brand": "Babilon-M",
    "operator": "Babilon-Mobile",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tajikistan",
    "countryCode": "TJ",
    "mcc": "436",
    "mnc": "05",
    "brand": "ZET-Mobile",
    "operator": "Tacom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2100",
    "notes": "Former Beeline"
  },
  {
    "type": "National",
    "countryName": "Tajikistan",
    "countryCode": "TJ",
    "mcc": "436",
    "mnc": "10",
    "brand": "Babilon-T",
    "operator": "Babilon-T",
    "status": "Operational",
    "bands": "TD-LTE 2300 / WiMAX",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tajikistan",
    "countryCode": "TJ",
    "mcc": "436",
    "mnc": "12",
    "brand": "Tcell",
    "operator": "Indigo",
    "status": "Unknown",
    "bands": "UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Turkmenistan",
    "countryCode": "TM",
    "mcc": "438",
    "mnc": "01",
    "brand": "MTS",
    "operator": "MTS Turkmenistan",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Forced to shut down 2017"
  },
  {
    "type": "National",
    "countryName": "Turkmenistan",
    "countryCode": "TM",
    "mcc": "438",
    "mnc": "02",
    "brand": "TM-Cell",
    "operator": "Altyn Asyr",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Turkmenistan",
    "countryCode": "TM",
    "mcc": "438",
    "mnc": "03",
    "brand": "AGTS CDMA",
    "operator": "AŞTU",
    "status": "Operational",
    "bands": "CDMA 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Arab Emirates",
    "countryCode": "AE",
    "mcc": "424",
    "mnc": "02",
    "brand": "Etisalat",
    "operator": "Emirates Telecom Corp",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "United Arab Emirates",
    "countryCode": "AE",
    "mcc": "424",
    "mnc": "03",
    "brand": "du",
    "operator": "Emirates Integrated Telecommunications Company",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uzbekistan",
    "countryCode": "UZ",
    "mcc": "434",
    "mnc": "01",
    "brand": null,
    "operator": "Buztel",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uzbekistan",
    "countryCode": "UZ",
    "mcc": "434",
    "mnc": "02",
    "brand": null,
    "operator": "Uzmacom",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uzbekistan",
    "countryCode": "UZ",
    "mcc": "434",
    "mnc": "03",
    "brand": "UzMobile",
    "operator": "Uzbektelekom",
    "status": "Operational",
    "bands": "CDMA 450",
    "notes": "EVDO Rev A"
  },
  {
    "type": "National",
    "countryName": "Uzbekistan",
    "countryCode": "UZ",
    "mcc": "434",
    "mnc": "04",
    "brand": "Beeline",
    "operator": "Unitel LLC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600",
    "notes": "Former Daewoo Unitel"
  },
  {
    "type": "National",
    "countryName": "Uzbekistan",
    "countryCode": "UZ",
    "mcc": "434",
    "mnc": "05",
    "brand": "Ucell",
    "operator": "Coscom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uzbekistan",
    "countryCode": "UZ",
    "mcc": "434",
    "mnc": "06",
    "brand": "Perfectum Mobile",
    "operator": "RUBICON WIRELESS COMMUNICATION",
    "status": "Operational",
    "bands": "CDMA 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uzbekistan",
    "countryCode": "UZ",
    "mcc": "434",
    "mnc": "07",
    "brand": "Mobiuz",
    "operator": "Universal Mobile Systems (UMS)",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uzbekistan",
    "countryCode": "UZ",
    "mcc": "434",
    "mnc": "08",
    "brand": "UzMobile",
    "operator": "Uzbektelekom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uzbekistan",
    "countryCode": "UZ",
    "mcc": "434",
    "mnc": "09",
    "brand": "EVO",
    "operator": "OOO «Super iMAX»",
    "status": "Operational",
    "bands": "WiMAX / LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Vietnam",
    "countryCode": "VN",
    "mcc": "452",
    "mnc": "01",
    "brand": "MobiFone",
    "operator": "Vietnam Mobile Telecom Services Company",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Vietnam",
    "countryCode": "VN",
    "mcc": "452",
    "mnc": "02",
    "brand": "Vinaphone",
    "operator": "Vietnam Telecom Services Company",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Vietnam",
    "countryCode": "VN",
    "mcc": "452",
    "mnc": "03",
    "brand": "S-Fone",
    "operator": "S-Telecom",
    "status": "Not operational",
    "bands": "CDMA2000 800",
    "notes": "License revoked; MNC withdawn"
  },
  {
    "type": "National",
    "countryName": "Vietnam",
    "countryCode": "VN",
    "mcc": "452",
    "mnc": "04",
    "brand": "Viettel Mobile",
    "operator": "Viettel Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Vietnam",
    "countryCode": "VN",
    "mcc": "452",
    "mnc": "05",
    "brand": "Vietnamobile",
    "operator": "Hanoi Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Vietnam",
    "countryCode": "VN",
    "mcc": "452",
    "mnc": "06",
    "brand": "EVNTelecom",
    "operator": "EVN Telecom",
    "status": "Not operational",
    "bands": "CDMA2000 450",
    "notes": "License revoked; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Vietnam",
    "countryCode": "VN",
    "mcc": "452",
    "mnc": "07",
    "brand": "Gmobile",
    "operator": "GTEL Mobile JSC",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Former Beeline"
  },
  {
    "type": "National",
    "countryName": "Vietnam",
    "countryCode": "VN",
    "mcc": "452",
    "mnc": "08",
    "brand": "I-Telecom",
    "operator": "Indochina Telecom",
    "status": "Operational",
    "bands": "WiMAX",
    "notes": "Former EVNTelecom"
  },
  {
    "type": "National",
    "countryName": "Vietnam",
    "countryCode": "VN",
    "mcc": "452",
    "mnc": "09",
    "brand": "REDDI",
    "operator": "MOBICAST JSC",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Vinaphone"
  },
  {
    "type": "National",
    "countryName": "Yemen",
    "countryCode": "YE",
    "mcc": "421",
    "mnc": "01",
    "brand": "SabaFon",
    "operator": null,
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Yemen",
    "countryCode": "YE",
    "mcc": "421",
    "mnc": "02",
    "brand": "MTN",
    "operator": "Spacetel Yemen",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Yemen",
    "countryCode": "YE",
    "mcc": "421",
    "mnc": "03",
    "brand": "Yemen Mobile",
    "operator": "Yemen Mobile",
    "status": "Operational",
    "bands": "CDMA2000 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Yemen",
    "countryCode": "YE",
    "mcc": "421",
    "mnc": "04",
    "brand": "Y",
    "operator": "HiTS-UNITEL",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "American Samoa (United States of America)",
    "countryCode": "AS",
    "mcc": "311",
    "mnc": "780",
    "brand": "ASTCA",
    "operator": "American Samoa Telecommunications",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "Uses United States MCC"
  },
  {
    "type": "National",
    "countryName": "American Samoa (United States of America)",
    "countryCode": "AS",
    "mcc": "544",
    "mnc": "11",
    "brand": "Bluesky",
    "operator": "Bluesky",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700 / LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "01",
    "brand": "Telstra",
    "operator": "Telstra Corporation Limited",
    "status": "Operational",
    "bands": "UMTS 850 / LTE 700 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 850 / 5G 3500 / 5G 28000",
    "notes": "LTE bands 28 / 8 / 3 / 1 / 7; GSM shut down 1 December 2016; UMTS 2100 shut down 25 March 2019"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "02",
    "brand": "Optus",
    "operator": "Singtel Optus Pty Ltd",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / TD-LTE 2300 / LTE 2600 / TD-5G 2300 / 5G 3500 / 5G 28000",
    "notes": "LTE bands 28 / 3 / 1 / 7; GSM shut down 1 August 2017"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "03",
    "brand": "Vodafone",
    "operator": "Vodafone Hutchison Australia Pty Ltd",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 850 / LTE 1800 / LTE 2100 / 5G 700 / 5G 3500",
    "notes": "LTE bands 5 / 3 / 1; GSM shut down 30 April 2018"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "04",
    "brand": null,
    "operator": "Department of Defence",
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Private network"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "05",
    "brand": "Ozitel",
    "operator": null,
    "status": "Not operational",
    "bands": null,
    "notes": "Brand was taken over by Telstra."
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "06",
    "brand": "3",
    "operator": "Vodafone Hutchison Australia Pty Ltd",
    "status": "Not operational",
    "bands": "UMTS 2100",
    "notes": "Vodafone Hutchison Australia and Telstra ended their network sharing agreement on 31 August 2012. The 3TELSTRA network was shut down on this date."
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "07",
    "brand": "Vodafone",
    "operator": "Vodafone Network Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "08",
    "brand": "One.Tel",
    "operator": "One.Tel Limited",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Brand was dissolved."
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "09",
    "brand": "Airnet",
    "operator": null,
    "status": "Not operational",
    "bands": null,
    "notes": "No longer provide mobile services."
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "10",
    "brand": "Norfolk Is.",
    "operator": "Norfolk Telecom",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "11",
    "brand": "Telstra",
    "operator": "Telstra Corporation Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "12",
    "brand": "3",
    "operator": "Vodafone Hutchison Australia Pty Ltd",
    "status": "Not operational",
    "bands": "UMTS 2100",
    "notes": "See MNC 06"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "13",
    "brand": "RailCorp",
    "operator": "Railcorp, Transport for NSW",
    "status": "Operational",
    "bands": "GSM-R 1800",
    "notes": "For use by Sydney Trains Digital Train Radio System"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "14",
    "brand": "AAPT",
    "operator": "TPG Telecom",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Wholesale from Vodafone Hutchison Australia"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "15",
    "brand": "3GIS",
    "operator": null,
    "status": "Not operational",
    "bands": null,
    "notes": "Taken over by Vodafone."
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "16",
    "brand": "VicTrack",
    "operator": "Victorian Rail Track",
    "status": "Operational",
    "bands": "GSM-R 1800",
    "notes": "Digital Train Radio System"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "17",
    "brand": null,
    "operator": "Optus",
    "status": "Operational",
    "bands": "TD-LTE 2300",
    "notes": "Former Vivid Wireless Pty. Ltd."
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "18",
    "brand": "Pactel",
    "operator": "Pactel International Pty Ltd",
    "status": "Not operational",
    "bands": null,
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "19",
    "brand": "Lycamobile",
    "operator": "Lycamobile Pty Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "20",
    "brand": null,
    "operator": "Ausgrid Corporation",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "21",
    "brand": null,
    "operator": "Queensland Rail Limited",
    "status": "Unknown",
    "bands": "GSM-R 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "22",
    "brand": null,
    "operator": "iiNet Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "23",
    "brand": null,
    "operator": "Challenge Networks Pty Ltd",
    "status": "Operational",
    "bands": "LTE 1800 / LTE 2100",
    "notes": "Private networks, primarily for mining industry"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "24",
    "brand": null,
    "operator": "Advanced Communications Technologies Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "25",
    "brand": null,
    "operator": "Pilbara Iron Company Services Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "26",
    "brand": null,
    "operator": "Dialogue Communications Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "27",
    "brand": null,
    "operator": "Nexium Telecommunications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "28",
    "brand": null,
    "operator": "RCOM International Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "30",
    "brand": null,
    "operator": "Compatel Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "31",
    "brand": null,
    "operator": "BHP",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "32",
    "brand": null,
    "operator": "Thales Australia",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "33",
    "brand": null,
    "operator": "CLX Networks Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "34",
    "brand": null,
    "operator": "Santos Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "35",
    "brand": null,
    "operator": "MessageBird Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "36",
    "brand": "Optus",
    "operator": "Optus Mobile Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "37",
    "brand": null,
    "operator": "Yancoal Australia Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "38",
    "brand": "Truphone",
    "operator": "Truphone Pty Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Formerly Crazy John's"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "39",
    "brand": "Telstra",
    "operator": "Telstra Corporation Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "40",
    "brand": null,
    "operator": "CITIC Pacific Mining",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "41",
    "brand": null,
    "operator": "Aqura Technologies Pty",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former OTOC"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "42",
    "brand": "GEMCO",
    "operator": "Groote Eylandt Mining Company Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "43",
    "brand": null,
    "operator": "Arrow Energy Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "44",
    "brand": null,
    "operator": "Roy Hill Iron Ore Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "45",
    "brand": null,
    "operator": "Clermont Coal Operations Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "46",
    "brand": null,
    "operator": "AngloGold Ashanti Australia Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "47",
    "brand": null,
    "operator": "Woodside Energy Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "48",
    "brand": null,
    "operator": "Titan ICT Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "49",
    "brand": null,
    "operator": "Field Solutions Group Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "50",
    "brand": null,
    "operator": "Pivotel Group Pty Ltd",
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "51",
    "brand": null,
    "operator": "Fortescue Metals Group",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "52",
    "brand": null,
    "operator": "OptiTel Australia",
    "status": "Operational",
    "bands": "LTE 1800 / LTE 2100 / 5G 1800 / 5G 2100",
    "notes": "Research, development, and operation; Northern Territory"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "53",
    "brand": null,
    "operator": "Shell Australia Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "54",
    "brand": null,
    "operator": "Nokia Solutions and Networks Australia Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "61",
    "brand": "CommTel NS",
    "operator": "Commtel Network Solutions Pty Ltd",
    "status": "Implement / Design",
    "bands": "LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "62",
    "brand": "NBN",
    "operator": "National Broadband Network Co.",
    "status": "Operational",
    "bands": "TD-LTE 2300 / TD-LTE 3500",
    "notes": "LTE band 40 / 42"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "68",
    "brand": "NBN",
    "operator": "National Broadband Network Co.",
    "status": "Operational",
    "bands": "TD-LTE 2300 / TD-LTE 3500",
    "notes": "LTE band 40 / 42"
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "71",
    "brand": "Telstra",
    "operator": "Telstra Corporation Limited",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "72",
    "brand": "Telstra",
    "operator": "Telstra Corporation Limited",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "88",
    "brand": null,
    "operator": "Pivotel Group Pty Ltd",
    "status": "Operational",
    "bands": "Satellite",
    "notes": "Former Localstar Holding Pty. Ltd."
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "90",
    "brand": "Optus",
    "operator": "Singtel Optus Proprietary Ltd",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Australia",
    "countryCode": "AU/CC/CX",
    "mcc": "505",
    "mnc": "99",
    "brand": "One.Tel",
    "operator": "One.Tel",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Brand was dissolved. Rail operators purchased 1800 spectrum."
  },
  {
    "type": "National",
    "countryName": "Brunei",
    "countryCode": "BN",
    "mcc": "528",
    "mnc": "01",
    "brand": "TelBru",
    "operator": "Telekom Brunei Berhad",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Jabatan Telekom Brunei"
  },
  {
    "type": "National",
    "countryName": "Brunei",
    "countryCode": "BN",
    "mcc": "528",
    "mnc": "02",
    "brand": "PCSB",
    "operator": "Progresif Cellular Sdn Bhd",
    "status": "Operational",
    "bands": "UMTS 2100",
    "notes": "Former B-Mobile"
  },
  {
    "type": "National",
    "countryName": "Brunei",
    "countryCode": "BN",
    "mcc": "528",
    "mnc": "03",
    "brand": "UNN",
    "operator": "Unified National Networks Sdn Bhd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brunei",
    "countryCode": "BN",
    "mcc": "528",
    "mnc": "11",
    "brand": "DST",
    "operator": "Data Stream Technology Sdn Bhd",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cook Islands (Pacific Ocean)",
    "countryCode": "CK",
    "mcc": "548",
    "mnc": "01",
    "brand": "Vodafone",
    "operator": "Telecom Cook Islands",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 700 / LTE 1800",
    "notes": "Former Bluesky; LTE bands 20 / 3"
  },
  {
    "type": "National",
    "countryName": "East Timor",
    "countryCode": "TL",
    "mcc": "514",
    "mnc": "01",
    "brand": "Telkomcel",
    "operator": "PT Telekomunikasi Indonesia International",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "East Timor",
    "countryCode": "TL",
    "mcc": "514",
    "mnc": "02",
    "brand": "TT",
    "operator": "Timor Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "East Timor",
    "countryCode": "TL",
    "mcc": "514",
    "mnc": "03",
    "brand": "Telemor",
    "operator": "Viettel Timor-Leste",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Fiji",
    "countryCode": "FJ",
    "mcc": "542",
    "mnc": "01",
    "brand": "Vodafone",
    "operator": "Vodafone Fiji",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Fiji",
    "countryCode": "FJ",
    "mcc": "542",
    "mnc": "02",
    "brand": "Digicel",
    "operator": "Digicel Fiji",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / WiMAX",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Fiji",
    "countryCode": "FJ",
    "mcc": "542",
    "mnc": "03",
    "brand": "TFL",
    "operator": "Telecom Fiji Ltd",
    "status": "Operational",
    "bands": "CDMA2000 850 / LTE 700",
    "notes": "LTE band 28"
  },
  {
    "type": "National",
    "countryName": "French Polynesia (France)",
    "countryCode": "PF",
    "mcc": "547",
    "mnc": "05",
    "brand": "Ora",
    "operator": "VITI",
    "status": "Operational",
    "bands": "WiMAX / LTE 800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "French Polynesia (France)",
    "countryCode": "PF",
    "mcc": "547",
    "mnc": "10",
    "brand": null,
    "operator": "Mara Telecom",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Bankrupt in 2013"
  },
  {
    "type": "National",
    "countryName": "French Polynesia (France)",
    "countryCode": "PF",
    "mcc": "547",
    "mnc": "15",
    "brand": "Vodafone",
    "operator": "Pacific Mobile Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "French Polynesia (France)",
    "countryCode": "PF",
    "mcc": "547",
    "mnc": "20",
    "brand": "Vini",
    "operator": "Onati S.A.S.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "00",
    "brand": "PSN",
    "operator": "PT Pasifik Satelit Nusantara",
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "01",
    "brand": "Indosat Ooredoo Hutchison",
    "operator": "PT Indosat Tbk",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / 5G 1800",
    "notes": "Former PT Satelindo"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "03",
    "brand": "StarOne",
    "operator": "PT Indosat Tbk",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "Shut down on 30 June 2015"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "07",
    "brand": "TelkomFlexi",
    "operator": "PT Telkom Indonesia Tbk",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "Network shut down end of 2015"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "08",
    "brand": "AXIS",
    "operator": "PT Natrindo Telepon Seluler",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100",
    "notes": "Merged with XL (MNC 11), MNC 08 no longer used"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "09",
    "brand": "Smartfren",
    "operator": "PT Smartfren Telecom",
    "status": "Operational",
    "bands": "LTE 850 / TD-LTE 2300",
    "notes": "CDMA 1900 shut down December 2016, CDMA 850 shut down November 2017"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "10",
    "brand": "Telkomsel",
    "operator": "PT Telekomunikasi Selular",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / TD-LTE 2300 / 5G 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "11",
    "brand": "XL",
    "operator": "PT XL Axiata Tbk",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / 5G 1800 / 5G 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "20",
    "brand": "TELKOMMobile",
    "operator": "PT Telkom Indonesia Tbk",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Telkomsel"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "21",
    "brand": "IM3",
    "operator": "PT Indosat Tbk",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Merged with Indosat (MNC 01), MNC 21 no longer used"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "27",
    "brand": "Net 1",
    "operator": "PT Net Satu Indonesia",
    "status": "Not operational",
    "bands": "LTE 450",
    "notes": "Former Ceria, Sampoerna Telekomunikasi; CDMA 450 shut down 2017; license revoked on 30 November 2021"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "28",
    "brand": "Fren/Hepi",
    "operator": "PT Mobile-8 Telecom",
    "status": "Operational",
    "bands": "LTE 850 / TD-LTE 2300",
    "notes": "Merged with SMART (MNC 09), CDMA 850 shut down November 2017"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "78",
    "brand": "Hinet",
    "operator": "PT Berca Hardayaperkasa",
    "status": "Operational",
    "bands": "TD-LTE 2300",
    "notes": "Denpasar, Pekanbaru and Makassar"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "88",
    "brand": "BOLT! 4G LTE",
    "operator": "PT Internux",
    "status": "Not operational",
    "bands": "TD-LTE 2300",
    "notes": "Shut down on 28 December 2018"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "89",
    "brand": "3",
    "operator": "PT Hutchison 3 Indonesia",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Merged with Indosat (MNC 01)"
  },
  {
    "type": "National",
    "countryName": "Indonesia",
    "countryCode": "ID",
    "mcc": "510",
    "mnc": "99",
    "brand": "Esia",
    "operator": "PT Bakrie Telecom",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "Merged with Smartfren (MNC 09)"
  },
  {
    "type": "National",
    "countryName": "Kiribati",
    "countryCode": "KI",
    "mcc": "545",
    "mnc": "01",
    "brand": "Kiribati - ATH",
    "operator": "Amalgamated Telecom Holdings Kiribati Limited",
    "status": "Operational",
    "bands": "UMTS 900 / LTE 1800",
    "notes": "Former Telecom Services Kiribati Ltd (TSKL)"
  },
  {
    "type": "National",
    "countryName": "Kiribati",
    "countryCode": "KI",
    "mcc": "545",
    "mnc": "02",
    "brand": null,
    "operator": "OceanLink",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kiribati",
    "countryCode": "KI",
    "mcc": "545",
    "mnc": "09",
    "brand": "Kiribati - Frigate Net",
    "operator": "Amalgamated Telecom Holdings Kiribati Limited",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "01",
    "brand": "ATUR 450",
    "operator": "Telekom Malaysia Bhd",
    "status": "Not operational",
    "bands": "CDMA2000 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "10",
    "brand": null,
    "operator": "Maxis, DiGi, Celcom, XOX",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": "Former Celcom"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "11",
    "brand": "TM Homeline",
    "operator": "Telekom Malaysia Bhd",
    "status": "Operational",
    "bands": "CDMA2000 850 / LTE 850",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "12",
    "brand": "Maxis",
    "operator": "Maxis Communications Berhad",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": "Used by MVNO Kartu As; LTE 2600 in co-operation with REDtone"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "13",
    "brand": "Celcom",
    "operator": "Celcom Axiata Berhad",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": "Former Emartel, TMTouch; LTE 2600 in co-operation with Altel"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "14",
    "brand": null,
    "operator": "Telekom Malaysia Berhad for PSTN SMS",
    "status": "Unknown",
    "bands": null,
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "150",
    "brand": "Tune Talk",
    "operator": "Tune Talk Sdn Bhd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "uses Celcom"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "151",
    "brand": "SalamFone",
    "operator": "Baraka Telecom Sdn Bhd",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "(MVNO)-MAXIS, previously using DiGi; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "152",
    "brand": "Yes",
    "operator": "YTL Communications Sdn Bhd",
    "status": "Operational",
    "bands": "TD-LTE 2300 / TD-LTE 2600",
    "notes": "WiMAX shut down 2019"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "153",
    "brand": "unifi",
    "operator": "Webe Digital Sdn Bhd",
    "status": "Operational",
    "bands": "WiMAX 2300 / LTE 850 / TD-LTE 2300",
    "notes": "Former Packet One Networks; subsidiary of Telekom Malaysia"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "154",
    "brand": "Tron",
    "operator": "Talk Focus Sdn Bhd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Digi"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "155",
    "brand": "Clixster",
    "operator": "Clixster Mobile Sdn Bhd",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "Uses Digi; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "156",
    "brand": "Altel",
    "operator": "Altel Communications Sdn Bhd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Using Celcom; LTE 2600 band licensed to Celcom"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "157",
    "brand": "Telin",
    "operator": "Telekomunikasi Indonesia International (M) Sdn Bhd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses U Mobile"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "16",
    "brand": "DiGi",
    "operator": "DiGi Telecommunications",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600",
    "notes": "LTE 2600 coverage limited to certain areas in the Klang Valley at the moment; former Mutiara Telecom"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "17",
    "brand": "Maxis",
    "operator": "Maxis Communications Berhad",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600",
    "notes": "Former TimeCel, Adam017"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "18",
    "brand": "U Mobile",
    "operator": "U Mobile Sdn Bhd",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": "Domestic Roaming with Maxis, also for GSM Former Mobikom"
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "19",
    "brand": "Celcom",
    "operator": "Celcom Axiata Berhad",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Malaysia",
    "countryCode": "MY",
    "mcc": "502",
    "mnc": "20",
    "brand": "Electcoms",
    "operator": "Electcoms Berhad",
    "status": "Not operational",
    "bands": "DMR",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Marshall Islands",
    "countryCode": "MH",
    "mcc": "551",
    "mnc": "01",
    "brand": null,
    "operator": "Marshall Islands National Telecommunications Authority (MINTA)",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Federated States of Micronesia",
    "countryCode": "FM",
    "mcc": "550",
    "mnc": "01",
    "brand": null,
    "operator": "FSMTC",
    "status": "Operational",
    "bands": "GSM 900 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Nauru",
    "countryCode": "NR",
    "mcc": "536",
    "mnc": "02",
    "brand": "Digicel",
    "operator": "Digicel (Nauru) Corporation",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Also uses MCC 542 MNC 02 (Fiji)"
  },
  {
    "type": "National",
    "countryName": "New Caledonia (France)",
    "countryCode": "NC",
    "mcc": "546",
    "mnc": "01",
    "brand": "Mobilis",
    "operator": "OPT New Caledonia",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "New Zealand",
    "countryCode": "NZ",
    "mcc": "530",
    "mnc": "00",
    "brand": "Telecom",
    "operator": "Telecom New Zealand",
    "status": "Not operational",
    "bands": "AMPS 800 / TDMA 800",
    "notes": "Shut down on 31 March 2007"
  },
  {
    "type": "National",
    "countryName": "New Zealand",
    "countryCode": "NZ",
    "mcc": "530",
    "mnc": "01",
    "brand": "Vodafone",
    "operator": "Vodafone New Zealand",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "New Zealand",
    "countryCode": "NZ",
    "mcc": "530",
    "mnc": "02",
    "brand": "Telecom",
    "operator": "Telecom New Zealand",
    "status": "Not operational",
    "bands": "CDMA2000 800",
    "notes": "Shut down on 31 July 2012"
  },
  {
    "type": "National",
    "countryName": "New Zealand",
    "countryCode": "NZ",
    "mcc": "530",
    "mnc": "03",
    "brand": "Woosh",
    "operator": "Woosh Wireless",
    "status": "Not operational",
    "bands": "UMTS-TDD 2000",
    "notes": "Wireless broadband only"
  },
  {
    "type": "National",
    "countryName": "New Zealand",
    "countryCode": "NZ",
    "mcc": "530",
    "mnc": "04",
    "brand": "TelstraClear",
    "operator": "TelstraClear New Zealand",
    "status": "Not operational",
    "bands": "UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "New Zealand",
    "countryCode": "NZ",
    "mcc": "530",
    "mnc": "05",
    "brand": "Spark",
    "operator": "Spark New Zealand",
    "status": "Operational",
    "bands": "UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / TD-LTE 2300 / LTE 2600 / 5G 2600 / 5G 3500",
    "notes": "Formerly Telecom New Zealand"
  },
  {
    "type": "National",
    "countryName": "New Zealand",
    "countryCode": "NZ",
    "mcc": "530",
    "mnc": "06",
    "brand": null,
    "operator": "FX Networks",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "New Zealand",
    "countryCode": "NZ",
    "mcc": "530",
    "mnc": "07",
    "brand": null,
    "operator": "Bluereach Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "New Zealand",
    "countryCode": "NZ",
    "mcc": "530",
    "mnc": "24",
    "brand": "2degrees",
    "operator": "2degrees",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 900 / LTE 1800 / LTE 2100 / 5G 3500",
    "notes": "GSM shut down on 15 March 2018"
  },
  {
    "type": "National",
    "countryName": "Niue",
    "countryCode": "NU",
    "mcc": "555",
    "mnc": "01",
    "brand": "Telecom Niue",
    "operator": "Telecom Niue",
    "status": "Operational",
    "bands": "GSM 900 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Norfolk Island",
    "countryCode": "NF",
    "mcc": "505",
    "mnc": "10",
    "brand": "Norfolk Telecom",
    "operator": "Norfolk Telecom",
    "status": "Operational",
    "bands": "GSM 900 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Palau",
    "countryCode": "PW",
    "mcc": "552",
    "mnc": "01",
    "brand": "PNCC",
    "operator": "Palau National Communications Corp.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Palau",
    "countryCode": "PW",
    "mcc": "552",
    "mnc": "02",
    "brand": "PT Waves",
    "operator": "Palau Equipment Company Inc.",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Palau",
    "countryCode": "PW",
    "mcc": "552",
    "mnc": "80",
    "brand": "Palau Mobile",
    "operator": "Palau Mobile Corporation",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Service shutdown in 2014"
  },
  {
    "type": "National",
    "countryName": "Palau",
    "countryCode": "PW",
    "mcc": "552",
    "mnc": "99",
    "brand": "PMCI",
    "operator": "Palau Mobile Communications Inc.",
    "status": "Operational",
    "bands": "LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Papua New Guinea",
    "countryCode": "PG",
    "mcc": "537",
    "mnc": "01",
    "brand": "bmobile",
    "operator": "Bemobile Limited",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Papua New Guinea",
    "countryCode": "PG",
    "mcc": "537",
    "mnc": "02",
    "brand": "citifon",
    "operator": "Telikom PNG Ltd.",
    "status": "Operational",
    "bands": "CDMA2000 450 / LTE 700",
    "notes": "Formerly Greencom; LTE band 28"
  },
  {
    "type": "National",
    "countryName": "Papua New Guinea",
    "countryCode": "PG",
    "mcc": "537",
    "mnc": "03",
    "brand": "Digicel",
    "operator": "Digicel PNG",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 700",
    "notes": "LTE band 28"
  },
  {
    "type": "National",
    "countryName": "Papua New Guinea",
    "countryCode": "PG",
    "mcc": "537",
    "mnc": "04",
    "brand": null,
    "operator": "Digitec Communication Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Philippines",
    "countryCode": "PH",
    "mcc": "515",
    "mnc": "01",
    "brand": "Islacom",
    "operator": "Globe Telecom via Innove Communications",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Philippines",
    "countryCode": "PH",
    "mcc": "515",
    "mnc": "02",
    "brand": "Globe",
    "operator": "Globe Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / TD-LTE 2300 / TD-LTE 2500 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Philippines",
    "countryCode": "PH",
    "mcc": "515",
    "mnc": "03",
    "brand": "SMART",
    "operator": "PLDT via Smart Communications",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 850 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500 / 5G 3500",
    "notes": "Formerly PilTel"
  },
  {
    "type": "National",
    "countryName": "Philippines",
    "countryCode": "PH",
    "mcc": "515",
    "mnc": "05",
    "brand": "Sun Cellular",
    "operator": "Digital Telecommunications Philippines",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100",
    "notes": "Uses SMART for LTE roaming"
  },
  {
    "type": "National",
    "countryName": "Philippines",
    "countryCode": "PH",
    "mcc": "515",
    "mnc": "11",
    "brand": null,
    "operator": "PLDT via ACeS Philippines",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Philippines",
    "countryCode": "PH",
    "mcc": "515",
    "mnc": "18",
    "brand": "Cure",
    "operator": "PLDT via Smart's Connectivity Unlimited Resources Enterprise",
    "status": "Not operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": "Formerly ümobile, then Red Mobile; shut down 2012"
  },
  {
    "type": "National",
    "countryName": "Philippines",
    "countryCode": "PH",
    "mcc": "515",
    "mnc": "24",
    "brand": "ABS-CBN Mobile",
    "operator": "ABS-CBN Convergence with Globe Telecom",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Philippines",
    "countryCode": "PH",
    "mcc": "515",
    "mnc": "66",
    "brand": "DITO",
    "operator": "Dito Telecommunity Corp.",
    "status": "Operational",
    "bands": "LTE 700 / LTE 2100 / TD-LTE 2500 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Philippines",
    "countryCode": "PH",
    "mcc": "515",
    "mnc": "88",
    "brand": null,
    "operator": "Next Mobile Inc.",
    "status": "Operational",
    "bands": "iDEN",
    "notes": "Former Nextel Philippines"
  },
  {
    "type": "National",
    "countryName": "Samoa",
    "countryCode": "WS",
    "mcc": "549",
    "mnc": "00",
    "brand": "Digicel",
    "operator": "Digicel Pacific Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Samoa",
    "countryCode": "WS",
    "mcc": "549",
    "mnc": "01",
    "brand": "Digicel",
    "operator": "Digicel Pacific Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": "Former Telecom Samoa Cellular Ltd."
  },
  {
    "type": "National",
    "countryName": "Samoa",
    "countryCode": "WS",
    "mcc": "549",
    "mnc": "27",
    "brand": "Vodafone",
    "operator": "Vodafone Samoa Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / LTE 700 / LTE 1800",
    "notes": "Former Samoatel Ltd., Bluesky Samoa"
  },
  {
    "type": "National",
    "countryName": "Singapore",
    "countryCode": "SG",
    "mcc": "525",
    "mnc": "01",
    "brand": "SingTel",
    "operator": "Singapore Telecom",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500 / 5G 28000",
    "notes": "GSM shut down on 1 April 2017"
  },
  {
    "type": "National",
    "countryName": "Singapore",
    "countryCode": "SG",
    "mcc": "525",
    "mnc": "02",
    "brand": "SingTel-G18",
    "operator": "Singapore Telecom",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "GSM shut down on 1 April 2017"
  },
  {
    "type": "National",
    "countryName": "Singapore",
    "countryCode": "SG",
    "mcc": "525",
    "mnc": "03",
    "brand": "M1",
    "operator": "M1 Limited",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500",
    "notes": "GSM shut down on 1 April 2017"
  },
  {
    "type": "National",
    "countryName": "Singapore",
    "countryCode": "SG",
    "mcc": "525",
    "mnc": "05",
    "brand": "StarHub",
    "operator": "StarHub Mobile",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2500 / 5G 2100 / 5G 3500",
    "notes": "GSM shut down on 1 April 2017"
  },
  {
    "type": "National",
    "countryName": "Singapore",
    "countryCode": "SG",
    "mcc": "525",
    "mnc": "06",
    "brand": "StarHub",
    "operator": "StarHub Mobile",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Singapore",
    "countryCode": "SG",
    "mcc": "525",
    "mnc": "07",
    "brand": "SingTel",
    "operator": "Singapore Telecom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Singapore",
    "countryCode": "SG",
    "mcc": "525",
    "mnc": "08",
    "brand": "StarHub",
    "operator": "StarHub Mobile",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Singapore",
    "countryCode": "SG",
    "mcc": "525",
    "mnc": "09",
    "brand": "Circles.Life",
    "operator": "Liberty Wireless Pte Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Singapore",
    "countryCode": "SG",
    "mcc": "525",
    "mnc": "10",
    "brand": null,
    "operator": "TPG Telecom Pte Ltd",
    "status": "Operational",
    "bands": "LTE 900 / TD-LTE 2300 / TD-LTE 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Singapore",
    "countryCode": "SG",
    "mcc": "525",
    "mnc": "11",
    "brand": "M1",
    "operator": "M1 Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Singapore",
    "countryCode": "SG",
    "mcc": "525",
    "mnc": "12",
    "brand": "Grid",
    "operator": "GRID Communications Pte Ltd.",
    "status": "Operational",
    "bands": "iDEN 800",
    "notes": "Digital Trunked Radio Network"
  },
  {
    "type": "National",
    "countryName": "Solomon Islands",
    "countryCode": "SB",
    "mcc": "540",
    "mnc": "01",
    "brand": "BREEZE",
    "operator": "Our Telekom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800",
    "notes": "Former Solomon Telekom Co Ltd"
  },
  {
    "type": "National",
    "countryName": "Solomon Islands",
    "countryCode": "SB",
    "mcc": "540",
    "mnc": "02",
    "brand": "BeMobile",
    "operator": "BMobile (SI) Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "00",
    "brand": "TrueMove H / my by NT",
    "operator": "National Telecom Public Company Limited",
    "status": "Operational",
    "bands": "UMTS 850",
    "notes": "Former Hutch Thailand, CAT Telecom; inbound roaming for TrueMove H"
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "01",
    "brand": "AIS",
    "operator": "Advanced Info Service",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": "UMTS 900 shut down in 2013"
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "02",
    "brand": "CAT CDMA",
    "operator": "CAT Telecom",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "Shut down in April 2013; frequency re-farmed for UMTS 850 network 520-00"
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "03",
    "brand": "AIS",
    "operator": "Advanced Wireless Network Company Ltd.",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 700 / LTE 900 / LTE 1800 / LTE 2100 / 5G 700 / 5G 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "04",
    "brand": "TrueMove H",
    "operator": "True Move H Universal Communication Company Ltd.",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 700 / LTE 900 / LTE 1800 / LTE 2100 / 5G 700 / 5G 2500",
    "notes": "UMTS roaming with network 520-00"
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "05",
    "brand": "dtac",
    "operator": "DTAC TriNet Company Ltd.",
    "status": "Operational",
    "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / 5G 700",
    "notes": "LTE 2300 roaming with 520-47"
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "09",
    "brand": null,
    "operator": "Royal Thai Police",
    "status": "Operational",
    "bands": "LTE 850",
    "notes": "LTE band 26"
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "15",
    "brand": "AIS-T / NT Mobile",
    "operator": "National Telecom Public Company Limited",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 2100",
    "notes": "Former Thaimobile 1900, ACT Mobile, TOT Public Company Limited; used for NT Mobile, AIS-T and MVNO"
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "17",
    "brand": "NT Mobile",
    "operator": "National Telecom Public Company Limited",
    "status": "Operational",
    "bands": "TD-LTE 2300",
    "notes": "Former TOT Public Company Limited; LTE band 40; for NT Mobile and MVNO except dtac-T uses 520-47"
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "18",
    "brand": "dtac",
    "operator": "Total Access Communications Public Company Ltd.",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "20",
    "brand": "ACeS",
    "operator": "ACeS",
    "status": "Unknown",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "23",
    "brand": "AIS GSM 1800",
    "operator": "Digital Phone Company Ltd.",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Owned by AIS; network shut down in October 2019"
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "25",
    "brand": "WE PCT",
    "operator": "True Corporation",
    "status": "Not operational",
    "bands": "PHS 1900",
    "notes": "In Bangkok area"
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "47",
    "brand": "dtac-T",
    "operator": "National Telecom Public Company Limited",
    "status": "Operational",
    "bands": "TD-LTE 2300",
    "notes": "Former TOT Public Company Limited; LTE band 40; for dtac Only"
  },
  {
    "type": "National",
    "countryName": "Thailand",
    "countryCode": "TH",
    "mcc": "520",
    "mnc": "99",
    "brand": "TrueMove",
    "operator": "True Corporation",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tokelau",
    "countryCode": "TK",
    "mcc": "554",
    "mnc": "01",
    "brand": null,
    "operator": "Teletok",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tonga",
    "countryCode": "TO",
    "mcc": "539",
    "mnc": "01",
    "brand": "U-Call",
    "operator": "Tonga Communications Corporation",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tonga",
    "countryCode": "TO",
    "mcc": "539",
    "mnc": "43",
    "brand": null,
    "operator": "Shoreline Communication",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tonga",
    "countryCode": "TO",
    "mcc": "539",
    "mnc": "88",
    "brand": "Digicel",
    "operator": "Digicel (Tonga) Limited",
    "status": "Operational",
    "bands": "GSM 900 / LTE 700 / LTE 1800",
    "notes": "Former TonFon; LTE bands 28 / 3"
  },
  {
    "type": "National",
    "countryName": "Tuvalu",
    "countryCode": "TV",
    "mcc": "553",
    "mnc": "01",
    "brand": "TTC",
    "operator": "Tuvalu Telecom",
    "status": "Operational",
    "bands": "UMTS 900 / LTE 850",
    "notes": "GSM shutdown in 2015"
  },
  {
    "type": "National",
    "countryName": "Vanuatu",
    "countryCode": "VU",
    "mcc": "541",
    "mnc": "00",
    "brand": "AIL",
    "operator": "ACeS International (AIL)",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Vanuatu",
    "countryCode": "VU",
    "mcc": "541",
    "mnc": "01",
    "brand": "SMILE",
    "operator": "Telecom Vanuatu Ltd",
    "status": "Operational",
    "bands": "GSM 900 / LTE 700",
    "notes": "LTE band 28"
  },
  {
    "type": "National",
    "countryName": "Vanuatu",
    "countryCode": "VU",
    "mcc": "541",
    "mnc": "05",
    "brand": "Digicel",
    "operator": "Digicel Vanuatu Ltd",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 700",
    "notes": "LTE band 28"
  },
  {
    "type": "National",
    "countryName": "Vanuatu",
    "countryCode": "VU",
    "mcc": "541",
    "mnc": "07",
    "brand": "WanTok",
    "operator": "WanTok Vanuatu Ltd",
    "status": "Operational",
    "bands": "TD-LTE 2300",
    "notes": "LTE band 40"
  },
  {
    "type": "National",
    "countryName": "Wallis and Futuna",
    "countryCode": "WF",
    "mcc": "543",
    "mnc": "01",
    "brand": "Manuia",
    "operator": "Service des Postes et Télécommunications des Îles Wallis et Futuna (SPT)",
    "status": "Operational",
    "bands": "UMTS 900 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Algeria",
    "countryCode": "DZ",
    "mcc": "603",
    "mnc": "01",
    "brand": "Mobilis",
    "operator": "Algérie Télécom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Algeria",
    "countryCode": "DZ",
    "mcc": "603",
    "mnc": "02",
    "brand": "Djezzy",
    "operator": "Optimum Telecom Algérie Spa",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Orascom Telecom"
  },
  {
    "type": "National",
    "countryName": "Algeria",
    "countryCode": "DZ",
    "mcc": "603",
    "mnc": "03",
    "brand": "Ooredoo",
    "operator": "Wataniya Telecom Algérie",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Nedjma"
  },
  {
    "type": "National",
    "countryName": "Algeria",
    "countryCode": "DZ",
    "mcc": "603",
    "mnc": "07",
    "brand": "AT",
    "operator": "Algérie Télécom",
    "status": "Operational",
    "bands": "CDMA 1900",
    "notes": "Wireless Local Loop"
  },
  {
    "type": "National",
    "countryName": "Algeria",
    "countryCode": "DZ",
    "mcc": "603",
    "mnc": "09",
    "brand": "AT",
    "operator": "Algérie Télécom",
    "status": "Operational",
    "bands": "LTE",
    "notes": "Fixed Wireless Broadband"
  },
  {
    "type": "National",
    "countryName": "Algeria",
    "countryCode": "DZ",
    "mcc": "603",
    "mnc": "21",
    "brand": "ANESRIF",
    "operator": "Anesrif",
    "status": "Ongoing",
    "bands": "GSM-R",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Angola",
    "countryCode": "AO",
    "mcc": "631",
    "mnc": "02",
    "brand": "UNITEL",
    "operator": "UNITEL S.a.r.l.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Angola",
    "countryCode": "AO",
    "mcc": "631",
    "mnc": "04",
    "brand": "MOVICEL",
    "operator": "MOVICEL Telecommunications S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 1800",
    "notes": "CDMA shut down March 2016"
  },
  {
    "type": "National",
    "countryName": "Angola",
    "countryCode": "AO",
    "mcc": "631",
    "mnc": "05",
    "brand": null,
    "operator": "Africell",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Network to launch by end of 2021"
  },
  {
    "type": "National",
    "countryName": "Benin",
    "countryCode": "BJ",
    "mcc": "616",
    "mnc": "01",
    "brand": "Libercom",
    "operator": "Benin Telecoms Mobile",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 1800 / CDMA / WiMAX",
    "notes": "Brands are Libercom (GSM), be.Telecoms (LTE), Kanakoo (CDMA / WiMAX)"
  },
  {
    "type": "National",
    "countryName": "Benin",
    "countryCode": "BJ",
    "mcc": "616",
    "mnc": "02",
    "brand": "Moov",
    "operator": "Telecel Benin",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": "EtiSalat / Atlantique Telecom / Moov"
  },
  {
    "type": "National",
    "countryName": "Benin",
    "countryCode": "BJ",
    "mcc": "616",
    "mnc": "03",
    "brand": "MTN",
    "operator": "Spacetel Benin",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": "Former BeninCell, Areeba"
  },
  {
    "type": "National",
    "countryName": "Benin",
    "countryCode": "BJ",
    "mcc": "616",
    "mnc": "04",
    "brand": "BBCOM",
    "operator": "Bell Benin Communications",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Benin",
    "countryCode": "BJ",
    "mcc": "616",
    "mnc": "05",
    "brand": "Glo",
    "operator": "Glo Communication Benin",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Licence revoked in 2017"
  },
  {
    "type": "National",
    "countryName": "Botswana",
    "countryCode": "BW",
    "mcc": "652",
    "mnc": "01",
    "brand": "Mascom",
    "operator": "Mascom Wireless (Pty) Limited",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Botswana",
    "countryCode": "BW",
    "mcc": "652",
    "mnc": "02",
    "brand": "Orange",
    "operator": "Orange (Botswana) Pty Limited",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE",
    "notes": "formerly Vista Cellular"
  },
  {
    "type": "National",
    "countryName": "Botswana",
    "countryCode": "BW",
    "mcc": "652",
    "mnc": "04",
    "brand": "beMobile",
    "operator": "Botswana Telecommunications Corporation",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Burkina Faso",
    "countryCode": "BF",
    "mcc": "613",
    "mnc": "01",
    "brand": "Telmob",
    "operator": "Onatel",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Burkina Faso",
    "countryCode": "BF",
    "mcc": "613",
    "mnc": "02",
    "brand": "Orange",
    "operator": "Orange Burkina Faso",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": "Previously Zain/Celtel, Airtel"
  },
  {
    "type": "National",
    "countryName": "Burkina Faso",
    "countryCode": "BF",
    "mcc": "613",
    "mnc": "03",
    "brand": "Telecel Faso",
    "operator": "Telecel Faso SA",
    "status": "Operational",
    "bands": "GSM 900 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Burundi",
    "countryCode": "BI",
    "mcc": "642",
    "mnc": "01",
    "brand": "econet Leo",
    "operator": "Econet Wireless Burundi PLC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Spacetel"
  },
  {
    "type": "National",
    "countryName": "Burundi",
    "countryCode": "BI",
    "mcc": "642",
    "mnc": "02",
    "brand": "Tempo",
    "operator": "VTEL MEA",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Former Safaris; not related to Africell; suspended in 2015; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Burundi",
    "countryCode": "BI",
    "mcc": "642",
    "mnc": "03",
    "brand": "Onatel",
    "operator": "Onatel",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Burundi",
    "countryCode": "BI",
    "mcc": "642",
    "mnc": "07",
    "brand": "Smart Mobile",
    "operator": "LACELL SU",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Burundi",
    "countryCode": "BI",
    "mcc": "642",
    "mnc": "08",
    "brand": "Lumitel",
    "operator": "Viettel Burundi",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": "Formerly HiTs Telecom"
  },
  {
    "type": "National",
    "countryName": "Burundi",
    "countryCode": "BI",
    "mcc": "642",
    "mnc": "82",
    "brand": "econet Leo",
    "operator": "Econet Wireless Burundi PLC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Formerly Telecel, then U-COM Burundi"
  },
  {
    "type": "National",
    "countryName": "Cameroon",
    "countryCode": "CM",
    "mcc": "624",
    "mnc": "01",
    "brand": "MTN Cameroon",
    "operator": "Mobile Telephone Network Cameroon Ltd",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / TD-LTE 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cameroon",
    "countryCode": "CM",
    "mcc": "624",
    "mnc": "02",
    "brand": "Orange",
    "operator": "Orange Cameroun S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cameroon",
    "countryCode": "CM",
    "mcc": "624",
    "mnc": "03",
    "brand": "Camtel",
    "operator": "Camtel",
    "status": "Operational",
    "bands": "CDMA / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cameroon",
    "countryCode": "CM",
    "mcc": "624",
    "mnc": "04",
    "brand": "Nexttel",
    "operator": "Viettel Cameroun",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cape Verde",
    "countryCode": "CV",
    "mcc": "625",
    "mnc": "01",
    "brand": "CVMOVEL",
    "operator": "CVMóvel, S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Cape Verde",
    "countryCode": "CV",
    "mcc": "625",
    "mnc": "02",
    "brand": "T+",
    "operator": "UNITEL T+ TELECOMUNICACÕES, S.A.",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Central African Republic",
    "countryCode": "CF",
    "mcc": "623",
    "mnc": "01",
    "brand": "Moov",
    "operator": "Atlantique Telecom Centrafrique SA",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": "Former Centrafrique Telecom Plus, Etisalat"
  },
  {
    "type": "National",
    "countryName": "Central African Republic",
    "countryCode": "CF",
    "mcc": "623",
    "mnc": "02",
    "brand": "TC",
    "operator": "Telecel Centrafrique",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Central African Republic",
    "countryCode": "CF",
    "mcc": "623",
    "mnc": "03",
    "brand": "Orange",
    "operator": "Orange RCA",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / WiMAX",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Central African Republic",
    "countryCode": "CF",
    "mcc": "623",
    "mnc": "04",
    "brand": "Azur",
    "operator": "Azur RCA",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": "Former Nationlink Telecom RCA"
  },
  {
    "type": "National",
    "countryName": "Chad",
    "countryCode": "TD",
    "mcc": "622",
    "mnc": "01",
    "brand": "Airtel",
    "operator": "Bharti Airtel SA",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chad",
    "countryCode": "TD",
    "mcc": "622",
    "mnc": "02",
    "brand": "Tawali",
    "operator": "SotelTchad",
    "status": "Operational",
    "bands": "CDMA2000",
    "notes": "semi-fixed line; formerly Tchad Mobile / Orascom Telecom GSM 900 - defunct in 2004"
  },
  {
    "type": "National",
    "countryName": "Chad",
    "countryCode": "TD",
    "mcc": "622",
    "mnc": "03",
    "brand": "Tigo",
    "operator": "Millicom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chad",
    "countryCode": "TD",
    "mcc": "622",
    "mnc": "07",
    "brand": "Salam",
    "operator": "SotelTchad",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Comoros",
    "countryCode": "KM",
    "mcc": "654",
    "mnc": "01",
    "brand": "HURI",
    "operator": "Comores Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Comoros",
    "countryCode": "KM",
    "mcc": "654",
    "mnc": "02",
    "brand": "TELCO SA",
    "operator": "Telecom Malagasy (Telma)",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Congo",
    "countryCode": "CG",
    "mcc": "629",
    "mnc": "01",
    "brand": "Airtel",
    "operator": "Celtel Congo",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 2600",
    "notes": "Former Zain and Celtel brand"
  },
  {
    "type": "National",
    "countryName": "Congo",
    "countryCode": "CG",
    "mcc": "629",
    "mnc": "07",
    "brand": "Airtel",
    "operator": "Warid Telecom",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": "Acquired by Airtel in 2014"
  },
  {
    "type": "National",
    "countryName": "Congo",
    "countryCode": "CG",
    "mcc": "629",
    "mnc": "10",
    "brand": "Libertis Telecom",
    "operator": "MTN CONGO S.A",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Democratic Republic of the Congo",
    "countryCode": "CD",
    "mcc": "630",
    "mnc": "01",
    "brand": "Vodacom",
    "operator": "Vodacom Congo RDC sprl",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / TD-LTE 3500 / WiMAX 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Democratic Republic of the Congo",
    "countryCode": "CD",
    "mcc": "630",
    "mnc": "02",
    "brand": "Airtel",
    "operator": "Airtel sprl",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Democratic Republic of the Congo",
    "countryCode": "CD",
    "mcc": "630",
    "mnc": "05",
    "brand": "Supercell",
    "operator": "Supercell SPRL",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Democratic Republic of the Congo",
    "countryCode": "CD",
    "mcc": "630",
    "mnc": "86",
    "brand": "Orange RDC",
    "operator": "Orange RDC sarl",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / TD-LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Democratic Republic of the Congo",
    "countryCode": "CD",
    "mcc": "630",
    "mnc": "88",
    "brand": "YTT",
    "operator": "Yozma Timeturns sprl",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Planned"
  },
  {
    "type": "National",
    "countryName": "Democratic Republic of the Congo",
    "countryCode": "CD",
    "mcc": "630",
    "mnc": "89",
    "brand": "Orange RDC",
    "operator": "Orange RDC sarl",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former OASIS, Tigo; acquired by Orange 2016"
  },
  {
    "type": "National",
    "countryName": "Democratic Republic of the Congo",
    "countryCode": "CD",
    "mcc": "630",
    "mnc": "90",
    "brand": "Africell",
    "operator": "Africell RDC sprl",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Djibouti",
    "countryCode": "DJ",
    "mcc": "638",
    "mnc": "01",
    "brand": "Evatis",
    "operator": "Djibouti Telecom SA",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Egypt",
    "countryCode": "EG",
    "mcc": "602",
    "mnc": "01",
    "brand": "Orange",
    "operator": "Orange Egypt",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Mobinil"
  },
  {
    "type": "National",
    "countryName": "Egypt",
    "countryCode": "EG",
    "mcc": "602",
    "mnc": "02",
    "brand": "Vodafone",
    "operator": "Vodafone Egypt",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Egypt",
    "countryCode": "EG",
    "mcc": "602",
    "mnc": "03",
    "brand": "Etisalat",
    "operator": "Etisalat Egypt",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Egypt",
    "countryCode": "EG",
    "mcc": "602",
    "mnc": "04",
    "brand": "WE",
    "operator": "Telecom Egypt",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Equatorial Guinea",
    "countryCode": "GQ",
    "mcc": "627",
    "mnc": "01",
    "brand": "Orange GQ",
    "operator": "GETESA",
    "status": "Operational",
    "bands": "GSM 900 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Equatorial Guinea",
    "countryCode": "GQ",
    "mcc": "627",
    "mnc": "03",
    "brand": "Muni",
    "operator": "Green Com S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE",
    "notes": "Former HiTS"
  },
  {
    "type": "National",
    "countryName": "Eritrea",
    "countryCode": "ER",
    "mcc": "657",
    "mnc": "01",
    "brand": "Eritel",
    "operator": "Eritrea Telecommunications Services Corporation",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ethiopia",
    "countryCode": "ET",
    "mcc": "636",
    "mnc": "01",
    "brand": "MTN",
    "operator": "Ethio Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "French Departments and Territories in the Indian Ocean (France)",
    "countryCode": "YT/RE",
    "mcc": "647",
    "mnc": "00",
    "brand": "Orange",
    "operator": "Orange La Réunion",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Mayotte, Réunion"
  },
  {
    "type": "National",
    "countryName": "French Departments and Territories in the Indian Ocean (France)",
    "countryCode": "YT/RE",
    "mcc": "647",
    "mnc": "01",
    "brand": "Maoré Mobile",
    "operator": "BJT Partners",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 1800",
    "notes": "Mayotte"
  },
  {
    "type": "National",
    "countryName": "French Departments and Territories in the Indian Ocean (France)",
    "countryCode": "YT/RE",
    "mcc": "647",
    "mnc": "02",
    "brand": "Only",
    "operator": "Telco OI",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": "Mayotte"
  },
  {
    "type": "National",
    "countryName": "French Departments and Territories in the Indian Ocean (France)",
    "countryCode": "YT/RE",
    "mcc": "647",
    "mnc": "03",
    "brand": "Free",
    "operator": "Telco OI",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": "Réunion\nFormer Only"
  },
  {
    "type": "National",
    "countryName": "French Departments and Territories in the Indian Ocean (France)",
    "countryCode": "YT/RE",
    "mcc": "647",
    "mnc": "04",
    "brand": "Zeop",
    "operator": "Zeop mobile",
    "status": "Unknown",
    "bands": "LTE 1800 / LTE 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "French Departments and Territories in the Indian Ocean (France)",
    "countryCode": "YT/RE",
    "mcc": "647",
    "mnc": "10",
    "brand": "SFR Réunion",
    "operator": "Société Réunionnaise du Radiotéléphone",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Mayotte, Réunion; LTE bands 20 / 3 / 7"
  },
  {
    "type": "National",
    "countryName": "Gabon",
    "countryCode": "GA",
    "mcc": "628",
    "mnc": "01",
    "brand": "Libertis",
    "operator": "Gabon Telecom S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Gabon",
    "countryCode": "GA",
    "mcc": "628",
    "mnc": "02",
    "brand": "Moov",
    "operator": "Gabon Telecom S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Former Atlantique Télécom (Etisalat Group), merged with Gabon Telecom in 2016"
  },
  {
    "type": "National",
    "countryName": "Gabon",
    "countryCode": "GA",
    "mcc": "628",
    "mnc": "03",
    "brand": "Airtel",
    "operator": "Airtel Gabon S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Gabon",
    "countryCode": "GA",
    "mcc": "628",
    "mnc": "04",
    "brand": "Azur",
    "operator": "USAN Gabon S.A.",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "Shut down 2018"
  },
  {
    "type": "National",
    "countryName": "Gabon",
    "countryCode": "GA",
    "mcc": "628",
    "mnc": "05",
    "brand": "RAG",
    "operator": "Réseau de l’Administration Gabonaise",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Gambia",
    "countryCode": "GM",
    "mcc": "607",
    "mnc": "01",
    "brand": "Gamcel",
    "operator": "Gamcel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Gambia",
    "countryCode": "GM",
    "mcc": "607",
    "mnc": "02",
    "brand": "Africell",
    "operator": "Africell",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Gambia",
    "countryCode": "GM",
    "mcc": "607",
    "mnc": "03",
    "brand": "Comium",
    "operator": "Comium",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Gambia",
    "countryCode": "GM",
    "mcc": "607",
    "mnc": "04",
    "brand": "QCell",
    "operator": "QCell Gambia",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Gambia",
    "countryCode": "GM",
    "mcc": "607",
    "mnc": "05",
    "brand": null,
    "operator": "Gamtel-Ecowan",
    "status": "Unknown",
    "bands": "WiMAX / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Gambia",
    "countryCode": "GM",
    "mcc": "607",
    "mnc": "06",
    "brand": null,
    "operator": "NETPAGE",
    "status": "Operational",
    "bands": "TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "01",
    "brand": "MTN",
    "operator": "MTN Group",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600",
    "notes": "former spacefon"
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "02",
    "brand": "Vodafone",
    "operator": "Vodafone Group",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800",
    "notes": "former Onetouch, Ghana Telecom"
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "03",
    "brand": "AirtelTigo",
    "operator": "Millicom Ghana",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "former MOBITEL, Tigo"
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "04",
    "brand": "Expresso",
    "operator": "Kasapa / Hutchison Telecom",
    "status": "Operational",
    "bands": "CDMA2000 850",
    "notes": "former Kasapa"
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "05",
    "brand": null,
    "operator": "National Security",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "06",
    "brand": "AirtelTigo",
    "operator": "Airtel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "former Zain, Airtel"
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "07",
    "brand": "Globacom",
    "operator": "Globacom Group",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "08",
    "brand": "Surfline",
    "operator": "Surfline Communications Ltd",
    "status": "Not operational",
    "bands": "LTE 2600",
    "notes": "LTE band 7; shut down Oct 2018"
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "09",
    "brand": "NITA",
    "operator": "National Information Technology Agency",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "10",
    "brand": "Blu",
    "operator": "Blu Telecommunications",
    "status": "Operational",
    "bands": "TD-LTE 2500",
    "notes": "LTE band 41"
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "11",
    "brand": null,
    "operator": "Netafrique Dot Com Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "12",
    "brand": null,
    "operator": "BTL",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "13",
    "brand": null,
    "operator": "Goldkey",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "14",
    "brand": "busy",
    "operator": "BusyInternet",
    "status": "Operational",
    "bands": "TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "15",
    "brand": null,
    "operator": "Lebara",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "16",
    "brand": null,
    "operator": "Telesol",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": "data only"
  },
  {
    "type": "National",
    "countryName": "Ghana",
    "countryCode": "GH",
    "mcc": "620",
    "mnc": "17",
    "brand": null,
    "operator": "iBurst Africa",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guinea",
    "countryCode": "GN",
    "mcc": "611",
    "mnc": "01",
    "brand": "Orange",
    "operator": "Orange S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE",
    "notes": "Formerly Spacetel"
  },
  {
    "type": "National",
    "countryName": "Guinea",
    "countryCode": "GN",
    "mcc": "611",
    "mnc": "02",
    "brand": "Sotelgui",
    "operator": "Sotelgui Lagui",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guinea",
    "countryCode": "GN",
    "mcc": "611",
    "mnc": "03",
    "brand": "Telecel Guinee",
    "operator": "INTERCEL Guinée",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guinea",
    "countryCode": "GN",
    "mcc": "611",
    "mnc": "04",
    "brand": "MTN",
    "operator": "Areeba Guinea",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guinea",
    "countryCode": "GN",
    "mcc": "611",
    "mnc": "05",
    "brand": "Cellcom",
    "operator": "Cellcom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guinea-Bissau",
    "countryCode": "GW",
    "mcc": "632",
    "mnc": "01",
    "brand": "Guinetel",
    "operator": "Guinétel S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guinea-Bissau",
    "countryCode": "GW",
    "mcc": "632",
    "mnc": "02",
    "brand": "MTN Areeba",
    "operator": "Spacetel Guiné-Bissau S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guinea-Bissau",
    "countryCode": "GW",
    "mcc": "632",
    "mnc": "03",
    "brand": "Orange",
    "operator": null,
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guinea-Bissau",
    "countryCode": "GW",
    "mcc": "632",
    "mnc": "07",
    "brand": "Guinetel",
    "operator": "Guinétel S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ivory Coast",
    "countryCode": "CI",
    "mcc": "612",
    "mnc": "01",
    "brand": null,
    "operator": "Cora de Comstar",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ivory Coast",
    "countryCode": "CI",
    "mcc": "612",
    "mnc": "02",
    "brand": "Moov",
    "operator": "Atlantique Cellulaire",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ivory Coast",
    "countryCode": "CI",
    "mcc": "612",
    "mnc": "03",
    "brand": "Orange",
    "operator": "Orange",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ivory Coast",
    "countryCode": "CI",
    "mcc": "612",
    "mnc": "04",
    "brand": "KoZ",
    "operator": "Comium Ivory Coast Inc",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ivory Coast",
    "countryCode": "CI",
    "mcc": "612",
    "mnc": "05",
    "brand": "MTN",
    "operator": "Loteny Telecom",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ivory Coast",
    "countryCode": "CI",
    "mcc": "612",
    "mnc": "06",
    "brand": "GreenN",
    "operator": "Oricel",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ivory Coast",
    "countryCode": "CI",
    "mcc": "612",
    "mnc": "07",
    "brand": "café",
    "operator": "Aircomm",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Ivory Coast",
    "countryCode": "CI",
    "mcc": "612",
    "mnc": "18",
    "brand": null,
    "operator": "YooMee",
    "status": "Operational",
    "bands": "TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "01",
    "brand": "Safaricom",
    "operator": "Safaricom Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "02",
    "brand": "Safaricom",
    "operator": "Safaricom Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "03",
    "brand": "Airtel",
    "operator": "Bharti Airtel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800",
    "notes": "Former Celtel, then Zain"
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "04",
    "brand": null,
    "operator": "Mobile Pay Kenya Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "05",
    "brand": "yu",
    "operator": "Essar Telecom Kenya",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Former Econet Wireless; network sold to Safaricom in 2014, subscribers moved to Airtel"
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "06",
    "brand": null,
    "operator": "Finserve Africa Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "07",
    "brand": "Telkom",
    "operator": "Telkom Kenya",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800",
    "notes": "Former Orange Kenya; CDMA 850 MHz shut down in Mar 2015"
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "08",
    "brand": null,
    "operator": "Wetribe Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Sema Mobile Services Ltd (MVNO)"
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "09",
    "brand": null,
    "operator": "Homeland Media Group Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "10",
    "brand": "Faiba 4G",
    "operator": "Jamii Telecommunications Limited",
    "status": "Operational",
    "bands": "LTE 700",
    "notes": "LTE band 28"
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "11",
    "brand": null,
    "operator": "Jambo Telcoms Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former WiAfrica Kenya Ltd."
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "12",
    "brand": null,
    "operator": "Infura Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Kenya",
    "countryCode": "KE",
    "mcc": "639",
    "mnc": "13",
    "brand": null,
    "operator": "Hidiga Investments Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lesotho",
    "countryCode": "LS",
    "mcc": "651",
    "mnc": "01",
    "brand": "Vodacom",
    "operator": "Vodacom Lesotho (Pty) Ltd",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lesotho",
    "countryCode": "LS",
    "mcc": "651",
    "mnc": "02",
    "brand": "Econet Telecom",
    "operator": "Econet Ezi-cel",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Lesotho",
    "countryCode": "LS",
    "mcc": "651",
    "mnc": "10",
    "brand": "Vodacom",
    "operator": "Vodacom Lesotho (Pty) Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Liberia",
    "countryCode": "LR",
    "mcc": "618",
    "mnc": "01",
    "brand": "Lonestar Cell MTN",
    "operator": "Lonestar Communications Corporation",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Liberia",
    "countryCode": "LR",
    "mcc": "618",
    "mnc": "02",
    "brand": "Libercell",
    "operator": "Atlantic Wireless (Liberia) Inc.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Shut down in 2012"
  },
  {
    "type": "National",
    "countryName": "Liberia",
    "countryCode": "LR",
    "mcc": "618",
    "mnc": "04",
    "brand": "Novafone",
    "operator": "Novafone Inc.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former Comium"
  },
  {
    "type": "National",
    "countryName": "Liberia",
    "countryCode": "LR",
    "mcc": "618",
    "mnc": "07",
    "brand": "Orange LBR",
    "operator": "Orange Liberia",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Cellcom"
  },
  {
    "type": "National",
    "countryName": "Liberia",
    "countryCode": "LR",
    "mcc": "618",
    "mnc": "20",
    "brand": "LIBTELCO",
    "operator": "Liberia Telecommunications Corporation",
    "status": "Operational",
    "bands": "CDMA2000",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Libya",
    "countryCode": "LY",
    "mcc": "606",
    "mnc": "00",
    "brand": "Libyana",
    "operator": "Libyana",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Libya",
    "countryCode": "LY",
    "mcc": "606",
    "mnc": "01",
    "brand": "Madar",
    "operator": "Al-Madar Al-Jadeed",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Libya",
    "countryCode": "LY",
    "mcc": "606",
    "mnc": "02",
    "brand": "Al-Jeel Phone",
    "operator": "Al-Jeel Al-Jadeed",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Al-Madar"
  },
  {
    "type": "National",
    "countryName": "Libya",
    "countryCode": "LY",
    "mcc": "606",
    "mnc": "03",
    "brand": "Libya Phone",
    "operator": "Libya Telecom & Technology (LTT)",
    "status": "Operational",
    "bands": "MVNO / LTE 800",
    "notes": "Uses Libyana; LTE for fixed wireless broadband"
  },
  {
    "type": "National",
    "countryName": "Libya",
    "countryCode": "LY",
    "mcc": "606",
    "mnc": "06",
    "brand": "Hatef Libya",
    "operator": "Hatef Libya",
    "status": "Operational",
    "bands": "CDMA2000",
    "notes": "Fixed wireless"
  },
  {
    "type": "National",
    "countryName": "Madagascar",
    "countryCode": "MG",
    "mcc": "646",
    "mnc": "01",
    "brand": "Airtel",
    "operator": "Bharti Airtel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": "Former Celtel (Zain), Madacom"
  },
  {
    "type": "National",
    "countryName": "Madagascar",
    "countryCode": "MG",
    "mcc": "646",
    "mnc": "02",
    "brand": "Orange",
    "operator": "Orange Madagascar S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Madagascar",
    "countryCode": "MG",
    "mcc": "646",
    "mnc": "03",
    "brand": "Sacel",
    "operator": "Sacel Madagascar S.A.",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "license withdrawn in 2001"
  },
  {
    "type": "National",
    "countryName": "Madagascar",
    "countryCode": "MG",
    "mcc": "646",
    "mnc": "04",
    "brand": "Telma",
    "operator": "Telma Mobile S.A.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Madagascar",
    "countryCode": "MG",
    "mcc": "646",
    "mnc": "05",
    "brand": "BIP / blueline",
    "operator": "Gulfsat Madagascar S.A.",
    "status": "Operational",
    "bands": "LTE 2100 / TD-LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Malawi",
    "countryCode": "MW",
    "mcc": "650",
    "mnc": "01",
    "brand": "TNM",
    "operator": "Telecom Network Malawi",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / TD-LTE 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Malawi",
    "countryCode": "MW",
    "mcc": "650",
    "mnc": "02",
    "brand": "Access",
    "operator": "Access Communications Ltd",
    "status": "Operational",
    "bands": "CDMA / LTE 850",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Malawi",
    "countryCode": "MW",
    "mcc": "650",
    "mnc": "10",
    "brand": "Airtel",
    "operator": "Airtel Malawi Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800",
    "notes": "Former Celtel (Zain)"
  },
  {
    "type": "National",
    "countryName": "Mali",
    "countryCode": "ML",
    "mcc": "610",
    "mnc": "01",
    "brand": "Malitel",
    "operator": "Malitel SA",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mali",
    "countryCode": "ML",
    "mcc": "610",
    "mnc": "02",
    "brand": "Orange",
    "operator": "Orange Mali SA",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mali",
    "countryCode": "ML",
    "mcc": "610",
    "mnc": "03",
    "brand": "Telecel",
    "operator": "Alpha Telecommunication Mali S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mauritania",
    "countryCode": "MR",
    "mcc": "609",
    "mnc": "01",
    "brand": "Mattel",
    "operator": "Mattel",
    "status": "Operational",
    "bands": "GSM 900 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mauritania",
    "countryCode": "MR",
    "mcc": "609",
    "mnc": "02",
    "brand": "Chinguitel",
    "operator": "Chinguitel",
    "status": "Operational",
    "bands": "CDMA / GSM 900 / GSM 1800 / UMTS 2100 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mauritania",
    "countryCode": "MR",
    "mcc": "609",
    "mnc": "10",
    "brand": "Moov",
    "operator": "Mauritel Mobiles",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mauritius",
    "countryCode": "MU",
    "mcc": "617",
    "mnc": "01",
    "brand": "my.t",
    "operator": "Cellplus Mobile Communications Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 3500",
    "notes": "Former Orange"
  },
  {
    "type": "National",
    "countryName": "Mauritius",
    "countryCode": "MU",
    "mcc": "617",
    "mnc": "02",
    "brand": "MOKOZE / AZU",
    "operator": "Mahanagar Telephone Mauritius Limited (MTML)",
    "status": "Operational",
    "bands": "CDMA2000",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mauritius",
    "countryCode": "MU",
    "mcc": "617",
    "mnc": "03",
    "brand": "CHILI",
    "operator": "Mahanagar Telephone Mauritius Limited (MTML)",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mauritius",
    "countryCode": "MU",
    "mcc": "617",
    "mnc": "10",
    "brand": "Emtel",
    "operator": "Emtel Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Morocco",
    "countryCode": "MA",
    "mcc": "604",
    "mnc": "00",
    "brand": "Orange Morocco",
    "operator": "Médi Télécom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "Former Méditel"
  },
  {
    "type": "National",
    "countryName": "Morocco",
    "countryCode": "MA",
    "mcc": "604",
    "mnc": "01",
    "brand": "IAM",
    "operator": "Ittissalat Al-Maghrib (Maroc Telecom)",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Morocco",
    "countryCode": "MA",
    "mcc": "604",
    "mnc": "02",
    "brand": "INWI",
    "operator": "Wana Corporate",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Morocco",
    "countryCode": "MA",
    "mcc": "604",
    "mnc": "04",
    "brand": null,
    "operator": "Al Houria Telecom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Morocco",
    "countryCode": "MA",
    "mcc": "604",
    "mnc": "05",
    "brand": "INWI",
    "operator": "Wana Corporate",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Morocco",
    "countryCode": "MA",
    "mcc": "604",
    "mnc": "06",
    "brand": "IAM",
    "operator": "Ittissalat Al-Maghrib (Maroc Telecom)",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Morocco",
    "countryCode": "MA",
    "mcc": "604",
    "mnc": "99",
    "brand": null,
    "operator": "Al Houria Telecom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mozambique",
    "countryCode": "MZ",
    "mcc": "643",
    "mnc": "01",
    "brand": "mCel",
    "operator": "Mocambique Celular S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mozambique",
    "countryCode": "MZ",
    "mcc": "643",
    "mnc": "03",
    "brand": "Movitel",
    "operator": "Movitel, SA",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Mozambique",
    "countryCode": "MZ",
    "mcc": "643",
    "mnc": "04",
    "brand": "Vodacom",
    "operator": "Vodacom Mozambique, S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Namibia",
    "countryCode": "NA",
    "mcc": "649",
    "mnc": "01",
    "brand": "MTC",
    "operator": "MTC Namibia",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Namibia",
    "countryCode": "NA",
    "mcc": "649",
    "mnc": "02",
    "brand": "switch",
    "operator": "Telecom Namibia",
    "status": "Operational",
    "bands": "CDMA2000 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Namibia",
    "countryCode": "NA",
    "mcc": "649",
    "mnc": "03",
    "brand": "TN Mobile",
    "operator": "Telecom Namibia",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / TD-LTE 2600",
    "notes": "former Cell One"
  },
  {
    "type": "National",
    "countryName": "Namibia",
    "countryCode": "NA",
    "mcc": "649",
    "mnc": "04",
    "brand": null,
    "operator": "Paratus Telecommunications (Pty)",
    "status": "Operational",
    "bands": "WiMAX 2500 / TD-LTE",
    "notes": "former ITN/WTN"
  },
  {
    "type": "National",
    "countryName": "Namibia",
    "countryCode": "NA",
    "mcc": "649",
    "mnc": "05",
    "brand": null,
    "operator": "Demshi Investments CC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Namibia",
    "countryCode": "NA",
    "mcc": "649",
    "mnc": "06",
    "brand": null,
    "operator": "MTN Namibia",
    "status": "Operational",
    "bands": "LTE",
    "notes": "LTE fixed wireless, MVNO"
  },
  {
    "type": "National",
    "countryName": "Namibia",
    "countryCode": "NA",
    "mcc": "649",
    "mnc": "07",
    "brand": null,
    "operator": "Capricorn Connect",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Niger",
    "countryCode": "NE",
    "mcc": "614",
    "mnc": "01",
    "brand": "SahelCom",
    "operator": "La Société Sahélienne de Télécommunications (SahelCom)",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Niger",
    "countryCode": "NE",
    "mcc": "614",
    "mnc": "02",
    "brand": "Airtel",
    "operator": "Bharti Airtel Limited",
    "status": "Operational",
    "bands": "GSM 900 / LTE",
    "notes": "formerly Zain, Celtel"
  },
  {
    "type": "National",
    "countryName": "Niger",
    "countryCode": "NE",
    "mcc": "614",
    "mnc": "03",
    "brand": "Moov",
    "operator": "Atlantique Telecom (subsidiary of Etisalat)",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": "Former Telecel"
  },
  {
    "type": "National",
    "countryName": "Niger",
    "countryCode": "NE",
    "mcc": "614",
    "mnc": "04",
    "brand": "Orange",
    "operator": "Orange Niger",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Nigeria",
    "countryCode": "NG",
    "mcc": "621",
    "mnc": "00",
    "brand": null,
    "operator": "Capcom",
    "status": "Not operational",
    "bands": "LTE 1900",
    "notes": "Former Starcomms, MultiLinks, and MTS First Wireless"
  },
  {
    "type": "National",
    "countryName": "Nigeria",
    "countryCode": "NG",
    "mcc": "621",
    "mnc": "20",
    "brand": "Airtel",
    "operator": "Bharti Airtel Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Former Zain, V-Mobile"
  },
  {
    "type": "National",
    "countryName": "Nigeria",
    "countryCode": "NG",
    "mcc": "621",
    "mnc": "22",
    "brand": "InterC",
    "operator": "InterC Network Ltd.",
    "status": "Operational",
    "bands": "LTE 800",
    "notes": "Former Intercellular; LTE band 20"
  },
  {
    "type": "National",
    "countryName": "Nigeria",
    "countryCode": "NG",
    "mcc": "621",
    "mnc": "24",
    "brand": null,
    "operator": "Spectranet",
    "status": "Operational",
    "bands": "TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Nigeria",
    "countryCode": "NG",
    "mcc": "621",
    "mnc": "25",
    "brand": "Visafone",
    "operator": "Visafone Communications Ltd.",
    "status": "Not operational",
    "bands": "CDMA2000 800 / CDMA2000 1900",
    "notes": "Acquired by MTN"
  },
  {
    "type": "National",
    "countryName": "Nigeria",
    "countryCode": "NG",
    "mcc": "621",
    "mnc": "26",
    "brand": null,
    "operator": "Swift",
    "status": "Operational",
    "bands": "TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Nigeria",
    "countryCode": "NG",
    "mcc": "621",
    "mnc": "27",
    "brand": "Smile",
    "operator": "Smile Communications Nigeria",
    "status": "Operational",
    "bands": "LTE 800",
    "notes": "LTE band 20"
  },
  {
    "type": "National",
    "countryName": "Nigeria",
    "countryCode": "NG",
    "mcc": "621",
    "mnc": "30",
    "brand": "MTN",
    "operator": "MTN Nigeria Communications Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2600 / TD-LTE 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Nigeria",
    "countryCode": "NG",
    "mcc": "621",
    "mnc": "40",
    "brand": "Ntel",
    "operator": "Nigerian Mobile Telecommunications Limited",
    "status": "Operational",
    "bands": "LTE 900 / LTE 1800",
    "notes": "Former M-Tel; LTE bands 8 / 3"
  },
  {
    "type": "National",
    "countryName": "Nigeria",
    "countryCode": "NG",
    "mcc": "621",
    "mnc": "50",
    "brand": "Glo",
    "operator": "Globacom Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700",
    "notes": "LTE band 28"
  },
  {
    "type": "National",
    "countryName": "Nigeria",
    "countryCode": "NG",
    "mcc": "621",
    "mnc": "60",
    "brand": "9mobile",
    "operator": "Emerging Markets Telecommunication Services Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": "Until 2017, Etisalat"
  },
  {
    "type": "National",
    "countryName": "Rwanda",
    "countryCode": "RW",
    "mcc": "635",
    "mnc": "10",
    "brand": "MTN",
    "operator": "MTN Rwandacell SARL",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Rwanda",
    "countryCode": "RW",
    "mcc": "635",
    "mnc": "11",
    "brand": "Rwandatel",
    "operator": "Rwandatel S.A.",
    "status": "Not operational",
    "bands": "CDMA",
    "notes": "Licence revoked in April 2011"
  },
  {
    "type": "National",
    "countryName": "Rwanda",
    "countryCode": "RW",
    "mcc": "635",
    "mnc": "12",
    "brand": "Rwandatel",
    "operator": "Rwandatel S.A.",
    "status": "Not operational",
    "bands": "GSM",
    "notes": "Licence revoked in April 2011"
  },
  {
    "type": "National",
    "countryName": "Rwanda",
    "countryCode": "RW",
    "mcc": "635",
    "mnc": "13",
    "brand": "Airtel",
    "operator": "Airtel RWANDA",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former Tigo"
  },
  {
    "type": "National",
    "countryName": "Rwanda",
    "countryCode": "RW",
    "mcc": "635",
    "mnc": "14",
    "brand": "Airtel",
    "operator": "Airtel RWANDA",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Merged with Tigo; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Rwanda",
    "countryCode": "RW",
    "mcc": "635",
    "mnc": "17",
    "brand": "Olleh",
    "operator": "Olleh Rwanda Networks",
    "status": "Operational",
    "bands": "LTE 800 / LTE 1800",
    "notes": "LTE band 20 / 3; wholesale network used by Airtel, MTN, Tigo"
  },
  {
    "type": "National",
    "countryName": "Saint Helena, Ascension and Tristan da Cunha",
    "countryCode": "SH",
    "mcc": "658",
    "mnc": "01",
    "brand": "Sure",
    "operator": "Sure South Atlantic Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sao Tome and Principe",
    "countryCode": "ST",
    "mcc": "626",
    "mnc": "01",
    "brand": "CSTmovel",
    "operator": "Companhia Santomese de Telecomunicaçôe",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sao Tome and Principe",
    "countryCode": "ST",
    "mcc": "626",
    "mnc": "02",
    "brand": "Unitel STP",
    "operator": "Unitel Sao Tome and Principe",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Senegal",
    "countryCode": "SN",
    "mcc": "608",
    "mnc": "01",
    "brand": "Orange",
    "operator": "Sonatel",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Senegal",
    "countryCode": "SN",
    "mcc": "608",
    "mnc": "02",
    "brand": "Free",
    "operator": "Saga Africa Holdings Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": "Former Hello, Tigo"
  },
  {
    "type": "National",
    "countryName": "Senegal",
    "countryCode": "SN",
    "mcc": "608",
    "mnc": "03",
    "brand": "Expresso",
    "operator": "Expresso Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Senegal",
    "countryCode": "SN",
    "mcc": "608",
    "mnc": "04",
    "brand": null,
    "operator": "CSU-SA",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Seychelles",
    "countryCode": "SC",
    "mcc": "633",
    "mnc": "01",
    "brand": "Cable & Wireless",
    "operator": "Cable & Wireless Seychelles",
    "status": "Operational",
    "bands": "GSM 900 / UMTS / 5G",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Seychelles",
    "countryCode": "SC",
    "mcc": "633",
    "mnc": "02",
    "brand": "Mediatech",
    "operator": "Mediatech International",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "License and MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Seychelles",
    "countryCode": "SC",
    "mcc": "633",
    "mnc": "05",
    "brand": null,
    "operator": "Intelvision Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Seychelles",
    "countryCode": "SC",
    "mcc": "633",
    "mnc": "10",
    "brand": "Airtel",
    "operator": "Telecom Seychelles Ltd",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sierra Leone",
    "countryCode": "SL",
    "mcc": "619",
    "mnc": "01",
    "brand": "Orange",
    "operator": "Orange SL Limited",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE",
    "notes": "Former Zain, Celtel, Bharti Airtel"
  },
  {
    "type": "National",
    "countryName": "Sierra Leone",
    "countryCode": "SL",
    "mcc": "619",
    "mnc": "02",
    "brand": "Africell",
    "operator": "Lintel Sierra Leone Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Millicom, Tigo"
  },
  {
    "type": "National",
    "countryName": "Sierra Leone",
    "countryCode": "SL",
    "mcc": "619",
    "mnc": "03",
    "brand": "Africell",
    "operator": "Lintel Sierra Leone Limited",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sierra Leone",
    "countryCode": "SL",
    "mcc": "619",
    "mnc": "04",
    "brand": "Comium",
    "operator": "Comium (Sierra Leone) Ltd.",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sierra Leone",
    "countryCode": "SL",
    "mcc": "619",
    "mnc": "05",
    "brand": "Africell",
    "operator": "Lintel Sierra Leone Limited",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sierra Leone",
    "countryCode": "SL",
    "mcc": "619",
    "mnc": "06",
    "brand": "SierraTel",
    "operator": "Sierra Leone Telephony",
    "status": "Operational",
    "bands": "CDMA 800 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sierra Leone",
    "countryCode": "SL",
    "mcc": "619",
    "mnc": "07",
    "brand": null,
    "operator": "Qcell Sierra Leone",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sierra Leone",
    "countryCode": "SL",
    "mcc": "619",
    "mnc": "09",
    "brand": "Smart Mobile",
    "operator": "InterGroup Telecom SL",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sierra Leone",
    "countryCode": "SL",
    "mcc": "619",
    "mnc": "25",
    "brand": "Mobitel",
    "operator": "Mobitel",
    "status": "Reserved",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sierra Leone",
    "countryCode": "SL",
    "mcc": "619",
    "mnc": "40",
    "brand": null,
    "operator": "Datatel (SL) Ltd.",
    "status": "Unknown",
    "bands": "GSM",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sierra Leone",
    "countryCode": "SL",
    "mcc": "619",
    "mnc": "50",
    "brand": null,
    "operator": "Datatel (SL) Ltd.",
    "status": "Unknown",
    "bands": "CDMA",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "01",
    "brand": "Telesom",
    "operator": "Telesom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "04",
    "brand": "Somafone",
    "operator": "Somafone FZLLC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "10",
    "brand": "Nationlink",
    "operator": "NationLink Telecom",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "20",
    "brand": "SOMNET",
    "operator": "SOMNET",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800",
    "notes": "Uncertain bands"
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "50",
    "brand": "Hormuud",
    "operator": "Hormuud Telecom Somalia Inc",
    "status": "Operational",
    "bands": "GSM 900 / UMTS",
    "notes": "Uncertain MNC number, maybe (also) 25"
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "30",
    "brand": "Golis",
    "operator": "Golis Telecom Somalia",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "57",
    "brand": "UNITEL",
    "operator": "UNITEL S.a.r.l.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "60",
    "brand": "Nationlink",
    "operator": "Nationlink Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "67",
    "brand": "Horntel Group",
    "operator": "HTG Group Somalia",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "70",
    "brand": null,
    "operator": "Onkod Telecom Ltd.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "71",
    "brand": "Somtel",
    "operator": "Somtel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Somalia",
    "countryCode": "SO",
    "mcc": "637",
    "mnc": "82",
    "brand": "Telcom",
    "operator": "Telcom Somalia",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / CDMA2000 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "01",
    "brand": "Vodacom",
    "operator": "Vodacom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 5200 / LTE 5800 / 5G 700 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "02",
    "brand": "Telkom",
    "operator": "Telkom SA SOC Ltd",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / TD-LTE 2300",
    "notes": "Formerly Telkom Mobile, 8ta"
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "03",
    "brand": "Telkom",
    "operator": "Telkom SA SOC Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "04",
    "brand": null,
    "operator": "Sasol (Pty) Ltd.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "05",
    "brand": null,
    "operator": "Telkom SA Ltd",
    "status": "Unknown",
    "bands": "Unknown 3G",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "06",
    "brand": null,
    "operator": "Sentech (Pty) Ltd",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "07",
    "brand": "Cell C",
    "operator": "Cell C (Pty) Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "10",
    "brand": "MTN",
    "operator": "MTN Group",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / 5G 700 / 5G 1800 / 5G 2100 / 5G 3500 / 5G 28000",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "11",
    "brand": null,
    "operator": "South African Police Service Gauteng",
    "status": "Not operational",
    "bands": "TETRA 410",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "12",
    "brand": "MTN",
    "operator": "MTN Group",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "13",
    "brand": "Neotel",
    "operator": "Neotel Pty Ltd",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "Shut down May 2019"
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "14",
    "brand": "Neotel",
    "operator": "Neotel Pty Ltd",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "16",
    "brand": null,
    "operator": "Phoenix System Integration (Pty) Ltd",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "17",
    "brand": null,
    "operator": "Sishen Iron Ore Company (Ltd) Pty",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "19",
    "brand": "Rain",
    "operator": "Wireless Business Solutions (Pty) Ltd",
    "status": "Operational",
    "bands": "LTE 1800 / TD-LTE 2600 / 5G 3500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "21",
    "brand": null,
    "operator": "Cape Town Metropolitan Council",
    "status": "Not operational",
    "bands": "TETRA 410",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "24",
    "brand": null,
    "operator": "SMSPortal (Pty) Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "25",
    "brand": null,
    "operator": "Wirels Connect",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "27",
    "brand": null,
    "operator": "A to Z Vaal Industrial Supplies Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "28",
    "brand": null,
    "operator": "Hymax Talking Solutions (Pty) Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "30",
    "brand": null,
    "operator": "Bokamoso Consortium",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "31",
    "brand": null,
    "operator": "Karabo Telecoms (Pty) Ltd.",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "32",
    "brand": null,
    "operator": "Ilizwi Telecommunications",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "33",
    "brand": null,
    "operator": "Thinta Thinta Telecommunications Pty Ltd",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "34",
    "brand": null,
    "operator": "Bokone Telecoms Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "35",
    "brand": null,
    "operator": "Kingdom Communications Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "36",
    "brand": null,
    "operator": "Amatole Telecommunications Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "38",
    "brand": "iBurst",
    "operator": "Wireless Business Solutions (Pty) Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "41",
    "brand": null,
    "operator": "South African Police Service",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "46",
    "brand": null,
    "operator": "SMS Cellular Services (Pty) Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "50",
    "brand": null,
    "operator": "Ericsson South Africa (Pty) Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "51",
    "brand": null,
    "operator": "Integrat (Pty) Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "53",
    "brand": "Lycamobile",
    "operator": "Lycamobile (Pty) Ltd",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "65",
    "brand": null,
    "operator": "Vodacom Pty Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "73",
    "brand": "iBurst",
    "operator": "Wireless Business Solutions (Pty) Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "74",
    "brand": "iBurst",
    "operator": "Wireless Business Solutions (Pty) Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "75",
    "brand": "ACSA",
    "operator": "Airports Company South Africa",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "76",
    "brand": null,
    "operator": "Comsol Networks (Pty) Ltd",
    "status": "Operational",
    "bands": "WiMAX / 28000",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Africa",
    "countryCode": "ZA",
    "mcc": "655",
    "mnc": "77",
    "brand": "Umoja Connect",
    "operator": "One Telecom (Pty) Ltd",
    "status": "Unknown",
    "bands": "5G",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Sudan",
    "countryCode": "SS",
    "mcc": "659",
    "mnc": "02",
    "brand": "MTN",
    "operator": "MTN South Sudan",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Sudan",
    "countryCode": "SS",
    "mcc": "659",
    "mnc": "03",
    "brand": "Gemtel",
    "operator": "Gemtel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Sudan",
    "countryCode": "SS",
    "mcc": "659",
    "mnc": "04",
    "brand": "Vivacell",
    "operator": "Network of the World (NOW)",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800",
    "notes": "shut down Mar 2018"
  },
  {
    "type": "National",
    "countryName": "South Sudan",
    "countryCode": "SS",
    "mcc": "659",
    "mnc": "06",
    "brand": "Zain",
    "operator": "Zain South Sudan",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "South Sudan",
    "countryCode": "SS",
    "mcc": "659",
    "mnc": "07",
    "brand": "Sudani",
    "operator": "Sudani",
    "status": "Operational",
    "bands": "CDMA",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sudan",
    "countryCode": "SD",
    "mcc": "634",
    "mnc": "01",
    "brand": "Zain SD",
    "operator": "Zain Group - Sudan",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": "Former, Mobitel"
  },
  {
    "type": "National",
    "countryName": "Sudan",
    "countryCode": "SD",
    "mcc": "634",
    "mnc": "02",
    "brand": "MTN",
    "operator": "MTN Sudan",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sudan",
    "countryCode": "SD",
    "mcc": "634",
    "mnc": "03",
    "brand": "MTN",
    "operator": "MTN Sudan",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sudan",
    "countryCode": "SD",
    "mcc": "634",
    "mnc": "05",
    "brand": "canar",
    "operator": "Canar Telecom",
    "status": "Operational",
    "bands": "CDMA2000 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sudan",
    "countryCode": "SD",
    "mcc": "634",
    "mnc": "07",
    "brand": "Sudani One",
    "operator": "Sudatel Group",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / CDMA2000 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Sudan",
    "countryCode": "SD",
    "mcc": "634",
    "mnc": "09",
    "brand": "khartoum INC",
    "operator": "NEC",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Swaziland",
    "countryCode": "SZ",
    "mcc": "653",
    "mnc": "01",
    "brand": null,
    "operator": "SPTC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Swaziland",
    "countryCode": "SZ",
    "mcc": "653",
    "mnc": "02",
    "brand": null,
    "operator": "Swazi Mobile Limited",
    "status": "Operational",
    "bands": "LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Swaziland",
    "countryCode": "SZ",
    "mcc": "653",
    "mnc": "10",
    "brand": "Swazi MTN",
    "operator": "Swazi MTN Limited",
    "status": "Operational",
    "bands": "GSM 900 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "01",
    "brand": null,
    "operator": "Shared Network Tanzania Limited",
    "status": "Not operational",
    "bands": "UMTS 900",
    "notes": "Former Rural NetCo Limited; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "02",
    "brand": "tiGO",
    "operator": "MIC Tanzania Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": "Former Mobitel and Buzz"
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "03",
    "brand": "Zantel",
    "operator": "Zanzibar Telecom Ltd",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "04",
    "brand": "Vodacom",
    "operator": "Vodacom Tanzania Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "05",
    "brand": "Airtel",
    "operator": "Bharti Airtel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 700",
    "notes": "Former Celtel (Zain); LTE band 28"
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "06",
    "brand": "Sasatel (Dovetel)",
    "operator": "Dovetel Limited",
    "status": "Not operational",
    "bands": "CDMA 800",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "07",
    "brand": "TTCL Mobile",
    "operator": "Tanzania Telecommunication Company LTD (TTCL)",
    "status": "Operational",
    "bands": "CDMA 800 / UMTS 2100 / LTE 1800 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "08",
    "brand": "Smart",
    "operator": "Benson Informatics Limited",
    "status": "Not operational",
    "bands": "TD-LTE 2300",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "09",
    "brand": "Halotel",
    "operator": "Viettel Tanzania Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Former ExcellentCom Tanzania Limited (Hits)"
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "11",
    "brand": "SmileCom",
    "operator": "Smile Telecoms Holdings Ltd.",
    "status": "Operational",
    "bands": "LTE 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "12",
    "brand": null,
    "operator": "MyCell Limited",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "13",
    "brand": "Cootel",
    "operator": "Wiafrica Tanzania Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tanzania",
    "countryCode": "TZ",
    "mcc": "640",
    "mnc": "14",
    "brand": null,
    "operator": "MO Mobile Holding Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Togo",
    "countryCode": "TG",
    "mcc": "615",
    "mnc": "01",
    "brand": "Togo Cell",
    "operator": "Togo Telecom",
    "status": "Operational",
    "bands": "GSM 900 / LTE / 5G",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Togo",
    "countryCode": "TG",
    "mcc": "615",
    "mnc": "03",
    "brand": "Moov",
    "operator": "Moov Togo",
    "status": "Operational",
    "bands": "GSM 900 / LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tunisia",
    "countryCode": "TN",
    "mcc": "605",
    "mnc": "01",
    "brand": "Orange",
    "operator": "Orange Tunisie",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tunisia",
    "countryCode": "TN",
    "mcc": "605",
    "mnc": "02",
    "brand": "Tunicell",
    "operator": "Tunisie Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Tunisia",
    "countryCode": "TN",
    "mcc": "605",
    "mnc": "03",
    "brand": "Ooredoo",
    "operator": "Ooredoo Tunisiana",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800",
    "notes": "former Orascom Telecom Tunisie"
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "01",
    "brand": "Airtel",
    "operator": "Bharti Airtel",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": "Former Zain, Celtel"
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "04",
    "brand": null,
    "operator": "Tangerine Uganda Limited",
    "status": "Operational",
    "bands": "LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "06",
    "brand": "Vodafone",
    "operator": "Afrimax Uganda",
    "status": "Not operational",
    "bands": "TD-LTE 2600",
    "notes": "shut down May 2018; MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "10",
    "brand": "MTN",
    "operator": "MTN Uganda",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 2600",
    "notes": "LTE band 7"
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "11",
    "brand": "Uganda Telecom",
    "operator": "Uganda Telecom Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "14",
    "brand": "Africell",
    "operator": "Africell Uganda",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS / LTE 800",
    "notes": "Former Orange, HiTS Telecom; LTE band 20"
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "16",
    "brand": null,
    "operator": "SimbaNET Uganda Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "18",
    "brand": "Smart",
    "operator": "Suretelecom Uganda Ltd.",
    "status": "Not operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "20",
    "brand": null,
    "operator": "Hamilton Telecom Limited",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "22",
    "brand": "Airtel",
    "operator": "Bharti Airtel",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS",
    "notes": "Former Warid Telecom"
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "26",
    "brand": "Lycamobile",
    "operator": "Lycamobile Network Services Uganda Limited",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "30",
    "brand": null,
    "operator": "Anupam Global Soft Uganda Limited",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "33",
    "brand": "Smile",
    "operator": "Smile Communications Uganda Limited",
    "status": "Operational",
    "bands": "LTE 800",
    "notes": "LTE band 20"
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "40",
    "brand": null,
    "operator": "Civil Aviation Authority (CAA)",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "44",
    "brand": "K2",
    "operator": "K2 Telecom Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uganda",
    "countryCode": "UG",
    "mcc": "641",
    "mnc": "66",
    "brand": "i-Tel",
    "operator": "i-Tel Ltd",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Zambia",
    "countryCode": "ZM",
    "mcc": "645",
    "mnc": "01",
    "brand": "Airtel",
    "operator": "Bharti Airtel",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900",
    "notes": "Former Celtel (Zain)"
  },
  {
    "type": "National",
    "countryName": "Zambia",
    "countryCode": "ZM",
    "mcc": "645",
    "mnc": "02",
    "brand": "MTN",
    "operator": "MTN Group",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 1800",
    "notes": "Former Telecel"
  },
  {
    "type": "National",
    "countryName": "Zambia",
    "countryCode": "ZM",
    "mcc": "645",
    "mnc": "03",
    "brand": "ZAMTEL",
    "operator": "Zambia Telecommunications Company Ltd",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / TD-LTE 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Zambia",
    "countryCode": "ZM",
    "mcc": "645",
    "mnc": "07",
    "brand": null,
    "operator": "Liquid Telecom Zambia Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Zimbabwe",
    "countryCode": "ZW",
    "mcc": "648",
    "mnc": "01",
    "brand": "Net*One",
    "operator": "Net*One Cellular (Pvt) Ltd",
    "status": "Operational",
    "bands": "GSM 900 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Zimbabwe",
    "countryCode": "ZW",
    "mcc": "648",
    "mnc": "03",
    "brand": "Telecel",
    "operator": "Telecel Zimbabwe (PVT) Ltd",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Zimbabwe",
    "countryCode": "ZW",
    "mcc": "648",
    "mnc": "04",
    "brand": "Econet",
    "operator": "Econet Wireless",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Argentina",
    "countryCode": "AR",
    "mcc": "722",
    "mnc": "010",
    "brand": "Movistar",
    "operator": "Telefónica Móviles Argentina S.A.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Argentina",
    "countryCode": "AR",
    "mcc": "722",
    "mnc": "020",
    "brand": "Nextel",
    "operator": "NII Holdings",
    "status": "Operational",
    "bands": "iDEN 800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Argentina",
    "countryCode": "AR",
    "mcc": "722",
    "mnc": "034",
    "brand": "Personal",
    "operator": "Telecom Personal S.A.",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Argentina",
    "countryCode": "AR",
    "mcc": "722",
    "mnc": "040",
    "brand": "Globalstar",
    "operator": "TE.SA.M Argentina S.A.",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Argentina",
    "countryCode": "AR",
    "mcc": "722",
    "mnc": "070",
    "brand": "Movistar",
    "operator": "Telefónica Móviles Argentina S.A.",
    "status": "Operational",
    "bands": "GSM 1900",
    "notes": "Also uses or had used MNC 07"
  },
  {
    "type": "National",
    "countryName": "Argentina",
    "countryCode": "AR",
    "mcc": "722",
    "mnc": "310",
    "brand": "Claro",
    "operator": "AMX Argentina S.A.",
    "status": "Operational",
    "bands": "GSM 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Argentina",
    "countryCode": "AR",
    "mcc": "722",
    "mnc": "320",
    "brand": "Claro",
    "operator": "AMX Argentina S.A.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Argentina",
    "countryCode": "AR",
    "mcc": "722",
    "mnc": "330",
    "brand": "Claro",
    "operator": "AMX Argentina S.A.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Argentina",
    "countryCode": "AR",
    "mcc": "722",
    "mnc": "341",
    "brand": "Personal",
    "operator": "Telecom Personal S.A.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 2600 / 5G 2600",
    "notes": "LTE bands 28 / 4 / 7"
  },
  {
    "type": "National",
    "countryName": "Argentina",
    "countryCode": "AR",
    "mcc": "722",
    "mnc": "350",
    "brand": "PORT-HABLE",
    "operator": "Hutchison Telecommunications Argentina S.A.",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Acquired by Claro"
  },
  {
    "type": "National",
    "countryName": "Belize",
    "countryCode": "BZ",
    "mcc": "702",
    "mnc": "67",
    "brand": "DigiCell",
    "operator": "Belize Telemedia Limited (BTL)",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1900",
    "notes": "LTE bands 17 / 2"
  },
  {
    "type": "National",
    "countryName": "Belize",
    "countryCode": "BZ",
    "mcc": "702",
    "mnc": "68",
    "brand": "INTELCO",
    "operator": "International Telecommunications Ltd.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Belize",
    "countryCode": "BZ",
    "mcc": "702",
    "mnc": "69",
    "brand": "SMART",
    "operator": "Speednet Communications Limited",
    "status": "Operational",
    "bands": "CDMA2000 850 / UMTS 850 / LTE 700",
    "notes": "LTE band 13"
  },
  {
    "type": "National",
    "countryName": "Belize",
    "countryCode": "BZ",
    "mcc": "702",
    "mnc": "99",
    "brand": "SMART",
    "operator": "Speednet Communications Limited",
    "status": "Operational",
    "bands": "CDMA2000 850",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bolivia",
    "countryCode": "BO",
    "mcc": "736",
    "mnc": "01",
    "brand": "Viva",
    "operator": "Nuevatel PCS De Bolivia SA",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bolivia",
    "countryCode": "BO",
    "mcc": "736",
    "mnc": "02",
    "brand": "Entel",
    "operator": "Entel SA",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Bolivia",
    "countryCode": "BO",
    "mcc": "736",
    "mnc": "03",
    "brand": "Tigo",
    "operator": "Telefónica Celular De Bolivia S.A",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700",
    "notes": "Aka. Telecel Bolivia"
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "00",
    "brand": "Nextel",
    "operator": "NII Holdings, Inc.",
    "status": "Not operational",
    "bands": "iDEN 850",
    "notes": "Defunct since March 2018."
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "01",
    "brand": null,
    "operator": "SISTEER DO BRASIL TELECOMUNICAÇÔES",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": "Through Vivo S.A. network"
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "02",
    "brand": "TIM",
    "operator": "Telecom Italia Mobile",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "03",
    "brand": "TIM",
    "operator": "Telecom Italia Mobile",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "04",
    "brand": "TIM",
    "operator": "Telecom Italia Mobile",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "05",
    "brand": "Claro",
    "operator": "Claro",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600 / 5G 2300 / 5G 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "06",
    "brand": "Vivo",
    "operator": "Telefônica Brasil S.A.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2300 / 5G 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "10",
    "brand": "Vivo",
    "operator": "Telefônica Brasil S.A.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2300 / 5G 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "11",
    "brand": "Vivo",
    "operator": "Telefônica Brasil S.A.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2300 / 5G 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "15",
    "brand": "Sercomtel",
    "operator": "Sercomtel Celular",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "16",
    "brand": "Brasil Telecom GSM",
    "operator": "Brasil Telecom GSM",
    "status": "Not operational",
    "bands": "GSM 1800 / UMTS 2100",
    "notes": "acquired by Oi, MNC used for existing Brasil Telecom SIM Cards only"
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "17",
    "brand": "Surf Telecom",
    "operator": "Correios Celula",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Through TIM network"
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "18",
    "brand": "datora",
    "operator": "Datora (Vodafone)",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Through TIM network"
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "21",
    "brand": "LIGUE",
    "operator": "Ligue Telecom",
    "status": "Operational",
    "bands": "LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "23",
    "brand": "Vivo",
    "operator": "Telefônica Brasil S.A.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800 / LTE 2600",
    "notes": "formerly used by the acquired Telemig Celular"
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "24",
    "brand": null,
    "operator": "Amazonia Celular",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "acquired by Oi"
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "28",
    "brand": "No name",
    "operator": null,
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Used for RanSharing control and roaming between Vivo and Claro"
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "30",
    "brand": "Oi",
    "operator": "TNL PCS Oi",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "31",
    "brand": "Oi",
    "operator": "TNL PCS Oi",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "32",
    "brand": "Algar Telecom",
    "operator": "Algar Telecom S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / 5G 2300",
    "notes": "LTE bands 28 / 3"
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "33",
    "brand": "Algar Telecom",
    "operator": "Algar Telecom S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / 5G 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "34",
    "brand": "Algar Telecom",
    "operator": "Algar Telecom S.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / 5G 2300",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "35",
    "brand": null,
    "operator": "Telcom Telecomunicações",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "36",
    "brand": null,
    "operator": "Options Telecomunicações",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "37",
    "brand": "aeiou",
    "operator": "Unicel",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "Bankruptcy in 2011"
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "38",
    "brand": "Claro",
    "operator": "Claro",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "39",
    "brand": "Nextel",
    "operator": "NII Holdings, Inc.",
    "status": "Operational",
    "bands": "UMTS 2100 / LTE 1800 / LTE 2100",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "54",
    "brand": "Conecta",
    "operator": "PORTO SEGURO TELECOMUNICAÇÔES",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Through TIM network"
  },
  {
    "type": "National",
    "countryName": "Brazil",
    "countryCode": "BR",
    "mcc": "724",
    "mnc": "99",
    "brand": "Local",
    "operator": null,
    "status": "Operational",
    "bands": "Unknown",
    "notes": "Used for RanSharing control and roaming between TIM and Oi"
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "01",
    "brand": "entel",
    "operator": "Entel Telefonía Móvil S.A.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 700 / LTE 2600 / 5G 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "02",
    "brand": "Movistar",
    "operator": "Telefónica Móvil de Chile",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 2600 / 5G 2500",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "03",
    "brand": "CLARO CL",
    "operator": "Claro Chile S.A.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 700 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "04",
    "brand": "WOM",
    "operator": "Novator Partners",
    "status": "Operational",
    "bands": "iDEN 800",
    "notes": "Former Nextel"
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "05",
    "brand": null,
    "operator": "Multikom S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "06",
    "brand": "Telsur",
    "operator": "Blue Two Chile S.A.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "07",
    "brand": "Movistar",
    "operator": "Telefónica Móvil de Chile",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "08",
    "brand": "VTR Móvil",
    "operator": "VTR S.A.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Movistar"
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "09",
    "brand": "WOM",
    "operator": "Novator Partners",
    "status": "Operational",
    "bands": "UMTS 1700 / LTE 1700 / 5G 2500",
    "notes": "Former Nextel; roaming with entel and Claro networks (GSM / UMTS)"
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "10",
    "brand": "entel",
    "operator": "Entel Telefonía Móvil S.A.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "11",
    "brand": null,
    "operator": "Celupago S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "12",
    "brand": "Colo-Colo MóvilWanderers Móvil",
    "operator": "Telestar Móvil S.A.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Movistar"
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "13",
    "brand": "Virgin Mobile",
    "operator": "Tribe Mobile Chile SPA",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Movistar"
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "14",
    "brand": null,
    "operator": "Netline Telefónica Móvil Ltda",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "15",
    "brand": null,
    "operator": "Cibeles Telecom S.A.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "16",
    "brand": null,
    "operator": "Nomade Telecomunicaciones S.A.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "17",
    "brand": null,
    "operator": "COMPATEL Chile Limitada",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "18",
    "brand": null,
    "operator": "Empresas Bunker S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "19",
    "brand": "móvil Falabella",
    "operator": "Sociedad Falabella Móvil SPA",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses entel"
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "20",
    "brand": null,
    "operator": "Inversiones Santa Fe Limitada",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "22",
    "brand": null,
    "operator": "Cellplus SpA",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "23",
    "brand": null,
    "operator": "Claro Servicios Empresariales S. A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "26",
    "brand": null,
    "operator": "WILL S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "27",
    "brand": null,
    "operator": "Cibeles Telecom S.A.",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Chile",
    "countryCode": "CL",
    "mcc": "730",
    "mnc": "99",
    "brand": "Will",
    "operator": "WILL Telefonía",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900",
    "notes": "Wireless local loop"
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "001",
    "brand": "Movistar",
    "operator": "Colombia Telecomunicaciones S.A. ESP",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "002",
    "brand": "Edatel",
    "operator": "Edatel S.A. ESP",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "003",
    "brand": null,
    "operator": "LLEIDA S.A.S.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "004",
    "brand": null,
    "operator": "COMPATEL COLOMBIA SAS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "020",
    "brand": "Tigo",
    "operator": "Une EPM Telecomunicaciones S.A. E.S.P.",
    "status": "Operational",
    "bands": "LTE 2600",
    "notes": "Former Une-EPM; Former Emtelsa; merged with Tigo"
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "099",
    "brand": "EMCALI",
    "operator": "Empresas Municipales de Cali",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "101",
    "brand": "Claro",
    "operator": "Comunicacion Celular S.A. (Comcel)",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1700 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "102",
    "brand": null,
    "operator": "Bellsouth Colombia",
    "status": "Not operational",
    "bands": "GSM 850 / GSM 1900 / CDMA 850",
    "notes": "MNC withdrawn; network acquired by Movistar"
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "103",
    "brand": "Tigo",
    "operator": "Colombia Móvil S.A. ESP",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 2100 / LTE 700 / LTE 1700 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "111",
    "brand": "Tigo",
    "operator": "Colombia Móvil S.A. ESP",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 2100 / LTE 700 / LTE 1700 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "123",
    "brand": "Movistar",
    "operator": "Colombia Telecomunicaciones S.A. ESP",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 850 / LTE 1700 / LTE 1900",
    "notes": "CDMA shut down"
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "130",
    "brand": "AVANTEL",
    "operator": "Avantel S.A.S",
    "status": "Operational",
    "bands": "iDEN / UMTS 1700 / LTE 1700",
    "notes": "owned by Novator Partners"
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "142",
    "brand": null,
    "operator": "Une EPM Telecomunicaciones S.A. E.S.P.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "154",
    "brand": "Virgin Mobile",
    "operator": "Virgin Mobile Colombia S.A.S.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Uses Movistar"
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "165",
    "brand": null,
    "operator": "Colombia Móvil S.A. ESP",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "176",
    "brand": null,
    "operator": "DirecTV Colombia Ltda",
    "status": "Operational",
    "bands": "LTE 2600 / TD-5G 2600",
    "notes": "acquired by Movistar"
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "187",
    "brand": "eTb",
    "operator": "Empresa de Telecomunicaciones de Bogotá S.A. ESP",
    "status": "Operational",
    "bands": "LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "199",
    "brand": null,
    "operator": "SUMA Movil SAS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "208",
    "brand": null,
    "operator": "UFF Movil SAS",
    "status": "Not operational",
    "bands": "LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "210",
    "brand": null,
    "operator": "Hablame Colombia SAS ESP",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "220",
    "brand": null,
    "operator": "Libre Tecnologias SAS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "230",
    "brand": null,
    "operator": "Setroc Mobile Group SAS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "240",
    "brand": null,
    "operator": "Logistica Flash Colombia SAS",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "360",
    "brand": "WOM",
    "operator": "Partners Telecom Colombia SAS",
    "status": "Operational",
    "bands": "LTE 700 / LTE 2600",
    "notes": "owned by Novator Partners"
  },
  {
    "type": "National",
    "countryName": "Colombia",
    "countryCode": "CO",
    "mcc": "732",
    "mnc": "666",
    "brand": "Claro",
    "operator": "Comunicacion Celular S.A. (Comcel)",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Costa Rica",
    "countryCode": "CR",
    "mcc": "712",
    "mnc": "01",
    "brand": "Kölbi ICE",
    "operator": "Instituto Costarricense de Electricidad",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 850 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Costa Rica",
    "countryCode": "CR",
    "mcc": "712",
    "mnc": "02",
    "brand": "Kölbi ICE",
    "operator": "Instituto Costarricense de Electricidad",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 850 / LTE 1800 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Costa Rica",
    "countryCode": "CR",
    "mcc": "712",
    "mnc": "03",
    "brand": "Claro",
    "operator": "Claro CR Telecomunicaciones (Aló)",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Costa Rica",
    "countryCode": "CR",
    "mcc": "712",
    "mnc": "04",
    "brand": "Movistar",
    "operator": "Telefónica Móviles Costa Rica",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Costa Rica",
    "countryCode": "CR",
    "mcc": "712",
    "mnc": "20",
    "brand": "fullmóvil",
    "operator": "Virtualis S.A.",
    "status": "Not operational",
    "bands": "MVNO",
    "notes": "Closed on 6 February 2019"
  },
  {
    "type": "National",
    "countryName": "Ecuador",
    "countryCode": "EC",
    "mcc": "740",
    "mnc": "00",
    "brand": "Movistar",
    "operator": "Otecel S.A.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1900",
    "notes": "Former BellSouth"
  },
  {
    "type": "National",
    "countryName": "Ecuador",
    "countryCode": "EC",
    "mcc": "740",
    "mnc": "01",
    "brand": "Claro",
    "operator": "CONECEL S.A.",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 1700",
    "notes": "Former Porta"
  },
  {
    "type": "National",
    "countryName": "Ecuador",
    "countryCode": "EC",
    "mcc": "740",
    "mnc": "02",
    "brand": "CNT Mobile",
    "operator": "Corporación Nacional de Telecomunicaciones (CNT EP)",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 1700",
    "notes": "Former Alegro / Telecsa; CDMA 1900 shut down in 2014"
  },
  {
    "type": "National",
    "countryName": "Ecuador",
    "countryCode": "EC",
    "mcc": "740",
    "mnc": "03",
    "brand": "Tuenti",
    "operator": "Otecel S.A.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Runs on Movistar's Network"
  },
  {
    "type": "National",
    "countryName": "El Salvador",
    "countryCode": "SV",
    "mcc": "706",
    "mnc": "01",
    "brand": "Claro",
    "operator": "CTE Telecom Personal, S.A. de C.V.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900",
    "notes": "owned by América Móvil"
  },
  {
    "type": "National",
    "countryName": "El Salvador",
    "countryCode": "SV",
    "mcc": "706",
    "mnc": "02",
    "brand": "Digicel",
    "operator": "Digicel, S.A. de C.V.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "El Salvador",
    "countryCode": "SV",
    "mcc": "706",
    "mnc": "03",
    "brand": "Tigo",
    "operator": "Telemovil El Salvador S.A.",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / LTE 850 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "El Salvador",
    "countryCode": "SV",
    "mcc": "706",
    "mnc": "04",
    "brand": "Movistar",
    "operator": "Telefónica Móviles El Salvador",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "El Salvador",
    "countryCode": "SV",
    "mcc": "706",
    "mnc": "05",
    "brand": "RED",
    "operator": "INTELFON, S.A. de C.V.",
    "status": "Operational",
    "bands": "iDEN",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Falkland Islands (United Kingdom)",
    "countryCode": "FK",
    "mcc": "750",
    "mnc": "001",
    "brand": "Sure",
    "operator": "Sure South Atlantic Ltd.",
    "status": "Operational",
    "bands": "GSM 900 / LTE 1800 / WiMAX 2400 / WiMAX 3500",
    "notes": "formerly Cable & Wireless Communications Touch"
  },
  {
    "type": "National",
    "countryName": "French Guiana (France)",
    "countryCode": "GF",
    "mcc": "340",
    "mnc": "01",
    "brand": "Orange",
    "operator": "Orange Caraïbe Mobiles",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": "French Antilles MCC"
  },
  {
    "type": "National",
    "countryName": "French Guiana (France)",
    "countryCode": "GF",
    "mcc": "340",
    "mnc": "02",
    "brand": "SFR Caraïbe",
    "operator": "Outremer Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600",
    "notes": "French Antilles MCC; former Only"
  },
  {
    "type": "National",
    "countryName": "French Guiana (France)",
    "countryCode": "GF",
    "mcc": "340",
    "mnc": "11",
    "brand": null,
    "operator": "Guyane Téléphone Mobile",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "French Antilles MCC"
  },
  {
    "type": "National",
    "countryName": "French Guiana (France)",
    "countryCode": "GF",
    "mcc": "340",
    "mnc": "20",
    "brand": "Digicel",
    "operator": "DIGICEL Antilles Française Guyane",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 2100 / LTE 800",
    "notes": "French Antilles MCC; former Bouygues Telecom Caraïbes"
  },
  {
    "type": "National",
    "countryName": "French Guiana (France)",
    "countryCode": "GF",
    "mcc": "742",
    "mnc": "04",
    "brand": "Free",
    "operator": "Free Caraïbe",
    "status": "Upcoming",
    "bands": "UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / LTE 2600",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guatemala",
    "countryCode": "GT",
    "mcc": "704",
    "mnc": "01",
    "brand": "Claro",
    "operator": "Telecomunicaciones de Guatemala, S.A.",
    "status": "Operational",
    "bands": "CDMA 1900 / GSM 900 / UMTS 1900 / LTE 1900",
    "notes": "former Servicios de Comunicaciones Personales Inalambricas (SERCOM)"
  },
  {
    "type": "National",
    "countryName": "Guatemala",
    "countryCode": "GT",
    "mcc": "704",
    "mnc": "02",
    "brand": "Tigo",
    "operator": "Millicom / Local partners",
    "status": "Operational",
    "bands": "TDMA 800 / GSM 850 / UMTS 850 / LTE 850",
    "notes": "former COMCEL"
  },
  {
    "type": "National",
    "countryName": "Guatemala",
    "countryCode": "GT",
    "mcc": "704",
    "mnc": "03",
    "brand": "Movistar",
    "operator": "Telefónica Móviles Guatemala (Telefónica)",
    "status": "Operational",
    "bands": "CDMA 1900 / GSM 1900 / UMTS 1900 / LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guatemala",
    "countryCode": "GT",
    "mcc": "704",
    "mnc": "?",
    "brand": "digicel",
    "operator": "Digicel Group",
    "status": "Reserved",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guatemala",
    "countryCode": "GT",
    "mcc": "704",
    "mnc": "?",
    "brand": "RED/INTELFON",
    "operator": "INTELFON Guatemala",
    "status": "Operational",
    "bands": "iDEN 800",
    "notes": "INTELFON GUATEMALA owned by INTELFON El Salvador"
  },
  {
    "type": "National",
    "countryName": "Guyana",
    "countryCode": "GY",
    "mcc": "738",
    "mnc": "01",
    "brand": "Digicel",
    "operator": "U-Mobile (Cellular) Inc.",
    "status": "Operational",
    "bands": "GSM 900 / UMTS 850",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guyana",
    "countryCode": "GY",
    "mcc": "738",
    "mnc": "002",
    "brand": "GT&T Cellink Plus",
    "operator": "Guyana Telephone & Telegraph Co.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850 / LTE 700",
    "notes": "LTE band 28"
  },
  {
    "type": "National",
    "countryName": "Guyana",
    "countryCode": "GY",
    "mcc": "738",
    "mnc": "003",
    "brand": null,
    "operator": "Quark Communications Inc.",
    "status": "Operational",
    "bands": "TD-LTE",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Guyana",
    "countryCode": "GY",
    "mcc": "738",
    "mnc": "05",
    "brand": null,
    "operator": "eGovernment Unit, Ministry of the Presidency",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Honduras",
    "countryCode": "HN",
    "mcc": "708",
    "mnc": "001",
    "brand": "Claro",
    "operator": "Servicios de Comunicaciones de Honduras S.A. de C.V.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Honduras",
    "countryCode": "HN",
    "mcc": "708",
    "mnc": "002",
    "brand": "Tigo",
    "operator": "Celtel",
    "status": "Operational",
    "bands": "CDMA 850 / GSM 850 / UMTS 850 / LTE 1700",
    "notes": "also uses or has used MNC 02"
  },
  {
    "type": "National",
    "countryName": "Honduras",
    "countryCode": "HN",
    "mcc": "708",
    "mnc": "030",
    "brand": "Hondutel",
    "operator": "Empresa Hondureña de Telecomunicaciones",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Honduras",
    "countryCode": "HN",
    "mcc": "708",
    "mnc": "040",
    "brand": "Digicel",
    "operator": "Digicel de Honduras",
    "status": "Not operational",
    "bands": "GSM 1900",
    "notes": "Sold to Claro in 2011"
  },
  {
    "type": "National",
    "countryName": "Nicaragua",
    "countryCode": "NI",
    "mcc": "710",
    "mnc": "21",
    "brand": "Claro",
    "operator": "Empresa Nicaragüense de Telecomunicaciones, S.A. (ENITEL) (América Móvil)",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 850 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Nicaragua",
    "countryCode": "NI",
    "mcc": "710",
    "mnc": "30",
    "brand": "Tigo",
    "operator": "Telefonía Celular de Nicaragua, S.A.",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1900",
    "notes": "Former Movistar; CDMA 800, TDMA 800, and NAMPS 800 have been shut down"
  },
  {
    "type": "National",
    "countryName": "Nicaragua",
    "countryCode": "NI",
    "mcc": "710",
    "mnc": "73",
    "brand": "Claro",
    "operator": "Servicios de Comunicaciones S.A.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 850",
    "notes": "Former SERCOM (Merged with ENITEL in 2004 and became Claro in 2009)"
  },
  {
    "type": "National",
    "countryName": "Panama",
    "countryCode": "PA",
    "mcc": "714",
    "mnc": "01",
    "brand": "Cable & Wireless",
    "operator": "Cable & Wireless Panama S.A.",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / LTE 700 / LTE 1900",
    "notes": "LTE band 28 / 2"
  },
  {
    "type": "National",
    "countryName": "Panama",
    "countryCode": "PA",
    "mcc": "714",
    "mnc": "02",
    "brand": "Tigo",
    "operator": "Telefónica Moviles de Panama S.A",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 1900",
    "notes": "Former Movistar, Bell South Corp. (BSC); CDMA 800, TDMA 800 and NAMPS 800 are closed."
  },
  {
    "type": "National",
    "countryName": "Panama",
    "countryCode": "PA",
    "mcc": "714",
    "mnc": "020",
    "brand": "Tigo",
    "operator": "Telefónica Móviles de Panama S.A",
    "status": "Operational",
    "bands": "GSM 850 / LTE 700",
    "notes": "Former Movistar"
  },
  {
    "type": "National",
    "countryName": "Panama",
    "countryCode": "PA",
    "mcc": "714",
    "mnc": "03",
    "brand": "Claro",
    "operator": "América Móvil",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 700 / LTE 1900",
    "notes": "Being acquired by C&W; LTE bands 28 / 2"
  },
  {
    "type": "National",
    "countryName": "Panama",
    "countryCode": "PA",
    "mcc": "714",
    "mnc": "04",
    "brand": "Digicel",
    "operator": "Digicel Group",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 700 / LTE 1900",
    "notes": "LTE bands 28 / 2"
  },
  {
    "type": "National",
    "countryName": "Paraguay",
    "countryCode": "PY",
    "mcc": "744",
    "mnc": "01",
    "brand": "VOX",
    "operator": "Hola Paraguay S.A.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 900 / UMTS 1900 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Paraguay",
    "countryCode": "PY",
    "mcc": "744",
    "mnc": "02",
    "brand": "Claro",
    "operator": "AMX Paraguay S.A.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 1700",
    "notes": "Former Hutchison, Port Hable, CTI Móvil"
  },
  {
    "type": "National",
    "countryName": "Paraguay",
    "countryCode": "PY",
    "mcc": "744",
    "mnc": "03",
    "brand": null,
    "operator": "Compañia Privada de Comunicaciones S.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Paraguay",
    "countryCode": "PY",
    "mcc": "744",
    "mnc": "04",
    "brand": "Tigo",
    "operator": "Telefónica Celular Del Paraguay S.A. (Telecel)",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 850 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Paraguay",
    "countryCode": "PY",
    "mcc": "744",
    "mnc": "05",
    "brand": "Personal",
    "operator": "Núcleo S.A. (TIM)",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Paraguay",
    "countryCode": "PY",
    "mcc": "744",
    "mnc": "06",
    "brand": "Copaco",
    "operator": "Copaco S.A.",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Peru",
    "countryCode": "PE",
    "mcc": "716",
    "mnc": "06",
    "brand": "Movistar",
    "operator": "Telefónica del Perú S.A.A.",
    "status": "Operational",
    "bands": "CDMA2000 850 / GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Peru",
    "countryCode": "PE",
    "mcc": "716",
    "mnc": "07",
    "brand": "Entel",
    "operator": "Entel Perú S.A.",
    "status": "Operational",
    "bands": "iDEN",
    "notes": "Former Nextel"
  },
  {
    "type": "National",
    "countryName": "Peru",
    "countryCode": "PE",
    "mcc": "716",
    "mnc": "10",
    "brand": "Claro",
    "operator": "América Móvil Perú",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 850 / LTE 700 / LTE 1900 / TD-LTE 3500 / 5G 3500 / 5G 39000",
    "notes": "Former TIM"
  },
  {
    "type": "National",
    "countryName": "Peru",
    "countryCode": "PE",
    "mcc": "716",
    "mnc": "15",
    "brand": "Bitel",
    "operator": "Viettel Peru S.A.C.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 900",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Peru",
    "countryCode": "PE",
    "mcc": "716",
    "mnc": "17",
    "brand": "Entel",
    "operator": "Entel Perú S.A.",
    "status": "Operational",
    "bands": "UMTS 1900 / LTE 1700 / TD-LTE 2300 / 5G 3500",
    "notes": "Former Nextel"
  },
  {
    "type": "National",
    "countryName": "Suriname",
    "countryCode": "SR",
    "mcc": "746",
    "mnc": "02",
    "brand": "Telesur",
    "operator": "Telecommunications Company Suriname (Telesur)",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / 5G 3700",
    "notes": "LTE bands 28, 3"
  },
  {
    "type": "National",
    "countryName": "Suriname",
    "countryCode": "SR",
    "mcc": "746",
    "mnc": "03",
    "brand": "Digicel",
    "operator": "Digicel Group Limited",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 850",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Suriname",
    "countryCode": "SR",
    "mcc": "746",
    "mnc": "04",
    "brand": "Digicel",
    "operator": "Digicel Group Limited",
    "status": "Not operational",
    "bands": "GSM 900 / UMTS",
    "notes": "Former Uniqa (Intelsur N.V. / UTS N.V.); MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Suriname",
    "countryCode": "SR",
    "mcc": "746",
    "mnc": "05",
    "brand": "Telesur",
    "operator": "Telecommunications Company Suriname (Telesur)",
    "status": "Unknown",
    "bands": "CDMA 450",
    "notes": null
  },
  {
    "type": "National",
    "countryName": "Uruguay",
    "countryCode": "UY",
    "mcc": "748",
    "mnc": "00",
    "brand": "Antel",
    "operator": "Administración Nacional de Telecomunicaciones",
    "status": "Not operational",
    "bands": "TDMA",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Uruguay",
    "countryCode": "UY",
    "mcc": "748",
    "mnc": "01",
    "brand": "Antel",
    "operator": "Administración Nacional de Telecomunicaciones",
    "status": "Operational",
    "bands": "GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1700 / 5G 28000",
    "notes": "Former brand Ancel; LTE bands 28 / 4"
  },
  {
    "type": "National",
    "countryName": "Uruguay",
    "countryCode": "UY",
    "mcc": "748",
    "mnc": "03",
    "brand": "Antel",
    "operator": "Administración Nacional de Telecomunicaciones",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "National",
    "countryName": "Uruguay",
    "countryCode": "UY",
    "mcc": "748",
    "mnc": "07",
    "brand": "Movistar",
    "operator": "Telefónica Móviles Uruguay",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1900",
    "notes": "Former Movicom"
  },
  {
    "type": "National",
    "countryName": "Uruguay",
    "countryCode": "UY",
    "mcc": "748",
    "mnc": "10",
    "brand": "Claro",
    "operator": "AM Wireless Uruguay S.A.",
    "status": "Operational",
    "bands": "GSM 1900 / UMTS 1900 / LTE 1700",
    "notes": "Former CTI Móvil"
  },
  {
    "type": "National",
    "countryName": "Venezuela",
    "countryCode": "VE",
    "mcc": "734",
    "mnc": "01",
    "brand": "Digitel",
    "operator": "Corporacion Digitel C.A.",
    "status": "Not operational",
    "bands": "GSM 900",
    "notes": "Formerly INFONET"
  },
  {
    "type": "National",
    "countryName": "Venezuela",
    "countryCode": "VE",
    "mcc": "734",
    "mnc": "02",
    "brand": "Digitel GSM",
    "operator": "Corporacion Digitel C.A.",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 1800",
    "notes": "DIGITEL-DIGICEL-INFONET Merger"
  },
  {
    "type": "National",
    "countryName": "Venezuela",
    "countryCode": "VE",
    "mcc": "734",
    "mnc": "03",
    "brand": "DirecTV",
    "operator": "Galaxy Entertainment de Venezuela C.A.",
    "status": "Unknown",
    "bands": "LTE 2600",
    "notes": "Formerly DIGICEL"
  },
  {
    "type": "National",
    "countryName": "Venezuela",
    "countryCode": "VE",
    "mcc": "734",
    "mnc": "04",
    "brand": "Movistar",
    "operator": "Telefónica Móviles Venezuela",
    "status": "Operational",
    "bands": "GSM 850 / GSM 1900 / UMTS 1900 / LTE 1700",
    "notes": "CDMA 850 shut down March 2014"
  },
  {
    "type": "National",
    "countryName": "Venezuela",
    "countryCode": "VE",
    "mcc": "734",
    "mnc": "06",
    "brand": "Movilnet",
    "operator": "Telecomunicaciones Movilnet",
    "status": "Operational",
    "bands": "GSM 850 / UMTS 1900 / LTE 1700",
    "notes": "CDMA 850 shut down Oct 2020"
  },
  {
    "type": "Test",
    "countryName": null,
    "countryCode": null,
    "mcc": "001",
    "mnc": "01",
    "brand": "TEST",
    "operator": "Test network",
    "status": "Operational",
    "bands": "any",
    "notes": null
  },
  {
    "type": "Test",
    "countryName": null,
    "countryCode": null,
    "mcc": "001",
    "mnc": "001",
    "brand": "TEST",
    "operator": "Test network",
    "status": "Operational",
    "bands": "any",
    "notes": null
  },
  {
    "type": "Test",
    "countryName": null,
    "countryCode": null,
    "mcc": "999",
    "mnc": "99",
    "brand": null,
    "operator": "Internal use",
    "status": "Operational",
    "bands": "any",
    "notes": "Internal use in private networks, no roaming"
  },
  {
    "type": "Test",
    "countryName": null,
    "countryCode": null,
    "mcc": "999",
    "mnc": "999",
    "brand": null,
    "operator": "Internal use",
    "status": "Operational",
    "bands": "any",
    "notes": "Internal use in private networks, no roaming"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "01",
    "brand": "ICO",
    "operator": "ICO Satellite Management",
    "status": "Not operational",
    "bands": "Satellite",
    "notes": "MNC withdrawn"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "02",
    "brand": null,
    "operator": "Unassigned",
    "status": "Returned spare",
    "bands": "Unknown",
    "notes": "Formerly: Sense Communications International"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "03",
    "brand": "Iridium",
    "operator": null,
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "04",
    "brand": null,
    "operator": "Unassigned",
    "status": "Returned spare",
    "bands": "Satellite",
    "notes": "Formerly: Globalstar"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "05",
    "brand": null,
    "operator": "Thuraya RMSS Network",
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "06",
    "brand": null,
    "operator": "Thuraya Satellite Telecommunications Company",
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "07",
    "brand": null,
    "operator": "Unassigned",
    "status": "Returned spare",
    "bands": "Unknown",
    "notes": "Formerly: Ellipso"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "08",
    "brand": null,
    "operator": "Unassigned",
    "status": "Returned spare",
    "bands": "Unknown",
    "notes": "Formerly: GSM, reserved for station identification where the mobile does not have a subscription IMSI"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "09",
    "brand": null,
    "operator": "Unassigned",
    "status": "Returned spare",
    "bands": "Unknown",
    "notes": "Formerly: Tele1 Europe"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "10",
    "brand": "ACeS",
    "operator": null,
    "status": "Not operational",
    "bands": "Satellite",
    "notes": "MNC withdrawn"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "11",
    "brand": "Inmarsat",
    "operator": null,
    "status": "Operational",
    "bands": "Satellite",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "12",
    "brand": "Telenor",
    "operator": "Telenor Maritime AS",
    "status": "Operational",
    "bands": "GSM 1800 / LTE 800",
    "notes": "Maritime; formerly Maritime Communications Partner (MCP)"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "13",
    "brand": "GSM.AQ",
    "operator": "BebbiCell AG",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Antarctica +88234 Network; formerly Global Networks Switzerland Inc."
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "14",
    "brand": "AeroMobile",
    "operator": "AeroMobile AS",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Air"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "15",
    "brand": "OnAir",
    "operator": "OnAir Switzerland Sarl",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Air"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "16",
    "brand": "Cisco Jasper",
    "operator": "Cisco Systems, Inc.",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "17",
    "brand": "Navitas",
    "operator": "JT Group Limited",
    "status": "Not operational",
    "bands": "GSM 1800",
    "notes": "Maritime; shut down in 2009"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "18",
    "brand": "Cellular @Sea",
    "operator": "AT&T Mobility",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1900 / CDMA2000 1900 / UMTS 1900 / LTE 700",
    "notes": "Maritime"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "19",
    "brand": "Epic Maritime",
    "operator": "Monaco Telecom",
    "status": "Operational",
    "bands": "GSM 900 / GSM 1800 / UMTS 2100",
    "notes": "Maritime"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "20",
    "brand": null,
    "operator": "Intermatica",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "21",
    "brand": null,
    "operator": "Wins Limited",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Maritime; formerly Seanet Maritime Communications"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "22",
    "brand": null,
    "operator": "MediaLincc Ltd",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "23",
    "brand": null,
    "operator": "Unassigned",
    "status": "Returned spare",
    "bands": "Unknown",
    "notes": "Formerly: Beeline"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "24",
    "brand": "iNum",
    "operator": "Voxbone",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "+883 iNum"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "25",
    "brand": null,
    "operator": "Unassigned",
    "status": "Returned spare",
    "bands": "Unknown",
    "notes": "Formerly: In & phone"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "26",
    "brand": "TIM@sea",
    "operator": "Telecom Italia Mobile",
    "status": "Operational",
    "bands": "GSM 1800 / GSM 1900",
    "notes": "Maritime"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "27",
    "brand": "OnMarine",
    "operator": "Monaco Telecom",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Maritime"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "28",
    "brand": "Vodafone",
    "operator": "GDSP (Vodafone's Global Data Service Platform)",
    "status": "Operational",
    "bands": "Roaming SIM",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "29",
    "brand": "Telenor",
    "operator": null,
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "30",
    "brand": null,
    "operator": "Unassigned",
    "status": "Returned spare",
    "bands": "Unknown",
    "notes": "Formerly: Terrestar Networks"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "31",
    "brand": "Orange",
    "operator": "Orange S.A.",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "32",
    "brand": "Sky High",
    "operator": "MegaFon",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": "Air (Aeroflot)"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "33",
    "brand": null,
    "operator": "Smart Communications",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "34",
    "brand": null,
    "operator": "tyntec GmbH",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "35",
    "brand": null,
    "operator": "Globecomm Network Services",
    "status": "Operational",
    "bands": "GSM 850",
    "notes": "Maritime"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "36",
    "brand": null,
    "operator": "Azerfon",
    "status": "Operational",
    "bands": "GSM 1800",
    "notes": "Air"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "37",
    "brand": null,
    "operator": "Transatel",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Global SIM for Data Mobile Broadband and M2M"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "38",
    "brand": null,
    "operator": "Multiregional TransitTelecom (MTT)",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "39",
    "brand": null,
    "operator": "MTX Connect Ltd",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "40",
    "brand": "1NCE",
    "operator": "Deutsche Telekom AG",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "41",
    "brand": null,
    "operator": "One Network B.V.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "Former BodyTrace Netherlands B.V."
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "42",
    "brand": null,
    "operator": "DCN Hub ehf",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "43",
    "brand": null,
    "operator": "EMnify GmbH",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "44",
    "brand": null,
    "operator": "AT&T Inc.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "45",
    "brand": null,
    "operator": "Advanced Wireless Network Company Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "subsidiary of Advanced Info Service"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "46",
    "brand": null,
    "operator": "Telecom26 AG",
    "status": "Operational",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "47",
    "brand": null,
    "operator": "Ooredoo",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "48",
    "brand": "Com4",
    "operator": "Communication for Devices in Sweden AB",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "49",
    "brand": "Zain",
    "operator": "Mobile Telecommunications Company K.S.C.P.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "50",
    "brand": null,
    "operator": "EchoStar Mobile",
    "status": "Unknown",
    "bands": "Satellite",
    "notes": "Also listed as Sawatch Limited"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "51",
    "brand": null,
    "operator": "VisionNG",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "52",
    "brand": null,
    "operator": "Manx Telecom Trading Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "53",
    "brand": "European Aviation Network",
    "operator": "Inmarsat Ltd.",
    "status": "Operational",
    "bands": "LTE 2100",
    "notes": "Former Deutsche Telekom; LTE band 65; ground-based network for aircraft"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "54",
    "brand": null,
    "operator": "Teleena Holding B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "55",
    "brand": null,
    "operator": "Beezz Communication Solutions Ltd.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "56",
    "brand": "ETSI",
    "operator": "European Telecommunications Standards Institute",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "57",
    "brand": null,
    "operator": "SAP",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "58",
    "brand": "BICS",
    "operator": "Belgacom ICS SA",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "59",
    "brand": null,
    "operator": "MessageBird B.V.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "60",
    "brand": null,
    "operator": "OneWeb",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "61",
    "brand": null,
    "operator": "MTN Management Services",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "62",
    "brand": null,
    "operator": "Twilio Inc.",
    "status": "Operational",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "63",
    "brand": null,
    "operator": "GloTel B.V.",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdawn"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "64",
    "brand": null,
    "operator": "Syniverse Technologies, LLC",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "65",
    "brand": null,
    "operator": "Plintron Global Technology Solutions Pty Ltd",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "66",
    "brand": null,
    "operator": "Limitless Mobile LLC",
    "status": "Operational",
    "bands": "LTE",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "67",
    "brand": null,
    "operator": "1NCE GmbH",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "IoT solutions"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "68",
    "brand": null,
    "operator": "Maersk Line A/S",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "69",
    "brand": null,
    "operator": "Legos",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "70",
    "brand": null,
    "operator": "Clementvale Baltic OÜ",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "71",
    "brand": null,
    "operator": "Tampnet AS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "72",
    "brand": null,
    "operator": "Tele2 Sverige Aktiebolag",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "Former Tele2 IoT"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "73",
    "brand": null,
    "operator": "Cubic Telecom Limited",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "74",
    "brand": null,
    "operator": "Etisalat",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "75",
    "brand": null,
    "operator": "Podsystem Ltd.",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "IoT solutions"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "76",
    "brand": null,
    "operator": "A1 Telekom Austria AG",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "77",
    "brand": null,
    "operator": "Bouygues Telecom",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "78",
    "brand": null,
    "operator": "Telecom Italia Sparkle S.p.A.",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "79",
    "brand": null,
    "operator": "Nokia Corporation",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "80",
    "brand": null,
    "operator": "Flo Live Limited",
    "status": "Operational",
    "bands": "MVNO",
    "notes": "IoT solutions"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "81",
    "brand": null,
    "operator": "Airnity SAS",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": "IoT solutions"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "82",
    "brand": null,
    "operator": "Eseye Limited",
    "status": "Unknown",
    "bands": "MVNO",
    "notes": "IoT solutions"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "83",
    "brand": null,
    "operator": "iBasis Netherlands BV",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "84",
    "brand": null,
    "operator": "Telefónica Móviles España, S.A. Unipersonal",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "85",
    "brand": null,
    "operator": "Telefónica Germany GmbH & Co. OHG",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "901",
    "mnc": "88",
    "brand": null,
    "operator": "UN Office for the Coordination of Humanitarian Affairs (OCHA)",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "MNC withdrawn"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "902",
    "mnc": "01",
    "brand": null,
    "operator": "MulteFire Alliance",
    "status": "Operational",
    "bands": "LTE",
    "notes": null
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "991",
    "mnc": "01",
    "brand": null,
    "operator": "World's Global Telecom",
    "status": "Not operational",
    "bands": "Unknown",
    "notes": "temporarily assigned until 15 January 2021"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "991",
    "mnc": "02",
    "brand": "5G Croco",
    "operator": "Orange S.A.",
    "status": "Unknown",
    "bands": "5G",
    "notes": "temporarily assigned until 6 August 2022"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "991",
    "mnc": "03",
    "brand": null,
    "operator": "Halys SAS",
    "status": "Unknown",
    "bands": "Unknown",
    "notes": "temporary assignment for trial until 5.IV.2022)"
  },
  {
    "type": "International",
    "countryName": null,
    "countryCode": null,
    "mcc": "995",
    "mnc": "01",
    "brand": "FonePlus",
    "operator": "Sure (Diego Garcia) Ltd",
    "status": "Operational",
    "bands": "GSM 900",
    "notes": "There appears to be no officially assigned MCC"
  }
]
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/mcc-mnc-list/status-codes.json":[function(require,module,exports){
module.exports=[
  "Allocated",
  "Implement / Design",
  "Not operational",
  "Ongoing",
  "Operational",
  "Planned",
  "Reserved",
  "Returned spare",
  "Temporary operational",
  "Test Network",
  "Testing",
  "Unknown",
  "Upcoming"
]
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/md5/md5.js":[function(require,module,exports){
(function(){
  var crypt = require('crypt'),
      utf8 = require('charenc').utf8,
      isBuffer = require('is-buffer'),
      bin = require('charenc').bin,

  // The core
  md5 = function (message, options) {
    // Convert to byte array
    if (message.constructor == String)
      if (options && options.encoding === 'binary')
        message = bin.stringToBytes(message);
      else
        message = utf8.stringToBytes(message);
    else if (isBuffer(message))
      message = Array.prototype.slice.call(message, 0);
    else if (!Array.isArray(message) && message.constructor !== Uint8Array)
      message = message.toString();
    // else, assume byte array already

    var m = crypt.bytesToWords(message),
        l = message.length * 8,
        a =  1732584193,
        b = -271733879,
        c = -1732584194,
        d =  271733878;

    // Swap endian
    for (var i = 0; i < m.length; i++) {
      m[i] = ((m[i] <<  8) | (m[i] >>> 24)) & 0x00FF00FF |
             ((m[i] << 24) | (m[i] >>>  8)) & 0xFF00FF00;
    }

    // Padding
    m[l >>> 5] |= 0x80 << (l % 32);
    m[(((l + 64) >>> 9) << 4) + 14] = l;

    // Method shortcuts
    var FF = md5._ff,
        GG = md5._gg,
        HH = md5._hh,
        II = md5._ii;

    for (var i = 0; i < m.length; i += 16) {

      var aa = a,
          bb = b,
          cc = c,
          dd = d;

      a = FF(a, b, c, d, m[i+ 0],  7, -680876936);
      d = FF(d, a, b, c, m[i+ 1], 12, -389564586);
      c = FF(c, d, a, b, m[i+ 2], 17,  606105819);
      b = FF(b, c, d, a, m[i+ 3], 22, -1044525330);
      a = FF(a, b, c, d, m[i+ 4],  7, -176418897);
      d = FF(d, a, b, c, m[i+ 5], 12,  1200080426);
      c = FF(c, d, a, b, m[i+ 6], 17, -1473231341);
      b = FF(b, c, d, a, m[i+ 7], 22, -45705983);
      a = FF(a, b, c, d, m[i+ 8],  7,  1770035416);
      d = FF(d, a, b, c, m[i+ 9], 12, -1958414417);
      c = FF(c, d, a, b, m[i+10], 17, -42063);
      b = FF(b, c, d, a, m[i+11], 22, -1990404162);
      a = FF(a, b, c, d, m[i+12],  7,  1804603682);
      d = FF(d, a, b, c, m[i+13], 12, -40341101);
      c = FF(c, d, a, b, m[i+14], 17, -1502002290);
      b = FF(b, c, d, a, m[i+15], 22,  1236535329);

      a = GG(a, b, c, d, m[i+ 1],  5, -165796510);
      d = GG(d, a, b, c, m[i+ 6],  9, -1069501632);
      c = GG(c, d, a, b, m[i+11], 14,  643717713);
      b = GG(b, c, d, a, m[i+ 0], 20, -373897302);
      a = GG(a, b, c, d, m[i+ 5],  5, -701558691);
      d = GG(d, a, b, c, m[i+10],  9,  38016083);
      c = GG(c, d, a, b, m[i+15], 14, -660478335);
      b = GG(b, c, d, a, m[i+ 4], 20, -405537848);
      a = GG(a, b, c, d, m[i+ 9],  5,  568446438);
      d = GG(d, a, b, c, m[i+14],  9, -1019803690);
      c = GG(c, d, a, b, m[i+ 3], 14, -187363961);
      b = GG(b, c, d, a, m[i+ 8], 20,  1163531501);
      a = GG(a, b, c, d, m[i+13],  5, -1444681467);
      d = GG(d, a, b, c, m[i+ 2],  9, -51403784);
      c = GG(c, d, a, b, m[i+ 7], 14,  1735328473);
      b = GG(b, c, d, a, m[i+12], 20, -1926607734);

      a = HH(a, b, c, d, m[i+ 5],  4, -378558);
      d = HH(d, a, b, c, m[i+ 8], 11, -2022574463);
      c = HH(c, d, a, b, m[i+11], 16,  1839030562);
      b = HH(b, c, d, a, m[i+14], 23, -35309556);
      a = HH(a, b, c, d, m[i+ 1],  4, -1530992060);
      d = HH(d, a, b, c, m[i+ 4], 11,  1272893353);
      c = HH(c, d, a, b, m[i+ 7], 16, -155497632);
      b = HH(b, c, d, a, m[i+10], 23, -1094730640);
      a = HH(a, b, c, d, m[i+13],  4,  681279174);
      d = HH(d, a, b, c, m[i+ 0], 11, -358537222);
      c = HH(c, d, a, b, m[i+ 3], 16, -722521979);
      b = HH(b, c, d, a, m[i+ 6], 23,  76029189);
      a = HH(a, b, c, d, m[i+ 9],  4, -640364487);
      d = HH(d, a, b, c, m[i+12], 11, -421815835);
      c = HH(c, d, a, b, m[i+15], 16,  530742520);
      b = HH(b, c, d, a, m[i+ 2], 23, -995338651);

      a = II(a, b, c, d, m[i+ 0],  6, -198630844);
      d = II(d, a, b, c, m[i+ 7], 10,  1126891415);
      c = II(c, d, a, b, m[i+14], 15, -1416354905);
      b = II(b, c, d, a, m[i+ 5], 21, -57434055);
      a = II(a, b, c, d, m[i+12],  6,  1700485571);
      d = II(d, a, b, c, m[i+ 3], 10, -1894986606);
      c = II(c, d, a, b, m[i+10], 15, -1051523);
      b = II(b, c, d, a, m[i+ 1], 21, -2054922799);
      a = II(a, b, c, d, m[i+ 8],  6,  1873313359);
      d = II(d, a, b, c, m[i+15], 10, -30611744);
      c = II(c, d, a, b, m[i+ 6], 15, -1560198380);
      b = II(b, c, d, a, m[i+13], 21,  1309151649);
      a = II(a, b, c, d, m[i+ 4],  6, -145523070);
      d = II(d, a, b, c, m[i+11], 10, -1120210379);
      c = II(c, d, a, b, m[i+ 2], 15,  718787259);
      b = II(b, c, d, a, m[i+ 9], 21, -343485551);

      a = (a + aa) >>> 0;
      b = (b + bb) >>> 0;
      c = (c + cc) >>> 0;
      d = (d + dd) >>> 0;
    }

    return crypt.endian([a, b, c, d]);
  };

  // Auxiliary functions
  md5._ff  = function (a, b, c, d, x, s, t) {
    var n = a + (b & c | ~b & d) + (x >>> 0) + t;
    return ((n << s) | (n >>> (32 - s))) + b;
  };
  md5._gg  = function (a, b, c, d, x, s, t) {
    var n = a + (b & d | c & ~d) + (x >>> 0) + t;
    return ((n << s) | (n >>> (32 - s))) + b;
  };
  md5._hh  = function (a, b, c, d, x, s, t) {
    var n = a + (b ^ c ^ d) + (x >>> 0) + t;
    return ((n << s) | (n >>> (32 - s))) + b;
  };
  md5._ii  = function (a, b, c, d, x, s, t) {
    var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;
    return ((n << s) | (n >>> (32 - s))) + b;
  };

  // Package private blocksize
  md5._blocksize = 16;
  md5._digestsize = 16;

  module.exports = function (message, options) {
    if (message === undefined || message === null)
      throw new Error('Illegal argument ' + message);

    var digestbytes = crypt.wordsToBytes(md5(message, options));
    return options && options.asBytes ? digestbytes :
        options && options.asString ? bin.bytesToString(digestbytes) :
        crypt.bytesToHex(digestbytes);
  };

})();

},{"charenc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/charenc/charenc.js","crypt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/crypt/crypt.js","is-buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/moment/moment.js":[function(require,module,exports){
//! moment.js
//! version : 2.29.3
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
//! license : MIT
//! momentjs.com

;(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(factory) :
    global.moment = factory()
}(this, (function () { 'use strict';

    var hookCallback;

    function hooks() {
        return hookCallback.apply(null, arguments);
    }

    // This is done to register the method called with moment()
    // without creating circular dependencies.
    function setHookCallback(callback) {
        hookCallback = callback;
    }

    function isArray(input) {
        return (
            input instanceof Array ||
            Object.prototype.toString.call(input) === '[object Array]'
        );
    }

    function isObject(input) {
        // IE8 will treat undefined and null as object if it wasn't for
        // input != null
        return (
            input != null &&
            Object.prototype.toString.call(input) === '[object Object]'
        );
    }

    function hasOwnProp(a, b) {
        return Object.prototype.hasOwnProperty.call(a, b);
    }

    function isObjectEmpty(obj) {
        if (Object.getOwnPropertyNames) {
            return Object.getOwnPropertyNames(obj).length === 0;
        } else {
            var k;
            for (k in obj) {
                if (hasOwnProp(obj, k)) {
                    return false;
                }
            }
            return true;
        }
    }

    function isUndefined(input) {
        return input === void 0;
    }

    function isNumber(input) {
        return (
            typeof input === 'number' ||
            Object.prototype.toString.call(input) === '[object Number]'
        );
    }

    function isDate(input) {
        return (
            input instanceof Date ||
            Object.prototype.toString.call(input) === '[object Date]'
        );
    }

    function map(arr, fn) {
        var res = [],
            i,
            arrLen = arr.length;
        for (i = 0; i < arrLen; ++i) {
            res.push(fn(arr[i], i));
        }
        return res;
    }

    function extend(a, b) {
        for (var i in b) {
            if (hasOwnProp(b, i)) {
                a[i] = b[i];
            }
        }

        if (hasOwnProp(b, 'toString')) {
            a.toString = b.toString;
        }

        if (hasOwnProp(b, 'valueOf')) {
            a.valueOf = b.valueOf;
        }

        return a;
    }

    function createUTC(input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, true).utc();
    }

    function defaultParsingFlags() {
        // We need to deep clone this object.
        return {
            empty: false,
            unusedTokens: [],
            unusedInput: [],
            overflow: -2,
            charsLeftOver: 0,
            nullInput: false,
            invalidEra: null,
            invalidMonth: null,
            invalidFormat: false,
            userInvalidated: false,
            iso: false,
            parsedDateParts: [],
            era: null,
            meridiem: null,
            rfc2822: false,
            weekdayMismatch: false,
        };
    }

    function getParsingFlags(m) {
        if (m._pf == null) {
            m._pf = defaultParsingFlags();
        }
        return m._pf;
    }

    var some;
    if (Array.prototype.some) {
        some = Array.prototype.some;
    } else {
        some = function (fun) {
            var t = Object(this),
                len = t.length >>> 0,
                i;

            for (i = 0; i < len; i++) {
                if (i in t && fun.call(this, t[i], i, t)) {
                    return true;
                }
            }

            return false;
        };
    }

    function isValid(m) {
        if (m._isValid == null) {
            var flags = getParsingFlags(m),
                parsedParts = some.call(flags.parsedDateParts, function (i) {
                    return i != null;
                }),
                isNowValid =
                    !isNaN(m._d.getTime()) &&
                    flags.overflow < 0 &&
                    !flags.empty &&
                    !flags.invalidEra &&
                    !flags.invalidMonth &&
                    !flags.invalidWeekday &&
                    !flags.weekdayMismatch &&
                    !flags.nullInput &&
                    !flags.invalidFormat &&
                    !flags.userInvalidated &&
                    (!flags.meridiem || (flags.meridiem && parsedParts));

            if (m._strict) {
                isNowValid =
                    isNowValid &&
                    flags.charsLeftOver === 0 &&
                    flags.unusedTokens.length === 0 &&
                    flags.bigHour === undefined;
            }

            if (Object.isFrozen == null || !Object.isFrozen(m)) {
                m._isValid = isNowValid;
            } else {
                return isNowValid;
            }
        }
        return m._isValid;
    }

    function createInvalid(flags) {
        var m = createUTC(NaN);
        if (flags != null) {
            extend(getParsingFlags(m), flags);
        } else {
            getParsingFlags(m).userInvalidated = true;
        }

        return m;
    }

    // Plugins that add properties should also add the key here (null value),
    // so we can properly clone ourselves.
    var momentProperties = (hooks.momentProperties = []),
        updateInProgress = false;

    function copyConfig(to, from) {
        var i,
            prop,
            val,
            momentPropertiesLen = momentProperties.length;

        if (!isUndefined(from._isAMomentObject)) {
            to._isAMomentObject = from._isAMomentObject;
        }
        if (!isUndefined(from._i)) {
            to._i = from._i;
        }
        if (!isUndefined(from._f)) {
            to._f = from._f;
        }
        if (!isUndefined(from._l)) {
            to._l = from._l;
        }
        if (!isUndefined(from._strict)) {
            to._strict = from._strict;
        }
        if (!isUndefined(from._tzm)) {
            to._tzm = from._tzm;
        }
        if (!isUndefined(from._isUTC)) {
            to._isUTC = from._isUTC;
        }
        if (!isUndefined(from._offset)) {
            to._offset = from._offset;
        }
        if (!isUndefined(from._pf)) {
            to._pf = getParsingFlags(from);
        }
        if (!isUndefined(from._locale)) {
            to._locale = from._locale;
        }

        if (momentPropertiesLen > 0) {
            for (i = 0; i < momentPropertiesLen; i++) {
                prop = momentProperties[i];
                val = from[prop];
                if (!isUndefined(val)) {
                    to[prop] = val;
                }
            }
        }

        return to;
    }

    // Moment prototype object
    function Moment(config) {
        copyConfig(this, config);
        this._d = new Date(config._d != null ? config._d.getTime() : NaN);
        if (!this.isValid()) {
            this._d = new Date(NaN);
        }
        // Prevent infinite loop in case updateOffset creates new moment
        // objects.
        if (updateInProgress === false) {
            updateInProgress = true;
            hooks.updateOffset(this);
            updateInProgress = false;
        }
    }

    function isMoment(obj) {
        return (
            obj instanceof Moment || (obj != null && obj._isAMomentObject != null)
        );
    }

    function warn(msg) {
        if (
            hooks.suppressDeprecationWarnings === false &&
            typeof console !== 'undefined' &&
            console.warn
        ) {
            console.warn('Deprecation warning: ' + msg);
        }
    }

    function deprecate(msg, fn) {
        var firstTime = true;

        return extend(function () {
            if (hooks.deprecationHandler != null) {
                hooks.deprecationHandler(null, msg);
            }
            if (firstTime) {
                var args = [],
                    arg,
                    i,
                    key,
                    argLen = arguments.length;
                for (i = 0; i < argLen; i++) {
                    arg = '';
                    if (typeof arguments[i] === 'object') {
                        arg += '\n[' + i + '] ';
                        for (key in arguments[0]) {
                            if (hasOwnProp(arguments[0], key)) {
                                arg += key + ': ' + arguments[0][key] + ', ';
                            }
                        }
                        arg = arg.slice(0, -2); // Remove trailing comma and space
                    } else {
                        arg = arguments[i];
                    }
                    args.push(arg);
                }
                warn(
                    msg +
                        '\nArguments: ' +
                        Array.prototype.slice.call(args).join('') +
                        '\n' +
                        new Error().stack
                );
                firstTime = false;
            }
            return fn.apply(this, arguments);
        }, fn);
    }

    var deprecations = {};

    function deprecateSimple(name, msg) {
        if (hooks.deprecationHandler != null) {
            hooks.deprecationHandler(name, msg);
        }
        if (!deprecations[name]) {
            warn(msg);
            deprecations[name] = true;
        }
    }

    hooks.suppressDeprecationWarnings = false;
    hooks.deprecationHandler = null;

    function isFunction(input) {
        return (
            (typeof Function !== 'undefined' && input instanceof Function) ||
            Object.prototype.toString.call(input) === '[object Function]'
        );
    }

    function set(config) {
        var prop, i;
        for (i in config) {
            if (hasOwnProp(config, i)) {
                prop = config[i];
                if (isFunction(prop)) {
                    this[i] = prop;
                } else {
                    this['_' + i] = prop;
                }
            }
        }
        this._config = config;
        // Lenient ordinal parsing accepts just a number in addition to
        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
        // TODO: Remove "ordinalParse" fallback in next major release.
        this._dayOfMonthOrdinalParseLenient = new RegExp(
            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
                '|' +
                /\d{1,2}/.source
        );
    }

    function mergeConfigs(parentConfig, childConfig) {
        var res = extend({}, parentConfig),
            prop;
        for (prop in childConfig) {
            if (hasOwnProp(childConfig, prop)) {
                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
                    res[prop] = {};
                    extend(res[prop], parentConfig[prop]);
                    extend(res[prop], childConfig[prop]);
                } else if (childConfig[prop] != null) {
                    res[prop] = childConfig[prop];
                } else {
                    delete res[prop];
                }
            }
        }
        for (prop in parentConfig) {
            if (
                hasOwnProp(parentConfig, prop) &&
                !hasOwnProp(childConfig, prop) &&
                isObject(parentConfig[prop])
            ) {
                // make sure changes to properties don't modify parent config
                res[prop] = extend({}, res[prop]);
            }
        }
        return res;
    }

    function Locale(config) {
        if (config != null) {
            this.set(config);
        }
    }

    var keys;

    if (Object.keys) {
        keys = Object.keys;
    } else {
        keys = function (obj) {
            var i,
                res = [];
            for (i in obj) {
                if (hasOwnProp(obj, i)) {
                    res.push(i);
                }
            }
            return res;
        };
    }

    var defaultCalendar = {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    };

    function calendar(key, mom, now) {
        var output = this._calendar[key] || this._calendar['sameElse'];
        return isFunction(output) ? output.call(mom, now) : output;
    }

    function zeroFill(number, targetLength, forceSign) {
        var absNumber = '' + Math.abs(number),
            zerosToFill = targetLength - absNumber.length,
            sign = number >= 0;
        return (
            (sign ? (forceSign ? '+' : '') : '-') +
            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +
            absNumber
        );
    }

    var formattingTokens =
            /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
        localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
        formatFunctions = {},
        formatTokenFunctions = {};

    // token:    'M'
    // padded:   ['MM', 2]
    // ordinal:  'Mo'
    // callback: function () { this.month() + 1 }
    function addFormatToken(token, padded, ordinal, callback) {
        var func = callback;
        if (typeof callback === 'string') {
            func = function () {
                return this[callback]();
            };
        }
        if (token) {
            formatTokenFunctions[token] = func;
        }
        if (padded) {
            formatTokenFunctions[padded[0]] = function () {
                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
            };
        }
        if (ordinal) {
            formatTokenFunctions[ordinal] = function () {
                return this.localeData().ordinal(
                    func.apply(this, arguments),
                    token
                );
            };
        }
    }

    function removeFormattingTokens(input) {
        if (input.match(/\[[\s\S]/)) {
            return input.replace(/^\[|\]$/g, '');
        }
        return input.replace(/\\/g, '');
    }

    function makeFormatFunction(format) {
        var array = format.match(formattingTokens),
            i,
            length;

        for (i = 0, length = array.length; i < length; i++) {
            if (formatTokenFunctions[array[i]]) {
                array[i] = formatTokenFunctions[array[i]];
            } else {
                array[i] = removeFormattingTokens(array[i]);
            }
        }

        return function (mom) {
            var output = '',
                i;
            for (i = 0; i < length; i++) {
                output += isFunction(array[i])
                    ? array[i].call(mom, format)
                    : array[i];
            }
            return output;
        };
    }

    // format date using native date object
    function formatMoment(m, format) {
        if (!m.isValid()) {
            return m.localeData().invalidDate();
        }

        format = expandFormat(format, m.localeData());
        formatFunctions[format] =
            formatFunctions[format] || makeFormatFunction(format);

        return formatFunctions[format](m);
    }

    function expandFormat(format, locale) {
        var i = 5;

        function replaceLongDateFormatTokens(input) {
            return locale.longDateFormat(input) || input;
        }

        localFormattingTokens.lastIndex = 0;
        while (i >= 0 && localFormattingTokens.test(format)) {
            format = format.replace(
                localFormattingTokens,
                replaceLongDateFormatTokens
            );
            localFormattingTokens.lastIndex = 0;
            i -= 1;
        }

        return format;
    }

    var defaultLongDateFormat = {
        LTS: 'h:mm:ss A',
        LT: 'h:mm A',
        L: 'MM/DD/YYYY',
        LL: 'MMMM D, YYYY',
        LLL: 'MMMM D, YYYY h:mm A',
        LLLL: 'dddd, MMMM D, YYYY h:mm A',
    };

    function longDateFormat(key) {
        var format = this._longDateFormat[key],
            formatUpper = this._longDateFormat[key.toUpperCase()];

        if (format || !formatUpper) {
            return format;
        }

        this._longDateFormat[key] = formatUpper
            .match(formattingTokens)
            .map(function (tok) {
                if (
                    tok === 'MMMM' ||
                    tok === 'MM' ||
                    tok === 'DD' ||
                    tok === 'dddd'
                ) {
                    return tok.slice(1);
                }
                return tok;
            })
            .join('');

        return this._longDateFormat[key];
    }

    var defaultInvalidDate = 'Invalid date';

    function invalidDate() {
        return this._invalidDate;
    }

    var defaultOrdinal = '%d',
        defaultDayOfMonthOrdinalParse = /\d{1,2}/;

    function ordinal(number) {
        return this._ordinal.replace('%d', number);
    }

    var defaultRelativeTime = {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        w: 'a week',
        ww: '%d weeks',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    };

    function relativeTime(number, withoutSuffix, string, isFuture) {
        var output = this._relativeTime[string];
        return isFunction(output)
            ? output(number, withoutSuffix, string, isFuture)
            : output.replace(/%d/i, number);
    }

    function pastFuture(diff, output) {
        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
        return isFunction(format) ? format(output) : format.replace(/%s/i, output);
    }

    var aliases = {};

    function addUnitAlias(unit, shorthand) {
        var lowerCase = unit.toLowerCase();
        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
    }

    function normalizeUnits(units) {
        return typeof units === 'string'
            ? aliases[units] || aliases[units.toLowerCase()]
            : undefined;
    }

    function normalizeObjectUnits(inputObject) {
        var normalizedInput = {},
            normalizedProp,
            prop;

        for (prop in inputObject) {
            if (hasOwnProp(inputObject, prop)) {
                normalizedProp = normalizeUnits(prop);
                if (normalizedProp) {
                    normalizedInput[normalizedProp] = inputObject[prop];
                }
            }
        }

        return normalizedInput;
    }

    var priorities = {};

    function addUnitPriority(unit, priority) {
        priorities[unit] = priority;
    }

    function getPrioritizedUnits(unitsObj) {
        var units = [],
            u;
        for (u in unitsObj) {
            if (hasOwnProp(unitsObj, u)) {
                units.push({ unit: u, priority: priorities[u] });
            }
        }
        units.sort(function (a, b) {
            return a.priority - b.priority;
        });
        return units;
    }

    function isLeapYear(year) {
        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
    }

    function absFloor(number) {
        if (number < 0) {
            // -0 -> 0
            return Math.ceil(number) || 0;
        } else {
            return Math.floor(number);
        }
    }

    function toInt(argumentForCoercion) {
        var coercedNumber = +argumentForCoercion,
            value = 0;

        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
            value = absFloor(coercedNumber);
        }

        return value;
    }

    function makeGetSet(unit, keepTime) {
        return function (value) {
            if (value != null) {
                set$1(this, unit, value);
                hooks.updateOffset(this, keepTime);
                return this;
            } else {
                return get(this, unit);
            }
        };
    }

    function get(mom, unit) {
        return mom.isValid()
            ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]()
            : NaN;
    }

    function set$1(mom, unit, value) {
        if (mom.isValid() && !isNaN(value)) {
            if (
                unit === 'FullYear' &&
                isLeapYear(mom.year()) &&
                mom.month() === 1 &&
                mom.date() === 29
            ) {
                value = toInt(value);
                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](
                    value,
                    mom.month(),
                    daysInMonth(value, mom.month())
                );
            } else {
                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
            }
        }
    }

    // MOMENTS

    function stringGet(units) {
        units = normalizeUnits(units);
        if (isFunction(this[units])) {
            return this[units]();
        }
        return this;
    }

    function stringSet(units, value) {
        if (typeof units === 'object') {
            units = normalizeObjectUnits(units);
            var prioritized = getPrioritizedUnits(units),
                i,
                prioritizedLen = prioritized.length;
            for (i = 0; i < prioritizedLen; i++) {
                this[prioritized[i].unit](units[prioritized[i].unit]);
            }
        } else {
            units = normalizeUnits(units);
            if (isFunction(this[units])) {
                return this[units](value);
            }
        }
        return this;
    }

    var match1 = /\d/, //       0 - 9
        match2 = /\d\d/, //      00 - 99
        match3 = /\d{3}/, //     000 - 999
        match4 = /\d{4}/, //    0000 - 9999
        match6 = /[+-]?\d{6}/, // -999999 - 999999
        match1to2 = /\d\d?/, //       0 - 99
        match3to4 = /\d\d\d\d?/, //     999 - 9999
        match5to6 = /\d\d\d\d\d\d?/, //   99999 - 999999
        match1to3 = /\d{1,3}/, //       0 - 999
        match1to4 = /\d{1,4}/, //       0 - 9999
        match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999
        matchUnsigned = /\d+/, //       0 - inf
        matchSigned = /[+-]?\d+/, //    -inf - inf
        matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
        matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z
        matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
        // any word (or two) characters or numbers including two/three word month in arabic.
        // includes scottish gaelic two word and hyphenated months
        matchWord =
            /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
        regexes;

    regexes = {};

    function addRegexToken(token, regex, strictRegex) {
        regexes[token] = isFunction(regex)
            ? regex
            : function (isStrict, localeData) {
                  return isStrict && strictRegex ? strictRegex : regex;
              };
    }

    function getParseRegexForToken(token, config) {
        if (!hasOwnProp(regexes, token)) {
            return new RegExp(unescapeFormat(token));
        }

        return regexes[token](config._strict, config._locale);
    }

    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
    function unescapeFormat(s) {
        return regexEscape(
            s
                .replace('\\', '')
                .replace(
                    /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,
                    function (matched, p1, p2, p3, p4) {
                        return p1 || p2 || p3 || p4;
                    }
                )
        );
    }

    function regexEscape(s) {
        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    }

    var tokens = {};

    function addParseToken(token, callback) {
        var i,
            func = callback,
            tokenLen;
        if (typeof token === 'string') {
            token = [token];
        }
        if (isNumber(callback)) {
            func = function (input, array) {
                array[callback] = toInt(input);
            };
        }
        tokenLen = token.length;
        for (i = 0; i < tokenLen; i++) {
            tokens[token[i]] = func;
        }
    }

    function addWeekParseToken(token, callback) {
        addParseToken(token, function (input, array, config, token) {
            config._w = config._w || {};
            callback(input, config._w, config, token);
        });
    }

    function addTimeToArrayFromToken(token, input, config) {
        if (input != null && hasOwnProp(tokens, token)) {
            tokens[token](input, config._a, config, token);
        }
    }

    var YEAR = 0,
        MONTH = 1,
        DATE = 2,
        HOUR = 3,
        MINUTE = 4,
        SECOND = 5,
        MILLISECOND = 6,
        WEEK = 7,
        WEEKDAY = 8;

    function mod(n, x) {
        return ((n % x) + x) % x;
    }

    var indexOf;

    if (Array.prototype.indexOf) {
        indexOf = Array.prototype.indexOf;
    } else {
        indexOf = function (o) {
            // I know
            var i;
            for (i = 0; i < this.length; ++i) {
                if (this[i] === o) {
                    return i;
                }
            }
            return -1;
        };
    }

    function daysInMonth(year, month) {
        if (isNaN(year) || isNaN(month)) {
            return NaN;
        }
        var modMonth = mod(month, 12);
        year += (month - modMonth) / 12;
        return modMonth === 1
            ? isLeapYear(year)
                ? 29
                : 28
            : 31 - ((modMonth % 7) % 2);
    }

    // FORMATTING

    addFormatToken('M', ['MM', 2], 'Mo', function () {
        return this.month() + 1;
    });

    addFormatToken('MMM', 0, 0, function (format) {
        return this.localeData().monthsShort(this, format);
    });

    addFormatToken('MMMM', 0, 0, function (format) {
        return this.localeData().months(this, format);
    });

    // ALIASES

    addUnitAlias('month', 'M');

    // PRIORITY

    addUnitPriority('month', 8);

    // PARSING

    addRegexToken('M', match1to2);
    addRegexToken('MM', match1to2, match2);
    addRegexToken('MMM', function (isStrict, locale) {
        return locale.monthsShortRegex(isStrict);
    });
    addRegexToken('MMMM', function (isStrict, locale) {
        return locale.monthsRegex(isStrict);
    });

    addParseToken(['M', 'MM'], function (input, array) {
        array[MONTH] = toInt(input) - 1;
    });

    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
        var month = config._locale.monthsParse(input, token, config._strict);
        // if we didn't find a month name, mark the date as invalid.
        if (month != null) {
            array[MONTH] = month;
        } else {
            getParsingFlags(config).invalidMonth = input;
        }
    });

    // LOCALES

    var defaultLocaleMonths =
            'January_February_March_April_May_June_July_August_September_October_November_December'.split(
                '_'
            ),
        defaultLocaleMonthsShort =
            'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
        defaultMonthsShortRegex = matchWord,
        defaultMonthsRegex = matchWord;

    function localeMonths(m, format) {
        if (!m) {
            return isArray(this._months)
                ? this._months
                : this._months['standalone'];
        }
        return isArray(this._months)
            ? this._months[m.month()]
            : this._months[
                  (this._months.isFormat || MONTHS_IN_FORMAT).test(format)
                      ? 'format'
                      : 'standalone'
              ][m.month()];
    }

    function localeMonthsShort(m, format) {
        if (!m) {
            return isArray(this._monthsShort)
                ? this._monthsShort
                : this._monthsShort['standalone'];
        }
        return isArray(this._monthsShort)
            ? this._monthsShort[m.month()]
            : this._monthsShort[
                  MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'
              ][m.month()];
    }

    function handleStrictParse(monthName, format, strict) {
        var i,
            ii,
            mom,
            llc = monthName.toLocaleLowerCase();
        if (!this._monthsParse) {
            // this is not used
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
            for (i = 0; i < 12; ++i) {
                mom = createUTC([2000, i]);
                this._shortMonthsParse[i] = this.monthsShort(
                    mom,
                    ''
                ).toLocaleLowerCase();
                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeMonthsParse(monthName, format, strict) {
        var i, mom, regex;

        if (this._monthsParseExact) {
            return handleStrictParse.call(this, monthName, format, strict);
        }

        if (!this._monthsParse) {
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
        }

        // TODO: add sorting
        // Sorting makes sure if one month (or abbr) is a prefix of another
        // see sorting in computeMonthsParse
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, i]);
            if (strict && !this._longMonthsParse[i]) {
                this._longMonthsParse[i] = new RegExp(
                    '^' + this.months(mom, '').replace('.', '') + '$',
                    'i'
                );
                this._shortMonthsParse[i] = new RegExp(
                    '^' + this.monthsShort(mom, '').replace('.', '') + '$',
                    'i'
                );
            }
            if (!strict && !this._monthsParse[i]) {
                regex =
                    '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (
                strict &&
                format === 'MMMM' &&
                this._longMonthsParse[i].test(monthName)
            ) {
                return i;
            } else if (
                strict &&
                format === 'MMM' &&
                this._shortMonthsParse[i].test(monthName)
            ) {
                return i;
            } else if (!strict && this._monthsParse[i].test(monthName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function setMonth(mom, value) {
        var dayOfMonth;

        if (!mom.isValid()) {
            // No op
            return mom;
        }

        if (typeof value === 'string') {
            if (/^\d+$/.test(value)) {
                value = toInt(value);
            } else {
                value = mom.localeData().monthsParse(value);
                // TODO: Another silent failure?
                if (!isNumber(value)) {
                    return mom;
                }
            }
        }

        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
        return mom;
    }

    function getSetMonth(value) {
        if (value != null) {
            setMonth(this, value);
            hooks.updateOffset(this, true);
            return this;
        } else {
            return get(this, 'Month');
        }
    }

    function getDaysInMonth() {
        return daysInMonth(this.year(), this.month());
    }

    function monthsShortRegex(isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsShortStrictRegex;
            } else {
                return this._monthsShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsShortRegex')) {
                this._monthsShortRegex = defaultMonthsShortRegex;
            }
            return this._monthsShortStrictRegex && isStrict
                ? this._monthsShortStrictRegex
                : this._monthsShortRegex;
        }
    }

    function monthsRegex(isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsStrictRegex;
            } else {
                return this._monthsRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsRegex')) {
                this._monthsRegex = defaultMonthsRegex;
            }
            return this._monthsStrictRegex && isStrict
                ? this._monthsStrictRegex
                : this._monthsRegex;
        }
    }

    function computeMonthsParse() {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var shortPieces = [],
            longPieces = [],
            mixedPieces = [],
            i,
            mom;
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, i]);
            shortPieces.push(this.monthsShort(mom, ''));
            longPieces.push(this.months(mom, ''));
            mixedPieces.push(this.months(mom, ''));
            mixedPieces.push(this.monthsShort(mom, ''));
        }
        // Sorting makes sure if one month (or abbr) is a prefix of another it
        // will match the longer piece.
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);
        for (i = 0; i < 12; i++) {
            shortPieces[i] = regexEscape(shortPieces[i]);
            longPieces[i] = regexEscape(longPieces[i]);
        }
        for (i = 0; i < 24; i++) {
            mixedPieces[i] = regexEscape(mixedPieces[i]);
        }

        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._monthsShortRegex = this._monthsRegex;
        this._monthsStrictRegex = new RegExp(
            '^(' + longPieces.join('|') + ')',
            'i'
        );
        this._monthsShortStrictRegex = new RegExp(
            '^(' + shortPieces.join('|') + ')',
            'i'
        );
    }

    // FORMATTING

    addFormatToken('Y', 0, 0, function () {
        var y = this.year();
        return y <= 9999 ? zeroFill(y, 4) : '+' + y;
    });

    addFormatToken(0, ['YY', 2], 0, function () {
        return this.year() % 100;
    });

    addFormatToken(0, ['YYYY', 4], 0, 'year');
    addFormatToken(0, ['YYYYY', 5], 0, 'year');
    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');

    // ALIASES

    addUnitAlias('year', 'y');

    // PRIORITIES

    addUnitPriority('year', 1);

    // PARSING

    addRegexToken('Y', matchSigned);
    addRegexToken('YY', match1to2, match2);
    addRegexToken('YYYY', match1to4, match4);
    addRegexToken('YYYYY', match1to6, match6);
    addRegexToken('YYYYYY', match1to6, match6);

    addParseToken(['YYYYY', 'YYYYYY'], YEAR);
    addParseToken('YYYY', function (input, array) {
        array[YEAR] =
            input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
    });
    addParseToken('YY', function (input, array) {
        array[YEAR] = hooks.parseTwoDigitYear(input);
    });
    addParseToken('Y', function (input, array) {
        array[YEAR] = parseInt(input, 10);
    });

    // HELPERS

    function daysInYear(year) {
        return isLeapYear(year) ? 366 : 365;
    }

    // HOOKS

    hooks.parseTwoDigitYear = function (input) {
        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
    };

    // MOMENTS

    var getSetYear = makeGetSet('FullYear', true);

    function getIsLeapYear() {
        return isLeapYear(this.year());
    }

    function createDate(y, m, d, h, M, s, ms) {
        // can't just apply() to create a date:
        // https://stackoverflow.com/q/181348
        var date;
        // the date constructor remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            // preserve leap years using a full 400 year cycle, then reset
            date = new Date(y + 400, m, d, h, M, s, ms);
            if (isFinite(date.getFullYear())) {
                date.setFullYear(y);
            }
        } else {
            date = new Date(y, m, d, h, M, s, ms);
        }

        return date;
    }

    function createUTCDate(y) {
        var date, args;
        // the Date.UTC function remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            args = Array.prototype.slice.call(arguments);
            // preserve leap years using a full 400 year cycle, then reset
            args[0] = y + 400;
            date = new Date(Date.UTC.apply(null, args));
            if (isFinite(date.getUTCFullYear())) {
                date.setUTCFullYear(y);
            }
        } else {
            date = new Date(Date.UTC.apply(null, arguments));
        }

        return date;
    }

    // start-of-first-week - start-of-year
    function firstWeekOffset(year, dow, doy) {
        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
            fwd = 7 + dow - doy,
            // first-week day local weekday -- which local weekday is fwd
            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;

        return -fwdlw + fwd - 1;
    }

    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
        var localWeekday = (7 + weekday - dow) % 7,
            weekOffset = firstWeekOffset(year, dow, doy),
            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
            resYear,
            resDayOfYear;

        if (dayOfYear <= 0) {
            resYear = year - 1;
            resDayOfYear = daysInYear(resYear) + dayOfYear;
        } else if (dayOfYear > daysInYear(year)) {
            resYear = year + 1;
            resDayOfYear = dayOfYear - daysInYear(year);
        } else {
            resYear = year;
            resDayOfYear = dayOfYear;
        }

        return {
            year: resYear,
            dayOfYear: resDayOfYear,
        };
    }

    function weekOfYear(mom, dow, doy) {
        var weekOffset = firstWeekOffset(mom.year(), dow, doy),
            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
            resWeek,
            resYear;

        if (week < 1) {
            resYear = mom.year() - 1;
            resWeek = week + weeksInYear(resYear, dow, doy);
        } else if (week > weeksInYear(mom.year(), dow, doy)) {
            resWeek = week - weeksInYear(mom.year(), dow, doy);
            resYear = mom.year() + 1;
        } else {
            resYear = mom.year();
            resWeek = week;
        }

        return {
            week: resWeek,
            year: resYear,
        };
    }

    function weeksInYear(year, dow, doy) {
        var weekOffset = firstWeekOffset(year, dow, doy),
            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
    }

    // FORMATTING

    addFormatToken('w', ['ww', 2], 'wo', 'week');
    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');

    // ALIASES

    addUnitAlias('week', 'w');
    addUnitAlias('isoWeek', 'W');

    // PRIORITIES

    addUnitPriority('week', 5);
    addUnitPriority('isoWeek', 5);

    // PARSING

    addRegexToken('w', match1to2);
    addRegexToken('ww', match1to2, match2);
    addRegexToken('W', match1to2);
    addRegexToken('WW', match1to2, match2);

    addWeekParseToken(
        ['w', 'ww', 'W', 'WW'],
        function (input, week, config, token) {
            week[token.substr(0, 1)] = toInt(input);
        }
    );

    // HELPERS

    // LOCALES

    function localeWeek(mom) {
        return weekOfYear(mom, this._week.dow, this._week.doy).week;
    }

    var defaultLocaleWeek = {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    };

    function localeFirstDayOfWeek() {
        return this._week.dow;
    }

    function localeFirstDayOfYear() {
        return this._week.doy;
    }

    // MOMENTS

    function getSetWeek(input) {
        var week = this.localeData().week(this);
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    function getSetISOWeek(input) {
        var week = weekOfYear(this, 1, 4).week;
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    // FORMATTING

    addFormatToken('d', 0, 'do', 'day');

    addFormatToken('dd', 0, 0, function (format) {
        return this.localeData().weekdaysMin(this, format);
    });

    addFormatToken('ddd', 0, 0, function (format) {
        return this.localeData().weekdaysShort(this, format);
    });

    addFormatToken('dddd', 0, 0, function (format) {
        return this.localeData().weekdays(this, format);
    });

    addFormatToken('e', 0, 0, 'weekday');
    addFormatToken('E', 0, 0, 'isoWeekday');

    // ALIASES

    addUnitAlias('day', 'd');
    addUnitAlias('weekday', 'e');
    addUnitAlias('isoWeekday', 'E');

    // PRIORITY
    addUnitPriority('day', 11);
    addUnitPriority('weekday', 11);
    addUnitPriority('isoWeekday', 11);

    // PARSING

    addRegexToken('d', match1to2);
    addRegexToken('e', match1to2);
    addRegexToken('E', match1to2);
    addRegexToken('dd', function (isStrict, locale) {
        return locale.weekdaysMinRegex(isStrict);
    });
    addRegexToken('ddd', function (isStrict, locale) {
        return locale.weekdaysShortRegex(isStrict);
    });
    addRegexToken('dddd', function (isStrict, locale) {
        return locale.weekdaysRegex(isStrict);
    });

    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
        var weekday = config._locale.weekdaysParse(input, token, config._strict);
        // if we didn't get a weekday name, mark the date as invalid
        if (weekday != null) {
            week.d = weekday;
        } else {
            getParsingFlags(config).invalidWeekday = input;
        }
    });

    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
        week[token] = toInt(input);
    });

    // HELPERS

    function parseWeekday(input, locale) {
        if (typeof input !== 'string') {
            return input;
        }

        if (!isNaN(input)) {
            return parseInt(input, 10);
        }

        input = locale.weekdaysParse(input);
        if (typeof input === 'number') {
            return input;
        }

        return null;
    }

    function parseIsoWeekday(input, locale) {
        if (typeof input === 'string') {
            return locale.weekdaysParse(input) % 7 || 7;
        }
        return isNaN(input) ? null : input;
    }

    // LOCALES
    function shiftWeekdays(ws, n) {
        return ws.slice(n, 7).concat(ws.slice(0, n));
    }

    var defaultLocaleWeekdays =
            'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
        defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        defaultWeekdaysRegex = matchWord,
        defaultWeekdaysShortRegex = matchWord,
        defaultWeekdaysMinRegex = matchWord;

    function localeWeekdays(m, format) {
        var weekdays = isArray(this._weekdays)
            ? this._weekdays
            : this._weekdays[
                  m && m !== true && this._weekdays.isFormat.test(format)
                      ? 'format'
                      : 'standalone'
              ];
        return m === true
            ? shiftWeekdays(weekdays, this._week.dow)
            : m
            ? weekdays[m.day()]
            : weekdays;
    }

    function localeWeekdaysShort(m) {
        return m === true
            ? shiftWeekdays(this._weekdaysShort, this._week.dow)
            : m
            ? this._weekdaysShort[m.day()]
            : this._weekdaysShort;
    }

    function localeWeekdaysMin(m) {
        return m === true
            ? shiftWeekdays(this._weekdaysMin, this._week.dow)
            : m
            ? this._weekdaysMin[m.day()]
            : this._weekdaysMin;
    }

    function handleStrictParse$1(weekdayName, format, strict) {
        var i,
            ii,
            mom,
            llc = weekdayName.toLocaleLowerCase();
        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._minWeekdaysParse = [];

            for (i = 0; i < 7; ++i) {
                mom = createUTC([2000, 1]).day(i);
                this._minWeekdaysParse[i] = this.weekdaysMin(
                    mom,
                    ''
                ).toLocaleLowerCase();
                this._shortWeekdaysParse[i] = this.weekdaysShort(
                    mom,
                    ''
                ).toLocaleLowerCase();
                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeWeekdaysParse(weekdayName, format, strict) {
        var i, mom, regex;

        if (this._weekdaysParseExact) {
            return handleStrictParse$1.call(this, weekdayName, format, strict);
        }

        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._minWeekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._fullWeekdaysParse = [];
        }

        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already

            mom = createUTC([2000, 1]).day(i);
            if (strict && !this._fullWeekdaysParse[i]) {
                this._fullWeekdaysParse[i] = new RegExp(
                    '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$',
                    'i'
                );
                this._shortWeekdaysParse[i] = new RegExp(
                    '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$',
                    'i'
                );
                this._minWeekdaysParse[i] = new RegExp(
                    '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$',
                    'i'
                );
            }
            if (!this._weekdaysParse[i]) {
                regex =
                    '^' +
                    this.weekdays(mom, '') +
                    '|^' +
                    this.weekdaysShort(mom, '') +
                    '|^' +
                    this.weekdaysMin(mom, '');
                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (
                strict &&
                format === 'dddd' &&
                this._fullWeekdaysParse[i].test(weekdayName)
            ) {
                return i;
            } else if (
                strict &&
                format === 'ddd' &&
                this._shortWeekdaysParse[i].test(weekdayName)
            ) {
                return i;
            } else if (
                strict &&
                format === 'dd' &&
                this._minWeekdaysParse[i].test(weekdayName)
            ) {
                return i;
            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function getSetDayOfWeek(input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
        if (input != null) {
            input = parseWeekday(input, this.localeData());
            return this.add(input - day, 'd');
        } else {
            return day;
        }
    }

    function getSetLocaleDayOfWeek(input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
        return input == null ? weekday : this.add(input - weekday, 'd');
    }

    function getSetISODayOfWeek(input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }

        // behaves the same as moment#day except
        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
        // as a setter, sunday should belong to the previous week.

        if (input != null) {
            var weekday = parseIsoWeekday(input, this.localeData());
            return this.day(this.day() % 7 ? weekday : weekday - 7);
        } else {
            return this.day() || 7;
        }
    }

    function weekdaysRegex(isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysStrictRegex;
            } else {
                return this._weekdaysRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                this._weekdaysRegex = defaultWeekdaysRegex;
            }
            return this._weekdaysStrictRegex && isStrict
                ? this._weekdaysStrictRegex
                : this._weekdaysRegex;
        }
    }

    function weekdaysShortRegex(isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysShortStrictRegex;
            } else {
                return this._weekdaysShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysShortRegex')) {
                this._weekdaysShortRegex = defaultWeekdaysShortRegex;
            }
            return this._weekdaysShortStrictRegex && isStrict
                ? this._weekdaysShortStrictRegex
                : this._weekdaysShortRegex;
        }
    }

    function weekdaysMinRegex(isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysMinStrictRegex;
            } else {
                return this._weekdaysMinRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysMinRegex')) {
                this._weekdaysMinRegex = defaultWeekdaysMinRegex;
            }
            return this._weekdaysMinStrictRegex && isStrict
                ? this._weekdaysMinStrictRegex
                : this._weekdaysMinRegex;
        }
    }

    function computeWeekdaysParse() {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var minPieces = [],
            shortPieces = [],
            longPieces = [],
            mixedPieces = [],
            i,
            mom,
            minp,
            shortp,
            longp;
        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, 1]).day(i);
            minp = regexEscape(this.weekdaysMin(mom, ''));
            shortp = regexEscape(this.weekdaysShort(mom, ''));
            longp = regexEscape(this.weekdays(mom, ''));
            minPieces.push(minp);
            shortPieces.push(shortp);
            longPieces.push(longp);
            mixedPieces.push(minp);
            mixedPieces.push(shortp);
            mixedPieces.push(longp);
        }
        // Sorting makes sure if one weekday (or abbr) is a prefix of another it
        // will match the longer piece.
        minPieces.sort(cmpLenRev);
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);

        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._weekdaysShortRegex = this._weekdaysRegex;
        this._weekdaysMinRegex = this._weekdaysRegex;

        this._weekdaysStrictRegex = new RegExp(
            '^(' + longPieces.join('|') + ')',
            'i'
        );
        this._weekdaysShortStrictRegex = new RegExp(
            '^(' + shortPieces.join('|') + ')',
            'i'
        );
        this._weekdaysMinStrictRegex = new RegExp(
            '^(' + minPieces.join('|') + ')',
            'i'
        );
    }

    // FORMATTING

    function hFormat() {
        return this.hours() % 12 || 12;
    }

    function kFormat() {
        return this.hours() || 24;
    }

    addFormatToken('H', ['HH', 2], 0, 'hour');
    addFormatToken('h', ['hh', 2], 0, hFormat);
    addFormatToken('k', ['kk', 2], 0, kFormat);

    addFormatToken('hmm', 0, 0, function () {
        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
    });

    addFormatToken('hmmss', 0, 0, function () {
        return (
            '' +
            hFormat.apply(this) +
            zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2)
        );
    });

    addFormatToken('Hmm', 0, 0, function () {
        return '' + this.hours() + zeroFill(this.minutes(), 2);
    });

    addFormatToken('Hmmss', 0, 0, function () {
        return (
            '' +
            this.hours() +
            zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2)
        );
    });

    function meridiem(token, lowercase) {
        addFormatToken(token, 0, 0, function () {
            return this.localeData().meridiem(
                this.hours(),
                this.minutes(),
                lowercase
            );
        });
    }

    meridiem('a', true);
    meridiem('A', false);

    // ALIASES

    addUnitAlias('hour', 'h');

    // PRIORITY
    addUnitPriority('hour', 13);

    // PARSING

    function matchMeridiem(isStrict, locale) {
        return locale._meridiemParse;
    }

    addRegexToken('a', matchMeridiem);
    addRegexToken('A', matchMeridiem);
    addRegexToken('H', match1to2);
    addRegexToken('h', match1to2);
    addRegexToken('k', match1to2);
    addRegexToken('HH', match1to2, match2);
    addRegexToken('hh', match1to2, match2);
    addRegexToken('kk', match1to2, match2);

    addRegexToken('hmm', match3to4);
    addRegexToken('hmmss', match5to6);
    addRegexToken('Hmm', match3to4);
    addRegexToken('Hmmss', match5to6);

    addParseToken(['H', 'HH'], HOUR);
    addParseToken(['k', 'kk'], function (input, array, config) {
        var kInput = toInt(input);
        array[HOUR] = kInput === 24 ? 0 : kInput;
    });
    addParseToken(['a', 'A'], function (input, array, config) {
        config._isPm = config._locale.isPM(input);
        config._meridiem = input;
    });
    addParseToken(['h', 'hh'], function (input, array, config) {
        array[HOUR] = toInt(input);
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmmss', function (input, array, config) {
        var pos1 = input.length - 4,
            pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('Hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
    });
    addParseToken('Hmmss', function (input, array, config) {
        var pos1 = input.length - 4,
            pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
    });

    // LOCALES

    function localeIsPM(input) {
        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
        // Using charAt should be more compatible.
        return (input + '').toLowerCase().charAt(0) === 'p';
    }

    var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i,
        // Setting the hour should keep the time, because the user explicitly
        // specified which hour they want. So trying to maintain the same hour (in
        // a new timezone) makes sense. Adding/subtracting hours does not follow
        // this rule.
        getSetHour = makeGetSet('Hours', true);

    function localeMeridiem(hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'pm' : 'PM';
        } else {
            return isLower ? 'am' : 'AM';
        }
    }

    var baseConfig = {
        calendar: defaultCalendar,
        longDateFormat: defaultLongDateFormat,
        invalidDate: defaultInvalidDate,
        ordinal: defaultOrdinal,
        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
        relativeTime: defaultRelativeTime,

        months: defaultLocaleMonths,
        monthsShort: defaultLocaleMonthsShort,

        week: defaultLocaleWeek,

        weekdays: defaultLocaleWeekdays,
        weekdaysMin: defaultLocaleWeekdaysMin,
        weekdaysShort: defaultLocaleWeekdaysShort,

        meridiemParse: defaultLocaleMeridiemParse,
    };

    // internal storage for locale config files
    var locales = {},
        localeFamilies = {},
        globalLocale;

    function commonPrefix(arr1, arr2) {
        var i,
            minl = Math.min(arr1.length, arr2.length);
        for (i = 0; i < minl; i += 1) {
            if (arr1[i] !== arr2[i]) {
                return i;
            }
        }
        return minl;
    }

    function normalizeLocale(key) {
        return key ? key.toLowerCase().replace('_', '-') : key;
    }

    // pick the locale from the array
    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
    function chooseLocale(names) {
        var i = 0,
            j,
            next,
            locale,
            split;

        while (i < names.length) {
            split = normalizeLocale(names[i]).split('-');
            j = split.length;
            next = normalizeLocale(names[i + 1]);
            next = next ? next.split('-') : null;
            while (j > 0) {
                locale = loadLocale(split.slice(0, j).join('-'));
                if (locale) {
                    return locale;
                }
                if (
                    next &&
                    next.length >= j &&
                    commonPrefix(split, next) >= j - 1
                ) {
                    //the next array item is better than a shallower substring of this one
                    break;
                }
                j--;
            }
            i++;
        }
        return globalLocale;
    }

    function isLocaleNameSane(name) {
        // Prevent names that look like filesystem paths, i.e contain '/' or '\'
        return name.match('^[^/\\\\]*$') != null;
    }

    function loadLocale(name) {
        var oldLocale = null,
            aliasedRequire;
        // TODO: Find a better way to register and load all the locales in Node
        if (
            locales[name] === undefined &&
            typeof module !== 'undefined' &&
            module &&
            module.exports &&
            isLocaleNameSane(name)
        ) {
            try {
                oldLocale = globalLocale._abbr;
                aliasedRequire = require;
                aliasedRequire('./locale/' + name);
                getSetGlobalLocale(oldLocale);
            } catch (e) {
                // mark as not found to avoid repeating expensive file require call causing high CPU
                // when trying to find en-US, en_US, en-us for every format call
                locales[name] = null; // null means not found
            }
        }
        return locales[name];
    }

    // This function will load locale and then set the global locale.  If
    // no arguments are passed in, it will simply return the current global
    // locale key.
    function getSetGlobalLocale(key, values) {
        var data;
        if (key) {
            if (isUndefined(values)) {
                data = getLocale(key);
            } else {
                data = defineLocale(key, values);
            }

            if (data) {
                // moment.duration._locale = moment._locale = data;
                globalLocale = data;
            } else {
                if (typeof console !== 'undefined' && console.warn) {
                    //warn user if arguments are passed but the locale could not be set
                    console.warn(
                        'Locale ' + key + ' not found. Did you forget to load it?'
                    );
                }
            }
        }

        return globalLocale._abbr;
    }

    function defineLocale(name, config) {
        if (config !== null) {
            var locale,
                parentConfig = baseConfig;
            config.abbr = name;
            if (locales[name] != null) {
                deprecateSimple(
                    'defineLocaleOverride',
                    'use moment.updateLocale(localeName, config) to change ' +
                        'an existing locale. moment.defineLocale(localeName, ' +
                        'config) should only be used for creating a new locale ' +
                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'
                );
                parentConfig = locales[name]._config;
            } else if (config.parentLocale != null) {
                if (locales[config.parentLocale] != null) {
                    parentConfig = locales[config.parentLocale]._config;
                } else {
                    locale = loadLocale(config.parentLocale);
                    if (locale != null) {
                        parentConfig = locale._config;
                    } else {
                        if (!localeFamilies[config.parentLocale]) {
                            localeFamilies[config.parentLocale] = [];
                        }
                        localeFamilies[config.parentLocale].push({
                            name: name,
                            config: config,
                        });
                        return null;
                    }
                }
            }
            locales[name] = new Locale(mergeConfigs(parentConfig, config));

            if (localeFamilies[name]) {
                localeFamilies[name].forEach(function (x) {
                    defineLocale(x.name, x.config);
                });
            }

            // backwards compat for now: also set the locale
            // make sure we set the locale AFTER all child locales have been
            // created, so we won't end up with the child locale set.
            getSetGlobalLocale(name);

            return locales[name];
        } else {
            // useful for testing
            delete locales[name];
            return null;
        }
    }

    function updateLocale(name, config) {
        if (config != null) {
            var locale,
                tmpLocale,
                parentConfig = baseConfig;

            if (locales[name] != null && locales[name].parentLocale != null) {
                // Update existing child locale in-place to avoid memory-leaks
                locales[name].set(mergeConfigs(locales[name]._config, config));
            } else {
                // MERGE
                tmpLocale = loadLocale(name);
                if (tmpLocale != null) {
                    parentConfig = tmpLocale._config;
                }
                config = mergeConfigs(parentConfig, config);
                if (tmpLocale == null) {
                    // updateLocale is called for creating a new locale
                    // Set abbr so it will have a name (getters return
                    // undefined otherwise).
                    config.abbr = name;
                }
                locale = new Locale(config);
                locale.parentLocale = locales[name];
                locales[name] = locale;
            }

            // backwards compat for now: also set the locale
            getSetGlobalLocale(name);
        } else {
            // pass null for config to unupdate, useful for tests
            if (locales[name] != null) {
                if (locales[name].parentLocale != null) {
                    locales[name] = locales[name].parentLocale;
                    if (name === getSetGlobalLocale()) {
                        getSetGlobalLocale(name);
                    }
                } else if (locales[name] != null) {
                    delete locales[name];
                }
            }
        }
        return locales[name];
    }

    // returns locale data
    function getLocale(key) {
        var locale;

        if (key && key._locale && key._locale._abbr) {
            key = key._locale._abbr;
        }

        if (!key) {
            return globalLocale;
        }

        if (!isArray(key)) {
            //short-circuit everything else
            locale = loadLocale(key);
            if (locale) {
                return locale;
            }
            key = [key];
        }

        return chooseLocale(key);
    }

    function listLocales() {
        return keys(locales);
    }

    function checkOverflow(m) {
        var overflow,
            a = m._a;

        if (a && getParsingFlags(m).overflow === -2) {
            overflow =
                a[MONTH] < 0 || a[MONTH] > 11
                    ? MONTH
                    : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])
                    ? DATE
                    : a[HOUR] < 0 ||
                      a[HOUR] > 24 ||
                      (a[HOUR] === 24 &&
                          (a[MINUTE] !== 0 ||
                              a[SECOND] !== 0 ||
                              a[MILLISECOND] !== 0))
                    ? HOUR
                    : a[MINUTE] < 0 || a[MINUTE] > 59
                    ? MINUTE
                    : a[SECOND] < 0 || a[SECOND] > 59
                    ? SECOND
                    : a[MILLISECOND] < 0 || a[MILLISECOND] > 999
                    ? MILLISECOND
                    : -1;

            if (
                getParsingFlags(m)._overflowDayOfYear &&
                (overflow < YEAR || overflow > DATE)
            ) {
                overflow = DATE;
            }
            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
                overflow = WEEK;
            }
            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
                overflow = WEEKDAY;
            }

            getParsingFlags(m).overflow = overflow;
        }

        return m;
    }

    // iso 8601 regex
    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
    var extendedIsoRegex =
            /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
        basicIsoRegex =
            /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
        tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
        isoDates = [
            ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
            ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
            ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
            ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
            ['YYYY-DDD', /\d{4}-\d{3}/],
            ['YYYY-MM', /\d{4}-\d\d/, false],
            ['YYYYYYMMDD', /[+-]\d{10}/],
            ['YYYYMMDD', /\d{8}/],
            ['GGGG[W]WWE', /\d{4}W\d{3}/],
            ['GGGG[W]WW', /\d{4}W\d{2}/, false],
            ['YYYYDDD', /\d{7}/],
            ['YYYYMM', /\d{6}/, false],
            ['YYYY', /\d{4}/, false],
        ],
        // iso time formats and regexes
        isoTimes = [
            ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
            ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
            ['HH:mm:ss', /\d\d:\d\d:\d\d/],
            ['HH:mm', /\d\d:\d\d/],
            ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
            ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
            ['HHmmss', /\d\d\d\d\d\d/],
            ['HHmm', /\d\d\d\d/],
            ['HH', /\d\d/],
        ],
        aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
        // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
        rfc2822 =
            /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
        obsOffsets = {
            UT: 0,
            GMT: 0,
            EDT: -4 * 60,
            EST: -5 * 60,
            CDT: -5 * 60,
            CST: -6 * 60,
            MDT: -6 * 60,
            MST: -7 * 60,
            PDT: -7 * 60,
            PST: -8 * 60,
        };

    // date from iso format
    function configFromISO(config) {
        var i,
            l,
            string = config._i,
            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
            allowTime,
            dateFormat,
            timeFormat,
            tzFormat,
            isoDatesLen = isoDates.length,
            isoTimesLen = isoTimes.length;

        if (match) {
            getParsingFlags(config).iso = true;
            for (i = 0, l = isoDatesLen; i < l; i++) {
                if (isoDates[i][1].exec(match[1])) {
                    dateFormat = isoDates[i][0];
                    allowTime = isoDates[i][2] !== false;
                    break;
                }
            }
            if (dateFormat == null) {
                config._isValid = false;
                return;
            }
            if (match[3]) {
                for (i = 0, l = isoTimesLen; i < l; i++) {
                    if (isoTimes[i][1].exec(match[3])) {
                        // match[2] should be 'T' or space
                        timeFormat = (match[2] || ' ') + isoTimes[i][0];
                        break;
                    }
                }
                if (timeFormat == null) {
                    config._isValid = false;
                    return;
                }
            }
            if (!allowTime && timeFormat != null) {
                config._isValid = false;
                return;
            }
            if (match[4]) {
                if (tzRegex.exec(match[4])) {
                    tzFormat = 'Z';
                } else {
                    config._isValid = false;
                    return;
                }
            }
            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
            configFromStringAndFormat(config);
        } else {
            config._isValid = false;
        }
    }

    function extractFromRFC2822Strings(
        yearStr,
        monthStr,
        dayStr,
        hourStr,
        minuteStr,
        secondStr
    ) {
        var result = [
            untruncateYear(yearStr),
            defaultLocaleMonthsShort.indexOf(monthStr),
            parseInt(dayStr, 10),
            parseInt(hourStr, 10),
            parseInt(minuteStr, 10),
        ];

        if (secondStr) {
            result.push(parseInt(secondStr, 10));
        }

        return result;
    }

    function untruncateYear(yearStr) {
        var year = parseInt(yearStr, 10);
        if (year <= 49) {
            return 2000 + year;
        } else if (year <= 999) {
            return 1900 + year;
        }
        return year;
    }

    function preprocessRFC2822(s) {
        // Remove comments and folding whitespace and replace multiple-spaces with a single space
        return s
            .replace(/\([^)]*\)|[\n\t]/g, ' ')
            .replace(/(\s\s+)/g, ' ')
            .replace(/^\s\s*/, '')
            .replace(/\s\s*$/, '');
    }

    function checkWeekday(weekdayStr, parsedInput, config) {
        if (weekdayStr) {
            // TODO: Replace the vanilla JS Date object with an independent day-of-week check.
            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
                weekdayActual = new Date(
                    parsedInput[0],
                    parsedInput[1],
                    parsedInput[2]
                ).getDay();
            if (weekdayProvided !== weekdayActual) {
                getParsingFlags(config).weekdayMismatch = true;
                config._isValid = false;
                return false;
            }
        }
        return true;
    }

    function calculateOffset(obsOffset, militaryOffset, numOffset) {
        if (obsOffset) {
            return obsOffsets[obsOffset];
        } else if (militaryOffset) {
            // the only allowed military tz is Z
            return 0;
        } else {
            var hm = parseInt(numOffset, 10),
                m = hm % 100,
                h = (hm - m) / 100;
            return h * 60 + m;
        }
    }

    // date and time from ref 2822 format
    function configFromRFC2822(config) {
        var match = rfc2822.exec(preprocessRFC2822(config._i)),
            parsedArray;
        if (match) {
            parsedArray = extractFromRFC2822Strings(
                match[4],
                match[3],
                match[2],
                match[5],
                match[6],
                match[7]
            );
            if (!checkWeekday(match[1], parsedArray, config)) {
                return;
            }

            config._a = parsedArray;
            config._tzm = calculateOffset(match[8], match[9], match[10]);

            config._d = createUTCDate.apply(null, config._a);
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);

            getParsingFlags(config).rfc2822 = true;
        } else {
            config._isValid = false;
        }
    }

    // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict
    function configFromString(config) {
        var matched = aspNetJsonRegex.exec(config._i);
        if (matched !== null) {
            config._d = new Date(+matched[1]);
            return;
        }

        configFromISO(config);
        if (config._isValid === false) {
            delete config._isValid;
        } else {
            return;
        }

        configFromRFC2822(config);
        if (config._isValid === false) {
            delete config._isValid;
        } else {
            return;
        }

        if (config._strict) {
            config._isValid = false;
        } else {
            // Final attempt, use Input Fallback
            hooks.createFromInputFallback(config);
        }
    }

    hooks.createFromInputFallback = deprecate(
        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
            'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
            'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
        function (config) {
            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
        }
    );

    // Pick the first defined of two or three arguments.
    function defaults(a, b, c) {
        if (a != null) {
            return a;
        }
        if (b != null) {
            return b;
        }
        return c;
    }

    function currentDateArray(config) {
        // hooks is actually the exported moment object
        var nowValue = new Date(hooks.now());
        if (config._useUTC) {
            return [
                nowValue.getUTCFullYear(),
                nowValue.getUTCMonth(),
                nowValue.getUTCDate(),
            ];
        }
        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
    }

    // convert an array to a date.
    // the array should mirror the parameters below
    // note: all values past the year are optional and will default to the lowest possible value.
    // [year, month, day , hour, minute, second, millisecond]
    function configFromArray(config) {
        var i,
            date,
            input = [],
            currentDate,
            expectedWeekday,
            yearToUse;

        if (config._d) {
            return;
        }

        currentDate = currentDateArray(config);

        //compute day of the year from weeks and weekdays
        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
            dayOfYearFromWeekInfo(config);
        }

        //if the day of the year is set, figure out what it is
        if (config._dayOfYear != null) {
            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);

            if (
                config._dayOfYear > daysInYear(yearToUse) ||
                config._dayOfYear === 0
            ) {
                getParsingFlags(config)._overflowDayOfYear = true;
            }

            date = createUTCDate(yearToUse, 0, config._dayOfYear);
            config._a[MONTH] = date.getUTCMonth();
            config._a[DATE] = date.getUTCDate();
        }

        // Default to current date.
        // * if no year, month, day of month are given, default to today
        // * if day of month is given, default month and year
        // * if month is given, default only year
        // * if year is given, don't default anything
        for (i = 0; i < 3 && config._a[i] == null; ++i) {
            config._a[i] = input[i] = currentDate[i];
        }

        // Zero out whatever was not defaulted, including time
        for (; i < 7; i++) {
            config._a[i] = input[i] =
                config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];
        }

        // Check for 24:00:00.000
        if (
            config._a[HOUR] === 24 &&
            config._a[MINUTE] === 0 &&
            config._a[SECOND] === 0 &&
            config._a[MILLISECOND] === 0
        ) {
            config._nextDay = true;
            config._a[HOUR] = 0;
        }

        config._d = (config._useUTC ? createUTCDate : createDate).apply(
            null,
            input
        );
        expectedWeekday = config._useUTC
            ? config._d.getUTCDay()
            : config._d.getDay();

        // Apply timezone offset from input. The actual utcOffset can be changed
        // with parseZone.
        if (config._tzm != null) {
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
        }

        if (config._nextDay) {
            config._a[HOUR] = 24;
        }

        // check for mismatching day of week
        if (
            config._w &&
            typeof config._w.d !== 'undefined' &&
            config._w.d !== expectedWeekday
        ) {
            getParsingFlags(config).weekdayMismatch = true;
        }
    }

    function dayOfYearFromWeekInfo(config) {
        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;

        w = config._w;
        if (w.GG != null || w.W != null || w.E != null) {
            dow = 1;
            doy = 4;

            // TODO: We need to take the current isoWeekYear, but that depends on
            // how we interpret now (local, utc, fixed offset). So create
            // a now version of current config (take local/utc/offset flags, and
            // create now).
            weekYear = defaults(
                w.GG,
                config._a[YEAR],
                weekOfYear(createLocal(), 1, 4).year
            );
            week = defaults(w.W, 1);
            weekday = defaults(w.E, 1);
            if (weekday < 1 || weekday > 7) {
                weekdayOverflow = true;
            }
        } else {
            dow = config._locale._week.dow;
            doy = config._locale._week.doy;

            curWeek = weekOfYear(createLocal(), dow, doy);

            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);

            // Default to current week.
            week = defaults(w.w, curWeek.week);

            if (w.d != null) {
                // weekday -- low day numbers are considered next week
                weekday = w.d;
                if (weekday < 0 || weekday > 6) {
                    weekdayOverflow = true;
                }
            } else if (w.e != null) {
                // local weekday -- counting starts from beginning of week
                weekday = w.e + dow;
                if (w.e < 0 || w.e > 6) {
                    weekdayOverflow = true;
                }
            } else {
                // default to beginning of week
                weekday = dow;
            }
        }
        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
            getParsingFlags(config)._overflowWeeks = true;
        } else if (weekdayOverflow != null) {
            getParsingFlags(config)._overflowWeekday = true;
        } else {
            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
            config._a[YEAR] = temp.year;
            config._dayOfYear = temp.dayOfYear;
        }
    }

    // constant that refers to the ISO standard
    hooks.ISO_8601 = function () {};

    // constant that refers to the RFC 2822 form
    hooks.RFC_2822 = function () {};

    // date from string and format string
    function configFromStringAndFormat(config) {
        // TODO: Move this to another part of the creation flow to prevent circular deps
        if (config._f === hooks.ISO_8601) {
            configFromISO(config);
            return;
        }
        if (config._f === hooks.RFC_2822) {
            configFromRFC2822(config);
            return;
        }
        config._a = [];
        getParsingFlags(config).empty = true;

        // This array is used to make a Date, either with `new Date` or `Date.UTC`
        var string = '' + config._i,
            i,
            parsedInput,
            tokens,
            token,
            skipped,
            stringLength = string.length,
            totalParsedInputLength = 0,
            era,
            tokenLen;

        tokens =
            expandFormat(config._f, config._locale).match(formattingTokens) || [];
        tokenLen = tokens.length;
        for (i = 0; i < tokenLen; i++) {
            token = tokens[i];
            parsedInput = (string.match(getParseRegexForToken(token, config)) ||
                [])[0];
            if (parsedInput) {
                skipped = string.substr(0, string.indexOf(parsedInput));
                if (skipped.length > 0) {
                    getParsingFlags(config).unusedInput.push(skipped);
                }
                string = string.slice(
                    string.indexOf(parsedInput) + parsedInput.length
                );
                totalParsedInputLength += parsedInput.length;
            }
            // don't parse if it's not a known token
            if (formatTokenFunctions[token]) {
                if (parsedInput) {
                    getParsingFlags(config).empty = false;
                } else {
                    getParsingFlags(config).unusedTokens.push(token);
                }
                addTimeToArrayFromToken(token, parsedInput, config);
            } else if (config._strict && !parsedInput) {
                getParsingFlags(config).unusedTokens.push(token);
            }
        }

        // add remaining unparsed input length to the string
        getParsingFlags(config).charsLeftOver =
            stringLength - totalParsedInputLength;
        if (string.length > 0) {
            getParsingFlags(config).unusedInput.push(string);
        }

        // clear _12h flag if hour is <= 12
        if (
            config._a[HOUR] <= 12 &&
            getParsingFlags(config).bigHour === true &&
            config._a[HOUR] > 0
        ) {
            getParsingFlags(config).bigHour = undefined;
        }

        getParsingFlags(config).parsedDateParts = config._a.slice(0);
        getParsingFlags(config).meridiem = config._meridiem;
        // handle meridiem
        config._a[HOUR] = meridiemFixWrap(
            config._locale,
            config._a[HOUR],
            config._meridiem
        );

        // handle era
        era = getParsingFlags(config).era;
        if (era !== null) {
            config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
        }

        configFromArray(config);
        checkOverflow(config);
    }

    function meridiemFixWrap(locale, hour, meridiem) {
        var isPm;

        if (meridiem == null) {
            // nothing to do
            return hour;
        }
        if (locale.meridiemHour != null) {
            return locale.meridiemHour(hour, meridiem);
        } else if (locale.isPM != null) {
            // Fallback
            isPm = locale.isPM(meridiem);
            if (isPm && hour < 12) {
                hour += 12;
            }
            if (!isPm && hour === 12) {
                hour = 0;
            }
            return hour;
        } else {
            // this is not supposed to happen
            return hour;
        }
    }

    // date from string and array of format strings
    function configFromStringAndArray(config) {
        var tempConfig,
            bestMoment,
            scoreToBeat,
            i,
            currentScore,
            validFormatFound,
            bestFormatIsValid = false,
            configfLen = config._f.length;

        if (configfLen === 0) {
            getParsingFlags(config).invalidFormat = true;
            config._d = new Date(NaN);
            return;
        }

        for (i = 0; i < configfLen; i++) {
            currentScore = 0;
            validFormatFound = false;
            tempConfig = copyConfig({}, config);
            if (config._useUTC != null) {
                tempConfig._useUTC = config._useUTC;
            }
            tempConfig._f = config._f[i];
            configFromStringAndFormat(tempConfig);

            if (isValid(tempConfig)) {
                validFormatFound = true;
            }

            // if there is any input that was not parsed add a penalty for that format
            currentScore += getParsingFlags(tempConfig).charsLeftOver;

            //or tokens
            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;

            getParsingFlags(tempConfig).score = currentScore;

            if (!bestFormatIsValid) {
                if (
                    scoreToBeat == null ||
                    currentScore < scoreToBeat ||
                    validFormatFound
                ) {
                    scoreToBeat = currentScore;
                    bestMoment = tempConfig;
                    if (validFormatFound) {
                        bestFormatIsValid = true;
                    }
                }
            } else {
                if (currentScore < scoreToBeat) {
                    scoreToBeat = currentScore;
                    bestMoment = tempConfig;
                }
            }
        }

        extend(config, bestMoment || tempConfig);
    }

    function configFromObject(config) {
        if (config._d) {
            return;
        }

        var i = normalizeObjectUnits(config._i),
            dayOrDate = i.day === undefined ? i.date : i.day;
        config._a = map(
            [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],
            function (obj) {
                return obj && parseInt(obj, 10);
            }
        );

        configFromArray(config);
    }

    function createFromConfig(config) {
        var res = new Moment(checkOverflow(prepareConfig(config)));
        if (res._nextDay) {
            // Adding is smart enough around DST
            res.add(1, 'd');
            res._nextDay = undefined;
        }

        return res;
    }

    function prepareConfig(config) {
        var input = config._i,
            format = config._f;

        config._locale = config._locale || getLocale(config._l);

        if (input === null || (format === undefined && input === '')) {
            return createInvalid({ nullInput: true });
        }

        if (typeof input === 'string') {
            config._i = input = config._locale.preparse(input);
        }

        if (isMoment(input)) {
            return new Moment(checkOverflow(input));
        } else if (isDate(input)) {
            config._d = input;
        } else if (isArray(format)) {
            configFromStringAndArray(config);
        } else if (format) {
            configFromStringAndFormat(config);
        } else {
            configFromInput(config);
        }

        if (!isValid(config)) {
            config._d = null;
        }

        return config;
    }

    function configFromInput(config) {
        var input = config._i;
        if (isUndefined(input)) {
            config._d = new Date(hooks.now());
        } else if (isDate(input)) {
            config._d = new Date(input.valueOf());
        } else if (typeof input === 'string') {
            configFromString(config);
        } else if (isArray(input)) {
            config._a = map(input.slice(0), function (obj) {
                return parseInt(obj, 10);
            });
            configFromArray(config);
        } else if (isObject(input)) {
            configFromObject(config);
        } else if (isNumber(input)) {
            // from milliseconds
            config._d = new Date(input);
        } else {
            hooks.createFromInputFallback(config);
        }
    }

    function createLocalOrUTC(input, format, locale, strict, isUTC) {
        var c = {};

        if (format === true || format === false) {
            strict = format;
            format = undefined;
        }

        if (locale === true || locale === false) {
            strict = locale;
            locale = undefined;
        }

        if (
            (isObject(input) && isObjectEmpty(input)) ||
            (isArray(input) && input.length === 0)
        ) {
            input = undefined;
        }
        // object construction must be done this way.
        // https://github.com/moment/moment/issues/1423
        c._isAMomentObject = true;
        c._useUTC = c._isUTC = isUTC;
        c._l = locale;
        c._i = input;
        c._f = format;
        c._strict = strict;

        return createFromConfig(c);
    }

    function createLocal(input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, false);
    }

    var prototypeMin = deprecate(
            'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
            function () {
                var other = createLocal.apply(null, arguments);
                if (this.isValid() && other.isValid()) {
                    return other < this ? this : other;
                } else {
                    return createInvalid();
                }
            }
        ),
        prototypeMax = deprecate(
            'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
            function () {
                var other = createLocal.apply(null, arguments);
                if (this.isValid() && other.isValid()) {
                    return other > this ? this : other;
                } else {
                    return createInvalid();
                }
            }
        );

    // Pick a moment m from moments so that m[fn](other) is true for all
    // other. This relies on the function fn to be transitive.
    //
    // moments should either be an array of moment objects or an array, whose
    // first element is an array of moment objects.
    function pickBy(fn, moments) {
        var res, i;
        if (moments.length === 1 && isArray(moments[0])) {
            moments = moments[0];
        }
        if (!moments.length) {
            return createLocal();
        }
        res = moments[0];
        for (i = 1; i < moments.length; ++i) {
            if (!moments[i].isValid() || moments[i][fn](res)) {
                res = moments[i];
            }
        }
        return res;
    }

    // TODO: Use [].sort instead?
    function min() {
        var args = [].slice.call(arguments, 0);

        return pickBy('isBefore', args);
    }

    function max() {
        var args = [].slice.call(arguments, 0);

        return pickBy('isAfter', args);
    }

    var now = function () {
        return Date.now ? Date.now() : +new Date();
    };

    var ordering = [
        'year',
        'quarter',
        'month',
        'week',
        'day',
        'hour',
        'minute',
        'second',
        'millisecond',
    ];

    function isDurationValid(m) {
        var key,
            unitHasDecimal = false,
            i,
            orderLen = ordering.length;
        for (key in m) {
            if (
                hasOwnProp(m, key) &&
                !(
                    indexOf.call(ordering, key) !== -1 &&
                    (m[key] == null || !isNaN(m[key]))
                )
            ) {
                return false;
            }
        }

        for (i = 0; i < orderLen; ++i) {
            if (m[ordering[i]]) {
                if (unitHasDecimal) {
                    return false; // only allow non-integers for smallest unit
                }
                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
                    unitHasDecimal = true;
                }
            }
        }

        return true;
    }

    function isValid$1() {
        return this._isValid;
    }

    function createInvalid$1() {
        return createDuration(NaN);
    }

    function Duration(duration) {
        var normalizedInput = normalizeObjectUnits(duration),
            years = normalizedInput.year || 0,
            quarters = normalizedInput.quarter || 0,
            months = normalizedInput.month || 0,
            weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
            days = normalizedInput.day || 0,
            hours = normalizedInput.hour || 0,
            minutes = normalizedInput.minute || 0,
            seconds = normalizedInput.second || 0,
            milliseconds = normalizedInput.millisecond || 0;

        this._isValid = isDurationValid(normalizedInput);

        // representation for dateAddRemove
        this._milliseconds =
            +milliseconds +
            seconds * 1e3 + // 1000
            minutes * 6e4 + // 1000 * 60
            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
        // Because of dateAddRemove treats 24 hours as different from a
        // day when working around DST, we need to store them separately
        this._days = +days + weeks * 7;
        // It is impossible to translate months into days without knowing
        // which months you are are talking about, so we have to store
        // it separately.
        this._months = +months + quarters * 3 + years * 12;

        this._data = {};

        this._locale = getLocale();

        this._bubble();
    }

    function isDuration(obj) {
        return obj instanceof Duration;
    }

    function absRound(number) {
        if (number < 0) {
            return Math.round(-1 * number) * -1;
        } else {
            return Math.round(number);
        }
    }

    // compare two arrays, return the number of differences
    function compareArrays(array1, array2, dontConvert) {
        var len = Math.min(array1.length, array2.length),
            lengthDiff = Math.abs(array1.length - array2.length),
            diffs = 0,
            i;
        for (i = 0; i < len; i++) {
            if (
                (dontConvert && array1[i] !== array2[i]) ||
                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))
            ) {
                diffs++;
            }
        }
        return diffs + lengthDiff;
    }

    // FORMATTING

    function offset(token, separator) {
        addFormatToken(token, 0, 0, function () {
            var offset = this.utcOffset(),
                sign = '+';
            if (offset < 0) {
                offset = -offset;
                sign = '-';
            }
            return (
                sign +
                zeroFill(~~(offset / 60), 2) +
                separator +
                zeroFill(~~offset % 60, 2)
            );
        });
    }

    offset('Z', ':');
    offset('ZZ', '');

    // PARSING

    addRegexToken('Z', matchShortOffset);
    addRegexToken('ZZ', matchShortOffset);
    addParseToken(['Z', 'ZZ'], function (input, array, config) {
        config._useUTC = true;
        config._tzm = offsetFromString(matchShortOffset, input);
    });

    // HELPERS

    // timezone chunker
    // '+10:00' > ['10',  '00']
    // '-1530'  > ['-15', '30']
    var chunkOffset = /([\+\-]|\d\d)/gi;

    function offsetFromString(matcher, string) {
        var matches = (string || '').match(matcher),
            chunk,
            parts,
            minutes;

        if (matches === null) {
            return null;
        }

        chunk = matches[matches.length - 1] || [];
        parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
        minutes = +(parts[1] * 60) + toInt(parts[2]);

        return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;
    }

    // Return a moment from input, that is local/utc/zone equivalent to model.
    function cloneWithOffset(input, model) {
        var res, diff;
        if (model._isUTC) {
            res = model.clone();
            diff =
                (isMoment(input) || isDate(input)
                    ? input.valueOf()
                    : createLocal(input).valueOf()) - res.valueOf();
            // Use low-level api, because this fn is low-level api.
            res._d.setTime(res._d.valueOf() + diff);
            hooks.updateOffset(res, false);
            return res;
        } else {
            return createLocal(input).local();
        }
    }

    function getDateOffset(m) {
        // On Firefox.24 Date#getTimezoneOffset returns a floating point.
        // https://github.com/moment/moment/pull/1871
        return -Math.round(m._d.getTimezoneOffset());
    }

    // HOOKS

    // This function will be called whenever a moment is mutated.
    // It is intended to keep the offset in sync with the timezone.
    hooks.updateOffset = function () {};

    // MOMENTS

    // keepLocalTime = true means only change the timezone, without
    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
    // +0200, so we adjust the time as needed, to be valid.
    //
    // Keeping the time actually adds/subtracts (one hour)
    // from the actual represented time. That is why we call updateOffset
    // a second time. In case it wants us to change the offset again
    // _changeInProgress == true case, then we have to adjust, because
    // there is no such time in the given timezone.
    function getSetOffset(input, keepLocalTime, keepMinutes) {
        var offset = this._offset || 0,
            localAdjust;
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        if (input != null) {
            if (typeof input === 'string') {
                input = offsetFromString(matchShortOffset, input);
                if (input === null) {
                    return this;
                }
            } else if (Math.abs(input) < 16 && !keepMinutes) {
                input = input * 60;
            }
            if (!this._isUTC && keepLocalTime) {
                localAdjust = getDateOffset(this);
            }
            this._offset = input;
            this._isUTC = true;
            if (localAdjust != null) {
                this.add(localAdjust, 'm');
            }
            if (offset !== input) {
                if (!keepLocalTime || this._changeInProgress) {
                    addSubtract(
                        this,
                        createDuration(input - offset, 'm'),
                        1,
                        false
                    );
                } else if (!this._changeInProgress) {
                    this._changeInProgress = true;
                    hooks.updateOffset(this, true);
                    this._changeInProgress = null;
                }
            }
            return this;
        } else {
            return this._isUTC ? offset : getDateOffset(this);
        }
    }

    function getSetZone(input, keepLocalTime) {
        if (input != null) {
            if (typeof input !== 'string') {
                input = -input;
            }

            this.utcOffset(input, keepLocalTime);

            return this;
        } else {
            return -this.utcOffset();
        }
    }

    function setOffsetToUTC(keepLocalTime) {
        return this.utcOffset(0, keepLocalTime);
    }

    function setOffsetToLocal(keepLocalTime) {
        if (this._isUTC) {
            this.utcOffset(0, keepLocalTime);
            this._isUTC = false;

            if (keepLocalTime) {
                this.subtract(getDateOffset(this), 'm');
            }
        }
        return this;
    }

    function setOffsetToParsedOffset() {
        if (this._tzm != null) {
            this.utcOffset(this._tzm, false, true);
        } else if (typeof this._i === 'string') {
            var tZone = offsetFromString(matchOffset, this._i);
            if (tZone != null) {
                this.utcOffset(tZone);
            } else {
                this.utcOffset(0, true);
            }
        }
        return this;
    }

    function hasAlignedHourOffset(input) {
        if (!this.isValid()) {
            return false;
        }
        input = input ? createLocal(input).utcOffset() : 0;

        return (this.utcOffset() - input) % 60 === 0;
    }

    function isDaylightSavingTime() {
        return (
            this.utcOffset() > this.clone().month(0).utcOffset() ||
            this.utcOffset() > this.clone().month(5).utcOffset()
        );
    }

    function isDaylightSavingTimeShifted() {
        if (!isUndefined(this._isDSTShifted)) {
            return this._isDSTShifted;
        }

        var c = {},
            other;

        copyConfig(c, this);
        c = prepareConfig(c);

        if (c._a) {
            other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
            this._isDSTShifted =
                this.isValid() && compareArrays(c._a, other.toArray()) > 0;
        } else {
            this._isDSTShifted = false;
        }

        return this._isDSTShifted;
    }

    function isLocal() {
        return this.isValid() ? !this._isUTC : false;
    }

    function isUtcOffset() {
        return this.isValid() ? this._isUTC : false;
    }

    function isUtc() {
        return this.isValid() ? this._isUTC && this._offset === 0 : false;
    }

    // ASP.NET json date format regex
    var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,
        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
        // and further modified to allow for strings containing both week and day
        isoRegex =
            /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;

    function createDuration(input, key) {
        var duration = input,
            // matching against regexp is expensive, do it on demand
            match = null,
            sign,
            ret,
            diffRes;

        if (isDuration(input)) {
            duration = {
                ms: input._milliseconds,
                d: input._days,
                M: input._months,
            };
        } else if (isNumber(input) || !isNaN(+input)) {
            duration = {};
            if (key) {
                duration[key] = +input;
            } else {
                duration.milliseconds = +input;
            }
        } else if ((match = aspNetRegex.exec(input))) {
            sign = match[1] === '-' ? -1 : 1;
            duration = {
                y: 0,
                d: toInt(match[DATE]) * sign,
                h: toInt(match[HOUR]) * sign,
                m: toInt(match[MINUTE]) * sign,
                s: toInt(match[SECOND]) * sign,
                ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match
            };
        } else if ((match = isoRegex.exec(input))) {
            sign = match[1] === '-' ? -1 : 1;
            duration = {
                y: parseIso(match[2], sign),
                M: parseIso(match[3], sign),
                w: parseIso(match[4], sign),
                d: parseIso(match[5], sign),
                h: parseIso(match[6], sign),
                m: parseIso(match[7], sign),
                s: parseIso(match[8], sign),
            };
        } else if (duration == null) {
            // checks for null or undefined
            duration = {};
        } else if (
            typeof duration === 'object' &&
            ('from' in duration || 'to' in duration)
        ) {
            diffRes = momentsDifference(
                createLocal(duration.from),
                createLocal(duration.to)
            );

            duration = {};
            duration.ms = diffRes.milliseconds;
            duration.M = diffRes.months;
        }

        ret = new Duration(duration);

        if (isDuration(input) && hasOwnProp(input, '_locale')) {
            ret._locale = input._locale;
        }

        if (isDuration(input) && hasOwnProp(input, '_isValid')) {
            ret._isValid = input._isValid;
        }

        return ret;
    }

    createDuration.fn = Duration.prototype;
    createDuration.invalid = createInvalid$1;

    function parseIso(inp, sign) {
        // We'd normally use ~~inp for this, but unfortunately it also
        // converts floats to ints.
        // inp may be undefined, so careful calling replace on it.
        var res = inp && parseFloat(inp.replace(',', '.'));
        // apply sign while we're at it
        return (isNaN(res) ? 0 : res) * sign;
    }

    function positiveMomentsDifference(base, other) {
        var res = {};

        res.months =
            other.month() - base.month() + (other.year() - base.year()) * 12;
        if (base.clone().add(res.months, 'M').isAfter(other)) {
            --res.months;
        }

        res.milliseconds = +other - +base.clone().add(res.months, 'M');

        return res;
    }

    function momentsDifference(base, other) {
        var res;
        if (!(base.isValid() && other.isValid())) {
            return { milliseconds: 0, months: 0 };
        }

        other = cloneWithOffset(other, base);
        if (base.isBefore(other)) {
            res = positiveMomentsDifference(base, other);
        } else {
            res = positiveMomentsDifference(other, base);
            res.milliseconds = -res.milliseconds;
            res.months = -res.months;
        }

        return res;
    }

    // TODO: remove 'name' arg after deprecation is removed
    function createAdder(direction, name) {
        return function (val, period) {
            var dur, tmp;
            //invert the arguments, but complain about it
            if (period !== null && !isNaN(+period)) {
                deprecateSimple(
                    name,
                    'moment().' +
                        name +
                        '(period, number) is deprecated. Please use moment().' +
                        name +
                        '(number, period). ' +
                        'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
                );
                tmp = val;
                val = period;
                period = tmp;
            }

            dur = createDuration(val, period);
            addSubtract(this, dur, direction);
            return this;
        };
    }

    function addSubtract(mom, duration, isAdding, updateOffset) {
        var milliseconds = duration._milliseconds,
            days = absRound(duration._days),
            months = absRound(duration._months);

        if (!mom.isValid()) {
            // No op
            return;
        }

        updateOffset = updateOffset == null ? true : updateOffset;

        if (months) {
            setMonth(mom, get(mom, 'Month') + months * isAdding);
        }
        if (days) {
            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
        }
        if (milliseconds) {
            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
        }
        if (updateOffset) {
            hooks.updateOffset(mom, days || months);
        }
    }

    var add = createAdder(1, 'add'),
        subtract = createAdder(-1, 'subtract');

    function isString(input) {
        return typeof input === 'string' || input instanceof String;
    }

    // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
    function isMomentInput(input) {
        return (
            isMoment(input) ||
            isDate(input) ||
            isString(input) ||
            isNumber(input) ||
            isNumberOrStringArray(input) ||
            isMomentInputObject(input) ||
            input === null ||
            input === undefined
        );
    }

    function isMomentInputObject(input) {
        var objectTest = isObject(input) && !isObjectEmpty(input),
            propertyTest = false,
            properties = [
                'years',
                'year',
                'y',
                'months',
                'month',
                'M',
                'days',
                'day',
                'd',
                'dates',
                'date',
                'D',
                'hours',
                'hour',
                'h',
                'minutes',
                'minute',
                'm',
                'seconds',
                'second',
                's',
                'milliseconds',
                'millisecond',
                'ms',
            ],
            i,
            property,
            propertyLen = properties.length;

        for (i = 0; i < propertyLen; i += 1) {
            property = properties[i];
            propertyTest = propertyTest || hasOwnProp(input, property);
        }

        return objectTest && propertyTest;
    }

    function isNumberOrStringArray(input) {
        var arrayTest = isArray(input),
            dataTypeTest = false;
        if (arrayTest) {
            dataTypeTest =
                input.filter(function (item) {
                    return !isNumber(item) && isString(input);
                }).length === 0;
        }
        return arrayTest && dataTypeTest;
    }

    function isCalendarSpec(input) {
        var objectTest = isObject(input) && !isObjectEmpty(input),
            propertyTest = false,
            properties = [
                'sameDay',
                'nextDay',
                'lastDay',
                'nextWeek',
                'lastWeek',
                'sameElse',
            ],
            i,
            property;

        for (i = 0; i < properties.length; i += 1) {
            property = properties[i];
            propertyTest = propertyTest || hasOwnProp(input, property);
        }

        return objectTest && propertyTest;
    }

    function getCalendarFormat(myMoment, now) {
        var diff = myMoment.diff(now, 'days', true);
        return diff < -6
            ? 'sameElse'
            : diff < -1
            ? 'lastWeek'
            : diff < 0
            ? 'lastDay'
            : diff < 1
            ? 'sameDay'
            : diff < 2
            ? 'nextDay'
            : diff < 7
            ? 'nextWeek'
            : 'sameElse';
    }

    function calendar$1(time, formats) {
        // Support for single parameter, formats only overload to the calendar function
        if (arguments.length === 1) {
            if (!arguments[0]) {
                time = undefined;
                formats = undefined;
            } else if (isMomentInput(arguments[0])) {
                time = arguments[0];
                formats = undefined;
            } else if (isCalendarSpec(arguments[0])) {
                formats = arguments[0];
                time = undefined;
            }
        }
        // We want to compare the start of today, vs this.
        // Getting start-of-today depends on whether we're local/utc/offset or not.
        var now = time || createLocal(),
            sod = cloneWithOffset(now, this).startOf('day'),
            format = hooks.calendarFormat(this, sod) || 'sameElse',
            output =
                formats &&
                (isFunction(formats[format])
                    ? formats[format].call(this, now)
                    : formats[format]);

        return this.format(
            output || this.localeData().calendar(format, this, createLocal(now))
        );
    }

    function clone() {
        return new Moment(this);
    }

    function isAfter(input, units) {
        var localInput = isMoment(input) ? input : createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units) || 'millisecond';
        if (units === 'millisecond') {
            return this.valueOf() > localInput.valueOf();
        } else {
            return localInput.valueOf() < this.clone().startOf(units).valueOf();
        }
    }

    function isBefore(input, units) {
        var localInput = isMoment(input) ? input : createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units) || 'millisecond';
        if (units === 'millisecond') {
            return this.valueOf() < localInput.valueOf();
        } else {
            return this.clone().endOf(units).valueOf() < localInput.valueOf();
        }
    }

    function isBetween(from, to, units, inclusivity) {
        var localFrom = isMoment(from) ? from : createLocal(from),
            localTo = isMoment(to) ? to : createLocal(to);
        if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
            return false;
        }
        inclusivity = inclusivity || '()';
        return (
            (inclusivity[0] === '('
                ? this.isAfter(localFrom, units)
                : !this.isBefore(localFrom, units)) &&
            (inclusivity[1] === ')'
                ? this.isBefore(localTo, units)
                : !this.isAfter(localTo, units))
        );
    }

    function isSame(input, units) {
        var localInput = isMoment(input) ? input : createLocal(input),
            inputMs;
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units) || 'millisecond';
        if (units === 'millisecond') {
            return this.valueOf() === localInput.valueOf();
        } else {
            inputMs = localInput.valueOf();
            return (
                this.clone().startOf(units).valueOf() <= inputMs &&
                inputMs <= this.clone().endOf(units).valueOf()
            );
        }
    }

    function isSameOrAfter(input, units) {
        return this.isSame(input, units) || this.isAfter(input, units);
    }

    function isSameOrBefore(input, units) {
        return this.isSame(input, units) || this.isBefore(input, units);
    }

    function diff(input, units, asFloat) {
        var that, zoneDelta, output;

        if (!this.isValid()) {
            return NaN;
        }

        that = cloneWithOffset(input, this);

        if (!that.isValid()) {
            return NaN;
        }

        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;

        units = normalizeUnits(units);

        switch (units) {
            case 'year':
                output = monthDiff(this, that) / 12;
                break;
            case 'month':
                output = monthDiff(this, that);
                break;
            case 'quarter':
                output = monthDiff(this, that) / 3;
                break;
            case 'second':
                output = (this - that) / 1e3;
                break; // 1000
            case 'minute':
                output = (this - that) / 6e4;
                break; // 1000 * 60
            case 'hour':
                output = (this - that) / 36e5;
                break; // 1000 * 60 * 60
            case 'day':
                output = (this - that - zoneDelta) / 864e5;
                break; // 1000 * 60 * 60 * 24, negate dst
            case 'week':
                output = (this - that - zoneDelta) / 6048e5;
                break; // 1000 * 60 * 60 * 24 * 7, negate dst
            default:
                output = this - that;
        }

        return asFloat ? output : absFloor(output);
    }

    function monthDiff(a, b) {
        if (a.date() < b.date()) {
            // end-of-month calculations work correct when the start month has more
            // days than the end month.
            return -monthDiff(b, a);
        }
        // difference in months
        var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),
            // b is in (anchor - 1 month, anchor + 1 month)
            anchor = a.clone().add(wholeMonthDiff, 'months'),
            anchor2,
            adjust;

        if (b - anchor < 0) {
            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor - anchor2);
        } else {
            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor2 - anchor);
        }

        //check for negative zero, return zero if negative zero
        return -(wholeMonthDiff + adjust) || 0;
    }

    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';

    function toString() {
        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
    }

    function toISOString(keepOffset) {
        if (!this.isValid()) {
            return null;
        }
        var utc = keepOffset !== true,
            m = utc ? this.clone().utc() : this;
        if (m.year() < 0 || m.year() > 9999) {
            return formatMoment(
                m,
                utc
                    ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'
                    : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'
            );
        }
        if (isFunction(Date.prototype.toISOString)) {
            // native implementation is ~50x faster, use it when we can
            if (utc) {
                return this.toDate().toISOString();
            } else {
                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)
                    .toISOString()
                    .replace('Z', formatMoment(m, 'Z'));
            }
        }
        return formatMoment(
            m,
            utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'
        );
    }

    /**
     * Return a human readable representation of a moment that can
     * also be evaluated to get a new moment which is the same
     *
     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
     */
    function inspect() {
        if (!this.isValid()) {
            return 'moment.invalid(/* ' + this._i + ' */)';
        }
        var func = 'moment',
            zone = '',
            prefix,
            year,
            datetime,
            suffix;
        if (!this.isLocal()) {
            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
            zone = 'Z';
        }
        prefix = '[' + func + '("]';
        year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
        datetime = '-MM-DD[T]HH:mm:ss.SSS';
        suffix = zone + '[")]';

        return this.format(prefix + year + datetime + suffix);
    }

    function format(inputString) {
        if (!inputString) {
            inputString = this.isUtc()
                ? hooks.defaultFormatUtc
                : hooks.defaultFormat;
        }
        var output = formatMoment(this, inputString);
        return this.localeData().postformat(output);
    }

    function from(time, withoutSuffix) {
        if (
            this.isValid() &&
            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
        ) {
            return createDuration({ to: this, from: time })
                .locale(this.locale())
                .humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function fromNow(withoutSuffix) {
        return this.from(createLocal(), withoutSuffix);
    }

    function to(time, withoutSuffix) {
        if (
            this.isValid() &&
            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
        ) {
            return createDuration({ from: this, to: time })
                .locale(this.locale())
                .humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function toNow(withoutSuffix) {
        return this.to(createLocal(), withoutSuffix);
    }

    // If passed a locale key, it will set the locale for this
    // instance.  Otherwise, it will return the locale configuration
    // variables for this instance.
    function locale(key) {
        var newLocaleData;

        if (key === undefined) {
            return this._locale._abbr;
        } else {
            newLocaleData = getLocale(key);
            if (newLocaleData != null) {
                this._locale = newLocaleData;
            }
            return this;
        }
    }

    var lang = deprecate(
        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
        function (key) {
            if (key === undefined) {
                return this.localeData();
            } else {
                return this.locale(key);
            }
        }
    );

    function localeData() {
        return this._locale;
    }

    var MS_PER_SECOND = 1000,
        MS_PER_MINUTE = 60 * MS_PER_SECOND,
        MS_PER_HOUR = 60 * MS_PER_MINUTE,
        MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;

    // actual modulo - handles negative numbers (for dates before 1970):
    function mod$1(dividend, divisor) {
        return ((dividend % divisor) + divisor) % divisor;
    }

    function localStartOfDate(y, m, d) {
        // the date constructor remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            // preserve leap years using a full 400 year cycle, then reset
            return new Date(y + 400, m, d) - MS_PER_400_YEARS;
        } else {
            return new Date(y, m, d).valueOf();
        }
    }

    function utcStartOfDate(y, m, d) {
        // Date.UTC remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            // preserve leap years using a full 400 year cycle, then reset
            return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
        } else {
            return Date.UTC(y, m, d);
        }
    }

    function startOf(units) {
        var time, startOfDate;
        units = normalizeUnits(units);
        if (units === undefined || units === 'millisecond' || !this.isValid()) {
            return this;
        }

        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;

        switch (units) {
            case 'year':
                time = startOfDate(this.year(), 0, 1);
                break;
            case 'quarter':
                time = startOfDate(
                    this.year(),
                    this.month() - (this.month() % 3),
                    1
                );
                break;
            case 'month':
                time = startOfDate(this.year(), this.month(), 1);
                break;
            case 'week':
                time = startOfDate(
                    this.year(),
                    this.month(),
                    this.date() - this.weekday()
                );
                break;
            case 'isoWeek':
                time = startOfDate(
                    this.year(),
                    this.month(),
                    this.date() - (this.isoWeekday() - 1)
                );
                break;
            case 'day':
            case 'date':
                time = startOfDate(this.year(), this.month(), this.date());
                break;
            case 'hour':
                time = this._d.valueOf();
                time -= mod$1(
                    time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
                    MS_PER_HOUR
                );
                break;
            case 'minute':
                time = this._d.valueOf();
                time -= mod$1(time, MS_PER_MINUTE);
                break;
            case 'second':
                time = this._d.valueOf();
                time -= mod$1(time, MS_PER_SECOND);
                break;
        }

        this._d.setTime(time);
        hooks.updateOffset(this, true);
        return this;
    }

    function endOf(units) {
        var time, startOfDate;
        units = normalizeUnits(units);
        if (units === undefined || units === 'millisecond' || !this.isValid()) {
            return this;
        }

        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;

        switch (units) {
            case 'year':
                time = startOfDate(this.year() + 1, 0, 1) - 1;
                break;
            case 'quarter':
                time =
                    startOfDate(
                        this.year(),
                        this.month() - (this.month() % 3) + 3,
                        1
                    ) - 1;
                break;
            case 'month':
                time = startOfDate(this.year(), this.month() + 1, 1) - 1;
                break;
            case 'week':
                time =
                    startOfDate(
                        this.year(),
                        this.month(),
                        this.date() - this.weekday() + 7
                    ) - 1;
                break;
            case 'isoWeek':
                time =
                    startOfDate(
                        this.year(),
                        this.month(),
                        this.date() - (this.isoWeekday() - 1) + 7
                    ) - 1;
                break;
            case 'day':
            case 'date':
                time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
                break;
            case 'hour':
                time = this._d.valueOf();
                time +=
                    MS_PER_HOUR -
                    mod$1(
                        time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
                        MS_PER_HOUR
                    ) -
                    1;
                break;
            case 'minute':
                time = this._d.valueOf();
                time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;
                break;
            case 'second':
                time = this._d.valueOf();
                time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;
                break;
        }

        this._d.setTime(time);
        hooks.updateOffset(this, true);
        return this;
    }

    function valueOf() {
        return this._d.valueOf() - (this._offset || 0) * 60000;
    }

    function unix() {
        return Math.floor(this.valueOf() / 1000);
    }

    function toDate() {
        return new Date(this.valueOf());
    }

    function toArray() {
        var m = this;
        return [
            m.year(),
            m.month(),
            m.date(),
            m.hour(),
            m.minute(),
            m.second(),
            m.millisecond(),
        ];
    }

    function toObject() {
        var m = this;
        return {
            years: m.year(),
            months: m.month(),
            date: m.date(),
            hours: m.hours(),
            minutes: m.minutes(),
            seconds: m.seconds(),
            milliseconds: m.milliseconds(),
        };
    }

    function toJSON() {
        // new Date(NaN).toJSON() === null
        return this.isValid() ? this.toISOString() : null;
    }

    function isValid$2() {
        return isValid(this);
    }

    function parsingFlags() {
        return extend({}, getParsingFlags(this));
    }

    function invalidAt() {
        return getParsingFlags(this).overflow;
    }

    function creationData() {
        return {
            input: this._i,
            format: this._f,
            locale: this._locale,
            isUTC: this._isUTC,
            strict: this._strict,
        };
    }

    addFormatToken('N', 0, 0, 'eraAbbr');
    addFormatToken('NN', 0, 0, 'eraAbbr');
    addFormatToken('NNN', 0, 0, 'eraAbbr');
    addFormatToken('NNNN', 0, 0, 'eraName');
    addFormatToken('NNNNN', 0, 0, 'eraNarrow');

    addFormatToken('y', ['y', 1], 'yo', 'eraYear');
    addFormatToken('y', ['yy', 2], 0, 'eraYear');
    addFormatToken('y', ['yyy', 3], 0, 'eraYear');
    addFormatToken('y', ['yyyy', 4], 0, 'eraYear');

    addRegexToken('N', matchEraAbbr);
    addRegexToken('NN', matchEraAbbr);
    addRegexToken('NNN', matchEraAbbr);
    addRegexToken('NNNN', matchEraName);
    addRegexToken('NNNNN', matchEraNarrow);

    addParseToken(
        ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],
        function (input, array, config, token) {
            var era = config._locale.erasParse(input, token, config._strict);
            if (era) {
                getParsingFlags(config).era = era;
            } else {
                getParsingFlags(config).invalidEra = input;
            }
        }
    );

    addRegexToken('y', matchUnsigned);
    addRegexToken('yy', matchUnsigned);
    addRegexToken('yyy', matchUnsigned);
    addRegexToken('yyyy', matchUnsigned);
    addRegexToken('yo', matchEraYearOrdinal);

    addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
    addParseToken(['yo'], function (input, array, config, token) {
        var match;
        if (config._locale._eraYearOrdinalRegex) {
            match = input.match(config._locale._eraYearOrdinalRegex);
        }

        if (config._locale.eraYearOrdinalParse) {
            array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
        } else {
            array[YEAR] = parseInt(input, 10);
        }
    });

    function localeEras(m, format) {
        var i,
            l,
            date,
            eras = this._eras || getLocale('en')._eras;
        for (i = 0, l = eras.length; i < l; ++i) {
            switch (typeof eras[i].since) {
                case 'string':
                    // truncate time
                    date = hooks(eras[i].since).startOf('day');
                    eras[i].since = date.valueOf();
                    break;
            }

            switch (typeof eras[i].until) {
                case 'undefined':
                    eras[i].until = +Infinity;
                    break;
                case 'string':
                    // truncate time
                    date = hooks(eras[i].until).startOf('day').valueOf();
                    eras[i].until = date.valueOf();
                    break;
            }
        }
        return eras;
    }

    function localeErasParse(eraName, format, strict) {
        var i,
            l,
            eras = this.eras(),
            name,
            abbr,
            narrow;
        eraName = eraName.toUpperCase();

        for (i = 0, l = eras.length; i < l; ++i) {
            name = eras[i].name.toUpperCase();
            abbr = eras[i].abbr.toUpperCase();
            narrow = eras[i].narrow.toUpperCase();

            if (strict) {
                switch (format) {
                    case 'N':
                    case 'NN':
                    case 'NNN':
                        if (abbr === eraName) {
                            return eras[i];
                        }
                        break;

                    case 'NNNN':
                        if (name === eraName) {
                            return eras[i];
                        }
                        break;

                    case 'NNNNN':
                        if (narrow === eraName) {
                            return eras[i];
                        }
                        break;
                }
            } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {
                return eras[i];
            }
        }
    }

    function localeErasConvertYear(era, year) {
        var dir = era.since <= era.until ? +1 : -1;
        if (year === undefined) {
            return hooks(era.since).year();
        } else {
            return hooks(era.since).year() + (year - era.offset) * dir;
        }
    }

    function getEraName() {
        var i,
            l,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (eras[i].since <= val && val <= eras[i].until) {
                return eras[i].name;
            }
            if (eras[i].until <= val && val <= eras[i].since) {
                return eras[i].name;
            }
        }

        return '';
    }

    function getEraNarrow() {
        var i,
            l,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (eras[i].since <= val && val <= eras[i].until) {
                return eras[i].narrow;
            }
            if (eras[i].until <= val && val <= eras[i].since) {
                return eras[i].narrow;
            }
        }

        return '';
    }

    function getEraAbbr() {
        var i,
            l,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (eras[i].since <= val && val <= eras[i].until) {
                return eras[i].abbr;
            }
            if (eras[i].until <= val && val <= eras[i].since) {
                return eras[i].abbr;
            }
        }

        return '';
    }

    function getEraYear() {
        var i,
            l,
            dir,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            dir = eras[i].since <= eras[i].until ? +1 : -1;

            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (
                (eras[i].since <= val && val <= eras[i].until) ||
                (eras[i].until <= val && val <= eras[i].since)
            ) {
                return (
                    (this.year() - hooks(eras[i].since).year()) * dir +
                    eras[i].offset
                );
            }
        }

        return this.year();
    }

    function erasNameRegex(isStrict) {
        if (!hasOwnProp(this, '_erasNameRegex')) {
            computeErasParse.call(this);
        }
        return isStrict ? this._erasNameRegex : this._erasRegex;
    }

    function erasAbbrRegex(isStrict) {
        if (!hasOwnProp(this, '_erasAbbrRegex')) {
            computeErasParse.call(this);
        }
        return isStrict ? this._erasAbbrRegex : this._erasRegex;
    }

    function erasNarrowRegex(isStrict) {
        if (!hasOwnProp(this, '_erasNarrowRegex')) {
            computeErasParse.call(this);
        }
        return isStrict ? this._erasNarrowRegex : this._erasRegex;
    }

    function matchEraAbbr(isStrict, locale) {
        return locale.erasAbbrRegex(isStrict);
    }

    function matchEraName(isStrict, locale) {
        return locale.erasNameRegex(isStrict);
    }

    function matchEraNarrow(isStrict, locale) {
        return locale.erasNarrowRegex(isStrict);
    }

    function matchEraYearOrdinal(isStrict, locale) {
        return locale._eraYearOrdinalRegex || matchUnsigned;
    }

    function computeErasParse() {
        var abbrPieces = [],
            namePieces = [],
            narrowPieces = [],
            mixedPieces = [],
            i,
            l,
            eras = this.eras();

        for (i = 0, l = eras.length; i < l; ++i) {
            namePieces.push(regexEscape(eras[i].name));
            abbrPieces.push(regexEscape(eras[i].abbr));
            narrowPieces.push(regexEscape(eras[i].narrow));

            mixedPieces.push(regexEscape(eras[i].name));
            mixedPieces.push(regexEscape(eras[i].abbr));
            mixedPieces.push(regexEscape(eras[i].narrow));
        }

        this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');
        this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');
        this._erasNarrowRegex = new RegExp(
            '^(' + narrowPieces.join('|') + ')',
            'i'
        );
    }

    // FORMATTING

    addFormatToken(0, ['gg', 2], 0, function () {
        return this.weekYear() % 100;
    });

    addFormatToken(0, ['GG', 2], 0, function () {
        return this.isoWeekYear() % 100;
    });

    function addWeekYearFormatToken(token, getter) {
        addFormatToken(0, [token, token.length], 0, getter);
    }

    addWeekYearFormatToken('gggg', 'weekYear');
    addWeekYearFormatToken('ggggg', 'weekYear');
    addWeekYearFormatToken('GGGG', 'isoWeekYear');
    addWeekYearFormatToken('GGGGG', 'isoWeekYear');

    // ALIASES

    addUnitAlias('weekYear', 'gg');
    addUnitAlias('isoWeekYear', 'GG');

    // PRIORITY

    addUnitPriority('weekYear', 1);
    addUnitPriority('isoWeekYear', 1);

    // PARSING

    addRegexToken('G', matchSigned);
    addRegexToken('g', matchSigned);
    addRegexToken('GG', match1to2, match2);
    addRegexToken('gg', match1to2, match2);
    addRegexToken('GGGG', match1to4, match4);
    addRegexToken('gggg', match1to4, match4);
    addRegexToken('GGGGG', match1to6, match6);
    addRegexToken('ggggg', match1to6, match6);

    addWeekParseToken(
        ['gggg', 'ggggg', 'GGGG', 'GGGGG'],
        function (input, week, config, token) {
            week[token.substr(0, 2)] = toInt(input);
        }
    );

    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
        week[token] = hooks.parseTwoDigitYear(input);
    });

    // MOMENTS

    function getSetWeekYear(input) {
        return getSetWeekYearHelper.call(
            this,
            input,
            this.week(),
            this.weekday(),
            this.localeData()._week.dow,
            this.localeData()._week.doy
        );
    }

    function getSetISOWeekYear(input) {
        return getSetWeekYearHelper.call(
            this,
            input,
            this.isoWeek(),
            this.isoWeekday(),
            1,
            4
        );
    }

    function getISOWeeksInYear() {
        return weeksInYear(this.year(), 1, 4);
    }

    function getISOWeeksInISOWeekYear() {
        return weeksInYear(this.isoWeekYear(), 1, 4);
    }

    function getWeeksInYear() {
        var weekInfo = this.localeData()._week;
        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
    }

    function getWeeksInWeekYear() {
        var weekInfo = this.localeData()._week;
        return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
    }

    function getSetWeekYearHelper(input, week, weekday, dow, doy) {
        var weeksTarget;
        if (input == null) {
            return weekOfYear(this, dow, doy).year;
        } else {
            weeksTarget = weeksInYear(input, dow, doy);
            if (week > weeksTarget) {
                week = weeksTarget;
            }
            return setWeekAll.call(this, input, week, weekday, dow, doy);
        }
    }

    function setWeekAll(weekYear, week, weekday, dow, doy) {
        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);

        this.year(date.getUTCFullYear());
        this.month(date.getUTCMonth());
        this.date(date.getUTCDate());
        return this;
    }

    // FORMATTING

    addFormatToken('Q', 0, 'Qo', 'quarter');

    // ALIASES

    addUnitAlias('quarter', 'Q');

    // PRIORITY

    addUnitPriority('quarter', 7);

    // PARSING

    addRegexToken('Q', match1);
    addParseToken('Q', function (input, array) {
        array[MONTH] = (toInt(input) - 1) * 3;
    });

    // MOMENTS

    function getSetQuarter(input) {
        return input == null
            ? Math.ceil((this.month() + 1) / 3)
            : this.month((input - 1) * 3 + (this.month() % 3));
    }

    // FORMATTING

    addFormatToken('D', ['DD', 2], 'Do', 'date');

    // ALIASES

    addUnitAlias('date', 'D');

    // PRIORITY
    addUnitPriority('date', 9);

    // PARSING

    addRegexToken('D', match1to2);
    addRegexToken('DD', match1to2, match2);
    addRegexToken('Do', function (isStrict, locale) {
        // TODO: Remove "ordinalParse" fallback in next major release.
        return isStrict
            ? locale._dayOfMonthOrdinalParse || locale._ordinalParse
            : locale._dayOfMonthOrdinalParseLenient;
    });

    addParseToken(['D', 'DD'], DATE);
    addParseToken('Do', function (input, array) {
        array[DATE] = toInt(input.match(match1to2)[0]);
    });

    // MOMENTS

    var getSetDayOfMonth = makeGetSet('Date', true);

    // FORMATTING

    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');

    // ALIASES

    addUnitAlias('dayOfYear', 'DDD');

    // PRIORITY
    addUnitPriority('dayOfYear', 4);

    // PARSING

    addRegexToken('DDD', match1to3);
    addRegexToken('DDDD', match3);
    addParseToken(['DDD', 'DDDD'], function (input, array, config) {
        config._dayOfYear = toInt(input);
    });

    // HELPERS

    // MOMENTS

    function getSetDayOfYear(input) {
        var dayOfYear =
            Math.round(
                (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5
            ) + 1;
        return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');
    }

    // FORMATTING

    addFormatToken('m', ['mm', 2], 0, 'minute');

    // ALIASES

    addUnitAlias('minute', 'm');

    // PRIORITY

    addUnitPriority('minute', 14);

    // PARSING

    addRegexToken('m', match1to2);
    addRegexToken('mm', match1to2, match2);
    addParseToken(['m', 'mm'], MINUTE);

    // MOMENTS

    var getSetMinute = makeGetSet('Minutes', false);

    // FORMATTING

    addFormatToken('s', ['ss', 2], 0, 'second');

    // ALIASES

    addUnitAlias('second', 's');

    // PRIORITY

    addUnitPriority('second', 15);

    // PARSING

    addRegexToken('s', match1to2);
    addRegexToken('ss', match1to2, match2);
    addParseToken(['s', 'ss'], SECOND);

    // MOMENTS

    var getSetSecond = makeGetSet('Seconds', false);

    // FORMATTING

    addFormatToken('S', 0, 0, function () {
        return ~~(this.millisecond() / 100);
    });

    addFormatToken(0, ['SS', 2], 0, function () {
        return ~~(this.millisecond() / 10);
    });

    addFormatToken(0, ['SSS', 3], 0, 'millisecond');
    addFormatToken(0, ['SSSS', 4], 0, function () {
        return this.millisecond() * 10;
    });
    addFormatToken(0, ['SSSSS', 5], 0, function () {
        return this.millisecond() * 100;
    });
    addFormatToken(0, ['SSSSSS', 6], 0, function () {
        return this.millisecond() * 1000;
    });
    addFormatToken(0, ['SSSSSSS', 7], 0, function () {
        return this.millisecond() * 10000;
    });
    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
        return this.millisecond() * 100000;
    });
    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
        return this.millisecond() * 1000000;
    });

    // ALIASES

    addUnitAlias('millisecond', 'ms');

    // PRIORITY

    addUnitPriority('millisecond', 16);

    // PARSING

    addRegexToken('S', match1to3, match1);
    addRegexToken('SS', match1to3, match2);
    addRegexToken('SSS', match1to3, match3);

    var token, getSetMillisecond;
    for (token = 'SSSS'; token.length <= 9; token += 'S') {
        addRegexToken(token, matchUnsigned);
    }

    function parseMs(input, array) {
        array[MILLISECOND] = toInt(('0.' + input) * 1000);
    }

    for (token = 'S'; token.length <= 9; token += 'S') {
        addParseToken(token, parseMs);
    }

    getSetMillisecond = makeGetSet('Milliseconds', false);

    // FORMATTING

    addFormatToken('z', 0, 0, 'zoneAbbr');
    addFormatToken('zz', 0, 0, 'zoneName');

    // MOMENTS

    function getZoneAbbr() {
        return this._isUTC ? 'UTC' : '';
    }

    function getZoneName() {
        return this._isUTC ? 'Coordinated Universal Time' : '';
    }

    var proto = Moment.prototype;

    proto.add = add;
    proto.calendar = calendar$1;
    proto.clone = clone;
    proto.diff = diff;
    proto.endOf = endOf;
    proto.format = format;
    proto.from = from;
    proto.fromNow = fromNow;
    proto.to = to;
    proto.toNow = toNow;
    proto.get = stringGet;
    proto.invalidAt = invalidAt;
    proto.isAfter = isAfter;
    proto.isBefore = isBefore;
    proto.isBetween = isBetween;
    proto.isSame = isSame;
    proto.isSameOrAfter = isSameOrAfter;
    proto.isSameOrBefore = isSameOrBefore;
    proto.isValid = isValid$2;
    proto.lang = lang;
    proto.locale = locale;
    proto.localeData = localeData;
    proto.max = prototypeMax;
    proto.min = prototypeMin;
    proto.parsingFlags = parsingFlags;
    proto.set = stringSet;
    proto.startOf = startOf;
    proto.subtract = subtract;
    proto.toArray = toArray;
    proto.toObject = toObject;
    proto.toDate = toDate;
    proto.toISOString = toISOString;
    proto.inspect = inspect;
    if (typeof Symbol !== 'undefined' && Symbol.for != null) {
        proto[Symbol.for('nodejs.util.inspect.custom')] = function () {
            return 'Moment<' + this.format() + '>';
        };
    }
    proto.toJSON = toJSON;
    proto.toString = toString;
    proto.unix = unix;
    proto.valueOf = valueOf;
    proto.creationData = creationData;
    proto.eraName = getEraName;
    proto.eraNarrow = getEraNarrow;
    proto.eraAbbr = getEraAbbr;
    proto.eraYear = getEraYear;
    proto.year = getSetYear;
    proto.isLeapYear = getIsLeapYear;
    proto.weekYear = getSetWeekYear;
    proto.isoWeekYear = getSetISOWeekYear;
    proto.quarter = proto.quarters = getSetQuarter;
    proto.month = getSetMonth;
    proto.daysInMonth = getDaysInMonth;
    proto.week = proto.weeks = getSetWeek;
    proto.isoWeek = proto.isoWeeks = getSetISOWeek;
    proto.weeksInYear = getWeeksInYear;
    proto.weeksInWeekYear = getWeeksInWeekYear;
    proto.isoWeeksInYear = getISOWeeksInYear;
    proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;
    proto.date = getSetDayOfMonth;
    proto.day = proto.days = getSetDayOfWeek;
    proto.weekday = getSetLocaleDayOfWeek;
    proto.isoWeekday = getSetISODayOfWeek;
    proto.dayOfYear = getSetDayOfYear;
    proto.hour = proto.hours = getSetHour;
    proto.minute = proto.minutes = getSetMinute;
    proto.second = proto.seconds = getSetSecond;
    proto.millisecond = proto.milliseconds = getSetMillisecond;
    proto.utcOffset = getSetOffset;
    proto.utc = setOffsetToUTC;
    proto.local = setOffsetToLocal;
    proto.parseZone = setOffsetToParsedOffset;
    proto.hasAlignedHourOffset = hasAlignedHourOffset;
    proto.isDST = isDaylightSavingTime;
    proto.isLocal = isLocal;
    proto.isUtcOffset = isUtcOffset;
    proto.isUtc = isUtc;
    proto.isUTC = isUtc;
    proto.zoneAbbr = getZoneAbbr;
    proto.zoneName = getZoneName;
    proto.dates = deprecate(
        'dates accessor is deprecated. Use date instead.',
        getSetDayOfMonth
    );
    proto.months = deprecate(
        'months accessor is deprecated. Use month instead',
        getSetMonth
    );
    proto.years = deprecate(
        'years accessor is deprecated. Use year instead',
        getSetYear
    );
    proto.zone = deprecate(
        'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',
        getSetZone
    );
    proto.isDSTShifted = deprecate(
        'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',
        isDaylightSavingTimeShifted
    );

    function createUnix(input) {
        return createLocal(input * 1000);
    }

    function createInZone() {
        return createLocal.apply(null, arguments).parseZone();
    }

    function preParsePostFormat(string) {
        return string;
    }

    var proto$1 = Locale.prototype;

    proto$1.calendar = calendar;
    proto$1.longDateFormat = longDateFormat;
    proto$1.invalidDate = invalidDate;
    proto$1.ordinal = ordinal;
    proto$1.preparse = preParsePostFormat;
    proto$1.postformat = preParsePostFormat;
    proto$1.relativeTime = relativeTime;
    proto$1.pastFuture = pastFuture;
    proto$1.set = set;
    proto$1.eras = localeEras;
    proto$1.erasParse = localeErasParse;
    proto$1.erasConvertYear = localeErasConvertYear;
    proto$1.erasAbbrRegex = erasAbbrRegex;
    proto$1.erasNameRegex = erasNameRegex;
    proto$1.erasNarrowRegex = erasNarrowRegex;

    proto$1.months = localeMonths;
    proto$1.monthsShort = localeMonthsShort;
    proto$1.monthsParse = localeMonthsParse;
    proto$1.monthsRegex = monthsRegex;
    proto$1.monthsShortRegex = monthsShortRegex;
    proto$1.week = localeWeek;
    proto$1.firstDayOfYear = localeFirstDayOfYear;
    proto$1.firstDayOfWeek = localeFirstDayOfWeek;

    proto$1.weekdays = localeWeekdays;
    proto$1.weekdaysMin = localeWeekdaysMin;
    proto$1.weekdaysShort = localeWeekdaysShort;
    proto$1.weekdaysParse = localeWeekdaysParse;

    proto$1.weekdaysRegex = weekdaysRegex;
    proto$1.weekdaysShortRegex = weekdaysShortRegex;
    proto$1.weekdaysMinRegex = weekdaysMinRegex;

    proto$1.isPM = localeIsPM;
    proto$1.meridiem = localeMeridiem;

    function get$1(format, index, field, setter) {
        var locale = getLocale(),
            utc = createUTC().set(setter, index);
        return locale[field](utc, format);
    }

    function listMonthsImpl(format, index, field) {
        if (isNumber(format)) {
            index = format;
            format = undefined;
        }

        format = format || '';

        if (index != null) {
            return get$1(format, index, field, 'month');
        }

        var i,
            out = [];
        for (i = 0; i < 12; i++) {
            out[i] = get$1(format, i, field, 'month');
        }
        return out;
    }

    // ()
    // (5)
    // (fmt, 5)
    // (fmt)
    // (true)
    // (true, 5)
    // (true, fmt, 5)
    // (true, fmt)
    function listWeekdaysImpl(localeSorted, format, index, field) {
        if (typeof localeSorted === 'boolean') {
            if (isNumber(format)) {
                index = format;
                format = undefined;
            }

            format = format || '';
        } else {
            format = localeSorted;
            index = format;
            localeSorted = false;

            if (isNumber(format)) {
                index = format;
                format = undefined;
            }

            format = format || '';
        }

        var locale = getLocale(),
            shift = localeSorted ? locale._week.dow : 0,
            i,
            out = [];

        if (index != null) {
            return get$1(format, (index + shift) % 7, field, 'day');
        }

        for (i = 0; i < 7; i++) {
            out[i] = get$1(format, (i + shift) % 7, field, 'day');
        }
        return out;
    }

    function listMonths(format, index) {
        return listMonthsImpl(format, index, 'months');
    }

    function listMonthsShort(format, index) {
        return listMonthsImpl(format, index, 'monthsShort');
    }

    function listWeekdays(localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
    }

    function listWeekdaysShort(localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
    }

    function listWeekdaysMin(localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
    }

    getSetGlobalLocale('en', {
        eras: [
            {
                since: '0001-01-01',
                until: +Infinity,
                offset: 1,
                name: 'Anno Domini',
                narrow: 'AD',
                abbr: 'AD',
            },
            {
                since: '0000-12-31',
                until: -Infinity,
                offset: 1,
                name: 'Before Christ',
                narrow: 'BC',
                abbr: 'BC',
            },
        ],
        dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    toInt((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
    });

    // Side effect imports

    hooks.lang = deprecate(
        'moment.lang is deprecated. Use moment.locale instead.',
        getSetGlobalLocale
    );
    hooks.langData = deprecate(
        'moment.langData is deprecated. Use moment.localeData instead.',
        getLocale
    );

    var mathAbs = Math.abs;

    function abs() {
        var data = this._data;

        this._milliseconds = mathAbs(this._milliseconds);
        this._days = mathAbs(this._days);
        this._months = mathAbs(this._months);

        data.milliseconds = mathAbs(data.milliseconds);
        data.seconds = mathAbs(data.seconds);
        data.minutes = mathAbs(data.minutes);
        data.hours = mathAbs(data.hours);
        data.months = mathAbs(data.months);
        data.years = mathAbs(data.years);

        return this;
    }

    function addSubtract$1(duration, input, value, direction) {
        var other = createDuration(input, value);

        duration._milliseconds += direction * other._milliseconds;
        duration._days += direction * other._days;
        duration._months += direction * other._months;

        return duration._bubble();
    }

    // supports only 2.0-style add(1, 's') or add(duration)
    function add$1(input, value) {
        return addSubtract$1(this, input, value, 1);
    }

    // supports only 2.0-style subtract(1, 's') or subtract(duration)
    function subtract$1(input, value) {
        return addSubtract$1(this, input, value, -1);
    }

    function absCeil(number) {
        if (number < 0) {
            return Math.floor(number);
        } else {
            return Math.ceil(number);
        }
    }

    function bubble() {
        var milliseconds = this._milliseconds,
            days = this._days,
            months = this._months,
            data = this._data,
            seconds,
            minutes,
            hours,
            years,
            monthsFromDays;

        // if we have a mix of positive and negative values, bubble down first
        // check: https://github.com/moment/moment/issues/2166
        if (
            !(
                (milliseconds >= 0 && days >= 0 && months >= 0) ||
                (milliseconds <= 0 && days <= 0 && months <= 0)
            )
        ) {
            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
            days = 0;
            months = 0;
        }

        // The following code bubbles up values, see the tests for
        // examples of what that means.
        data.milliseconds = milliseconds % 1000;

        seconds = absFloor(milliseconds / 1000);
        data.seconds = seconds % 60;

        minutes = absFloor(seconds / 60);
        data.minutes = minutes % 60;

        hours = absFloor(minutes / 60);
        data.hours = hours % 24;

        days += absFloor(hours / 24);

        // convert days to months
        monthsFromDays = absFloor(daysToMonths(days));
        months += monthsFromDays;
        days -= absCeil(monthsToDays(monthsFromDays));

        // 12 months -> 1 year
        years = absFloor(months / 12);
        months %= 12;

        data.days = days;
        data.months = months;
        data.years = years;

        return this;
    }

    function daysToMonths(days) {
        // 400 years have 146097 days (taking into account leap year rules)
        // 400 years have 12 months === 4800
        return (days * 4800) / 146097;
    }

    function monthsToDays(months) {
        // the reverse of daysToMonths
        return (months * 146097) / 4800;
    }

    function as(units) {
        if (!this.isValid()) {
            return NaN;
        }
        var days,
            months,
            milliseconds = this._milliseconds;

        units = normalizeUnits(units);

        if (units === 'month' || units === 'quarter' || units === 'year') {
            days = this._days + milliseconds / 864e5;
            months = this._months + daysToMonths(days);
            switch (units) {
                case 'month':
                    return months;
                case 'quarter':
                    return months / 3;
                case 'year':
                    return months / 12;
            }
        } else {
            // handle milliseconds separately because of floating point math errors (issue #1867)
            days = this._days + Math.round(monthsToDays(this._months));
            switch (units) {
                case 'week':
                    return days / 7 + milliseconds / 6048e5;
                case 'day':
                    return days + milliseconds / 864e5;
                case 'hour':
                    return days * 24 + milliseconds / 36e5;
                case 'minute':
                    return days * 1440 + milliseconds / 6e4;
                case 'second':
                    return days * 86400 + milliseconds / 1000;
                // Math.floor prevents floating point math errors here
                case 'millisecond':
                    return Math.floor(days * 864e5) + milliseconds;
                default:
                    throw new Error('Unknown unit ' + units);
            }
        }
    }

    // TODO: Use this.as('ms')?
    function valueOf$1() {
        if (!this.isValid()) {
            return NaN;
        }
        return (
            this._milliseconds +
            this._days * 864e5 +
            (this._months % 12) * 2592e6 +
            toInt(this._months / 12) * 31536e6
        );
    }

    function makeAs(alias) {
        return function () {
            return this.as(alias);
        };
    }

    var asMilliseconds = makeAs('ms'),
        asSeconds = makeAs('s'),
        asMinutes = makeAs('m'),
        asHours = makeAs('h'),
        asDays = makeAs('d'),
        asWeeks = makeAs('w'),
        asMonths = makeAs('M'),
        asQuarters = makeAs('Q'),
        asYears = makeAs('y');

    function clone$1() {
        return createDuration(this);
    }

    function get$2(units) {
        units = normalizeUnits(units);
        return this.isValid() ? this[units + 's']() : NaN;
    }

    function makeGetter(name) {
        return function () {
            return this.isValid() ? this._data[name] : NaN;
        };
    }

    var milliseconds = makeGetter('milliseconds'),
        seconds = makeGetter('seconds'),
        minutes = makeGetter('minutes'),
        hours = makeGetter('hours'),
        days = makeGetter('days'),
        months = makeGetter('months'),
        years = makeGetter('years');

    function weeks() {
        return absFloor(this.days() / 7);
    }

    var round = Math.round,
        thresholds = {
            ss: 44, // a few seconds to seconds
            s: 45, // seconds to minute
            m: 45, // minutes to hour
            h: 22, // hours to day
            d: 26, // days to month/week
            w: null, // weeks to month
            M: 11, // months to year
        };

    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
    }

    function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {
        var duration = createDuration(posNegDuration).abs(),
            seconds = round(duration.as('s')),
            minutes = round(duration.as('m')),
            hours = round(duration.as('h')),
            days = round(duration.as('d')),
            months = round(duration.as('M')),
            weeks = round(duration.as('w')),
            years = round(duration.as('y')),
            a =
                (seconds <= thresholds.ss && ['s', seconds]) ||
                (seconds < thresholds.s && ['ss', seconds]) ||
                (minutes <= 1 && ['m']) ||
                (minutes < thresholds.m && ['mm', minutes]) ||
                (hours <= 1 && ['h']) ||
                (hours < thresholds.h && ['hh', hours]) ||
                (days <= 1 && ['d']) ||
                (days < thresholds.d && ['dd', days]);

        if (thresholds.w != null) {
            a =
                a ||
                (weeks <= 1 && ['w']) ||
                (weeks < thresholds.w && ['ww', weeks]);
        }
        a = a ||
            (months <= 1 && ['M']) ||
            (months < thresholds.M && ['MM', months]) ||
            (years <= 1 && ['y']) || ['yy', years];

        a[2] = withoutSuffix;
        a[3] = +posNegDuration > 0;
        a[4] = locale;
        return substituteTimeAgo.apply(null, a);
    }

    // This function allows you to set the rounding function for relative time strings
    function getSetRelativeTimeRounding(roundingFunction) {
        if (roundingFunction === undefined) {
            return round;
        }
        if (typeof roundingFunction === 'function') {
            round = roundingFunction;
            return true;
        }
        return false;
    }

    // This function allows you to set a threshold for relative time strings
    function getSetRelativeTimeThreshold(threshold, limit) {
        if (thresholds[threshold] === undefined) {
            return false;
        }
        if (limit === undefined) {
            return thresholds[threshold];
        }
        thresholds[threshold] = limit;
        if (threshold === 's') {
            thresholds.ss = limit - 1;
        }
        return true;
    }

    function humanize(argWithSuffix, argThresholds) {
        if (!this.isValid()) {
            return this.localeData().invalidDate();
        }

        var withSuffix = false,
            th = thresholds,
            locale,
            output;

        if (typeof argWithSuffix === 'object') {
            argThresholds = argWithSuffix;
            argWithSuffix = false;
        }
        if (typeof argWithSuffix === 'boolean') {
            withSuffix = argWithSuffix;
        }
        if (typeof argThresholds === 'object') {
            th = Object.assign({}, thresholds, argThresholds);
            if (argThresholds.s != null && argThresholds.ss == null) {
                th.ss = argThresholds.s - 1;
            }
        }

        locale = this.localeData();
        output = relativeTime$1(this, !withSuffix, th, locale);

        if (withSuffix) {
            output = locale.pastFuture(+this, output);
        }

        return locale.postformat(output);
    }

    var abs$1 = Math.abs;

    function sign(x) {
        return (x > 0) - (x < 0) || +x;
    }

    function toISOString$1() {
        // for ISO strings we do not use the normal bubbling rules:
        //  * milliseconds bubble up until they become hours
        //  * days do not bubble at all
        //  * months bubble up until they become years
        // This is because there is no context-free conversion between hours and days
        // (think of clock changes)
        // and also not between days and months (28-31 days per month)
        if (!this.isValid()) {
            return this.localeData().invalidDate();
        }

        var seconds = abs$1(this._milliseconds) / 1000,
            days = abs$1(this._days),
            months = abs$1(this._months),
            minutes,
            hours,
            years,
            s,
            total = this.asSeconds(),
            totalSign,
            ymSign,
            daysSign,
            hmsSign;

        if (!total) {
            // this is the same as C#'s (Noda) and python (isodate)...
            // but not other JS (goog.date)
            return 'P0D';
        }

        // 3600 seconds -> 60 minutes -> 1 hour
        minutes = absFloor(seconds / 60);
        hours = absFloor(minutes / 60);
        seconds %= 60;
        minutes %= 60;

        // 12 months -> 1 year
        years = absFloor(months / 12);
        months %= 12;

        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
        s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';

        totalSign = total < 0 ? '-' : '';
        ymSign = sign(this._months) !== sign(total) ? '-' : '';
        daysSign = sign(this._days) !== sign(total) ? '-' : '';
        hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';

        return (
            totalSign +
            'P' +
            (years ? ymSign + years + 'Y' : '') +
            (months ? ymSign + months + 'M' : '') +
            (days ? daysSign + days + 'D' : '') +
            (hours || minutes || seconds ? 'T' : '') +
            (hours ? hmsSign + hours + 'H' : '') +
            (minutes ? hmsSign + minutes + 'M' : '') +
            (seconds ? hmsSign + s + 'S' : '')
        );
    }

    var proto$2 = Duration.prototype;

    proto$2.isValid = isValid$1;
    proto$2.abs = abs;
    proto$2.add = add$1;
    proto$2.subtract = subtract$1;
    proto$2.as = as;
    proto$2.asMilliseconds = asMilliseconds;
    proto$2.asSeconds = asSeconds;
    proto$2.asMinutes = asMinutes;
    proto$2.asHours = asHours;
    proto$2.asDays = asDays;
    proto$2.asWeeks = asWeeks;
    proto$2.asMonths = asMonths;
    proto$2.asQuarters = asQuarters;
    proto$2.asYears = asYears;
    proto$2.valueOf = valueOf$1;
    proto$2._bubble = bubble;
    proto$2.clone = clone$1;
    proto$2.get = get$2;
    proto$2.milliseconds = milliseconds;
    proto$2.seconds = seconds;
    proto$2.minutes = minutes;
    proto$2.hours = hours;
    proto$2.days = days;
    proto$2.weeks = weeks;
    proto$2.months = months;
    proto$2.years = years;
    proto$2.humanize = humanize;
    proto$2.toISOString = toISOString$1;
    proto$2.toString = toISOString$1;
    proto$2.toJSON = toISOString$1;
    proto$2.locale = locale;
    proto$2.localeData = localeData;

    proto$2.toIsoString = deprecate(
        'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',
        toISOString$1
    );
    proto$2.lang = lang;

    // FORMATTING

    addFormatToken('X', 0, 0, 'unix');
    addFormatToken('x', 0, 0, 'valueOf');

    // PARSING

    addRegexToken('x', matchSigned);
    addRegexToken('X', matchTimestamp);
    addParseToken('X', function (input, array, config) {
        config._d = new Date(parseFloat(input) * 1000);
    });
    addParseToken('x', function (input, array, config) {
        config._d = new Date(toInt(input));
    });

    //! moment.js

    hooks.version = '2.29.3';

    setHookCallback(createLocal);

    hooks.fn = proto;
    hooks.min = min;
    hooks.max = max;
    hooks.now = now;
    hooks.utc = createUTC;
    hooks.unix = createUnix;
    hooks.months = listMonths;
    hooks.isDate = isDate;
    hooks.locale = getSetGlobalLocale;
    hooks.invalid = createInvalid;
    hooks.duration = createDuration;
    hooks.isMoment = isMoment;
    hooks.weekdays = listWeekdays;
    hooks.parseZone = createInZone;
    hooks.localeData = getLocale;
    hooks.isDuration = isDuration;
    hooks.monthsShort = listMonthsShort;
    hooks.weekdaysMin = listWeekdaysMin;
    hooks.defineLocale = defineLocale;
    hooks.updateLocale = updateLocale;
    hooks.locales = listLocales;
    hooks.weekdaysShort = listWeekdaysShort;
    hooks.normalizeUnits = normalizeUnits;
    hooks.relativeTimeRounding = getSetRelativeTimeRounding;
    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
    hooks.calendarFormat = getCalendarFormat;
    hooks.prototype = proto;

    // currently HTML5 input type only supports 24-hour formats
    hooks.HTML5_FMT = {
        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
        DATE: 'YYYY-MM-DD', // <input type="date" />
        TIME: 'HH:mm', // <input type="time" />
        TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
        TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
        WEEK: 'GGGG-[W]WW', // <input type="week" />
        MONTH: 'YYYY-MM', // <input type="month" />
    };

    return hooks;

})));

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/aes.js":[function(require,module,exports){
/**
 * Advanced Encryption Standard (AES) implementation.
 *
 * This implementation is based on the public domain library 'jscrypto' which
 * was written by:
 *
 * Emily Stark (estark@stanford.edu)
 * Mike Hamburg (mhamburg@stanford.edu)
 * Dan Boneh (dabo@cs.stanford.edu)
 *
 * Parts of this code are based on the OpenSSL implementation of AES:
 * http://www.openssl.org
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2014 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./cipher');
require('./cipherModes');
require('./util');

/* AES API */
module.exports = forge.aes = forge.aes || {};

/**
 * Deprecated. Instead, use:
 *
 * var cipher = forge.cipher.createCipher('AES-<mode>', key);
 * cipher.start({iv: iv});
 *
 * Creates an AES cipher object to encrypt data using the given symmetric key.
 * The output will be stored in the 'output' member of the returned cipher.
 *
 * The key and iv may be given as a string of bytes, an array of bytes,
 * a byte buffer, or an array of 32-bit words.
 *
 * @param key the symmetric key to use.
 * @param iv the initialization vector to use.
 * @param output the buffer to write to, null to create one.
 * @param mode the cipher mode to use (default: 'CBC').
 *
 * @return the cipher.
 */
forge.aes.startEncrypting = function(key, iv, output, mode) {
  var cipher = _createCipher({
    key: key,
    output: output,
    decrypt: false,
    mode: mode
  });
  cipher.start(iv);
  return cipher;
};

/**
 * Deprecated. Instead, use:
 *
 * var cipher = forge.cipher.createCipher('AES-<mode>', key);
 *
 * Creates an AES cipher object to encrypt data using the given symmetric key.
 *
 * The key may be given as a string of bytes, an array of bytes, a
 * byte buffer, or an array of 32-bit words.
 *
 * @param key the symmetric key to use.
 * @param mode the cipher mode to use (default: 'CBC').
 *
 * @return the cipher.
 */
forge.aes.createEncryptionCipher = function(key, mode) {
  return _createCipher({
    key: key,
    output: null,
    decrypt: false,
    mode: mode
  });
};

/**
 * Deprecated. Instead, use:
 *
 * var decipher = forge.cipher.createDecipher('AES-<mode>', key);
 * decipher.start({iv: iv});
 *
 * Creates an AES cipher object to decrypt data using the given symmetric key.
 * The output will be stored in the 'output' member of the returned cipher.
 *
 * The key and iv may be given as a string of bytes, an array of bytes,
 * a byte buffer, or an array of 32-bit words.
 *
 * @param key the symmetric key to use.
 * @param iv the initialization vector to use.
 * @param output the buffer to write to, null to create one.
 * @param mode the cipher mode to use (default: 'CBC').
 *
 * @return the cipher.
 */
forge.aes.startDecrypting = function(key, iv, output, mode) {
  var cipher = _createCipher({
    key: key,
    output: output,
    decrypt: true,
    mode: mode
  });
  cipher.start(iv);
  return cipher;
};

/**
 * Deprecated. Instead, use:
 *
 * var decipher = forge.cipher.createDecipher('AES-<mode>', key);
 *
 * Creates an AES cipher object to decrypt data using the given symmetric key.
 *
 * The key may be given as a string of bytes, an array of bytes, a
 * byte buffer, or an array of 32-bit words.
 *
 * @param key the symmetric key to use.
 * @param mode the cipher mode to use (default: 'CBC').
 *
 * @return the cipher.
 */
forge.aes.createDecryptionCipher = function(key, mode) {
  return _createCipher({
    key: key,
    output: null,
    decrypt: true,
    mode: mode
  });
};

/**
 * Creates a new AES cipher algorithm object.
 *
 * @param name the name of the algorithm.
 * @param mode the mode factory function.
 *
 * @return the AES algorithm object.
 */
forge.aes.Algorithm = function(name, mode) {
  if(!init) {
    initialize();
  }
  var self = this;
  self.name = name;
  self.mode = new mode({
    blockSize: 16,
    cipher: {
      encrypt: function(inBlock, outBlock) {
        return _updateBlock(self._w, inBlock, outBlock, false);
      },
      decrypt: function(inBlock, outBlock) {
        return _updateBlock(self._w, inBlock, outBlock, true);
      }
    }
  });
  self._init = false;
};

/**
 * Initializes this AES algorithm by expanding its key.
 *
 * @param options the options to use.
 *          key the key to use with this algorithm.
 *          decrypt true if the algorithm should be initialized for decryption,
 *            false for encryption.
 */
forge.aes.Algorithm.prototype.initialize = function(options) {
  if(this._init) {
    return;
  }

  var key = options.key;
  var tmp;

  /* Note: The key may be a string of bytes, an array of bytes, a byte
    buffer, or an array of 32-bit integers. If the key is in bytes, then
    it must be 16, 24, or 32 bytes in length. If it is in 32-bit
    integers, it must be 4, 6, or 8 integers long. */

  if(typeof key === 'string' &&
    (key.length === 16 || key.length === 24 || key.length === 32)) {
    // convert key string into byte buffer
    key = forge.util.createBuffer(key);
  } else if(forge.util.isArray(key) &&
    (key.length === 16 || key.length === 24 || key.length === 32)) {
    // convert key integer array into byte buffer
    tmp = key;
    key = forge.util.createBuffer();
    for(var i = 0; i < tmp.length; ++i) {
      key.putByte(tmp[i]);
    }
  }

  // convert key byte buffer into 32-bit integer array
  if(!forge.util.isArray(key)) {
    tmp = key;
    key = [];

    // key lengths of 16, 24, 32 bytes allowed
    var len = tmp.length();
    if(len === 16 || len === 24 || len === 32) {
      len = len >>> 2;
      for(var i = 0; i < len; ++i) {
        key.push(tmp.getInt32());
      }
    }
  }

  // key must be an array of 32-bit integers by now
  if(!forge.util.isArray(key) ||
    !(key.length === 4 || key.length === 6 || key.length === 8)) {
    throw new Error('Invalid key parameter.');
  }

  // encryption operation is always used for these modes
  var mode = this.mode.name;
  var encryptOp = (['CFB', 'OFB', 'CTR', 'GCM'].indexOf(mode) !== -1);

  // do key expansion
  this._w = _expandKey(key, options.decrypt && !encryptOp);
  this._init = true;
};

/**
 * Expands a key. Typically only used for testing.
 *
 * @param key the symmetric key to expand, as an array of 32-bit words.
 * @param decrypt true to expand for decryption, false for encryption.
 *
 * @return the expanded key.
 */
forge.aes._expandKey = function(key, decrypt) {
  if(!init) {
    initialize();
  }
  return _expandKey(key, decrypt);
};

/**
 * Updates a single block. Typically only used for testing.
 *
 * @param w the expanded key to use.
 * @param input an array of block-size 32-bit words.
 * @param output an array of block-size 32-bit words.
 * @param decrypt true to decrypt, false to encrypt.
 */
forge.aes._updateBlock = _updateBlock;

/** Register AES algorithms **/

registerAlgorithm('AES-ECB', forge.cipher.modes.ecb);
registerAlgorithm('AES-CBC', forge.cipher.modes.cbc);
registerAlgorithm('AES-CFB', forge.cipher.modes.cfb);
registerAlgorithm('AES-OFB', forge.cipher.modes.ofb);
registerAlgorithm('AES-CTR', forge.cipher.modes.ctr);
registerAlgorithm('AES-GCM', forge.cipher.modes.gcm);

function registerAlgorithm(name, mode) {
  var factory = function() {
    return new forge.aes.Algorithm(name, mode);
  };
  forge.cipher.registerAlgorithm(name, factory);
}

/** AES implementation **/

var init = false; // not yet initialized
var Nb = 4;       // number of words comprising the state (AES = 4)
var sbox;         // non-linear substitution table used in key expansion
var isbox;        // inversion of sbox
var rcon;         // round constant word array
var mix;          // mix-columns table
var imix;         // inverse mix-columns table

/**
 * Performs initialization, ie: precomputes tables to optimize for speed.
 *
 * One way to understand how AES works is to imagine that 'addition' and
 * 'multiplication' are interfaces that require certain mathematical
 * properties to hold true (ie: they are associative) but they might have
 * different implementations and produce different kinds of results ...
 * provided that their mathematical properties remain true. AES defines
 * its own methods of addition and multiplication but keeps some important
 * properties the same, ie: associativity and distributivity. The
 * explanation below tries to shed some light on how AES defines addition
 * and multiplication of bytes and 32-bit words in order to perform its
 * encryption and decryption algorithms.
 *
 * The basics:
 *
 * The AES algorithm views bytes as binary representations of polynomials
 * that have either 1 or 0 as the coefficients. It defines the addition
 * or subtraction of two bytes as the XOR operation. It also defines the
 * multiplication of two bytes as a finite field referred to as GF(2^8)
 * (Note: 'GF' means "Galois Field" which is a field that contains a finite
 * number of elements so GF(2^8) has 256 elements).
 *
 * This means that any two bytes can be represented as binary polynomials;
 * when they multiplied together and modularly reduced by an irreducible
 * polynomial of the 8th degree, the results are the field GF(2^8). The
 * specific irreducible polynomial that AES uses in hexadecimal is 0x11b.
 * This multiplication is associative with 0x01 as the identity:
 *
 * (b * 0x01 = GF(b, 0x01) = b).
 *
 * The operation GF(b, 0x02) can be performed at the byte level by left
 * shifting b once and then XOR'ing it (to perform the modular reduction)
 * with 0x11b if b is >= 128. Repeated application of the multiplication
 * of 0x02 can be used to implement the multiplication of any two bytes.
 *
 * For instance, multiplying 0x57 and 0x13, denoted as GF(0x57, 0x13), can
 * be performed by factoring 0x13 into 0x01, 0x02, and 0x10. Then these
 * factors can each be multiplied by 0x57 and then added together. To do
 * the multiplication, values for 0x57 multiplied by each of these 3 factors
 * can be precomputed and stored in a table. To add them, the values from
 * the table are XOR'd together.
 *
 * AES also defines addition and multiplication of words, that is 4-byte
 * numbers represented as polynomials of 3 degrees where the coefficients
 * are the values of the bytes.
 *
 * The word [a0, a1, a2, a3] is a polynomial a3x^3 + a2x^2 + a1x + a0.
 *
 * Addition is performed by XOR'ing like powers of x. Multiplication
 * is performed in two steps, the first is an algebriac expansion as
 * you would do normally (where addition is XOR). But the result is
 * a polynomial larger than 3 degrees and thus it cannot fit in a word. So
 * next the result is modularly reduced by an AES-specific polynomial of
 * degree 4 which will always produce a polynomial of less than 4 degrees
 * such that it will fit in a word. In AES, this polynomial is x^4 + 1.
 *
 * The modular product of two polynomials 'a' and 'b' is thus:
 *
 * d(x) = d3x^3 + d2x^2 + d1x + d0
 * with
 * d0 = GF(a0, b0) ^ GF(a3, b1) ^ GF(a2, b2) ^ GF(a1, b3)
 * d1 = GF(a1, b0) ^ GF(a0, b1) ^ GF(a3, b2) ^ GF(a2, b3)
 * d2 = GF(a2, b0) ^ GF(a1, b1) ^ GF(a0, b2) ^ GF(a3, b3)
 * d3 = GF(a3, b0) ^ GF(a2, b1) ^ GF(a1, b2) ^ GF(a0, b3)
 *
 * As a matrix:
 *
 * [d0] = [a0 a3 a2 a1][b0]
 * [d1]   [a1 a0 a3 a2][b1]
 * [d2]   [a2 a1 a0 a3][b2]
 * [d3]   [a3 a2 a1 a0][b3]
 *
 * Special polynomials defined by AES (0x02 == {02}):
 * a(x)    = {03}x^3 + {01}x^2 + {01}x + {02}
 * a^-1(x) = {0b}x^3 + {0d}x^2 + {09}x + {0e}.
 *
 * These polynomials are used in the MixColumns() and InverseMixColumns()
 * operations, respectively, to cause each element in the state to affect
 * the output (referred to as diffusing).
 *
 * RotWord() uses: a0 = a1 = a2 = {00} and a3 = {01}, which is the
 * polynomial x3.
 *
 * The ShiftRows() method modifies the last 3 rows in the state (where
 * the state is 4 words with 4 bytes per word) by shifting bytes cyclically.
 * The 1st byte in the second row is moved to the end of the row. The 1st
 * and 2nd bytes in the third row are moved to the end of the row. The 1st,
 * 2nd, and 3rd bytes are moved in the fourth row.
 *
 * More details on how AES arithmetic works:
 *
 * In the polynomial representation of binary numbers, XOR performs addition
 * and subtraction and multiplication in GF(2^8) denoted as GF(a, b)
 * corresponds with the multiplication of polynomials modulo an irreducible
 * polynomial of degree 8. In other words, for AES, GF(a, b) will multiply
 * polynomial 'a' with polynomial 'b' and then do a modular reduction by
 * an AES-specific irreducible polynomial of degree 8.
 *
 * A polynomial is irreducible if its only divisors are one and itself. For
 * the AES algorithm, this irreducible polynomial is:
 *
 * m(x) = x^8 + x^4 + x^3 + x + 1,
 *
 * or {01}{1b} in hexadecimal notation, where each coefficient is a bit:
 * 100011011 = 283 = 0x11b.
 *
 * For example, GF(0x57, 0x83) = 0xc1 because
 *
 * 0x57 = 87  = 01010111 = x^6 + x^4 + x^2 + x + 1
 * 0x85 = 131 = 10000101 = x^7 + x + 1
 *
 * (x^6 + x^4 + x^2 + x + 1) * (x^7 + x + 1)
 * =  x^13 + x^11 + x^9 + x^8 + x^7 +
 *    x^7 + x^5 + x^3 + x^2 + x +
 *    x^6 + x^4 + x^2 + x + 1
 * =  x^13 + x^11 + x^9 + x^8 + x^6 + x^5 + x^4 + x^3 + 1 = y
 *    y modulo (x^8 + x^4 + x^3 + x + 1)
 * =  x^7 + x^6 + 1.
 *
 * The modular reduction by m(x) guarantees the result will be a binary
 * polynomial of less than degree 8, so that it can fit in a byte.
 *
 * The operation to multiply a binary polynomial b with x (the polynomial
 * x in binary representation is 00000010) is:
 *
 * b_7x^8 + b_6x^7 + b_5x^6 + b_4x^5 + b_3x^4 + b_2x^3 + b_1x^2 + b_0x^1
 *
 * To get GF(b, x) we must reduce that by m(x). If b_7 is 0 (that is the
 * most significant bit is 0 in b) then the result is already reduced. If
 * it is 1, then we can reduce it by subtracting m(x) via an XOR.
 *
 * It follows that multiplication by x (00000010 or 0x02) can be implemented
 * by performing a left shift followed by a conditional bitwise XOR with
 * 0x1b. This operation on bytes is denoted by xtime(). Multiplication by
 * higher powers of x can be implemented by repeated application of xtime().
 *
 * By adding intermediate results, multiplication by any constant can be
 * implemented. For instance:
 *
 * GF(0x57, 0x13) = 0xfe because:
 *
 * xtime(b) = (b & 128) ? (b << 1 ^ 0x11b) : (b << 1)
 *
 * Note: We XOR with 0x11b instead of 0x1b because in javascript our
 * datatype for b can be larger than 1 byte, so a left shift will not
 * automatically eliminate bits that overflow a byte ... by XOR'ing the
 * overflow bit with 1 (the extra one from 0x11b) we zero it out.
 *
 * GF(0x57, 0x02) = xtime(0x57) = 0xae
 * GF(0x57, 0x04) = xtime(0xae) = 0x47
 * GF(0x57, 0x08) = xtime(0x47) = 0x8e
 * GF(0x57, 0x10) = xtime(0x8e) = 0x07
 *
 * GF(0x57, 0x13) = GF(0x57, (0x01 ^ 0x02 ^ 0x10))
 *
 * And by the distributive property (since XOR is addition and GF() is
 * multiplication):
 *
 * = GF(0x57, 0x01) ^ GF(0x57, 0x02) ^ GF(0x57, 0x10)
 * = 0x57 ^ 0xae ^ 0x07
 * = 0xfe.
 */
function initialize() {
  init = true;

  /* Populate the Rcon table. These are the values given by
    [x^(i-1),{00},{00},{00}] where x^(i-1) are powers of x (and x = 0x02)
    in the field of GF(2^8), where i starts at 1.

    rcon[0] = [0x00, 0x00, 0x00, 0x00]
    rcon[1] = [0x01, 0x00, 0x00, 0x00] 2^(1-1) = 2^0 = 1
    rcon[2] = [0x02, 0x00, 0x00, 0x00] 2^(2-1) = 2^1 = 2
    ...
    rcon[9]  = [0x1B, 0x00, 0x00, 0x00] 2^(9-1)  = 2^8 = 0x1B
    rcon[10] = [0x36, 0x00, 0x00, 0x00] 2^(10-1) = 2^9 = 0x36

    We only store the first byte because it is the only one used.
  */
  rcon = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36];

  // compute xtime table which maps i onto GF(i, 0x02)
  var xtime = new Array(256);
  for(var i = 0; i < 128; ++i) {
    xtime[i] = i << 1;
    xtime[i + 128] = (i + 128) << 1 ^ 0x11B;
  }

  // compute all other tables
  sbox = new Array(256);
  isbox = new Array(256);
  mix = new Array(4);
  imix = new Array(4);
  for(var i = 0; i < 4; ++i) {
    mix[i] = new Array(256);
    imix[i] = new Array(256);
  }
  var e = 0, ei = 0, e2, e4, e8, sx, sx2, me, ime;
  for(var i = 0; i < 256; ++i) {
    /* We need to generate the SubBytes() sbox and isbox tables so that
      we can perform byte substitutions. This requires us to traverse
      all of the elements in GF, find their multiplicative inverses,
      and apply to each the following affine transformation:

      bi' = bi ^ b(i + 4) mod 8 ^ b(i + 5) mod 8 ^ b(i + 6) mod 8 ^
            b(i + 7) mod 8 ^ ci
      for 0 <= i < 8, where bi is the ith bit of the byte, and ci is the
      ith bit of a byte c with the value {63} or {01100011}.

      It is possible to traverse every possible value in a Galois field
      using what is referred to as a 'generator'. There are many
      generators (128 out of 256): 3,5,6,9,11,82 to name a few. To fully
      traverse GF we iterate 255 times, multiplying by our generator
      each time.

      On each iteration we can determine the multiplicative inverse for
      the current element.

      Suppose there is an element in GF 'e'. For a given generator 'g',
      e = g^x. The multiplicative inverse of e is g^(255 - x). It turns
      out that if use the inverse of a generator as another generator
      it will produce all of the corresponding multiplicative inverses
      at the same time. For this reason, we choose 5 as our inverse
      generator because it only requires 2 multiplies and 1 add and its
      inverse, 82, requires relatively few operations as well.

      In order to apply the affine transformation, the multiplicative
      inverse 'ei' of 'e' can be repeatedly XOR'd (4 times) with a
      bit-cycling of 'ei'. To do this 'ei' is first stored in 's' and
      'x'. Then 's' is left shifted and the high bit of 's' is made the
      low bit. The resulting value is stored in 's'. Then 'x' is XOR'd
      with 's' and stored in 'x'. On each subsequent iteration the same
      operation is performed. When 4 iterations are complete, 'x' is
      XOR'd with 'c' (0x63) and the transformed value is stored in 'x'.
      For example:

      s = 01000001
      x = 01000001

      iteration 1: s = 10000010, x ^= s
      iteration 2: s = 00000101, x ^= s
      iteration 3: s = 00001010, x ^= s
      iteration 4: s = 00010100, x ^= s
      x ^= 0x63

      This can be done with a loop where s = (s << 1) | (s >> 7). However,
      it can also be done by using a single 16-bit (in this case 32-bit)
      number 'sx'. Since XOR is an associative operation, we can set 'sx'
      to 'ei' and then XOR it with 'sx' left-shifted 1,2,3, and 4 times.
      The most significant bits will flow into the high 8 bit positions
      and be correctly XOR'd with one another. All that remains will be
      to cycle the high 8 bits by XOR'ing them all with the lower 8 bits
      afterwards.

      At the same time we're populating sbox and isbox we can precompute
      the multiplication we'll need to do to do MixColumns() later.
    */

    // apply affine transformation
    sx = ei ^ (ei << 1) ^ (ei << 2) ^ (ei << 3) ^ (ei << 4);
    sx = (sx >> 8) ^ (sx & 255) ^ 0x63;

    // update tables
    sbox[e] = sx;
    isbox[sx] = e;

    /* Mixing columns is done using matrix multiplication. The columns
      that are to be mixed are each a single word in the current state.
      The state has Nb columns (4 columns). Therefore each column is a
      4 byte word. So to mix the columns in a single column 'c' where
      its rows are r0, r1, r2, and r3, we use the following matrix
      multiplication:

      [2 3 1 1]*[r0,c]=[r'0,c]
      [1 2 3 1] [r1,c] [r'1,c]
      [1 1 2 3] [r2,c] [r'2,c]
      [3 1 1 2] [r3,c] [r'3,c]

      r0, r1, r2, and r3 are each 1 byte of one of the words in the
      state (a column). To do matrix multiplication for each mixed
      column c' we multiply the corresponding row from the left matrix
      with the corresponding column from the right matrix. In total, we
      get 4 equations:

      r0,c' = 2*r0,c + 3*r1,c + 1*r2,c + 1*r3,c
      r1,c' = 1*r0,c + 2*r1,c + 3*r2,c + 1*r3,c
      r2,c' = 1*r0,c + 1*r1,c + 2*r2,c + 3*r3,c
      r3,c' = 3*r0,c + 1*r1,c + 1*r2,c + 2*r3,c

      As usual, the multiplication is as previously defined and the
      addition is XOR. In order to optimize mixing columns we can store
      the multiplication results in tables. If you think of the whole
      column as a word (it might help to visualize by mentally rotating
      the equations above by counterclockwise 90 degrees) then you can
      see that it would be useful to map the multiplications performed on
      each byte (r0, r1, r2, r3) onto a word as well. For instance, we
      could map 2*r0,1*r0,1*r0,3*r0 onto a word by storing 2*r0 in the
      highest 8 bits and 3*r0 in the lowest 8 bits (with the other two
      respectively in the middle). This means that a table can be
      constructed that uses r0 as an index to the word. We can do the
      same with r1, r2, and r3, creating a total of 4 tables.

      To construct a full c', we can just look up each byte of c in
      their respective tables and XOR the results together.

      Also, to build each table we only have to calculate the word
      for 2,1,1,3 for every byte ... which we can do on each iteration
      of this loop since we will iterate over every byte. After we have
      calculated 2,1,1,3 we can get the results for the other tables
      by cycling the byte at the end to the beginning. For instance
      we can take the result of table 2,1,1,3 and produce table 3,2,1,1
      by moving the right most byte to the left most position just like
      how you can imagine the 3 moved out of 2,1,1,3 and to the front
      to produce 3,2,1,1.

      There is another optimization in that the same multiples of
      the current element we need in order to advance our generator
      to the next iteration can be reused in performing the 2,1,1,3
      calculation. We also calculate the inverse mix column tables,
      with e,9,d,b being the inverse of 2,1,1,3.

      When we're done, and we need to actually mix columns, the first
      byte of each state word should be put through mix[0] (2,1,1,3),
      the second through mix[1] (3,2,1,1) and so forth. Then they should
      be XOR'd together to produce the fully mixed column.
    */

    // calculate mix and imix table values
    sx2 = xtime[sx];
    e2 = xtime[e];
    e4 = xtime[e2];
    e8 = xtime[e4];
    me =
      (sx2 << 24) ^  // 2
      (sx << 16) ^   // 1
      (sx << 8) ^    // 1
      (sx ^ sx2);    // 3
    ime =
      (e2 ^ e4 ^ e8) << 24 ^  // E (14)
      (e ^ e8) << 16 ^        // 9
      (e ^ e4 ^ e8) << 8 ^    // D (13)
      (e ^ e2 ^ e8);          // B (11)
    // produce each of the mix tables by rotating the 2,1,1,3 value
    for(var n = 0; n < 4; ++n) {
      mix[n][e] = me;
      imix[n][sx] = ime;
      // cycle the right most byte to the left most position
      // ie: 2,1,1,3 becomes 3,2,1,1
      me = me << 24 | me >>> 8;
      ime = ime << 24 | ime >>> 8;
    }

    // get next element and inverse
    if(e === 0) {
      // 1 is the inverse of 1
      e = ei = 1;
    } else {
      // e = 2e + 2*2*2*(10e)) = multiply e by 82 (chosen generator)
      // ei = ei + 2*2*ei = multiply ei by 5 (inverse generator)
      e = e2 ^ xtime[xtime[xtime[e2 ^ e8]]];
      ei ^= xtime[xtime[ei]];
    }
  }
}

/**
 * Generates a key schedule using the AES key expansion algorithm.
 *
 * The AES algorithm takes the Cipher Key, K, and performs a Key Expansion
 * routine to generate a key schedule. The Key Expansion generates a total
 * of Nb*(Nr + 1) words: the algorithm requires an initial set of Nb words,
 * and each of the Nr rounds requires Nb words of key data. The resulting
 * key schedule consists of a linear array of 4-byte words, denoted [wi ],
 * with i in the range 0 <= i < Nb(Nr + 1).
 *
 * KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)
 * AES-128 (Nb=4, Nk=4, Nr=10)
 * AES-192 (Nb=4, Nk=6, Nr=12)
 * AES-256 (Nb=4, Nk=8, Nr=14)
 * Note: Nr=Nk+6.
 *
 * Nb is the number of columns (32-bit words) comprising the State (or
 * number of bytes in a block). For AES, Nb=4.
 *
 * @param key the key to schedule (as an array of 32-bit words).
 * @param decrypt true to modify the key schedule to decrypt, false not to.
 *
 * @return the generated key schedule.
 */
function _expandKey(key, decrypt) {
  // copy the key's words to initialize the key schedule
  var w = key.slice(0);

  /* RotWord() will rotate a word, moving the first byte to the last
    byte's position (shifting the other bytes left).

    We will be getting the value of Rcon at i / Nk. 'i' will iterate
    from Nk to (Nb * Nr+1). Nk = 4 (4 byte key), Nb = 4 (4 words in
    a block), Nr = Nk + 6 (10). Therefore 'i' will iterate from
    4 to 44 (exclusive). Each time we iterate 4 times, i / Nk will
    increase by 1. We use a counter iNk to keep track of this.
   */

  // go through the rounds expanding the key
  var temp, iNk = 1;
  var Nk = w.length;
  var Nr1 = Nk + 6 + 1;
  var end = Nb * Nr1;
  for(var i = Nk; i < end; ++i) {
    temp = w[i - 1];
    if(i % Nk === 0) {
      // temp = SubWord(RotWord(temp)) ^ Rcon[i / Nk]
      temp =
        sbox[temp >>> 16 & 255] << 24 ^
        sbox[temp >>> 8 & 255] << 16 ^
        sbox[temp & 255] << 8 ^
        sbox[temp >>> 24] ^ (rcon[iNk] << 24);
      iNk++;
    } else if(Nk > 6 && (i % Nk === 4)) {
      // temp = SubWord(temp)
      temp =
        sbox[temp >>> 24] << 24 ^
        sbox[temp >>> 16 & 255] << 16 ^
        sbox[temp >>> 8 & 255] << 8 ^
        sbox[temp & 255];
    }
    w[i] = w[i - Nk] ^ temp;
  }

  /* When we are updating a cipher block we always use the code path for
     encryption whether we are decrypting or not (to shorten code and
     simplify the generation of look up tables). However, because there
     are differences in the decryption algorithm, other than just swapping
     in different look up tables, we must transform our key schedule to
     account for these changes:

     1. The decryption algorithm gets its key rounds in reverse order.
     2. The decryption algorithm adds the round key before mixing columns
       instead of afterwards.

     We don't need to modify our key schedule to handle the first case,
     we can just traverse the key schedule in reverse order when decrypting.

     The second case requires a little work.

     The tables we built for performing rounds will take an input and then
     perform SubBytes() and MixColumns() or, for the decrypt version,
     InvSubBytes() and InvMixColumns(). But the decrypt algorithm requires
     us to AddRoundKey() before InvMixColumns(). This means we'll need to
     apply some transformations to the round key to inverse-mix its columns
     so they'll be correct for moving AddRoundKey() to after the state has
     had its columns inverse-mixed.

     To inverse-mix the columns of the state when we're decrypting we use a
     lookup table that will apply InvSubBytes() and InvMixColumns() at the
     same time. However, the round key's bytes are not inverse-substituted
     in the decryption algorithm. To get around this problem, we can first
     substitute the bytes in the round key so that when we apply the
     transformation via the InvSubBytes()+InvMixColumns() table, it will
     undo our substitution leaving us with the original value that we
     want -- and then inverse-mix that value.

     This change will correctly alter our key schedule so that we can XOR
     each round key with our already transformed decryption state. This
     allows us to use the same code path as the encryption algorithm.

     We make one more change to the decryption key. Since the decryption
     algorithm runs in reverse from the encryption algorithm, we reverse
     the order of the round keys to avoid having to iterate over the key
     schedule backwards when running the encryption algorithm later in
     decryption mode. In addition to reversing the order of the round keys,
     we also swap each round key's 2nd and 4th rows. See the comments
     section where rounds are performed for more details about why this is
     done. These changes are done inline with the other substitution
     described above.
  */
  if(decrypt) {
    var tmp;
    var m0 = imix[0];
    var m1 = imix[1];
    var m2 = imix[2];
    var m3 = imix[3];
    var wnew = w.slice(0);
    end = w.length;
    for(var i = 0, wi = end - Nb; i < end; i += Nb, wi -= Nb) {
      // do not sub the first or last round key (round keys are Nb
      // words) as no column mixing is performed before they are added,
      // but do change the key order
      if(i === 0 || i === (end - Nb)) {
        wnew[i] = w[wi];
        wnew[i + 1] = w[wi + 3];
        wnew[i + 2] = w[wi + 2];
        wnew[i + 3] = w[wi + 1];
      } else {
        // substitute each round key byte because the inverse-mix
        // table will inverse-substitute it (effectively cancel the
        // substitution because round key bytes aren't sub'd in
        // decryption mode) and swap indexes 3 and 1
        for(var n = 0; n < Nb; ++n) {
          tmp = w[wi + n];
          wnew[i + (3&-n)] =
            m0[sbox[tmp >>> 24]] ^
            m1[sbox[tmp >>> 16 & 255]] ^
            m2[sbox[tmp >>> 8 & 255]] ^
            m3[sbox[tmp & 255]];
        }
      }
    }
    w = wnew;
  }

  return w;
}

/**
 * Updates a single block (16 bytes) using AES. The update will either
 * encrypt or decrypt the block.
 *
 * @param w the key schedule.
 * @param input the input block (an array of 32-bit words).
 * @param output the updated output block.
 * @param decrypt true to decrypt the block, false to encrypt it.
 */
function _updateBlock(w, input, output, decrypt) {
  /*
  Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])
  begin
    byte state[4,Nb]
    state = in
    AddRoundKey(state, w[0, Nb-1])
    for round = 1 step 1 to Nr-1
      SubBytes(state)
      ShiftRows(state)
      MixColumns(state)
      AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])
    end for
    SubBytes(state)
    ShiftRows(state)
    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])
    out = state
  end

  InvCipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])
  begin
    byte state[4,Nb]
    state = in
    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])
    for round = Nr-1 step -1 downto 1
      InvShiftRows(state)
      InvSubBytes(state)
      AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])
      InvMixColumns(state)
    end for
    InvShiftRows(state)
    InvSubBytes(state)
    AddRoundKey(state, w[0, Nb-1])
    out = state
  end
  */

  // Encrypt: AddRoundKey(state, w[0, Nb-1])
  // Decrypt: AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])
  var Nr = w.length / 4 - 1;
  var m0, m1, m2, m3, sub;
  if(decrypt) {
    m0 = imix[0];
    m1 = imix[1];
    m2 = imix[2];
    m3 = imix[3];
    sub = isbox;
  } else {
    m0 = mix[0];
    m1 = mix[1];
    m2 = mix[2];
    m3 = mix[3];
    sub = sbox;
  }
  var a, b, c, d, a2, b2, c2;
  a = input[0] ^ w[0];
  b = input[decrypt ? 3 : 1] ^ w[1];
  c = input[2] ^ w[2];
  d = input[decrypt ? 1 : 3] ^ w[3];
  var i = 3;

  /* In order to share code we follow the encryption algorithm when both
    encrypting and decrypting. To account for the changes required in the
    decryption algorithm, we use different lookup tables when decrypting
    and use a modified key schedule to account for the difference in the
    order of transformations applied when performing rounds. We also get
    key rounds in reverse order (relative to encryption). */
  for(var round = 1; round < Nr; ++round) {
    /* As described above, we'll be using table lookups to perform the
      column mixing. Each column is stored as a word in the state (the
      array 'input' has one column as a word at each index). In order to
      mix a column, we perform these transformations on each row in c,
      which is 1 byte in each word. The new column for c0 is c'0:

               m0      m1      m2      m3
      r0,c'0 = 2*r0,c0 + 3*r1,c0 + 1*r2,c0 + 1*r3,c0
      r1,c'0 = 1*r0,c0 + 2*r1,c0 + 3*r2,c0 + 1*r3,c0
      r2,c'0 = 1*r0,c0 + 1*r1,c0 + 2*r2,c0 + 3*r3,c0
      r3,c'0 = 3*r0,c0 + 1*r1,c0 + 1*r2,c0 + 2*r3,c0

      So using mix tables where c0 is a word with r0 being its upper
      8 bits and r3 being its lower 8 bits:

      m0[c0 >> 24] will yield this word: [2*r0,1*r0,1*r0,3*r0]
      ...
      m3[c0 & 255] will yield this word: [1*r3,1*r3,3*r3,2*r3]

      Therefore to mix the columns in each word in the state we
      do the following (& 255 omitted for brevity):
      c'0,r0 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]
      c'0,r1 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]
      c'0,r2 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]
      c'0,r3 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]

      However, before mixing, the algorithm requires us to perform
      ShiftRows(). The ShiftRows() transformation cyclically shifts the
      last 3 rows of the state over different offsets. The first row
      (r = 0) is not shifted.

      s'_r,c = s_r,(c + shift(r, Nb) mod Nb
      for 0 < r < 4 and 0 <= c < Nb and
      shift(1, 4) = 1
      shift(2, 4) = 2
      shift(3, 4) = 3.

      This causes the first byte in r = 1 to be moved to the end of
      the row, the first 2 bytes in r = 2 to be moved to the end of
      the row, the first 3 bytes in r = 3 to be moved to the end of
      the row:

      r1: [c0 c1 c2 c3] => [c1 c2 c3 c0]
      r2: [c0 c1 c2 c3]    [c2 c3 c0 c1]
      r3: [c0 c1 c2 c3]    [c3 c0 c1 c2]

      We can make these substitutions inline with our column mixing to
      generate an updated set of equations to produce each word in the
      state (note the columns have changed positions):

      c0 c1 c2 c3 => c0 c1 c2 c3
      c0 c1 c2 c3    c1 c2 c3 c0  (cycled 1 byte)
      c0 c1 c2 c3    c2 c3 c0 c1  (cycled 2 bytes)
      c0 c1 c2 c3    c3 c0 c1 c2  (cycled 3 bytes)

      Therefore:

      c'0 = 2*r0,c0 + 3*r1,c1 + 1*r2,c2 + 1*r3,c3
      c'0 = 1*r0,c0 + 2*r1,c1 + 3*r2,c2 + 1*r3,c3
      c'0 = 1*r0,c0 + 1*r1,c1 + 2*r2,c2 + 3*r3,c3
      c'0 = 3*r0,c0 + 1*r1,c1 + 1*r2,c2 + 2*r3,c3

      c'1 = 2*r0,c1 + 3*r1,c2 + 1*r2,c3 + 1*r3,c0
      c'1 = 1*r0,c1 + 2*r1,c2 + 3*r2,c3 + 1*r3,c0
      c'1 = 1*r0,c1 + 1*r1,c2 + 2*r2,c3 + 3*r3,c0
      c'1 = 3*r0,c1 + 1*r1,c2 + 1*r2,c3 + 2*r3,c0

      ... and so forth for c'2 and c'3. The important distinction is
      that the columns are cycling, with c0 being used with the m0
      map when calculating c0, but c1 being used with the m0 map when
      calculating c1 ... and so forth.

      When performing the inverse we transform the mirror image and
      skip the bottom row, instead of the top one, and move upwards:

      c3 c2 c1 c0 => c0 c3 c2 c1  (cycled 3 bytes) *same as encryption
      c3 c2 c1 c0    c1 c0 c3 c2  (cycled 2 bytes)
      c3 c2 c1 c0    c2 c1 c0 c3  (cycled 1 byte)  *same as encryption
      c3 c2 c1 c0    c3 c2 c1 c0

      If you compare the resulting matrices for ShiftRows()+MixColumns()
      and for InvShiftRows()+InvMixColumns() the 2nd and 4th columns are
      different (in encrypt mode vs. decrypt mode). So in order to use
      the same code to handle both encryption and decryption, we will
      need to do some mapping.

      If in encryption mode we let a=c0, b=c1, c=c2, d=c3, and r<N> be
      a row number in the state, then the resulting matrix in encryption
      mode for applying the above transformations would be:

      r1: a b c d
      r2: b c d a
      r3: c d a b
      r4: d a b c

      If we did the same in decryption mode we would get:

      r1: a d c b
      r2: b a d c
      r3: c b a d
      r4: d c b a

      If instead we swap d and b (set b=c3 and d=c1), then we get:

      r1: a b c d
      r2: d a b c
      r3: c d a b
      r4: b c d a

      Now the 1st and 3rd rows are the same as the encryption matrix. All
      we need to do then to make the mapping exactly the same is to swap
      the 2nd and 4th rows when in decryption mode. To do this without
      having to do it on each iteration, we swapped the 2nd and 4th rows
      in the decryption key schedule. We also have to do the swap above
      when we first pull in the input and when we set the final output. */
    a2 =
      m0[a >>> 24] ^
      m1[b >>> 16 & 255] ^
      m2[c >>> 8 & 255] ^
      m3[d & 255] ^ w[++i];
    b2 =
      m0[b >>> 24] ^
      m1[c >>> 16 & 255] ^
      m2[d >>> 8 & 255] ^
      m3[a & 255] ^ w[++i];
    c2 =
      m0[c >>> 24] ^
      m1[d >>> 16 & 255] ^
      m2[a >>> 8 & 255] ^
      m3[b & 255] ^ w[++i];
    d =
      m0[d >>> 24] ^
      m1[a >>> 16 & 255] ^
      m2[b >>> 8 & 255] ^
      m3[c & 255] ^ w[++i];
    a = a2;
    b = b2;
    c = c2;
  }

  /*
    Encrypt:
    SubBytes(state)
    ShiftRows(state)
    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])

    Decrypt:
    InvShiftRows(state)
    InvSubBytes(state)
    AddRoundKey(state, w[0, Nb-1])
   */
  // Note: rows are shifted inline
  output[0] =
    (sub[a >>> 24] << 24) ^
    (sub[b >>> 16 & 255] << 16) ^
    (sub[c >>> 8 & 255] << 8) ^
    (sub[d & 255]) ^ w[++i];
  output[decrypt ? 3 : 1] =
    (sub[b >>> 24] << 24) ^
    (sub[c >>> 16 & 255] << 16) ^
    (sub[d >>> 8 & 255] << 8) ^
    (sub[a & 255]) ^ w[++i];
  output[2] =
    (sub[c >>> 24] << 24) ^
    (sub[d >>> 16 & 255] << 16) ^
    (sub[a >>> 8 & 255] << 8) ^
    (sub[b & 255]) ^ w[++i];
  output[decrypt ? 1 : 3] =
    (sub[d >>> 24] << 24) ^
    (sub[a >>> 16 & 255] << 16) ^
    (sub[b >>> 8 & 255] << 8) ^
    (sub[c & 255]) ^ w[++i];
}

/**
 * Deprecated. Instead, use:
 *
 * forge.cipher.createCipher('AES-<mode>', key);
 * forge.cipher.createDecipher('AES-<mode>', key);
 *
 * Creates a deprecated AES cipher object. This object's mode will default to
 * CBC (cipher-block-chaining).
 *
 * The key and iv may be given as a string of bytes, an array of bytes, a
 * byte buffer, or an array of 32-bit words.
 *
 * @param options the options to use.
 *          key the symmetric key to use.
 *          output the buffer to write to.
 *          decrypt true for decryption, false for encryption.
 *          mode the cipher mode to use (default: 'CBC').
 *
 * @return the cipher.
 */
function _createCipher(options) {
  options = options || {};
  var mode = (options.mode || 'CBC').toUpperCase();
  var algorithm = 'AES-' + mode;

  var cipher;
  if(options.decrypt) {
    cipher = forge.cipher.createDecipher(algorithm, options.key);
  } else {
    cipher = forge.cipher.createCipher(algorithm, options.key);
  }

  // backwards compatible start API
  var start = cipher.start;
  cipher.start = function(iv, options) {
    // backwards compatibility: support second arg as output buffer
    var output = null;
    if(options instanceof forge.util.ByteBuffer) {
      output = options;
      options = {};
    }
    options = options || {};
    options.output = output;
    options.iv = iv;
    start.call(cipher, options);
  };

  return cipher;
}

},{"./cipher":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/cipher.js","./cipherModes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/cipherModes.js","./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/asn1.js":[function(require,module,exports){
/**
 * Javascript implementation of Abstract Syntax Notation Number One.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2015 Digital Bazaar, Inc.
 *
 * An API for storing data using the Abstract Syntax Notation Number One
 * format using DER (Distinguished Encoding Rules) encoding. This encoding is
 * commonly used to store data for PKI, i.e. X.509 Certificates, and this
 * implementation exists for that purpose.
 *
 * Abstract Syntax Notation Number One (ASN.1) is used to define the abstract
 * syntax of information without restricting the way the information is encoded
 * for transmission. It provides a standard that allows for open systems
 * communication. ASN.1 defines the syntax of information data and a number of
 * simple data types as well as a notation for describing them and specifying
 * values for them.
 *
 * The RSA algorithm creates public and private keys that are often stored in
 * X.509 or PKCS#X formats -- which use ASN.1 (encoded in DER format). This
 * class provides the most basic functionality required to store and load DSA
 * keys that are encoded according to ASN.1.
 *
 * The most common binary encodings for ASN.1 are BER (Basic Encoding Rules)
 * and DER (Distinguished Encoding Rules). DER is just a subset of BER that
 * has stricter requirements for how data must be encoded.
 *
 * Each ASN.1 structure has a tag (a byte identifying the ASN.1 structure type)
 * and a byte array for the value of this ASN1 structure which may be data or a
 * list of ASN.1 structures.
 *
 * Each ASN.1 structure using BER is (Tag-Length-Value):
 *
 * | byte 0 | bytes X | bytes Y |
 * |--------|---------|----------
 * |  tag   | length  |  value  |
 *
 * ASN.1 allows for tags to be of "High-tag-number form" which allows a tag to
 * be two or more octets, but that is not supported by this class. A tag is
 * only 1 byte. Bits 1-5 give the tag number (ie the data type within a
 * particular 'class'), 6 indicates whether or not the ASN.1 value is
 * constructed from other ASN.1 values, and bits 7 and 8 give the 'class'. If
 * bits 7 and 8 are both zero, the class is UNIVERSAL. If only bit 7 is set,
 * then the class is APPLICATION. If only bit 8 is set, then the class is
 * CONTEXT_SPECIFIC. If both bits 7 and 8 are set, then the class is PRIVATE.
 * The tag numbers for the data types for the class UNIVERSAL are listed below:
 *
 * UNIVERSAL 0 Reserved for use by the encoding rules
 * UNIVERSAL 1 Boolean type
 * UNIVERSAL 2 Integer type
 * UNIVERSAL 3 Bitstring type
 * UNIVERSAL 4 Octetstring type
 * UNIVERSAL 5 Null type
 * UNIVERSAL 6 Object identifier type
 * UNIVERSAL 7 Object descriptor type
 * UNIVERSAL 8 External type and Instance-of type
 * UNIVERSAL 9 Real type
 * UNIVERSAL 10 Enumerated type
 * UNIVERSAL 11 Embedded-pdv type
 * UNIVERSAL 12 UTF8String type
 * UNIVERSAL 13 Relative object identifier type
 * UNIVERSAL 14-15 Reserved for future editions
 * UNIVERSAL 16 Sequence and Sequence-of types
 * UNIVERSAL 17 Set and Set-of types
 * UNIVERSAL 18-22, 25-30 Character string types
 * UNIVERSAL 23-24 Time types
 *
 * The length of an ASN.1 structure is specified after the tag identifier.
 * There is a definite form and an indefinite form. The indefinite form may
 * be used if the encoding is constructed and not all immediately available.
 * The indefinite form is encoded using a length byte with only the 8th bit
 * set. The end of the constructed object is marked using end-of-contents
 * octets (two zero bytes).
 *
 * The definite form looks like this:
 *
 * The length may take up 1 or more bytes, it depends on the length of the
 * value of the ASN.1 structure. DER encoding requires that if the ASN.1
 * structure has a value that has a length greater than 127, more than 1 byte
 * will be used to store its length, otherwise just one byte will be used.
 * This is strict.
 *
 * In the case that the length of the ASN.1 value is less than 127, 1 octet
 * (byte) is used to store the "short form" length. The 8th bit has a value of
 * 0 indicating the length is "short form" and not "long form" and bits 7-1
 * give the length of the data. (The 8th bit is the left-most, most significant
 * bit: also known as big endian or network format).
 *
 * In the case that the length of the ASN.1 value is greater than 127, 2 to
 * 127 octets (bytes) are used to store the "long form" length. The first
 * byte's 8th bit is set to 1 to indicate the length is "long form." Bits 7-1
 * give the number of additional octets. All following octets are in base 256
 * with the most significant digit first (typical big-endian binary unsigned
 * integer storage). So, for instance, if the length of a value was 257, the
 * first byte would be set to:
 *
 * 10000010 = 130 = 0x82.
 *
 * This indicates there are 2 octets (base 256) for the length. The second and
 * third bytes (the octets just mentioned) would store the length in base 256:
 *
 * octet 2: 00000001 = 1 * 256^1 = 256
 * octet 3: 00000001 = 1 * 256^0 = 1
 * total = 257
 *
 * The algorithm for converting a js integer value of 257 to base-256 is:
 *
 * var value = 257;
 * var bytes = [];
 * bytes[0] = (value >>> 8) & 0xFF; // most significant byte first
 * bytes[1] = value & 0xFF;        // least significant byte last
 *
 * On the ASN.1 UNIVERSAL Object Identifier (OID) type:
 *
 * An OID can be written like: "value1.value2.value3...valueN"
 *
 * The DER encoding rules:
 *
 * The first byte has the value 40 * value1 + value2.
 * The following bytes, if any, encode the remaining values. Each value is
 * encoded in base 128, most significant digit first (big endian), with as
 * few digits as possible, and the most significant bit of each byte set
 * to 1 except the last in each value's encoding. For example: Given the
 * OID "1.2.840.113549", its DER encoding is (remember each byte except the
 * last one in each encoding is OR'd with 0x80):
 *
 * byte 1: 40 * 1 + 2 = 42 = 0x2A.
 * bytes 2-3: 128 * 6 + 72 = 840 = 6 72 = 6 72 = 0x0648 = 0x8648
 * bytes 4-6: 16384 * 6 + 128 * 119 + 13 = 6 119 13 = 0x06770D = 0x86F70D
 *
 * The final value is: 0x2A864886F70D.
 * The full OID (including ASN.1 tag and length of 6 bytes) is:
 * 0x06062A864886F70D
 */
var forge = require('./forge');
require('./util');
require('./oids');

/* ASN.1 API */
var asn1 = module.exports = forge.asn1 = forge.asn1 || {};

/**
 * ASN.1 classes.
 */
asn1.Class = {
  UNIVERSAL:        0x00,
  APPLICATION:      0x40,
  CONTEXT_SPECIFIC: 0x80,
  PRIVATE:          0xC0
};

/**
 * ASN.1 types. Not all types are supported by this implementation, only
 * those necessary to implement a simple PKI are implemented.
 */
asn1.Type = {
  NONE:             0,
  BOOLEAN:          1,
  INTEGER:          2,
  BITSTRING:        3,
  OCTETSTRING:      4,
  NULL:             5,
  OID:              6,
  ODESC:            7,
  EXTERNAL:         8,
  REAL:             9,
  ENUMERATED:      10,
  EMBEDDED:        11,
  UTF8:            12,
  ROID:            13,
  SEQUENCE:        16,
  SET:             17,
  PRINTABLESTRING: 19,
  IA5STRING:       22,
  UTCTIME:         23,
  GENERALIZEDTIME: 24,
  BMPSTRING:       30
};

/**
 * Creates a new asn1 object.
 *
 * @param tagClass the tag class for the object.
 * @param type the data type (tag number) for the object.
 * @param constructed true if the asn1 object is in constructed form.
 * @param value the value for the object, if it is not constructed.
 * @param [options] the options to use:
 *          [bitStringContents] the plain BIT STRING content including padding
 *            byte.
 *
 * @return the asn1 object.
 */
asn1.create = function(tagClass, type, constructed, value, options) {
  /* An asn1 object has a tagClass, a type, a constructed flag, and a
    value. The value's type depends on the constructed flag. If
    constructed, it will contain a list of other asn1 objects. If not,
    it will contain the ASN.1 value as an array of bytes formatted
    according to the ASN.1 data type. */

  // remove undefined values
  if(forge.util.isArray(value)) {
    var tmp = [];
    for(var i = 0; i < value.length; ++i) {
      if(value[i] !== undefined) {
        tmp.push(value[i]);
      }
    }
    value = tmp;
  }

  var obj = {
    tagClass: tagClass,
    type: type,
    constructed: constructed,
    composed: constructed || forge.util.isArray(value),
    value: value
  };
  if(options && 'bitStringContents' in options) {
    // TODO: copy byte buffer if it's a buffer not a string
    obj.bitStringContents = options.bitStringContents;
    // TODO: add readonly flag to avoid this overhead
    // save copy to detect changes
    obj.original = asn1.copy(obj);
  }
  return obj;
};

/**
 * Copies an asn1 object.
 *
 * @param obj the asn1 object.
 * @param [options] copy options:
 *          [excludeBitStringContents] true to not copy bitStringContents
 *
 * @return the a copy of the asn1 object.
 */
asn1.copy = function(obj, options) {
  var copy;

  if(forge.util.isArray(obj)) {
    copy = [];
    for(var i = 0; i < obj.length; ++i) {
      copy.push(asn1.copy(obj[i], options));
    }
    return copy;
  }

  if(typeof obj === 'string') {
    // TODO: copy byte buffer if it's a buffer not a string
    return obj;
  }

  copy = {
    tagClass: obj.tagClass,
    type: obj.type,
    constructed: obj.constructed,
    composed: obj.composed,
    value: asn1.copy(obj.value, options)
  };
  if(options && !options.excludeBitStringContents) {
    // TODO: copy byte buffer if it's a buffer not a string
    copy.bitStringContents = obj.bitStringContents;
  }
  return copy;
};

/**
 * Compares asn1 objects for equality.
 *
 * Note this function does not run in constant time.
 *
 * @param obj1 the first asn1 object.
 * @param obj2 the second asn1 object.
 * @param [options] compare options:
 *          [includeBitStringContents] true to compare bitStringContents
 *
 * @return true if the asn1 objects are equal.
 */
asn1.equals = function(obj1, obj2, options) {
  if(forge.util.isArray(obj1)) {
    if(!forge.util.isArray(obj2)) {
      return false;
    }
    if(obj1.length !== obj2.length) {
      return false;
    }
    for(var i = 0; i < obj1.length; ++i) {
      if(!asn1.equals(obj1[i], obj2[i])) {
        return false;
      }
    }
    return true;
  }

  if(typeof obj1 !== typeof obj2) {
    return false;
  }

  if(typeof obj1 === 'string') {
    return obj1 === obj2;
  }

  var equal = obj1.tagClass === obj2.tagClass &&
    obj1.type === obj2.type &&
    obj1.constructed === obj2.constructed &&
    obj1.composed === obj2.composed &&
    asn1.equals(obj1.value, obj2.value);
  if(options && options.includeBitStringContents) {
    equal = equal && (obj1.bitStringContents === obj2.bitStringContents);
  }

  return equal;
};

/**
 * Gets the length of a BER-encoded ASN.1 value.
 *
 * In case the length is not specified, undefined is returned.
 *
 * @param b the BER-encoded ASN.1 byte buffer, starting with the first
 *          length byte.
 *
 * @return the length of the BER-encoded ASN.1 value or undefined.
 */
asn1.getBerValueLength = function(b) {
  // TODO: move this function and related DER/BER functions to a der.js
  // file; better abstract ASN.1 away from der/ber.
  var b2 = b.getByte();
  if(b2 === 0x80) {
    return undefined;
  }

  // see if the length is "short form" or "long form" (bit 8 set)
  var length;
  var longForm = b2 & 0x80;
  if(!longForm) {
    // length is just the first byte
    length = b2;
  } else {
    // the number of bytes the length is specified in bits 7 through 1
    // and each length byte is in big-endian base-256
    length = b.getInt((b2 & 0x7F) << 3);
  }
  return length;
};

/**
 * Check if the byte buffer has enough bytes. Throws an Error if not.
 *
 * @param bytes the byte buffer to parse from.
 * @param remaining the bytes remaining in the current parsing state.
 * @param n the number of bytes the buffer must have.
 */
function _checkBufferLength(bytes, remaining, n) {
  if(n > remaining) {
    var error = new Error('Too few bytes to parse DER.');
    error.available = bytes.length();
    error.remaining = remaining;
    error.requested = n;
    throw error;
  }
}

/**
 * Gets the length of a BER-encoded ASN.1 value.
 *
 * In case the length is not specified, undefined is returned.
 *
 * @param bytes the byte buffer to parse from.
 * @param remaining the bytes remaining in the current parsing state.
 *
 * @return the length of the BER-encoded ASN.1 value or undefined.
 */
var _getValueLength = function(bytes, remaining) {
  // TODO: move this function and related DER/BER functions to a der.js
  // file; better abstract ASN.1 away from der/ber.
  // fromDer already checked that this byte exists
  var b2 = bytes.getByte();
  remaining--;
  if(b2 === 0x80) {
    return undefined;
  }

  // see if the length is "short form" or "long form" (bit 8 set)
  var length;
  var longForm = b2 & 0x80;
  if(!longForm) {
    // length is just the first byte
    length = b2;
  } else {
    // the number of bytes the length is specified in bits 7 through 1
    // and each length byte is in big-endian base-256
    var longFormBytes = b2 & 0x7F;
    _checkBufferLength(bytes, remaining, longFormBytes);
    length = bytes.getInt(longFormBytes << 3);
  }
  // FIXME: this will only happen for 32 bit getInt with high bit set
  if(length < 0) {
    throw new Error('Negative length: ' + length);
  }
  return length;
};

/**
 * Parses an asn1 object from a byte buffer in DER format.
 *
 * @param bytes the byte buffer to parse from.
 * @param [strict] true to be strict when checking value lengths, false to
 *          allow truncated values (default: true).
 * @param [options] object with options or boolean strict flag
 *          [strict] true to be strict when checking value lengths, false to
 *            allow truncated values (default: true).
 *          [decodeBitStrings] true to attempt to decode the content of
 *            BIT STRINGs (not OCTET STRINGs) using strict mode. Note that
 *            without schema support to understand the data context this can
 *            erroneously decode values that happen to be valid ASN.1. This
 *            flag will be deprecated or removed as soon as schema support is
 *            available. (default: true)
 *
 * @return the parsed asn1 object.
 */
asn1.fromDer = function(bytes, options) {
  if(options === undefined) {
    options = {
      strict: true,
      decodeBitStrings: true
    };
  }
  if(typeof options === 'boolean') {
    options = {
      strict: options,
      decodeBitStrings: true
    };
  }
  if(!('strict' in options)) {
    options.strict = true;
  }
  if(!('decodeBitStrings' in options)) {
    options.decodeBitStrings = true;
  }

  // wrap in buffer if needed
  if(typeof bytes === 'string') {
    bytes = forge.util.createBuffer(bytes);
  }

  return _fromDer(bytes, bytes.length(), 0, options);
};

/**
 * Internal function to parse an asn1 object from a byte buffer in DER format.
 *
 * @param bytes the byte buffer to parse from.
 * @param remaining the number of bytes remaining for this chunk.
 * @param depth the current parsing depth.
 * @param options object with same options as fromDer().
 *
 * @return the parsed asn1 object.
 */
function _fromDer(bytes, remaining, depth, options) {
  // temporary storage for consumption calculations
  var start;

  // minimum length for ASN.1 DER structure is 2
  _checkBufferLength(bytes, remaining, 2);

  // get the first byte
  var b1 = bytes.getByte();
  // consumed one byte
  remaining--;

  // get the tag class
  var tagClass = (b1 & 0xC0);

  // get the type (bits 1-5)
  var type = b1 & 0x1F;

  // get the variable value length and adjust remaining bytes
  start = bytes.length();
  var length = _getValueLength(bytes, remaining);
  remaining -= start - bytes.length();

  // ensure there are enough bytes to get the value
  if(length !== undefined && length > remaining) {
    if(options.strict) {
      var error = new Error('Too few bytes to read ASN.1 value.');
      error.available = bytes.length();
      error.remaining = remaining;
      error.requested = length;
      throw error;
    }
    // Note: be lenient with truncated values and use remaining state bytes
    length = remaining;
  }

  // value storage
  var value;
  // possible BIT STRING contents storage
  var bitStringContents;

  // constructed flag is bit 6 (32 = 0x20) of the first byte
  var constructed = ((b1 & 0x20) === 0x20);
  if(constructed) {
    // parse child asn1 objects from the value
    value = [];
    if(length === undefined) {
      // asn1 object of indefinite length, read until end tag
      for(;;) {
        _checkBufferLength(bytes, remaining, 2);
        if(bytes.bytes(2) === String.fromCharCode(0, 0)) {
          bytes.getBytes(2);
          remaining -= 2;
          break;
        }
        start = bytes.length();
        value.push(_fromDer(bytes, remaining, depth + 1, options));
        remaining -= start - bytes.length();
      }
    } else {
      // parsing asn1 object of definite length
      while(length > 0) {
        start = bytes.length();
        value.push(_fromDer(bytes, length, depth + 1, options));
        remaining -= start - bytes.length();
        length -= start - bytes.length();
      }
    }
  }

  // if a BIT STRING, save the contents including padding
  if(value === undefined && tagClass === asn1.Class.UNIVERSAL &&
    type === asn1.Type.BITSTRING) {
    bitStringContents = bytes.bytes(length);
  }

  // determine if a non-constructed value should be decoded as a composed
  // value that contains other ASN.1 objects. BIT STRINGs (and OCTET STRINGs)
  // can be used this way.
  if(value === undefined && options.decodeBitStrings &&
    tagClass === asn1.Class.UNIVERSAL &&
    // FIXME: OCTET STRINGs not yet supported here
    // .. other parts of forge expect to decode OCTET STRINGs manually
    (type === asn1.Type.BITSTRING /*|| type === asn1.Type.OCTETSTRING*/) &&
    length > 1) {
    // save read position
    var savedRead = bytes.read;
    var savedRemaining = remaining;
    var unused = 0;
    if(type === asn1.Type.BITSTRING) {
      /* The first octet gives the number of bits by which the length of the
        bit string is less than the next multiple of eight (this is called
        the "number of unused bits").

        The second and following octets give the value of the bit string
        converted to an octet string. */
      _checkBufferLength(bytes, remaining, 1);
      unused = bytes.getByte();
      remaining--;
    }
    // if all bits are used, maybe the BIT/OCTET STRING holds ASN.1 objs
    if(unused === 0) {
      try {
        // attempt to parse child asn1 object from the value
        // (stored in array to signal composed value)
        start = bytes.length();
        var subOptions = {
          // enforce strict mode to avoid parsing ASN.1 from plain data
          verbose: options.verbose,
          strict: true,
          decodeBitStrings: true
        };
        var composed = _fromDer(bytes, remaining, depth + 1, subOptions);
        var used = start - bytes.length();
        remaining -= used;
        if(type == asn1.Type.BITSTRING) {
          used++;
        }

        // if the data all decoded and the class indicates UNIVERSAL or
        // CONTEXT_SPECIFIC then assume we've got an encapsulated ASN.1 object
        var tc = composed.tagClass;
        if(used === length &&
          (tc === asn1.Class.UNIVERSAL || tc === asn1.Class.CONTEXT_SPECIFIC)) {
          value = [composed];
        }
      } catch(ex) {
      }
    }
    if(value === undefined) {
      // restore read position
      bytes.read = savedRead;
      remaining = savedRemaining;
    }
  }

  if(value === undefined) {
    // asn1 not constructed or composed, get raw value
    // TODO: do DER to OID conversion and vice-versa in .toDer?

    if(length === undefined) {
      if(options.strict) {
        throw new Error('Non-constructed ASN.1 object of indefinite length.');
      }
      // be lenient and use remaining state bytes
      length = remaining;
    }

    if(type === asn1.Type.BMPSTRING) {
      value = '';
      for(; length > 0; length -= 2) {
        _checkBufferLength(bytes, remaining, 2);
        value += String.fromCharCode(bytes.getInt16());
        remaining -= 2;
      }
    } else {
      value = bytes.getBytes(length);
    }
  }

  // add BIT STRING contents if available
  var asn1Options = bitStringContents === undefined ? null : {
    bitStringContents: bitStringContents
  };

  // create and return asn1 object
  return asn1.create(tagClass, type, constructed, value, asn1Options);
}

/**
 * Converts the given asn1 object to a buffer of bytes in DER format.
 *
 * @param asn1 the asn1 object to convert to bytes.
 *
 * @return the buffer of bytes.
 */
asn1.toDer = function(obj) {
  var bytes = forge.util.createBuffer();

  // build the first byte
  var b1 = obj.tagClass | obj.type;

  // for storing the ASN.1 value
  var value = forge.util.createBuffer();

  // use BIT STRING contents if available and data not changed
  var useBitStringContents = false;
  if('bitStringContents' in obj) {
    useBitStringContents = true;
    if(obj.original) {
      useBitStringContents = asn1.equals(obj, obj.original);
    }
  }

  if(useBitStringContents) {
    value.putBytes(obj.bitStringContents);
  } else if(obj.composed) {
    // if composed, use each child asn1 object's DER bytes as value
    // turn on 6th bit (0x20 = 32) to indicate asn1 is constructed
    // from other asn1 objects
    if(obj.constructed) {
      b1 |= 0x20;
    } else {
      // type is a bit string, add unused bits of 0x00
      value.putByte(0x00);
    }

    // add all of the child DER bytes together
    for(var i = 0; i < obj.value.length; ++i) {
      if(obj.value[i] !== undefined) {
        value.putBuffer(asn1.toDer(obj.value[i]));
      }
    }
  } else {
    // use asn1.value directly
    if(obj.type === asn1.Type.BMPSTRING) {
      for(var i = 0; i < obj.value.length; ++i) {
        value.putInt16(obj.value.charCodeAt(i));
      }
    } else {
      // ensure integer is minimally-encoded
      // TODO: should all leading bytes be stripped vs just one?
      // .. ex '00 00 01' => '01'?
      if(obj.type === asn1.Type.INTEGER &&
        obj.value.length > 1 &&
        // leading 0x00 for positive integer
        ((obj.value.charCodeAt(0) === 0 &&
        (obj.value.charCodeAt(1) & 0x80) === 0) ||
        // leading 0xFF for negative integer
        (obj.value.charCodeAt(0) === 0xFF &&
        (obj.value.charCodeAt(1) & 0x80) === 0x80))) {
        value.putBytes(obj.value.substr(1));
      } else {
        value.putBytes(obj.value);
      }
    }
  }

  // add tag byte
  bytes.putByte(b1);

  // use "short form" encoding
  if(value.length() <= 127) {
    // one byte describes the length
    // bit 8 = 0 and bits 7-1 = length
    bytes.putByte(value.length() & 0x7F);
  } else {
    // use "long form" encoding
    // 2 to 127 bytes describe the length
    // first byte: bit 8 = 1 and bits 7-1 = # of additional bytes
    // other bytes: length in base 256, big-endian
    var len = value.length();
    var lenBytes = '';
    do {
      lenBytes += String.fromCharCode(len & 0xFF);
      len = len >>> 8;
    } while(len > 0);

    // set first byte to # bytes used to store the length and turn on
    // bit 8 to indicate long-form length is used
    bytes.putByte(lenBytes.length | 0x80);

    // concatenate length bytes in reverse since they were generated
    // little endian and we need big endian
    for(var i = lenBytes.length - 1; i >= 0; --i) {
      bytes.putByte(lenBytes.charCodeAt(i));
    }
  }

  // concatenate value bytes
  bytes.putBuffer(value);
  return bytes;
};

/**
 * Converts an OID dot-separated string to a byte buffer. The byte buffer
 * contains only the DER-encoded value, not any tag or length bytes.
 *
 * @param oid the OID dot-separated string.
 *
 * @return the byte buffer.
 */
asn1.oidToDer = function(oid) {
  // split OID into individual values
  var values = oid.split('.');
  var bytes = forge.util.createBuffer();

  // first byte is 40 * value1 + value2
  bytes.putByte(40 * parseInt(values[0], 10) + parseInt(values[1], 10));
  // other bytes are each value in base 128 with 8th bit set except for
  // the last byte for each value
  var last, valueBytes, value, b;
  for(var i = 2; i < values.length; ++i) {
    // produce value bytes in reverse because we don't know how many
    // bytes it will take to store the value
    last = true;
    valueBytes = [];
    value = parseInt(values[i], 10);
    do {
      b = value & 0x7F;
      value = value >>> 7;
      // if value is not last, then turn on 8th bit
      if(!last) {
        b |= 0x80;
      }
      valueBytes.push(b);
      last = false;
    } while(value > 0);

    // add value bytes in reverse (needs to be in big endian)
    for(var n = valueBytes.length - 1; n >= 0; --n) {
      bytes.putByte(valueBytes[n]);
    }
  }

  return bytes;
};

/**
 * Converts a DER-encoded byte buffer to an OID dot-separated string. The
 * byte buffer should contain only the DER-encoded value, not any tag or
 * length bytes.
 *
 * @param bytes the byte buffer.
 *
 * @return the OID dot-separated string.
 */
asn1.derToOid = function(bytes) {
  var oid;

  // wrap in buffer if needed
  if(typeof bytes === 'string') {
    bytes = forge.util.createBuffer(bytes);
  }

  // first byte is 40 * value1 + value2
  var b = bytes.getByte();
  oid = Math.floor(b / 40) + '.' + (b % 40);

  // other bytes are each value in base 128 with 8th bit set except for
  // the last byte for each value
  var value = 0;
  while(bytes.length() > 0) {
    b = bytes.getByte();
    value = value << 7;
    // not the last byte for the value
    if(b & 0x80) {
      value += b & 0x7F;
    } else {
      // last byte
      oid += '.' + (value + b);
      value = 0;
    }
  }

  return oid;
};

/**
 * Converts a UTCTime value to a date.
 *
 * Note: GeneralizedTime has 4 digits for the year and is used for X.509
 * dates past 2049. Parsing that structure hasn't been implemented yet.
 *
 * @param utc the UTCTime value to convert.
 *
 * @return the date.
 */
asn1.utcTimeToDate = function(utc) {
  /* The following formats can be used:

    YYMMDDhhmmZ
    YYMMDDhhmm+hh'mm'
    YYMMDDhhmm-hh'mm'
    YYMMDDhhmmssZ
    YYMMDDhhmmss+hh'mm'
    YYMMDDhhmmss-hh'mm'

    Where:

    YY is the least significant two digits of the year
    MM is the month (01 to 12)
    DD is the day (01 to 31)
    hh is the hour (00 to 23)
    mm are the minutes (00 to 59)
    ss are the seconds (00 to 59)
    Z indicates that local time is GMT, + indicates that local time is
    later than GMT, and - indicates that local time is earlier than GMT
    hh' is the absolute value of the offset from GMT in hours
    mm' is the absolute value of the offset from GMT in minutes */
  var date = new Date();

  // if YY >= 50 use 19xx, if YY < 50 use 20xx
  var year = parseInt(utc.substr(0, 2), 10);
  year = (year >= 50) ? 1900 + year : 2000 + year;
  var MM = parseInt(utc.substr(2, 2), 10) - 1; // use 0-11 for month
  var DD = parseInt(utc.substr(4, 2), 10);
  var hh = parseInt(utc.substr(6, 2), 10);
  var mm = parseInt(utc.substr(8, 2), 10);
  var ss = 0;

  // not just YYMMDDhhmmZ
  if(utc.length > 11) {
    // get character after minutes
    var c = utc.charAt(10);
    var end = 10;

    // see if seconds are present
    if(c !== '+' && c !== '-') {
      // get seconds
      ss = parseInt(utc.substr(10, 2), 10);
      end += 2;
    }
  }

  // update date
  date.setUTCFullYear(year, MM, DD);
  date.setUTCHours(hh, mm, ss, 0);

  if(end) {
    // get +/- after end of time
    c = utc.charAt(end);
    if(c === '+' || c === '-') {
      // get hours+minutes offset
      var hhoffset = parseInt(utc.substr(end + 1, 2), 10);
      var mmoffset = parseInt(utc.substr(end + 4, 2), 10);

      // calculate offset in milliseconds
      var offset = hhoffset * 60 + mmoffset;
      offset *= 60000;

      // apply offset
      if(c === '+') {
        date.setTime(+date - offset);
      } else {
        date.setTime(+date + offset);
      }
    }
  }

  return date;
};

/**
 * Converts a GeneralizedTime value to a date.
 *
 * @param gentime the GeneralizedTime value to convert.
 *
 * @return the date.
 */
asn1.generalizedTimeToDate = function(gentime) {
  /* The following formats can be used:

    YYYYMMDDHHMMSS
    YYYYMMDDHHMMSS.fff
    YYYYMMDDHHMMSSZ
    YYYYMMDDHHMMSS.fffZ
    YYYYMMDDHHMMSS+hh'mm'
    YYYYMMDDHHMMSS.fff+hh'mm'
    YYYYMMDDHHMMSS-hh'mm'
    YYYYMMDDHHMMSS.fff-hh'mm'

    Where:

    YYYY is the year
    MM is the month (01 to 12)
    DD is the day (01 to 31)
    hh is the hour (00 to 23)
    mm are the minutes (00 to 59)
    ss are the seconds (00 to 59)
    .fff is the second fraction, accurate to three decimal places
    Z indicates that local time is GMT, + indicates that local time is
    later than GMT, and - indicates that local time is earlier than GMT
    hh' is the absolute value of the offset from GMT in hours
    mm' is the absolute value of the offset from GMT in minutes */
  var date = new Date();

  var YYYY = parseInt(gentime.substr(0, 4), 10);
  var MM = parseInt(gentime.substr(4, 2), 10) - 1; // use 0-11 for month
  var DD = parseInt(gentime.substr(6, 2), 10);
  var hh = parseInt(gentime.substr(8, 2), 10);
  var mm = parseInt(gentime.substr(10, 2), 10);
  var ss = parseInt(gentime.substr(12, 2), 10);
  var fff = 0;
  var offset = 0;
  var isUTC = false;

  if(gentime.charAt(gentime.length - 1) === 'Z') {
    isUTC = true;
  }

  var end = gentime.length - 5, c = gentime.charAt(end);
  if(c === '+' || c === '-') {
    // get hours+minutes offset
    var hhoffset = parseInt(gentime.substr(end + 1, 2), 10);
    var mmoffset = parseInt(gentime.substr(end + 4, 2), 10);

    // calculate offset in milliseconds
    offset = hhoffset * 60 + mmoffset;
    offset *= 60000;

    // apply offset
    if(c === '+') {
      offset *= -1;
    }

    isUTC = true;
  }

  // check for second fraction
  if(gentime.charAt(14) === '.') {
    fff = parseFloat(gentime.substr(14), 10) * 1000;
  }

  if(isUTC) {
    date.setUTCFullYear(YYYY, MM, DD);
    date.setUTCHours(hh, mm, ss, fff);

    // apply offset
    date.setTime(+date + offset);
  } else {
    date.setFullYear(YYYY, MM, DD);
    date.setHours(hh, mm, ss, fff);
  }

  return date;
};

/**
 * Converts a date to a UTCTime value.
 *
 * Note: GeneralizedTime has 4 digits for the year and is used for X.509
 * dates past 2049. Converting to a GeneralizedTime hasn't been
 * implemented yet.
 *
 * @param date the date to convert.
 *
 * @return the UTCTime value.
 */
asn1.dateToUtcTime = function(date) {
  // TODO: validate; currently assumes proper format
  if(typeof date === 'string') {
    return date;
  }

  var rval = '';

  // create format YYMMDDhhmmssZ
  var format = [];
  format.push(('' + date.getUTCFullYear()).substr(2));
  format.push('' + (date.getUTCMonth() + 1));
  format.push('' + date.getUTCDate());
  format.push('' + date.getUTCHours());
  format.push('' + date.getUTCMinutes());
  format.push('' + date.getUTCSeconds());

  // ensure 2 digits are used for each format entry
  for(var i = 0; i < format.length; ++i) {
    if(format[i].length < 2) {
      rval += '0';
    }
    rval += format[i];
  }
  rval += 'Z';

  return rval;
};

/**
 * Converts a date to a GeneralizedTime value.
 *
 * @param date the date to convert.
 *
 * @return the GeneralizedTime value as a string.
 */
asn1.dateToGeneralizedTime = function(date) {
  // TODO: validate; currently assumes proper format
  if(typeof date === 'string') {
    return date;
  }

  var rval = '';

  // create format YYYYMMDDHHMMSSZ
  var format = [];
  format.push('' + date.getUTCFullYear());
  format.push('' + (date.getUTCMonth() + 1));
  format.push('' + date.getUTCDate());
  format.push('' + date.getUTCHours());
  format.push('' + date.getUTCMinutes());
  format.push('' + date.getUTCSeconds());

  // ensure 2 digits are used for each format entry
  for(var i = 0; i < format.length; ++i) {
    if(format[i].length < 2) {
      rval += '0';
    }
    rval += format[i];
  }
  rval += 'Z';

  return rval;
};

/**
 * Converts a javascript integer to a DER-encoded byte buffer to be used
 * as the value for an INTEGER type.
 *
 * @param x the integer.
 *
 * @return the byte buffer.
 */
asn1.integerToDer = function(x) {
  var rval = forge.util.createBuffer();
  if(x >= -0x80 && x < 0x80) {
    return rval.putSignedInt(x, 8);
  }
  if(x >= -0x8000 && x < 0x8000) {
    return rval.putSignedInt(x, 16);
  }
  if(x >= -0x800000 && x < 0x800000) {
    return rval.putSignedInt(x, 24);
  }
  if(x >= -0x80000000 && x < 0x80000000) {
    return rval.putSignedInt(x, 32);
  }
  var error = new Error('Integer too large; max is 32-bits.');
  error.integer = x;
  throw error;
};

/**
 * Converts a DER-encoded byte buffer to a javascript integer. This is
 * typically used to decode the value of an INTEGER type.
 *
 * @param bytes the byte buffer.
 *
 * @return the integer.
 */
asn1.derToInteger = function(bytes) {
  // wrap in buffer if needed
  if(typeof bytes === 'string') {
    bytes = forge.util.createBuffer(bytes);
  }

  var n = bytes.length() * 8;
  if(n > 32) {
    throw new Error('Integer too large; max is 32-bits.');
  }
  return bytes.getSignedInt(n);
};

/**
 * Validates that the given ASN.1 object is at least a super set of the
 * given ASN.1 structure. Only tag classes and types are checked. An
 * optional map may also be provided to capture ASN.1 values while the
 * structure is checked.
 *
 * To capture an ASN.1 value, set an object in the validator's 'capture'
 * parameter to the key to use in the capture map. To capture the full
 * ASN.1 object, specify 'captureAsn1'. To capture BIT STRING bytes, including
 * the leading unused bits counter byte, specify 'captureBitStringContents'.
 * To capture BIT STRING bytes, without the leading unused bits counter byte,
 * specify 'captureBitStringValue'.
 *
 * Objects in the validator may set a field 'optional' to true to indicate
 * that it isn't necessary to pass validation.
 *
 * @param obj the ASN.1 object to validate.
 * @param v the ASN.1 structure validator.
 * @param capture an optional map to capture values in.
 * @param errors an optional array for storing validation errors.
 *
 * @return true on success, false on failure.
 */
asn1.validate = function(obj, v, capture, errors) {
  var rval = false;

  // ensure tag class and type are the same if specified
  if((obj.tagClass === v.tagClass || typeof(v.tagClass) === 'undefined') &&
    (obj.type === v.type || typeof(v.type) === 'undefined')) {
    // ensure constructed flag is the same if specified
    if(obj.constructed === v.constructed ||
      typeof(v.constructed) === 'undefined') {
      rval = true;

      // handle sub values
      if(v.value && forge.util.isArray(v.value)) {
        var j = 0;
        for(var i = 0; rval && i < v.value.length; ++i) {
          rval = v.value[i].optional || false;
          if(obj.value[j]) {
            rval = asn1.validate(obj.value[j], v.value[i], capture, errors);
            if(rval) {
              ++j;
            } else if(v.value[i].optional) {
              rval = true;
            }
          }
          if(!rval && errors) {
            errors.push(
              '[' + v.name + '] ' +
              'Tag class "' + v.tagClass + '", type "' +
              v.type + '" expected value length "' +
              v.value.length + '", got "' +
              obj.value.length + '"');
          }
        }
      }

      if(rval && capture) {
        if(v.capture) {
          capture[v.capture] = obj.value;
        }
        if(v.captureAsn1) {
          capture[v.captureAsn1] = obj;
        }
        if(v.captureBitStringContents && 'bitStringContents' in obj) {
          capture[v.captureBitStringContents] = obj.bitStringContents;
        }
        if(v.captureBitStringValue && 'bitStringContents' in obj) {
          var value;
          if(obj.bitStringContents.length < 2) {
            capture[v.captureBitStringValue] = '';
          } else {
            // FIXME: support unused bits with data shifting
            var unused = obj.bitStringContents.charCodeAt(0);
            if(unused !== 0) {
              throw new Error(
                'captureBitStringValue only supported for zero unused bits');
            }
            capture[v.captureBitStringValue] = obj.bitStringContents.slice(1);
          }
        }
      }
    } else if(errors) {
      errors.push(
        '[' + v.name + '] ' +
        'Expected constructed "' + v.constructed + '", got "' +
        obj.constructed + '"');
    }
  } else if(errors) {
    if(obj.tagClass !== v.tagClass) {
      errors.push(
        '[' + v.name + '] ' +
        'Expected tag class "' + v.tagClass + '", got "' +
        obj.tagClass + '"');
    }
    if(obj.type !== v.type) {
      errors.push(
        '[' + v.name + '] ' +
        'Expected type "' + v.type + '", got "' + obj.type + '"');
    }
  }
  return rval;
};

// regex for testing for non-latin characters
var _nonLatinRegex = /[^\\u0000-\\u00ff]/;

/**
 * Pretty prints an ASN.1 object to a string.
 *
 * @param obj the object to write out.
 * @param level the level in the tree.
 * @param indentation the indentation to use.
 *
 * @return the string.
 */
asn1.prettyPrint = function(obj, level, indentation) {
  var rval = '';

  // set default level and indentation
  level = level || 0;
  indentation = indentation || 2;

  // start new line for deep levels
  if(level > 0) {
    rval += '\n';
  }

  // create indent
  var indent = '';
  for(var i = 0; i < level * indentation; ++i) {
    indent += ' ';
  }

  // print class:type
  rval += indent + 'Tag: ';
  switch(obj.tagClass) {
  case asn1.Class.UNIVERSAL:
    rval += 'Universal:';
    break;
  case asn1.Class.APPLICATION:
    rval += 'Application:';
    break;
  case asn1.Class.CONTEXT_SPECIFIC:
    rval += 'Context-Specific:';
    break;
  case asn1.Class.PRIVATE:
    rval += 'Private:';
    break;
  }

  if(obj.tagClass === asn1.Class.UNIVERSAL) {
    rval += obj.type;

    // known types
    switch(obj.type) {
    case asn1.Type.NONE:
      rval += ' (None)';
      break;
    case asn1.Type.BOOLEAN:
      rval += ' (Boolean)';
      break;
    case asn1.Type.INTEGER:
      rval += ' (Integer)';
      break;
    case asn1.Type.BITSTRING:
      rval += ' (Bit string)';
      break;
    case asn1.Type.OCTETSTRING:
      rval += ' (Octet string)';
      break;
    case asn1.Type.NULL:
      rval += ' (Null)';
      break;
    case asn1.Type.OID:
      rval += ' (Object Identifier)';
      break;
    case asn1.Type.ODESC:
      rval += ' (Object Descriptor)';
      break;
    case asn1.Type.EXTERNAL:
      rval += ' (External or Instance of)';
      break;
    case asn1.Type.REAL:
      rval += ' (Real)';
      break;
    case asn1.Type.ENUMERATED:
      rval += ' (Enumerated)';
      break;
    case asn1.Type.EMBEDDED:
      rval += ' (Embedded PDV)';
      break;
    case asn1.Type.UTF8:
      rval += ' (UTF8)';
      break;
    case asn1.Type.ROID:
      rval += ' (Relative Object Identifier)';
      break;
    case asn1.Type.SEQUENCE:
      rval += ' (Sequence)';
      break;
    case asn1.Type.SET:
      rval += ' (Set)';
      break;
    case asn1.Type.PRINTABLESTRING:
      rval += ' (Printable String)';
      break;
    case asn1.Type.IA5String:
      rval += ' (IA5String (ASCII))';
      break;
    case asn1.Type.UTCTIME:
      rval += ' (UTC time)';
      break;
    case asn1.Type.GENERALIZEDTIME:
      rval += ' (Generalized time)';
      break;
    case asn1.Type.BMPSTRING:
      rval += ' (BMP String)';
      break;
    }
  } else {
    rval += obj.type;
  }

  rval += '\n';
  rval += indent + 'Constructed: ' + obj.constructed + '\n';

  if(obj.composed) {
    var subvalues = 0;
    var sub = '';
    for(var i = 0; i < obj.value.length; ++i) {
      if(obj.value[i] !== undefined) {
        subvalues += 1;
        sub += asn1.prettyPrint(obj.value[i], level + 1, indentation);
        if((i + 1) < obj.value.length) {
          sub += ',';
        }
      }
    }
    rval += indent + 'Sub values: ' + subvalues + sub;
  } else {
    rval += indent + 'Value: ';
    if(obj.type === asn1.Type.OID) {
      var oid = asn1.derToOid(obj.value);
      rval += oid;
      if(forge.pki && forge.pki.oids) {
        if(oid in forge.pki.oids) {
          rval += ' (' + forge.pki.oids[oid] + ') ';
        }
      }
    }
    if(obj.type === asn1.Type.INTEGER) {
      try {
        rval += asn1.derToInteger(obj.value);
      } catch(ex) {
        rval += '0x' + forge.util.bytesToHex(obj.value);
      }
    } else if(obj.type === asn1.Type.BITSTRING) {
      // TODO: shift bits as needed to display without padding
      if(obj.value.length > 1) {
        // remove unused bits field
        rval += '0x' + forge.util.bytesToHex(obj.value.slice(1));
      } else {
        rval += '(none)';
      }
      // show unused bit count
      if(obj.value.length > 0) {
        var unused = obj.value.charCodeAt(0);
        if(unused == 1) {
          rval += ' (1 unused bit shown)';
        } else if(unused > 1) {
          rval += ' (' + unused + ' unused bits shown)';
        }
      }
    } else if(obj.type === asn1.Type.OCTETSTRING) {
      if(!_nonLatinRegex.test(obj.value)) {
        rval += '(' + obj.value + ') ';
      }
      rval += '0x' + forge.util.bytesToHex(obj.value);
    } else if(obj.type === asn1.Type.UTF8) {
      rval += forge.util.decodeUtf8(obj.value);
    } else if(obj.type === asn1.Type.PRINTABLESTRING ||
      obj.type === asn1.Type.IA5String) {
      rval += obj.value;
    } else if(_nonLatinRegex.test(obj.value)) {
      rval += '0x' + forge.util.bytesToHex(obj.value);
    } else if(obj.value.length === 0) {
      rval += '[null]';
    } else {
      rval += obj.value;
    }
  }

  return rval;
};

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./oids":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/oids.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/baseN.js":[function(require,module,exports){
(function (Buffer){(function (){
/**
 * Base-N/Base-X encoding/decoding functions.
 *
 * Original implementation from base-x:
 * https://github.com/cryptocoinjs/base-x
 *
 * Which is MIT licensed:
 *
 * The MIT License (MIT)
 *
 * Copyright base-x contributors (c) 2016
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */
var api = {};
module.exports = api;

// baseN alphabet indexes
var _reverseAlphabets = {};

/**
 * BaseN-encodes a Uint8Array using the given alphabet.
 *
 * @param input the Uint8Array to encode.
 * @param maxline the maximum number of encoded characters per line to use,
 *          defaults to none.
 *
 * @return the baseN-encoded output string.
 */
api.encode = function(input, alphabet, maxline) {
  if(typeof alphabet !== 'string') {
    throw new TypeError('"alphabet" must be a string.');
  }
  if(maxline !== undefined && typeof maxline !== 'number') {
    throw new TypeError('"maxline" must be a number.');
  }

  var output = '';

  if(!(input instanceof Uint8Array)) {
    // assume forge byte buffer
    output = _encodeWithByteBuffer(input, alphabet);
  } else {
    var i = 0;
    var base = alphabet.length;
    var first = alphabet.charAt(0);
    var digits = [0];
    for(i = 0; i < input.length; ++i) {
      for(var j = 0, carry = input[i]; j < digits.length; ++j) {
        carry += digits[j] << 8;
        digits[j] = carry % base;
        carry = (carry / base) | 0;
      }

      while(carry > 0) {
        digits.push(carry % base);
        carry = (carry / base) | 0;
      }
    }

    // deal with leading zeros
    for(i = 0; input[i] === 0 && i < input.length - 1; ++i) {
      output += first;
    }
    // convert digits to a string
    for(i = digits.length - 1; i >= 0; --i) {
      output += alphabet[digits[i]];
    }
  }

  if(maxline) {
    var regex = new RegExp('.{1,' + maxline + '}', 'g');
    output = output.match(regex).join('\r\n');
  }

  return output;
};

/**
 * Decodes a baseN-encoded (using the given alphabet) string to a
 * Uint8Array.
 *
 * @param input the baseN-encoded input string.
 *
 * @return the Uint8Array.
 */
api.decode = function(input, alphabet) {
  if(typeof input !== 'string') {
    throw new TypeError('"input" must be a string.');
  }
  if(typeof alphabet !== 'string') {
    throw new TypeError('"alphabet" must be a string.');
  }

  var table = _reverseAlphabets[alphabet];
  if(!table) {
    // compute reverse alphabet
    table = _reverseAlphabets[alphabet] = [];
    for(var i = 0; i < alphabet.length; ++i) {
      table[alphabet.charCodeAt(i)] = i;
    }
  }

  // remove whitespace characters
  input = input.replace(/\s/g, '');

  var base = alphabet.length;
  var first = alphabet.charAt(0);
  var bytes = [0];
  for(var i = 0; i < input.length; i++) {
    var value = table[input.charCodeAt(i)];
    if(value === undefined) {
      return;
    }

    for(var j = 0, carry = value; j < bytes.length; ++j) {
      carry += bytes[j] * base;
      bytes[j] = carry & 0xff;
      carry >>= 8;
    }

    while(carry > 0) {
      bytes.push(carry & 0xff);
      carry >>= 8;
    }
  }

  // deal with leading zeros
  for(var k = 0; input[k] === first && k < input.length - 1; ++k) {
    bytes.push(0);
  }

  if(typeof Buffer !== 'undefined') {
    return Buffer.from(bytes.reverse());
  }

  return new Uint8Array(bytes.reverse());
};

function _encodeWithByteBuffer(input, alphabet) {
  var i = 0;
  var base = alphabet.length;
  var first = alphabet.charAt(0);
  var digits = [0];
  for(i = 0; i < input.length(); ++i) {
    for(var j = 0, carry = input.at(i); j < digits.length; ++j) {
      carry += digits[j] << 8;
      digits[j] = carry % base;
      carry = (carry / base) | 0;
    }

    while(carry > 0) {
      digits.push(carry % base);
      carry = (carry / base) | 0;
    }
  }

  var output = '';

  // deal with leading zeros
  for(i = 0; input.at(i) === 0 && i < input.length() - 1; ++i) {
    output += first;
  }
  // convert digits to a string
  for(i = digits.length - 1; i >= 0; --i) {
    output += alphabet[digits[i]];
  }

  return output;
}

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browser-resolve/empty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/cipher.js":[function(require,module,exports){
/**
 * Cipher base API.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2014 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./util');

module.exports = forge.cipher = forge.cipher || {};

// registered algorithms
forge.cipher.algorithms = forge.cipher.algorithms || {};

/**
 * Creates a cipher object that can be used to encrypt data using the given
 * algorithm and key. The algorithm may be provided as a string value for a
 * previously registered algorithm or it may be given as a cipher algorithm
 * API object.
 *
 * @param algorithm the algorithm to use, either a string or an algorithm API
 *          object.
 * @param key the key to use, as a binary-encoded string of bytes or a
 *          byte buffer.
 *
 * @return the cipher.
 */
forge.cipher.createCipher = function(algorithm, key) {
  var api = algorithm;
  if(typeof api === 'string') {
    api = forge.cipher.getAlgorithm(api);
    if(api) {
      api = api();
    }
  }
  if(!api) {
    throw new Error('Unsupported algorithm: ' + algorithm);
  }

  // assume block cipher
  return new forge.cipher.BlockCipher({
    algorithm: api,
    key: key,
    decrypt: false
  });
};

/**
 * Creates a decipher object that can be used to decrypt data using the given
 * algorithm and key. The algorithm may be provided as a string value for a
 * previously registered algorithm or it may be given as a cipher algorithm
 * API object.
 *
 * @param algorithm the algorithm to use, either a string or an algorithm API
 *          object.
 * @param key the key to use, as a binary-encoded string of bytes or a
 *          byte buffer.
 *
 * @return the cipher.
 */
forge.cipher.createDecipher = function(algorithm, key) {
  var api = algorithm;
  if(typeof api === 'string') {
    api = forge.cipher.getAlgorithm(api);
    if(api) {
      api = api();
    }
  }
  if(!api) {
    throw new Error('Unsupported algorithm: ' + algorithm);
  }

  // assume block cipher
  return new forge.cipher.BlockCipher({
    algorithm: api,
    key: key,
    decrypt: true
  });
};

/**
 * Registers an algorithm by name. If the name was already registered, the
 * algorithm API object will be overwritten.
 *
 * @param name the name of the algorithm.
 * @param algorithm the algorithm API object.
 */
forge.cipher.registerAlgorithm = function(name, algorithm) {
  name = name.toUpperCase();
  forge.cipher.algorithms[name] = algorithm;
};

/**
 * Gets a registered algorithm by name.
 *
 * @param name the name of the algorithm.
 *
 * @return the algorithm, if found, null if not.
 */
forge.cipher.getAlgorithm = function(name) {
  name = name.toUpperCase();
  if(name in forge.cipher.algorithms) {
    return forge.cipher.algorithms[name];
  }
  return null;
};

var BlockCipher = forge.cipher.BlockCipher = function(options) {
  this.algorithm = options.algorithm;
  this.mode = this.algorithm.mode;
  this.blockSize = this.mode.blockSize;
  this._finish = false;
  this._input = null;
  this.output = null;
  this._op = options.decrypt ? this.mode.decrypt : this.mode.encrypt;
  this._decrypt = options.decrypt;
  this.algorithm.initialize(options);
};

/**
 * Starts or restarts the encryption or decryption process, whichever
 * was previously configured.
 *
 * For non-GCM mode, the IV may be a binary-encoded string of bytes, an array
 * of bytes, a byte buffer, or an array of 32-bit integers. If the IV is in
 * bytes, then it must be Nb (16) bytes in length. If the IV is given in as
 * 32-bit integers, then it must be 4 integers long.
 *
 * Note: an IV is not required or used in ECB mode.
 *
 * For GCM-mode, the IV must be given as a binary-encoded string of bytes or
 * a byte buffer. The number of bytes should be 12 (96 bits) as recommended
 * by NIST SP-800-38D but another length may be given.
 *
 * @param options the options to use:
 *          iv the initialization vector to use as a binary-encoded string of
 *            bytes, null to reuse the last ciphered block from a previous
 *            update() (this "residue" method is for legacy support only).
 *          additionalData additional authentication data as a binary-encoded
 *            string of bytes, for 'GCM' mode, (default: none).
 *          tagLength desired length of authentication tag, in bits, for
 *            'GCM' mode (0-128, default: 128).
 *          tag the authentication tag to check if decrypting, as a
 *             binary-encoded string of bytes.
 *          output the output the buffer to write to, null to create one.
 */
BlockCipher.prototype.start = function(options) {
  options = options || {};
  var opts = {};
  for(var key in options) {
    opts[key] = options[key];
  }
  opts.decrypt = this._decrypt;
  this._finish = false;
  this._input = forge.util.createBuffer();
  this.output = options.output || forge.util.createBuffer();
  this.mode.start(opts);
};

/**
 * Updates the next block according to the cipher mode.
 *
 * @param input the buffer to read from.
 */
BlockCipher.prototype.update = function(input) {
  if(input) {
    // input given, so empty it into the input buffer
    this._input.putBuffer(input);
  }

  // do cipher operation until it needs more input and not finished
  while(!this._op.call(this.mode, this._input, this.output, this._finish) &&
    !this._finish) {}

  // free consumed memory from input buffer
  this._input.compact();
};

/**
 * Finishes encrypting or decrypting.
 *
 * @param pad a padding function to use in CBC mode, null for default,
 *          signature(blockSize, buffer, decrypt).
 *
 * @return true if successful, false on error.
 */
BlockCipher.prototype.finish = function(pad) {
  // backwards-compatibility w/deprecated padding API
  // Note: will overwrite padding functions even after another start() call
  if(pad && (this.mode.name === 'ECB' || this.mode.name === 'CBC')) {
    this.mode.pad = function(input) {
      return pad(this.blockSize, input, false);
    };
    this.mode.unpad = function(output) {
      return pad(this.blockSize, output, true);
    };
  }

  // build options for padding and afterFinish functions
  var options = {};
  options.decrypt = this._decrypt;

  // get # of bytes that won't fill a block
  options.overflow = this._input.length() % this.blockSize;

  if(!this._decrypt && this.mode.pad) {
    if(!this.mode.pad(this._input, options)) {
      return false;
    }
  }

  // do final update
  this._finish = true;
  this.update();

  if(this._decrypt && this.mode.unpad) {
    if(!this.mode.unpad(this.output, options)) {
      return false;
    }
  }

  if(this.mode.afterFinish) {
    if(!this.mode.afterFinish(this.output, options)) {
      return false;
    }
  }

  return true;
};

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/cipherModes.js":[function(require,module,exports){
/**
 * Supported cipher modes.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2014 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./util');

forge.cipher = forge.cipher || {};

// supported cipher modes
var modes = module.exports = forge.cipher.modes = forge.cipher.modes || {};

/** Electronic codebook (ECB) (Don't use this; it's not secure) **/

modes.ecb = function(options) {
  options = options || {};
  this.name = 'ECB';
  this.cipher = options.cipher;
  this.blockSize = options.blockSize || 16;
  this._ints = this.blockSize / 4;
  this._inBlock = new Array(this._ints);
  this._outBlock = new Array(this._ints);
};

modes.ecb.prototype.start = function(options) {};

modes.ecb.prototype.encrypt = function(input, output, finish) {
  // not enough input to encrypt
  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {
    return true;
  }

  // get next block
  for(var i = 0; i < this._ints; ++i) {
    this._inBlock[i] = input.getInt32();
  }

  // encrypt block
  this.cipher.encrypt(this._inBlock, this._outBlock);

  // write output
  for(var i = 0; i < this._ints; ++i) {
    output.putInt32(this._outBlock[i]);
  }
};

modes.ecb.prototype.decrypt = function(input, output, finish) {
  // not enough input to decrypt
  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {
    return true;
  }

  // get next block
  for(var i = 0; i < this._ints; ++i) {
    this._inBlock[i] = input.getInt32();
  }

  // decrypt block
  this.cipher.decrypt(this._inBlock, this._outBlock);

  // write output
  for(var i = 0; i < this._ints; ++i) {
    output.putInt32(this._outBlock[i]);
  }
};

modes.ecb.prototype.pad = function(input, options) {
  // add PKCS#7 padding to block (each pad byte is the
  // value of the number of pad bytes)
  var padding = (input.length() === this.blockSize ?
    this.blockSize : (this.blockSize - input.length()));
  input.fillWithByte(padding, padding);
  return true;
};

modes.ecb.prototype.unpad = function(output, options) {
  // check for error: input data not a multiple of blockSize
  if(options.overflow > 0) {
    return false;
  }

  // ensure padding byte count is valid
  var len = output.length();
  var count = output.at(len - 1);
  if(count > (this.blockSize << 2)) {
    return false;
  }

  // trim off padding bytes
  output.truncate(count);
  return true;
};

/** Cipher-block Chaining (CBC) **/

modes.cbc = function(options) {
  options = options || {};
  this.name = 'CBC';
  this.cipher = options.cipher;
  this.blockSize = options.blockSize || 16;
  this._ints = this.blockSize / 4;
  this._inBlock = new Array(this._ints);
  this._outBlock = new Array(this._ints);
};

modes.cbc.prototype.start = function(options) {
  // Note: legacy support for using IV residue (has security flaws)
  // if IV is null, reuse block from previous processing
  if(options.iv === null) {
    // must have a previous block
    if(!this._prev) {
      throw new Error('Invalid IV parameter.');
    }
    this._iv = this._prev.slice(0);
  } else if(!('iv' in options)) {
    throw new Error('Invalid IV parameter.');
  } else {
    // save IV as "previous" block
    this._iv = transformIV(options.iv);
    this._prev = this._iv.slice(0);
  }
};

modes.cbc.prototype.encrypt = function(input, output, finish) {
  // not enough input to encrypt
  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {
    return true;
  }

  // get next block
  // CBC XOR's IV (or previous block) with plaintext
  for(var i = 0; i < this._ints; ++i) {
    this._inBlock[i] = this._prev[i] ^ input.getInt32();
  }

  // encrypt block
  this.cipher.encrypt(this._inBlock, this._outBlock);

  // write output, save previous block
  for(var i = 0; i < this._ints; ++i) {
    output.putInt32(this._outBlock[i]);
  }
  this._prev = this._outBlock;
};

modes.cbc.prototype.decrypt = function(input, output, finish) {
  // not enough input to decrypt
  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {
    return true;
  }

  // get next block
  for(var i = 0; i < this._ints; ++i) {
    this._inBlock[i] = input.getInt32();
  }

  // decrypt block
  this.cipher.decrypt(this._inBlock, this._outBlock);

  // write output, save previous ciphered block
  // CBC XOR's IV (or previous block) with ciphertext
  for(var i = 0; i < this._ints; ++i) {
    output.putInt32(this._prev[i] ^ this._outBlock[i]);
  }
  this._prev = this._inBlock.slice(0);
};

modes.cbc.prototype.pad = function(input, options) {
  // add PKCS#7 padding to block (each pad byte is the
  // value of the number of pad bytes)
  var padding = (input.length() === this.blockSize ?
    this.blockSize : (this.blockSize - input.length()));
  input.fillWithByte(padding, padding);
  return true;
};

modes.cbc.prototype.unpad = function(output, options) {
  // check for error: input data not a multiple of blockSize
  if(options.overflow > 0) {
    return false;
  }

  // ensure padding byte count is valid
  var len = output.length();
  var count = output.at(len - 1);
  if(count > (this.blockSize << 2)) {
    return false;
  }

  // trim off padding bytes
  output.truncate(count);
  return true;
};

/** Cipher feedback (CFB) **/

modes.cfb = function(options) {
  options = options || {};
  this.name = 'CFB';
  this.cipher = options.cipher;
  this.blockSize = options.blockSize || 16;
  this._ints = this.blockSize / 4;
  this._inBlock = null;
  this._outBlock = new Array(this._ints);
  this._partialBlock = new Array(this._ints);
  this._partialOutput = forge.util.createBuffer();
  this._partialBytes = 0;
};

modes.cfb.prototype.start = function(options) {
  if(!('iv' in options)) {
    throw new Error('Invalid IV parameter.');
  }
  // use IV as first input
  this._iv = transformIV(options.iv);
  this._inBlock = this._iv.slice(0);
  this._partialBytes = 0;
};

modes.cfb.prototype.encrypt = function(input, output, finish) {
  // not enough input to encrypt
  var inputLength = input.length();
  if(inputLength === 0) {
    return true;
  }

  // encrypt block
  this.cipher.encrypt(this._inBlock, this._outBlock);

  // handle full block
  if(this._partialBytes === 0 && inputLength >= this.blockSize) {
    // XOR input with output, write input as output
    for(var i = 0; i < this._ints; ++i) {
      this._inBlock[i] = input.getInt32() ^ this._outBlock[i];
      output.putInt32(this._inBlock[i]);
    }
    return;
  }

  // handle partial block
  var partialBytes = (this.blockSize - inputLength) % this.blockSize;
  if(partialBytes > 0) {
    partialBytes = this.blockSize - partialBytes;
  }

  // XOR input with output, write input as partial output
  this._partialOutput.clear();
  for(var i = 0; i < this._ints; ++i) {
    this._partialBlock[i] = input.getInt32() ^ this._outBlock[i];
    this._partialOutput.putInt32(this._partialBlock[i]);
  }

  if(partialBytes > 0) {
    // block still incomplete, restore input buffer
    input.read -= this.blockSize;
  } else {
    // block complete, update input block
    for(var i = 0; i < this._ints; ++i) {
      this._inBlock[i] = this._partialBlock[i];
    }
  }

  // skip any previous partial bytes
  if(this._partialBytes > 0) {
    this._partialOutput.getBytes(this._partialBytes);
  }

  if(partialBytes > 0 && !finish) {
    output.putBytes(this._partialOutput.getBytes(
      partialBytes - this._partialBytes));
    this._partialBytes = partialBytes;
    return true;
  }

  output.putBytes(this._partialOutput.getBytes(
    inputLength - this._partialBytes));
  this._partialBytes = 0;
};

modes.cfb.prototype.decrypt = function(input, output, finish) {
  // not enough input to decrypt
  var inputLength = input.length();
  if(inputLength === 0) {
    return true;
  }

  // encrypt block (CFB always uses encryption mode)
  this.cipher.encrypt(this._inBlock, this._outBlock);

  // handle full block
  if(this._partialBytes === 0 && inputLength >= this.blockSize) {
    // XOR input with output, write input as output
    for(var i = 0; i < this._ints; ++i) {
      this._inBlock[i] = input.getInt32();
      output.putInt32(this._inBlock[i] ^ this._outBlock[i]);
    }
    return;
  }

  // handle partial block
  var partialBytes = (this.blockSize - inputLength) % this.blockSize;
  if(partialBytes > 0) {
    partialBytes = this.blockSize - partialBytes;
  }

  // XOR input with output, write input as partial output
  this._partialOutput.clear();
  for(var i = 0; i < this._ints; ++i) {
    this._partialBlock[i] = input.getInt32();
    this._partialOutput.putInt32(this._partialBlock[i] ^ this._outBlock[i]);
  }

  if(partialBytes > 0) {
    // block still incomplete, restore input buffer
    input.read -= this.blockSize;
  } else {
    // block complete, update input block
    for(var i = 0; i < this._ints; ++i) {
      this._inBlock[i] = this._partialBlock[i];
    }
  }

  // skip any previous partial bytes
  if(this._partialBytes > 0) {
    this._partialOutput.getBytes(this._partialBytes);
  }

  if(partialBytes > 0 && !finish) {
    output.putBytes(this._partialOutput.getBytes(
      partialBytes - this._partialBytes));
    this._partialBytes = partialBytes;
    return true;
  }

  output.putBytes(this._partialOutput.getBytes(
    inputLength - this._partialBytes));
  this._partialBytes = 0;
};

/** Output feedback (OFB) **/

modes.ofb = function(options) {
  options = options || {};
  this.name = 'OFB';
  this.cipher = options.cipher;
  this.blockSize = options.blockSize || 16;
  this._ints = this.blockSize / 4;
  this._inBlock = null;
  this._outBlock = new Array(this._ints);
  this._partialOutput = forge.util.createBuffer();
  this._partialBytes = 0;
};

modes.ofb.prototype.start = function(options) {
  if(!('iv' in options)) {
    throw new Error('Invalid IV parameter.');
  }
  // use IV as first input
  this._iv = transformIV(options.iv);
  this._inBlock = this._iv.slice(0);
  this._partialBytes = 0;
};

modes.ofb.prototype.encrypt = function(input, output, finish) {
  // not enough input to encrypt
  var inputLength = input.length();
  if(input.length() === 0) {
    return true;
  }

  // encrypt block (OFB always uses encryption mode)
  this.cipher.encrypt(this._inBlock, this._outBlock);

  // handle full block
  if(this._partialBytes === 0 && inputLength >= this.blockSize) {
    // XOR input with output and update next input
    for(var i = 0; i < this._ints; ++i) {
      output.putInt32(input.getInt32() ^ this._outBlock[i]);
      this._inBlock[i] = this._outBlock[i];
    }
    return;
  }

  // handle partial block
  var partialBytes = (this.blockSize - inputLength) % this.blockSize;
  if(partialBytes > 0) {
    partialBytes = this.blockSize - partialBytes;
  }

  // XOR input with output
  this._partialOutput.clear();
  for(var i = 0; i < this._ints; ++i) {
    this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]);
  }

  if(partialBytes > 0) {
    // block still incomplete, restore input buffer
    input.read -= this.blockSize;
  } else {
    // block complete, update input block
    for(var i = 0; i < this._ints; ++i) {
      this._inBlock[i] = this._outBlock[i];
    }
  }

  // skip any previous partial bytes
  if(this._partialBytes > 0) {
    this._partialOutput.getBytes(this._partialBytes);
  }

  if(partialBytes > 0 && !finish) {
    output.putBytes(this._partialOutput.getBytes(
      partialBytes - this._partialBytes));
    this._partialBytes = partialBytes;
    return true;
  }

  output.putBytes(this._partialOutput.getBytes(
    inputLength - this._partialBytes));
  this._partialBytes = 0;
};

modes.ofb.prototype.decrypt = modes.ofb.prototype.encrypt;

/** Counter (CTR) **/

modes.ctr = function(options) {
  options = options || {};
  this.name = 'CTR';
  this.cipher = options.cipher;
  this.blockSize = options.blockSize || 16;
  this._ints = this.blockSize / 4;
  this._inBlock = null;
  this._outBlock = new Array(this._ints);
  this._partialOutput = forge.util.createBuffer();
  this._partialBytes = 0;
};

modes.ctr.prototype.start = function(options) {
  if(!('iv' in options)) {
    throw new Error('Invalid IV parameter.');
  }
  // use IV as first input
  this._iv = transformIV(options.iv);
  this._inBlock = this._iv.slice(0);
  this._partialBytes = 0;
};

modes.ctr.prototype.encrypt = function(input, output, finish) {
  // not enough input to encrypt
  var inputLength = input.length();
  if(inputLength === 0) {
    return true;
  }

  // encrypt block (CTR always uses encryption mode)
  this.cipher.encrypt(this._inBlock, this._outBlock);

  // handle full block
  if(this._partialBytes === 0 && inputLength >= this.blockSize) {
    // XOR input with output
    for(var i = 0; i < this._ints; ++i) {
      output.putInt32(input.getInt32() ^ this._outBlock[i]);
    }
  } else {
    // handle partial block
    var partialBytes = (this.blockSize - inputLength) % this.blockSize;
    if(partialBytes > 0) {
      partialBytes = this.blockSize - partialBytes;
    }

    // XOR input with output
    this._partialOutput.clear();
    for(var i = 0; i < this._ints; ++i) {
      this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]);
    }

    if(partialBytes > 0) {
      // block still incomplete, restore input buffer
      input.read -= this.blockSize;
    }

    // skip any previous partial bytes
    if(this._partialBytes > 0) {
      this._partialOutput.getBytes(this._partialBytes);
    }

    if(partialBytes > 0 && !finish) {
      output.putBytes(this._partialOutput.getBytes(
        partialBytes - this._partialBytes));
      this._partialBytes = partialBytes;
      return true;
    }

    output.putBytes(this._partialOutput.getBytes(
      inputLength - this._partialBytes));
    this._partialBytes = 0;
  }

  // block complete, increment counter (input block)
  inc32(this._inBlock);
};

modes.ctr.prototype.decrypt = modes.ctr.prototype.encrypt;

/** Galois/Counter Mode (GCM) **/

modes.gcm = function(options) {
  options = options || {};
  this.name = 'GCM';
  this.cipher = options.cipher;
  this.blockSize = options.blockSize || 16;
  this._ints = this.blockSize / 4;
  this._inBlock = new Array(this._ints);
  this._outBlock = new Array(this._ints);
  this._partialOutput = forge.util.createBuffer();
  this._partialBytes = 0;

  // R is actually this value concatenated with 120 more zero bits, but
  // we only XOR against R so the other zeros have no effect -- we just
  // apply this value to the first integer in a block
  this._R = 0xE1000000;
};

modes.gcm.prototype.start = function(options) {
  if(!('iv' in options)) {
    throw new Error('Invalid IV parameter.');
  }
  // ensure IV is a byte buffer
  var iv = forge.util.createBuffer(options.iv);

  // no ciphered data processed yet
  this._cipherLength = 0;

  // default additional data is none
  var additionalData;
  if('additionalData' in options) {
    additionalData = forge.util.createBuffer(options.additionalData);
  } else {
    additionalData = forge.util.createBuffer();
  }

  // default tag length is 128 bits
  if('tagLength' in options) {
    this._tagLength = options.tagLength;
  } else {
    this._tagLength = 128;
  }

  // if tag is given, ensure tag matches tag length
  this._tag = null;
  if(options.decrypt) {
    // save tag to check later
    this._tag = forge.util.createBuffer(options.tag).getBytes();
    if(this._tag.length !== (this._tagLength / 8)) {
      throw new Error('Authentication tag does not match tag length.');
    }
  }

  // create tmp storage for hash calculation
  this._hashBlock = new Array(this._ints);

  // no tag generated yet
  this.tag = null;

  // generate hash subkey
  // (apply block cipher to "zero" block)
  this._hashSubkey = new Array(this._ints);
  this.cipher.encrypt([0, 0, 0, 0], this._hashSubkey);

  // generate table M
  // use 4-bit tables (32 component decomposition of a 16 byte value)
  // 8-bit tables take more space and are known to have security
  // vulnerabilities (in native implementations)
  this.componentBits = 4;
  this._m = this.generateHashTable(this._hashSubkey, this.componentBits);

  // Note: support IV length different from 96 bits? (only supporting
  // 96 bits is recommended by NIST SP-800-38D)
  // generate J_0
  var ivLength = iv.length();
  if(ivLength === 12) {
    // 96-bit IV
    this._j0 = [iv.getInt32(), iv.getInt32(), iv.getInt32(), 1];
  } else {
    // IV is NOT 96-bits
    this._j0 = [0, 0, 0, 0];
    while(iv.length() > 0) {
      this._j0 = this.ghash(
        this._hashSubkey, this._j0,
        [iv.getInt32(), iv.getInt32(), iv.getInt32(), iv.getInt32()]);
    }
    this._j0 = this.ghash(
      this._hashSubkey, this._j0, [0, 0].concat(from64To32(ivLength * 8)));
  }

  // generate ICB (initial counter block)
  this._inBlock = this._j0.slice(0);
  inc32(this._inBlock);
  this._partialBytes = 0;

  // consume authentication data
  additionalData = forge.util.createBuffer(additionalData);
  // save additional data length as a BE 64-bit number
  this._aDataLength = from64To32(additionalData.length() * 8);
  // pad additional data to 128 bit (16 byte) block size
  var overflow = additionalData.length() % this.blockSize;
  if(overflow) {
    additionalData.fillWithByte(0, this.blockSize - overflow);
  }
  this._s = [0, 0, 0, 0];
  while(additionalData.length() > 0) {
    this._s = this.ghash(this._hashSubkey, this._s, [
      additionalData.getInt32(),
      additionalData.getInt32(),
      additionalData.getInt32(),
      additionalData.getInt32()
    ]);
  }
};

modes.gcm.prototype.encrypt = function(input, output, finish) {
  // not enough input to encrypt
  var inputLength = input.length();
  if(inputLength === 0) {
    return true;
  }

  // encrypt block
  this.cipher.encrypt(this._inBlock, this._outBlock);

  // handle full block
  if(this._partialBytes === 0 && inputLength >= this.blockSize) {
    // XOR input with output
    for(var i = 0; i < this._ints; ++i) {
      output.putInt32(this._outBlock[i] ^= input.getInt32());
    }
    this._cipherLength += this.blockSize;
  } else {
    // handle partial block
    var partialBytes = (this.blockSize - inputLength) % this.blockSize;
    if(partialBytes > 0) {
      partialBytes = this.blockSize - partialBytes;
    }

    // XOR input with output
    this._partialOutput.clear();
    for(var i = 0; i < this._ints; ++i) {
      this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]);
    }

    if(partialBytes <= 0 || finish) {
      // handle overflow prior to hashing
      if(finish) {
        // get block overflow
        var overflow = inputLength % this.blockSize;
        this._cipherLength += overflow;
        // truncate for hash function
        this._partialOutput.truncate(this.blockSize - overflow);
      } else {
        this._cipherLength += this.blockSize;
      }

      // get output block for hashing
      for(var i = 0; i < this._ints; ++i) {
        this._outBlock[i] = this._partialOutput.getInt32();
      }
      this._partialOutput.read -= this.blockSize;
    }

    // skip any previous partial bytes
    if(this._partialBytes > 0) {
      this._partialOutput.getBytes(this._partialBytes);
    }

    if(partialBytes > 0 && !finish) {
      // block still incomplete, restore input buffer, get partial output,
      // and return early
      input.read -= this.blockSize;
      output.putBytes(this._partialOutput.getBytes(
        partialBytes - this._partialBytes));
      this._partialBytes = partialBytes;
      return true;
    }

    output.putBytes(this._partialOutput.getBytes(
      inputLength - this._partialBytes));
    this._partialBytes = 0;
  }

  // update hash block S
  this._s = this.ghash(this._hashSubkey, this._s, this._outBlock);

  // increment counter (input block)
  inc32(this._inBlock);
};

modes.gcm.prototype.decrypt = function(input, output, finish) {
  // not enough input to decrypt
  var inputLength = input.length();
  if(inputLength < this.blockSize && !(finish && inputLength > 0)) {
    return true;
  }

  // encrypt block (GCM always uses encryption mode)
  this.cipher.encrypt(this._inBlock, this._outBlock);

  // increment counter (input block)
  inc32(this._inBlock);

  // update hash block S
  this._hashBlock[0] = input.getInt32();
  this._hashBlock[1] = input.getInt32();
  this._hashBlock[2] = input.getInt32();
  this._hashBlock[3] = input.getInt32();
  this._s = this.ghash(this._hashSubkey, this._s, this._hashBlock);

  // XOR hash input with output
  for(var i = 0; i < this._ints; ++i) {
    output.putInt32(this._outBlock[i] ^ this._hashBlock[i]);
  }

  // increment cipher data length
  if(inputLength < this.blockSize) {
    this._cipherLength += inputLength % this.blockSize;
  } else {
    this._cipherLength += this.blockSize;
  }
};

modes.gcm.prototype.afterFinish = function(output, options) {
  var rval = true;

  // handle overflow
  if(options.decrypt && options.overflow) {
    output.truncate(this.blockSize - options.overflow);
  }

  // handle authentication tag
  this.tag = forge.util.createBuffer();

  // concatenate additional data length with cipher length
  var lengths = this._aDataLength.concat(from64To32(this._cipherLength * 8));

  // include lengths in hash
  this._s = this.ghash(this._hashSubkey, this._s, lengths);

  // do GCTR(J_0, S)
  var tag = [];
  this.cipher.encrypt(this._j0, tag);
  for(var i = 0; i < this._ints; ++i) {
    this.tag.putInt32(this._s[i] ^ tag[i]);
  }

  // trim tag to length
  this.tag.truncate(this.tag.length() % (this._tagLength / 8));

  // check authentication tag
  if(options.decrypt && this.tag.bytes() !== this._tag) {
    rval = false;
  }

  return rval;
};

/**
 * See NIST SP-800-38D 6.3 (Algorithm 1). This function performs Galois
 * field multiplication. The field, GF(2^128), is defined by the polynomial:
 *
 * x^128 + x^7 + x^2 + x + 1
 *
 * Which is represented in little-endian binary form as: 11100001 (0xe1). When
 * the value of a coefficient is 1, a bit is set. The value R, is the
 * concatenation of this value and 120 zero bits, yielding a 128-bit value
 * which matches the block size.
 *
 * This function will multiply two elements (vectors of bytes), X and Y, in
 * the field GF(2^128). The result is initialized to zero. For each bit of
 * X (out of 128), x_i, if x_i is set, then the result is multiplied (XOR'd)
 * by the current value of Y. For each bit, the value of Y will be raised by
 * a power of x (multiplied by the polynomial x). This can be achieved by
 * shifting Y once to the right. If the current value of Y, prior to being
 * multiplied by x, has 0 as its LSB, then it is a 127th degree polynomial.
 * Otherwise, we must divide by R after shifting to find the remainder.
 *
 * @param x the first block to multiply by the second.
 * @param y the second block to multiply by the first.
 *
 * @return the block result of the multiplication.
 */
modes.gcm.prototype.multiply = function(x, y) {
  var z_i = [0, 0, 0, 0];
  var v_i = y.slice(0);

  // calculate Z_128 (block has 128 bits)
  for(var i = 0; i < 128; ++i) {
    // if x_i is 0, Z_{i+1} = Z_i (unchanged)
    // else Z_{i+1} = Z_i ^ V_i
    // get x_i by finding 32-bit int position, then left shift 1 by remainder
    var x_i = x[(i / 32) | 0] & (1 << (31 - i % 32));
    if(x_i) {
      z_i[0] ^= v_i[0];
      z_i[1] ^= v_i[1];
      z_i[2] ^= v_i[2];
      z_i[3] ^= v_i[3];
    }

    // if LSB(V_i) is 1, V_i = V_i >> 1
    // else V_i = (V_i >> 1) ^ R
    this.pow(v_i, v_i);
  }

  return z_i;
};

modes.gcm.prototype.pow = function(x, out) {
  // if LSB(x) is 1, x = x >>> 1
  // else x = (x >>> 1) ^ R
  var lsb = x[3] & 1;

  // always do x >>> 1:
  // starting with the rightmost integer, shift each integer to the right
  // one bit, pulling in the bit from the integer to the left as its top
  // most bit (do this for the last 3 integers)
  for(var i = 3; i > 0; --i) {
    out[i] = (x[i] >>> 1) | ((x[i - 1] & 1) << 31);
  }
  // shift the first integer normally
  out[0] = x[0] >>> 1;

  // if lsb was not set, then polynomial had a degree of 127 and doesn't
  // need to divided; otherwise, XOR with R to find the remainder; we only
  // need to XOR the first integer since R technically ends w/120 zero bits
  if(lsb) {
    out[0] ^= this._R;
  }
};

modes.gcm.prototype.tableMultiply = function(x) {
  // assumes 4-bit tables are used
  var z = [0, 0, 0, 0];
  for(var i = 0; i < 32; ++i) {
    var idx = (i / 8) | 0;
    var x_i = (x[idx] >>> ((7 - (i % 8)) * 4)) & 0xF;
    var ah = this._m[i][x_i];
    z[0] ^= ah[0];
    z[1] ^= ah[1];
    z[2] ^= ah[2];
    z[3] ^= ah[3];
  }
  return z;
};

/**
 * A continuing version of the GHASH algorithm that operates on a single
 * block. The hash block, last hash value (Ym) and the new block to hash
 * are given.
 *
 * @param h the hash block.
 * @param y the previous value for Ym, use [0, 0, 0, 0] for a new hash.
 * @param x the block to hash.
 *
 * @return the hashed value (Ym).
 */
modes.gcm.prototype.ghash = function(h, y, x) {
  y[0] ^= x[0];
  y[1] ^= x[1];
  y[2] ^= x[2];
  y[3] ^= x[3];
  return this.tableMultiply(y);
  //return this.multiply(y, h);
};

/**
 * Precomputes a table for multiplying against the hash subkey. This
 * mechanism provides a substantial speed increase over multiplication
 * performed without a table. The table-based multiplication this table is
 * for solves X * H by multiplying each component of X by H and then
 * composing the results together using XOR.
 *
 * This function can be used to generate tables with different bit sizes
 * for the components, however, this implementation assumes there are
 * 32 components of X (which is a 16 byte vector), therefore each component
 * takes 4-bits (so the table is constructed with bits=4).
 *
 * @param h the hash subkey.
 * @param bits the bit size for a component.
 */
modes.gcm.prototype.generateHashTable = function(h, bits) {
  // TODO: There are further optimizations that would use only the
  // first table M_0 (or some variant) along with a remainder table;
  // this can be explored in the future
  var multiplier = 8 / bits;
  var perInt = 4 * multiplier;
  var size = 16 * multiplier;
  var m = new Array(size);
  for(var i = 0; i < size; ++i) {
    var tmp = [0, 0, 0, 0];
    var idx = (i / perInt) | 0;
    var shft = ((perInt - 1 - (i % perInt)) * bits);
    tmp[idx] = (1 << (bits - 1)) << shft;
    m[i] = this.generateSubHashTable(this.multiply(tmp, h), bits);
  }
  return m;
};

/**
 * Generates a table for multiplying against the hash subkey for one
 * particular component (out of all possible component values).
 *
 * @param mid the pre-multiplied value for the middle key of the table.
 * @param bits the bit size for a component.
 */
modes.gcm.prototype.generateSubHashTable = function(mid, bits) {
  // compute the table quickly by minimizing the number of
  // POW operations -- they only need to be performed for powers of 2,
  // all other entries can be composed from those powers using XOR
  var size = 1 << bits;
  var half = size >>> 1;
  var m = new Array(size);
  m[half] = mid.slice(0);
  var i = half >>> 1;
  while(i > 0) {
    // raise m0[2 * i] and store in m0[i]
    this.pow(m[2 * i], m[i] = []);
    i >>= 1;
  }
  i = 2;
  while(i < half) {
    for(var j = 1; j < i; ++j) {
      var m_i = m[i];
      var m_j = m[j];
      m[i + j] = [
        m_i[0] ^ m_j[0],
        m_i[1] ^ m_j[1],
        m_i[2] ^ m_j[2],
        m_i[3] ^ m_j[3]
      ];
    }
    i *= 2;
  }
  m[0] = [0, 0, 0, 0];
  /* Note: We could avoid storing these by doing composition during multiply
  calculate top half using composition by speed is preferred. */
  for(i = half + 1; i < size; ++i) {
    var c = m[i ^ half];
    m[i] = [mid[0] ^ c[0], mid[1] ^ c[1], mid[2] ^ c[2], mid[3] ^ c[3]];
  }
  return m;
};

/** Utility functions */

function transformIV(iv) {
  if(typeof iv === 'string') {
    // convert iv string into byte buffer
    iv = forge.util.createBuffer(iv);
  }

  if(forge.util.isArray(iv) && iv.length > 4) {
    // convert iv byte array into byte buffer
    var tmp = iv;
    iv = forge.util.createBuffer();
    for(var i = 0; i < tmp.length; ++i) {
      iv.putByte(tmp[i]);
    }
  }
  if(!forge.util.isArray(iv)) {
    // convert iv byte buffer into 32-bit integer array
    iv = [iv.getInt32(), iv.getInt32(), iv.getInt32(), iv.getInt32()];
  }

  return iv;
}

function inc32(block) {
  // increment last 32 bits of block only
  block[block.length - 1] = (block[block.length - 1] + 1) & 0xFFFFFFFF;
}

function from64To32(num) {
  // convert 64-bit number to two BE Int32s
  return [(num / 0x100000000) | 0, num & 0xFFFFFFFF];
}

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/des.js":[function(require,module,exports){
/**
 * DES (Data Encryption Standard) implementation.
 *
 * This implementation supports DES as well as 3DES-EDE in ECB and CBC mode.
 * It is based on the BSD-licensed implementation by Paul Tero:
 *
 * Paul Tero, July 2001
 * http://www.tero.co.uk/des/
 *
 * Optimised for performance with large blocks by
 * Michael Hayworth, November 2001
 * http://www.netdealing.com
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * @author Stefan Siegl
 * @author Dave Longley
 *
 * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>
 * Copyright (c) 2012-2014 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./cipher');
require('./cipherModes');
require('./util');

/* DES API */
module.exports = forge.des = forge.des || {};

/**
 * Deprecated. Instead, use:
 *
 * var cipher = forge.cipher.createCipher('DES-<mode>', key);
 * cipher.start({iv: iv});
 *
 * Creates an DES cipher object to encrypt data using the given symmetric key.
 * The output will be stored in the 'output' member of the returned cipher.
 *
 * The key and iv may be given as binary-encoded strings of bytes or
 * byte buffers.
 *
 * @param key the symmetric key to use (64 or 192 bits).
 * @param iv the initialization vector to use.
 * @param output the buffer to write to, null to create one.
 * @param mode the cipher mode to use (default: 'CBC' if IV is
 *          given, 'ECB' if null).
 *
 * @return the cipher.
 */
forge.des.startEncrypting = function(key, iv, output, mode) {
  var cipher = _createCipher({
    key: key,
    output: output,
    decrypt: false,
    mode: mode || (iv === null ? 'ECB' : 'CBC')
  });
  cipher.start(iv);
  return cipher;
};

/**
 * Deprecated. Instead, use:
 *
 * var cipher = forge.cipher.createCipher('DES-<mode>', key);
 *
 * Creates an DES cipher object to encrypt data using the given symmetric key.
 *
 * The key may be given as a binary-encoded string of bytes or a byte buffer.
 *
 * @param key the symmetric key to use (64 or 192 bits).
 * @param mode the cipher mode to use (default: 'CBC').
 *
 * @return the cipher.
 */
forge.des.createEncryptionCipher = function(key, mode) {
  return _createCipher({
    key: key,
    output: null,
    decrypt: false,
    mode: mode
  });
};

/**
 * Deprecated. Instead, use:
 *
 * var decipher = forge.cipher.createDecipher('DES-<mode>', key);
 * decipher.start({iv: iv});
 *
 * Creates an DES cipher object to decrypt data using the given symmetric key.
 * The output will be stored in the 'output' member of the returned cipher.
 *
 * The key and iv may be given as binary-encoded strings of bytes or
 * byte buffers.
 *
 * @param key the symmetric key to use (64 or 192 bits).
 * @param iv the initialization vector to use.
 * @param output the buffer to write to, null to create one.
 * @param mode the cipher mode to use (default: 'CBC' if IV is
 *          given, 'ECB' if null).
 *
 * @return the cipher.
 */
forge.des.startDecrypting = function(key, iv, output, mode) {
  var cipher = _createCipher({
    key: key,
    output: output,
    decrypt: true,
    mode: mode || (iv === null ? 'ECB' : 'CBC')
  });
  cipher.start(iv);
  return cipher;
};

/**
 * Deprecated. Instead, use:
 *
 * var decipher = forge.cipher.createDecipher('DES-<mode>', key);
 *
 * Creates an DES cipher object to decrypt data using the given symmetric key.
 *
 * The key may be given as a binary-encoded string of bytes or a byte buffer.
 *
 * @param key the symmetric key to use (64 or 192 bits).
 * @param mode the cipher mode to use (default: 'CBC').
 *
 * @return the cipher.
 */
forge.des.createDecryptionCipher = function(key, mode) {
  return _createCipher({
    key: key,
    output: null,
    decrypt: true,
    mode: mode
  });
};

/**
 * Creates a new DES cipher algorithm object.
 *
 * @param name the name of the algorithm.
 * @param mode the mode factory function.
 *
 * @return the DES algorithm object.
 */
forge.des.Algorithm = function(name, mode) {
  var self = this;
  self.name = name;
  self.mode = new mode({
    blockSize: 8,
    cipher: {
      encrypt: function(inBlock, outBlock) {
        return _updateBlock(self._keys, inBlock, outBlock, false);
      },
      decrypt: function(inBlock, outBlock) {
        return _updateBlock(self._keys, inBlock, outBlock, true);
      }
    }
  });
  self._init = false;
};

/**
 * Initializes this DES algorithm by expanding its key.
 *
 * @param options the options to use.
 *          key the key to use with this algorithm.
 *          decrypt true if the algorithm should be initialized for decryption,
 *            false for encryption.
 */
forge.des.Algorithm.prototype.initialize = function(options) {
  if(this._init) {
    return;
  }

  var key = forge.util.createBuffer(options.key);
  if(this.name.indexOf('3DES') === 0) {
    if(key.length() !== 24) {
      throw new Error('Invalid Triple-DES key size: ' + key.length() * 8);
    }
  }

  // do key expansion to 16 or 48 subkeys (single or triple DES)
  this._keys = _createKeys(key);
  this._init = true;
};

/** Register DES algorithms **/

registerAlgorithm('DES-ECB', forge.cipher.modes.ecb);
registerAlgorithm('DES-CBC', forge.cipher.modes.cbc);
registerAlgorithm('DES-CFB', forge.cipher.modes.cfb);
registerAlgorithm('DES-OFB', forge.cipher.modes.ofb);
registerAlgorithm('DES-CTR', forge.cipher.modes.ctr);

registerAlgorithm('3DES-ECB', forge.cipher.modes.ecb);
registerAlgorithm('3DES-CBC', forge.cipher.modes.cbc);
registerAlgorithm('3DES-CFB', forge.cipher.modes.cfb);
registerAlgorithm('3DES-OFB', forge.cipher.modes.ofb);
registerAlgorithm('3DES-CTR', forge.cipher.modes.ctr);

function registerAlgorithm(name, mode) {
  var factory = function() {
    return new forge.des.Algorithm(name, mode);
  };
  forge.cipher.registerAlgorithm(name, factory);
}

/** DES implementation **/

var spfunction1 = [0x1010400,0,0x10000,0x1010404,0x1010004,0x10404,0x4,0x10000,0x400,0x1010400,0x1010404,0x400,0x1000404,0x1010004,0x1000000,0x4,0x404,0x1000400,0x1000400,0x10400,0x10400,0x1010000,0x1010000,0x1000404,0x10004,0x1000004,0x1000004,0x10004,0,0x404,0x10404,0x1000000,0x10000,0x1010404,0x4,0x1010000,0x1010400,0x1000000,0x1000000,0x400,0x1010004,0x10000,0x10400,0x1000004,0x400,0x4,0x1000404,0x10404,0x1010404,0x10004,0x1010000,0x1000404,0x1000004,0x404,0x10404,0x1010400,0x404,0x1000400,0x1000400,0,0x10004,0x10400,0,0x1010004];
var spfunction2 = [-0x7fef7fe0,-0x7fff8000,0x8000,0x108020,0x100000,0x20,-0x7fefffe0,-0x7fff7fe0,-0x7fffffe0,-0x7fef7fe0,-0x7fef8000,-0x80000000,-0x7fff8000,0x100000,0x20,-0x7fefffe0,0x108000,0x100020,-0x7fff7fe0,0,-0x80000000,0x8000,0x108020,-0x7ff00000,0x100020,-0x7fffffe0,0,0x108000,0x8020,-0x7fef8000,-0x7ff00000,0x8020,0,0x108020,-0x7fefffe0,0x100000,-0x7fff7fe0,-0x7ff00000,-0x7fef8000,0x8000,-0x7ff00000,-0x7fff8000,0x20,-0x7fef7fe0,0x108020,0x20,0x8000,-0x80000000,0x8020,-0x7fef8000,0x100000,-0x7fffffe0,0x100020,-0x7fff7fe0,-0x7fffffe0,0x100020,0x108000,0,-0x7fff8000,0x8020,-0x80000000,-0x7fefffe0,-0x7fef7fe0,0x108000];
var spfunction3 = [0x208,0x8020200,0,0x8020008,0x8000200,0,0x20208,0x8000200,0x20008,0x8000008,0x8000008,0x20000,0x8020208,0x20008,0x8020000,0x208,0x8000000,0x8,0x8020200,0x200,0x20200,0x8020000,0x8020008,0x20208,0x8000208,0x20200,0x20000,0x8000208,0x8,0x8020208,0x200,0x8000000,0x8020200,0x8000000,0x20008,0x208,0x20000,0x8020200,0x8000200,0,0x200,0x20008,0x8020208,0x8000200,0x8000008,0x200,0,0x8020008,0x8000208,0x20000,0x8000000,0x8020208,0x8,0x20208,0x20200,0x8000008,0x8020000,0x8000208,0x208,0x8020000,0x20208,0x8,0x8020008,0x20200];
var spfunction4 = [0x802001,0x2081,0x2081,0x80,0x802080,0x800081,0x800001,0x2001,0,0x802000,0x802000,0x802081,0x81,0,0x800080,0x800001,0x1,0x2000,0x800000,0x802001,0x80,0x800000,0x2001,0x2080,0x800081,0x1,0x2080,0x800080,0x2000,0x802080,0x802081,0x81,0x800080,0x800001,0x802000,0x802081,0x81,0,0,0x802000,0x2080,0x800080,0x800081,0x1,0x802001,0x2081,0x2081,0x80,0x802081,0x81,0x1,0x2000,0x800001,0x2001,0x802080,0x800081,0x2001,0x2080,0x800000,0x802001,0x80,0x800000,0x2000,0x802080];
var spfunction5 = [0x100,0x2080100,0x2080000,0x42000100,0x80000,0x100,0x40000000,0x2080000,0x40080100,0x80000,0x2000100,0x40080100,0x42000100,0x42080000,0x80100,0x40000000,0x2000000,0x40080000,0x40080000,0,0x40000100,0x42080100,0x42080100,0x2000100,0x42080000,0x40000100,0,0x42000000,0x2080100,0x2000000,0x42000000,0x80100,0x80000,0x42000100,0x100,0x2000000,0x40000000,0x2080000,0x42000100,0x40080100,0x2000100,0x40000000,0x42080000,0x2080100,0x40080100,0x100,0x2000000,0x42080000,0x42080100,0x80100,0x42000000,0x42080100,0x2080000,0,0x40080000,0x42000000,0x80100,0x2000100,0x40000100,0x80000,0,0x40080000,0x2080100,0x40000100];
var spfunction6 = [0x20000010,0x20400000,0x4000,0x20404010,0x20400000,0x10,0x20404010,0x400000,0x20004000,0x404010,0x400000,0x20000010,0x400010,0x20004000,0x20000000,0x4010,0,0x400010,0x20004010,0x4000,0x404000,0x20004010,0x10,0x20400010,0x20400010,0,0x404010,0x20404000,0x4010,0x404000,0x20404000,0x20000000,0x20004000,0x10,0x20400010,0x404000,0x20404010,0x400000,0x4010,0x20000010,0x400000,0x20004000,0x20000000,0x4010,0x20000010,0x20404010,0x404000,0x20400000,0x404010,0x20404000,0,0x20400010,0x10,0x4000,0x20400000,0x404010,0x4000,0x400010,0x20004010,0,0x20404000,0x20000000,0x400010,0x20004010];
var spfunction7 = [0x200000,0x4200002,0x4000802,0,0x800,0x4000802,0x200802,0x4200800,0x4200802,0x200000,0,0x4000002,0x2,0x4000000,0x4200002,0x802,0x4000800,0x200802,0x200002,0x4000800,0x4000002,0x4200000,0x4200800,0x200002,0x4200000,0x800,0x802,0x4200802,0x200800,0x2,0x4000000,0x200800,0x4000000,0x200800,0x200000,0x4000802,0x4000802,0x4200002,0x4200002,0x2,0x200002,0x4000000,0x4000800,0x200000,0x4200800,0x802,0x200802,0x4200800,0x802,0x4000002,0x4200802,0x4200000,0x200800,0,0x2,0x4200802,0,0x200802,0x4200000,0x800,0x4000002,0x4000800,0x800,0x200002];
var spfunction8 = [0x10001040,0x1000,0x40000,0x10041040,0x10000000,0x10001040,0x40,0x10000000,0x40040,0x10040000,0x10041040,0x41000,0x10041000,0x41040,0x1000,0x40,0x10040000,0x10000040,0x10001000,0x1040,0x41000,0x40040,0x10040040,0x10041000,0x1040,0,0,0x10040040,0x10000040,0x10001000,0x41040,0x40000,0x41040,0x40000,0x10041000,0x1000,0x40,0x10040040,0x1000,0x41040,0x10001000,0x40,0x10000040,0x10040000,0x10040040,0x10000000,0x40000,0x10001040,0,0x10041040,0x40040,0x10000040,0x10040000,0x10001000,0x10001040,0,0x10041040,0x41000,0x41000,0x1040,0x1040,0x40040,0x10000000,0x10041000];

/**
 * Create necessary sub keys.
 *
 * @param key the 64-bit or 192-bit key.
 *
 * @return the expanded keys.
 */
function _createKeys(key) {
  var pc2bytes0  = [0,0x4,0x20000000,0x20000004,0x10000,0x10004,0x20010000,0x20010004,0x200,0x204,0x20000200,0x20000204,0x10200,0x10204,0x20010200,0x20010204],
      pc2bytes1  = [0,0x1,0x100000,0x100001,0x4000000,0x4000001,0x4100000,0x4100001,0x100,0x101,0x100100,0x100101,0x4000100,0x4000101,0x4100100,0x4100101],
      pc2bytes2  = [0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808,0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808],
      pc2bytes3  = [0,0x200000,0x8000000,0x8200000,0x2000,0x202000,0x8002000,0x8202000,0x20000,0x220000,0x8020000,0x8220000,0x22000,0x222000,0x8022000,0x8222000],
      pc2bytes4  = [0,0x40000,0x10,0x40010,0,0x40000,0x10,0x40010,0x1000,0x41000,0x1010,0x41010,0x1000,0x41000,0x1010,0x41010],
      pc2bytes5  = [0,0x400,0x20,0x420,0,0x400,0x20,0x420,0x2000000,0x2000400,0x2000020,0x2000420,0x2000000,0x2000400,0x2000020,0x2000420],
      pc2bytes6  = [0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002,0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002],
      pc2bytes7  = [0,0x10000,0x800,0x10800,0x20000000,0x20010000,0x20000800,0x20010800,0x20000,0x30000,0x20800,0x30800,0x20020000,0x20030000,0x20020800,0x20030800],
      pc2bytes8  = [0,0x40000,0,0x40000,0x2,0x40002,0x2,0x40002,0x2000000,0x2040000,0x2000000,0x2040000,0x2000002,0x2040002,0x2000002,0x2040002],
      pc2bytes9  = [0,0x10000000,0x8,0x10000008,0,0x10000000,0x8,0x10000008,0x400,0x10000400,0x408,0x10000408,0x400,0x10000400,0x408,0x10000408],
      pc2bytes10 = [0,0x20,0,0x20,0x100000,0x100020,0x100000,0x100020,0x2000,0x2020,0x2000,0x2020,0x102000,0x102020,0x102000,0x102020],
      pc2bytes11 = [0,0x1000000,0x200,0x1000200,0x200000,0x1200000,0x200200,0x1200200,0x4000000,0x5000000,0x4000200,0x5000200,0x4200000,0x5200000,0x4200200,0x5200200],
      pc2bytes12 = [0,0x1000,0x8000000,0x8001000,0x80000,0x81000,0x8080000,0x8081000,0x10,0x1010,0x8000010,0x8001010,0x80010,0x81010,0x8080010,0x8081010],
      pc2bytes13 = [0,0x4,0x100,0x104,0,0x4,0x100,0x104,0x1,0x5,0x101,0x105,0x1,0x5,0x101,0x105];

  // how many iterations (1 for des, 3 for triple des)
  // changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys
  var iterations = key.length() > 8 ? 3 : 1;

  // stores the return keys
  var keys = [];

  // now define the left shifts which need to be done
  var shifts = [0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0];

  var n = 0, tmp;
  for(var j = 0; j < iterations; j++) {
    var left = key.getInt32();
    var right = key.getInt32();

    tmp = ((left >>> 4) ^ right) & 0x0f0f0f0f;
    right ^= tmp;
    left ^= (tmp << 4);

    tmp = ((right >>> -16) ^ left) & 0x0000ffff;
    left ^= tmp;
    right ^= (tmp << -16);

    tmp = ((left >>> 2) ^ right) & 0x33333333;
    right ^= tmp;
    left ^= (tmp << 2);

    tmp = ((right >>> -16) ^ left) & 0x0000ffff;
    left ^= tmp;
    right ^= (tmp << -16);

    tmp = ((left >>> 1) ^ right) & 0x55555555;
    right ^= tmp;
    left ^= (tmp << 1);

    tmp = ((right >>> 8) ^ left) & 0x00ff00ff;
    left ^= tmp;
    right ^= (tmp << 8);

    tmp = ((left >>> 1) ^ right) & 0x55555555;
    right ^= tmp;
    left ^= (tmp << 1);

    // right needs to be shifted and OR'd with last four bits of left
    tmp = (left << 8) | ((right >>> 20) & 0x000000f0);

    // left needs to be put upside down
    left = ((right << 24) | ((right << 8) & 0xff0000) |
      ((right >>> 8) & 0xff00) | ((right >>> 24) & 0xf0));
    right = tmp;

    // now go through and perform these shifts on the left and right keys
    for(var i = 0; i < shifts.length; ++i) {
      //shift the keys either one or two bits to the left
      if(shifts[i]) {
        left = (left << 2) | (left >>> 26);
        right = (right << 2) | (right >>> 26);
      } else {
        left = (left << 1) | (left >>> 27);
        right = (right << 1) | (right >>> 27);
      }
      left &= -0xf;
      right &= -0xf;

      // now apply PC-2, in such a way that E is easier when encrypting or
      // decrypting this conversion will look like PC-2 except only the last 6
      // bits of each byte are used rather than 48 consecutive bits and the
      // order of lines will be according to how the S selection functions will
      // be applied: S2, S4, S6, S8, S1, S3, S5, S7
      var lefttmp = (
        pc2bytes0[left >>> 28] | pc2bytes1[(left >>> 24) & 0xf] |
        pc2bytes2[(left >>> 20) & 0xf] | pc2bytes3[(left >>> 16) & 0xf] |
        pc2bytes4[(left >>> 12) & 0xf] | pc2bytes5[(left >>> 8) & 0xf] |
        pc2bytes6[(left >>> 4) & 0xf]);
      var righttmp = (
        pc2bytes7[right >>> 28] | pc2bytes8[(right >>> 24) & 0xf] |
        pc2bytes9[(right >>> 20) & 0xf] | pc2bytes10[(right >>> 16) & 0xf] |
        pc2bytes11[(right >>> 12) & 0xf] | pc2bytes12[(right >>> 8) & 0xf] |
        pc2bytes13[(right >>> 4) & 0xf]);
      tmp = ((righttmp >>> 16) ^ lefttmp) & 0x0000ffff;
      keys[n++] = lefttmp ^ tmp;
      keys[n++] = righttmp ^ (tmp << 16);
    }
  }

  return keys;
}

/**
 * Updates a single block (1 byte) using DES. The update will either
 * encrypt or decrypt the block.
 *
 * @param keys the expanded keys.
 * @param input the input block (an array of 32-bit words).
 * @param output the updated output block.
 * @param decrypt true to decrypt the block, false to encrypt it.
 */
function _updateBlock(keys, input, output, decrypt) {
  // set up loops for single or triple DES
  var iterations = keys.length === 32 ? 3 : 9;
  var looping;
  if(iterations === 3) {
    looping = decrypt ? [30, -2, -2] : [0, 32, 2];
  } else {
    looping = (decrypt ?
      [94, 62, -2, 32, 64, 2, 30, -2, -2] :
      [0, 32, 2, 62, 30, -2, 64, 96, 2]);
  }

  var tmp;

  var left = input[0];
  var right = input[1];

  // first each 64 bit chunk of the message must be permuted according to IP
  tmp = ((left >>> 4) ^ right) & 0x0f0f0f0f;
  right ^= tmp;
  left ^= (tmp << 4);

  tmp = ((left >>> 16) ^ right) & 0x0000ffff;
  right ^= tmp;
  left ^= (tmp << 16);

  tmp = ((right >>> 2) ^ left) & 0x33333333;
  left ^= tmp;
  right ^= (tmp << 2);

  tmp = ((right >>> 8) ^ left) & 0x00ff00ff;
  left ^= tmp;
  right ^= (tmp << 8);

  tmp = ((left >>> 1) ^ right) & 0x55555555;
  right ^= tmp;
  left ^= (tmp << 1);

  // rotate left 1 bit
  left = ((left << 1) | (left >>> 31));
  right = ((right << 1) | (right >>> 31));

  for(var j = 0; j < iterations; j += 3) {
    var endloop = looping[j + 1];
    var loopinc = looping[j + 2];

    // now go through and perform the encryption or decryption
    for(var i = looping[j]; i != endloop; i += loopinc) {
      var right1 = right ^ keys[i];
      var right2 = ((right >>> 4) | (right << 28)) ^ keys[i + 1];

      // passing these bytes through the S selection functions
      tmp = left;
      left = right;
      right = tmp ^ (
        spfunction2[(right1 >>> 24) & 0x3f] |
        spfunction4[(right1 >>> 16) & 0x3f] |
        spfunction6[(right1 >>>  8) & 0x3f] |
        spfunction8[right1 & 0x3f] |
        spfunction1[(right2 >>> 24) & 0x3f] |
        spfunction3[(right2 >>> 16) & 0x3f] |
        spfunction5[(right2 >>>  8) & 0x3f] |
        spfunction7[right2 & 0x3f]);
    }
    // unreverse left and right
    tmp = left;
    left = right;
    right = tmp;
  }

  // rotate right 1 bit
  left = ((left >>> 1) | (left << 31));
  right = ((right >>> 1) | (right << 31));

  // now perform IP-1, which is IP in the opposite direction
  tmp = ((left >>> 1) ^ right) & 0x55555555;
  right ^= tmp;
  left ^= (tmp << 1);

  tmp = ((right >>> 8) ^ left) & 0x00ff00ff;
  left ^= tmp;
  right ^= (tmp << 8);

  tmp = ((right >>> 2) ^ left) & 0x33333333;
  left ^= tmp;
  right ^= (tmp << 2);

  tmp = ((left >>> 16) ^ right) & 0x0000ffff;
  right ^= tmp;
  left ^= (tmp << 16);

  tmp = ((left >>> 4) ^ right) & 0x0f0f0f0f;
  right ^= tmp;
  left ^= (tmp << 4);

  output[0] = left;
  output[1] = right;
}

/**
 * Deprecated. Instead, use:
 *
 * forge.cipher.createCipher('DES-<mode>', key);
 * forge.cipher.createDecipher('DES-<mode>', key);
 *
 * Creates a deprecated DES cipher object. This object's mode will default to
 * CBC (cipher-block-chaining).
 *
 * The key may be given as a binary-encoded string of bytes or a byte buffer.
 *
 * @param options the options to use.
 *          key the symmetric key to use (64 or 192 bits).
 *          output the buffer to write to.
 *          decrypt true for decryption, false for encryption.
 *          mode the cipher mode to use (default: 'CBC').
 *
 * @return the cipher.
 */
function _createCipher(options) {
  options = options || {};
  var mode = (options.mode || 'CBC').toUpperCase();
  var algorithm = 'DES-' + mode;

  var cipher;
  if(options.decrypt) {
    cipher = forge.cipher.createDecipher(algorithm, options.key);
  } else {
    cipher = forge.cipher.createCipher(algorithm, options.key);
  }

  // backwards compatible start API
  var start = cipher.start;
  cipher.start = function(iv, options) {
    // backwards compatibility: support second arg as output buffer
    var output = null;
    if(options instanceof forge.util.ByteBuffer) {
      output = options;
      options = {};
    }
    options = options || {};
    options.output = output;
    options.iv = iv;
    start.call(cipher, options);
  };

  return cipher;
}

},{"./cipher":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/cipher.js","./cipherModes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/cipherModes.js","./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js":[function(require,module,exports){
/**
 * Node.js module for Forge.
 *
 * @author Dave Longley
 *
 * Copyright 2011-2016 Digital Bazaar, Inc.
 */
module.exports = {
  // default options
  options: {
    usePureJavaScript: false
  }
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/hmac.js":[function(require,module,exports){
/**
 * Hash-based Message Authentication Code implementation. Requires a message
 * digest object that can be obtained, for example, from forge.md.sha1 or
 * forge.md.md5.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2012 Digital Bazaar, Inc. All rights reserved.
 */
var forge = require('./forge');
require('./md');
require('./util');

/* HMAC API */
var hmac = module.exports = forge.hmac = forge.hmac || {};

/**
 * Creates an HMAC object that uses the given message digest object.
 *
 * @return an HMAC object.
 */
hmac.create = function() {
  // the hmac key to use
  var _key = null;

  // the message digest to use
  var _md = null;

  // the inner padding
  var _ipadding = null;

  // the outer padding
  var _opadding = null;

  // hmac context
  var ctx = {};

  /**
   * Starts or restarts the HMAC with the given key and message digest.
   *
   * @param md the message digest to use, null to reuse the previous one,
   *           a string to use builtin 'sha1', 'md5', 'sha256'.
   * @param key the key to use as a string, array of bytes, byte buffer,
   *           or null to reuse the previous key.
   */
  ctx.start = function(md, key) {
    if(md !== null) {
      if(typeof md === 'string') {
        // create builtin message digest
        md = md.toLowerCase();
        if(md in forge.md.algorithms) {
          _md = forge.md.algorithms[md].create();
        } else {
          throw new Error('Unknown hash algorithm "' + md + '"');
        }
      } else {
        // store message digest
        _md = md;
      }
    }

    if(key === null) {
      // reuse previous key
      key = _key;
    } else {
      if(typeof key === 'string') {
        // convert string into byte buffer
        key = forge.util.createBuffer(key);
      } else if(forge.util.isArray(key)) {
        // convert byte array into byte buffer
        var tmp = key;
        key = forge.util.createBuffer();
        for(var i = 0; i < tmp.length; ++i) {
          key.putByte(tmp[i]);
        }
      }

      // if key is longer than blocksize, hash it
      var keylen = key.length();
      if(keylen > _md.blockLength) {
        _md.start();
        _md.update(key.bytes());
        key = _md.digest();
      }

      // mix key into inner and outer padding
      // ipadding = [0x36 * blocksize] ^ key
      // opadding = [0x5C * blocksize] ^ key
      _ipadding = forge.util.createBuffer();
      _opadding = forge.util.createBuffer();
      keylen = key.length();
      for(var i = 0; i < keylen; ++i) {
        var tmp = key.at(i);
        _ipadding.putByte(0x36 ^ tmp);
        _opadding.putByte(0x5C ^ tmp);
      }

      // if key is shorter than blocksize, add additional padding
      if(keylen < _md.blockLength) {
        var tmp = _md.blockLength - keylen;
        for(var i = 0; i < tmp; ++i) {
          _ipadding.putByte(0x36);
          _opadding.putByte(0x5C);
        }
      }
      _key = key;
      _ipadding = _ipadding.bytes();
      _opadding = _opadding.bytes();
    }

    // digest is done like so: hash(opadding | hash(ipadding | message))

    // prepare to do inner hash
    // hash(ipadding | message)
    _md.start();
    _md.update(_ipadding);
  };

  /**
   * Updates the HMAC with the given message bytes.
   *
   * @param bytes the bytes to update with.
   */
  ctx.update = function(bytes) {
    _md.update(bytes);
  };

  /**
   * Produces the Message Authentication Code (MAC).
   *
   * @return a byte buffer containing the digest value.
   */
  ctx.getMac = function() {
    // digest is done like so: hash(opadding | hash(ipadding | message))
    // here we do the outer hashing
    var inner = _md.digest().bytes();
    _md.start();
    _md.update(_opadding);
    _md.update(inner);
    return _md.digest();
  };
  // alias for getMac
  ctx.digest = ctx.getMac;

  return ctx;
};

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./md":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/md.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/jsbn.js":[function(require,module,exports){
// Copyright (c) 2005  Tom Wu
// All Rights Reserved.
// See "LICENSE" for details.

// Basic JavaScript BN library - subset useful for RSA encryption.

/*
Licensing (LICENSE)
-------------------

This software is covered under the following copyright:
*/
/*
 * Copyright (c) 2003-2005  Tom Wu
 * All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
 *
 * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
 * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
 * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
 * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * In addition, the following condition applies:
 *
 * All redistributions must retain an intact copy of this copyright notice
 * and disclaimer.
 */
/*
Address all questions regarding this license to:

  Tom Wu
  tjw@cs.Stanford.EDU
*/
var forge = require('./forge');

module.exports = forge.jsbn = forge.jsbn || {};

// Bits per digit
var dbits;

// JavaScript engine analysis
var canary = 0xdeadbeefcafe;
var j_lm = ((canary&0xffffff)==0xefcafe);

// (public) Constructor
function BigInteger(a,b,c) {
  this.data = [];
  if(a != null)
    if("number" == typeof a) this.fromNumber(a,b,c);
    else if(b == null && "string" != typeof a) this.fromString(a,256);
    else this.fromString(a,b);
}
forge.jsbn.BigInteger = BigInteger;

// return new, unset BigInteger
function nbi() { return new BigInteger(null); }

// am: Compute w_j += (x*this_i), propagate carries,
// c is initial carry, returns final carry.
// c < 3*dvalue, x < 2*dvalue, this_i < dvalue
// We need to select the fastest one that works in this environment.

// am1: use a single mult and divide to get the high bits,
// max digit bits should be 26 because
// max internal value = 2*dvalue^2-2*dvalue (< 2^53)
function am1(i,x,w,j,c,n) {
  while(--n >= 0) {
    var v = x*this.data[i++]+w.data[j]+c;
    c = Math.floor(v/0x4000000);
    w.data[j++] = v&0x3ffffff;
  }
  return c;
}
// am2 avoids a big mult-and-extract completely.
// Max digit bits should be <= 30 because we do bitwise ops
// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
function am2(i,x,w,j,c,n) {
  var xl = x&0x7fff, xh = x>>15;
  while(--n >= 0) {
    var l = this.data[i]&0x7fff;
    var h = this.data[i++]>>15;
    var m = xh*l+h*xl;
    l = xl*l+((m&0x7fff)<<15)+w.data[j]+(c&0x3fffffff);
    c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
    w.data[j++] = l&0x3fffffff;
  }
  return c;
}
// Alternately, set max digit bits to 28 since some
// browsers slow down when dealing with 32-bit numbers.
function am3(i,x,w,j,c,n) {
  var xl = x&0x3fff, xh = x>>14;
  while(--n >= 0) {
    var l = this.data[i]&0x3fff;
    var h = this.data[i++]>>14;
    var m = xh*l+h*xl;
    l = xl*l+((m&0x3fff)<<14)+w.data[j]+c;
    c = (l>>28)+(m>>14)+xh*h;
    w.data[j++] = l&0xfffffff;
  }
  return c;
}

// node.js (no browser)
if(typeof(navigator) === 'undefined')
{
   BigInteger.prototype.am = am3;
   dbits = 28;
} else if(j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
  BigInteger.prototype.am = am2;
  dbits = 30;
} else if(j_lm && (navigator.appName != "Netscape")) {
  BigInteger.prototype.am = am1;
  dbits = 26;
} else { // Mozilla/Netscape seems to prefer am3
  BigInteger.prototype.am = am3;
  dbits = 28;
}

BigInteger.prototype.DB = dbits;
BigInteger.prototype.DM = ((1<<dbits)-1);
BigInteger.prototype.DV = (1<<dbits);

var BI_FP = 52;
BigInteger.prototype.FV = Math.pow(2,BI_FP);
BigInteger.prototype.F1 = BI_FP-dbits;
BigInteger.prototype.F2 = 2*dbits-BI_FP;

// Digit conversions
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
var BI_RC = new Array();
var rr,vv;
rr = "0".charCodeAt(0);
for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
rr = "a".charCodeAt(0);
for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
rr = "A".charCodeAt(0);
for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;

function int2char(n) { return BI_RM.charAt(n); }
function intAt(s,i) {
  var c = BI_RC[s.charCodeAt(i)];
  return (c==null)?-1:c;
}

// (protected) copy this to r
function bnpCopyTo(r) {
  for(var i = this.t-1; i >= 0; --i) r.data[i] = this.data[i];
  r.t = this.t;
  r.s = this.s;
}

// (protected) set from integer value x, -DV <= x < DV
function bnpFromInt(x) {
  this.t = 1;
  this.s = (x<0)?-1:0;
  if(x > 0) this.data[0] = x;
  else if(x < -1) this.data[0] = x+this.DV;
  else this.t = 0;
}

// return bigint initialized to value
function nbv(i) { var r = nbi(); r.fromInt(i); return r; }

// (protected) set from string and radix
function bnpFromString(s,b) {
  var k;
  if(b == 16) k = 4;
  else if(b == 8) k = 3;
  else if(b == 256) k = 8; // byte array
  else if(b == 2) k = 1;
  else if(b == 32) k = 5;
  else if(b == 4) k = 2;
  else { this.fromRadix(s,b); return; }
  this.t = 0;
  this.s = 0;
  var i = s.length, mi = false, sh = 0;
  while(--i >= 0) {
    var x = (k==8)?s[i]&0xff:intAt(s,i);
    if(x < 0) {
      if(s.charAt(i) == "-") mi = true;
      continue;
    }
    mi = false;
    if(sh == 0)
      this.data[this.t++] = x;
    else if(sh+k > this.DB) {
      this.data[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;
      this.data[this.t++] = (x>>(this.DB-sh));
    } else
      this.data[this.t-1] |= x<<sh;
    sh += k;
    if(sh >= this.DB) sh -= this.DB;
  }
  if(k == 8 && (s[0]&0x80) != 0) {
    this.s = -1;
    if(sh > 0) this.data[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;
  }
  this.clamp();
  if(mi) BigInteger.ZERO.subTo(this,this);
}

// (protected) clamp off excess high words
function bnpClamp() {
  var c = this.s&this.DM;
  while(this.t > 0 && this.data[this.t-1] == c) --this.t;
}

// (public) return string representation in given radix
function bnToString(b) {
  if(this.s < 0) return "-"+this.negate().toString(b);
  var k;
  if(b == 16) k = 4;
  else if(b == 8) k = 3;
  else if(b == 2) k = 1;
  else if(b == 32) k = 5;
  else if(b == 4) k = 2;
  else return this.toRadix(b);
  var km = (1<<k)-1, d, m = false, r = "", i = this.t;
  var p = this.DB-(i*this.DB)%k;
  if(i-- > 0) {
    if(p < this.DB && (d = this.data[i]>>p) > 0) { m = true; r = int2char(d); }
    while(i >= 0) {
      if(p < k) {
        d = (this.data[i]&((1<<p)-1))<<(k-p);
        d |= this.data[--i]>>(p+=this.DB-k);
      } else {
        d = (this.data[i]>>(p-=k))&km;
        if(p <= 0) { p += this.DB; --i; }
      }
      if(d > 0) m = true;
      if(m) r += int2char(d);
    }
  }
  return m?r:"0";
}

// (public) -this
function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }

// (public) |this|
function bnAbs() { return (this.s<0)?this.negate():this; }

// (public) return + if this > a, - if this < a, 0 if equal
function bnCompareTo(a) {
  var r = this.s-a.s;
  if(r != 0) return r;
  var i = this.t;
  r = i-a.t;
  if(r != 0) return (this.s<0)?-r:r;
  while(--i >= 0) if((r=this.data[i]-a.data[i]) != 0) return r;
  return 0;
}

// returns bit length of the integer x
function nbits(x) {
  var r = 1, t;
  if((t=x>>>16) != 0) { x = t; r += 16; }
  if((t=x>>8) != 0) { x = t; r += 8; }
  if((t=x>>4) != 0) { x = t; r += 4; }
  if((t=x>>2) != 0) { x = t; r += 2; }
  if((t=x>>1) != 0) { x = t; r += 1; }
  return r;
}

// (public) return the number of bits in "this"
function bnBitLength() {
  if(this.t <= 0) return 0;
  return this.DB*(this.t-1)+nbits(this.data[this.t-1]^(this.s&this.DM));
}

// (protected) r = this << n*DB
function bnpDLShiftTo(n,r) {
  var i;
  for(i = this.t-1; i >= 0; --i) r.data[i+n] = this.data[i];
  for(i = n-1; i >= 0; --i) r.data[i] = 0;
  r.t = this.t+n;
  r.s = this.s;
}

// (protected) r = this >> n*DB
function bnpDRShiftTo(n,r) {
  for(var i = n; i < this.t; ++i) r.data[i-n] = this.data[i];
  r.t = Math.max(this.t-n,0);
  r.s = this.s;
}

// (protected) r = this << n
function bnpLShiftTo(n,r) {
  var bs = n%this.DB;
  var cbs = this.DB-bs;
  var bm = (1<<cbs)-1;
  var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;
  for(i = this.t-1; i >= 0; --i) {
    r.data[i+ds+1] = (this.data[i]>>cbs)|c;
    c = (this.data[i]&bm)<<bs;
  }
  for(i = ds-1; i >= 0; --i) r.data[i] = 0;
  r.data[ds] = c;
  r.t = this.t+ds+1;
  r.s = this.s;
  r.clamp();
}

// (protected) r = this >> n
function bnpRShiftTo(n,r) {
  r.s = this.s;
  var ds = Math.floor(n/this.DB);
  if(ds >= this.t) { r.t = 0; return; }
  var bs = n%this.DB;
  var cbs = this.DB-bs;
  var bm = (1<<bs)-1;
  r.data[0] = this.data[ds]>>bs;
  for(var i = ds+1; i < this.t; ++i) {
    r.data[i-ds-1] |= (this.data[i]&bm)<<cbs;
    r.data[i-ds] = this.data[i]>>bs;
  }
  if(bs > 0) r.data[this.t-ds-1] |= (this.s&bm)<<cbs;
  r.t = this.t-ds;
  r.clamp();
}

// (protected) r = this - a
function bnpSubTo(a,r) {
  var i = 0, c = 0, m = Math.min(a.t,this.t);
  while(i < m) {
    c += this.data[i]-a.data[i];
    r.data[i++] = c&this.DM;
    c >>= this.DB;
  }
  if(a.t < this.t) {
    c -= a.s;
    while(i < this.t) {
      c += this.data[i];
      r.data[i++] = c&this.DM;
      c >>= this.DB;
    }
    c += this.s;
  } else {
    c += this.s;
    while(i < a.t) {
      c -= a.data[i];
      r.data[i++] = c&this.DM;
      c >>= this.DB;
    }
    c -= a.s;
  }
  r.s = (c<0)?-1:0;
  if(c < -1) r.data[i++] = this.DV+c;
  else if(c > 0) r.data[i++] = c;
  r.t = i;
  r.clamp();
}

// (protected) r = this * a, r != this,a (HAC 14.12)
// "this" should be the larger one if appropriate.
function bnpMultiplyTo(a,r) {
  var x = this.abs(), y = a.abs();
  var i = x.t;
  r.t = i+y.t;
  while(--i >= 0) r.data[i] = 0;
  for(i = 0; i < y.t; ++i) r.data[i+x.t] = x.am(0,y.data[i],r,i,0,x.t);
  r.s = 0;
  r.clamp();
  if(this.s != a.s) BigInteger.ZERO.subTo(r,r);
}

// (protected) r = this^2, r != this (HAC 14.16)
function bnpSquareTo(r) {
  var x = this.abs();
  var i = r.t = 2*x.t;
  while(--i >= 0) r.data[i] = 0;
  for(i = 0; i < x.t-1; ++i) {
    var c = x.am(i,x.data[i],r,2*i,0,1);
    if((r.data[i+x.t]+=x.am(i+1,2*x.data[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {
      r.data[i+x.t] -= x.DV;
      r.data[i+x.t+1] = 1;
    }
  }
  if(r.t > 0) r.data[r.t-1] += x.am(i,x.data[i],r,2*i,0,1);
  r.s = 0;
  r.clamp();
}

// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
// r != q, this != m.  q or r may be null.
function bnpDivRemTo(m,q,r) {
  var pm = m.abs();
  if(pm.t <= 0) return;
  var pt = this.abs();
  if(pt.t < pm.t) {
    if(q != null) q.fromInt(0);
    if(r != null) this.copyTo(r);
    return;
  }
  if(r == null) r = nbi();
  var y = nbi(), ts = this.s, ms = m.s;
  var nsh = this.DB-nbits(pm.data[pm.t-1]);	// normalize modulus
  if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); } else { pm.copyTo(y); pt.copyTo(r); }
  var ys = y.t;
  var y0 = y.data[ys-1];
  if(y0 == 0) return;
  var yt = y0*(1<<this.F1)+((ys>1)?y.data[ys-2]>>this.F2:0);
  var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;
  var i = r.t, j = i-ys, t = (q==null)?nbi():q;
  y.dlShiftTo(j,t);
  if(r.compareTo(t) >= 0) {
    r.data[r.t++] = 1;
    r.subTo(t,r);
  }
  BigInteger.ONE.dlShiftTo(ys,t);
  t.subTo(y,y);	// "negative" y so we can replace sub with am later
  while(y.t < ys) y.data[y.t++] = 0;
  while(--j >= 0) {
    // Estimate quotient digit
    var qd = (r.data[--i]==y0)?this.DM:Math.floor(r.data[i]*d1+(r.data[i-1]+e)*d2);
    if((r.data[i]+=y.am(0,qd,r,j,0,ys)) < qd) {	// Try it out
      y.dlShiftTo(j,t);
      r.subTo(t,r);
      while(r.data[i] < --qd) r.subTo(t,r);
    }
  }
  if(q != null) {
    r.drShiftTo(ys,q);
    if(ts != ms) BigInteger.ZERO.subTo(q,q);
  }
  r.t = ys;
  r.clamp();
  if(nsh > 0) r.rShiftTo(nsh,r);	// Denormalize remainder
  if(ts < 0) BigInteger.ZERO.subTo(r,r);
}

// (public) this mod a
function bnMod(a) {
  var r = nbi();
  this.abs().divRemTo(a,null,r);
  if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);
  return r;
}

// Modular reduction using "classic" algorithm
function Classic(m) { this.m = m; }
function cConvert(x) {
  if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
  else return x;
}
function cRevert(x) { return x; }
function cReduce(x) { x.divRemTo(this.m,null,x); }
function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

Classic.prototype.convert = cConvert;
Classic.prototype.revert = cRevert;
Classic.prototype.reduce = cReduce;
Classic.prototype.mulTo = cMulTo;
Classic.prototype.sqrTo = cSqrTo;

// (protected) return "-1/this % 2^DB"; useful for Mont. reduction
// justification:
//         xy == 1 (mod m)
//         xy =  1+km
//   xy(2-xy) = (1+km)(1-km)
// x[y(2-xy)] = 1-k^2m^2
// x[y(2-xy)] == 1 (mod m^2)
// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
// JS multiply "overflows" differently from C/C++, so care is needed here.
function bnpInvDigit() {
  if(this.t < 1) return 0;
  var x = this.data[0];
  if((x&1) == 0) return 0;
  var y = x&3;		// y == 1/x mod 2^2
  y = (y*(2-(x&0xf)*y))&0xf;	// y == 1/x mod 2^4
  y = (y*(2-(x&0xff)*y))&0xff;	// y == 1/x mod 2^8
  y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;	// y == 1/x mod 2^16
  // last step - calculate inverse mod DV directly;
  // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
  y = (y*(2-x*y%this.DV))%this.DV;		// y == 1/x mod 2^dbits
  // we really want the negative inverse, and -DV < y < DV
  return (y>0)?this.DV-y:-y;
}

// Montgomery reduction
function Montgomery(m) {
  this.m = m;
  this.mp = m.invDigit();
  this.mpl = this.mp&0x7fff;
  this.mph = this.mp>>15;
  this.um = (1<<(m.DB-15))-1;
  this.mt2 = 2*m.t;
}

// xR mod m
function montConvert(x) {
  var r = nbi();
  x.abs().dlShiftTo(this.m.t,r);
  r.divRemTo(this.m,null,r);
  if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);
  return r;
}

// x/R mod m
function montRevert(x) {
  var r = nbi();
  x.copyTo(r);
  this.reduce(r);
  return r;
}

// x = x/R mod m (HAC 14.32)
function montReduce(x) {
  while(x.t <= this.mt2)	// pad x so am has enough room later
    x.data[x.t++] = 0;
  for(var i = 0; i < this.m.t; ++i) {
    // faster way of calculating u0 = x.data[i]*mp mod DV
    var j = x.data[i]&0x7fff;
    var u0 = (j*this.mpl+(((j*this.mph+(x.data[i]>>15)*this.mpl)&this.um)<<15))&x.DM;
    // use am to combine the multiply-shift-add into one call
    j = i+this.m.t;
    x.data[j] += this.m.am(0,u0,x,i,0,this.m.t);
    // propagate carry
    while(x.data[j] >= x.DV) { x.data[j] -= x.DV; x.data[++j]++; }
  }
  x.clamp();
  x.drShiftTo(this.m.t,x);
  if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
}

// r = "x^2/R mod m"; x != r
function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

// r = "xy/R mod m"; x,y != r
function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }

Montgomery.prototype.convert = montConvert;
Montgomery.prototype.revert = montRevert;
Montgomery.prototype.reduce = montReduce;
Montgomery.prototype.mulTo = montMulTo;
Montgomery.prototype.sqrTo = montSqrTo;

// (protected) true iff this is even
function bnpIsEven() { return ((this.t>0)?(this.data[0]&1):this.s) == 0; }

// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
function bnpExp(e,z) {
  if(e > 0xffffffff || e < 1) return BigInteger.ONE;
  var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;
  g.copyTo(r);
  while(--i >= 0) {
    z.sqrTo(r,r2);
    if((e&(1<<i)) > 0) z.mulTo(r2,g,r);
    else { var t = r; r = r2; r2 = t; }
  }
  return z.revert(r);
}

// (public) this^e % m, 0 <= e < 2^32
function bnModPowInt(e,m) {
  var z;
  if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
  return this.exp(e,z);
}

// protected
BigInteger.prototype.copyTo = bnpCopyTo;
BigInteger.prototype.fromInt = bnpFromInt;
BigInteger.prototype.fromString = bnpFromString;
BigInteger.prototype.clamp = bnpClamp;
BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
BigInteger.prototype.drShiftTo = bnpDRShiftTo;
BigInteger.prototype.lShiftTo = bnpLShiftTo;
BigInteger.prototype.rShiftTo = bnpRShiftTo;
BigInteger.prototype.subTo = bnpSubTo;
BigInteger.prototype.multiplyTo = bnpMultiplyTo;
BigInteger.prototype.squareTo = bnpSquareTo;
BigInteger.prototype.divRemTo = bnpDivRemTo;
BigInteger.prototype.invDigit = bnpInvDigit;
BigInteger.prototype.isEven = bnpIsEven;
BigInteger.prototype.exp = bnpExp;

// public
BigInteger.prototype.toString = bnToString;
BigInteger.prototype.negate = bnNegate;
BigInteger.prototype.abs = bnAbs;
BigInteger.prototype.compareTo = bnCompareTo;
BigInteger.prototype.bitLength = bnBitLength;
BigInteger.prototype.mod = bnMod;
BigInteger.prototype.modPowInt = bnModPowInt;

// "constants"
BigInteger.ZERO = nbv(0);
BigInteger.ONE = nbv(1);

// jsbn2 lib

//Copyright (c) 2005-2009  Tom Wu
//All Rights Reserved.
//See "LICENSE" for details (See jsbn.js for LICENSE).

//Extended JavaScript BN functions, required for RSA private ops.

//Version 1.1: new BigInteger("0", 10) returns "proper" zero

//(public)
function bnClone() { var r = nbi(); this.copyTo(r); return r; }

//(public) return value as integer
function bnIntValue() {
if(this.s < 0) {
 if(this.t == 1) return this.data[0]-this.DV;
 else if(this.t == 0) return -1;
} else if(this.t == 1) return this.data[0];
else if(this.t == 0) return 0;
// assumes 16 < DB < 32
return ((this.data[1]&((1<<(32-this.DB))-1))<<this.DB)|this.data[0];
}

//(public) return value as byte
function bnByteValue() { return (this.t==0)?this.s:(this.data[0]<<24)>>24; }

//(public) return value as short (assumes DB>=16)
function bnShortValue() { return (this.t==0)?this.s:(this.data[0]<<16)>>16; }

//(protected) return x s.t. r^x < DV
function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }

//(public) 0 if this == 0, 1 if this > 0
function bnSigNum() {
if(this.s < 0) return -1;
else if(this.t <= 0 || (this.t == 1 && this.data[0] <= 0)) return 0;
else return 1;
}

//(protected) convert to radix string
function bnpToRadix(b) {
if(b == null) b = 10;
if(this.signum() == 0 || b < 2 || b > 36) return "0";
var cs = this.chunkSize(b);
var a = Math.pow(b,cs);
var d = nbv(a), y = nbi(), z = nbi(), r = "";
this.divRemTo(d,y,z);
while(y.signum() > 0) {
 r = (a+z.intValue()).toString(b).substr(1) + r;
 y.divRemTo(d,y,z);
}
return z.intValue().toString(b) + r;
}

//(protected) convert from radix string
function bnpFromRadix(s,b) {
this.fromInt(0);
if(b == null) b = 10;
var cs = this.chunkSize(b);
var d = Math.pow(b,cs), mi = false, j = 0, w = 0;
for(var i = 0; i < s.length; ++i) {
 var x = intAt(s,i);
 if(x < 0) {
   if(s.charAt(i) == "-" && this.signum() == 0) mi = true;
   continue;
 }
 w = b*w+x;
 if(++j >= cs) {
   this.dMultiply(d);
   this.dAddOffset(w,0);
   j = 0;
   w = 0;
 }
}
if(j > 0) {
 this.dMultiply(Math.pow(b,j));
 this.dAddOffset(w,0);
}
if(mi) BigInteger.ZERO.subTo(this,this);
}

//(protected) alternate constructor
function bnpFromNumber(a,b,c) {
if("number" == typeof b) {
 // new BigInteger(int,int,RNG)
 if(a < 2) this.fromInt(1);
 else {
   this.fromNumber(a,c);
   if(!this.testBit(a-1))  // force MSB set
     this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);
   if(this.isEven()) this.dAddOffset(1,0); // force odd
   while(!this.isProbablePrime(b)) {
     this.dAddOffset(2,0);
     if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);
   }
 }
} else {
 // new BigInteger(int,RNG)
 var x = new Array(), t = a&7;
 x.length = (a>>3)+1;
 b.nextBytes(x);
 if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;
 this.fromString(x,256);
}
}

//(public) convert to bigendian byte array
function bnToByteArray() {
var i = this.t, r = new Array();
r[0] = this.s;
var p = this.DB-(i*this.DB)%8, d, k = 0;
if(i-- > 0) {
 if(p < this.DB && (d = this.data[i]>>p) != (this.s&this.DM)>>p)
   r[k++] = d|(this.s<<(this.DB-p));
 while(i >= 0) {
   if(p < 8) {
     d = (this.data[i]&((1<<p)-1))<<(8-p);
     d |= this.data[--i]>>(p+=this.DB-8);
   } else {
     d = (this.data[i]>>(p-=8))&0xff;
     if(p <= 0) { p += this.DB; --i; }
   }
   if((d&0x80) != 0) d |= -256;
   if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;
   if(k > 0 || d != this.s) r[k++] = d;
 }
}
return r;
}

function bnEquals(a) { return(this.compareTo(a)==0); }
function bnMin(a) { return(this.compareTo(a)<0)?this:a; }
function bnMax(a) { return(this.compareTo(a)>0)?this:a; }

//(protected) r = this op a (bitwise)
function bnpBitwiseTo(a,op,r) {
var i, f, m = Math.min(a.t,this.t);
for(i = 0; i < m; ++i) r.data[i] = op(this.data[i],a.data[i]);
if(a.t < this.t) {
 f = a.s&this.DM;
 for(i = m; i < this.t; ++i) r.data[i] = op(this.data[i],f);
 r.t = this.t;
} else {
 f = this.s&this.DM;
 for(i = m; i < a.t; ++i) r.data[i] = op(f,a.data[i]);
 r.t = a.t;
}
r.s = op(this.s,a.s);
r.clamp();
}

//(public) this & a
function op_and(x,y) { return x&y; }
function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }

//(public) this | a
function op_or(x,y) { return x|y; }
function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }

//(public) this ^ a
function op_xor(x,y) { return x^y; }
function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }

//(public) this & ~a
function op_andnot(x,y) { return x&~y; }
function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }

//(public) ~this
function bnNot() {
var r = nbi();
for(var i = 0; i < this.t; ++i) r.data[i] = this.DM&~this.data[i];
r.t = this.t;
r.s = ~this.s;
return r;
}

//(public) this << n
function bnShiftLeft(n) {
var r = nbi();
if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);
return r;
}

//(public) this >> n
function bnShiftRight(n) {
var r = nbi();
if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);
return r;
}

//return index of lowest 1-bit in x, x < 2^31
function lbit(x) {
if(x == 0) return -1;
var r = 0;
if((x&0xffff) == 0) { x >>= 16; r += 16; }
if((x&0xff) == 0) { x >>= 8; r += 8; }
if((x&0xf) == 0) { x >>= 4; r += 4; }
if((x&3) == 0) { x >>= 2; r += 2; }
if((x&1) == 0) ++r;
return r;
}

//(public) returns index of lowest 1-bit (or -1 if none)
function bnGetLowestSetBit() {
for(var i = 0; i < this.t; ++i)
 if(this.data[i] != 0) return i*this.DB+lbit(this.data[i]);
if(this.s < 0) return this.t*this.DB;
return -1;
}

//return number of 1 bits in x
function cbit(x) {
var r = 0;
while(x != 0) { x &= x-1; ++r; }
return r;
}

//(public) return number of set bits
function bnBitCount() {
var r = 0, x = this.s&this.DM;
for(var i = 0; i < this.t; ++i) r += cbit(this.data[i]^x);
return r;
}

//(public) true iff nth bit is set
function bnTestBit(n) {
var j = Math.floor(n/this.DB);
if(j >= this.t) return(this.s!=0);
return((this.data[j]&(1<<(n%this.DB)))!=0);
}

//(protected) this op (1<<n)
function bnpChangeBit(n,op) {
var r = BigInteger.ONE.shiftLeft(n);
this.bitwiseTo(r,op,r);
return r;
}

//(public) this | (1<<n)
function bnSetBit(n) { return this.changeBit(n,op_or); }

//(public) this & ~(1<<n)
function bnClearBit(n) { return this.changeBit(n,op_andnot); }

//(public) this ^ (1<<n)
function bnFlipBit(n) { return this.changeBit(n,op_xor); }

//(protected) r = this + a
function bnpAddTo(a,r) {
var i = 0, c = 0, m = Math.min(a.t,this.t);
while(i < m) {
 c += this.data[i]+a.data[i];
 r.data[i++] = c&this.DM;
 c >>= this.DB;
}
if(a.t < this.t) {
 c += a.s;
 while(i < this.t) {
   c += this.data[i];
   r.data[i++] = c&this.DM;
   c >>= this.DB;
 }
 c += this.s;
} else {
 c += this.s;
 while(i < a.t) {
   c += a.data[i];
   r.data[i++] = c&this.DM;
   c >>= this.DB;
 }
 c += a.s;
}
r.s = (c<0)?-1:0;
if(c > 0) r.data[i++] = c;
else if(c < -1) r.data[i++] = this.DV+c;
r.t = i;
r.clamp();
}

//(public) this + a
function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }

//(public) this - a
function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }

//(public) this * a
function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }

//(public) this / a
function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }

//(public) this % a
function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }

//(public) [this/a,this%a]
function bnDivideAndRemainder(a) {
var q = nbi(), r = nbi();
this.divRemTo(a,q,r);
return new Array(q,r);
}

//(protected) this *= n, this >= 0, 1 < n < DV
function bnpDMultiply(n) {
this.data[this.t] = this.am(0,n-1,this,0,0,this.t);
++this.t;
this.clamp();
}

//(protected) this += n << w words, this >= 0
function bnpDAddOffset(n,w) {
if(n == 0) return;
while(this.t <= w) this.data[this.t++] = 0;
this.data[w] += n;
while(this.data[w] >= this.DV) {
 this.data[w] -= this.DV;
 if(++w >= this.t) this.data[this.t++] = 0;
 ++this.data[w];
}
}

//A "null" reducer
function NullExp() {}
function nNop(x) { return x; }
function nMulTo(x,y,r) { x.multiplyTo(y,r); }
function nSqrTo(x,r) { x.squareTo(r); }

NullExp.prototype.convert = nNop;
NullExp.prototype.revert = nNop;
NullExp.prototype.mulTo = nMulTo;
NullExp.prototype.sqrTo = nSqrTo;

//(public) this^e
function bnPow(e) { return this.exp(e,new NullExp()); }

//(protected) r = lower n words of "this * a", a.t <= n
//"this" should be the larger one if appropriate.
function bnpMultiplyLowerTo(a,n,r) {
var i = Math.min(this.t+a.t,n);
r.s = 0; // assumes a,this >= 0
r.t = i;
while(i > 0) r.data[--i] = 0;
var j;
for(j = r.t-this.t; i < j; ++i) r.data[i+this.t] = this.am(0,a.data[i],r,i,0,this.t);
for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a.data[i],r,i,0,n-i);
r.clamp();
}

//(protected) r = "this * a" without lower n words, n > 0
//"this" should be the larger one if appropriate.
function bnpMultiplyUpperTo(a,n,r) {
--n;
var i = r.t = this.t+a.t-n;
r.s = 0; // assumes a,this >= 0
while(--i >= 0) r.data[i] = 0;
for(i = Math.max(n-this.t,0); i < a.t; ++i)
 r.data[this.t+i-n] = this.am(n-i,a.data[i],r,0,0,this.t+i-n);
r.clamp();
r.drShiftTo(1,r);
}

//Barrett modular reduction
function Barrett(m) {
// setup Barrett
this.r2 = nbi();
this.q3 = nbi();
BigInteger.ONE.dlShiftTo(2*m.t,this.r2);
this.mu = this.r2.divide(m);
this.m = m;
}

function barrettConvert(x) {
if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);
else if(x.compareTo(this.m) < 0) return x;
else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
}

function barrettRevert(x) { return x; }

//x = x mod m (HAC 14.42)
function barrettReduce(x) {
x.drShiftTo(this.m.t-1,this.r2);
if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }
this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);
this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);
while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);
x.subTo(this.r2,x);
while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
}

//r = x^2 mod m; x != r
function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

//r = x*y mod m; x,y != r
function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }

Barrett.prototype.convert = barrettConvert;
Barrett.prototype.revert = barrettRevert;
Barrett.prototype.reduce = barrettReduce;
Barrett.prototype.mulTo = barrettMulTo;
Barrett.prototype.sqrTo = barrettSqrTo;

//(public) this^e % m (HAC 14.85)
function bnModPow(e,m) {
var i = e.bitLength(), k, r = nbv(1), z;
if(i <= 0) return r;
else if(i < 18) k = 1;
else if(i < 48) k = 3;
else if(i < 144) k = 4;
else if(i < 768) k = 5;
else k = 6;
if(i < 8)
 z = new Classic(m);
else if(m.isEven())
 z = new Barrett(m);
else
 z = new Montgomery(m);

// precomputation
var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;
g[1] = z.convert(this);
if(k > 1) {
 var g2 = nbi();
 z.sqrTo(g[1],g2);
 while(n <= km) {
   g[n] = nbi();
   z.mulTo(g2,g[n-2],g[n]);
   n += 2;
 }
}

var j = e.t-1, w, is1 = true, r2 = nbi(), t;
i = nbits(e.data[j])-1;
while(j >= 0) {
 if(i >= k1) w = (e.data[j]>>(i-k1))&km;
 else {
   w = (e.data[j]&((1<<(i+1))-1))<<(k1-i);
   if(j > 0) w |= e.data[j-1]>>(this.DB+i-k1);
 }

 n = k;
 while((w&1) == 0) { w >>= 1; --n; }
 if((i -= n) < 0) { i += this.DB; --j; }
 if(is1) {  // ret == 1, don't bother squaring or multiplying it
   g[w].copyTo(r);
   is1 = false;
 } else {
   while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }
   if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }
   z.mulTo(r2,g[w],r);
 }

 while(j >= 0 && (e.data[j]&(1<<i)) == 0) {
   z.sqrTo(r,r2); t = r; r = r2; r2 = t;
   if(--i < 0) { i = this.DB-1; --j; }
 }
}
return z.revert(r);
}

//(public) gcd(this,a) (HAC 14.54)
function bnGCD(a) {
var x = (this.s<0)?this.negate():this.clone();
var y = (a.s<0)?a.negate():a.clone();
if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }
var i = x.getLowestSetBit(), g = y.getLowestSetBit();
if(g < 0) return x;
if(i < g) g = i;
if(g > 0) {
 x.rShiftTo(g,x);
 y.rShiftTo(g,y);
}
while(x.signum() > 0) {
 if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);
 if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);
 if(x.compareTo(y) >= 0) {
   x.subTo(y,x);
   x.rShiftTo(1,x);
 } else {
   y.subTo(x,y);
   y.rShiftTo(1,y);
 }
}
if(g > 0) y.lShiftTo(g,y);
return y;
}

//(protected) this % n, n < 2^26
function bnpModInt(n) {
if(n <= 0) return 0;
var d = this.DV%n, r = (this.s<0)?n-1:0;
if(this.t > 0)
 if(d == 0) r = this.data[0]%n;
 else for(var i = this.t-1; i >= 0; --i) r = (d*r+this.data[i])%n;
return r;
}

//(public) 1/this % m (HAC 14.61)
function bnModInverse(m) {
var ac = m.isEven();
if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;
var u = m.clone(), v = this.clone();
var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
while(u.signum() != 0) {
 while(u.isEven()) {
   u.rShiftTo(1,u);
   if(ac) {
     if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
     a.rShiftTo(1,a);
   } else if(!b.isEven()) b.subTo(m,b);
   b.rShiftTo(1,b);
 }
 while(v.isEven()) {
   v.rShiftTo(1,v);
   if(ac) {
     if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
     c.rShiftTo(1,c);
   } else if(!d.isEven()) d.subTo(m,d);
   d.rShiftTo(1,d);
 }
 if(u.compareTo(v) >= 0) {
   u.subTo(v,u);
   if(ac) a.subTo(c,a);
   b.subTo(d,b);
 } else {
   v.subTo(u,v);
   if(ac) c.subTo(a,c);
   d.subTo(b,d);
 }
}
if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
if(d.compareTo(m) >= 0) return d.subtract(m);
if(d.signum() < 0) d.addTo(m,d); else return d;
if(d.signum() < 0) return d.add(m); else return d;
}

var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509];
var lplim = (1<<26)/lowprimes[lowprimes.length-1];

//(public) test primality with certainty >= 1-.5^t
function bnIsProbablePrime(t) {
var i, x = this.abs();
if(x.t == 1 && x.data[0] <= lowprimes[lowprimes.length-1]) {
 for(i = 0; i < lowprimes.length; ++i)
   if(x.data[0] == lowprimes[i]) return true;
 return false;
}
if(x.isEven()) return false;
i = 1;
while(i < lowprimes.length) {
 var m = lowprimes[i], j = i+1;
 while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];
 m = x.modInt(m);
 while(i < j) if(m%lowprimes[i++] == 0) return false;
}
return x.millerRabin(t);
}

//(protected) true if probably prime (HAC 4.24, Miller-Rabin)
function bnpMillerRabin(t) {
var n1 = this.subtract(BigInteger.ONE);
var k = n1.getLowestSetBit();
if(k <= 0) return false;
var r = n1.shiftRight(k);
var prng = bnGetPrng();
var a;
for(var i = 0; i < t; ++i) {
 // select witness 'a' at random from between 1 and n1
 do {
   a = new BigInteger(this.bitLength(), prng);
 }
 while(a.compareTo(BigInteger.ONE) <= 0 || a.compareTo(n1) >= 0);
 var y = a.modPow(r,this);
 if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
   var j = 1;
   while(j++ < k && y.compareTo(n1) != 0) {
     y = y.modPowInt(2,this);
     if(y.compareTo(BigInteger.ONE) == 0) return false;
   }
   if(y.compareTo(n1) != 0) return false;
 }
}
return true;
}

// get pseudo random number generator
function bnGetPrng() {
  // create prng with api that matches BigInteger secure random
  return {
    // x is an array to fill with bytes
    nextBytes: function(x) {
      for(var i = 0; i < x.length; ++i) {
        x[i] = Math.floor(Math.random() * 0x0100);
      }
    }
  };
}

//protected
BigInteger.prototype.chunkSize = bnpChunkSize;
BigInteger.prototype.toRadix = bnpToRadix;
BigInteger.prototype.fromRadix = bnpFromRadix;
BigInteger.prototype.fromNumber = bnpFromNumber;
BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
BigInteger.prototype.changeBit = bnpChangeBit;
BigInteger.prototype.addTo = bnpAddTo;
BigInteger.prototype.dMultiply = bnpDMultiply;
BigInteger.prototype.dAddOffset = bnpDAddOffset;
BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
BigInteger.prototype.modInt = bnpModInt;
BigInteger.prototype.millerRabin = bnpMillerRabin;

//public
BigInteger.prototype.clone = bnClone;
BigInteger.prototype.intValue = bnIntValue;
BigInteger.prototype.byteValue = bnByteValue;
BigInteger.prototype.shortValue = bnShortValue;
BigInteger.prototype.signum = bnSigNum;
BigInteger.prototype.toByteArray = bnToByteArray;
BigInteger.prototype.equals = bnEquals;
BigInteger.prototype.min = bnMin;
BigInteger.prototype.max = bnMax;
BigInteger.prototype.and = bnAnd;
BigInteger.prototype.or = bnOr;
BigInteger.prototype.xor = bnXor;
BigInteger.prototype.andNot = bnAndNot;
BigInteger.prototype.not = bnNot;
BigInteger.prototype.shiftLeft = bnShiftLeft;
BigInteger.prototype.shiftRight = bnShiftRight;
BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
BigInteger.prototype.bitCount = bnBitCount;
BigInteger.prototype.testBit = bnTestBit;
BigInteger.prototype.setBit = bnSetBit;
BigInteger.prototype.clearBit = bnClearBit;
BigInteger.prototype.flipBit = bnFlipBit;
BigInteger.prototype.add = bnAdd;
BigInteger.prototype.subtract = bnSubtract;
BigInteger.prototype.multiply = bnMultiply;
BigInteger.prototype.divide = bnDivide;
BigInteger.prototype.remainder = bnRemainder;
BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
BigInteger.prototype.modPow = bnModPow;
BigInteger.prototype.modInverse = bnModInverse;
BigInteger.prototype.pow = bnPow;
BigInteger.prototype.gcd = bnGCD;
BigInteger.prototype.isProbablePrime = bnIsProbablePrime;

//BigInteger interfaces not implemented in jsbn:

//BigInteger(int signum, byte[] magnitude)
//double doubleValue()
//float floatValue()
//int hashCode()
//long longValue()
//static BigInteger valueOf(long val)

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/md.js":[function(require,module,exports){
/**
 * Node.js module for Forge message digests.
 *
 * @author Dave Longley
 *
 * Copyright 2011-2017 Digital Bazaar, Inc.
 */
var forge = require('./forge');

module.exports = forge.md = forge.md || {};
forge.md.algorithms = forge.md.algorithms || {};

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/mgf.js":[function(require,module,exports){
/**
 * Node.js module for Forge mask generation functions.
 *
 * @author Stefan Siegl
 *
 * Copyright 2012 Stefan Siegl <stesie@brokenpipe.de>
 */
var forge = require('./forge');
require('./mgf1');

module.exports = forge.mgf = forge.mgf || {};
forge.mgf.mgf1 = forge.mgf1;

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./mgf1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/mgf1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/mgf1.js":[function(require,module,exports){
/**
 * Javascript implementation of mask generation function MGF1.
 *
 * @author Stefan Siegl
 * @author Dave Longley
 *
 * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>
 * Copyright (c) 2014 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./util');

forge.mgf = forge.mgf || {};
var mgf1 = module.exports = forge.mgf.mgf1 = forge.mgf1 = forge.mgf1 || {};

/**
 * Creates a MGF1 mask generation function object.
 *
 * @param md the message digest API to use (eg: forge.md.sha1.create()).
 *
 * @return a mask generation function object.
 */
mgf1.create = function(md) {
  var mgf = {
    /**
     * Generate mask of specified length.
     *
     * @param {String} seed The seed for mask generation.
     * @param maskLen Number of bytes to generate.
     * @return {String} The generated mask.
     */
    generate: function(seed, maskLen) {
      /* 2. Let T be the empty octet string. */
      var t = new forge.util.ByteBuffer();

      /* 3. For counter from 0 to ceil(maskLen / hLen), do the following: */
      var len = Math.ceil(maskLen / md.digestLength);
      for(var i = 0; i < len; i++) {
        /* a. Convert counter to an octet string C of length 4 octets */
        var c = new forge.util.ByteBuffer();
        c.putInt32(i);

        /* b. Concatenate the hash of the seed mgfSeed and C to the octet
         * string T: */
        md.start();
        md.update(seed + c.getBytes());
        t.putBuffer(md.digest());
      }

      /* Output the leading maskLen octets of T as the octet string mask. */
      t.truncate(t.length() - maskLen);
      return t.getBytes();
    }
  };

  return mgf;
};

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/oids.js":[function(require,module,exports){
/**
 * Object IDs for ASN.1.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2013 Digital Bazaar, Inc.
 */
var forge = require('./forge');

forge.pki = forge.pki || {};
var oids = module.exports = forge.pki.oids = forge.oids = forge.oids || {};

// set id to name mapping and name to id mapping
function _IN(id, name) {
  oids[id] = name;
  oids[name] = id;
}
// set id to name mapping only
function _I_(id, name) {
  oids[id] = name;
}

// algorithm OIDs
_IN('1.2.840.113549.1.1.1', 'rsaEncryption');
// Note: md2 & md4 not implemented
//_IN('1.2.840.113549.1.1.2', 'md2WithRSAEncryption');
//_IN('1.2.840.113549.1.1.3', 'md4WithRSAEncryption');
_IN('1.2.840.113549.1.1.4', 'md5WithRSAEncryption');
_IN('1.2.840.113549.1.1.5', 'sha1WithRSAEncryption');
_IN('1.2.840.113549.1.1.7', 'RSAES-OAEP');
_IN('1.2.840.113549.1.1.8', 'mgf1');
_IN('1.2.840.113549.1.1.9', 'pSpecified');
_IN('1.2.840.113549.1.1.10', 'RSASSA-PSS');
_IN('1.2.840.113549.1.1.11', 'sha256WithRSAEncryption');
_IN('1.2.840.113549.1.1.12', 'sha384WithRSAEncryption');
_IN('1.2.840.113549.1.1.13', 'sha512WithRSAEncryption');

_IN('1.2.840.10040.4.3', 'dsa-with-sha1');

_IN('1.3.14.3.2.7', 'desCBC');

_IN('1.3.14.3.2.26', 'sha1');
_IN('2.16.840.1.101.3.4.2.1', 'sha256');
_IN('2.16.840.1.101.3.4.2.2', 'sha384');
_IN('2.16.840.1.101.3.4.2.3', 'sha512');
_IN('1.2.840.113549.2.5', 'md5');

// pkcs#7 content types
_IN('1.2.840.113549.1.7.1', 'data');
_IN('1.2.840.113549.1.7.2', 'signedData');
_IN('1.2.840.113549.1.7.3', 'envelopedData');
_IN('1.2.840.113549.1.7.4', 'signedAndEnvelopedData');
_IN('1.2.840.113549.1.7.5', 'digestedData');
_IN('1.2.840.113549.1.7.6', 'encryptedData');

// pkcs#9 oids
_IN('1.2.840.113549.1.9.1', 'emailAddress');
_IN('1.2.840.113549.1.9.2', 'unstructuredName');
_IN('1.2.840.113549.1.9.3', 'contentType');
_IN('1.2.840.113549.1.9.4', 'messageDigest');
_IN('1.2.840.113549.1.9.5', 'signingTime');
_IN('1.2.840.113549.1.9.6', 'counterSignature');
_IN('1.2.840.113549.1.9.7', 'challengePassword');
_IN('1.2.840.113549.1.9.8', 'unstructuredAddress');
_IN('1.2.840.113549.1.9.14', 'extensionRequest');

_IN('1.2.840.113549.1.9.20', 'friendlyName');
_IN('1.2.840.113549.1.9.21', 'localKeyId');
_IN('1.2.840.113549.1.9.22.1', 'x509Certificate');

// pkcs#12 safe bags
_IN('1.2.840.113549.1.12.10.1.1', 'keyBag');
_IN('1.2.840.113549.1.12.10.1.2', 'pkcs8ShroudedKeyBag');
_IN('1.2.840.113549.1.12.10.1.3', 'certBag');
_IN('1.2.840.113549.1.12.10.1.4', 'crlBag');
_IN('1.2.840.113549.1.12.10.1.5', 'secretBag');
_IN('1.2.840.113549.1.12.10.1.6', 'safeContentsBag');

// password-based-encryption for pkcs#12
_IN('1.2.840.113549.1.5.13', 'pkcs5PBES2');
_IN('1.2.840.113549.1.5.12', 'pkcs5PBKDF2');

_IN('1.2.840.113549.1.12.1.1', 'pbeWithSHAAnd128BitRC4');
_IN('1.2.840.113549.1.12.1.2', 'pbeWithSHAAnd40BitRC4');
_IN('1.2.840.113549.1.12.1.3', 'pbeWithSHAAnd3-KeyTripleDES-CBC');
_IN('1.2.840.113549.1.12.1.4', 'pbeWithSHAAnd2-KeyTripleDES-CBC');
_IN('1.2.840.113549.1.12.1.5', 'pbeWithSHAAnd128BitRC2-CBC');
_IN('1.2.840.113549.1.12.1.6', 'pbewithSHAAnd40BitRC2-CBC');

// hmac OIDs
_IN('1.2.840.113549.2.7', 'hmacWithSHA1');
_IN('1.2.840.113549.2.8', 'hmacWithSHA224');
_IN('1.2.840.113549.2.9', 'hmacWithSHA256');
_IN('1.2.840.113549.2.10', 'hmacWithSHA384');
_IN('1.2.840.113549.2.11', 'hmacWithSHA512');

// symmetric key algorithm oids
_IN('1.2.840.113549.3.7', 'des-EDE3-CBC');
_IN('2.16.840.1.101.3.4.1.2', 'aes128-CBC');
_IN('2.16.840.1.101.3.4.1.22', 'aes192-CBC');
_IN('2.16.840.1.101.3.4.1.42', 'aes256-CBC');

// certificate issuer/subject OIDs
_IN('2.5.4.3', 'commonName');
_IN('2.5.4.5', 'serialName');
_IN('2.5.4.6', 'countryName');
_IN('2.5.4.7', 'localityName');
_IN('2.5.4.8', 'stateOrProvinceName');
_IN('2.5.4.10', 'organizationName');
_IN('2.5.4.11', 'organizationalUnitName');
_IN('2.5.4.13', 'description');

// X.509 extension OIDs
_IN('2.16.840.1.113730.1.1', 'nsCertType');
_IN('2.16.840.1.113730.1.13', 'nsComment'); // deprecated in theory; still widely used
_I_('2.5.29.1', 'authorityKeyIdentifier'); // deprecated, use .35
_I_('2.5.29.2', 'keyAttributes'); // obsolete use .37 or .15
_I_('2.5.29.3', 'certificatePolicies'); // deprecated, use .32
_I_('2.5.29.4', 'keyUsageRestriction'); // obsolete use .37 or .15
_I_('2.5.29.5', 'policyMapping'); // deprecated use .33
_I_('2.5.29.6', 'subtreesConstraint'); // obsolete use .30
_I_('2.5.29.7', 'subjectAltName'); // deprecated use .17
_I_('2.5.29.8', 'issuerAltName'); // deprecated use .18
_I_('2.5.29.9', 'subjectDirectoryAttributes');
_I_('2.5.29.10', 'basicConstraints'); // deprecated use .19
_I_('2.5.29.11', 'nameConstraints'); // deprecated use .30
_I_('2.5.29.12', 'policyConstraints'); // deprecated use .36
_I_('2.5.29.13', 'basicConstraints'); // deprecated use .19
_IN('2.5.29.14', 'subjectKeyIdentifier');
_IN('2.5.29.15', 'keyUsage');
_I_('2.5.29.16', 'privateKeyUsagePeriod');
_IN('2.5.29.17', 'subjectAltName');
_IN('2.5.29.18', 'issuerAltName');
_IN('2.5.29.19', 'basicConstraints');
_I_('2.5.29.20', 'cRLNumber');
_I_('2.5.29.21', 'cRLReason');
_I_('2.5.29.22', 'expirationDate');
_I_('2.5.29.23', 'instructionCode');
_I_('2.5.29.24', 'invalidityDate');
_I_('2.5.29.25', 'cRLDistributionPoints'); // deprecated use .31
_I_('2.5.29.26', 'issuingDistributionPoint'); // deprecated use .28
_I_('2.5.29.27', 'deltaCRLIndicator');
_I_('2.5.29.28', 'issuingDistributionPoint');
_I_('2.5.29.29', 'certificateIssuer');
_I_('2.5.29.30', 'nameConstraints');
_IN('2.5.29.31', 'cRLDistributionPoints');
_IN('2.5.29.32', 'certificatePolicies');
_I_('2.5.29.33', 'policyMappings');
_I_('2.5.29.34', 'policyConstraints'); // deprecated use .36
_IN('2.5.29.35', 'authorityKeyIdentifier');
_I_('2.5.29.36', 'policyConstraints');
_IN('2.5.29.37', 'extKeyUsage');
_I_('2.5.29.46', 'freshestCRL');
_I_('2.5.29.54', 'inhibitAnyPolicy');

// extKeyUsage purposes
_IN('1.3.6.1.4.1.11129.2.4.2', 'timestampList');
_IN('1.3.6.1.5.5.7.1.1', 'authorityInfoAccess');
_IN('1.3.6.1.5.5.7.3.1', 'serverAuth');
_IN('1.3.6.1.5.5.7.3.2', 'clientAuth');
_IN('1.3.6.1.5.5.7.3.3', 'codeSigning');
_IN('1.3.6.1.5.5.7.3.4', 'emailProtection');
_IN('1.3.6.1.5.5.7.3.8', 'timeStamping');

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pbe.js":[function(require,module,exports){
/**
 * Password-based encryption functions.
 *
 * @author Dave Longley
 * @author Stefan Siegl <stesie@brokenpipe.de>
 *
 * Copyright (c) 2010-2013 Digital Bazaar, Inc.
 * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>
 *
 * An EncryptedPrivateKeyInfo:
 *
 * EncryptedPrivateKeyInfo ::= SEQUENCE {
 *   encryptionAlgorithm  EncryptionAlgorithmIdentifier,
 *   encryptedData        EncryptedData }
 *
 * EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
 *
 * EncryptedData ::= OCTET STRING
 */
var forge = require('./forge');
require('./aes');
require('./asn1');
require('./des');
require('./md');
require('./oids');
require('./pbkdf2');
require('./pem');
require('./random');
require('./rc2');
require('./rsa');
require('./util');

if(typeof BigInteger === 'undefined') {
  var BigInteger = forge.jsbn.BigInteger;
}

// shortcut for asn.1 API
var asn1 = forge.asn1;

/* Password-based encryption implementation. */
var pki = forge.pki = forge.pki || {};
module.exports = pki.pbe = forge.pbe = forge.pbe || {};
var oids = pki.oids;

// validator for an EncryptedPrivateKeyInfo structure
// Note: Currently only works w/algorithm params
var encryptedPrivateKeyValidator = {
  name: 'EncryptedPrivateKeyInfo',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'EncryptedPrivateKeyInfo.encryptionAlgorithm',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    value: [{
      name: 'AlgorithmIdentifier.algorithm',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.OID,
      constructed: false,
      capture: 'encryptionOid'
    }, {
      name: 'AlgorithmIdentifier.parameters',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,
      constructed: true,
      captureAsn1: 'encryptionParams'
    }]
  }, {
    // encryptedData
    name: 'EncryptedPrivateKeyInfo.encryptedData',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.OCTETSTRING,
    constructed: false,
    capture: 'encryptedData'
  }]
};

// validator for a PBES2Algorithms structure
// Note: Currently only works w/PBKDF2 + AES encryption schemes
var PBES2AlgorithmsValidator = {
  name: 'PBES2Algorithms',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'PBES2Algorithms.keyDerivationFunc',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    value: [{
      name: 'PBES2Algorithms.keyDerivationFunc.oid',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.OID,
      constructed: false,
      capture: 'kdfOid'
    }, {
      name: 'PBES2Algorithms.params',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,
      constructed: true,
      value: [{
        name: 'PBES2Algorithms.params.salt',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.OCTETSTRING,
        constructed: false,
        capture: 'kdfSalt'
      }, {
        name: 'PBES2Algorithms.params.iterationCount',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.INTEGER,
        constructed: false,
        capture: 'kdfIterationCount'
      }, {
        name: 'PBES2Algorithms.params.keyLength',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.INTEGER,
        constructed: false,
        optional: true,
        capture: 'keyLength'
      }, {
        // prf
        name: 'PBES2Algorithms.params.prf',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.SEQUENCE,
        constructed: true,
        optional: true,
        value: [{
          name: 'PBES2Algorithms.params.prf.algorithm',
          tagClass: asn1.Class.UNIVERSAL,
          type: asn1.Type.OID,
          constructed: false,
          capture: 'prfOid'
        }]
      }]
    }]
  }, {
    name: 'PBES2Algorithms.encryptionScheme',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    value: [{
      name: 'PBES2Algorithms.encryptionScheme.oid',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.OID,
      constructed: false,
      capture: 'encOid'
    }, {
      name: 'PBES2Algorithms.encryptionScheme.iv',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.OCTETSTRING,
      constructed: false,
      capture: 'encIv'
    }]
  }]
};

var pkcs12PbeParamsValidator = {
  name: 'pkcs-12PbeParams',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'pkcs-12PbeParams.salt',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.OCTETSTRING,
    constructed: false,
    capture: 'salt'
  }, {
    name: 'pkcs-12PbeParams.iterations',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'iterations'
  }]
};

/**
 * Encrypts a ASN.1 PrivateKeyInfo object, producing an EncryptedPrivateKeyInfo.
 *
 * PBES2Algorithms ALGORITHM-IDENTIFIER ::=
 *   { {PBES2-params IDENTIFIED BY id-PBES2}, ...}
 *
 * id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13}
 *
 * PBES2-params ::= SEQUENCE {
 *   keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}},
 *   encryptionScheme AlgorithmIdentifier {{PBES2-Encs}}
 * }
 *
 * PBES2-KDFs ALGORITHM-IDENTIFIER ::=
 *   { {PBKDF2-params IDENTIFIED BY id-PBKDF2}, ... }
 *
 * PBES2-Encs ALGORITHM-IDENTIFIER ::= { ... }
 *
 * PBKDF2-params ::= SEQUENCE {
 *   salt CHOICE {
 *     specified OCTET STRING,
 *     otherSource AlgorithmIdentifier {{PBKDF2-SaltSources}}
 *   },
 *   iterationCount INTEGER (1..MAX),
 *   keyLength INTEGER (1..MAX) OPTIONAL,
 *   prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1
 * }
 *
 * @param obj the ASN.1 PrivateKeyInfo object.
 * @param password the password to encrypt with.
 * @param options:
 *          algorithm the encryption algorithm to use
 *            ('aes128', 'aes192', 'aes256', '3des'), defaults to 'aes128'.
 *          count the iteration count to use.
 *          saltSize the salt size to use.
 *          prfAlgorithm the PRF message digest algorithm to use
 *            ('sha1', 'sha224', 'sha256', 'sha384', 'sha512')
 *
 * @return the ASN.1 EncryptedPrivateKeyInfo.
 */
pki.encryptPrivateKeyInfo = function(obj, password, options) {
  // set default options
  options = options || {};
  options.saltSize = options.saltSize || 8;
  options.count = options.count || 2048;
  options.algorithm = options.algorithm || 'aes128';
  options.prfAlgorithm = options.prfAlgorithm || 'sha1';

  // generate PBE params
  var salt = forge.random.getBytesSync(options.saltSize);
  var count = options.count;
  var countBytes = asn1.integerToDer(count);
  var dkLen;
  var encryptionAlgorithm;
  var encryptedData;
  if(options.algorithm.indexOf('aes') === 0 || options.algorithm === 'des') {
    // do PBES2
    var ivLen, encOid, cipherFn;
    switch(options.algorithm) {
    case 'aes128':
      dkLen = 16;
      ivLen = 16;
      encOid = oids['aes128-CBC'];
      cipherFn = forge.aes.createEncryptionCipher;
      break;
    case 'aes192':
      dkLen = 24;
      ivLen = 16;
      encOid = oids['aes192-CBC'];
      cipherFn = forge.aes.createEncryptionCipher;
      break;
    case 'aes256':
      dkLen = 32;
      ivLen = 16;
      encOid = oids['aes256-CBC'];
      cipherFn = forge.aes.createEncryptionCipher;
      break;
    case 'des':
      dkLen = 8;
      ivLen = 8;
      encOid = oids['desCBC'];
      cipherFn = forge.des.createEncryptionCipher;
      break;
    default:
      var error = new Error('Cannot encrypt private key. Unknown encryption algorithm.');
      error.algorithm = options.algorithm;
      throw error;
    }

    // get PRF message digest
    var prfAlgorithm = 'hmacWith' + options.prfAlgorithm.toUpperCase();
    var md = prfAlgorithmToMessageDigest(prfAlgorithm);

    // encrypt private key using pbe SHA-1 and AES/DES
    var dk = forge.pkcs5.pbkdf2(password, salt, count, dkLen, md);
    var iv = forge.random.getBytesSync(ivLen);
    var cipher = cipherFn(dk);
    cipher.start(iv);
    cipher.update(asn1.toDer(obj));
    cipher.finish();
    encryptedData = cipher.output.getBytes();

    // get PBKDF2-params
    var params = createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm);

    encryptionAlgorithm = asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        asn1.oidToDer(oids['pkcs5PBES2']).getBytes()),
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // keyDerivationFunc
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
            asn1.oidToDer(oids['pkcs5PBKDF2']).getBytes()),
          // PBKDF2-params
          params
        ]),
        // encryptionScheme
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
            asn1.oidToDer(encOid).getBytes()),
          // iv
          asn1.create(
            asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, iv)
        ])
      ])
    ]);
  } else if(options.algorithm === '3des') {
    // Do PKCS12 PBE
    dkLen = 24;

    var saltBytes = new forge.util.ByteBuffer(salt);
    var dk = pki.pbe.generatePkcs12Key(password, saltBytes, 1, count, dkLen);
    var iv = pki.pbe.generatePkcs12Key(password, saltBytes, 2, count, dkLen);
    var cipher = forge.des.createEncryptionCipher(dk);
    cipher.start(iv);
    cipher.update(asn1.toDer(obj));
    cipher.finish();
    encryptedData = cipher.output.getBytes();

    encryptionAlgorithm = asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        asn1.oidToDer(oids['pbeWithSHAAnd3-KeyTripleDES-CBC']).getBytes()),
      // pkcs-12PbeParams
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // salt
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, salt),
        // iteration count
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
          countBytes.getBytes())
      ])
    ]);
  } else {
    var error = new Error('Cannot encrypt private key. Unknown encryption algorithm.');
    error.algorithm = options.algorithm;
    throw error;
  }

  // EncryptedPrivateKeyInfo
  var rval = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // encryptionAlgorithm
    encryptionAlgorithm,
    // encryptedData
    asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, encryptedData)
  ]);
  return rval;
};

/**
 * Decrypts a ASN.1 PrivateKeyInfo object.
 *
 * @param obj the ASN.1 EncryptedPrivateKeyInfo object.
 * @param password the password to decrypt with.
 *
 * @return the ASN.1 PrivateKeyInfo on success, null on failure.
 */
pki.decryptPrivateKeyInfo = function(obj, password) {
  var rval = null;

  // get PBE params
  var capture = {};
  var errors = [];
  if(!asn1.validate(obj, encryptedPrivateKeyValidator, capture, errors)) {
    var error = new Error('Cannot read encrypted private key. ' +
      'ASN.1 object is not a supported EncryptedPrivateKeyInfo.');
    error.errors = errors;
    throw error;
  }

  // get cipher
  var oid = asn1.derToOid(capture.encryptionOid);
  var cipher = pki.pbe.getCipher(oid, capture.encryptionParams, password);

  // get encrypted data
  var encrypted = forge.util.createBuffer(capture.encryptedData);

  cipher.update(encrypted);
  if(cipher.finish()) {
    rval = asn1.fromDer(cipher.output);
  }

  return rval;
};

/**
 * Converts a EncryptedPrivateKeyInfo to PEM format.
 *
 * @param epki the EncryptedPrivateKeyInfo.
 * @param maxline the maximum characters per line, defaults to 64.
 *
 * @return the PEM-formatted encrypted private key.
 */
pki.encryptedPrivateKeyToPem = function(epki, maxline) {
  // convert to DER, then PEM-encode
  var msg = {
    type: 'ENCRYPTED PRIVATE KEY',
    body: asn1.toDer(epki).getBytes()
  };
  return forge.pem.encode(msg, {maxline: maxline});
};

/**
 * Converts a PEM-encoded EncryptedPrivateKeyInfo to ASN.1 format. Decryption
 * is not performed.
 *
 * @param pem the EncryptedPrivateKeyInfo in PEM-format.
 *
 * @return the ASN.1 EncryptedPrivateKeyInfo.
 */
pki.encryptedPrivateKeyFromPem = function(pem) {
  var msg = forge.pem.decode(pem)[0];

  if(msg.type !== 'ENCRYPTED PRIVATE KEY') {
    var error = new Error('Could not convert encrypted private key from PEM; ' +
      'PEM header type is "ENCRYPTED PRIVATE KEY".');
    error.headerType = msg.type;
    throw error;
  }
  if(msg.procType && msg.procType.type === 'ENCRYPTED') {
    throw new Error('Could not convert encrypted private key from PEM; ' +
      'PEM is encrypted.');
  }

  // convert DER to ASN.1 object
  return asn1.fromDer(msg.body);
};

/**
 * Encrypts an RSA private key. By default, the key will be wrapped in
 * a PrivateKeyInfo and encrypted to produce a PKCS#8 EncryptedPrivateKeyInfo.
 * This is the standard, preferred way to encrypt a private key.
 *
 * To produce a non-standard PEM-encrypted private key that uses encapsulated
 * headers to indicate the encryption algorithm (old-style non-PKCS#8 OpenSSL
 * private key encryption), set the 'legacy' option to true. Note: Using this
 * option will cause the iteration count to be forced to 1.
 *
 * Note: The 'des' algorithm is supported, but it is not considered to be
 * secure because it only uses a single 56-bit key. If possible, it is highly
 * recommended that a different algorithm be used.
 *
 * @param rsaKey the RSA key to encrypt.
 * @param password the password to use.
 * @param options:
 *          algorithm: the encryption algorithm to use
 *            ('aes128', 'aes192', 'aes256', '3des', 'des').
 *          count: the iteration count to use.
 *          saltSize: the salt size to use.
 *          legacy: output an old non-PKCS#8 PEM-encrypted+encapsulated
 *            headers (DEK-Info) private key.
 *
 * @return the PEM-encoded ASN.1 EncryptedPrivateKeyInfo.
 */
pki.encryptRsaPrivateKey = function(rsaKey, password, options) {
  // standard PKCS#8
  options = options || {};
  if(!options.legacy) {
    // encrypt PrivateKeyInfo
    var rval = pki.wrapRsaPrivateKey(pki.privateKeyToAsn1(rsaKey));
    rval = pki.encryptPrivateKeyInfo(rval, password, options);
    return pki.encryptedPrivateKeyToPem(rval);
  }

  // legacy non-PKCS#8
  var algorithm;
  var iv;
  var dkLen;
  var cipherFn;
  switch(options.algorithm) {
  case 'aes128':
    algorithm = 'AES-128-CBC';
    dkLen = 16;
    iv = forge.random.getBytesSync(16);
    cipherFn = forge.aes.createEncryptionCipher;
    break;
  case 'aes192':
    algorithm = 'AES-192-CBC';
    dkLen = 24;
    iv = forge.random.getBytesSync(16);
    cipherFn = forge.aes.createEncryptionCipher;
    break;
  case 'aes256':
    algorithm = 'AES-256-CBC';
    dkLen = 32;
    iv = forge.random.getBytesSync(16);
    cipherFn = forge.aes.createEncryptionCipher;
    break;
  case '3des':
    algorithm = 'DES-EDE3-CBC';
    dkLen = 24;
    iv = forge.random.getBytesSync(8);
    cipherFn = forge.des.createEncryptionCipher;
    break;
  case 'des':
    algorithm = 'DES-CBC';
    dkLen = 8;
    iv = forge.random.getBytesSync(8);
    cipherFn = forge.des.createEncryptionCipher;
    break;
  default:
    var error = new Error('Could not encrypt RSA private key; unsupported ' +
      'encryption algorithm "' + options.algorithm + '".');
    error.algorithm = options.algorithm;
    throw error;
  }

  // encrypt private key using OpenSSL legacy key derivation
  var dk = forge.pbe.opensslDeriveBytes(password, iv.substr(0, 8), dkLen);
  var cipher = cipherFn(dk);
  cipher.start(iv);
  cipher.update(asn1.toDer(pki.privateKeyToAsn1(rsaKey)));
  cipher.finish();

  var msg = {
    type: 'RSA PRIVATE KEY',
    procType: {
      version: '4',
      type: 'ENCRYPTED'
    },
    dekInfo: {
      algorithm: algorithm,
      parameters: forge.util.bytesToHex(iv).toUpperCase()
    },
    body: cipher.output.getBytes()
  };
  return forge.pem.encode(msg);
};

/**
 * Decrypts an RSA private key.
 *
 * @param pem the PEM-formatted EncryptedPrivateKeyInfo to decrypt.
 * @param password the password to use.
 *
 * @return the RSA key on success, null on failure.
 */
pki.decryptRsaPrivateKey = function(pem, password) {
  var rval = null;

  var msg = forge.pem.decode(pem)[0];

  if(msg.type !== 'ENCRYPTED PRIVATE KEY' &&
    msg.type !== 'PRIVATE KEY' &&
    msg.type !== 'RSA PRIVATE KEY') {
    var error = new Error('Could not convert private key from PEM; PEM header type ' +
      'is not "ENCRYPTED PRIVATE KEY", "PRIVATE KEY", or "RSA PRIVATE KEY".');
    error.headerType = error;
    throw error;
  }

  if(msg.procType && msg.procType.type === 'ENCRYPTED') {
    var dkLen;
    var cipherFn;
    switch(msg.dekInfo.algorithm) {
    case 'DES-CBC':
      dkLen = 8;
      cipherFn = forge.des.createDecryptionCipher;
      break;
    case 'DES-EDE3-CBC':
      dkLen = 24;
      cipherFn = forge.des.createDecryptionCipher;
      break;
    case 'AES-128-CBC':
      dkLen = 16;
      cipherFn = forge.aes.createDecryptionCipher;
      break;
    case 'AES-192-CBC':
      dkLen = 24;
      cipherFn = forge.aes.createDecryptionCipher;
      break;
    case 'AES-256-CBC':
      dkLen = 32;
      cipherFn = forge.aes.createDecryptionCipher;
      break;
    case 'RC2-40-CBC':
      dkLen = 5;
      cipherFn = function(key) {
        return forge.rc2.createDecryptionCipher(key, 40);
      };
      break;
    case 'RC2-64-CBC':
      dkLen = 8;
      cipherFn = function(key) {
        return forge.rc2.createDecryptionCipher(key, 64);
      };
      break;
    case 'RC2-128-CBC':
      dkLen = 16;
      cipherFn = function(key) {
        return forge.rc2.createDecryptionCipher(key, 128);
      };
      break;
    default:
      var error = new Error('Could not decrypt private key; unsupported ' +
        'encryption algorithm "' + msg.dekInfo.algorithm + '".');
      error.algorithm = msg.dekInfo.algorithm;
      throw error;
    }

    // use OpenSSL legacy key derivation
    var iv = forge.util.hexToBytes(msg.dekInfo.parameters);
    var dk = forge.pbe.opensslDeriveBytes(password, iv.substr(0, 8), dkLen);
    var cipher = cipherFn(dk);
    cipher.start(iv);
    cipher.update(forge.util.createBuffer(msg.body));
    if(cipher.finish()) {
      rval = cipher.output.getBytes();
    } else {
      return rval;
    }
  } else {
    rval = msg.body;
  }

  if(msg.type === 'ENCRYPTED PRIVATE KEY') {
    rval = pki.decryptPrivateKeyInfo(asn1.fromDer(rval), password);
  } else {
    // decryption already performed above
    rval = asn1.fromDer(rval);
  }

  if(rval !== null) {
    rval = pki.privateKeyFromAsn1(rval);
  }

  return rval;
};

/**
 * Derives a PKCS#12 key.
 *
 * @param password the password to derive the key material from, null or
 *          undefined for none.
 * @param salt the salt, as a ByteBuffer, to use.
 * @param id the PKCS#12 ID byte (1 = key material, 2 = IV, 3 = MAC).
 * @param iter the iteration count.
 * @param n the number of bytes to derive from the password.
 * @param md the message digest to use, defaults to SHA-1.
 *
 * @return a ByteBuffer with the bytes derived from the password.
 */
pki.pbe.generatePkcs12Key = function(password, salt, id, iter, n, md) {
  var j, l;

  if(typeof md === 'undefined' || md === null) {
    if(!('sha1' in forge.md)) {
      throw new Error('"sha1" hash algorithm unavailable.');
    }
    md = forge.md.sha1.create();
  }

  var u = md.digestLength;
  var v = md.blockLength;
  var result = new forge.util.ByteBuffer();

  /* Convert password to Unicode byte buffer + trailing 0-byte. */
  var passBuf = new forge.util.ByteBuffer();
  if(password !== null && password !== undefined) {
    for(l = 0; l < password.length; l++) {
      passBuf.putInt16(password.charCodeAt(l));
    }
    passBuf.putInt16(0);
  }

  /* Length of salt and password in BYTES. */
  var p = passBuf.length();
  var s = salt.length();

  /* 1. Construct a string, D (the "diversifier"), by concatenating
        v copies of ID. */
  var D = new forge.util.ByteBuffer();
  D.fillWithByte(id, v);

  /* 2. Concatenate copies of the salt together to create a string S of length
        v * ceil(s / v) bytes (the final copy of the salt may be trunacted
        to create S).
        Note that if the salt is the empty string, then so is S. */
  var Slen = v * Math.ceil(s / v);
  var S = new forge.util.ByteBuffer();
  for(l = 0; l < Slen; l++) {
    S.putByte(salt.at(l % s));
  }

  /* 3. Concatenate copies of the password together to create a string P of
        length v * ceil(p / v) bytes (the final copy of the password may be
        truncated to create P).
        Note that if the password is the empty string, then so is P. */
  var Plen = v * Math.ceil(p / v);
  var P = new forge.util.ByteBuffer();
  for(l = 0; l < Plen; l++) {
    P.putByte(passBuf.at(l % p));
  }

  /* 4. Set I=S||P to be the concatenation of S and P. */
  var I = S;
  I.putBuffer(P);

  /* 5. Set c=ceil(n / u). */
  var c = Math.ceil(n / u);

  /* 6. For i=1, 2, ..., c, do the following: */
  for(var i = 1; i <= c; i++) {
    /* a) Set Ai=H^r(D||I). (l.e. the rth hash of D||I, H(H(H(...H(D||I)))) */
    var buf = new forge.util.ByteBuffer();
    buf.putBytes(D.bytes());
    buf.putBytes(I.bytes());
    for(var round = 0; round < iter; round++) {
      md.start();
      md.update(buf.getBytes());
      buf = md.digest();
    }

    /* b) Concatenate copies of Ai to create a string B of length v bytes (the
          final copy of Ai may be truncated to create B). */
    var B = new forge.util.ByteBuffer();
    for(l = 0; l < v; l++) {
      B.putByte(buf.at(l % u));
    }

    /* c) Treating I as a concatenation I0, I1, ..., Ik-1 of v-byte blocks,
          where k=ceil(s / v) + ceil(p / v), modify I by setting
          Ij=(Ij+B+1) mod 2v for each j.  */
    var k = Math.ceil(s / v) + Math.ceil(p / v);
    var Inew = new forge.util.ByteBuffer();
    for(j = 0; j < k; j++) {
      var chunk = new forge.util.ByteBuffer(I.getBytes(v));
      var x = 0x1ff;
      for(l = B.length() - 1; l >= 0; l--) {
        x = x >> 8;
        x += B.at(l) + chunk.at(l);
        chunk.setAt(l, x & 0xff);
      }
      Inew.putBuffer(chunk);
    }
    I = Inew;

    /* Add Ai to A. */
    result.putBuffer(buf);
  }

  result.truncate(result.length() - n);
  return result;
};

/**
 * Get new Forge cipher object instance.
 *
 * @param oid the OID (in string notation).
 * @param params the ASN.1 params object.
 * @param password the password to decrypt with.
 *
 * @return new cipher object instance.
 */
pki.pbe.getCipher = function(oid, params, password) {
  switch(oid) {
  case pki.oids['pkcs5PBES2']:
    return pki.pbe.getCipherForPBES2(oid, params, password);

  case pki.oids['pbeWithSHAAnd3-KeyTripleDES-CBC']:
  case pki.oids['pbewithSHAAnd40BitRC2-CBC']:
    return pki.pbe.getCipherForPKCS12PBE(oid, params, password);

  default:
    var error = new Error('Cannot read encrypted PBE data block. Unsupported OID.');
    error.oid = oid;
    error.supportedOids = [
      'pkcs5PBES2',
      'pbeWithSHAAnd3-KeyTripleDES-CBC',
      'pbewithSHAAnd40BitRC2-CBC'
    ];
    throw error;
  }
};

/**
 * Get new Forge cipher object instance according to PBES2 params block.
 *
 * The returned cipher instance is already started using the IV
 * from PBES2 parameter block.
 *
 * @param oid the PKCS#5 PBKDF2 OID (in string notation).
 * @param params the ASN.1 PBES2-params object.
 * @param password the password to decrypt with.
 *
 * @return new cipher object instance.
 */
pki.pbe.getCipherForPBES2 = function(oid, params, password) {
  // get PBE params
  var capture = {};
  var errors = [];
  if(!asn1.validate(params, PBES2AlgorithmsValidator, capture, errors)) {
    var error = new Error('Cannot read password-based-encryption algorithm ' +
      'parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo.');
    error.errors = errors;
    throw error;
  }

  // check oids
  oid = asn1.derToOid(capture.kdfOid);
  if(oid !== pki.oids['pkcs5PBKDF2']) {
    var error = new Error('Cannot read encrypted private key. ' +
      'Unsupported key derivation function OID.');
    error.oid = oid;
    error.supportedOids = ['pkcs5PBKDF2'];
    throw error;
  }
  oid = asn1.derToOid(capture.encOid);
  if(oid !== pki.oids['aes128-CBC'] &&
    oid !== pki.oids['aes192-CBC'] &&
    oid !== pki.oids['aes256-CBC'] &&
    oid !== pki.oids['des-EDE3-CBC'] &&
    oid !== pki.oids['desCBC']) {
    var error = new Error('Cannot read encrypted private key. ' +
      'Unsupported encryption scheme OID.');
    error.oid = oid;
    error.supportedOids = [
      'aes128-CBC', 'aes192-CBC', 'aes256-CBC', 'des-EDE3-CBC', 'desCBC'];
    throw error;
  }

  // set PBE params
  var salt = capture.kdfSalt;
  var count = forge.util.createBuffer(capture.kdfIterationCount);
  count = count.getInt(count.length() << 3);
  var dkLen;
  var cipherFn;
  switch(pki.oids[oid]) {
  case 'aes128-CBC':
    dkLen = 16;
    cipherFn = forge.aes.createDecryptionCipher;
    break;
  case 'aes192-CBC':
    dkLen = 24;
    cipherFn = forge.aes.createDecryptionCipher;
    break;
  case 'aes256-CBC':
    dkLen = 32;
    cipherFn = forge.aes.createDecryptionCipher;
    break;
  case 'des-EDE3-CBC':
    dkLen = 24;
    cipherFn = forge.des.createDecryptionCipher;
    break;
  case 'desCBC':
    dkLen = 8;
    cipherFn = forge.des.createDecryptionCipher;
    break;
  }

  // get PRF message digest
  var md = prfOidToMessageDigest(capture.prfOid);

  // decrypt private key using pbe with chosen PRF and AES/DES
  var dk = forge.pkcs5.pbkdf2(password, salt, count, dkLen, md);
  var iv = capture.encIv;
  var cipher = cipherFn(dk);
  cipher.start(iv);

  return cipher;
};

/**
 * Get new Forge cipher object instance for PKCS#12 PBE.
 *
 * The returned cipher instance is already started using the key & IV
 * derived from the provided password and PKCS#12 PBE salt.
 *
 * @param oid The PKCS#12 PBE OID (in string notation).
 * @param params The ASN.1 PKCS#12 PBE-params object.
 * @param password The password to decrypt with.
 *
 * @return the new cipher object instance.
 */
pki.pbe.getCipherForPKCS12PBE = function(oid, params, password) {
  // get PBE params
  var capture = {};
  var errors = [];
  if(!asn1.validate(params, pkcs12PbeParamsValidator, capture, errors)) {
    var error = new Error('Cannot read password-based-encryption algorithm ' +
      'parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo.');
    error.errors = errors;
    throw error;
  }

  var salt = forge.util.createBuffer(capture.salt);
  var count = forge.util.createBuffer(capture.iterations);
  count = count.getInt(count.length() << 3);

  var dkLen, dIvLen, cipherFn;
  switch(oid) {
    case pki.oids['pbeWithSHAAnd3-KeyTripleDES-CBC']:
      dkLen = 24;
      dIvLen = 8;
      cipherFn = forge.des.startDecrypting;
      break;

    case pki.oids['pbewithSHAAnd40BitRC2-CBC']:
      dkLen = 5;
      dIvLen = 8;
      cipherFn = function(key, iv) {
        var cipher = forge.rc2.createDecryptionCipher(key, 40);
        cipher.start(iv, null);
        return cipher;
      };
      break;

    default:
      var error = new Error('Cannot read PKCS #12 PBE data block. Unsupported OID.');
      error.oid = oid;
      throw error;
  }

  // get PRF message digest
  var md = prfOidToMessageDigest(capture.prfOid);
  var key = pki.pbe.generatePkcs12Key(password, salt, 1, count, dkLen, md);
  md.start();
  var iv = pki.pbe.generatePkcs12Key(password, salt, 2, count, dIvLen, md);

  return cipherFn(key, iv);
};

/**
 * OpenSSL's legacy key derivation function.
 *
 * See: http://www.openssl.org/docs/crypto/EVP_BytesToKey.html
 *
 * @param password the password to derive the key from.
 * @param salt the salt to use, null for none.
 * @param dkLen the number of bytes needed for the derived key.
 * @param [options] the options to use:
 *          [md] an optional message digest object to use.
 */
pki.pbe.opensslDeriveBytes = function(password, salt, dkLen, md) {
  if(typeof md === 'undefined' || md === null) {
    if(!('md5' in forge.md)) {
      throw new Error('"md5" hash algorithm unavailable.');
    }
    md = forge.md.md5.create();
  }
  if(salt === null) {
    salt = '';
  }
  var digests = [hash(md, password + salt)];
  for(var length = 16, i = 1; length < dkLen; ++i, length += 16) {
    digests.push(hash(md, digests[i - 1] + password + salt));
  }
  return digests.join('').substr(0, dkLen);
};

function hash(md, bytes) {
  return md.start().update(bytes).digest().getBytes();
}

function prfOidToMessageDigest(prfOid) {
  // get PRF algorithm, default to SHA-1
  var prfAlgorithm;
  if(!prfOid) {
    prfAlgorithm = 'hmacWithSHA1';
  } else {
    prfAlgorithm = pki.oids[asn1.derToOid(prfOid)];
    if(!prfAlgorithm) {
      var error = new Error('Unsupported PRF OID.');
      error.oid = prfOid;
      error.supported = [
        'hmacWithSHA1', 'hmacWithSHA224', 'hmacWithSHA256', 'hmacWithSHA384',
        'hmacWithSHA512'];
      throw error;
    }
  }
  return prfAlgorithmToMessageDigest(prfAlgorithm);
}

function prfAlgorithmToMessageDigest(prfAlgorithm) {
  var factory = forge.md;
  switch(prfAlgorithm) {
  case 'hmacWithSHA224':
    factory = forge.md.sha512;
  case 'hmacWithSHA1':
  case 'hmacWithSHA256':
  case 'hmacWithSHA384':
  case 'hmacWithSHA512':
    prfAlgorithm = prfAlgorithm.substr(8).toLowerCase();
    break;
  default:
    var error = new Error('Unsupported PRF algorithm.');
    error.algorithm = prfAlgorithm;
    error.supported = [
      'hmacWithSHA1', 'hmacWithSHA224', 'hmacWithSHA256', 'hmacWithSHA384',
      'hmacWithSHA512'];
    throw error;
  }
  if(!factory || !(prfAlgorithm in factory)) {
    throw new Error('Unknown hash algorithm: ' + prfAlgorithm);
  }
  return factory[prfAlgorithm].create();
}

function createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm) {
  var params = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // salt
    asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, salt),
    // iteration count
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      countBytes.getBytes())
  ]);
  // when PRF algorithm is not SHA-1 default, add key length and PRF algorithm
  if(prfAlgorithm !== 'hmacWithSHA1') {
    params.value.push(
      // key length
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
        forge.util.hexToBytes(dkLen.toString(16))),
      // AlgorithmIdentifier
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // algorithm
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
          asn1.oidToDer(pki.oids[prfAlgorithm]).getBytes()),
        // parameters (null)
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')
      ]));
  }
  return params;
}

},{"./aes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/aes.js","./asn1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/asn1.js","./des":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/des.js","./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./md":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/md.js","./oids":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/oids.js","./pbkdf2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pbkdf2.js","./pem":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pem.js","./random":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/random.js","./rc2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/rc2.js","./rsa":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/rsa.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pbkdf2.js":[function(require,module,exports){
(function (Buffer){(function (){
/**
 * Password-Based Key-Derivation Function #2 implementation.
 *
 * See RFC 2898 for details.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2013 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./hmac');
require('./md');
require('./util');

var pkcs5 = forge.pkcs5 = forge.pkcs5 || {};

var crypto;
if(forge.util.isNodejs && !forge.options.usePureJavaScript) {
  crypto = require('crypto');
}

/**
 * Derives a key from a password.
 *
 * @param p the password as a binary-encoded string of bytes.
 * @param s the salt as a binary-encoded string of bytes.
 * @param c the iteration count, a positive integer.
 * @param dkLen the intended length, in bytes, of the derived key,
 *          (max: 2^32 - 1) * hash length of the PRF.
 * @param [md] the message digest (or algorithm identifier as a string) to use
 *          in the PRF, defaults to SHA-1.
 * @param [callback(err, key)] presence triggers asynchronous version, called
 *          once the operation completes.
 *
 * @return the derived key, as a binary-encoded string of bytes, for the
 *           synchronous version (if no callback is specified).
 */
module.exports = forge.pbkdf2 = pkcs5.pbkdf2 = function(
  p, s, c, dkLen, md, callback) {
  if(typeof md === 'function') {
    callback = md;
    md = null;
  }

  // use native implementation if possible and not disabled, note that
  // some node versions only support SHA-1, others allow digest to be changed
  if(forge.util.isNodejs && !forge.options.usePureJavaScript &&
    crypto.pbkdf2 && (md === null || typeof md !== 'object') &&
    (crypto.pbkdf2Sync.length > 4 || (!md || md === 'sha1'))) {
    if(typeof md !== 'string') {
      // default prf to SHA-1
      md = 'sha1';
    }
    p = Buffer.from(p, 'binary');
    s = Buffer.from(s, 'binary');
    if(!callback) {
      if(crypto.pbkdf2Sync.length === 4) {
        return crypto.pbkdf2Sync(p, s, c, dkLen).toString('binary');
      }
      return crypto.pbkdf2Sync(p, s, c, dkLen, md).toString('binary');
    }
    if(crypto.pbkdf2Sync.length === 4) {
      return crypto.pbkdf2(p, s, c, dkLen, function(err, key) {
        if(err) {
          return callback(err);
        }
        callback(null, key.toString('binary'));
      });
    }
    return crypto.pbkdf2(p, s, c, dkLen, md, function(err, key) {
      if(err) {
        return callback(err);
      }
      callback(null, key.toString('binary'));
    });
  }

  if(typeof md === 'undefined' || md === null) {
    // default prf to SHA-1
    md = 'sha1';
  }
  if(typeof md === 'string') {
    if(!(md in forge.md.algorithms)) {
      throw new Error('Unknown hash algorithm: ' + md);
    }
    md = forge.md[md].create();
  }

  var hLen = md.digestLength;

  /* 1. If dkLen > (2^32 - 1) * hLen, output "derived key too long" and
    stop. */
  if(dkLen > (0xFFFFFFFF * hLen)) {
    var err = new Error('Derived key is too long.');
    if(callback) {
      return callback(err);
    }
    throw err;
  }

  /* 2. Let len be the number of hLen-octet blocks in the derived key,
    rounding up, and let r be the number of octets in the last
    block:

    len = CEIL(dkLen / hLen),
    r = dkLen - (len - 1) * hLen. */
  var len = Math.ceil(dkLen / hLen);
  var r = dkLen - (len - 1) * hLen;

  /* 3. For each block of the derived key apply the function F defined
    below to the password P, the salt S, the iteration count c, and
    the block index to compute the block:

    T_1 = F(P, S, c, 1),
    T_2 = F(P, S, c, 2),
    ...
    T_len = F(P, S, c, len),

    where the function F is defined as the exclusive-or sum of the
    first c iterates of the underlying pseudorandom function PRF
    applied to the password P and the concatenation of the salt S
    and the block index i:

    F(P, S, c, i) = u_1 XOR u_2 XOR ... XOR u_c

    where

    u_1 = PRF(P, S || INT(i)),
    u_2 = PRF(P, u_1),
    ...
    u_c = PRF(P, u_{c-1}).

    Here, INT(i) is a four-octet encoding of the integer i, most
    significant octet first. */
  var prf = forge.hmac.create();
  prf.start(md, p);
  var dk = '';
  var xor, u_c, u_c1;

  // sync version
  if(!callback) {
    for(var i = 1; i <= len; ++i) {
      // PRF(P, S || INT(i)) (first iteration)
      prf.start(null, null);
      prf.update(s);
      prf.update(forge.util.int32ToBytes(i));
      xor = u_c1 = prf.digest().getBytes();

      // PRF(P, u_{c-1}) (other iterations)
      for(var j = 2; j <= c; ++j) {
        prf.start(null, null);
        prf.update(u_c1);
        u_c = prf.digest().getBytes();
        // F(p, s, c, i)
        xor = forge.util.xorBytes(xor, u_c, hLen);
        u_c1 = u_c;
      }

      /* 4. Concatenate the blocks and extract the first dkLen octets to
        produce a derived key DK:

        DK = T_1 || T_2 ||  ...  || T_len<0..r-1> */
      dk += (i < len) ? xor : xor.substr(0, r);
    }
    /* 5. Output the derived key DK. */
    return dk;
  }

  // async version
  var i = 1, j;
  function outer() {
    if(i > len) {
      // done
      return callback(null, dk);
    }

    // PRF(P, S || INT(i)) (first iteration)
    prf.start(null, null);
    prf.update(s);
    prf.update(forge.util.int32ToBytes(i));
    xor = u_c1 = prf.digest().getBytes();

    // PRF(P, u_{c-1}) (other iterations)
    j = 2;
    inner();
  }

  function inner() {
    if(j <= c) {
      prf.start(null, null);
      prf.update(u_c1);
      u_c = prf.digest().getBytes();
      // F(p, s, c, i)
      xor = forge.util.xorBytes(xor, u_c, hLen);
      u_c1 = u_c;
      ++j;
      return forge.util.setImmediate(inner);
    }

    /* 4. Concatenate the blocks and extract the first dkLen octets to
      produce a derived key DK:

      DK = T_1 || T_2 ||  ...  || T_len<0..r-1> */
    dk += (i < len) ? xor : xor.substr(0, r);

    ++i;
    outer();
  }

  outer();
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./hmac":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/hmac.js","./md":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/md.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browser-resolve/empty.js","crypto":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browser-resolve/empty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pem.js":[function(require,module,exports){
/**
 * Javascript implementation of basic PEM (Privacy Enhanced Mail) algorithms.
 *
 * See: RFC 1421.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2013-2014 Digital Bazaar, Inc.
 *
 * A Forge PEM object has the following fields:
 *
 * type: identifies the type of message (eg: "RSA PRIVATE KEY").
 *
 * procType: identifies the type of processing performed on the message,
 *   it has two subfields: version and type, eg: 4,ENCRYPTED.
 *
 * contentDomain: identifies the type of content in the message, typically
 *   only uses the value: "RFC822".
 *
 * dekInfo: identifies the message encryption algorithm and mode and includes
 *   any parameters for the algorithm, it has two subfields: algorithm and
 *   parameters, eg: DES-CBC,F8143EDE5960C597.
 *
 * headers: contains all other PEM encapsulated headers -- where order is
 *   significant (for pairing data like recipient ID + key info).
 *
 * body: the binary-encoded body.
 */
var forge = require('./forge');
require('./util');

// shortcut for pem API
var pem = module.exports = forge.pem = forge.pem || {};

/**
 * Encodes (serializes) the given PEM object.
 *
 * @param msg the PEM message object to encode.
 * @param options the options to use:
 *          maxline the maximum characters per line for the body, (default: 64).
 *
 * @return the PEM-formatted string.
 */
pem.encode = function(msg, options) {
  options = options || {};
  var rval = '-----BEGIN ' + msg.type + '-----\r\n';

  // encode special headers
  var header;
  if(msg.procType) {
    header = {
      name: 'Proc-Type',
      values: [String(msg.procType.version), msg.procType.type]
    };
    rval += foldHeader(header);
  }
  if(msg.contentDomain) {
    header = {name: 'Content-Domain', values: [msg.contentDomain]};
    rval += foldHeader(header);
  }
  if(msg.dekInfo) {
    header = {name: 'DEK-Info', values: [msg.dekInfo.algorithm]};
    if(msg.dekInfo.parameters) {
      header.values.push(msg.dekInfo.parameters);
    }
    rval += foldHeader(header);
  }

  if(msg.headers) {
    // encode all other headers
    for(var i = 0; i < msg.headers.length; ++i) {
      rval += foldHeader(msg.headers[i]);
    }
  }

  // terminate header
  if(msg.procType) {
    rval += '\r\n';
  }

  // add body
  rval += forge.util.encode64(msg.body, options.maxline || 64) + '\r\n';

  rval += '-----END ' + msg.type + '-----\r\n';
  return rval;
};

/**
 * Decodes (deserializes) all PEM messages found in the given string.
 *
 * @param str the PEM-formatted string to decode.
 *
 * @return the PEM message objects in an array.
 */
pem.decode = function(str) {
  var rval = [];

  // split string into PEM messages (be lenient w/EOF on BEGIN line)
  var rMessage = /\s*-----BEGIN ([A-Z0-9- ]+)-----\r?\n?([\x21-\x7e\s]+?(?:\r?\n\r?\n))?([:A-Za-z0-9+\/=\s]+?)-----END \1-----/g;
  var rHeader = /([\x21-\x7e]+):\s*([\x21-\x7e\s^:]+)/;
  var rCRLF = /\r?\n/;
  var match;
  while(true) {
    match = rMessage.exec(str);
    if(!match) {
      break;
    }

    var msg = {
      type: match[1],
      procType: null,
      contentDomain: null,
      dekInfo: null,
      headers: [],
      body: forge.util.decode64(match[3])
    };
    rval.push(msg);

    // no headers
    if(!match[2]) {
      continue;
    }

    // parse headers
    var lines = match[2].split(rCRLF);
    var li = 0;
    while(match && li < lines.length) {
      // get line, trim any rhs whitespace
      var line = lines[li].replace(/\s+$/, '');

      // RFC2822 unfold any following folded lines
      for(var nl = li + 1; nl < lines.length; ++nl) {
        var next = lines[nl];
        if(!/\s/.test(next[0])) {
          break;
        }
        line += next;
        li = nl;
      }

      // parse header
      match = line.match(rHeader);
      if(match) {
        var header = {name: match[1], values: []};
        var values = match[2].split(',');
        for(var vi = 0; vi < values.length; ++vi) {
          header.values.push(ltrim(values[vi]));
        }

        // Proc-Type must be the first header
        if(!msg.procType) {
          if(header.name !== 'Proc-Type') {
            throw new Error('Invalid PEM formatted message. The first ' +
              'encapsulated header must be "Proc-Type".');
          } else if(header.values.length !== 2) {
            throw new Error('Invalid PEM formatted message. The "Proc-Type" ' +
              'header must have two subfields.');
          }
          msg.procType = {version: values[0], type: values[1]};
        } else if(!msg.contentDomain && header.name === 'Content-Domain') {
          // special-case Content-Domain
          msg.contentDomain = values[0] || '';
        } else if(!msg.dekInfo && header.name === 'DEK-Info') {
          // special-case DEK-Info
          if(header.values.length === 0) {
            throw new Error('Invalid PEM formatted message. The "DEK-Info" ' +
              'header must have at least one subfield.');
          }
          msg.dekInfo = {algorithm: values[0], parameters: values[1] || null};
        } else {
          msg.headers.push(header);
        }
      }

      ++li;
    }

    if(msg.procType === 'ENCRYPTED' && !msg.dekInfo) {
      throw new Error('Invalid PEM formatted message. The "DEK-Info" ' +
        'header must be present if "Proc-Type" is "ENCRYPTED".');
    }
  }

  if(rval.length === 0) {
    throw new Error('Invalid PEM formatted message.');
  }

  return rval;
};

function foldHeader(header) {
  var rval = header.name + ': ';

  // ensure values with CRLF are folded
  var values = [];
  var insertSpace = function(match, $1) {
    return ' ' + $1;
  };
  for(var i = 0; i < header.values.length; ++i) {
    values.push(header.values[i].replace(/^(\S+\r\n)/, insertSpace));
  }
  rval += values.join(',') + '\r\n';

  // do folding
  var length = 0;
  var candidate = -1;
  for(var i = 0; i < rval.length; ++i, ++length) {
    if(length > 65 && candidate !== -1) {
      var insert = rval[candidate];
      if(insert === ',') {
        ++candidate;
        rval = rval.substr(0, candidate) + '\r\n ' + rval.substr(candidate);
      } else {
        rval = rval.substr(0, candidate) +
          '\r\n' + insert + rval.substr(candidate + 1);
      }
      length = (i - candidate - 1);
      candidate = -1;
      ++i;
    } else if(rval[i] === ' ' || rval[i] === '\t' || rval[i] === ',') {
      candidate = i;
    }
  }

  return rval;
}

function ltrim(str) {
  return str.replace(/^\s+/, '');
}

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pkcs1.js":[function(require,module,exports){
/**
 * Partial implementation of PKCS#1 v2.2: RSA-OEAP
 *
 * Modified but based on the following MIT and BSD licensed code:
 *
 * https://github.com/kjur/jsjws/blob/master/rsa.js:
 *
 * The 'jsjws'(JSON Web Signature JavaScript Library) License
 *
 * Copyright (c) 2012 Kenji Urushima
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 * http://webrsa.cvs.sourceforge.net/viewvc/webrsa/Client/RSAES-OAEP.js?content-type=text%2Fplain:
 *
 * RSAES-OAEP.js
 * $Id: RSAES-OAEP.js,v 1.1.1.1 2003/03/19 15:37:20 ellispritchard Exp $
 * JavaScript Implementation of PKCS #1 v2.1 RSA CRYPTOGRAPHY STANDARD (RSA Laboratories, June 14, 2002)
 * Copyright (C) Ellis Pritchard, Guardian Unlimited 2003.
 * Contact: ellis@nukinetics.com
 * Distributed under the BSD License.
 *
 * Official documentation: http://www.rsa.com/rsalabs/node.asp?id=2125
 *
 * @author Evan Jones (http://evanjones.ca/)
 * @author Dave Longley
 *
 * Copyright (c) 2013-2014 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./util');
require('./random');
require('./sha1');

// shortcut for PKCS#1 API
var pkcs1 = module.exports = forge.pkcs1 = forge.pkcs1 || {};

/**
 * Encode the given RSAES-OAEP message (M) using key, with optional label (L)
 * and seed.
 *
 * This method does not perform RSA encryption, it only encodes the message
 * using RSAES-OAEP.
 *
 * @param key the RSA key to use.
 * @param message the message to encode.
 * @param options the options to use:
 *          label an optional label to use.
 *          seed the seed to use.
 *          md the message digest object to use, undefined for SHA-1.
 *          mgf1 optional mgf1 parameters:
 *            md the message digest object to use for MGF1.
 *
 * @return the encoded message bytes.
 */
pkcs1.encode_rsa_oaep = function(key, message, options) {
  // parse arguments
  var label;
  var seed;
  var md;
  var mgf1Md;
  // legacy args (label, seed, md)
  if(typeof options === 'string') {
    label = options;
    seed = arguments[3] || undefined;
    md = arguments[4] || undefined;
  } else if(options) {
    label = options.label || undefined;
    seed = options.seed || undefined;
    md = options.md || undefined;
    if(options.mgf1 && options.mgf1.md) {
      mgf1Md = options.mgf1.md;
    }
  }

  // default OAEP to SHA-1 message digest
  if(!md) {
    md = forge.md.sha1.create();
  } else {
    md.start();
  }

  // default MGF-1 to same as OAEP
  if(!mgf1Md) {
    mgf1Md = md;
  }

  // compute length in bytes and check output
  var keyLength = Math.ceil(key.n.bitLength() / 8);
  var maxLength = keyLength - 2 * md.digestLength - 2;
  if(message.length > maxLength) {
    var error = new Error('RSAES-OAEP input message length is too long.');
    error.length = message.length;
    error.maxLength = maxLength;
    throw error;
  }

  if(!label) {
    label = '';
  }
  md.update(label, 'raw');
  var lHash = md.digest();

  var PS = '';
  var PS_length = maxLength - message.length;
  for(var i = 0; i < PS_length; i++) {
    PS += '\x00';
  }

  var DB = lHash.getBytes() + PS + '\x01' + message;

  if(!seed) {
    seed = forge.random.getBytes(md.digestLength);
  } else if(seed.length !== md.digestLength) {
    var error = new Error('Invalid RSAES-OAEP seed. The seed length must ' +
      'match the digest length.');
    error.seedLength = seed.length;
    error.digestLength = md.digestLength;
    throw error;
  }

  var dbMask = rsa_mgf1(seed, keyLength - md.digestLength - 1, mgf1Md);
  var maskedDB = forge.util.xorBytes(DB, dbMask, DB.length);

  var seedMask = rsa_mgf1(maskedDB, md.digestLength, mgf1Md);
  var maskedSeed = forge.util.xorBytes(seed, seedMask, seed.length);

  // return encoded message
  return '\x00' + maskedSeed + maskedDB;
};

/**
 * Decode the given RSAES-OAEP encoded message (EM) using key, with optional
 * label (L).
 *
 * This method does not perform RSA decryption, it only decodes the message
 * using RSAES-OAEP.
 *
 * @param key the RSA key to use.
 * @param em the encoded message to decode.
 * @param options the options to use:
 *          label an optional label to use.
 *          md the message digest object to use for OAEP, undefined for SHA-1.
 *          mgf1 optional mgf1 parameters:
 *            md the message digest object to use for MGF1.
 *
 * @return the decoded message bytes.
 */
pkcs1.decode_rsa_oaep = function(key, em, options) {
  // parse args
  var label;
  var md;
  var mgf1Md;
  // legacy args
  if(typeof options === 'string') {
    label = options;
    md = arguments[3] || undefined;
  } else if(options) {
    label = options.label || undefined;
    md = options.md || undefined;
    if(options.mgf1 && options.mgf1.md) {
      mgf1Md = options.mgf1.md;
    }
  }

  // compute length in bytes
  var keyLength = Math.ceil(key.n.bitLength() / 8);

  if(em.length !== keyLength) {
    var error = new Error('RSAES-OAEP encoded message length is invalid.');
    error.length = em.length;
    error.expectedLength = keyLength;
    throw error;
  }

  // default OAEP to SHA-1 message digest
  if(md === undefined) {
    md = forge.md.sha1.create();
  } else {
    md.start();
  }

  // default MGF-1 to same as OAEP
  if(!mgf1Md) {
    mgf1Md = md;
  }

  if(keyLength < 2 * md.digestLength + 2) {
    throw new Error('RSAES-OAEP key is too short for the hash function.');
  }

  if(!label) {
    label = '';
  }
  md.update(label, 'raw');
  var lHash = md.digest().getBytes();

  // split the message into its parts
  var y = em.charAt(0);
  var maskedSeed = em.substring(1, md.digestLength + 1);
  var maskedDB = em.substring(1 + md.digestLength);

  var seedMask = rsa_mgf1(maskedDB, md.digestLength, mgf1Md);
  var seed = forge.util.xorBytes(maskedSeed, seedMask, maskedSeed.length);

  var dbMask = rsa_mgf1(seed, keyLength - md.digestLength - 1, mgf1Md);
  var db = forge.util.xorBytes(maskedDB, dbMask, maskedDB.length);

  var lHashPrime = db.substring(0, md.digestLength);

  // constant time check that all values match what is expected
  var error = (y !== '\x00');

  // constant time check lHash vs lHashPrime
  for(var i = 0; i < md.digestLength; ++i) {
    error |= (lHash.charAt(i) !== lHashPrime.charAt(i));
  }

  // "constant time" find the 0x1 byte separating the padding (zeros) from the
  // message
  // TODO: It must be possible to do this in a better/smarter way?
  var in_ps = 1;
  var index = md.digestLength;
  for(var j = md.digestLength; j < db.length; j++) {
    var code = db.charCodeAt(j);

    var is_0 = (code & 0x1) ^ 0x1;

    // non-zero if not 0 or 1 in the ps section
    var error_mask = in_ps ? 0xfffe : 0x0000;
    error |= (code & error_mask);

    // latch in_ps to zero after we find 0x1
    in_ps = in_ps & is_0;
    index += in_ps;
  }

  if(error || db.charCodeAt(index) !== 0x1) {
    throw new Error('Invalid RSAES-OAEP padding.');
  }

  return db.substring(index + 1);
};

function rsa_mgf1(seed, maskLength, hash) {
  // default to SHA-1 message digest
  if(!hash) {
    hash = forge.md.sha1.create();
  }
  var t = '';
  var count = Math.ceil(maskLength / hash.digestLength);
  for(var i = 0; i < count; ++i) {
    var c = String.fromCharCode(
      (i >> 24) & 0xFF, (i >> 16) & 0xFF, (i >> 8) & 0xFF, i & 0xFF);
    hash.start();
    hash.update(seed + c);
    t += hash.digest().getBytes();
  }
  return t.substring(0, maskLength);
}

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./random":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/random.js","./sha1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/sha1.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pkcs12.js":[function(require,module,exports){
/**
 * Javascript implementation of PKCS#12.
 *
 * @author Dave Longley
 * @author Stefan Siegl <stesie@brokenpipe.de>
 *
 * Copyright (c) 2010-2014 Digital Bazaar, Inc.
 * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>
 *
 * The ASN.1 representation of PKCS#12 is as follows
 * (see ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12-tc1.pdf for details)
 *
 * PFX ::= SEQUENCE {
 *   version  INTEGER {v3(3)}(v3,...),
 *   authSafe ContentInfo,
 *   macData  MacData OPTIONAL
 * }
 *
 * MacData ::= SEQUENCE {
 *   mac DigestInfo,
 *   macSalt OCTET STRING,
 *   iterations INTEGER DEFAULT 1
 * }
 * Note: The iterations default is for historical reasons and its use is
 * deprecated. A higher value, like 1024, is recommended.
 *
 * DigestInfo is defined in PKCS#7 as follows:
 *
 * DigestInfo ::= SEQUENCE {
 *   digestAlgorithm DigestAlgorithmIdentifier,
 *   digest Digest
 * }
 *
 * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
 *
 * The AlgorithmIdentifier contains an Object Identifier (OID) and parameters
 * for the algorithm, if any. In the case of SHA1 there is none.
 *
 * AlgorithmIdentifer ::= SEQUENCE {
 *    algorithm OBJECT IDENTIFIER,
 *    parameters ANY DEFINED BY algorithm OPTIONAL
 * }
 *
 * Digest ::= OCTET STRING
 *
 *
 * ContentInfo ::= SEQUENCE {
 *   contentType ContentType,
 *   content     [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL
 * }
 *
 * ContentType ::= OBJECT IDENTIFIER
 *
 * AuthenticatedSafe ::= SEQUENCE OF ContentInfo
 * -- Data if unencrypted
 * -- EncryptedData if password-encrypted
 * -- EnvelopedData if public key-encrypted
 *
 *
 * SafeContents ::= SEQUENCE OF SafeBag
 *
 * SafeBag ::= SEQUENCE {
 *   bagId     BAG-TYPE.&id ({PKCS12BagSet})
 *   bagValue  [0] EXPLICIT BAG-TYPE.&Type({PKCS12BagSet}{@bagId}),
 *   bagAttributes SET OF PKCS12Attribute OPTIONAL
 * }
 *
 * PKCS12Attribute ::= SEQUENCE {
 *   attrId ATTRIBUTE.&id ({PKCS12AttrSet}),
 *   attrValues SET OF ATTRIBUTE.&Type ({PKCS12AttrSet}{@attrId})
 * } -- This type is compatible with the X.500 type 'Attribute'
 *
 * PKCS12AttrSet ATTRIBUTE ::= {
 *   friendlyName | -- from PKCS #9
 *   localKeyId, -- from PKCS #9
 *   ... -- Other attributes are allowed
 * }
 *
 * CertBag ::= SEQUENCE {
 *   certId    BAG-TYPE.&id   ({CertTypes}),
 *   certValue [0] EXPLICIT BAG-TYPE.&Type ({CertTypes}{@certId})
 * }
 *
 * x509Certificate BAG-TYPE ::= {OCTET STRING IDENTIFIED BY {certTypes 1}}
 *   -- DER-encoded X.509 certificate stored in OCTET STRING
 *
 * sdsiCertificate BAG-TYPE ::= {IA5String IDENTIFIED BY {certTypes 2}}
 * -- Base64-encoded SDSI certificate stored in IA5String
 *
 * CertTypes BAG-TYPE ::= {
 *   x509Certificate |
 *   sdsiCertificate,
 *   ... -- For future extensions
 * }
 */
var forge = require('./forge');
require('./asn1');
require('./hmac');
require('./oids');
require('./pkcs7asn1');
require('./pbe');
require('./random');
require('./rsa');
require('./sha1');
require('./util');
require('./x509');

// shortcut for asn.1 & PKI API
var asn1 = forge.asn1;
var pki = forge.pki;

// shortcut for PKCS#12 API
var p12 = module.exports = forge.pkcs12 = forge.pkcs12 || {};

var contentInfoValidator = {
  name: 'ContentInfo',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,  // a ContentInfo
  constructed: true,
  value: [{
    name: 'ContentInfo.contentType',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.OID,
    constructed: false,
    capture: 'contentType'
  }, {
    name: 'ContentInfo.content',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    constructed: true,
    captureAsn1: 'content'
  }]
};

var pfxValidator = {
  name: 'PFX',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'PFX.version',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'version'
  },
  contentInfoValidator, {
    name: 'PFX.macData',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    optional: true,
    captureAsn1: 'mac',
    value: [{
      name: 'PFX.macData.mac',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,  // DigestInfo
      constructed: true,
      value: [{
        name: 'PFX.macData.mac.digestAlgorithm',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.SEQUENCE,  // DigestAlgorithmIdentifier
        constructed: true,
        value: [{
          name: 'PFX.macData.mac.digestAlgorithm.algorithm',
          tagClass: asn1.Class.UNIVERSAL,
          type: asn1.Type.OID,
          constructed: false,
          capture: 'macAlgorithm'
        }, {
          name: 'PFX.macData.mac.digestAlgorithm.parameters',
          tagClass: asn1.Class.UNIVERSAL,
          captureAsn1: 'macAlgorithmParameters'
        }]
      }, {
        name: 'PFX.macData.mac.digest',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.OCTETSTRING,
        constructed: false,
        capture: 'macDigest'
      }]
    }, {
      name: 'PFX.macData.macSalt',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.OCTETSTRING,
      constructed: false,
      capture: 'macSalt'
    }, {
      name: 'PFX.macData.iterations',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.INTEGER,
      constructed: false,
      optional: true,
      capture: 'macIterations'
    }]
  }]
};

var safeBagValidator = {
  name: 'SafeBag',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'SafeBag.bagId',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.OID,
    constructed: false,
    capture: 'bagId'
  }, {
    name: 'SafeBag.bagValue',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    constructed: true,
    captureAsn1: 'bagValue'
  }, {
    name: 'SafeBag.bagAttributes',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SET,
    constructed: true,
    optional: true,
    capture: 'bagAttributes'
  }]
};

var attributeValidator = {
  name: 'Attribute',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'Attribute.attrId',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.OID,
    constructed: false,
    capture: 'oid'
  }, {
    name: 'Attribute.attrValues',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SET,
    constructed: true,
    capture: 'values'
  }]
};

var certBagValidator = {
  name: 'CertBag',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'CertBag.certId',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.OID,
    constructed: false,
    capture: 'certId'
  }, {
    name: 'CertBag.certValue',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    constructed: true,
    /* So far we only support X.509 certificates (which are wrapped in
       an OCTET STRING, hence hard code that here). */
    value: [{
      name: 'CertBag.certValue[0]',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Class.OCTETSTRING,
      constructed: false,
      capture: 'cert'
    }]
  }]
};

/**
 * Search SafeContents structure for bags with matching attributes.
 *
 * The search can optionally be narrowed by a certain bag type.
 *
 * @param safeContents the SafeContents structure to search in.
 * @param attrName the name of the attribute to compare against.
 * @param attrValue the attribute value to search for.
 * @param [bagType] bag type to narrow search by.
 *
 * @return an array of matching bags.
 */
function _getBagsByAttribute(safeContents, attrName, attrValue, bagType) {
  var result = [];

  for(var i = 0; i < safeContents.length; i++) {
    for(var j = 0; j < safeContents[i].safeBags.length; j++) {
      var bag = safeContents[i].safeBags[j];
      if(bagType !== undefined && bag.type !== bagType) {
        continue;
      }
      // only filter by bag type, no attribute specified
      if(attrName === null) {
        result.push(bag);
        continue;
      }
      if(bag.attributes[attrName] !== undefined &&
        bag.attributes[attrName].indexOf(attrValue) >= 0) {
        result.push(bag);
      }
    }
  }

  return result;
}

/**
 * Converts a PKCS#12 PFX in ASN.1 notation into a PFX object.
 *
 * @param obj The PKCS#12 PFX in ASN.1 notation.
 * @param strict true to use strict DER decoding, false not to (default: true).
 * @param {String} password Password to decrypt with (optional).
 *
 * @return PKCS#12 PFX object.
 */
p12.pkcs12FromAsn1 = function(obj, strict, password) {
  // handle args
  if(typeof strict === 'string') {
    password = strict;
    strict = true;
  } else if(strict === undefined) {
    strict = true;
  }

  // validate PFX and capture data
  var capture = {};
  var errors = [];
  if(!asn1.validate(obj, pfxValidator, capture, errors)) {
    var error = new Error('Cannot read PKCS#12 PFX. ' +
      'ASN.1 object is not an PKCS#12 PFX.');
    error.errors = error;
    throw error;
  }

  var pfx = {
    version: capture.version.charCodeAt(0),
    safeContents: [],

    /**
     * Gets bags with matching attributes.
     *
     * @param filter the attributes to filter by:
     *          [localKeyId] the localKeyId to search for.
     *          [localKeyIdHex] the localKeyId in hex to search for.
     *          [friendlyName] the friendly name to search for.
     *          [bagType] bag type to narrow each attribute search by.
     *
     * @return a map of attribute type to an array of matching bags or, if no
     *           attribute was given but a bag type, the map key will be the
     *           bag type.
     */
    getBags: function(filter) {
      var rval = {};

      var localKeyId;
      if('localKeyId' in filter) {
        localKeyId = filter.localKeyId;
      } else if('localKeyIdHex' in filter) {
        localKeyId = forge.util.hexToBytes(filter.localKeyIdHex);
      }

      // filter on bagType only
      if(localKeyId === undefined && !('friendlyName' in filter) &&
        'bagType' in filter) {
        rval[filter.bagType] = _getBagsByAttribute(
          pfx.safeContents, null, null, filter.bagType);
      }

      if(localKeyId !== undefined) {
        rval.localKeyId = _getBagsByAttribute(
          pfx.safeContents, 'localKeyId',
          localKeyId, filter.bagType);
      }
      if('friendlyName' in filter) {
        rval.friendlyName = _getBagsByAttribute(
          pfx.safeContents, 'friendlyName',
          filter.friendlyName, filter.bagType);
      }

      return rval;
    },

    /**
     * DEPRECATED: use getBags() instead.
     *
     * Get bags with matching friendlyName attribute.
     *
     * @param friendlyName the friendly name to search for.
     * @param [bagType] bag type to narrow search by.
     *
     * @return an array of bags with matching friendlyName attribute.
     */
    getBagsByFriendlyName: function(friendlyName, bagType) {
      return _getBagsByAttribute(
        pfx.safeContents, 'friendlyName', friendlyName, bagType);
    },

    /**
     * DEPRECATED: use getBags() instead.
     *
     * Get bags with matching localKeyId attribute.
     *
     * @param localKeyId the localKeyId to search for.
     * @param [bagType] bag type to narrow search by.
     *
     * @return an array of bags with matching localKeyId attribute.
     */
    getBagsByLocalKeyId: function(localKeyId, bagType) {
      return _getBagsByAttribute(
        pfx.safeContents, 'localKeyId', localKeyId, bagType);
    }
  };

  if(capture.version.charCodeAt(0) !== 3) {
    var error = new Error('PKCS#12 PFX of version other than 3 not supported.');
    error.version = capture.version.charCodeAt(0);
    throw error;
  }

  if(asn1.derToOid(capture.contentType) !== pki.oids.data) {
    var error = new Error('Only PKCS#12 PFX in password integrity mode supported.');
    error.oid = asn1.derToOid(capture.contentType);
    throw error;
  }

  var data = capture.content.value[0];
  if(data.tagClass !== asn1.Class.UNIVERSAL ||
     data.type !== asn1.Type.OCTETSTRING) {
    throw new Error('PKCS#12 authSafe content data is not an OCTET STRING.');
  }
  data = _decodePkcs7Data(data);

  // check for MAC
  if(capture.mac) {
    var md = null;
    var macKeyBytes = 0;
    var macAlgorithm = asn1.derToOid(capture.macAlgorithm);
    switch(macAlgorithm) {
    case pki.oids.sha1:
      md = forge.md.sha1.create();
      macKeyBytes = 20;
      break;
    case pki.oids.sha256:
      md = forge.md.sha256.create();
      macKeyBytes = 32;
      break;
    case pki.oids.sha384:
      md = forge.md.sha384.create();
      macKeyBytes = 48;
      break;
    case pki.oids.sha512:
      md = forge.md.sha512.create();
      macKeyBytes = 64;
      break;
    case pki.oids.md5:
      md = forge.md.md5.create();
      macKeyBytes = 16;
      break;
    }
    if(md === null) {
      throw new Error('PKCS#12 uses unsupported MAC algorithm: ' + macAlgorithm);
    }

    // verify MAC (iterations default to 1)
    var macSalt = new forge.util.ByteBuffer(capture.macSalt);
    var macIterations = (('macIterations' in capture) ?
      parseInt(forge.util.bytesToHex(capture.macIterations), 16) : 1);
    var macKey = p12.generateKey(
      password, macSalt, 3, macIterations, macKeyBytes, md);
    var mac = forge.hmac.create();
    mac.start(md, macKey);
    mac.update(data.value);
    var macValue = mac.getMac();
    if(macValue.getBytes() !== capture.macDigest) {
      throw new Error('PKCS#12 MAC could not be verified. Invalid password?');
    }
  }

  _decodeAuthenticatedSafe(pfx, data.value, strict, password);
  return pfx;
};

/**
 * Decodes PKCS#7 Data. PKCS#7 (RFC 2315) defines "Data" as an OCTET STRING,
 * but it is sometimes an OCTET STRING that is composed/constructed of chunks,
 * each its own OCTET STRING. This is BER-encoding vs. DER-encoding. This
 * function transforms this corner-case into the usual simple,
 * non-composed/constructed OCTET STRING.
 *
 * This function may be moved to ASN.1 at some point to better deal with
 * more BER-encoding issues, should they arise.
 *
 * @param data the ASN.1 Data object to transform.
 */
function _decodePkcs7Data(data) {
  // handle special case of "chunked" data content: an octet string composed
  // of other octet strings
  if(data.composed || data.constructed) {
    var value = forge.util.createBuffer();
    for(var i = 0; i < data.value.length; ++i) {
      value.putBytes(data.value[i].value);
    }
    data.composed = data.constructed = false;
    data.value = value.getBytes();
  }
  return data;
}

/**
 * Decode PKCS#12 AuthenticatedSafe (BER encoded) into PFX object.
 *
 * The AuthenticatedSafe is a BER-encoded SEQUENCE OF ContentInfo.
 *
 * @param pfx The PKCS#12 PFX object to fill.
 * @param {String} authSafe BER-encoded AuthenticatedSafe.
 * @param strict true to use strict DER decoding, false not to.
 * @param {String} password Password to decrypt with (optional).
 */
function _decodeAuthenticatedSafe(pfx, authSafe, strict, password) {
  authSafe = asn1.fromDer(authSafe, strict);  /* actually it's BER encoded */

  if(authSafe.tagClass !== asn1.Class.UNIVERSAL ||
     authSafe.type !== asn1.Type.SEQUENCE ||
     authSafe.constructed !== true) {
    throw new Error('PKCS#12 AuthenticatedSafe expected to be a ' +
      'SEQUENCE OF ContentInfo');
  }

  for(var i = 0; i < authSafe.value.length; i++) {
    var contentInfo = authSafe.value[i];

    // validate contentInfo and capture data
    var capture = {};
    var errors = [];
    if(!asn1.validate(contentInfo, contentInfoValidator, capture, errors)) {
      var error = new Error('Cannot read ContentInfo.');
      error.errors = errors;
      throw error;
    }

    var obj = {
      encrypted: false
    };
    var safeContents = null;
    var data = capture.content.value[0];
    switch(asn1.derToOid(capture.contentType)) {
    case pki.oids.data:
      if(data.tagClass !== asn1.Class.UNIVERSAL ||
         data.type !== asn1.Type.OCTETSTRING) {
        throw new Error('PKCS#12 SafeContents Data is not an OCTET STRING.');
      }
      safeContents = _decodePkcs7Data(data).value;
      break;
    case pki.oids.encryptedData:
      safeContents = _decryptSafeContents(data, password);
      obj.encrypted = true;
      break;
    default:
      var error = new Error('Unsupported PKCS#12 contentType.');
      error.contentType = asn1.derToOid(capture.contentType);
      throw error;
    }

    obj.safeBags = _decodeSafeContents(safeContents, strict, password);
    pfx.safeContents.push(obj);
  }
}

/**
 * Decrypt PKCS#7 EncryptedData structure.
 *
 * @param data ASN.1 encoded EncryptedContentInfo object.
 * @param password The user-provided password.
 *
 * @return The decrypted SafeContents (ASN.1 object).
 */
function _decryptSafeContents(data, password) {
  var capture = {};
  var errors = [];
  if(!asn1.validate(
    data, forge.pkcs7.asn1.encryptedDataValidator, capture, errors)) {
    var error = new Error('Cannot read EncryptedContentInfo.');
    error.errors = errors;
    throw error;
  }

  var oid = asn1.derToOid(capture.contentType);
  if(oid !== pki.oids.data) {
    var error = new Error(
      'PKCS#12 EncryptedContentInfo ContentType is not Data.');
    error.oid = oid;
    throw error;
  }

  // get cipher
  oid = asn1.derToOid(capture.encAlgorithm);
  var cipher = pki.pbe.getCipher(oid, capture.encParameter, password);

  // get encrypted data
  var encryptedContentAsn1 = _decodePkcs7Data(capture.encryptedContentAsn1);
  var encrypted = forge.util.createBuffer(encryptedContentAsn1.value);

  cipher.update(encrypted);
  if(!cipher.finish()) {
    throw new Error('Failed to decrypt PKCS#12 SafeContents.');
  }

  return cipher.output.getBytes();
}

/**
 * Decode PKCS#12 SafeContents (BER-encoded) into array of Bag objects.
 *
 * The safeContents is a BER-encoded SEQUENCE OF SafeBag.
 *
 * @param {String} safeContents BER-encoded safeContents.
 * @param strict true to use strict DER decoding, false not to.
 * @param {String} password Password to decrypt with (optional).
 *
 * @return {Array} Array of Bag objects.
 */
function _decodeSafeContents(safeContents, strict, password) {
  // if strict and no safe contents, return empty safes
  if(!strict && safeContents.length === 0) {
    return [];
  }

  // actually it's BER-encoded
  safeContents = asn1.fromDer(safeContents, strict);

  if(safeContents.tagClass !== asn1.Class.UNIVERSAL ||
    safeContents.type !== asn1.Type.SEQUENCE ||
    safeContents.constructed !== true) {
    throw new Error(
      'PKCS#12 SafeContents expected to be a SEQUENCE OF SafeBag.');
  }

  var res = [];
  for(var i = 0; i < safeContents.value.length; i++) {
    var safeBag = safeContents.value[i];

    // validate SafeBag and capture data
    var capture = {};
    var errors = [];
    if(!asn1.validate(safeBag, safeBagValidator, capture, errors)) {
      var error = new Error('Cannot read SafeBag.');
      error.errors = errors;
      throw error;
    }

    /* Create bag object and push to result array. */
    var bag = {
      type: asn1.derToOid(capture.bagId),
      attributes: _decodeBagAttributes(capture.bagAttributes)
    };
    res.push(bag);

    var validator, decoder;
    var bagAsn1 = capture.bagValue.value[0];
    switch(bag.type) {
      case pki.oids.pkcs8ShroudedKeyBag:
        /* bagAsn1 has a EncryptedPrivateKeyInfo, which we need to decrypt.
           Afterwards we can handle it like a keyBag,
           which is a PrivateKeyInfo. */
        bagAsn1 = pki.decryptPrivateKeyInfo(bagAsn1, password);
        if(bagAsn1 === null) {
          throw new Error(
            'Unable to decrypt PKCS#8 ShroudedKeyBag, wrong password?');
        }

        /* fall through */
      case pki.oids.keyBag:
        /* A PKCS#12 keyBag is a simple PrivateKeyInfo as understood by our
           PKI module, hence we don't have to do validation/capturing here,
           just pass what we already got. */
        try {
          bag.key = pki.privateKeyFromAsn1(bagAsn1);
        } catch(e) {
          // ignore unknown key type, pass asn1 value
          bag.key = null;
          bag.asn1 = bagAsn1;
        }
        continue;  /* Nothing more to do. */

      case pki.oids.certBag:
        /* A PKCS#12 certBag can wrap both X.509 and sdsi certificates.
           Therefore put the SafeBag content through another validator to
           capture the fields.  Afterwards check & store the results. */
        validator = certBagValidator;
        decoder = function() {
          if(asn1.derToOid(capture.certId) !== pki.oids.x509Certificate) {
            var error = new Error(
              'Unsupported certificate type, only X.509 supported.');
            error.oid = asn1.derToOid(capture.certId);
            throw error;
          }

          // true=produce cert hash
          var certAsn1 = asn1.fromDer(capture.cert, strict);
          try {
            bag.cert = pki.certificateFromAsn1(certAsn1, true);
          } catch(e) {
            // ignore unknown cert type, pass asn1 value
            bag.cert = null;
            bag.asn1 = certAsn1;
          }
        };
        break;

      default:
        var error = new Error('Unsupported PKCS#12 SafeBag type.');
        error.oid = bag.type;
        throw error;
    }

    /* Validate SafeBag value (i.e. CertBag, etc.) and capture data if needed. */
    if(validator !== undefined &&
       !asn1.validate(bagAsn1, validator, capture, errors)) {
      var error = new Error('Cannot read PKCS#12 ' + validator.name);
      error.errors = errors;
      throw error;
    }

    /* Call decoder function from above to store the results. */
    decoder();
  }

  return res;
}

/**
 * Decode PKCS#12 SET OF PKCS12Attribute into JavaScript object.
 *
 * @param attributes SET OF PKCS12Attribute (ASN.1 object).
 *
 * @return the decoded attributes.
 */
function _decodeBagAttributes(attributes) {
  var decodedAttrs = {};

  if(attributes !== undefined) {
    for(var i = 0; i < attributes.length; ++i) {
      var capture = {};
      var errors = [];
      if(!asn1.validate(attributes[i], attributeValidator, capture, errors)) {
        var error = new Error('Cannot read PKCS#12 BagAttribute.');
        error.errors = errors;
        throw error;
      }

      var oid = asn1.derToOid(capture.oid);
      if(pki.oids[oid] === undefined) {
        // unsupported attribute type, ignore.
        continue;
      }

      decodedAttrs[pki.oids[oid]] = [];
      for(var j = 0; j < capture.values.length; ++j) {
        decodedAttrs[pki.oids[oid]].push(capture.values[j].value);
      }
    }
  }

  return decodedAttrs;
}

/**
 * Wraps a private key and certificate in a PKCS#12 PFX wrapper. If a
 * password is provided then the private key will be encrypted.
 *
 * An entire certificate chain may also be included. To do this, pass
 * an array for the "cert" parameter where the first certificate is
 * the one that is paired with the private key and each subsequent one
 * verifies the previous one. The certificates may be in PEM format or
 * have been already parsed by Forge.
 *
 * @todo implement password-based-encryption for the whole package
 *
 * @param key the private key.
 * @param cert the certificate (may be an array of certificates in order
 *          to specify a certificate chain).
 * @param password the password to use, null for none.
 * @param options:
 *          algorithm the encryption algorithm to use
 *            ('aes128', 'aes192', 'aes256', '3des'), defaults to 'aes128'.
 *          count the iteration count to use.
 *          saltSize the salt size to use.
 *          useMac true to include a MAC, false not to, defaults to true.
 *          localKeyId the local key ID to use, in hex.
 *          friendlyName the friendly name to use.
 *          generateLocalKeyId true to generate a random local key ID,
 *            false not to, defaults to true.
 *
 * @return the PKCS#12 PFX ASN.1 object.
 */
p12.toPkcs12Asn1 = function(key, cert, password, options) {
  // set default options
  options = options || {};
  options.saltSize = options.saltSize || 8;
  options.count = options.count || 2048;
  options.algorithm = options.algorithm || options.encAlgorithm || 'aes128';
  if(!('useMac' in options)) {
    options.useMac = true;
  }
  if(!('localKeyId' in options)) {
    options.localKeyId = null;
  }
  if(!('generateLocalKeyId' in options)) {
    options.generateLocalKeyId = true;
  }

  var localKeyId = options.localKeyId;
  var bagAttrs;
  if(localKeyId !== null) {
    localKeyId = forge.util.hexToBytes(localKeyId);
  } else if(options.generateLocalKeyId) {
    // use SHA-1 of paired cert, if available
    if(cert) {
      var pairedCert = forge.util.isArray(cert) ? cert[0] : cert;
      if(typeof pairedCert === 'string') {
        pairedCert = pki.certificateFromPem(pairedCert);
      }
      var sha1 = forge.md.sha1.create();
      sha1.update(asn1.toDer(pki.certificateToAsn1(pairedCert)).getBytes());
      localKeyId = sha1.digest().getBytes();
    } else {
      // FIXME: consider using SHA-1 of public key (which can be generated
      // from private key components), see: cert.generateSubjectKeyIdentifier
      // generate random bytes
      localKeyId = forge.random.getBytes(20);
    }
  }

  var attrs = [];
  if(localKeyId !== null) {
    attrs.push(
      // localKeyID
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // attrId
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
          asn1.oidToDer(pki.oids.localKeyId).getBytes()),
        // attrValues
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,
            localKeyId)
        ])
      ]));
  }
  if('friendlyName' in options) {
    attrs.push(
      // friendlyName
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // attrId
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
          asn1.oidToDer(pki.oids.friendlyName).getBytes()),
        // attrValues
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BMPSTRING, false,
            options.friendlyName)
        ])
      ]));
  }

  if(attrs.length > 0) {
    bagAttrs = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, attrs);
  }

  // collect contents for AuthenticatedSafe
  var contents = [];

  // create safe bag(s) for certificate chain
  var chain = [];
  if(cert !== null) {
    if(forge.util.isArray(cert)) {
      chain = cert;
    } else {
      chain = [cert];
    }
  }

  var certSafeBags = [];
  for(var i = 0; i < chain.length; ++i) {
    // convert cert from PEM as necessary
    cert = chain[i];
    if(typeof cert === 'string') {
      cert = pki.certificateFromPem(cert);
    }

    // SafeBag
    var certBagAttrs = (i === 0) ? bagAttrs : undefined;
    var certAsn1 = pki.certificateToAsn1(cert);
    var certSafeBag =
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // bagId
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
          asn1.oidToDer(pki.oids.certBag).getBytes()),
        // bagValue
        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
          // CertBag
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
            // certId
            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
              asn1.oidToDer(pki.oids.x509Certificate).getBytes()),
            // certValue (x509Certificate)
            asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
              asn1.create(
                asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,
                asn1.toDer(certAsn1).getBytes())
            ])])]),
        // bagAttributes (OPTIONAL)
        certBagAttrs
      ]);
    certSafeBags.push(certSafeBag);
  }

  if(certSafeBags.length > 0) {
    // SafeContents
    var certSafeContents = asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, certSafeBags);

    // ContentInfo
    var certCI =
      // PKCS#7 ContentInfo
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // contentType
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
          // OID for the content type is 'data'
          asn1.oidToDer(pki.oids.data).getBytes()),
        // content
        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
          asn1.create(
            asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,
            asn1.toDer(certSafeContents).getBytes())
        ])
      ]);
    contents.push(certCI);
  }

  // create safe contents for private key
  var keyBag = null;
  if(key !== null) {
    // SafeBag
    var pkAsn1 = pki.wrapRsaPrivateKey(pki.privateKeyToAsn1(key));
    if(password === null) {
      // no encryption
      keyBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // bagId
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
          asn1.oidToDer(pki.oids.keyBag).getBytes()),
        // bagValue
        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
          // PrivateKeyInfo
          pkAsn1
        ]),
        // bagAttributes (OPTIONAL)
        bagAttrs
      ]);
    } else {
      // encrypted PrivateKeyInfo
      keyBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // bagId
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
          asn1.oidToDer(pki.oids.pkcs8ShroudedKeyBag).getBytes()),
        // bagValue
        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
          // EncryptedPrivateKeyInfo
          pki.encryptPrivateKeyInfo(pkAsn1, password, options)
        ]),
        // bagAttributes (OPTIONAL)
        bagAttrs
      ]);
    }

    // SafeContents
    var keySafeContents =
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [keyBag]);

    // ContentInfo
    var keyCI =
      // PKCS#7 ContentInfo
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // contentType
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
          // OID for the content type is 'data'
          asn1.oidToDer(pki.oids.data).getBytes()),
        // content
        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
          asn1.create(
            asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,
            asn1.toDer(keySafeContents).getBytes())
        ])
      ]);
    contents.push(keyCI);
  }

  // create AuthenticatedSafe by stringing together the contents
  var safe = asn1.create(
    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, contents);

  var macData;
  if(options.useMac) {
    // MacData
    var sha1 = forge.md.sha1.create();
    var macSalt = new forge.util.ByteBuffer(
      forge.random.getBytes(options.saltSize));
    var count = options.count;
    // 160-bit key
    var key = p12.generateKey(password, macSalt, 3, count, 20);
    var mac = forge.hmac.create();
    mac.start(sha1, key);
    mac.update(asn1.toDer(safe).getBytes());
    var macValue = mac.getMac();
    macData = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // mac DigestInfo
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // digestAlgorithm
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
          // algorithm = SHA-1
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
            asn1.oidToDer(pki.oids.sha1).getBytes()),
          // parameters = Null
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')
        ]),
        // digest
        asn1.create(
          asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING,
          false, macValue.getBytes())
      ]),
      // macSalt OCTET STRING
      asn1.create(
        asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, macSalt.getBytes()),
      // iterations INTEGER (XXX: Only support count < 65536)
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
        asn1.integerToDer(count).getBytes()
      )
    ]);
  }

  // PFX
  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // version (3)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      asn1.integerToDer(3).getBytes()),
    // PKCS#7 ContentInfo
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // contentType
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        // OID for the content type is 'data'
        asn1.oidToDer(pki.oids.data).getBytes()),
      // content
      asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
        asn1.create(
          asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,
          asn1.toDer(safe).getBytes())
      ])
    ]),
    macData
  ]);
};

/**
 * Derives a PKCS#12 key.
 *
 * @param password the password to derive the key material from, null or
 *          undefined for none.
 * @param salt the salt, as a ByteBuffer, to use.
 * @param id the PKCS#12 ID byte (1 = key material, 2 = IV, 3 = MAC).
 * @param iter the iteration count.
 * @param n the number of bytes to derive from the password.
 * @param md the message digest to use, defaults to SHA-1.
 *
 * @return a ByteBuffer with the bytes derived from the password.
 */
p12.generateKey = forge.pbe.generatePkcs12Key;

},{"./asn1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/asn1.js","./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./hmac":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/hmac.js","./oids":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/oids.js","./pbe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pbe.js","./pkcs7asn1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pkcs7asn1.js","./random":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/random.js","./rsa":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/rsa.js","./sha1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/sha1.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js","./x509":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/x509.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pkcs7.js":[function(require,module,exports){
/**
 * Javascript implementation of PKCS#7 v1.5.
 *
 * @author Stefan Siegl
 * @author Dave Longley
 *
 * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>
 * Copyright (c) 2012-2015 Digital Bazaar, Inc.
 *
 * Currently this implementation only supports ContentType of EnvelopedData,
 * EncryptedData, or SignedData at the root level. The top level elements may
 * contain only a ContentInfo of ContentType Data, i.e. plain data. Further
 * nesting is not (yet) supported.
 *
 * The Forge validators for PKCS #7's ASN.1 structures are available from
 * a separate file pkcs7asn1.js, since those are referenced from other
 * PKCS standards like PKCS #12.
 */
var forge = require('./forge');
require('./aes');
require('./asn1');
require('./des');
require('./oids');
require('./pem');
require('./pkcs7asn1');
require('./random');
require('./util');
require('./x509');

// shortcut for ASN.1 API
var asn1 = forge.asn1;

// shortcut for PKCS#7 API
var p7 = module.exports = forge.pkcs7 = forge.pkcs7 || {};

/**
 * Converts a PKCS#7 message from PEM format.
 *
 * @param pem the PEM-formatted PKCS#7 message.
 *
 * @return the PKCS#7 message.
 */
p7.messageFromPem = function(pem) {
  var msg = forge.pem.decode(pem)[0];

  if(msg.type !== 'PKCS7') {
    var error = new Error('Could not convert PKCS#7 message from PEM; PEM ' +
      'header type is not "PKCS#7".');
    error.headerType = msg.type;
    throw error;
  }
  if(msg.procType && msg.procType.type === 'ENCRYPTED') {
    throw new Error('Could not convert PKCS#7 message from PEM; PEM is encrypted.');
  }

  // convert DER to ASN.1 object
  var obj = asn1.fromDer(msg.body);

  return p7.messageFromAsn1(obj);
};

/**
 * Converts a PKCS#7 message to PEM format.
 *
 * @param msg The PKCS#7 message object
 * @param maxline The maximum characters per line, defaults to 64.
 *
 * @return The PEM-formatted PKCS#7 message.
 */
p7.messageToPem = function(msg, maxline) {
  // convert to ASN.1, then DER, then PEM-encode
  var pemObj = {
    type: 'PKCS7',
    body: asn1.toDer(msg.toAsn1()).getBytes()
  };
  return forge.pem.encode(pemObj, {maxline: maxline});
};

/**
 * Converts a PKCS#7 message from an ASN.1 object.
 *
 * @param obj the ASN.1 representation of a ContentInfo.
 *
 * @return the PKCS#7 message.
 */
p7.messageFromAsn1 = function(obj) {
  // validate root level ContentInfo and capture data
  var capture = {};
  var errors = [];
  if(!asn1.validate(obj, p7.asn1.contentInfoValidator, capture, errors)) {
    var error = new Error('Cannot read PKCS#7 message. ' +
      'ASN.1 object is not an PKCS#7 ContentInfo.');
    error.errors = errors;
    throw error;
  }

  var contentType = asn1.derToOid(capture.contentType);
  var msg;

  switch(contentType) {
    case forge.pki.oids.envelopedData:
      msg = p7.createEnvelopedData();
      break;

    case forge.pki.oids.encryptedData:
      msg = p7.createEncryptedData();
      break;

    case forge.pki.oids.signedData:
      msg = p7.createSignedData();
      break;

    default:
      throw new Error('Cannot read PKCS#7 message. ContentType with OID ' +
        contentType + ' is not (yet) supported.');
  }

  msg.fromAsn1(capture.content.value[0]);
  return msg;
};

p7.createSignedData = function() {
  var msg = null;
  msg = {
    type: forge.pki.oids.signedData,
    version: 1,
    certificates: [],
    crls: [],
    // TODO: add json-formatted signer stuff here?
    signers: [],
    // populated during sign()
    digestAlgorithmIdentifiers: [],
    contentInfo: null,
    signerInfos: [],

    fromAsn1: function(obj) {
      // validate SignedData content block and capture data.
      _fromAsn1(msg, obj, p7.asn1.signedDataValidator);
      msg.certificates = [];
      msg.crls = [];
      msg.digestAlgorithmIdentifiers = [];
      msg.contentInfo = null;
      msg.signerInfos = [];

      if(msg.rawCapture.certificates) {
        var certs = msg.rawCapture.certificates.value;
        for(var i = 0; i < certs.length; ++i) {
          msg.certificates.push(forge.pki.certificateFromAsn1(certs[i]));
        }
      }

      // TODO: parse crls
    },

    toAsn1: function() {
      // degenerate case with no content
      if(!msg.contentInfo) {
        msg.sign();
      }

      var certs = [];
      for(var i = 0; i < msg.certificates.length; ++i) {
        certs.push(forge.pki.certificateToAsn1(msg.certificates[i]));
      }

      var crls = [];
      // TODO: implement CRLs

      // [0] SignedData
      var signedData = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
          // Version
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
            asn1.integerToDer(msg.version).getBytes()),
          // DigestAlgorithmIdentifiers
          asn1.create(
            asn1.Class.UNIVERSAL, asn1.Type.SET, true,
            msg.digestAlgorithmIdentifiers),
          // ContentInfo
          msg.contentInfo
        ])
      ]);
      if(certs.length > 0) {
        // [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL
        signedData.value[0].value.push(
          asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, certs));
      }
      if(crls.length > 0) {
        // [1] IMPLICIT CertificateRevocationLists OPTIONAL
        signedData.value[0].value.push(
          asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, crls));
      }
      // SignerInfos
      signedData.value[0].value.push(
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true,
          msg.signerInfos));

      // ContentInfo
      return asn1.create(
        asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
          // ContentType
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
            asn1.oidToDer(msg.type).getBytes()),
          // [0] SignedData
          signedData
        ]);
    },

    /**
     * Add (another) entity to list of signers.
     *
     * Note: If authenticatedAttributes are provided, then, per RFC 2315,
     * they must include at least two attributes: content type and
     * message digest. The message digest attribute value will be
     * auto-calculated during signing and will be ignored if provided.
     *
     * Here's an example of providing these two attributes:
     *
     * forge.pkcs7.createSignedData();
     * p7.addSigner({
     *   issuer: cert.issuer.attributes,
     *   serialNumber: cert.serialNumber,
     *   key: privateKey,
     *   digestAlgorithm: forge.pki.oids.sha1,
     *   authenticatedAttributes: [{
     *     type: forge.pki.oids.contentType,
     *     value: forge.pki.oids.data
     *   }, {
     *     type: forge.pki.oids.messageDigest
     *   }]
     * });
     *
     * TODO: Support [subjectKeyIdentifier] as signer's ID.
     *
     * @param signer the signer information:
     *          key the signer's private key.
     *          [certificate] a certificate containing the public key
     *            associated with the signer's private key; use this option as
     *            an alternative to specifying signer.issuer and
     *            signer.serialNumber.
     *          [issuer] the issuer attributes (eg: cert.issuer.attributes).
     *          [serialNumber] the signer's certificate's serial number in
     *           hexadecimal (eg: cert.serialNumber).
     *          [digestAlgorithm] the message digest OID, as a string, to use
     *            (eg: forge.pki.oids.sha1).
     *          [authenticatedAttributes] an optional array of attributes
     *            to also sign along with the content.
     */
    addSigner: function(signer) {
      var issuer = signer.issuer;
      var serialNumber = signer.serialNumber;
      if(signer.certificate) {
        var cert = signer.certificate;
        if(typeof cert === 'string') {
          cert = forge.pki.certificateFromPem(cert);
        }
        issuer = cert.issuer.attributes;
        serialNumber = cert.serialNumber;
      }
      var key = signer.key;
      if(!key) {
        throw new Error(
          'Could not add PKCS#7 signer; no private key specified.');
      }
      if(typeof key === 'string') {
        key = forge.pki.privateKeyFromPem(key);
      }

      // ensure OID known for digest algorithm
      var digestAlgorithm = signer.digestAlgorithm || forge.pki.oids.sha1;
      switch(digestAlgorithm) {
      case forge.pki.oids.sha1:
      case forge.pki.oids.sha256:
      case forge.pki.oids.sha384:
      case forge.pki.oids.sha512:
      case forge.pki.oids.md5:
        break;
      default:
        throw new Error(
          'Could not add PKCS#7 signer; unknown message digest algorithm: ' +
          digestAlgorithm);
      }

      // if authenticatedAttributes is present, then the attributes
      // must contain at least PKCS #9 content-type and message-digest
      var authenticatedAttributes = signer.authenticatedAttributes || [];
      if(authenticatedAttributes.length > 0) {
        var contentType = false;
        var messageDigest = false;
        for(var i = 0; i < authenticatedAttributes.length; ++i) {
          var attr = authenticatedAttributes[i];
          if(!contentType && attr.type === forge.pki.oids.contentType) {
            contentType = true;
            if(messageDigest) {
              break;
            }
            continue;
          }
          if(!messageDigest && attr.type === forge.pki.oids.messageDigest) {
            messageDigest = true;
            if(contentType) {
              break;
            }
            continue;
          }
        }

        if(!contentType || !messageDigest) {
          throw new Error('Invalid signer.authenticatedAttributes. If ' +
            'signer.authenticatedAttributes is specified, then it must ' +
            'contain at least two attributes, PKCS #9 content-type and ' +
            'PKCS #9 message-digest.');
        }
      }

      msg.signers.push({
        key: key,
        version: 1,
        issuer: issuer,
        serialNumber: serialNumber,
        digestAlgorithm: digestAlgorithm,
        signatureAlgorithm: forge.pki.oids.rsaEncryption,
        signature: null,
        authenticatedAttributes: authenticatedAttributes,
        unauthenticatedAttributes: []
      });
    },

    /**
     * Signs the content.
     * @param options Options to apply when signing:
     *    [detached] boolean. If signing should be done in detached mode. Defaults to false.
     */
    sign: function(options) {
      options = options || {};
      // auto-generate content info
      if(typeof msg.content !== 'object' || msg.contentInfo === null) {
        // use Data ContentInfo
        msg.contentInfo = asn1.create(
          asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
            // ContentType
            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
              asn1.oidToDer(forge.pki.oids.data).getBytes())
          ]);

        // add actual content, if present
        if('content' in msg) {
          var content;
          if(msg.content instanceof forge.util.ByteBuffer) {
            content = msg.content.bytes();
          } else if(typeof msg.content === 'string') {
            content = forge.util.encodeUtf8(msg.content);
          }

          if (options.detached) {
            msg.detachedContent = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, content);
          } else {
            msg.contentInfo.value.push(
              // [0] EXPLICIT content
              asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
                asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,
                  content)
              ]));
          }
        }
      }

      // no signers, return early (degenerate case for certificate container)
      if(msg.signers.length === 0) {
        return;
      }

      // generate digest algorithm identifiers
      var mds = addDigestAlgorithmIds();

      // generate signerInfos
      addSignerInfos(mds);
    },

    verify: function() {
      throw new Error('PKCS#7 signature verification not yet implemented.');
    },

    /**
     * Add a certificate.
     *
     * @param cert the certificate to add.
     */
    addCertificate: function(cert) {
      // convert from PEM
      if(typeof cert === 'string') {
        cert = forge.pki.certificateFromPem(cert);
      }
      msg.certificates.push(cert);
    },

    /**
     * Add a certificate revokation list.
     *
     * @param crl the certificate revokation list to add.
     */
    addCertificateRevokationList: function(crl) {
      throw new Error('PKCS#7 CRL support not yet implemented.');
    }
  };
  return msg;

  function addDigestAlgorithmIds() {
    var mds = {};

    for(var i = 0; i < msg.signers.length; ++i) {
      var signer = msg.signers[i];
      var oid = signer.digestAlgorithm;
      if(!(oid in mds)) {
        // content digest
        mds[oid] = forge.md[forge.pki.oids[oid]].create();
      }
      if(signer.authenticatedAttributes.length === 0) {
        // no custom attributes to digest; use content message digest
        signer.md = mds[oid];
      } else {
        // custom attributes to be digested; use own message digest
        // TODO: optimize to just copy message digest state if that
        // feature is ever supported with message digests
        signer.md = forge.md[forge.pki.oids[oid]].create();
      }
    }

    // add unique digest algorithm identifiers
    msg.digestAlgorithmIdentifiers = [];
    for(var oid in mds) {
      msg.digestAlgorithmIdentifiers.push(
        // AlgorithmIdentifier
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
          // algorithm
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
            asn1.oidToDer(oid).getBytes()),
          // parameters (null)
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')
        ]));
    }

    return mds;
  }

  function addSignerInfos(mds) {
    var content;

    if (msg.detachedContent) {
      // Signature has been made in detached mode.
      content = msg.detachedContent;
    } else {
      // Note: ContentInfo is a SEQUENCE with 2 values, second value is
      // the content field and is optional for a ContentInfo but required here
      // since signers are present
      // get ContentInfo content
      content = msg.contentInfo.value[1];
      // skip [0] EXPLICIT content wrapper
      content = content.value[0];
    }

    if(!content) {
      throw new Error(
        'Could not sign PKCS#7 message; there is no content to sign.');
    }

    // get ContentInfo content type
    var contentType = asn1.derToOid(msg.contentInfo.value[0].value);

    // serialize content
    var bytes = asn1.toDer(content);

    // skip identifier and length per RFC 2315 9.3
    // skip identifier (1 byte)
    bytes.getByte();
    // read and discard length bytes
    asn1.getBerValueLength(bytes);
    bytes = bytes.getBytes();

    // digest content DER value bytes
    for(var oid in mds) {
      mds[oid].start().update(bytes);
    }

    // sign content
    var signingTime = new Date();
    for(var i = 0; i < msg.signers.length; ++i) {
      var signer = msg.signers[i];

      if(signer.authenticatedAttributes.length === 0) {
        // if ContentInfo content type is not "Data", then
        // authenticatedAttributes must be present per RFC 2315
        if(contentType !== forge.pki.oids.data) {
          throw new Error(
            'Invalid signer; authenticatedAttributes must be present ' +
            'when the ContentInfo content type is not PKCS#7 Data.');
        }
      } else {
        // process authenticated attributes
        // [0] IMPLICIT
        signer.authenticatedAttributesAsn1 = asn1.create(
          asn1.Class.CONTEXT_SPECIFIC, 0, true, []);

        // per RFC 2315, attributes are to be digested using a SET container
        // not the above [0] IMPLICIT container
        var attrsAsn1 = asn1.create(
          asn1.Class.UNIVERSAL, asn1.Type.SET, true, []);

        for(var ai = 0; ai < signer.authenticatedAttributes.length; ++ai) {
          var attr = signer.authenticatedAttributes[ai];
          if(attr.type === forge.pki.oids.messageDigest) {
            // use content message digest as value
            attr.value = mds[signer.digestAlgorithm].digest();
          } else if(attr.type === forge.pki.oids.signingTime) {
            // auto-populate signing time if not already set
            if(!attr.value) {
              attr.value = signingTime;
            }
          }

          // convert to ASN.1 and push onto Attributes SET (for signing) and
          // onto authenticatedAttributesAsn1 to complete SignedData ASN.1
          // TODO: optimize away duplication
          attrsAsn1.value.push(_attributeToAsn1(attr));
          signer.authenticatedAttributesAsn1.value.push(_attributeToAsn1(attr));
        }

        // DER-serialize and digest SET OF attributes only
        bytes = asn1.toDer(attrsAsn1).getBytes();
        signer.md.start().update(bytes);
      }

      // sign digest
      signer.signature = signer.key.sign(signer.md, 'RSASSA-PKCS1-V1_5');
    }

    // add signer info
    msg.signerInfos = _signersToAsn1(msg.signers);
  }
};

/**
 * Creates an empty PKCS#7 message of type EncryptedData.
 *
 * @return the message.
 */
p7.createEncryptedData = function() {
  var msg = null;
  msg = {
    type: forge.pki.oids.encryptedData,
    version: 0,
    encryptedContent: {
      algorithm: forge.pki.oids['aes256-CBC']
    },

    /**
     * Reads an EncryptedData content block (in ASN.1 format)
     *
     * @param obj The ASN.1 representation of the EncryptedData content block
     */
    fromAsn1: function(obj) {
      // Validate EncryptedData content block and capture data.
      _fromAsn1(msg, obj, p7.asn1.encryptedDataValidator);
    },

    /**
     * Decrypt encrypted content
     *
     * @param key The (symmetric) key as a byte buffer
     */
    decrypt: function(key) {
      if(key !== undefined) {
        msg.encryptedContent.key = key;
      }
      _decryptContent(msg);
    }
  };
  return msg;
};

/**
 * Creates an empty PKCS#7 message of type EnvelopedData.
 *
 * @return the message.
 */
p7.createEnvelopedData = function() {
  var msg = null;
  msg = {
    type: forge.pki.oids.envelopedData,
    version: 0,
    recipients: [],
    encryptedContent: {
      algorithm: forge.pki.oids['aes256-CBC']
    },

    /**
     * Reads an EnvelopedData content block (in ASN.1 format)
     *
     * @param obj the ASN.1 representation of the EnvelopedData content block.
     */
    fromAsn1: function(obj) {
      // validate EnvelopedData content block and capture data
      var capture = _fromAsn1(msg, obj, p7.asn1.envelopedDataValidator);
      msg.recipients = _recipientsFromAsn1(capture.recipientInfos.value);
    },

    toAsn1: function() {
      // ContentInfo
      return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // ContentType
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
          asn1.oidToDer(msg.type).getBytes()),
        // [0] EnvelopedData
        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
            // Version
            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
              asn1.integerToDer(msg.version).getBytes()),
            // RecipientInfos
            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true,
              _recipientsToAsn1(msg.recipients)),
            // EncryptedContentInfo
            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true,
              _encryptedContentToAsn1(msg.encryptedContent))
          ])
        ])
      ]);
    },

    /**
     * Find recipient by X.509 certificate's issuer.
     *
     * @param cert the certificate with the issuer to look for.
     *
     * @return the recipient object.
     */
    findRecipient: function(cert) {
      var sAttr = cert.issuer.attributes;

      for(var i = 0; i < msg.recipients.length; ++i) {
        var r = msg.recipients[i];
        var rAttr = r.issuer;

        if(r.serialNumber !== cert.serialNumber) {
          continue;
        }

        if(rAttr.length !== sAttr.length) {
          continue;
        }

        var match = true;
        for(var j = 0; j < sAttr.length; ++j) {
          if(rAttr[j].type !== sAttr[j].type ||
            rAttr[j].value !== sAttr[j].value) {
            match = false;
            break;
          }
        }

        if(match) {
          return r;
        }
      }

      return null;
    },

    /**
     * Decrypt enveloped content
     *
     * @param recipient The recipient object related to the private key
     * @param privKey The (RSA) private key object
     */
    decrypt: function(recipient, privKey) {
      if(msg.encryptedContent.key === undefined && recipient !== undefined &&
        privKey !== undefined) {
        switch(recipient.encryptedContent.algorithm) {
          case forge.pki.oids.rsaEncryption:
          case forge.pki.oids.desCBC:
            var key = privKey.decrypt(recipient.encryptedContent.content);
            msg.encryptedContent.key = forge.util.createBuffer(key);
            break;

          default:
            throw new Error('Unsupported asymmetric cipher, ' +
              'OID ' + recipient.encryptedContent.algorithm);
        }
      }

      _decryptContent(msg);
    },

    /**
     * Add (another) entity to list of recipients.
     *
     * @param cert The certificate of the entity to add.
     */
    addRecipient: function(cert) {
      msg.recipients.push({
        version: 0,
        issuer: cert.issuer.attributes,
        serialNumber: cert.serialNumber,
        encryptedContent: {
          // We simply assume rsaEncryption here, since forge.pki only
          // supports RSA so far.  If the PKI module supports other
          // ciphers one day, we need to modify this one as well.
          algorithm: forge.pki.oids.rsaEncryption,
          key: cert.publicKey
        }
      });
    },

    /**
     * Encrypt enveloped content.
     *
     * This function supports two optional arguments, cipher and key, which
     * can be used to influence symmetric encryption.  Unless cipher is
     * provided, the cipher specified in encryptedContent.algorithm is used
     * (defaults to AES-256-CBC).  If no key is provided, encryptedContent.key
     * is (re-)used.  If that one's not set, a random key will be generated
     * automatically.
     *
     * @param [key] The key to be used for symmetric encryption.
     * @param [cipher] The OID of the symmetric cipher to use.
     */
    encrypt: function(key, cipher) {
      // Part 1: Symmetric encryption
      if(msg.encryptedContent.content === undefined) {
        cipher = cipher || msg.encryptedContent.algorithm;
        key = key || msg.encryptedContent.key;

        var keyLen, ivLen, ciphFn;
        switch(cipher) {
          case forge.pki.oids['aes128-CBC']:
            keyLen = 16;
            ivLen = 16;
            ciphFn = forge.aes.createEncryptionCipher;
            break;

          case forge.pki.oids['aes192-CBC']:
            keyLen = 24;
            ivLen = 16;
            ciphFn = forge.aes.createEncryptionCipher;
            break;

          case forge.pki.oids['aes256-CBC']:
            keyLen = 32;
            ivLen = 16;
            ciphFn = forge.aes.createEncryptionCipher;
            break;

          case forge.pki.oids['des-EDE3-CBC']:
            keyLen = 24;
            ivLen = 8;
            ciphFn = forge.des.createEncryptionCipher;
            break;

          default:
            throw new Error('Unsupported symmetric cipher, OID ' + cipher);
        }

        if(key === undefined) {
          key = forge.util.createBuffer(forge.random.getBytes(keyLen));
        } else if(key.length() != keyLen) {
          throw new Error('Symmetric key has wrong length; ' +
            'got ' + key.length() + ' bytes, expected ' + keyLen + '.');
        }

        // Keep a copy of the key & IV in the object, so the caller can
        // use it for whatever reason.
        msg.encryptedContent.algorithm = cipher;
        msg.encryptedContent.key = key;
        msg.encryptedContent.parameter = forge.util.createBuffer(
          forge.random.getBytes(ivLen));

        var ciph = ciphFn(key);
        ciph.start(msg.encryptedContent.parameter.copy());
        ciph.update(msg.content);

        // The finish function does PKCS#7 padding by default, therefore
        // no action required by us.
        if(!ciph.finish()) {
          throw new Error('Symmetric encryption failed.');
        }

        msg.encryptedContent.content = ciph.output;
      }

      // Part 2: asymmetric encryption for each recipient
      for(var i = 0; i < msg.recipients.length; ++i) {
        var recipient = msg.recipients[i];

        // Nothing to do, encryption already done.
        if(recipient.encryptedContent.content !== undefined) {
          continue;
        }

        switch(recipient.encryptedContent.algorithm) {
          case forge.pki.oids.rsaEncryption:
            recipient.encryptedContent.content =
              recipient.encryptedContent.key.encrypt(
                msg.encryptedContent.key.data);
            break;

          default:
            throw new Error('Unsupported asymmetric cipher, OID ' +
              recipient.encryptedContent.algorithm);
        }
      }
    }
  };
  return msg;
};

/**
 * Converts a single recipient from an ASN.1 object.
 *
 * @param obj the ASN.1 RecipientInfo.
 *
 * @return the recipient object.
 */
function _recipientFromAsn1(obj) {
  // validate EnvelopedData content block and capture data
  var capture = {};
  var errors = [];
  if(!asn1.validate(obj, p7.asn1.recipientInfoValidator, capture, errors)) {
    var error = new Error('Cannot read PKCS#7 RecipientInfo. ' +
      'ASN.1 object is not an PKCS#7 RecipientInfo.');
    error.errors = errors;
    throw error;
  }

  return {
    version: capture.version.charCodeAt(0),
    issuer: forge.pki.RDNAttributesAsArray(capture.issuer),
    serialNumber: forge.util.createBuffer(capture.serial).toHex(),
    encryptedContent: {
      algorithm: asn1.derToOid(capture.encAlgorithm),
      parameter: capture.encParameter.value,
      content: capture.encKey
    }
  };
}

/**
 * Converts a single recipient object to an ASN.1 object.
 *
 * @param obj the recipient object.
 *
 * @return the ASN.1 RecipientInfo.
 */
function _recipientToAsn1(obj) {
  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // Version
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      asn1.integerToDer(obj.version).getBytes()),
    // IssuerAndSerialNumber
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // Name
      forge.pki.distinguishedNameToAsn1({attributes: obj.issuer}),
      // Serial
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
        forge.util.hexToBytes(obj.serialNumber))
    ]),
    // KeyEncryptionAlgorithmIdentifier
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // Algorithm
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        asn1.oidToDer(obj.encryptedContent.algorithm).getBytes()),
      // Parameter, force NULL, only RSA supported for now.
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')
    ]),
    // EncryptedKey
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,
      obj.encryptedContent.content)
  ]);
}

/**
 * Map a set of RecipientInfo ASN.1 objects to recipient objects.
 *
 * @param infos an array of ASN.1 representations RecipientInfo (i.e. SET OF).
 *
 * @return an array of recipient objects.
 */
function _recipientsFromAsn1(infos) {
  var ret = [];
  for(var i = 0; i < infos.length; ++i) {
    ret.push(_recipientFromAsn1(infos[i]));
  }
  return ret;
}

/**
 * Map an array of recipient objects to ASN.1 RecipientInfo objects.
 *
 * @param recipients an array of recipientInfo objects.
 *
 * @return an array of ASN.1 RecipientInfos.
 */
function _recipientsToAsn1(recipients) {
  var ret = [];
  for(var i = 0; i < recipients.length; ++i) {
    ret.push(_recipientToAsn1(recipients[i]));
  }
  return ret;
}

/**
 * Converts a single signer from an ASN.1 object.
 *
 * @param obj the ASN.1 representation of a SignerInfo.
 *
 * @return the signer object.
 */
function _signerFromAsn1(obj) {
  // validate EnvelopedData content block and capture data
  var capture = {};
  var errors = [];
  if(!asn1.validate(obj, p7.asn1.signerInfoValidator, capture, errors)) {
    var error = new Error('Cannot read PKCS#7 SignerInfo. ' +
      'ASN.1 object is not an PKCS#7 SignerInfo.');
    error.errors = errors;
    throw error;
  }

  var rval = {
    version: capture.version.charCodeAt(0),
    issuer: forge.pki.RDNAttributesAsArray(capture.issuer),
    serialNumber: forge.util.createBuffer(capture.serial).toHex(),
    digestAlgorithm: asn1.derToOid(capture.digestAlgorithm),
    signatureAlgorithm: asn1.derToOid(capture.signatureAlgorithm),
    signature: capture.signature,
    authenticatedAttributes: [],
    unauthenticatedAttributes: []
  };

  // TODO: convert attributes
  var authenticatedAttributes = capture.authenticatedAttributes || [];
  var unauthenticatedAttributes = capture.unauthenticatedAttributes || [];

  return rval;
}

/**
 * Converts a single signerInfo object to an ASN.1 object.
 *
 * @param obj the signerInfo object.
 *
 * @return the ASN.1 representation of a SignerInfo.
 */
function _signerToAsn1(obj) {
  // SignerInfo
  var rval = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // version
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      asn1.integerToDer(obj.version).getBytes()),
    // issuerAndSerialNumber
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // name
      forge.pki.distinguishedNameToAsn1({attributes: obj.issuer}),
      // serial
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
        forge.util.hexToBytes(obj.serialNumber))
    ]),
    // digestAlgorithm
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // algorithm
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        asn1.oidToDer(obj.digestAlgorithm).getBytes()),
      // parameters (null)
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')
    ])
  ]);

  // authenticatedAttributes (OPTIONAL)
  if(obj.authenticatedAttributesAsn1) {
    // add ASN.1 previously generated during signing
    rval.value.push(obj.authenticatedAttributesAsn1);
  }

  // digestEncryptionAlgorithm
  rval.value.push(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // algorithm
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
      asn1.oidToDer(obj.signatureAlgorithm).getBytes()),
    // parameters (null)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')
  ]));

  // encryptedDigest
  rval.value.push(asn1.create(
    asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, obj.signature));

  // unauthenticatedAttributes (OPTIONAL)
  if(obj.unauthenticatedAttributes.length > 0) {
    // [1] IMPLICIT
    var attrsAsn1 = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, []);
    for(var i = 0; i < obj.unauthenticatedAttributes.length; ++i) {
      var attr = obj.unauthenticatedAttributes[i];
      attrsAsn1.values.push(_attributeToAsn1(attr));
    }
    rval.value.push(attrsAsn1);
  }

  return rval;
}

/**
 * Map a set of SignerInfo ASN.1 objects to an array of signer objects.
 *
 * @param signerInfoAsn1s an array of ASN.1 SignerInfos (i.e. SET OF).
 *
 * @return an array of signers objects.
 */
function _signersFromAsn1(signerInfoAsn1s) {
  var ret = [];
  for(var i = 0; i < signerInfoAsn1s.length; ++i) {
    ret.push(_signerFromAsn1(signerInfoAsn1s[i]));
  }
  return ret;
}

/**
 * Map an array of signer objects to ASN.1 objects.
 *
 * @param signers an array of signer objects.
 *
 * @return an array of ASN.1 SignerInfos.
 */
function _signersToAsn1(signers) {
  var ret = [];
  for(var i = 0; i < signers.length; ++i) {
    ret.push(_signerToAsn1(signers[i]));
  }
  return ret;
}

/**
 * Convert an attribute object to an ASN.1 Attribute.
 *
 * @param attr the attribute object.
 *
 * @return the ASN.1 Attribute.
 */
function _attributeToAsn1(attr) {
  var value;

  // TODO: generalize to support more attributes
  if(attr.type === forge.pki.oids.contentType) {
    value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
      asn1.oidToDer(attr.value).getBytes());
  } else if(attr.type === forge.pki.oids.messageDigest) {
    value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,
      attr.value.bytes());
  } else if(attr.type === forge.pki.oids.signingTime) {
    /* Note per RFC 2985: Dates between 1 January 1950 and 31 December 2049
      (inclusive) MUST be encoded as UTCTime. Any dates with year values
      before 1950 or after 2049 MUST be encoded as GeneralizedTime. [Further,]
      UTCTime values MUST be expressed in Greenwich Mean Time (Zulu) and MUST
      include seconds (i.e., times are YYMMDDHHMMSSZ), even where the
      number of seconds is zero.  Midnight (GMT) must be represented as
      "YYMMDD000000Z". */
    // TODO: make these module-level constants
    var jan_1_1950 = new Date('1950-01-01T00:00:00Z');
    var jan_1_2050 = new Date('2050-01-01T00:00:00Z');
    var date = attr.value;
    if(typeof date === 'string') {
      // try to parse date
      var timestamp = Date.parse(date);
      if(!isNaN(timestamp)) {
        date = new Date(timestamp);
      } else if(date.length === 13) {
        // YYMMDDHHMMSSZ (13 chars for UTCTime)
        date = asn1.utcTimeToDate(date);
      } else {
        // assume generalized time
        date = asn1.generalizedTimeToDate(date);
      }
    }

    if(date >= jan_1_1950 && date < jan_1_2050) {
      value = asn1.create(
        asn1.Class.UNIVERSAL, asn1.Type.UTCTIME, false,
        asn1.dateToUtcTime(date));
    } else {
      value = asn1.create(
        asn1.Class.UNIVERSAL, asn1.Type.GENERALIZEDTIME, false,
        asn1.dateToGeneralizedTime(date));
    }
  }

  // TODO: expose as common API call
  // create a RelativeDistinguishedName set
  // each value in the set is an AttributeTypeAndValue first
  // containing the type (an OID) and second the value
  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // AttributeType
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
      asn1.oidToDer(attr.type).getBytes()),
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [
      // AttributeValue
      value
    ])
  ]);
}

/**
 * Map messages encrypted content to ASN.1 objects.
 *
 * @param ec The encryptedContent object of the message.
 *
 * @return ASN.1 representation of the encryptedContent object (SEQUENCE).
 */
function _encryptedContentToAsn1(ec) {
  return [
    // ContentType, always Data for the moment
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
      asn1.oidToDer(forge.pki.oids.data).getBytes()),
    // ContentEncryptionAlgorithmIdentifier
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // Algorithm
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        asn1.oidToDer(ec.algorithm).getBytes()),
      // Parameters (IV)
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,
        ec.parameter.getBytes())
    ]),
    // [0] EncryptedContent
    asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,
        ec.content.getBytes())
    ])
  ];
}

/**
 * Reads the "common part" of an PKCS#7 content block (in ASN.1 format)
 *
 * This function reads the "common part" of the PKCS#7 content blocks
 * EncryptedData and EnvelopedData, i.e. version number and symmetrically
 * encrypted content block.
 *
 * The result of the ASN.1 validate and capture process is returned
 * to allow the caller to extract further data, e.g. the list of recipients
 * in case of a EnvelopedData object.
 *
 * @param msg the PKCS#7 object to read the data to.
 * @param obj the ASN.1 representation of the content block.
 * @param validator the ASN.1 structure validator object to use.
 *
 * @return the value map captured by validator object.
 */
function _fromAsn1(msg, obj, validator) {
  var capture = {};
  var errors = [];
  if(!asn1.validate(obj, validator, capture, errors)) {
    var error = new Error('Cannot read PKCS#7 message. ' +
      'ASN.1 object is not a supported PKCS#7 message.');
    error.errors = error;
    throw error;
  }

  // Check contentType, so far we only support (raw) Data.
  var contentType = asn1.derToOid(capture.contentType);
  if(contentType !== forge.pki.oids.data) {
    throw new Error('Unsupported PKCS#7 message. ' +
      'Only wrapped ContentType Data supported.');
  }

  if(capture.encryptedContent) {
    var content = '';
    if(forge.util.isArray(capture.encryptedContent)) {
      for(var i = 0; i < capture.encryptedContent.length; ++i) {
        if(capture.encryptedContent[i].type !== asn1.Type.OCTETSTRING) {
          throw new Error('Malformed PKCS#7 message, expecting encrypted ' +
            'content constructed of only OCTET STRING objects.');
        }
        content += capture.encryptedContent[i].value;
      }
    } else {
      content = capture.encryptedContent;
    }
    msg.encryptedContent = {
      algorithm: asn1.derToOid(capture.encAlgorithm),
      parameter: forge.util.createBuffer(capture.encParameter.value),
      content: forge.util.createBuffer(content)
    };
  }

  if(capture.content) {
    var content = '';
    if(forge.util.isArray(capture.content)) {
      for(var i = 0; i < capture.content.length; ++i) {
        if(capture.content[i].type !== asn1.Type.OCTETSTRING) {
          throw new Error('Malformed PKCS#7 message, expecting ' +
            'content constructed of only OCTET STRING objects.');
        }
        content += capture.content[i].value;
      }
    } else {
      content = capture.content;
    }
    msg.content = forge.util.createBuffer(content);
  }

  msg.version = capture.version.charCodeAt(0);
  msg.rawCapture = capture;

  return capture;
}

/**
 * Decrypt the symmetrically encrypted content block of the PKCS#7 message.
 *
 * Decryption is skipped in case the PKCS#7 message object already has a
 * (decrypted) content attribute.  The algorithm, key and cipher parameters
 * (probably the iv) are taken from the encryptedContent attribute of the
 * message object.
 *
 * @param The PKCS#7 message object.
 */
function _decryptContent(msg) {
  if(msg.encryptedContent.key === undefined) {
    throw new Error('Symmetric key not available.');
  }

  if(msg.content === undefined) {
    var ciph;

    switch(msg.encryptedContent.algorithm) {
      case forge.pki.oids['aes128-CBC']:
      case forge.pki.oids['aes192-CBC']:
      case forge.pki.oids['aes256-CBC']:
        ciph = forge.aes.createDecryptionCipher(msg.encryptedContent.key);
        break;

      case forge.pki.oids['desCBC']:
      case forge.pki.oids['des-EDE3-CBC']:
        ciph = forge.des.createDecryptionCipher(msg.encryptedContent.key);
        break;

      default:
        throw new Error('Unsupported symmetric cipher, OID ' +
          msg.encryptedContent.algorithm);
    }
    ciph.start(msg.encryptedContent.parameter);
    ciph.update(msg.encryptedContent.content);

    if(!ciph.finish()) {
      throw new Error('Symmetric decryption failed.');
    }

    msg.content = ciph.output;
  }
}

},{"./aes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/aes.js","./asn1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/asn1.js","./des":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/des.js","./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./oids":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/oids.js","./pem":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pem.js","./pkcs7asn1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pkcs7asn1.js","./random":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/random.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js","./x509":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/x509.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pkcs7asn1.js":[function(require,module,exports){
/**
 * Javascript implementation of ASN.1 validators for PKCS#7 v1.5.
 *
 * @author Dave Longley
 * @author Stefan Siegl
 *
 * Copyright (c) 2012-2015 Digital Bazaar, Inc.
 * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>
 *
 * The ASN.1 representation of PKCS#7 is as follows
 * (see RFC #2315 for details, http://www.ietf.org/rfc/rfc2315.txt):
 *
 * A PKCS#7 message consists of a ContentInfo on root level, which may
 * contain any number of further ContentInfo nested into it.
 *
 * ContentInfo ::= SEQUENCE {
 *   contentType                ContentType,
 *   content               [0]  EXPLICIT ANY DEFINED BY contentType OPTIONAL
 * }
 *
 * ContentType ::= OBJECT IDENTIFIER
 *
 * EnvelopedData ::= SEQUENCE {
 *   version                    Version,
 *   recipientInfos             RecipientInfos,
 *   encryptedContentInfo       EncryptedContentInfo
 * }
 *
 * EncryptedData ::= SEQUENCE {
 *   version                    Version,
 *   encryptedContentInfo       EncryptedContentInfo
 * }
 *
 * id-signedData OBJECT IDENTIFIER ::= { iso(1) member-body(2)
 *   us(840) rsadsi(113549) pkcs(1) pkcs7(7) 2 }
 *
 * SignedData ::= SEQUENCE {
 *   version           INTEGER,
 *   digestAlgorithms  DigestAlgorithmIdentifiers,
 *   contentInfo       ContentInfo,
 *   certificates      [0] IMPLICIT Certificates OPTIONAL,
 *   crls              [1] IMPLICIT CertificateRevocationLists OPTIONAL,
 *   signerInfos       SignerInfos
 * }
 *
 * SignerInfos ::= SET OF SignerInfo
 *
 * SignerInfo ::= SEQUENCE {
 *   version                    Version,
 *   issuerAndSerialNumber      IssuerAndSerialNumber,
 *   digestAlgorithm            DigestAlgorithmIdentifier,
 *   authenticatedAttributes    [0] IMPLICIT Attributes OPTIONAL,
 *   digestEncryptionAlgorithm  DigestEncryptionAlgorithmIdentifier,
 *   encryptedDigest            EncryptedDigest,
 *   unauthenticatedAttributes  [1] IMPLICIT Attributes OPTIONAL
 * }
 *
 * EncryptedDigest ::= OCTET STRING
 *
 * Attributes ::= SET OF Attribute
 *
 * Attribute ::= SEQUENCE {
 *   attrType    OBJECT IDENTIFIER,
 *   attrValues  SET OF AttributeValue
 * }
 *
 * AttributeValue ::= ANY
 *
 * Version ::= INTEGER
 *
 * RecipientInfos ::= SET OF RecipientInfo
 *
 * EncryptedContentInfo ::= SEQUENCE {
 *   contentType                 ContentType,
 *   contentEncryptionAlgorithm  ContentEncryptionAlgorithmIdentifier,
 *   encryptedContent       [0]  IMPLICIT EncryptedContent OPTIONAL
 * }
 *
 * ContentEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
 *
 * The AlgorithmIdentifier contains an Object Identifier (OID) and parameters
 * for the algorithm, if any. In the case of AES and DES3, there is only one,
 * the IV.
 *
 * AlgorithmIdentifer ::= SEQUENCE {
 *    algorithm OBJECT IDENTIFIER,
 *    parameters ANY DEFINED BY algorithm OPTIONAL
 * }
 *
 * EncryptedContent ::= OCTET STRING
 *
 * RecipientInfo ::= SEQUENCE {
 *   version                     Version,
 *   issuerAndSerialNumber       IssuerAndSerialNumber,
 *   keyEncryptionAlgorithm      KeyEncryptionAlgorithmIdentifier,
 *   encryptedKey                EncryptedKey
 * }
 *
 * IssuerAndSerialNumber ::= SEQUENCE {
 *   issuer                      Name,
 *   serialNumber                CertificateSerialNumber
 * }
 *
 * CertificateSerialNumber ::= INTEGER
 *
 * KeyEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
 *
 * EncryptedKey ::= OCTET STRING
 */
var forge = require('./forge');
require('./asn1');
require('./util');

// shortcut for ASN.1 API
var asn1 = forge.asn1;

// shortcut for PKCS#7 API
var p7v = module.exports = forge.pkcs7asn1 = forge.pkcs7asn1 || {};
forge.pkcs7 = forge.pkcs7 || {};
forge.pkcs7.asn1 = p7v;

var contentInfoValidator = {
  name: 'ContentInfo',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'ContentInfo.ContentType',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.OID,
    constructed: false,
    capture: 'contentType'
  }, {
    name: 'ContentInfo.content',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    type: 0,
    constructed: true,
    optional: true,
    captureAsn1: 'content'
  }]
};
p7v.contentInfoValidator = contentInfoValidator;

var encryptedContentInfoValidator = {
  name: 'EncryptedContentInfo',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'EncryptedContentInfo.contentType',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.OID,
    constructed: false,
    capture: 'contentType'
  }, {
    name: 'EncryptedContentInfo.contentEncryptionAlgorithm',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    value: [{
      name: 'EncryptedContentInfo.contentEncryptionAlgorithm.algorithm',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.OID,
      constructed: false,
      capture: 'encAlgorithm'
    }, {
      name: 'EncryptedContentInfo.contentEncryptionAlgorithm.parameter',
      tagClass: asn1.Class.UNIVERSAL,
      captureAsn1: 'encParameter'
    }]
  }, {
    name: 'EncryptedContentInfo.encryptedContent',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    type: 0,
    /* The PKCS#7 structure output by OpenSSL somewhat differs from what
     * other implementations do generate.
     *
     * OpenSSL generates a structure like this:
     * SEQUENCE {
     *    ...
     *    [0]
     *       26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38
     *       C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45
     *       ...
     * }
     *
     * Whereas other implementations (and this PKCS#7 module) generate:
     * SEQUENCE {
     *    ...
     *    [0] {
     *       OCTET STRING
     *          26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38
     *          C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45
     *          ...
     *    }
     * }
     *
     * In order to support both, we just capture the context specific
     * field here.  The OCTET STRING bit is removed below.
     */
    capture: 'encryptedContent',
    captureAsn1: 'encryptedContentAsn1'
  }]
};

p7v.envelopedDataValidator = {
  name: 'EnvelopedData',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'EnvelopedData.Version',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'version'
  }, {
    name: 'EnvelopedData.RecipientInfos',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SET,
    constructed: true,
    captureAsn1: 'recipientInfos'
  }].concat(encryptedContentInfoValidator)
};

p7v.encryptedDataValidator = {
  name: 'EncryptedData',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'EncryptedData.Version',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'version'
  }].concat(encryptedContentInfoValidator)
};

var signerValidator = {
  name: 'SignerInfo',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'SignerInfo.version',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false
  }, {
    name: 'SignerInfo.issuerAndSerialNumber',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    value: [{
      name: 'SignerInfo.issuerAndSerialNumber.issuer',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,
      constructed: true,
      captureAsn1: 'issuer'
    }, {
      name: 'SignerInfo.issuerAndSerialNumber.serialNumber',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.INTEGER,
      constructed: false,
      capture: 'serial'
    }]
  }, {
    name: 'SignerInfo.digestAlgorithm',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    value: [{
      name: 'SignerInfo.digestAlgorithm.algorithm',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.OID,
      constructed: false,
      capture: 'digestAlgorithm'
    }, {
      name: 'SignerInfo.digestAlgorithm.parameter',
      tagClass: asn1.Class.UNIVERSAL,
      constructed: false,
      captureAsn1: 'digestParameter',
      optional: true
    }]
  }, {
    name: 'SignerInfo.authenticatedAttributes',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    type: 0,
    constructed: true,
    optional: true,
    capture: 'authenticatedAttributes'
  }, {
    name: 'SignerInfo.digestEncryptionAlgorithm',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    capture: 'signatureAlgorithm'
  }, {
    name: 'SignerInfo.encryptedDigest',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.OCTETSTRING,
    constructed: false,
    capture: 'signature'
  }, {
    name: 'SignerInfo.unauthenticatedAttributes',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    type: 1,
    constructed: true,
    optional: true,
    capture: 'unauthenticatedAttributes'
  }]
};

p7v.signedDataValidator = {
  name: 'SignedData',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'SignedData.Version',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'version'
  }, {
    name: 'SignedData.DigestAlgorithms',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SET,
    constructed: true,
    captureAsn1: 'digestAlgorithms'
  },
  contentInfoValidator,
  {
    name: 'SignedData.Certificates',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    type: 0,
    optional: true,
    captureAsn1: 'certificates'
  }, {
    name: 'SignedData.CertificateRevocationLists',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    type: 1,
    optional: true,
    captureAsn1: 'crls'
  }, {
    name: 'SignedData.SignerInfos',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SET,
    capture: 'signerInfos',
    optional: true,
    value: [signerValidator]
  }]
};

p7v.recipientInfoValidator = {
  name: 'RecipientInfo',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'RecipientInfo.version',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'version'
  }, {
    name: 'RecipientInfo.issuerAndSerial',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    value: [{
      name: 'RecipientInfo.issuerAndSerial.issuer',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,
      constructed: true,
      captureAsn1: 'issuer'
    }, {
      name: 'RecipientInfo.issuerAndSerial.serialNumber',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.INTEGER,
      constructed: false,
      capture: 'serial'
    }]
  }, {
    name: 'RecipientInfo.keyEncryptionAlgorithm',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    value: [{
      name: 'RecipientInfo.keyEncryptionAlgorithm.algorithm',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.OID,
      constructed: false,
      capture: 'encAlgorithm'
    }, {
      name: 'RecipientInfo.keyEncryptionAlgorithm.parameter',
      tagClass: asn1.Class.UNIVERSAL,
      constructed: false,
      captureAsn1: 'encParameter'
    }]
  }, {
    name: 'RecipientInfo.encryptedKey',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.OCTETSTRING,
    constructed: false,
    capture: 'encKey'
  }]
};

},{"./asn1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/asn1.js","./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pki.js":[function(require,module,exports){
/**
 * Javascript implementation of a basic Public Key Infrastructure, including
 * support for RSA public and private keys.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2013 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./asn1');
require('./oids');
require('./pbe');
require('./pem');
require('./pbkdf2');
require('./pkcs12');
require('./pss');
require('./rsa');
require('./util');
require('./x509');

// shortcut for asn.1 API
var asn1 = forge.asn1;

/* Public Key Infrastructure (PKI) implementation. */
var pki = module.exports = forge.pki = forge.pki || {};

/**
 * NOTE: THIS METHOD IS DEPRECATED. Use pem.decode() instead.
 *
 * Converts PEM-formatted data to DER.
 *
 * @param pem the PEM-formatted data.
 *
 * @return the DER-formatted data.
 */
pki.pemToDer = function(pem) {
  var msg = forge.pem.decode(pem)[0];
  if(msg.procType && msg.procType.type === 'ENCRYPTED') {
    throw new Error('Could not convert PEM to DER; PEM is encrypted.');
  }
  return forge.util.createBuffer(msg.body);
};

/**
 * Converts an RSA private key from PEM format.
 *
 * @param pem the PEM-formatted private key.
 *
 * @return the private key.
 */
pki.privateKeyFromPem = function(pem) {
  var msg = forge.pem.decode(pem)[0];

  if(msg.type !== 'PRIVATE KEY' && msg.type !== 'RSA PRIVATE KEY') {
    var error = new Error('Could not convert private key from PEM; PEM ' +
      'header type is not "PRIVATE KEY" or "RSA PRIVATE KEY".');
    error.headerType = msg.type;
    throw error;
  }
  if(msg.procType && msg.procType.type === 'ENCRYPTED') {
    throw new Error('Could not convert private key from PEM; PEM is encrypted.');
  }

  // convert DER to ASN.1 object
  var obj = asn1.fromDer(msg.body);

  return pki.privateKeyFromAsn1(obj);
};

/**
 * Converts an RSA private key to PEM format.
 *
 * @param key the private key.
 * @param maxline the maximum characters per line, defaults to 64.
 *
 * @return the PEM-formatted private key.
 */
pki.privateKeyToPem = function(key, maxline) {
  // convert to ASN.1, then DER, then PEM-encode
  var msg = {
    type: 'RSA PRIVATE KEY',
    body: asn1.toDer(pki.privateKeyToAsn1(key)).getBytes()
  };
  return forge.pem.encode(msg, {maxline: maxline});
};

/**
 * Converts a PrivateKeyInfo to PEM format.
 *
 * @param pki the PrivateKeyInfo.
 * @param maxline the maximum characters per line, defaults to 64.
 *
 * @return the PEM-formatted private key.
 */
pki.privateKeyInfoToPem = function(pki, maxline) {
  // convert to DER, then PEM-encode
  var msg = {
    type: 'PRIVATE KEY',
    body: asn1.toDer(pki).getBytes()
  };
  return forge.pem.encode(msg, {maxline: maxline});
};

},{"./asn1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/asn1.js","./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./oids":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/oids.js","./pbe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pbe.js","./pbkdf2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pbkdf2.js","./pem":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pem.js","./pkcs12":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pkcs12.js","./pss":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pss.js","./rsa":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/rsa.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js","./x509":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/x509.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/prime.js":[function(require,module,exports){
/**
 * Prime number generation API.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2014 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./util');
require('./jsbn');
require('./random');

(function() {

// forge.prime already defined
if(forge.prime) {
  module.exports = forge.prime;
  return;
}

/* PRIME API */
var prime = module.exports = forge.prime = forge.prime || {};

var BigInteger = forge.jsbn.BigInteger;

// primes are 30k+i for i = 1, 7, 11, 13, 17, 19, 23, 29
var GCD_30_DELTA = [6, 4, 2, 4, 2, 4, 6, 2];
var THIRTY = new BigInteger(null);
THIRTY.fromInt(30);
var op_or = function(x, y) {return x|y;};

/**
 * Generates a random probable prime with the given number of bits.
 *
 * Alternative algorithms can be specified by name as a string or as an
 * object with custom options like so:
 *
 * {
 *   name: 'PRIMEINC',
 *   options: {
 *     maxBlockTime: <the maximum amount of time to block the main
 *       thread before allowing I/O other JS to run>,
 *     millerRabinTests: <the number of miller-rabin tests to run>,
 *     workerScript: <the worker script URL>,
 *     workers: <the number of web workers (if supported) to use,
 *       -1 to use estimated cores minus one>.
 *     workLoad: the size of the work load, ie: number of possible prime
 *       numbers for each web worker to check per work assignment,
 *       (default: 100).
 *   }
 * }
 *
 * @param bits the number of bits for the prime number.
 * @param options the options to use.
 *          [algorithm] the algorithm to use (default: 'PRIMEINC').
 *          [prng] a custom crypto-secure pseudo-random number generator to use,
 *            that must define "getBytesSync".
 *
 * @return callback(err, num) called once the operation completes.
 */
prime.generateProbablePrime = function(bits, options, callback) {
  if(typeof options === 'function') {
    callback = options;
    options = {};
  }
  options = options || {};

  // default to PRIMEINC algorithm
  var algorithm = options.algorithm || 'PRIMEINC';
  if(typeof algorithm === 'string') {
    algorithm = {name: algorithm};
  }
  algorithm.options = algorithm.options || {};

  // create prng with api that matches BigInteger secure random
  var prng = options.prng || forge.random;
  var rng = {
    // x is an array to fill with bytes
    nextBytes: function(x) {
      var b = prng.getBytesSync(x.length);
      for(var i = 0; i < x.length; ++i) {
        x[i] = b.charCodeAt(i);
      }
    }
  };

  if(algorithm.name === 'PRIMEINC') {
    return primeincFindPrime(bits, rng, algorithm.options, callback);
  }

  throw new Error('Invalid prime generation algorithm: ' + algorithm.name);
};

function primeincFindPrime(bits, rng, options, callback) {
  if('workers' in options) {
    return primeincFindPrimeWithWorkers(bits, rng, options, callback);
  }
  return primeincFindPrimeWithoutWorkers(bits, rng, options, callback);
}

function primeincFindPrimeWithoutWorkers(bits, rng, options, callback) {
  // initialize random number
  var num = generateRandom(bits, rng);

  /* Note: All primes are of the form 30k+i for i < 30 and gcd(30, i)=1. The
  number we are given is always aligned at 30k + 1. Each time the number is
  determined not to be prime we add to get to the next 'i', eg: if the number
  was at 30k + 1 we add 6. */
  var deltaIdx = 0;

  // get required number of MR tests
  var mrTests = getMillerRabinTests(num.bitLength());
  if('millerRabinTests' in options) {
    mrTests = options.millerRabinTests;
  }

  // find prime nearest to 'num' for maxBlockTime ms
  // 10 ms gives 5ms of leeway for other calculations before dropping
  // below 60fps (1000/60 == 16.67), but in reality, the number will
  // likely be higher due to an 'atomic' big int modPow
  var maxBlockTime = 10;
  if('maxBlockTime' in options) {
    maxBlockTime = options.maxBlockTime;
  }

  _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback);
}

function _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback) {
  var start = +new Date();
  do {
    // overflow, regenerate random number
    if(num.bitLength() > bits) {
      num = generateRandom(bits, rng);
    }
    // do primality test
    if(num.isProbablePrime(mrTests)) {
      return callback(null, num);
    }
    // get next potential prime
    num.dAddOffset(GCD_30_DELTA[deltaIdx++ % 8], 0);
  } while(maxBlockTime < 0 || (+new Date() - start < maxBlockTime));

  // keep trying later
  forge.util.setImmediate(function() {
    _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback);
  });
}

// NOTE: This algorithm is indeterminate in nature because workers
// run in parallel looking at different segments of numbers. Even if this
// algorithm is run twice with the same input from a predictable RNG, it
// may produce different outputs.
function primeincFindPrimeWithWorkers(bits, rng, options, callback) {
  // web workers unavailable
  if(typeof Worker === 'undefined') {
    return primeincFindPrimeWithoutWorkers(bits, rng, options, callback);
  }

  // initialize random number
  var num = generateRandom(bits, rng);

  // use web workers to generate keys
  var numWorkers = options.workers;
  var workLoad = options.workLoad || 100;
  var range = workLoad * 30 / 8;
  var workerScript = options.workerScript || 'forge/prime.worker.js';
  if(numWorkers === -1) {
    return forge.util.estimateCores(function(err, cores) {
      if(err) {
        // default to 2
        cores = 2;
      }
      numWorkers = cores - 1;
      generate();
    });
  }
  generate();

  function generate() {
    // require at least 1 worker
    numWorkers = Math.max(1, numWorkers);

    // TODO: consider optimizing by starting workers outside getPrime() ...
    // note that in order to clean up they will have to be made internally
    // asynchronous which may actually be slower

    // start workers immediately
    var workers = [];
    for(var i = 0; i < numWorkers; ++i) {
      // FIXME: fix path or use blob URLs
      workers[i] = new Worker(workerScript);
    }
    var running = numWorkers;

    // listen for requests from workers and assign ranges to find prime
    for(var i = 0; i < numWorkers; ++i) {
      workers[i].addEventListener('message', workerMessage);
    }

    /* Note: The distribution of random numbers is unknown. Therefore, each
    web worker is continuously allocated a range of numbers to check for a
    random number until one is found.

    Every 30 numbers will be checked just 8 times, because prime numbers
    have the form:

    30k+i, for i < 30 and gcd(30, i)=1 (there are 8 values of i for this)

    Therefore, if we want a web worker to run N checks before asking for
    a new range of numbers, each range must contain N*30/8 numbers.

    For 100 checks (workLoad), this is a range of 375. */

    var found = false;
    function workerMessage(e) {
      // ignore message, prime already found
      if(found) {
        return;
      }

      --running;
      var data = e.data;
      if(data.found) {
        // terminate all workers
        for(var i = 0; i < workers.length; ++i) {
          workers[i].terminate();
        }
        found = true;
        return callback(null, new BigInteger(data.prime, 16));
      }

      // overflow, regenerate random number
      if(num.bitLength() > bits) {
        num = generateRandom(bits, rng);
      }

      // assign new range to check
      var hex = num.toString(16);

      // start prime search
      e.target.postMessage({
        hex: hex,
        workLoad: workLoad
      });

      num.dAddOffset(range, 0);
    }
  }
}

/**
 * Generates a random number using the given number of bits and RNG.
 *
 * @param bits the number of bits for the number.
 * @param rng the random number generator to use.
 *
 * @return the random number.
 */
function generateRandom(bits, rng) {
  var num = new BigInteger(bits, rng);
  // force MSB set
  var bits1 = bits - 1;
  if(!num.testBit(bits1)) {
    num.bitwiseTo(BigInteger.ONE.shiftLeft(bits1), op_or, num);
  }
  // align number on 30k+1 boundary
  num.dAddOffset(31 - num.mod(THIRTY).byteValue(), 0);
  return num;
}

/**
 * Returns the required number of Miller-Rabin tests to generate a
 * prime with an error probability of (1/2)^80.
 *
 * See Handbook of Applied Cryptography Chapter 4, Table 4.4.
 *
 * @param bits the bit size.
 *
 * @return the required number of iterations.
 */
function getMillerRabinTests(bits) {
  if(bits <= 100) return 27;
  if(bits <= 150) return 18;
  if(bits <= 200) return 15;
  if(bits <= 250) return 12;
  if(bits <= 300) return 9;
  if(bits <= 350) return 8;
  if(bits <= 400) return 7;
  if(bits <= 500) return 6;
  if(bits <= 600) return 5;
  if(bits <= 800) return 4;
  if(bits <= 1250) return 3;
  return 2;
}

})();

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./jsbn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/jsbn.js","./random":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/random.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/prng.js":[function(require,module,exports){
(function (process){(function (){
/**
 * A javascript implementation of a cryptographically-secure
 * Pseudo Random Number Generator (PRNG). The Fortuna algorithm is followed
 * here though the use of SHA-256 is not enforced; when generating an
 * a PRNG context, the hashing algorithm and block cipher used for
 * the generator are specified via a plugin.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2014 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./util');

var _crypto = null;
if(forge.util.isNodejs && !forge.options.usePureJavaScript &&
  !process.versions['node-webkit']) {
  _crypto = require('crypto');
}

/* PRNG API */
var prng = module.exports = forge.prng = forge.prng || {};

/**
 * Creates a new PRNG context.
 *
 * A PRNG plugin must be passed in that will provide:
 *
 * 1. A function that initializes the key and seed of a PRNG context. It
 *   will be given a 16 byte key and a 16 byte seed. Any key expansion
 *   or transformation of the seed from a byte string into an array of
 *   integers (or similar) should be performed.
 * 2. The cryptographic function used by the generator. It takes a key and
 *   a seed.
 * 3. A seed increment function. It takes the seed and returns seed + 1.
 * 4. An api to create a message digest.
 *
 * For an example, see random.js.
 *
 * @param plugin the PRNG plugin to use.
 */
prng.create = function(plugin) {
  var ctx = {
    plugin: plugin,
    key: null,
    seed: null,
    time: null,
    // number of reseeds so far
    reseeds: 0,
    // amount of data generated so far
    generated: 0,
    // no initial key bytes
    keyBytes: ''
  };

  // create 32 entropy pools (each is a message digest)
  var md = plugin.md;
  var pools = new Array(32);
  for(var i = 0; i < 32; ++i) {
    pools[i] = md.create();
  }
  ctx.pools = pools;

  // entropy pools are written to cyclically, starting at index 0
  ctx.pool = 0;

  /**
   * Generates random bytes. The bytes may be generated synchronously or
   * asynchronously. Web workers must use the asynchronous interface or
   * else the behavior is undefined.
   *
   * @param count the number of random bytes to generate.
   * @param [callback(err, bytes)] called once the operation completes.
   *
   * @return count random bytes as a string.
   */
  ctx.generate = function(count, callback) {
    // do synchronously
    if(!callback) {
      return ctx.generateSync(count);
    }

    // simple generator using counter-based CBC
    var cipher = ctx.plugin.cipher;
    var increment = ctx.plugin.increment;
    var formatKey = ctx.plugin.formatKey;
    var formatSeed = ctx.plugin.formatSeed;
    var b = forge.util.createBuffer();

    // paranoid deviation from Fortuna:
    // reset key for every request to protect previously
    // generated random bytes should the key be discovered;
    // there is no 100ms based reseeding because of this
    // forced reseed for every `generate` call
    ctx.key = null;

    generate();

    function generate(err) {
      if(err) {
        return callback(err);
      }

      // sufficient bytes generated
      if(b.length() >= count) {
        return callback(null, b.getBytes(count));
      }

      // if amount of data generated is greater than 1 MiB, trigger reseed
      if(ctx.generated > 0xfffff) {
        ctx.key = null;
      }

      if(ctx.key === null) {
        // prevent stack overflow
        return forge.util.nextTick(function() {
          _reseed(generate);
        });
      }

      // generate the random bytes
      var bytes = cipher(ctx.key, ctx.seed);
      ctx.generated += bytes.length;
      b.putBytes(bytes);

      // generate bytes for a new key and seed
      ctx.key = formatKey(cipher(ctx.key, increment(ctx.seed)));
      ctx.seed = formatSeed(cipher(ctx.key, ctx.seed));

      forge.util.setImmediate(generate);
    }
  };

  /**
   * Generates random bytes synchronously.
   *
   * @param count the number of random bytes to generate.
   *
   * @return count random bytes as a string.
   */
  ctx.generateSync = function(count) {
    // simple generator using counter-based CBC
    var cipher = ctx.plugin.cipher;
    var increment = ctx.plugin.increment;
    var formatKey = ctx.plugin.formatKey;
    var formatSeed = ctx.plugin.formatSeed;

    // paranoid deviation from Fortuna:
    // reset key for every request to protect previously
    // generated random bytes should the key be discovered;
    // there is no 100ms based reseeding because of this
    // forced reseed for every `generateSync` call
    ctx.key = null;

    var b = forge.util.createBuffer();
    while(b.length() < count) {
      // if amount of data generated is greater than 1 MiB, trigger reseed
      if(ctx.generated > 0xfffff) {
        ctx.key = null;
      }

      if(ctx.key === null) {
        _reseedSync();
      }

      // generate the random bytes
      var bytes = cipher(ctx.key, ctx.seed);
      ctx.generated += bytes.length;
      b.putBytes(bytes);

      // generate bytes for a new key and seed
      ctx.key = formatKey(cipher(ctx.key, increment(ctx.seed)));
      ctx.seed = formatSeed(cipher(ctx.key, ctx.seed));
    }

    return b.getBytes(count);
  };

  /**
   * Private function that asynchronously reseeds a generator.
   *
   * @param callback(err) called once the operation completes.
   */
  function _reseed(callback) {
    if(ctx.pools[0].messageLength >= 32) {
      _seed();
      return callback();
    }
    // not enough seed data...
    var needed = (32 - ctx.pools[0].messageLength) << 5;
    ctx.seedFile(needed, function(err, bytes) {
      if(err) {
        return callback(err);
      }
      ctx.collect(bytes);
      _seed();
      callback();
    });
  }

  /**
   * Private function that synchronously reseeds a generator.
   */
  function _reseedSync() {
    if(ctx.pools[0].messageLength >= 32) {
      return _seed();
    }
    // not enough seed data...
    var needed = (32 - ctx.pools[0].messageLength) << 5;
    ctx.collect(ctx.seedFileSync(needed));
    _seed();
  }

  /**
   * Private function that seeds a generator once enough bytes are available.
   */
  function _seed() {
    // update reseed count
    ctx.reseeds = (ctx.reseeds === 0xffffffff) ? 0 : ctx.reseeds + 1;

    // goal is to update `key` via:
    // key = hash(key + s)
    //   where 's' is all collected entropy from selected pools, then...

    // create a plugin-based message digest
    var md = ctx.plugin.md.create();

    // consume current key bytes
    md.update(ctx.keyBytes);

    // digest the entropy of pools whose index k meet the
    // condition 'n mod 2^k == 0' where n is the number of reseeds
    var _2powK = 1;
    for(var k = 0; k < 32; ++k) {
      if(ctx.reseeds % _2powK === 0) {
        md.update(ctx.pools[k].digest().getBytes());
        ctx.pools[k].start();
      }
      _2powK = _2powK << 1;
    }

    // get digest for key bytes
    ctx.keyBytes = md.digest().getBytes();

    // paranoid deviation from Fortuna:
    // update `seed` via `seed = hash(key)`
    // instead of initializing to zero once and only
    // ever incrementing it
    md.start();
    md.update(ctx.keyBytes);
    var seedBytes = md.digest().getBytes();

    // update state
    ctx.key = ctx.plugin.formatKey(ctx.keyBytes);
    ctx.seed = ctx.plugin.formatSeed(seedBytes);
    ctx.generated = 0;
  }

  /**
   * The built-in default seedFile. This seedFile is used when entropy
   * is needed immediately.
   *
   * @param needed the number of bytes that are needed.
   *
   * @return the random bytes.
   */
  function defaultSeedFile(needed) {
    // use window.crypto.getRandomValues strong source of entropy if available
    var getRandomValues = null;
    var globalScope = forge.util.globalScope;
    var _crypto = globalScope.crypto || globalScope.msCrypto;
    if(_crypto && _crypto.getRandomValues) {
      getRandomValues = function(arr) {
        return _crypto.getRandomValues(arr);
      };
    }

    var b = forge.util.createBuffer();
    if(getRandomValues) {
      while(b.length() < needed) {
        // max byte length is 65536 before QuotaExceededError is thrown
        // http://www.w3.org/TR/WebCryptoAPI/#RandomSource-method-getRandomValues
        var count = Math.max(1, Math.min(needed - b.length(), 65536) / 4);
        var entropy = new Uint32Array(Math.floor(count));
        try {
          getRandomValues(entropy);
          for(var i = 0; i < entropy.length; ++i) {
            b.putInt32(entropy[i]);
          }
        } catch(e) {
          /* only ignore QuotaExceededError */
          if(!(typeof QuotaExceededError !== 'undefined' &&
            e instanceof QuotaExceededError)) {
            throw e;
          }
        }
      }
    }

    // be sad and add some weak random data
    if(b.length() < needed) {
      /* Draws from Park-Miller "minimal standard" 31 bit PRNG,
      implemented with David G. Carta's optimization: with 32 bit math
      and without division (Public Domain). */
      var hi, lo, next;
      var seed = Math.floor(Math.random() * 0x010000);
      while(b.length() < needed) {
        lo = 16807 * (seed & 0xFFFF);
        hi = 16807 * (seed >> 16);
        lo += (hi & 0x7FFF) << 16;
        lo += hi >> 15;
        lo = (lo & 0x7FFFFFFF) + (lo >> 31);
        seed = lo & 0xFFFFFFFF;

        // consume lower 3 bytes of seed
        for(var i = 0; i < 3; ++i) {
          // throw in more pseudo random
          next = seed >>> (i << 3);
          next ^= Math.floor(Math.random() * 0x0100);
          b.putByte(String.fromCharCode(next & 0xFF));
        }
      }
    }

    return b.getBytes(needed);
  }
  // initialize seed file APIs
  if(_crypto) {
    // use nodejs async API
    ctx.seedFile = function(needed, callback) {
      _crypto.randomBytes(needed, function(err, bytes) {
        if(err) {
          return callback(err);
        }
        callback(null, bytes.toString());
      });
    };
    // use nodejs sync API
    ctx.seedFileSync = function(needed) {
      return _crypto.randomBytes(needed).toString();
    };
  } else {
    ctx.seedFile = function(needed, callback) {
      try {
        callback(null, defaultSeedFile(needed));
      } catch(e) {
        callback(e);
      }
    };
    ctx.seedFileSync = defaultSeedFile;
  }

  /**
   * Adds entropy to a prng ctx's accumulator.
   *
   * @param bytes the bytes of entropy as a string.
   */
  ctx.collect = function(bytes) {
    // iterate over pools distributing entropy cyclically
    var count = bytes.length;
    for(var i = 0; i < count; ++i) {
      ctx.pools[ctx.pool].update(bytes.substr(i, 1));
      ctx.pool = (ctx.pool === 31) ? 0 : ctx.pool + 1;
    }
  };

  /**
   * Collects an integer of n bits.
   *
   * @param i the integer entropy.
   * @param n the number of bits in the integer.
   */
  ctx.collectInt = function(i, n) {
    var bytes = '';
    for(var x = 0; x < n; x += 8) {
      bytes += String.fromCharCode((i >> x) & 0xFF);
    }
    ctx.collect(bytes);
  };

  /**
   * Registers a Web Worker to receive immediate entropy from the main thread.
   * This method is required until Web Workers can access the native crypto
   * API. This method should be called twice for each created worker, once in
   * the main thread, and once in the worker itself.
   *
   * @param worker the worker to register.
   */
  ctx.registerWorker = function(worker) {
    // worker receives random bytes
    if(worker === self) {
      ctx.seedFile = function(needed, callback) {
        function listener(e) {
          var data = e.data;
          if(data.forge && data.forge.prng) {
            self.removeEventListener('message', listener);
            callback(data.forge.prng.err, data.forge.prng.bytes);
          }
        }
        self.addEventListener('message', listener);
        self.postMessage({forge: {prng: {needed: needed}}});
      };
    } else {
      // main thread sends random bytes upon request
      var listener = function(e) {
        var data = e.data;
        if(data.forge && data.forge.prng) {
          ctx.seedFile(data.forge.prng.needed, function(err, bytes) {
            worker.postMessage({forge: {prng: {err: err, bytes: bytes}}});
          });
        }
      };
      // TODO: do we need to remove the event listener when the worker dies?
      worker.addEventListener('message', listener);
    }
  };

  return ctx;
};

}).call(this)}).call(this,require('_process'))
},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js","_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","crypto":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browser-resolve/empty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pss.js":[function(require,module,exports){
/**
 * Javascript implementation of PKCS#1 PSS signature padding.
 *
 * @author Stefan Siegl
 *
 * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>
 */
var forge = require('./forge');
require('./random');
require('./util');

// shortcut for PSS API
var pss = module.exports = forge.pss = forge.pss || {};

/**
 * Creates a PSS signature scheme object.
 *
 * There are several ways to provide a salt for encoding:
 *
 * 1. Specify the saltLength only and the built-in PRNG will generate it.
 * 2. Specify the saltLength and a custom PRNG with 'getBytesSync' defined that
 *   will be used.
 * 3. Specify the salt itself as a forge.util.ByteBuffer.
 *
 * @param options the options to use:
 *          md the message digest object to use, a forge md instance.
 *          mgf the mask generation function to use, a forge mgf instance.
 *          [saltLength] the length of the salt in octets.
 *          [prng] the pseudo-random number generator to use to produce a salt.
 *          [salt] the salt to use when encoding.
 *
 * @return a signature scheme object.
 */
pss.create = function(options) {
  // backwards compatibility w/legacy args: hash, mgf, sLen
  if(arguments.length === 3) {
    options = {
      md: arguments[0],
      mgf: arguments[1],
      saltLength: arguments[2]
    };
  }

  var hash = options.md;
  var mgf = options.mgf;
  var hLen = hash.digestLength;

  var salt_ = options.salt || null;
  if(typeof salt_ === 'string') {
    // assume binary-encoded string
    salt_ = forge.util.createBuffer(salt_);
  }

  var sLen;
  if('saltLength' in options) {
    sLen = options.saltLength;
  } else if(salt_ !== null) {
    sLen = salt_.length();
  } else {
    throw new Error('Salt length not specified or specific salt not given.');
  }

  if(salt_ !== null && salt_.length() !== sLen) {
    throw new Error('Given salt length does not match length of given salt.');
  }

  var prng = options.prng || forge.random;

  var pssobj = {};

  /**
   * Encodes a PSS signature.
   *
   * This function implements EMSA-PSS-ENCODE as per RFC 3447, section 9.1.1.
   *
   * @param md the message digest object with the hash to sign.
   * @param modsBits the length of the RSA modulus in bits.
   *
   * @return the encoded message as a binary-encoded string of length
   *           ceil((modBits - 1) / 8).
   */
  pssobj.encode = function(md, modBits) {
    var i;
    var emBits = modBits - 1;
    var emLen = Math.ceil(emBits / 8);

    /* 2. Let mHash = Hash(M), an octet string of length hLen. */
    var mHash = md.digest().getBytes();

    /* 3. If emLen < hLen + sLen + 2, output "encoding error" and stop. */
    if(emLen < hLen + sLen + 2) {
      throw new Error('Message is too long to encrypt.');
    }

    /* 4. Generate a random octet string salt of length sLen; if sLen = 0,
     *    then salt is the empty string. */
    var salt;
    if(salt_ === null) {
      salt = prng.getBytesSync(sLen);
    } else {
      salt = salt_.bytes();
    }

    /* 5. Let M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt; */
    var m_ = new forge.util.ByteBuffer();
    m_.fillWithByte(0, 8);
    m_.putBytes(mHash);
    m_.putBytes(salt);

    /* 6. Let H = Hash(M'), an octet string of length hLen. */
    hash.start();
    hash.update(m_.getBytes());
    var h = hash.digest().getBytes();

    /* 7. Generate an octet string PS consisting of emLen - sLen - hLen - 2
     *    zero octets.  The length of PS may be 0. */
    var ps = new forge.util.ByteBuffer();
    ps.fillWithByte(0, emLen - sLen - hLen - 2);

    /* 8. Let DB = PS || 0x01 || salt; DB is an octet string of length
     *    emLen - hLen - 1. */
    ps.putByte(0x01);
    ps.putBytes(salt);
    var db = ps.getBytes();

    /* 9. Let dbMask = MGF(H, emLen - hLen - 1). */
    var maskLen = emLen - hLen - 1;
    var dbMask = mgf.generate(h, maskLen);

    /* 10. Let maskedDB = DB \xor dbMask. */
    var maskedDB = '';
    for(i = 0; i < maskLen; i++) {
      maskedDB += String.fromCharCode(db.charCodeAt(i) ^ dbMask.charCodeAt(i));
    }

    /* 11. Set the leftmost 8emLen - emBits bits of the leftmost octet in
     *     maskedDB to zero. */
    var mask = (0xFF00 >> (8 * emLen - emBits)) & 0xFF;
    maskedDB = String.fromCharCode(maskedDB.charCodeAt(0) & ~mask) +
      maskedDB.substr(1);

    /* 12. Let EM = maskedDB || H || 0xbc.
     * 13. Output EM. */
    return maskedDB + h + String.fromCharCode(0xbc);
  };

  /**
   * Verifies a PSS signature.
   *
   * This function implements EMSA-PSS-VERIFY as per RFC 3447, section 9.1.2.
   *
   * @param mHash the message digest hash, as a binary-encoded string, to
   *         compare against the signature.
   * @param em the encoded message, as a binary-encoded string
   *          (RSA decryption result).
   * @param modsBits the length of the RSA modulus in bits.
   *
   * @return true if the signature was verified, false if not.
   */
  pssobj.verify = function(mHash, em, modBits) {
    var i;
    var emBits = modBits - 1;
    var emLen = Math.ceil(emBits / 8);

    /* c. Convert the message representative m to an encoded message EM
     *    of length emLen = ceil((modBits - 1) / 8) octets, where modBits
     *    is the length in bits of the RSA modulus n */
    em = em.substr(-emLen);

    /* 3. If emLen < hLen + sLen + 2, output "inconsistent" and stop. */
    if(emLen < hLen + sLen + 2) {
      throw new Error('Inconsistent parameters to PSS signature verification.');
    }

    /* 4. If the rightmost octet of EM does not have hexadecimal value
     *    0xbc, output "inconsistent" and stop. */
    if(em.charCodeAt(emLen - 1) !== 0xbc) {
      throw new Error('Encoded message does not end in 0xBC.');
    }

    /* 5. Let maskedDB be the leftmost emLen - hLen - 1 octets of EM, and
     *    let H be the next hLen octets. */
    var maskLen = emLen - hLen - 1;
    var maskedDB = em.substr(0, maskLen);
    var h = em.substr(maskLen, hLen);

    /* 6. If the leftmost 8emLen - emBits bits of the leftmost octet in
     *    maskedDB are not all equal to zero, output "inconsistent" and stop. */
    var mask = (0xFF00 >> (8 * emLen - emBits)) & 0xFF;
    if((maskedDB.charCodeAt(0) & mask) !== 0) {
      throw new Error('Bits beyond keysize not zero as expected.');
    }

    /* 7. Let dbMask = MGF(H, emLen - hLen - 1). */
    var dbMask = mgf.generate(h, maskLen);

    /* 8. Let DB = maskedDB \xor dbMask. */
    var db = '';
    for(i = 0; i < maskLen; i++) {
      db += String.fromCharCode(maskedDB.charCodeAt(i) ^ dbMask.charCodeAt(i));
    }

    /* 9. Set the leftmost 8emLen - emBits bits of the leftmost octet
     * in DB to zero. */
    db = String.fromCharCode(db.charCodeAt(0) & ~mask) + db.substr(1);

    /* 10. If the emLen - hLen - sLen - 2 leftmost octets of DB are not zero
     * or if the octet at position emLen - hLen - sLen - 1 (the leftmost
     * position is "position 1") does not have hexadecimal value 0x01,
     * output "inconsistent" and stop. */
    var checkLen = emLen - hLen - sLen - 2;
    for(i = 0; i < checkLen; i++) {
      if(db.charCodeAt(i) !== 0x00) {
        throw new Error('Leftmost octets not zero as expected');
      }
    }

    if(db.charCodeAt(checkLen) !== 0x01) {
      throw new Error('Inconsistent PSS signature, 0x01 marker not found');
    }

    /* 11. Let salt be the last sLen octets of DB. */
    var salt = db.substr(-sLen);

    /* 12.  Let M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt */
    var m_ = new forge.util.ByteBuffer();
    m_.fillWithByte(0, 8);
    m_.putBytes(mHash);
    m_.putBytes(salt);

    /* 13. Let H' = Hash(M'), an octet string of length hLen. */
    hash.start();
    hash.update(m_.getBytes());
    var h_ = hash.digest().getBytes();

    /* 14. If H = H', output "consistent." Otherwise, output "inconsistent." */
    return h === h_;
  };

  return pssobj;
};

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./random":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/random.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/random.js":[function(require,module,exports){
/**
 * An API for getting cryptographically-secure random bytes. The bytes are
 * generated using the Fortuna algorithm devised by Bruce Schneier and
 * Niels Ferguson.
 *
 * Getting strong random bytes is not yet easy to do in javascript. The only
 * truish random entropy that can be collected is from the mouse, keyboard, or
 * from timing with respect to page loads, etc. This generator makes a poor
 * attempt at providing random bytes when those sources haven't yet provided
 * enough entropy to initially seed or to reseed the PRNG.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2009-2014 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./aes');
require('./sha256');
require('./prng');
require('./util');

(function() {

// forge.random already defined
if(forge.random && forge.random.getBytes) {
  module.exports = forge.random;
  return;
}

(function(jQuery) {

// the default prng plugin, uses AES-128
var prng_aes = {};
var _prng_aes_output = new Array(4);
var _prng_aes_buffer = forge.util.createBuffer();
prng_aes.formatKey = function(key) {
  // convert the key into 32-bit integers
  var tmp = forge.util.createBuffer(key);
  key = new Array(4);
  key[0] = tmp.getInt32();
  key[1] = tmp.getInt32();
  key[2] = tmp.getInt32();
  key[3] = tmp.getInt32();

  // return the expanded key
  return forge.aes._expandKey(key, false);
};
prng_aes.formatSeed = function(seed) {
  // convert seed into 32-bit integers
  var tmp = forge.util.createBuffer(seed);
  seed = new Array(4);
  seed[0] = tmp.getInt32();
  seed[1] = tmp.getInt32();
  seed[2] = tmp.getInt32();
  seed[3] = tmp.getInt32();
  return seed;
};
prng_aes.cipher = function(key, seed) {
  forge.aes._updateBlock(key, seed, _prng_aes_output, false);
  _prng_aes_buffer.putInt32(_prng_aes_output[0]);
  _prng_aes_buffer.putInt32(_prng_aes_output[1]);
  _prng_aes_buffer.putInt32(_prng_aes_output[2]);
  _prng_aes_buffer.putInt32(_prng_aes_output[3]);
  return _prng_aes_buffer.getBytes();
};
prng_aes.increment = function(seed) {
  // FIXME: do we care about carry or signed issues?
  ++seed[3];
  return seed;
};
prng_aes.md = forge.md.sha256;

/**
 * Creates a new PRNG.
 */
function spawnPrng() {
  var ctx = forge.prng.create(prng_aes);

  /**
   * Gets random bytes. If a native secure crypto API is unavailable, this
   * method tries to make the bytes more unpredictable by drawing from data that
   * can be collected from the user of the browser, eg: mouse movement.
   *
   * If a callback is given, this method will be called asynchronously.
   *
   * @param count the number of random bytes to get.
   * @param [callback(err, bytes)] called once the operation completes.
   *
   * @return the random bytes in a string.
   */
  ctx.getBytes = function(count, callback) {
    return ctx.generate(count, callback);
  };

  /**
   * Gets random bytes asynchronously. If a native secure crypto API is
   * unavailable, this method tries to make the bytes more unpredictable by
   * drawing from data that can be collected from the user of the browser,
   * eg: mouse movement.
   *
   * @param count the number of random bytes to get.
   *
   * @return the random bytes in a string.
   */
  ctx.getBytesSync = function(count) {
    return ctx.generate(count);
  };

  return ctx;
}

// create default prng context
var _ctx = spawnPrng();

// add other sources of entropy only if window.crypto.getRandomValues is not
// available -- otherwise this source will be automatically used by the prng
var getRandomValues = null;
var globalScope = forge.util.globalScope;
var _crypto = globalScope.crypto || globalScope.msCrypto;
if(_crypto && _crypto.getRandomValues) {
  getRandomValues = function(arr) {
    return _crypto.getRandomValues(arr);
  };
}

if(forge.options.usePureJavaScript ||
  (!forge.util.isNodejs && !getRandomValues)) {
  // if this is a web worker, do not use weak entropy, instead register to
  // receive strong entropy asynchronously from the main thread
  if(typeof window === 'undefined' || window.document === undefined) {
    // FIXME:
  }

  // get load time entropy
  _ctx.collectInt(+new Date(), 32);

  // add some entropy from navigator object
  if(typeof(navigator) !== 'undefined') {
    var _navBytes = '';
    for(var key in navigator) {
      try {
        if(typeof(navigator[key]) == 'string') {
          _navBytes += navigator[key];
        }
      } catch(e) {
        /* Some navigator keys might not be accessible, e.g. the geolocation
          attribute throws an exception if touched in Mozilla chrome://
          context.

          Silently ignore this and just don't use this as a source of
          entropy. */
      }
    }
    _ctx.collect(_navBytes);
    _navBytes = null;
  }

  // add mouse and keyboard collectors if jquery is available
  if(jQuery) {
    // set up mouse entropy capture
    jQuery().mousemove(function(e) {
      // add mouse coords
      _ctx.collectInt(e.clientX, 16);
      _ctx.collectInt(e.clientY, 16);
    });

    // set up keyboard entropy capture
    jQuery().keypress(function(e) {
      _ctx.collectInt(e.charCode, 8);
    });
  }
}

/* Random API */
if(!forge.random) {
  forge.random = _ctx;
} else {
  // extend forge.random with _ctx
  for(var key in _ctx) {
    forge.random[key] = _ctx[key];
  }
}

// expose spawn PRNG
forge.random.createInstance = spawnPrng;

module.exports = forge.random;

})(typeof(jQuery) !== 'undefined' ? jQuery : null);

})();

},{"./aes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/aes.js","./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./prng":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/prng.js","./sha256":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/sha256.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/rc2.js":[function(require,module,exports){
/**
 * RC2 implementation.
 *
 * @author Stefan Siegl
 *
 * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>
 *
 * Information on the RC2 cipher is available from RFC #2268,
 * http://www.ietf.org/rfc/rfc2268.txt
 */
var forge = require('./forge');
require('./util');

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

var s = [1, 2, 3, 5];

/**
 * Rotate a word left by given number of bits.
 *
 * Bits that are shifted out on the left are put back in on the right
 * hand side.
 *
 * @param word The word to shift left.
 * @param bits The number of bits to shift by.
 * @return The rotated word.
 */
var rol = function(word, bits) {
  return ((word << bits) & 0xffff) | ((word & 0xffff) >> (16 - bits));
};

/**
 * Rotate a word right by given number of bits.
 *
 * Bits that are shifted out on the right are put back in on the left
 * hand side.
 *
 * @param word The word to shift right.
 * @param bits The number of bits to shift by.
 * @return The rotated word.
 */
var ror = function(word, bits) {
  return ((word & 0xffff) >> bits) | ((word << (16 - bits)) & 0xffff);
};

/* RC2 API */
module.exports = forge.rc2 = forge.rc2 || {};

/**
 * Perform RC2 key expansion as per RFC #2268, section 2.
 *
 * @param key variable-length user key (between 1 and 128 bytes)
 * @param effKeyBits number of effective key bits (default: 128)
 * @return the expanded RC2 key (ByteBuffer of 128 bytes)
 */
forge.rc2.expandKey = function(key, effKeyBits) {
  if(typeof key === 'string') {
    key = forge.util.createBuffer(key);
  }
  effKeyBits = effKeyBits || 128;

  /* introduce variables that match the names used in RFC #2268 */
  var L = key;
  var T = key.length();
  var T1 = effKeyBits;
  var T8 = Math.ceil(T1 / 8);
  var TM = 0xff >> (T1 & 0x07);
  var i;

  for(i = T; i < 128; i++) {
    L.putByte(piTable[(L.at(i - 1) + L.at(i - T)) & 0xff]);
  }

  L.setAt(128 - T8, piTable[L.at(128 - T8) & TM]);

  for(i = 127 - T8; i >= 0; i--) {
    L.setAt(i, piTable[L.at(i + 1) ^ L.at(i + T8)]);
  }

  return L;
};

/**
 * Creates a RC2 cipher object.
 *
 * @param key the symmetric key to use (as base for key generation).
 * @param bits the number of effective key bits.
 * @param encrypt false for decryption, true for encryption.
 *
 * @return the cipher.
 */
var createCipher = function(key, bits, encrypt) {
  var _finish = false, _input = null, _output = null, _iv = null;
  var mixRound, mashRound;
  var i, j, K = [];

  /* Expand key and fill into K[] Array */
  key = forge.rc2.expandKey(key, bits);
  for(i = 0; i < 64; i++) {
    K.push(key.getInt16Le());
  }

  if(encrypt) {
    /**
     * Perform one mixing round "in place".
     *
     * @param R Array of four words to perform mixing on.
     */
    mixRound = function(R) {
      for(i = 0; i < 4; i++) {
        R[i] += K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) +
          ((~R[(i + 3) % 4]) & R[(i + 1) % 4]);
        R[i] = rol(R[i], s[i]);
        j++;
      }
    };

    /**
     * Perform one mashing round "in place".
     *
     * @param R Array of four words to perform mashing on.
     */
    mashRound = function(R) {
      for(i = 0; i < 4; i++) {
        R[i] += K[R[(i + 3) % 4] & 63];
      }
    };
  } else {
    /**
     * Perform one r-mixing round "in place".
     *
     * @param R Array of four words to perform mixing on.
     */
    mixRound = function(R) {
      for(i = 3; i >= 0; i--) {
        R[i] = ror(R[i], s[i]);
        R[i] -= K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) +
          ((~R[(i + 3) % 4]) & R[(i + 1) % 4]);
        j--;
      }
    };

    /**
     * Perform one r-mashing round "in place".
     *
     * @param R Array of four words to perform mashing on.
     */
    mashRound = function(R) {
      for(i = 3; i >= 0; i--) {
        R[i] -= K[R[(i + 3) % 4] & 63];
      }
    };
  }

  /**
   * Run the specified cipher execution plan.
   *
   * This function takes four words from the input buffer, applies the IV on
   * it (if requested) and runs the provided execution plan.
   *
   * The plan must be put together in form of a array of arrays.  Where the
   * outer one is simply a list of steps to perform and the inner one needs
   * to have two elements: the first one telling how many rounds to perform,
   * the second one telling what to do (i.e. the function to call).
   *
   * @param {Array} plan The plan to execute.
   */
  var runPlan = function(plan) {
    var R = [];

    /* Get data from input buffer and fill the four words into R */
    for(i = 0; i < 4; i++) {
      var val = _input.getInt16Le();

      if(_iv !== null) {
        if(encrypt) {
          /* We're encrypting, apply the IV first. */
          val ^= _iv.getInt16Le();
        } else {
          /* We're decryption, keep cipher text for next block. */
          _iv.putInt16Le(val);
        }
      }

      R.push(val & 0xffff);
    }

    /* Reset global "j" variable as per spec. */
    j = encrypt ? 0 : 63;

    /* Run execution plan. */
    for(var ptr = 0; ptr < plan.length; ptr++) {
      for(var ctr = 0; ctr < plan[ptr][0]; ctr++) {
        plan[ptr][1](R);
      }
    }

    /* Write back result to output buffer. */
    for(i = 0; i < 4; i++) {
      if(_iv !== null) {
        if(encrypt) {
          /* We're encrypting in CBC-mode, feed back encrypted bytes into
             IV buffer to carry it forward to next block. */
          _iv.putInt16Le(R[i]);
        } else {
          R[i] ^= _iv.getInt16Le();
        }
      }

      _output.putInt16Le(R[i]);
    }
  };

  /* Create cipher object */
  var cipher = null;
  cipher = {
    /**
     * Starts or restarts the encryption or decryption process, whichever
     * was previously configured.
     *
     * To use the cipher in CBC mode, iv may be given either as a string
     * of bytes, or as a byte buffer.  For ECB mode, give null as iv.
     *
     * @param iv the initialization vector to use, null for ECB mode.
     * @param output the output the buffer to write to, null to create one.
     */
    start: function(iv, output) {
      if(iv) {
        /* CBC mode */
        if(typeof iv === 'string') {
          iv = forge.util.createBuffer(iv);
        }
      }

      _finish = false;
      _input = forge.util.createBuffer();
      _output = output || new forge.util.createBuffer();
      _iv = iv;

      cipher.output = _output;
    },

    /**
     * Updates the next block.
     *
     * @param input the buffer to read from.
     */
    update: function(input) {
      if(!_finish) {
        // not finishing, so fill the input buffer with more input
        _input.putBuffer(input);
      }

      while(_input.length() >= 8) {
        runPlan([
            [ 5, mixRound ],
            [ 1, mashRound ],
            [ 6, mixRound ],
            [ 1, mashRound ],
            [ 5, mixRound ]
          ]);
      }
    },

    /**
     * Finishes encrypting or decrypting.
     *
     * @param pad a padding function to use, null for PKCS#7 padding,
     *           signature(blockSize, buffer, decrypt).
     *
     * @return true if successful, false on error.
     */
    finish: function(pad) {
      var rval = true;

      if(encrypt) {
        if(pad) {
          rval = pad(8, _input, !encrypt);
        } else {
          // add PKCS#7 padding to block (each pad byte is the
          // value of the number of pad bytes)
          var padding = (_input.length() === 8) ? 8 : (8 - _input.length());
          _input.fillWithByte(padding, padding);
        }
      }

      if(rval) {
        // do final update
        _finish = true;
        cipher.update();
      }

      if(!encrypt) {
        // check for error: input data not a multiple of block size
        rval = (_input.length() === 0);
        if(rval) {
          if(pad) {
            rval = pad(8, _output, !encrypt);
          } else {
            // ensure padding byte count is valid
            var len = _output.length();
            var count = _output.at(len - 1);

            if(count > len) {
              rval = false;
            } else {
              // trim off padding bytes
              _output.truncate(count);
            }
          }
        }
      }

      return rval;
    }
  };

  return cipher;
};

/**
 * Creates an RC2 cipher object to encrypt data in ECB or CBC mode using the
 * given symmetric key. The output will be stored in the 'output' member
 * of the returned cipher.
 *
 * The key and iv may be given as a string of bytes or a byte buffer.
 * The cipher is initialized to use 128 effective key bits.
 *
 * @param key the symmetric key to use.
 * @param iv the initialization vector to use.
 * @param output the buffer to write to, null to create one.
 *
 * @return the cipher.
 */
forge.rc2.startEncrypting = function(key, iv, output) {
  var cipher = forge.rc2.createEncryptionCipher(key, 128);
  cipher.start(iv, output);
  return cipher;
};

/**
 * Creates an RC2 cipher object to encrypt data in ECB or CBC mode using the
 * given symmetric key.
 *
 * The key may be given as a string of bytes or a byte buffer.
 *
 * To start encrypting call start() on the cipher with an iv and optional
 * output buffer.
 *
 * @param key the symmetric key to use.
 *
 * @return the cipher.
 */
forge.rc2.createEncryptionCipher = function(key, bits) {
  return createCipher(key, bits, true);
};

/**
 * Creates an RC2 cipher object to decrypt data in ECB or CBC mode using the
 * given symmetric key. The output will be stored in the 'output' member
 * of the returned cipher.
 *
 * The key and iv may be given as a string of bytes or a byte buffer.
 * The cipher is initialized to use 128 effective key bits.
 *
 * @param key the symmetric key to use.
 * @param iv the initialization vector to use.
 * @param output the buffer to write to, null to create one.
 *
 * @return the cipher.
 */
forge.rc2.startDecrypting = function(key, iv, output) {
  var cipher = forge.rc2.createDecryptionCipher(key, 128);
  cipher.start(iv, output);
  return cipher;
};

/**
 * Creates an RC2 cipher object to decrypt data in ECB or CBC mode using the
 * given symmetric key.
 *
 * The key may be given as a string of bytes or a byte buffer.
 *
 * To start decrypting call start() on the cipher with an iv and optional
 * output buffer.
 *
 * @param key the symmetric key to use.
 *
 * @return the cipher.
 */
forge.rc2.createDecryptionCipher = function(key, bits) {
  return createCipher(key, bits, false);
};

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/rsa.js":[function(require,module,exports){
/**
 * Javascript implementation of basic RSA algorithms.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2014 Digital Bazaar, Inc.
 *
 * The only algorithm currently supported for PKI is RSA.
 *
 * An RSA key is often stored in ASN.1 DER format. The SubjectPublicKeyInfo
 * ASN.1 structure is composed of an algorithm of type AlgorithmIdentifier
 * and a subjectPublicKey of type bit string.
 *
 * The AlgorithmIdentifier contains an Object Identifier (OID) and parameters
 * for the algorithm, if any. In the case of RSA, there aren't any.
 *
 * SubjectPublicKeyInfo ::= SEQUENCE {
 *   algorithm AlgorithmIdentifier,
 *   subjectPublicKey BIT STRING
 * }
 *
 * AlgorithmIdentifer ::= SEQUENCE {
 *   algorithm OBJECT IDENTIFIER,
 *   parameters ANY DEFINED BY algorithm OPTIONAL
 * }
 *
 * For an RSA public key, the subjectPublicKey is:
 *
 * RSAPublicKey ::= SEQUENCE {
 *   modulus            INTEGER,    -- n
 *   publicExponent     INTEGER     -- e
 * }
 *
 * PrivateKeyInfo ::= SEQUENCE {
 *   version                   Version,
 *   privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,
 *   privateKey                PrivateKey,
 *   attributes           [0]  IMPLICIT Attributes OPTIONAL
 * }
 *
 * Version ::= INTEGER
 * PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
 * PrivateKey ::= OCTET STRING
 * Attributes ::= SET OF Attribute
 *
 * An RSA private key as the following structure:
 *
 * RSAPrivateKey ::= SEQUENCE {
 *   version Version,
 *   modulus INTEGER, -- n
 *   publicExponent INTEGER, -- e
 *   privateExponent INTEGER, -- d
 *   prime1 INTEGER, -- p
 *   prime2 INTEGER, -- q
 *   exponent1 INTEGER, -- d mod (p-1)
 *   exponent2 INTEGER, -- d mod (q-1)
 *   coefficient INTEGER -- (inverse of q) mod p
 * }
 *
 * Version ::= INTEGER
 *
 * The OID for the RSA key algorithm is: 1.2.840.113549.1.1.1
 */
var forge = require('./forge');
require('./asn1');
require('./jsbn');
require('./oids');
require('./pkcs1');
require('./prime');
require('./random');
require('./util');

if(typeof BigInteger === 'undefined') {
  var BigInteger = forge.jsbn.BigInteger;
}

var _crypto = forge.util.isNodejs ? require('crypto') : null;

// shortcut for asn.1 API
var asn1 = forge.asn1;

// shortcut for util API
var util = forge.util;

/*
 * RSA encryption and decryption, see RFC 2313.
 */
forge.pki = forge.pki || {};
module.exports = forge.pki.rsa = forge.rsa = forge.rsa || {};
var pki = forge.pki;

// for finding primes, which are 30k+i for i = 1, 7, 11, 13, 17, 19, 23, 29
var GCD_30_DELTA = [6, 4, 2, 4, 2, 4, 6, 2];

// validator for a PrivateKeyInfo structure
var privateKeyValidator = {
  // PrivateKeyInfo
  name: 'PrivateKeyInfo',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    // Version (INTEGER)
    name: 'PrivateKeyInfo.version',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'privateKeyVersion'
  }, {
    // privateKeyAlgorithm
    name: 'PrivateKeyInfo.privateKeyAlgorithm',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    value: [{
      name: 'AlgorithmIdentifier.algorithm',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.OID,
      constructed: false,
      capture: 'privateKeyOid'
    }]
  }, {
    // PrivateKey
    name: 'PrivateKeyInfo',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.OCTETSTRING,
    constructed: false,
    capture: 'privateKey'
  }]
};

// validator for an RSA private key
var rsaPrivateKeyValidator = {
  // RSAPrivateKey
  name: 'RSAPrivateKey',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    // Version (INTEGER)
    name: 'RSAPrivateKey.version',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'privateKeyVersion'
  }, {
    // modulus (n)
    name: 'RSAPrivateKey.modulus',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'privateKeyModulus'
  }, {
    // publicExponent (e)
    name: 'RSAPrivateKey.publicExponent',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'privateKeyPublicExponent'
  }, {
    // privateExponent (d)
    name: 'RSAPrivateKey.privateExponent',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'privateKeyPrivateExponent'
  }, {
    // prime1 (p)
    name: 'RSAPrivateKey.prime1',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'privateKeyPrime1'
  }, {
    // prime2 (q)
    name: 'RSAPrivateKey.prime2',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'privateKeyPrime2'
  }, {
    // exponent1 (d mod (p-1))
    name: 'RSAPrivateKey.exponent1',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'privateKeyExponent1'
  }, {
    // exponent2 (d mod (q-1))
    name: 'RSAPrivateKey.exponent2',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'privateKeyExponent2'
  }, {
    // coefficient ((inverse of q) mod p)
    name: 'RSAPrivateKey.coefficient',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'privateKeyCoefficient'
  }]
};

// validator for an RSA public key
var rsaPublicKeyValidator = {
  // RSAPublicKey
  name: 'RSAPublicKey',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    // modulus (n)
    name: 'RSAPublicKey.modulus',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'publicKeyModulus'
  }, {
    // publicExponent (e)
    name: 'RSAPublicKey.exponent',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'publicKeyExponent'
  }]
};

// validator for an SubjectPublicKeyInfo structure
// Note: Currently only works with an RSA public key
var publicKeyValidator = forge.pki.rsa.publicKeyValidator = {
  name: 'SubjectPublicKeyInfo',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  captureAsn1: 'subjectPublicKeyInfo',
  value: [{
    name: 'SubjectPublicKeyInfo.AlgorithmIdentifier',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    value: [{
      name: 'AlgorithmIdentifier.algorithm',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.OID,
      constructed: false,
      capture: 'publicKeyOid'
    }]
  }, {
    // subjectPublicKey
    name: 'SubjectPublicKeyInfo.subjectPublicKey',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.BITSTRING,
    constructed: false,
    value: [{
      // RSAPublicKey
      name: 'SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,
      constructed: true,
      optional: true,
      captureAsn1: 'rsaPublicKey'
    }]
  }]
};

/**
 * Wrap digest in DigestInfo object.
 *
 * This function implements EMSA-PKCS1-v1_5-ENCODE as per RFC 3447.
 *
 * DigestInfo ::= SEQUENCE {
 *   digestAlgorithm DigestAlgorithmIdentifier,
 *   digest Digest
 * }
 *
 * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
 * Digest ::= OCTET STRING
 *
 * @param md the message digest object with the hash to sign.
 *
 * @return the encoded message (ready for RSA encrytion)
 */
var emsaPkcs1v15encode = function(md) {
  // get the oid for the algorithm
  var oid;
  if(md.algorithm in pki.oids) {
    oid = pki.oids[md.algorithm];
  } else {
    var error = new Error('Unknown message digest algorithm.');
    error.algorithm = md.algorithm;
    throw error;
  }
  var oidBytes = asn1.oidToDer(oid).getBytes();

  // create the digest info
  var digestInfo = asn1.create(
    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);
  var digestAlgorithm = asn1.create(
    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);
  digestAlgorithm.value.push(asn1.create(
    asn1.Class.UNIVERSAL, asn1.Type.OID, false, oidBytes));
  digestAlgorithm.value.push(asn1.create(
    asn1.Class.UNIVERSAL, asn1.Type.NULL, false, ''));
  var digest = asn1.create(
    asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING,
    false, md.digest().getBytes());
  digestInfo.value.push(digestAlgorithm);
  digestInfo.value.push(digest);

  // encode digest info
  return asn1.toDer(digestInfo).getBytes();
};

/**
 * Performs x^c mod n (RSA encryption or decryption operation).
 *
 * @param x the number to raise and mod.
 * @param key the key to use.
 * @param pub true if the key is public, false if private.
 *
 * @return the result of x^c mod n.
 */
var _modPow = function(x, key, pub) {
  if(pub) {
    return x.modPow(key.e, key.n);
  }

  if(!key.p || !key.q) {
    // allow calculation without CRT params (slow)
    return x.modPow(key.d, key.n);
  }

  // pre-compute dP, dQ, and qInv if necessary
  if(!key.dP) {
    key.dP = key.d.mod(key.p.subtract(BigInteger.ONE));
  }
  if(!key.dQ) {
    key.dQ = key.d.mod(key.q.subtract(BigInteger.ONE));
  }
  if(!key.qInv) {
    key.qInv = key.q.modInverse(key.p);
  }

  /* Chinese remainder theorem (CRT) states:

    Suppose n1, n2, ..., nk are positive integers which are pairwise
    coprime (n1 and n2 have no common factors other than 1). For any
    integers x1, x2, ..., xk there exists an integer x solving the
    system of simultaneous congruences (where ~= means modularly
    congruent so a ~= b mod n means a mod n = b mod n):

    x ~= x1 mod n1
    x ~= x2 mod n2
    ...
    x ~= xk mod nk

    This system of congruences has a single simultaneous solution x
    between 0 and n - 1. Furthermore, each xk solution and x itself
    is congruent modulo the product n = n1*n2*...*nk.
    So x1 mod n = x2 mod n = xk mod n = x mod n.

    The single simultaneous solution x can be solved with the following
    equation:

    x = sum(xi*ri*si) mod n where ri = n/ni and si = ri^-1 mod ni.

    Where x is less than n, xi = x mod ni.

    For RSA we are only concerned with k = 2. The modulus n = pq, where
    p and q are coprime. The RSA decryption algorithm is:

    y = x^d mod n

    Given the above:

    x1 = x^d mod p
    r1 = n/p = q
    s1 = q^-1 mod p
    x2 = x^d mod q
    r2 = n/q = p
    s2 = p^-1 mod q

    So y = (x1r1s1 + x2r2s2) mod n
         = ((x^d mod p)q(q^-1 mod p) + (x^d mod q)p(p^-1 mod q)) mod n

    According to Fermat's Little Theorem, if the modulus P is prime,
    for any integer A not evenly divisible by P, A^(P-1) ~= 1 mod P.
    Since A is not divisible by P it follows that if:
    N ~= M mod (P - 1), then A^N mod P = A^M mod P. Therefore:

    A^N mod P = A^(M mod (P - 1)) mod P. (The latter takes less effort
    to calculate). In order to calculate x^d mod p more quickly the
    exponent d mod (p - 1) is stored in the RSA private key (the same
    is done for x^d mod q). These values are referred to as dP and dQ
    respectively. Therefore we now have:

    y = ((x^dP mod p)q(q^-1 mod p) + (x^dQ mod q)p(p^-1 mod q)) mod n

    Since we'll be reducing x^dP by modulo p (same for q) we can also
    reduce x by p (and q respectively) before hand. Therefore, let

    xp = ((x mod p)^dP mod p), and
    xq = ((x mod q)^dQ mod q), yielding:

    y = (xp*q*(q^-1 mod p) + xq*p*(p^-1 mod q)) mod n

    This can be further reduced to a simple algorithm that only
    requires 1 inverse (the q inverse is used) to be used and stored.
    The algorithm is called Garner's algorithm. If qInv is the
    inverse of q, we simply calculate:

    y = (qInv*(xp - xq) mod p) * q + xq

    However, there are two further complications. First, we need to
    ensure that xp > xq to prevent signed BigIntegers from being used
    so we add p until this is true (since we will be mod'ing with
    p anyway). Then, there is a known timing attack on algorithms
    using the CRT. To mitigate this risk, "cryptographic blinding"
    should be used. This requires simply generating a random number r
    between 0 and n-1 and its inverse and multiplying x by r^e before
    calculating y and then multiplying y by r^-1 afterwards. Note that
    r must be coprime with n (gcd(r, n) === 1) in order to have an
    inverse.
  */

  // cryptographic blinding
  var r;
  do {
    r = new BigInteger(
      forge.util.bytesToHex(forge.random.getBytes(key.n.bitLength() / 8)),
      16);
  } while(r.compareTo(key.n) >= 0 || !r.gcd(key.n).equals(BigInteger.ONE));
  x = x.multiply(r.modPow(key.e, key.n)).mod(key.n);

  // calculate xp and xq
  var xp = x.mod(key.p).modPow(key.dP, key.p);
  var xq = x.mod(key.q).modPow(key.dQ, key.q);

  // xp must be larger than xq to avoid signed bit usage
  while(xp.compareTo(xq) < 0) {
    xp = xp.add(key.p);
  }

  // do last step
  var y = xp.subtract(xq)
    .multiply(key.qInv).mod(key.p)
    .multiply(key.q).add(xq);

  // remove effect of random for cryptographic blinding
  y = y.multiply(r.modInverse(key.n)).mod(key.n);

  return y;
};

/**
 * NOTE: THIS METHOD IS DEPRECATED, use 'sign' on a private key object or
 * 'encrypt' on a public key object instead.
 *
 * Performs RSA encryption.
 *
 * The parameter bt controls whether to put padding bytes before the
 * message passed in. Set bt to either true or false to disable padding
 * completely (in order to handle e.g. EMSA-PSS encoding seperately before),
 * signaling whether the encryption operation is a public key operation
 * (i.e. encrypting data) or not, i.e. private key operation (data signing).
 *
 * For PKCS#1 v1.5 padding pass in the block type to use, i.e. either 0x01
 * (for signing) or 0x02 (for encryption). The key operation mode (private
 * or public) is derived from this flag in that case).
 *
 * @param m the message to encrypt as a byte string.
 * @param key the RSA key to use.
 * @param bt for PKCS#1 v1.5 padding, the block type to use
 *   (0x01 for private key, 0x02 for public),
 *   to disable padding: true = public key, false = private key.
 *
 * @return the encrypted bytes as a string.
 */
pki.rsa.encrypt = function(m, key, bt) {
  var pub = bt;
  var eb;

  // get the length of the modulus in bytes
  var k = Math.ceil(key.n.bitLength() / 8);

  if(bt !== false && bt !== true) {
    // legacy, default to PKCS#1 v1.5 padding
    pub = (bt === 0x02);
    eb = _encodePkcs1_v1_5(m, key, bt);
  } else {
    eb = forge.util.createBuffer();
    eb.putBytes(m);
  }

  // load encryption block as big integer 'x'
  // FIXME: hex conversion inefficient, get BigInteger w/byte strings
  var x = new BigInteger(eb.toHex(), 16);

  // do RSA encryption
  var y = _modPow(x, key, pub);

  // convert y into the encrypted data byte string, if y is shorter in
  // bytes than k, then prepend zero bytes to fill up ed
  // FIXME: hex conversion inefficient, get BigInteger w/byte strings
  var yhex = y.toString(16);
  var ed = forge.util.createBuffer();
  var zeros = k - Math.ceil(yhex.length / 2);
  while(zeros > 0) {
    ed.putByte(0x00);
    --zeros;
  }
  ed.putBytes(forge.util.hexToBytes(yhex));
  return ed.getBytes();
};

/**
 * NOTE: THIS METHOD IS DEPRECATED, use 'decrypt' on a private key object or
 * 'verify' on a public key object instead.
 *
 * Performs RSA decryption.
 *
 * The parameter ml controls whether to apply PKCS#1 v1.5 padding
 * or not.  Set ml = false to disable padding removal completely
 * (in order to handle e.g. EMSA-PSS later on) and simply pass back
 * the RSA encryption block.
 *
 * @param ed the encrypted data to decrypt in as a byte string.
 * @param key the RSA key to use.
 * @param pub true for a public key operation, false for private.
 * @param ml the message length, if known, false to disable padding.
 *
 * @return the decrypted message as a byte string.
 */
pki.rsa.decrypt = function(ed, key, pub, ml) {
  // get the length of the modulus in bytes
  var k = Math.ceil(key.n.bitLength() / 8);

  // error if the length of the encrypted data ED is not k
  if(ed.length !== k) {
    var error = new Error('Encrypted message length is invalid.');
    error.length = ed.length;
    error.expected = k;
    throw error;
  }

  // convert encrypted data into a big integer
  // FIXME: hex conversion inefficient, get BigInteger w/byte strings
  var y = new BigInteger(forge.util.createBuffer(ed).toHex(), 16);

  // y must be less than the modulus or it wasn't the result of
  // a previous mod operation (encryption) using that modulus
  if(y.compareTo(key.n) >= 0) {
    throw new Error('Encrypted message is invalid.');
  }

  // do RSA decryption
  var x = _modPow(y, key, pub);

  // create the encryption block, if x is shorter in bytes than k, then
  // prepend zero bytes to fill up eb
  // FIXME: hex conversion inefficient, get BigInteger w/byte strings
  var xhex = x.toString(16);
  var eb = forge.util.createBuffer();
  var zeros = k - Math.ceil(xhex.length / 2);
  while(zeros > 0) {
    eb.putByte(0x00);
    --zeros;
  }
  eb.putBytes(forge.util.hexToBytes(xhex));

  if(ml !== false) {
    // legacy, default to PKCS#1 v1.5 padding
    return _decodePkcs1_v1_5(eb.getBytes(), key, pub);
  }

  // return message
  return eb.getBytes();
};

/**
 * Creates an RSA key-pair generation state object. It is used to allow
 * key-generation to be performed in steps. It also allows for a UI to
 * display progress updates.
 *
 * @param bits the size for the private key in bits, defaults to 2048.
 * @param e the public exponent to use, defaults to 65537 (0x10001).
 * @param [options] the options to use.
 *          prng a custom crypto-secure pseudo-random number generator to use,
 *            that must define "getBytesSync".
 *          algorithm the algorithm to use (default: 'PRIMEINC').
 *
 * @return the state object to use to generate the key-pair.
 */
pki.rsa.createKeyPairGenerationState = function(bits, e, options) {
  // TODO: migrate step-based prime generation code to forge.prime

  // set default bits
  if(typeof(bits) === 'string') {
    bits = parseInt(bits, 10);
  }
  bits = bits || 2048;

  // create prng with api that matches BigInteger secure random
  options = options || {};
  var prng = options.prng || forge.random;
  var rng = {
    // x is an array to fill with bytes
    nextBytes: function(x) {
      var b = prng.getBytesSync(x.length);
      for(var i = 0; i < x.length; ++i) {
        x[i] = b.charCodeAt(i);
      }
    }
  };

  var algorithm = options.algorithm || 'PRIMEINC';

  // create PRIMEINC algorithm state
  var rval;
  if(algorithm === 'PRIMEINC') {
    rval = {
      algorithm: algorithm,
      state: 0,
      bits: bits,
      rng: rng,
      eInt: e || 65537,
      e: new BigInteger(null),
      p: null,
      q: null,
      qBits: bits >> 1,
      pBits: bits - (bits >> 1),
      pqState: 0,
      num: null,
      keys: null
    };
    rval.e.fromInt(rval.eInt);
  } else {
    throw new Error('Invalid key generation algorithm: ' + algorithm);
  }

  return rval;
};

/**
 * Attempts to runs the key-generation algorithm for at most n seconds
 * (approximately) using the given state. When key-generation has completed,
 * the keys will be stored in state.keys.
 *
 * To use this function to update a UI while generating a key or to prevent
 * causing browser lockups/warnings, set "n" to a value other than 0. A
 * simple pattern for generating a key and showing a progress indicator is:
 *
 * var state = pki.rsa.createKeyPairGenerationState(2048);
 * var step = function() {
 *   // step key-generation, run algorithm for 100 ms, repeat
 *   if(!forge.pki.rsa.stepKeyPairGenerationState(state, 100)) {
 *     setTimeout(step, 1);
 *   } else {
 *     // key-generation complete
 *     // TODO: turn off progress indicator here
 *     // TODO: use the generated key-pair in "state.keys"
 *   }
 * };
 * // TODO: turn on progress indicator here
 * setTimeout(step, 0);
 *
 * @param state the state to use.
 * @param n the maximum number of milliseconds to run the algorithm for, 0
 *          to run the algorithm to completion.
 *
 * @return true if the key-generation completed, false if not.
 */
pki.rsa.stepKeyPairGenerationState = function(state, n) {
  // set default algorithm if not set
  if(!('algorithm' in state)) {
    state.algorithm = 'PRIMEINC';
  }

  // TODO: migrate step-based prime generation code to forge.prime
  // TODO: abstract as PRIMEINC algorithm

  // do key generation (based on Tom Wu's rsa.js, see jsbn.js license)
  // with some minor optimizations and designed to run in steps

  // local state vars
  var THIRTY = new BigInteger(null);
  THIRTY.fromInt(30);
  var deltaIdx = 0;
  var op_or = function(x, y) {return x | y;};

  // keep stepping until time limit is reached or done
  var t1 = +new Date();
  var t2;
  var total = 0;
  while(state.keys === null && (n <= 0 || total < n)) {
    // generate p or q
    if(state.state === 0) {
      /* Note: All primes are of the form:

        30k+i, for i < 30 and gcd(30, i)=1, where there are 8 values for i

        When we generate a random number, we always align it at 30k + 1. Each
        time the number is determined not to be prime we add to get to the
        next 'i', eg: if the number was at 30k + 1 we add 6. */
      var bits = (state.p === null) ? state.pBits : state.qBits;
      var bits1 = bits - 1;

      // get a random number
      if(state.pqState === 0) {
        state.num = new BigInteger(bits, state.rng);
        // force MSB set
        if(!state.num.testBit(bits1)) {
          state.num.bitwiseTo(
            BigInteger.ONE.shiftLeft(bits1), op_or, state.num);
        }
        // align number on 30k+1 boundary
        state.num.dAddOffset(31 - state.num.mod(THIRTY).byteValue(), 0);
        deltaIdx = 0;

        ++state.pqState;
      } else if(state.pqState === 1) {
        // try to make the number a prime
        if(state.num.bitLength() > bits) {
          // overflow, try again
          state.pqState = 0;
          // do primality test
        } else if(state.num.isProbablePrime(
          _getMillerRabinTests(state.num.bitLength()))) {
          ++state.pqState;
        } else {
          // get next potential prime
          state.num.dAddOffset(GCD_30_DELTA[deltaIdx++ % 8], 0);
        }
      } else if(state.pqState === 2) {
        // ensure number is coprime with e
        state.pqState =
          (state.num.subtract(BigInteger.ONE).gcd(state.e)
            .compareTo(BigInteger.ONE) === 0) ? 3 : 0;
      } else if(state.pqState === 3) {
        // store p or q
        state.pqState = 0;
        if(state.p === null) {
          state.p = state.num;
        } else {
          state.q = state.num;
        }

        // advance state if both p and q are ready
        if(state.p !== null && state.q !== null) {
          ++state.state;
        }
        state.num = null;
      }
    } else if(state.state === 1) {
      // ensure p is larger than q (swap them if not)
      if(state.p.compareTo(state.q) < 0) {
        state.num = state.p;
        state.p = state.q;
        state.q = state.num;
      }
      ++state.state;
    } else if(state.state === 2) {
      // compute phi: (p - 1)(q - 1) (Euler's totient function)
      state.p1 = state.p.subtract(BigInteger.ONE);
      state.q1 = state.q.subtract(BigInteger.ONE);
      state.phi = state.p1.multiply(state.q1);
      ++state.state;
    } else if(state.state === 3) {
      // ensure e and phi are coprime
      if(state.phi.gcd(state.e).compareTo(BigInteger.ONE) === 0) {
        // phi and e are coprime, advance
        ++state.state;
      } else {
        // phi and e aren't coprime, so generate a new p and q
        state.p = null;
        state.q = null;
        state.state = 0;
      }
    } else if(state.state === 4) {
      // create n, ensure n is has the right number of bits
      state.n = state.p.multiply(state.q);

      // ensure n is right number of bits
      if(state.n.bitLength() === state.bits) {
        // success, advance
        ++state.state;
      } else {
        // failed, get new q
        state.q = null;
        state.state = 0;
      }
    } else if(state.state === 5) {
      // set keys
      var d = state.e.modInverse(state.phi);
      state.keys = {
        privateKey: pki.rsa.setPrivateKey(
          state.n, state.e, d, state.p, state.q,
          d.mod(state.p1), d.mod(state.q1),
          state.q.modInverse(state.p)),
        publicKey: pki.rsa.setPublicKey(state.n, state.e)
      };
    }

    // update timing
    t2 = +new Date();
    total += t2 - t1;
    t1 = t2;
  }

  return state.keys !== null;
};

/**
 * Generates an RSA public-private key pair in a single call.
 *
 * To generate a key-pair in steps (to allow for progress updates and to
 * prevent blocking or warnings in slow browsers) then use the key-pair
 * generation state functions.
 *
 * To generate a key-pair asynchronously (either through web-workers, if
 * available, or by breaking up the work on the main thread), pass a
 * callback function.
 *
 * @param [bits] the size for the private key in bits, defaults to 2048.
 * @param [e] the public exponent to use, defaults to 65537.
 * @param [options] options for key-pair generation, if given then 'bits'
 *            and 'e' must *not* be given:
 *          bits the size for the private key in bits, (default: 2048).
 *          e the public exponent to use, (default: 65537 (0x10001)).
 *          workerScript the worker script URL.
 *          workers the number of web workers (if supported) to use,
 *            (default: 2).
 *          workLoad the size of the work load, ie: number of possible prime
 *            numbers for each web worker to check per work assignment,
 *            (default: 100).
 *          prng a custom crypto-secure pseudo-random number generator to use,
 *            that must define "getBytesSync". Disables use of native APIs.
 *          algorithm the algorithm to use (default: 'PRIMEINC').
 * @param [callback(err, keypair)] called once the operation completes.
 *
 * @return an object with privateKey and publicKey properties.
 */
pki.rsa.generateKeyPair = function(bits, e, options, callback) {
  // (bits), (options), (callback)
  if(arguments.length === 1) {
    if(typeof bits === 'object') {
      options = bits;
      bits = undefined;
    } else if(typeof bits === 'function') {
      callback = bits;
      bits = undefined;
    }
  } else if(arguments.length === 2) {
    // (bits, e), (bits, options), (bits, callback), (options, callback)
    if(typeof bits === 'number') {
      if(typeof e === 'function') {
        callback = e;
        e = undefined;
      } else if(typeof e !== 'number') {
        options = e;
        e = undefined;
      }
    } else {
      options = bits;
      callback = e;
      bits = undefined;
      e = undefined;
    }
  } else if(arguments.length === 3) {
    // (bits, e, options), (bits, e, callback), (bits, options, callback)
    if(typeof e === 'number') {
      if(typeof options === 'function') {
        callback = options;
        options = undefined;
      }
    } else {
      callback = options;
      options = e;
      e = undefined;
    }
  }
  options = options || {};
  if(bits === undefined) {
    bits = options.bits || 2048;
  }
  if(e === undefined) {
    e = options.e || 0x10001;
  }

  // use native code if permitted, available, and parameters are acceptable
  if(!forge.options.usePureJavaScript && !options.prng &&
    bits >= 256 && bits <= 16384 && (e === 0x10001 || e === 3)) {
    if(callback) {
      // try native async
      if(_detectNodeCrypto('generateKeyPair')) {
        return _crypto.generateKeyPair('rsa', {
          modulusLength: bits,
          publicExponent: e,
          publicKeyEncoding: {
            type: 'spki',
            format: 'pem'
          },
          privateKeyEncoding: {
            type: 'pkcs8',
            format: 'pem'
          }
        }, function(err, pub, priv) {
          if(err) {
            return callback(err);
          }
          callback(null, {
            privateKey: pki.privateKeyFromPem(priv),
            publicKey: pki.publicKeyFromPem(pub)
          });
        });
      }
      if(_detectSubtleCrypto('generateKey') &&
        _detectSubtleCrypto('exportKey')) {
        // use standard native generateKey
        return util.globalScope.crypto.subtle.generateKey({
          name: 'RSASSA-PKCS1-v1_5',
          modulusLength: bits,
          publicExponent: _intToUint8Array(e),
          hash: {name: 'SHA-256'}
        }, true /* key can be exported*/, ['sign', 'verify'])
        .then(function(pair) {
          return util.globalScope.crypto.subtle.exportKey(
            'pkcs8', pair.privateKey);
        // avoiding catch(function(err) {...}) to support IE <= 8
        }).then(undefined, function(err) {
          callback(err);
        }).then(function(pkcs8) {
          if(pkcs8) {
            var privateKey = pki.privateKeyFromAsn1(
              asn1.fromDer(forge.util.createBuffer(pkcs8)));
            callback(null, {
              privateKey: privateKey,
              publicKey: pki.setRsaPublicKey(privateKey.n, privateKey.e)
            });
          }
        });
      }
      if(_detectSubtleMsCrypto('generateKey') &&
        _detectSubtleMsCrypto('exportKey')) {
        var genOp = util.globalScope.msCrypto.subtle.generateKey({
          name: 'RSASSA-PKCS1-v1_5',
          modulusLength: bits,
          publicExponent: _intToUint8Array(e),
          hash: {name: 'SHA-256'}
        }, true /* key can be exported*/, ['sign', 'verify']);
        genOp.oncomplete = function(e) {
          var pair = e.target.result;
          var exportOp = util.globalScope.msCrypto.subtle.exportKey(
            'pkcs8', pair.privateKey);
          exportOp.oncomplete = function(e) {
            var pkcs8 = e.target.result;
            var privateKey = pki.privateKeyFromAsn1(
              asn1.fromDer(forge.util.createBuffer(pkcs8)));
            callback(null, {
              privateKey: privateKey,
              publicKey: pki.setRsaPublicKey(privateKey.n, privateKey.e)
            });
          };
          exportOp.onerror = function(err) {
            callback(err);
          };
        };
        genOp.onerror = function(err) {
          callback(err);
        };
        return;
      }
    } else {
      // try native sync
      if(_detectNodeCrypto('generateKeyPairSync')) {
        var keypair = _crypto.generateKeyPairSync('rsa', {
          modulusLength: bits,
          publicExponent: e,
          publicKeyEncoding: {
            type: 'spki',
            format: 'pem'
          },
          privateKeyEncoding: {
            type: 'pkcs8',
            format: 'pem'
          }
        });
        return {
          privateKey: pki.privateKeyFromPem(keypair.privateKey),
          publicKey: pki.publicKeyFromPem(keypair.publicKey)
        };
      }
    }
  }

  // use JavaScript implementation
  var state = pki.rsa.createKeyPairGenerationState(bits, e, options);
  if(!callback) {
    pki.rsa.stepKeyPairGenerationState(state, 0);
    return state.keys;
  }
  _generateKeyPair(state, options, callback);
};

/**
 * Sets an RSA public key from BigIntegers modulus and exponent.
 *
 * @param n the modulus.
 * @param e the exponent.
 *
 * @return the public key.
 */
pki.setRsaPublicKey = pki.rsa.setPublicKey = function(n, e) {
  var key = {
    n: n,
    e: e
  };

  /**
   * Encrypts the given data with this public key. Newer applications
   * should use the 'RSA-OAEP' decryption scheme, 'RSAES-PKCS1-V1_5' is for
   * legacy applications.
   *
   * @param data the byte string to encrypt.
   * @param scheme the encryption scheme to use:
   *          'RSAES-PKCS1-V1_5' (default),
   *          'RSA-OAEP',
   *          'RAW', 'NONE', or null to perform raw RSA encryption,
   *          an object with an 'encode' property set to a function
   *          with the signature 'function(data, key)' that returns
   *          a binary-encoded string representing the encoded data.
   * @param schemeOptions any scheme-specific options.
   *
   * @return the encrypted byte string.
   */
  key.encrypt = function(data, scheme, schemeOptions) {
    if(typeof scheme === 'string') {
      scheme = scheme.toUpperCase();
    } else if(scheme === undefined) {
      scheme = 'RSAES-PKCS1-V1_5';
    }

    if(scheme === 'RSAES-PKCS1-V1_5') {
      scheme = {
        encode: function(m, key, pub) {
          return _encodePkcs1_v1_5(m, key, 0x02).getBytes();
        }
      };
    } else if(scheme === 'RSA-OAEP' || scheme === 'RSAES-OAEP') {
      scheme = {
        encode: function(m, key) {
          return forge.pkcs1.encode_rsa_oaep(key, m, schemeOptions);
        }
      };
    } else if(['RAW', 'NONE', 'NULL', null].indexOf(scheme) !== -1) {
      scheme = {encode: function(e) {return e;}};
    } else if(typeof scheme === 'string') {
      throw new Error('Unsupported encryption scheme: "' + scheme + '".');
    }

    // do scheme-based encoding then rsa encryption
    var e = scheme.encode(data, key, true);
    return pki.rsa.encrypt(e, key, true);
  };

  /**
   * Verifies the given signature against the given digest.
   *
   * PKCS#1 supports multiple (currently two) signature schemes:
   * RSASSA-PKCS1-V1_5 and RSASSA-PSS.
   *
   * By default this implementation uses the "old scheme", i.e.
   * RSASSA-PKCS1-V1_5, in which case once RSA-decrypted, the
   * signature is an OCTET STRING that holds a DigestInfo.
   *
   * DigestInfo ::= SEQUENCE {
   *   digestAlgorithm DigestAlgorithmIdentifier,
   *   digest Digest
   * }
   * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
   * Digest ::= OCTET STRING
   *
   * To perform PSS signature verification, provide an instance
   * of Forge PSS object as the scheme parameter.
   *
   * @param digest the message digest hash to compare against the signature,
   *          as a binary-encoded string.
   * @param signature the signature to verify, as a binary-encoded string.
   * @param scheme signature verification scheme to use:
   *          'RSASSA-PKCS1-V1_5' or undefined for RSASSA PKCS#1 v1.5,
   *          a Forge PSS object for RSASSA-PSS,
   *          'NONE' or null for none, DigestInfo will not be expected, but
   *            PKCS#1 v1.5 padding will still be used.
   *
   * @return true if the signature was verified, false if not.
   */
  key.verify = function(digest, signature, scheme) {
    if(typeof scheme === 'string') {
      scheme = scheme.toUpperCase();
    } else if(scheme === undefined) {
      scheme = 'RSASSA-PKCS1-V1_5';
    }

    if(scheme === 'RSASSA-PKCS1-V1_5') {
      scheme = {
        verify: function(digest, d) {
          // remove padding
          d = _decodePkcs1_v1_5(d, key, true);
          // d is ASN.1 BER-encoded DigestInfo
          var obj = asn1.fromDer(d);
          // compare the given digest to the decrypted one
          return digest === obj.value[1].value;
        }
      };
    } else if(scheme === 'NONE' || scheme === 'NULL' || scheme === null) {
      scheme = {
        verify: function(digest, d) {
          // remove padding
          d = _decodePkcs1_v1_5(d, key, true);
          return digest === d;
        }
      };
    }

    // do rsa decryption w/o any decoding, then verify -- which does decoding
    var d = pki.rsa.decrypt(signature, key, true, false);
    return scheme.verify(digest, d, key.n.bitLength());
  };

  return key;
};

/**
 * Sets an RSA private key from BigIntegers modulus, exponent, primes,
 * prime exponents, and modular multiplicative inverse.
 *
 * @param n the modulus.
 * @param e the public exponent.
 * @param d the private exponent ((inverse of e) mod n).
 * @param p the first prime.
 * @param q the second prime.
 * @param dP exponent1 (d mod (p-1)).
 * @param dQ exponent2 (d mod (q-1)).
 * @param qInv ((inverse of q) mod p)
 *
 * @return the private key.
 */
pki.setRsaPrivateKey = pki.rsa.setPrivateKey = function(
  n, e, d, p, q, dP, dQ, qInv) {
  var key = {
    n: n,
    e: e,
    d: d,
    p: p,
    q: q,
    dP: dP,
    dQ: dQ,
    qInv: qInv
  };

  /**
   * Decrypts the given data with this private key. The decryption scheme
   * must match the one used to encrypt the data.
   *
   * @param data the byte string to decrypt.
   * @param scheme the decryption scheme to use:
   *          'RSAES-PKCS1-V1_5' (default),
   *          'RSA-OAEP',
   *          'RAW', 'NONE', or null to perform raw RSA decryption.
   * @param schemeOptions any scheme-specific options.
   *
   * @return the decrypted byte string.
   */
  key.decrypt = function(data, scheme, schemeOptions) {
    if(typeof scheme === 'string') {
      scheme = scheme.toUpperCase();
    } else if(scheme === undefined) {
      scheme = 'RSAES-PKCS1-V1_5';
    }

    // do rsa decryption w/o any decoding
    var d = pki.rsa.decrypt(data, key, false, false);

    if(scheme === 'RSAES-PKCS1-V1_5') {
      scheme = {decode: _decodePkcs1_v1_5};
    } else if(scheme === 'RSA-OAEP' || scheme === 'RSAES-OAEP') {
      scheme = {
        decode: function(d, key) {
          return forge.pkcs1.decode_rsa_oaep(key, d, schemeOptions);
        }
      };
    } else if(['RAW', 'NONE', 'NULL', null].indexOf(scheme) !== -1) {
      scheme = {decode: function(d) {return d;}};
    } else {
      throw new Error('Unsupported encryption scheme: "' + scheme + '".');
    }

    // decode according to scheme
    return scheme.decode(d, key, false);
  };

  /**
   * Signs the given digest, producing a signature.
   *
   * PKCS#1 supports multiple (currently two) signature schemes:
   * RSASSA-PKCS1-V1_5 and RSASSA-PSS.
   *
   * By default this implementation uses the "old scheme", i.e.
   * RSASSA-PKCS1-V1_5. In order to generate a PSS signature, provide
   * an instance of Forge PSS object as the scheme parameter.
   *
   * @param md the message digest object with the hash to sign.
   * @param scheme the signature scheme to use:
   *          'RSASSA-PKCS1-V1_5' or undefined for RSASSA PKCS#1 v1.5,
   *          a Forge PSS object for RSASSA-PSS,
   *          'NONE' or null for none, DigestInfo will not be used but
   *            PKCS#1 v1.5 padding will still be used.
   *
   * @return the signature as a byte string.
   */
  key.sign = function(md, scheme) {
    /* Note: The internal implementation of RSA operations is being
      transitioned away from a PKCS#1 v1.5 hard-coded scheme. Some legacy
      code like the use of an encoding block identifier 'bt' will eventually
      be removed. */

    // private key operation
    var bt = false;

    if(typeof scheme === 'string') {
      scheme = scheme.toUpperCase();
    }

    if(scheme === undefined || scheme === 'RSASSA-PKCS1-V1_5') {
      scheme = {encode: emsaPkcs1v15encode};
      bt = 0x01;
    } else if(scheme === 'NONE' || scheme === 'NULL' || scheme === null) {
      scheme = {encode: function() {return md;}};
      bt = 0x01;
    }

    // encode and then encrypt
    var d = scheme.encode(md, key.n.bitLength());
    return pki.rsa.encrypt(d, key, bt);
  };

  return key;
};

/**
 * Wraps an RSAPrivateKey ASN.1 object in an ASN.1 PrivateKeyInfo object.
 *
 * @param rsaKey the ASN.1 RSAPrivateKey.
 *
 * @return the ASN.1 PrivateKeyInfo.
 */
pki.wrapRsaPrivateKey = function(rsaKey) {
  // PrivateKeyInfo
  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // version (0)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      asn1.integerToDer(0).getBytes()),
    // privateKeyAlgorithm
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      asn1.create(
        asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        asn1.oidToDer(pki.oids.rsaEncryption).getBytes()),
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')
    ]),
    // PrivateKey
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,
      asn1.toDer(rsaKey).getBytes())
  ]);
};

/**
 * Converts a private key from an ASN.1 object.
 *
 * @param obj the ASN.1 representation of a PrivateKeyInfo containing an
 *          RSAPrivateKey or an RSAPrivateKey.
 *
 * @return the private key.
 */
pki.privateKeyFromAsn1 = function(obj) {
  // get PrivateKeyInfo
  var capture = {};
  var errors = [];
  if(asn1.validate(obj, privateKeyValidator, capture, errors)) {
    obj = asn1.fromDer(forge.util.createBuffer(capture.privateKey));
  }

  // get RSAPrivateKey
  capture = {};
  errors = [];
  if(!asn1.validate(obj, rsaPrivateKeyValidator, capture, errors)) {
    var error = new Error('Cannot read private key. ' +
      'ASN.1 object does not contain an RSAPrivateKey.');
    error.errors = errors;
    throw error;
  }

  // Note: Version is currently ignored.
  // capture.privateKeyVersion
  // FIXME: inefficient, get a BigInteger that uses byte strings
  var n, e, d, p, q, dP, dQ, qInv;
  n = forge.util.createBuffer(capture.privateKeyModulus).toHex();
  e = forge.util.createBuffer(capture.privateKeyPublicExponent).toHex();
  d = forge.util.createBuffer(capture.privateKeyPrivateExponent).toHex();
  p = forge.util.createBuffer(capture.privateKeyPrime1).toHex();
  q = forge.util.createBuffer(capture.privateKeyPrime2).toHex();
  dP = forge.util.createBuffer(capture.privateKeyExponent1).toHex();
  dQ = forge.util.createBuffer(capture.privateKeyExponent2).toHex();
  qInv = forge.util.createBuffer(capture.privateKeyCoefficient).toHex();

  // set private key
  return pki.setRsaPrivateKey(
    new BigInteger(n, 16),
    new BigInteger(e, 16),
    new BigInteger(d, 16),
    new BigInteger(p, 16),
    new BigInteger(q, 16),
    new BigInteger(dP, 16),
    new BigInteger(dQ, 16),
    new BigInteger(qInv, 16));
};

/**
 * Converts a private key to an ASN.1 RSAPrivateKey.
 *
 * @param key the private key.
 *
 * @return the ASN.1 representation of an RSAPrivateKey.
 */
pki.privateKeyToAsn1 = pki.privateKeyToRSAPrivateKey = function(key) {
  // RSAPrivateKey
  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // version (0 = only 2 primes, 1 multiple primes)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      asn1.integerToDer(0).getBytes()),
    // modulus (n)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      _bnToBytes(key.n)),
    // publicExponent (e)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      _bnToBytes(key.e)),
    // privateExponent (d)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      _bnToBytes(key.d)),
    // privateKeyPrime1 (p)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      _bnToBytes(key.p)),
    // privateKeyPrime2 (q)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      _bnToBytes(key.q)),
    // privateKeyExponent1 (dP)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      _bnToBytes(key.dP)),
    // privateKeyExponent2 (dQ)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      _bnToBytes(key.dQ)),
    // coefficient (qInv)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      _bnToBytes(key.qInv))
  ]);
};

/**
 * Converts a public key from an ASN.1 SubjectPublicKeyInfo or RSAPublicKey.
 *
 * @param obj the asn1 representation of a SubjectPublicKeyInfo or RSAPublicKey.
 *
 * @return the public key.
 */
pki.publicKeyFromAsn1 = function(obj) {
  // get SubjectPublicKeyInfo
  var capture = {};
  var errors = [];
  if(asn1.validate(obj, publicKeyValidator, capture, errors)) {
    // get oid
    var oid = asn1.derToOid(capture.publicKeyOid);
    if(oid !== pki.oids.rsaEncryption) {
      var error = new Error('Cannot read public key. Unknown OID.');
      error.oid = oid;
      throw error;
    }
    obj = capture.rsaPublicKey;
  }

  // get RSA params
  errors = [];
  if(!asn1.validate(obj, rsaPublicKeyValidator, capture, errors)) {
    var error = new Error('Cannot read public key. ' +
      'ASN.1 object does not contain an RSAPublicKey.');
    error.errors = errors;
    throw error;
  }

  // FIXME: inefficient, get a BigInteger that uses byte strings
  var n = forge.util.createBuffer(capture.publicKeyModulus).toHex();
  var e = forge.util.createBuffer(capture.publicKeyExponent).toHex();

  // set public key
  return pki.setRsaPublicKey(
    new BigInteger(n, 16),
    new BigInteger(e, 16));
};

/**
 * Converts a public key to an ASN.1 SubjectPublicKeyInfo.
 *
 * @param key the public key.
 *
 * @return the asn1 representation of a SubjectPublicKeyInfo.
 */
pki.publicKeyToAsn1 = pki.publicKeyToSubjectPublicKeyInfo = function(key) {
  // SubjectPublicKeyInfo
  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // AlgorithmIdentifier
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // algorithm
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        asn1.oidToDer(pki.oids.rsaEncryption).getBytes()),
      // parameters (null)
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')
    ]),
    // subjectPublicKey
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, [
      pki.publicKeyToRSAPublicKey(key)
    ])
  ]);
};

/**
 * Converts a public key to an ASN.1 RSAPublicKey.
 *
 * @param key the public key.
 *
 * @return the asn1 representation of a RSAPublicKey.
 */
pki.publicKeyToRSAPublicKey = function(key) {
  // RSAPublicKey
  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // modulus (n)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      _bnToBytes(key.n)),
    // publicExponent (e)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      _bnToBytes(key.e))
  ]);
};

/**
 * Encodes a message using PKCS#1 v1.5 padding.
 *
 * @param m the message to encode.
 * @param key the RSA key to use.
 * @param bt the block type to use, i.e. either 0x01 (for signing) or 0x02
 *          (for encryption).
 *
 * @return the padded byte buffer.
 */
function _encodePkcs1_v1_5(m, key, bt) {
  var eb = forge.util.createBuffer();

  // get the length of the modulus in bytes
  var k = Math.ceil(key.n.bitLength() / 8);

  /* use PKCS#1 v1.5 padding */
  if(m.length > (k - 11)) {
    var error = new Error('Message is too long for PKCS#1 v1.5 padding.');
    error.length = m.length;
    error.max = k - 11;
    throw error;
  }

  /* A block type BT, a padding string PS, and the data D shall be
    formatted into an octet string EB, the encryption block:

    EB = 00 || BT || PS || 00 || D

    The block type BT shall be a single octet indicating the structure of
    the encryption block. For this version of the document it shall have
    value 00, 01, or 02. For a private-key operation, the block type
    shall be 00 or 01. For a public-key operation, it shall be 02.

    The padding string PS shall consist of k-3-||D|| octets. For block
    type 00, the octets shall have value 00; for block type 01, they
    shall have value FF; and for block type 02, they shall be
    pseudorandomly generated and nonzero. This makes the length of the
    encryption block EB equal to k. */

  // build the encryption block
  eb.putByte(0x00);
  eb.putByte(bt);

  // create the padding
  var padNum = k - 3 - m.length;
  var padByte;
  // private key op
  if(bt === 0x00 || bt === 0x01) {
    padByte = (bt === 0x00) ? 0x00 : 0xFF;
    for(var i = 0; i < padNum; ++i) {
      eb.putByte(padByte);
    }
  } else {
    // public key op
    // pad with random non-zero values
    while(padNum > 0) {
      var numZeros = 0;
      var padBytes = forge.random.getBytes(padNum);
      for(var i = 0; i < padNum; ++i) {
        padByte = padBytes.charCodeAt(i);
        if(padByte === 0) {
          ++numZeros;
        } else {
          eb.putByte(padByte);
        }
      }
      padNum = numZeros;
    }
  }

  // zero followed by message
  eb.putByte(0x00);
  eb.putBytes(m);

  return eb;
}

/**
 * Decodes a message using PKCS#1 v1.5 padding.
 *
 * @param em the message to decode.
 * @param key the RSA key to use.
 * @param pub true if the key is a public key, false if it is private.
 * @param ml the message length, if specified.
 *
 * @return the decoded bytes.
 */
function _decodePkcs1_v1_5(em, key, pub, ml) {
  // get the length of the modulus in bytes
  var k = Math.ceil(key.n.bitLength() / 8);

  /* It is an error if any of the following conditions occurs:

    1. The encryption block EB cannot be parsed unambiguously.
    2. The padding string PS consists of fewer than eight octets
      or is inconsisent with the block type BT.
    3. The decryption process is a public-key operation and the block
      type BT is not 00 or 01, or the decryption process is a
      private-key operation and the block type is not 02.
   */

  // parse the encryption block
  var eb = forge.util.createBuffer(em);
  var first = eb.getByte();
  var bt = eb.getByte();
  if(first !== 0x00 ||
    (pub && bt !== 0x00 && bt !== 0x01) ||
    (!pub && bt != 0x02) ||
    (pub && bt === 0x00 && typeof(ml) === 'undefined')) {
    throw new Error('Encryption block is invalid.');
  }

  var padNum = 0;
  if(bt === 0x00) {
    // check all padding bytes for 0x00
    padNum = k - 3 - ml;
    for(var i = 0; i < padNum; ++i) {
      if(eb.getByte() !== 0x00) {
        throw new Error('Encryption block is invalid.');
      }
    }
  } else if(bt === 0x01) {
    // find the first byte that isn't 0xFF, should be after all padding
    padNum = 0;
    while(eb.length() > 1) {
      if(eb.getByte() !== 0xFF) {
        --eb.read;
        break;
      }
      ++padNum;
    }
  } else if(bt === 0x02) {
    // look for 0x00 byte
    padNum = 0;
    while(eb.length() > 1) {
      if(eb.getByte() === 0x00) {
        --eb.read;
        break;
      }
      ++padNum;
    }
  }

  // zero must be 0x00 and padNum must be (k - 3 - message length)
  var zero = eb.getByte();
  if(zero !== 0x00 || padNum !== (k - 3 - eb.length())) {
    throw new Error('Encryption block is invalid.');
  }

  return eb.getBytes();
}

/**
 * Runs the key-generation algorithm asynchronously, either in the background
 * via Web Workers, or using the main thread and setImmediate.
 *
 * @param state the key-pair generation state.
 * @param [options] options for key-pair generation:
 *          workerScript the worker script URL.
 *          workers the number of web workers (if supported) to use,
 *            (default: 2, -1 to use estimated cores minus one).
 *          workLoad the size of the work load, ie: number of possible prime
 *            numbers for each web worker to check per work assignment,
 *            (default: 100).
 * @param callback(err, keypair) called once the operation completes.
 */
function _generateKeyPair(state, options, callback) {
  if(typeof options === 'function') {
    callback = options;
    options = {};
  }
  options = options || {};

  var opts = {
    algorithm: {
      name: options.algorithm || 'PRIMEINC',
      options: {
        workers: options.workers || 2,
        workLoad: options.workLoad || 100,
        workerScript: options.workerScript
      }
    }
  };
  if('prng' in options) {
    opts.prng = options.prng;
  }

  generate();

  function generate() {
    // find p and then q (done in series to simplify)
    getPrime(state.pBits, function(err, num) {
      if(err) {
        return callback(err);
      }
      state.p = num;
      if(state.q !== null) {
        return finish(err, state.q);
      }
      getPrime(state.qBits, finish);
    });
  }

  function getPrime(bits, callback) {
    forge.prime.generateProbablePrime(bits, opts, callback);
  }

  function finish(err, num) {
    if(err) {
      return callback(err);
    }

    // set q
    state.q = num;

    // ensure p is larger than q (swap them if not)
    if(state.p.compareTo(state.q) < 0) {
      var tmp = state.p;
      state.p = state.q;
      state.q = tmp;
    }

    // ensure p is coprime with e
    if(state.p.subtract(BigInteger.ONE).gcd(state.e)
      .compareTo(BigInteger.ONE) !== 0) {
      state.p = null;
      generate();
      return;
    }

    // ensure q is coprime with e
    if(state.q.subtract(BigInteger.ONE).gcd(state.e)
      .compareTo(BigInteger.ONE) !== 0) {
      state.q = null;
      getPrime(state.qBits, finish);
      return;
    }

    // compute phi: (p - 1)(q - 1) (Euler's totient function)
    state.p1 = state.p.subtract(BigInteger.ONE);
    state.q1 = state.q.subtract(BigInteger.ONE);
    state.phi = state.p1.multiply(state.q1);

    // ensure e and phi are coprime
    if(state.phi.gcd(state.e).compareTo(BigInteger.ONE) !== 0) {
      // phi and e aren't coprime, so generate a new p and q
      state.p = state.q = null;
      generate();
      return;
    }

    // create n, ensure n is has the right number of bits
    state.n = state.p.multiply(state.q);
    if(state.n.bitLength() !== state.bits) {
      // failed, get new q
      state.q = null;
      getPrime(state.qBits, finish);
      return;
    }

    // set keys
    var d = state.e.modInverse(state.phi);
    state.keys = {
      privateKey: pki.rsa.setPrivateKey(
        state.n, state.e, d, state.p, state.q,
        d.mod(state.p1), d.mod(state.q1),
        state.q.modInverse(state.p)),
      publicKey: pki.rsa.setPublicKey(state.n, state.e)
    };

    callback(null, state.keys);
  }
}

/**
 * Converts a positive BigInteger into 2's-complement big-endian bytes.
 *
 * @param b the big integer to convert.
 *
 * @return the bytes.
 */
function _bnToBytes(b) {
  // prepend 0x00 if first byte >= 0x80
  var hex = b.toString(16);
  if(hex[0] >= '8') {
    hex = '00' + hex;
  }
  var bytes = forge.util.hexToBytes(hex);

  // ensure integer is minimally-encoded
  if(bytes.length > 1 &&
    // leading 0x00 for positive integer
    ((bytes.charCodeAt(0) === 0 &&
    (bytes.charCodeAt(1) & 0x80) === 0) ||
    // leading 0xFF for negative integer
    (bytes.charCodeAt(0) === 0xFF &&
    (bytes.charCodeAt(1) & 0x80) === 0x80))) {
    return bytes.substr(1);
  }
  return bytes;
}

/**
 * Returns the required number of Miller-Rabin tests to generate a
 * prime with an error probability of (1/2)^80.
 *
 * See Handbook of Applied Cryptography Chapter 4, Table 4.4.
 *
 * @param bits the bit size.
 *
 * @return the required number of iterations.
 */
function _getMillerRabinTests(bits) {
  if(bits <= 100) return 27;
  if(bits <= 150) return 18;
  if(bits <= 200) return 15;
  if(bits <= 250) return 12;
  if(bits <= 300) return 9;
  if(bits <= 350) return 8;
  if(bits <= 400) return 7;
  if(bits <= 500) return 6;
  if(bits <= 600) return 5;
  if(bits <= 800) return 4;
  if(bits <= 1250) return 3;
  return 2;
}

/**
 * Performs feature detection on the Node crypto interface.
 *
 * @param fn the feature (function) to detect.
 *
 * @return true if detected, false if not.
 */
function _detectNodeCrypto(fn) {
  return forge.util.isNodejs && typeof _crypto[fn] === 'function';
}

/**
 * Performs feature detection on the SubtleCrypto interface.
 *
 * @param fn the feature (function) to detect.
 *
 * @return true if detected, false if not.
 */
function _detectSubtleCrypto(fn) {
  return (typeof util.globalScope !== 'undefined' &&
    typeof util.globalScope.crypto === 'object' &&
    typeof util.globalScope.crypto.subtle === 'object' &&
    typeof util.globalScope.crypto.subtle[fn] === 'function');
}

/**
 * Performs feature detection on the deprecated Microsoft Internet Explorer
 * outdated SubtleCrypto interface. This function should only be used after
 * checking for the modern, standard SubtleCrypto interface.
 *
 * @param fn the feature (function) to detect.
 *
 * @return true if detected, false if not.
 */
function _detectSubtleMsCrypto(fn) {
  return (typeof util.globalScope !== 'undefined' &&
    typeof util.globalScope.msCrypto === 'object' &&
    typeof util.globalScope.msCrypto.subtle === 'object' &&
    typeof util.globalScope.msCrypto.subtle[fn] === 'function');
}

function _intToUint8Array(x) {
  var bytes = forge.util.hexToBytes(x.toString(16));
  var buffer = new Uint8Array(bytes.length);
  for(var i = 0; i < bytes.length; ++i) {
    buffer[i] = bytes.charCodeAt(i);
  }
  return buffer;
}

function _privateKeyFromJwk(jwk) {
  if(jwk.kty !== 'RSA') {
    throw new Error(
      'Unsupported key algorithm "' + jwk.kty + '"; algorithm must be "RSA".');
  }
  return pki.setRsaPrivateKey(
    _base64ToBigInt(jwk.n),
    _base64ToBigInt(jwk.e),
    _base64ToBigInt(jwk.d),
    _base64ToBigInt(jwk.p),
    _base64ToBigInt(jwk.q),
    _base64ToBigInt(jwk.dp),
    _base64ToBigInt(jwk.dq),
    _base64ToBigInt(jwk.qi));
}

function _publicKeyFromJwk(jwk) {
  if(jwk.kty !== 'RSA') {
    throw new Error('Key algorithm must be "RSA".');
  }
  return pki.setRsaPublicKey(
    _base64ToBigInt(jwk.n),
    _base64ToBigInt(jwk.e));
}

function _base64ToBigInt(b64) {
  return new BigInteger(forge.util.bytesToHex(forge.util.decode64(b64)), 16);
}

},{"./asn1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/asn1.js","./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./jsbn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/jsbn.js","./oids":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/oids.js","./pkcs1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pkcs1.js","./prime":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/prime.js","./random":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/random.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js","crypto":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browser-resolve/empty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/sha1.js":[function(require,module,exports){
/**
 * Secure Hash Algorithm with 160-bit digest (SHA-1) implementation.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2015 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./md');
require('./util');

var sha1 = module.exports = forge.sha1 = forge.sha1 || {};
forge.md.sha1 = forge.md.algorithms.sha1 = sha1;

/**
 * Creates a SHA-1 message digest object.
 *
 * @return a message digest object.
 */
sha1.create = function() {
  // do initialization as necessary
  if(!_initialized) {
    _init();
  }

  // SHA-1 state contains five 32-bit integers
  var _state = null;

  // input buffer
  var _input = forge.util.createBuffer();

  // used for word storage
  var _w = new Array(80);

  // message digest object
  var md = {
    algorithm: 'sha1',
    blockLength: 64,
    digestLength: 20,
    // 56-bit length of message so far (does not including padding)
    messageLength: 0,
    // true message length
    fullMessageLength: null,
    // size of message length in bytes
    messageLengthSize: 8
  };

  /**
   * Starts the digest.
   *
   * @return this digest object.
   */
  md.start = function() {
    // up to 56-bit message length for convenience
    md.messageLength = 0;

    // full message length (set md.messageLength64 for backwards-compatibility)
    md.fullMessageLength = md.messageLength64 = [];
    var int32s = md.messageLengthSize / 4;
    for(var i = 0; i < int32s; ++i) {
      md.fullMessageLength.push(0);
    }
    _input = forge.util.createBuffer();
    _state = {
      h0: 0x67452301,
      h1: 0xEFCDAB89,
      h2: 0x98BADCFE,
      h3: 0x10325476,
      h4: 0xC3D2E1F0
    };
    return md;
  };
  // start digest automatically for first time
  md.start();

  /**
   * Updates the digest with the given message input. The given input can
   * treated as raw input (no encoding will be applied) or an encoding of
   * 'utf8' maybe given to encode the input using UTF-8.
   *
   * @param msg the message input to update with.
   * @param encoding the encoding to use (default: 'raw', other: 'utf8').
   *
   * @return this digest object.
   */
  md.update = function(msg, encoding) {
    if(encoding === 'utf8') {
      msg = forge.util.encodeUtf8(msg);
    }

    // update message length
    var len = msg.length;
    md.messageLength += len;
    len = [(len / 0x100000000) >>> 0, len >>> 0];
    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {
      md.fullMessageLength[i] += len[1];
      len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0);
      md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0;
      len[0] = ((len[1] / 0x100000000) >>> 0);
    }

    // add bytes to input buffer
    _input.putBytes(msg);

    // process bytes
    _update(_state, _w, _input);

    // compact input buffer every 2K or if empty
    if(_input.read > 2048 || _input.length() === 0) {
      _input.compact();
    }

    return md;
  };

  /**
   * Produces the digest.
   *
   * @return a byte buffer containing the digest value.
   */
  md.digest = function() {
    /* Note: Here we copy the remaining bytes in the input buffer and
    add the appropriate SHA-1 padding. Then we do the final update
    on a copy of the state so that if the user wants to get
    intermediate digests they can do so. */

    /* Determine the number of bytes that must be added to the message
    to ensure its length is congruent to 448 mod 512. In other words,
    the data to be digested must be a multiple of 512 bits (or 128 bytes).
    This data includes the message, some padding, and the length of the
    message. Since the length of the message will be encoded as 8 bytes (64
    bits), that means that the last segment of the data must have 56 bytes
    (448 bits) of message and padding. Therefore, the length of the message
    plus the padding must be congruent to 448 mod 512 because
    512 - 128 = 448.

    In order to fill up the message length it must be filled with
    padding that begins with 1 bit followed by all 0 bits. Padding
    must *always* be present, so if the message length is already
    congruent to 448 mod 512, then 512 padding bits must be added. */

    var finalBlock = forge.util.createBuffer();
    finalBlock.putBytes(_input.bytes());

    // compute remaining size to be digested (include message length size)
    var remaining = (
      md.fullMessageLength[md.fullMessageLength.length - 1] +
      md.messageLengthSize);

    // add padding for overflow blockSize - overflow
    // _padding starts with 1 byte with first bit is set (byte value 128), then
    // there may be up to (blockSize - 1) other pad bytes
    var overflow = remaining & (md.blockLength - 1);
    finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow));

    // serialize message length in bits in big-endian order; since length
    // is stored in bytes we multiply by 8 and add carry from next int
    var next, carry;
    var bits = md.fullMessageLength[0] * 8;
    for(var i = 0; i < md.fullMessageLength.length - 1; ++i) {
      next = md.fullMessageLength[i + 1] * 8;
      carry = (next / 0x100000000) >>> 0;
      bits += carry;
      finalBlock.putInt32(bits >>> 0);
      bits = next >>> 0;
    }
    finalBlock.putInt32(bits);

    var s2 = {
      h0: _state.h0,
      h1: _state.h1,
      h2: _state.h2,
      h3: _state.h3,
      h4: _state.h4
    };
    _update(s2, _w, finalBlock);
    var rval = forge.util.createBuffer();
    rval.putInt32(s2.h0);
    rval.putInt32(s2.h1);
    rval.putInt32(s2.h2);
    rval.putInt32(s2.h3);
    rval.putInt32(s2.h4);
    return rval;
  };

  return md;
};

// sha-1 padding bytes not initialized yet
var _padding = null;
var _initialized = false;

/**
 * Initializes the constant tables.
 */
function _init() {
  // create padding
  _padding = String.fromCharCode(128);
  _padding += forge.util.fillString(String.fromCharCode(0x00), 64);

  // now initialized
  _initialized = true;
}

/**
 * Updates a SHA-1 state with the given byte buffer.
 *
 * @param s the SHA-1 state to update.
 * @param w the array to use to store words.
 * @param bytes the byte buffer to update with.
 */
function _update(s, w, bytes) {
  // consume 512 bit (64 byte) chunks
  var t, a, b, c, d, e, f, i;
  var len = bytes.length();
  while(len >= 64) {
    // the w array will be populated with sixteen 32-bit big-endian words
    // and then extended into 80 32-bit words according to SHA-1 algorithm
    // and for 32-79 using Max Locktyukhin's optimization

    // initialize hash value for this chunk
    a = s.h0;
    b = s.h1;
    c = s.h2;
    d = s.h3;
    e = s.h4;

    // round 1
    for(i = 0; i < 16; ++i) {
      t = bytes.getInt32();
      w[i] = t;
      f = d ^ (b & (c ^ d));
      t = ((a << 5) | (a >>> 27)) + f + e + 0x5A827999 + t;
      e = d;
      d = c;
      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug
      c = ((b << 30) | (b >>> 2)) >>> 0;
      b = a;
      a = t;
    }
    for(; i < 20; ++i) {
      t = (w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]);
      t = (t << 1) | (t >>> 31);
      w[i] = t;
      f = d ^ (b & (c ^ d));
      t = ((a << 5) | (a >>> 27)) + f + e + 0x5A827999 + t;
      e = d;
      d = c;
      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug
      c = ((b << 30) | (b >>> 2)) >>> 0;
      b = a;
      a = t;
    }
    // round 2
    for(; i < 32; ++i) {
      t = (w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]);
      t = (t << 1) | (t >>> 31);
      w[i] = t;
      f = b ^ c ^ d;
      t = ((a << 5) | (a >>> 27)) + f + e + 0x6ED9EBA1 + t;
      e = d;
      d = c;
      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug
      c = ((b << 30) | (b >>> 2)) >>> 0;
      b = a;
      a = t;
    }
    for(; i < 40; ++i) {
      t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]);
      t = (t << 2) | (t >>> 30);
      w[i] = t;
      f = b ^ c ^ d;
      t = ((a << 5) | (a >>> 27)) + f + e + 0x6ED9EBA1 + t;
      e = d;
      d = c;
      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug
      c = ((b << 30) | (b >>> 2)) >>> 0;
      b = a;
      a = t;
    }
    // round 3
    for(; i < 60; ++i) {
      t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]);
      t = (t << 2) | (t >>> 30);
      w[i] = t;
      f = (b & c) | (d & (b ^ c));
      t = ((a << 5) | (a >>> 27)) + f + e + 0x8F1BBCDC + t;
      e = d;
      d = c;
      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug
      c = ((b << 30) | (b >>> 2)) >>> 0;
      b = a;
      a = t;
    }
    // round 4
    for(; i < 80; ++i) {
      t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]);
      t = (t << 2) | (t >>> 30);
      w[i] = t;
      f = b ^ c ^ d;
      t = ((a << 5) | (a >>> 27)) + f + e + 0xCA62C1D6 + t;
      e = d;
      d = c;
      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug
      c = ((b << 30) | (b >>> 2)) >>> 0;
      b = a;
      a = t;
    }

    // update hash state
    s.h0 = (s.h0 + a) | 0;
    s.h1 = (s.h1 + b) | 0;
    s.h2 = (s.h2 + c) | 0;
    s.h3 = (s.h3 + d) | 0;
    s.h4 = (s.h4 + e) | 0;

    len -= 64;
  }
}

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./md":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/md.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/sha256.js":[function(require,module,exports){
/**
 * Secure Hash Algorithm with 256-bit digest (SHA-256) implementation.
 *
 * See FIPS 180-2 for details.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2015 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./md');
require('./util');

var sha256 = module.exports = forge.sha256 = forge.sha256 || {};
forge.md.sha256 = forge.md.algorithms.sha256 = sha256;

/**
 * Creates a SHA-256 message digest object.
 *
 * @return a message digest object.
 */
sha256.create = function() {
  // do initialization as necessary
  if(!_initialized) {
    _init();
  }

  // SHA-256 state contains eight 32-bit integers
  var _state = null;

  // input buffer
  var _input = forge.util.createBuffer();

  // used for word storage
  var _w = new Array(64);

  // message digest object
  var md = {
    algorithm: 'sha256',
    blockLength: 64,
    digestLength: 32,
    // 56-bit length of message so far (does not including padding)
    messageLength: 0,
    // true message length
    fullMessageLength: null,
    // size of message length in bytes
    messageLengthSize: 8
  };

  /**
   * Starts the digest.
   *
   * @return this digest object.
   */
  md.start = function() {
    // up to 56-bit message length for convenience
    md.messageLength = 0;

    // full message length (set md.messageLength64 for backwards-compatibility)
    md.fullMessageLength = md.messageLength64 = [];
    var int32s = md.messageLengthSize / 4;
    for(var i = 0; i < int32s; ++i) {
      md.fullMessageLength.push(0);
    }
    _input = forge.util.createBuffer();
    _state = {
      h0: 0x6A09E667,
      h1: 0xBB67AE85,
      h2: 0x3C6EF372,
      h3: 0xA54FF53A,
      h4: 0x510E527F,
      h5: 0x9B05688C,
      h6: 0x1F83D9AB,
      h7: 0x5BE0CD19
    };
    return md;
  };
  // start digest automatically for first time
  md.start();

  /**
   * Updates the digest with the given message input. The given input can
   * treated as raw input (no encoding will be applied) or an encoding of
   * 'utf8' maybe given to encode the input using UTF-8.
   *
   * @param msg the message input to update with.
   * @param encoding the encoding to use (default: 'raw', other: 'utf8').
   *
   * @return this digest object.
   */
  md.update = function(msg, encoding) {
    if(encoding === 'utf8') {
      msg = forge.util.encodeUtf8(msg);
    }

    // update message length
    var len = msg.length;
    md.messageLength += len;
    len = [(len / 0x100000000) >>> 0, len >>> 0];
    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {
      md.fullMessageLength[i] += len[1];
      len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0);
      md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0;
      len[0] = ((len[1] / 0x100000000) >>> 0);
    }

    // add bytes to input buffer
    _input.putBytes(msg);

    // process bytes
    _update(_state, _w, _input);

    // compact input buffer every 2K or if empty
    if(_input.read > 2048 || _input.length() === 0) {
      _input.compact();
    }

    return md;
  };

  /**
   * Produces the digest.
   *
   * @return a byte buffer containing the digest value.
   */
  md.digest = function() {
    /* Note: Here we copy the remaining bytes in the input buffer and
    add the appropriate SHA-256 padding. Then we do the final update
    on a copy of the state so that if the user wants to get
    intermediate digests they can do so. */

    /* Determine the number of bytes that must be added to the message
    to ensure its length is congruent to 448 mod 512. In other words,
    the data to be digested must be a multiple of 512 bits (or 128 bytes).
    This data includes the message, some padding, and the length of the
    message. Since the length of the message will be encoded as 8 bytes (64
    bits), that means that the last segment of the data must have 56 bytes
    (448 bits) of message and padding. Therefore, the length of the message
    plus the padding must be congruent to 448 mod 512 because
    512 - 128 = 448.

    In order to fill up the message length it must be filled with
    padding that begins with 1 bit followed by all 0 bits. Padding
    must *always* be present, so if the message length is already
    congruent to 448 mod 512, then 512 padding bits must be added. */

    var finalBlock = forge.util.createBuffer();
    finalBlock.putBytes(_input.bytes());

    // compute remaining size to be digested (include message length size)
    var remaining = (
      md.fullMessageLength[md.fullMessageLength.length - 1] +
      md.messageLengthSize);

    // add padding for overflow blockSize - overflow
    // _padding starts with 1 byte with first bit is set (byte value 128), then
    // there may be up to (blockSize - 1) other pad bytes
    var overflow = remaining & (md.blockLength - 1);
    finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow));

    // serialize message length in bits in big-endian order; since length
    // is stored in bytes we multiply by 8 and add carry from next int
    var next, carry;
    var bits = md.fullMessageLength[0] * 8;
    for(var i = 0; i < md.fullMessageLength.length - 1; ++i) {
      next = md.fullMessageLength[i + 1] * 8;
      carry = (next / 0x100000000) >>> 0;
      bits += carry;
      finalBlock.putInt32(bits >>> 0);
      bits = next >>> 0;
    }
    finalBlock.putInt32(bits);

    var s2 = {
      h0: _state.h0,
      h1: _state.h1,
      h2: _state.h2,
      h3: _state.h3,
      h4: _state.h4,
      h5: _state.h5,
      h6: _state.h6,
      h7: _state.h7
    };
    _update(s2, _w, finalBlock);
    var rval = forge.util.createBuffer();
    rval.putInt32(s2.h0);
    rval.putInt32(s2.h1);
    rval.putInt32(s2.h2);
    rval.putInt32(s2.h3);
    rval.putInt32(s2.h4);
    rval.putInt32(s2.h5);
    rval.putInt32(s2.h6);
    rval.putInt32(s2.h7);
    return rval;
  };

  return md;
};

// sha-256 padding bytes not initialized yet
var _padding = null;
var _initialized = false;

// table of constants
var _k = null;

/**
 * Initializes the constant tables.
 */
function _init() {
  // create padding
  _padding = String.fromCharCode(128);
  _padding += forge.util.fillString(String.fromCharCode(0x00), 64);

  // create K table for SHA-256
  _k = [
    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
    0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
    0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
    0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
    0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
    0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];

  // now initialized
  _initialized = true;
}

/**
 * Updates a SHA-256 state with the given byte buffer.
 *
 * @param s the SHA-256 state to update.
 * @param w the array to use to store words.
 * @param bytes the byte buffer to update with.
 */
function _update(s, w, bytes) {
  // consume 512 bit (64 byte) chunks
  var t1, t2, s0, s1, ch, maj, i, a, b, c, d, e, f, g, h;
  var len = bytes.length();
  while(len >= 64) {
    // the w array will be populated with sixteen 32-bit big-endian words
    // and then extended into 64 32-bit words according to SHA-256
    for(i = 0; i < 16; ++i) {
      w[i] = bytes.getInt32();
    }
    for(; i < 64; ++i) {
      // XOR word 2 words ago rot right 17, rot right 19, shft right 10
      t1 = w[i - 2];
      t1 =
        ((t1 >>> 17) | (t1 << 15)) ^
        ((t1 >>> 19) | (t1 << 13)) ^
        (t1 >>> 10);
      // XOR word 15 words ago rot right 7, rot right 18, shft right 3
      t2 = w[i - 15];
      t2 =
        ((t2 >>> 7) | (t2 << 25)) ^
        ((t2 >>> 18) | (t2 << 14)) ^
        (t2 >>> 3);
      // sum(t1, word 7 ago, t2, word 16 ago) modulo 2^32
      w[i] = (t1 + w[i - 7] + t2 + w[i - 16]) | 0;
    }

    // initialize hash value for this chunk
    a = s.h0;
    b = s.h1;
    c = s.h2;
    d = s.h3;
    e = s.h4;
    f = s.h5;
    g = s.h6;
    h = s.h7;

    // round function
    for(i = 0; i < 64; ++i) {
      // Sum1(e)
      s1 =
        ((e >>> 6) | (e << 26)) ^
        ((e >>> 11) | (e << 21)) ^
        ((e >>> 25) | (e << 7));
      // Ch(e, f, g) (optimized the same way as SHA-1)
      ch = g ^ (e & (f ^ g));
      // Sum0(a)
      s0 =
        ((a >>> 2) | (a << 30)) ^
        ((a >>> 13) | (a << 19)) ^
        ((a >>> 22) | (a << 10));
      // Maj(a, b, c) (optimized the same way as SHA-1)
      maj = (a & b) | (c & (a ^ b));

      // main algorithm
      t1 = h + s1 + ch + _k[i] + w[i];
      t2 = s0 + maj;
      h = g;
      g = f;
      f = e;
      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug
      // can't truncate with `| 0`
      e = (d + t1) >>> 0;
      d = c;
      c = b;
      b = a;
      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug
      // can't truncate with `| 0`
      a = (t1 + t2) >>> 0;
    }

    // update hash state
    s.h0 = (s.h0 + a) | 0;
    s.h1 = (s.h1 + b) | 0;
    s.h2 = (s.h2 + c) | 0;
    s.h3 = (s.h3 + d) | 0;
    s.h4 = (s.h4 + e) | 0;
    s.h5 = (s.h5 + f) | 0;
    s.h6 = (s.h6 + g) | 0;
    s.h7 = (s.h7 + h) | 0;
    len -= 64;
  }
}

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./md":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/md.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/sha512.js":[function(require,module,exports){
/**
 * Secure Hash Algorithm with a 1024-bit block size implementation.
 *
 * This includes: SHA-512, SHA-384, SHA-512/224, and SHA-512/256. For
 * SHA-256 (block size 512 bits), see sha256.js.
 *
 * See FIPS 180-4 for details.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2014-2015 Digital Bazaar, Inc.
 */
var forge = require('./forge');
require('./md');
require('./util');

var sha512 = module.exports = forge.sha512 = forge.sha512 || {};

// SHA-512
forge.md.sha512 = forge.md.algorithms.sha512 = sha512;

// SHA-384
var sha384 = forge.sha384 = forge.sha512.sha384 = forge.sha512.sha384 || {};
sha384.create = function() {
  return sha512.create('SHA-384');
};
forge.md.sha384 = forge.md.algorithms.sha384 = sha384;

// SHA-512/256
forge.sha512.sha256 = forge.sha512.sha256 || {
  create: function() {
    return sha512.create('SHA-512/256');
  }
};
forge.md['sha512/256'] = forge.md.algorithms['sha512/256'] =
  forge.sha512.sha256;

// SHA-512/224
forge.sha512.sha224 = forge.sha512.sha224 || {
  create: function() {
    return sha512.create('SHA-512/224');
  }
};
forge.md['sha512/224'] = forge.md.algorithms['sha512/224'] =
  forge.sha512.sha224;

/**
 * Creates a SHA-2 message digest object.
 *
 * @param algorithm the algorithm to use (SHA-512, SHA-384, SHA-512/224,
 *          SHA-512/256).
 *
 * @return a message digest object.
 */
sha512.create = function(algorithm) {
  // do initialization as necessary
  if(!_initialized) {
    _init();
  }

  if(typeof algorithm === 'undefined') {
    algorithm = 'SHA-512';
  }

  if(!(algorithm in _states)) {
    throw new Error('Invalid SHA-512 algorithm: ' + algorithm);
  }

  // SHA-512 state contains eight 64-bit integers (each as two 32-bit ints)
  var _state = _states[algorithm];
  var _h = null;

  // input buffer
  var _input = forge.util.createBuffer();

  // used for 64-bit word storage
  var _w = new Array(80);
  for(var wi = 0; wi < 80; ++wi) {
    _w[wi] = new Array(2);
  }

  // determine digest length by algorithm name (default)
  var digestLength = 64;
  switch(algorithm) {
    case 'SHA-384':
      digestLength = 48;
      break;
    case 'SHA-512/256':
      digestLength = 32;
      break;
    case 'SHA-512/224':
      digestLength = 28;
      break;
  }

  // message digest object
  var md = {
    // SHA-512 => sha512
    algorithm: algorithm.replace('-', '').toLowerCase(),
    blockLength: 128,
    digestLength: digestLength,
    // 56-bit length of message so far (does not including padding)
    messageLength: 0,
    // true message length
    fullMessageLength: null,
    // size of message length in bytes
    messageLengthSize: 16
  };

  /**
   * Starts the digest.
   *
   * @return this digest object.
   */
  md.start = function() {
    // up to 56-bit message length for convenience
    md.messageLength = 0;

    // full message length (set md.messageLength128 for backwards-compatibility)
    md.fullMessageLength = md.messageLength128 = [];
    var int32s = md.messageLengthSize / 4;
    for(var i = 0; i < int32s; ++i) {
      md.fullMessageLength.push(0);
    }
    _input = forge.util.createBuffer();
    _h = new Array(_state.length);
    for(var i = 0; i < _state.length; ++i) {
      _h[i] = _state[i].slice(0);
    }
    return md;
  };
  // start digest automatically for first time
  md.start();

  /**
   * Updates the digest with the given message input. The given input can
   * treated as raw input (no encoding will be applied) or an encoding of
   * 'utf8' maybe given to encode the input using UTF-8.
   *
   * @param msg the message input to update with.
   * @param encoding the encoding to use (default: 'raw', other: 'utf8').
   *
   * @return this digest object.
   */
  md.update = function(msg, encoding) {
    if(encoding === 'utf8') {
      msg = forge.util.encodeUtf8(msg);
    }

    // update message length
    var len = msg.length;
    md.messageLength += len;
    len = [(len / 0x100000000) >>> 0, len >>> 0];
    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {
      md.fullMessageLength[i] += len[1];
      len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0);
      md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0;
      len[0] = ((len[1] / 0x100000000) >>> 0);
    }

    // add bytes to input buffer
    _input.putBytes(msg);

    // process bytes
    _update(_h, _w, _input);

    // compact input buffer every 2K or if empty
    if(_input.read > 2048 || _input.length() === 0) {
      _input.compact();
    }

    return md;
  };

  /**
   * Produces the digest.
   *
   * @return a byte buffer containing the digest value.
   */
  md.digest = function() {
    /* Note: Here we copy the remaining bytes in the input buffer and
    add the appropriate SHA-512 padding. Then we do the final update
    on a copy of the state so that if the user wants to get
    intermediate digests they can do so. */

    /* Determine the number of bytes that must be added to the message
    to ensure its length is congruent to 896 mod 1024. In other words,
    the data to be digested must be a multiple of 1024 bits (or 128 bytes).
    This data includes the message, some padding, and the length of the
    message. Since the length of the message will be encoded as 16 bytes (128
    bits), that means that the last segment of the data must have 112 bytes
    (896 bits) of message and padding. Therefore, the length of the message
    plus the padding must be congruent to 896 mod 1024 because
    1024 - 128 = 896.

    In order to fill up the message length it must be filled with
    padding that begins with 1 bit followed by all 0 bits. Padding
    must *always* be present, so if the message length is already
    congruent to 896 mod 1024, then 1024 padding bits must be added. */

    var finalBlock = forge.util.createBuffer();
    finalBlock.putBytes(_input.bytes());

    // compute remaining size to be digested (include message length size)
    var remaining = (
      md.fullMessageLength[md.fullMessageLength.length - 1] +
      md.messageLengthSize);

    // add padding for overflow blockSize - overflow
    // _padding starts with 1 byte with first bit is set (byte value 128), then
    // there may be up to (blockSize - 1) other pad bytes
    var overflow = remaining & (md.blockLength - 1);
    finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow));

    // serialize message length in bits in big-endian order; since length
    // is stored in bytes we multiply by 8 and add carry from next int
    var next, carry;
    var bits = md.fullMessageLength[0] * 8;
    for(var i = 0; i < md.fullMessageLength.length - 1; ++i) {
      next = md.fullMessageLength[i + 1] * 8;
      carry = (next / 0x100000000) >>> 0;
      bits += carry;
      finalBlock.putInt32(bits >>> 0);
      bits = next >>> 0;
    }
    finalBlock.putInt32(bits);

    var h = new Array(_h.length);
    for(var i = 0; i < _h.length; ++i) {
      h[i] = _h[i].slice(0);
    }
    _update(h, _w, finalBlock);
    var rval = forge.util.createBuffer();
    var hlen;
    if(algorithm === 'SHA-512') {
      hlen = h.length;
    } else if(algorithm === 'SHA-384') {
      hlen = h.length - 2;
    } else {
      hlen = h.length - 4;
    }
    for(var i = 0; i < hlen; ++i) {
      rval.putInt32(h[i][0]);
      if(i !== hlen - 1 || algorithm !== 'SHA-512/224') {
        rval.putInt32(h[i][1]);
      }
    }
    return rval;
  };

  return md;
};

// sha-512 padding bytes not initialized yet
var _padding = null;
var _initialized = false;

// table of constants
var _k = null;

// initial hash states
var _states = null;

/**
 * Initializes the constant tables.
 */
function _init() {
  // create padding
  _padding = String.fromCharCode(128);
  _padding += forge.util.fillString(String.fromCharCode(0x00), 128);

  // create K table for SHA-512
  _k = [
    [0x428a2f98, 0xd728ae22], [0x71374491, 0x23ef65cd],
    [0xb5c0fbcf, 0xec4d3b2f], [0xe9b5dba5, 0x8189dbbc],
    [0x3956c25b, 0xf348b538], [0x59f111f1, 0xb605d019],
    [0x923f82a4, 0xaf194f9b], [0xab1c5ed5, 0xda6d8118],
    [0xd807aa98, 0xa3030242], [0x12835b01, 0x45706fbe],
    [0x243185be, 0x4ee4b28c], [0x550c7dc3, 0xd5ffb4e2],
    [0x72be5d74, 0xf27b896f], [0x80deb1fe, 0x3b1696b1],
    [0x9bdc06a7, 0x25c71235], [0xc19bf174, 0xcf692694],
    [0xe49b69c1, 0x9ef14ad2], [0xefbe4786, 0x384f25e3],
    [0x0fc19dc6, 0x8b8cd5b5], [0x240ca1cc, 0x77ac9c65],
    [0x2de92c6f, 0x592b0275], [0x4a7484aa, 0x6ea6e483],
    [0x5cb0a9dc, 0xbd41fbd4], [0x76f988da, 0x831153b5],
    [0x983e5152, 0xee66dfab], [0xa831c66d, 0x2db43210],
    [0xb00327c8, 0x98fb213f], [0xbf597fc7, 0xbeef0ee4],
    [0xc6e00bf3, 0x3da88fc2], [0xd5a79147, 0x930aa725],
    [0x06ca6351, 0xe003826f], [0x14292967, 0x0a0e6e70],
    [0x27b70a85, 0x46d22ffc], [0x2e1b2138, 0x5c26c926],
    [0x4d2c6dfc, 0x5ac42aed], [0x53380d13, 0x9d95b3df],
    [0x650a7354, 0x8baf63de], [0x766a0abb, 0x3c77b2a8],
    [0x81c2c92e, 0x47edaee6], [0x92722c85, 0x1482353b],
    [0xa2bfe8a1, 0x4cf10364], [0xa81a664b, 0xbc423001],
    [0xc24b8b70, 0xd0f89791], [0xc76c51a3, 0x0654be30],
    [0xd192e819, 0xd6ef5218], [0xd6990624, 0x5565a910],
    [0xf40e3585, 0x5771202a], [0x106aa070, 0x32bbd1b8],
    [0x19a4c116, 0xb8d2d0c8], [0x1e376c08, 0x5141ab53],
    [0x2748774c, 0xdf8eeb99], [0x34b0bcb5, 0xe19b48a8],
    [0x391c0cb3, 0xc5c95a63], [0x4ed8aa4a, 0xe3418acb],
    [0x5b9cca4f, 0x7763e373], [0x682e6ff3, 0xd6b2b8a3],
    [0x748f82ee, 0x5defb2fc], [0x78a5636f, 0x43172f60],
    [0x84c87814, 0xa1f0ab72], [0x8cc70208, 0x1a6439ec],
    [0x90befffa, 0x23631e28], [0xa4506ceb, 0xde82bde9],
    [0xbef9a3f7, 0xb2c67915], [0xc67178f2, 0xe372532b],
    [0xca273ece, 0xea26619c], [0xd186b8c7, 0x21c0c207],
    [0xeada7dd6, 0xcde0eb1e], [0xf57d4f7f, 0xee6ed178],
    [0x06f067aa, 0x72176fba], [0x0a637dc5, 0xa2c898a6],
    [0x113f9804, 0xbef90dae], [0x1b710b35, 0x131c471b],
    [0x28db77f5, 0x23047d84], [0x32caab7b, 0x40c72493],
    [0x3c9ebe0a, 0x15c9bebc], [0x431d67c4, 0x9c100d4c],
    [0x4cc5d4be, 0xcb3e42b6], [0x597f299c, 0xfc657e2a],
    [0x5fcb6fab, 0x3ad6faec], [0x6c44198c, 0x4a475817]
  ];

  // initial hash states
  _states = {};
  _states['SHA-512'] = [
    [0x6a09e667, 0xf3bcc908],
    [0xbb67ae85, 0x84caa73b],
    [0x3c6ef372, 0xfe94f82b],
    [0xa54ff53a, 0x5f1d36f1],
    [0x510e527f, 0xade682d1],
    [0x9b05688c, 0x2b3e6c1f],
    [0x1f83d9ab, 0xfb41bd6b],
    [0x5be0cd19, 0x137e2179]
  ];
  _states['SHA-384'] = [
    [0xcbbb9d5d, 0xc1059ed8],
    [0x629a292a, 0x367cd507],
    [0x9159015a, 0x3070dd17],
    [0x152fecd8, 0xf70e5939],
    [0x67332667, 0xffc00b31],
    [0x8eb44a87, 0x68581511],
    [0xdb0c2e0d, 0x64f98fa7],
    [0x47b5481d, 0xbefa4fa4]
  ];
  _states['SHA-512/256'] = [
    [0x22312194, 0xFC2BF72C],
    [0x9F555FA3, 0xC84C64C2],
    [0x2393B86B, 0x6F53B151],
    [0x96387719, 0x5940EABD],
    [0x96283EE2, 0xA88EFFE3],
    [0xBE5E1E25, 0x53863992],
    [0x2B0199FC, 0x2C85B8AA],
    [0x0EB72DDC, 0x81C52CA2]
  ];
  _states['SHA-512/224'] = [
    [0x8C3D37C8, 0x19544DA2],
    [0x73E19966, 0x89DCD4D6],
    [0x1DFAB7AE, 0x32FF9C82],
    [0x679DD514, 0x582F9FCF],
    [0x0F6D2B69, 0x7BD44DA8],
    [0x77E36F73, 0x04C48942],
    [0x3F9D85A8, 0x6A1D36C8],
    [0x1112E6AD, 0x91D692A1]
  ];

  // now initialized
  _initialized = true;
}

/**
 * Updates a SHA-512 state with the given byte buffer.
 *
 * @param s the SHA-512 state to update.
 * @param w the array to use to store words.
 * @param bytes the byte buffer to update with.
 */
function _update(s, w, bytes) {
  // consume 512 bit (128 byte) chunks
  var t1_hi, t1_lo;
  var t2_hi, t2_lo;
  var s0_hi, s0_lo;
  var s1_hi, s1_lo;
  var ch_hi, ch_lo;
  var maj_hi, maj_lo;
  var a_hi, a_lo;
  var b_hi, b_lo;
  var c_hi, c_lo;
  var d_hi, d_lo;
  var e_hi, e_lo;
  var f_hi, f_lo;
  var g_hi, g_lo;
  var h_hi, h_lo;
  var i, hi, lo, w2, w7, w15, w16;
  var len = bytes.length();
  while(len >= 128) {
    // the w array will be populated with sixteen 64-bit big-endian words
    // and then extended into 64 64-bit words according to SHA-512
    for(i = 0; i < 16; ++i) {
      w[i][0] = bytes.getInt32() >>> 0;
      w[i][1] = bytes.getInt32() >>> 0;
    }
    for(; i < 80; ++i) {
      // for word 2 words ago: ROTR 19(x) ^ ROTR 61(x) ^ SHR 6(x)
      w2 = w[i - 2];
      hi = w2[0];
      lo = w2[1];

      // high bits
      t1_hi = (
        ((hi >>> 19) | (lo << 13)) ^ // ROTR 19
        ((lo >>> 29) | (hi << 3)) ^ // ROTR 61/(swap + ROTR 29)
        (hi >>> 6)) >>> 0; // SHR 6
      // low bits
      t1_lo = (
        ((hi << 13) | (lo >>> 19)) ^ // ROTR 19
        ((lo << 3) | (hi >>> 29)) ^ // ROTR 61/(swap + ROTR 29)
        ((hi << 26) | (lo >>> 6))) >>> 0; // SHR 6

      // for word 15 words ago: ROTR 1(x) ^ ROTR 8(x) ^ SHR 7(x)
      w15 = w[i - 15];
      hi = w15[0];
      lo = w15[1];

      // high bits
      t2_hi = (
        ((hi >>> 1) | (lo << 31)) ^ // ROTR 1
        ((hi >>> 8) | (lo << 24)) ^ // ROTR 8
        (hi >>> 7)) >>> 0; // SHR 7
      // low bits
      t2_lo = (
        ((hi << 31) | (lo >>> 1)) ^ // ROTR 1
        ((hi << 24) | (lo >>> 8)) ^ // ROTR 8
        ((hi << 25) | (lo >>> 7))) >>> 0; // SHR 7

      // sum(t1, word 7 ago, t2, word 16 ago) modulo 2^64 (carry lo overflow)
      w7 = w[i - 7];
      w16 = w[i - 16];
      lo = (t1_lo + w7[1] + t2_lo + w16[1]);
      w[i][0] = (t1_hi + w7[0] + t2_hi + w16[0] +
        ((lo / 0x100000000) >>> 0)) >>> 0;
      w[i][1] = lo >>> 0;
    }

    // initialize hash value for this chunk
    a_hi = s[0][0];
    a_lo = s[0][1];
    b_hi = s[1][0];
    b_lo = s[1][1];
    c_hi = s[2][0];
    c_lo = s[2][1];
    d_hi = s[3][0];
    d_lo = s[3][1];
    e_hi = s[4][0];
    e_lo = s[4][1];
    f_hi = s[5][0];
    f_lo = s[5][1];
    g_hi = s[6][0];
    g_lo = s[6][1];
    h_hi = s[7][0];
    h_lo = s[7][1];

    // round function
    for(i = 0; i < 80; ++i) {
      // Sum1(e) = ROTR 14(e) ^ ROTR 18(e) ^ ROTR 41(e)
      s1_hi = (
        ((e_hi >>> 14) | (e_lo << 18)) ^ // ROTR 14
        ((e_hi >>> 18) | (e_lo << 14)) ^ // ROTR 18
        ((e_lo >>> 9) | (e_hi << 23))) >>> 0; // ROTR 41/(swap + ROTR 9)
      s1_lo = (
        ((e_hi << 18) | (e_lo >>> 14)) ^ // ROTR 14
        ((e_hi << 14) | (e_lo >>> 18)) ^ // ROTR 18
        ((e_lo << 23) | (e_hi >>> 9))) >>> 0; // ROTR 41/(swap + ROTR 9)

      // Ch(e, f, g) (optimized the same way as SHA-1)
      ch_hi = (g_hi ^ (e_hi & (f_hi ^ g_hi))) >>> 0;
      ch_lo = (g_lo ^ (e_lo & (f_lo ^ g_lo))) >>> 0;

      // Sum0(a) = ROTR 28(a) ^ ROTR 34(a) ^ ROTR 39(a)
      s0_hi = (
        ((a_hi >>> 28) | (a_lo << 4)) ^ // ROTR 28
        ((a_lo >>> 2) | (a_hi << 30)) ^ // ROTR 34/(swap + ROTR 2)
        ((a_lo >>> 7) | (a_hi << 25))) >>> 0; // ROTR 39/(swap + ROTR 7)
      s0_lo = (
        ((a_hi << 4) | (a_lo >>> 28)) ^ // ROTR 28
        ((a_lo << 30) | (a_hi >>> 2)) ^ // ROTR 34/(swap + ROTR 2)
        ((a_lo << 25) | (a_hi >>> 7))) >>> 0; // ROTR 39/(swap + ROTR 7)

      // Maj(a, b, c) (optimized the same way as SHA-1)
      maj_hi = ((a_hi & b_hi) | (c_hi & (a_hi ^ b_hi))) >>> 0;
      maj_lo = ((a_lo & b_lo) | (c_lo & (a_lo ^ b_lo))) >>> 0;

      // main algorithm
      // t1 = (h + s1 + ch + _k[i] + _w[i]) modulo 2^64 (carry lo overflow)
      lo = (h_lo + s1_lo + ch_lo + _k[i][1] + w[i][1]);
      t1_hi = (h_hi + s1_hi + ch_hi + _k[i][0] + w[i][0] +
        ((lo / 0x100000000) >>> 0)) >>> 0;
      t1_lo = lo >>> 0;

      // t2 = s0 + maj modulo 2^64 (carry lo overflow)
      lo = s0_lo + maj_lo;
      t2_hi = (s0_hi + maj_hi + ((lo / 0x100000000) >>> 0)) >>> 0;
      t2_lo = lo >>> 0;

      h_hi = g_hi;
      h_lo = g_lo;

      g_hi = f_hi;
      g_lo = f_lo;

      f_hi = e_hi;
      f_lo = e_lo;

      // e = (d + t1) modulo 2^64 (carry lo overflow)
      lo = d_lo + t1_lo;
      e_hi = (d_hi + t1_hi + ((lo / 0x100000000) >>> 0)) >>> 0;
      e_lo = lo >>> 0;

      d_hi = c_hi;
      d_lo = c_lo;

      c_hi = b_hi;
      c_lo = b_lo;

      b_hi = a_hi;
      b_lo = a_lo;

      // a = (t1 + t2) modulo 2^64 (carry lo overflow)
      lo = t1_lo + t2_lo;
      a_hi = (t1_hi + t2_hi + ((lo / 0x100000000) >>> 0)) >>> 0;
      a_lo = lo >>> 0;
    }

    // update hash state (additional modulo 2^64)
    lo = s[0][1] + a_lo;
    s[0][0] = (s[0][0] + a_hi + ((lo / 0x100000000) >>> 0)) >>> 0;
    s[0][1] = lo >>> 0;

    lo = s[1][1] + b_lo;
    s[1][0] = (s[1][0] + b_hi + ((lo / 0x100000000) >>> 0)) >>> 0;
    s[1][1] = lo >>> 0;

    lo = s[2][1] + c_lo;
    s[2][0] = (s[2][0] + c_hi + ((lo / 0x100000000) >>> 0)) >>> 0;
    s[2][1] = lo >>> 0;

    lo = s[3][1] + d_lo;
    s[3][0] = (s[3][0] + d_hi + ((lo / 0x100000000) >>> 0)) >>> 0;
    s[3][1] = lo >>> 0;

    lo = s[4][1] + e_lo;
    s[4][0] = (s[4][0] + e_hi + ((lo / 0x100000000) >>> 0)) >>> 0;
    s[4][1] = lo >>> 0;

    lo = s[5][1] + f_lo;
    s[5][0] = (s[5][0] + f_hi + ((lo / 0x100000000) >>> 0)) >>> 0;
    s[5][1] = lo >>> 0;

    lo = s[6][1] + g_lo;
    s[6][0] = (s[6][0] + g_hi + ((lo / 0x100000000) >>> 0)) >>> 0;
    s[6][1] = lo >>> 0;

    lo = s[7][1] + h_lo;
    s[7][0] = (s[7][0] + h_hi + ((lo / 0x100000000) >>> 0)) >>> 0;
    s[7][1] = lo >>> 0;

    len -= 128;
  }
}

},{"./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./md":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/md.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js":[function(require,module,exports){
(function (process,global,Buffer,__argument0,__argument1,__argument2,__argument3,setImmediate){(function (){
/**
 * Utility functions for web applications.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2018 Digital Bazaar, Inc.
 */
var forge = require('./forge');
var baseN = require('./baseN');

/* Utilities API */
var util = module.exports = forge.util = forge.util || {};

// define setImmediate and nextTick
(function() {
  // use native nextTick (unless we're in webpack)
  // webpack (or better node-libs-browser polyfill) sets process.browser.
  // this way we can detect webpack properly
  if(typeof process !== 'undefined' && process.nextTick && !process.browser) {
    util.nextTick = process.nextTick;
    if(typeof setImmediate === 'function') {
      util.setImmediate = setImmediate;
    } else {
      // polyfill setImmediate with nextTick, older versions of node
      // (those w/o setImmediate) won't totally starve IO
      util.setImmediate = util.nextTick;
    }
    return;
  }

  // polyfill nextTick with native setImmediate
  if(typeof setImmediate === 'function') {
    util.setImmediate = function() { return setImmediate.apply(undefined, arguments); };
    util.nextTick = function(callback) {
      return setImmediate(callback);
    };
    return;
  }

  /* Note: A polyfill upgrade pattern is used here to allow combining
  polyfills. For example, MutationObserver is fast, but blocks UI updates,
  so it needs to allow UI updates periodically, so it falls back on
  postMessage or setTimeout. */

  // polyfill with setTimeout
  util.setImmediate = function(callback) {
    setTimeout(callback, 0);
  };

  // upgrade polyfill to use postMessage
  if(typeof window !== 'undefined' &&
    typeof window.postMessage === 'function') {
    var msg = 'forge.setImmediate';
    var callbacks = [];
    util.setImmediate = function(callback) {
      callbacks.push(callback);
      // only send message when one hasn't been sent in
      // the current turn of the event loop
      if(callbacks.length === 1) {
        window.postMessage(msg, '*');
      }
    };
    function handler(event) {
      if(event.source === window && event.data === msg) {
        event.stopPropagation();
        var copy = callbacks.slice();
        callbacks.length = 0;
        copy.forEach(function(callback) {
          callback();
        });
      }
    }
    window.addEventListener('message', handler, true);
  }

  // upgrade polyfill to use MutationObserver
  if(typeof MutationObserver !== 'undefined') {
    // polyfill with MutationObserver
    var now = Date.now();
    var attr = true;
    var div = document.createElement('div');
    var callbacks = [];
    new MutationObserver(function() {
      var copy = callbacks.slice();
      callbacks.length = 0;
      copy.forEach(function(callback) {
        callback();
      });
    }).observe(div, {attributes: true});
    var oldSetImmediate = util.setImmediate;
    util.setImmediate = function(callback) {
      if(Date.now() - now > 15) {
        now = Date.now();
        oldSetImmediate(callback);
      } else {
        callbacks.push(callback);
        // only trigger observer when it hasn't been triggered in
        // the current turn of the event loop
        if(callbacks.length === 1) {
          div.setAttribute('a', attr = !attr);
        }
      }
    };
  }

  util.nextTick = util.setImmediate;
})();

// check if running under Node.js
util.isNodejs =
  typeof process !== 'undefined' && process.versions && process.versions.node;


// 'self' will also work in Web Workers (instance of WorkerGlobalScope) while
// it will point to `window` in the main thread.
// To remain compatible with older browsers, we fall back to 'window' if 'self'
// is not available.
util.globalScope = (function() {
  if(util.isNodejs) {
    return global;
  }

  return typeof self === 'undefined' ? window : self;
})();

// define isArray
util.isArray = Array.isArray || function(x) {
  return Object.prototype.toString.call(x) === '[object Array]';
};

// define isArrayBuffer
util.isArrayBuffer = function(x) {
  return typeof ArrayBuffer !== 'undefined' && x instanceof ArrayBuffer;
};

// define isArrayBufferView
util.isArrayBufferView = function(x) {
  return x && util.isArrayBuffer(x.buffer) && x.byteLength !== undefined;
};

/**
 * Ensure a bits param is 8, 16, 24, or 32. Used to validate input for
 * algorithms where bit manipulation, JavaScript limitations, and/or algorithm
 * design only allow for byte operations of a limited size.
 *
 * @param n number of bits.
 *
 * Throw Error if n invalid.
 */
function _checkBitsParam(n) {
  if(!(n === 8 || n === 16 || n === 24 || n === 32)) {
    throw new Error('Only 8, 16, 24, or 32 bits supported: ' + n);
  }
}

// TODO: set ByteBuffer to best available backing
util.ByteBuffer = ByteStringBuffer;

/** Buffer w/BinaryString backing */

/**
 * Constructor for a binary string backed byte buffer.
 *
 * @param [b] the bytes to wrap (either encoded as string, one byte per
 *          character, or as an ArrayBuffer or Typed Array).
 */
function ByteStringBuffer(b) {
  // TODO: update to match DataBuffer API

  // the data in this buffer
  this.data = '';
  // the pointer for reading from this buffer
  this.read = 0;

  if(typeof b === 'string') {
    this.data = b;
  } else if(util.isArrayBuffer(b) || util.isArrayBufferView(b)) {
    if(typeof Buffer !== 'undefined' && b instanceof Buffer) {
      this.data = b.toString('binary');
    } else {
      // convert native buffer to forge buffer
      // FIXME: support native buffers internally instead
      var arr = new Uint8Array(b);
      try {
        this.data = String.fromCharCode.apply(null, arr);
      } catch(e) {
        for(var i = 0; i < arr.length; ++i) {
          this.putByte(arr[i]);
        }
      }
    }
  } else if(b instanceof ByteStringBuffer ||
    (typeof b === 'object' && typeof b.data === 'string' &&
    typeof b.read === 'number')) {
    // copy existing buffer
    this.data = b.data;
    this.read = b.read;
  }

  // used for v8 optimization
  this._constructedStringLength = 0;
}
util.ByteStringBuffer = ByteStringBuffer;

/* Note: This is an optimization for V8-based browsers. When V8 concatenates
  a string, the strings are only joined logically using a "cons string" or
  "constructed/concatenated string". These containers keep references to one
  another and can result in very large memory usage. For example, if a 2MB
  string is constructed by concatenating 4 bytes together at a time, the
  memory usage will be ~44MB; so ~22x increase. The strings are only joined
  together when an operation requiring their joining takes place, such as
  substr(). This function is called when adding data to this buffer to ensure
  these types of strings are periodically joined to reduce the memory
  footprint. */
var _MAX_CONSTRUCTED_STRING_LENGTH = 4096;
util.ByteStringBuffer.prototype._optimizeConstructedString = function(x) {
  this._constructedStringLength += x;
  if(this._constructedStringLength > _MAX_CONSTRUCTED_STRING_LENGTH) {
    // this substr() should cause the constructed string to join
    this.data.substr(0, 1);
    this._constructedStringLength = 0;
  }
};

/**
 * Gets the number of bytes in this buffer.
 *
 * @return the number of bytes in this buffer.
 */
util.ByteStringBuffer.prototype.length = function() {
  return this.data.length - this.read;
};

/**
 * Gets whether or not this buffer is empty.
 *
 * @return true if this buffer is empty, false if not.
 */
util.ByteStringBuffer.prototype.isEmpty = function() {
  return this.length() <= 0;
};

/**
 * Puts a byte in this buffer.
 *
 * @param b the byte to put.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putByte = function(b) {
  return this.putBytes(String.fromCharCode(b));
};

/**
 * Puts a byte in this buffer N times.
 *
 * @param b the byte to put.
 * @param n the number of bytes of value b to put.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.fillWithByte = function(b, n) {
  b = String.fromCharCode(b);
  var d = this.data;
  while(n > 0) {
    if(n & 1) {
      d += b;
    }
    n >>>= 1;
    if(n > 0) {
      b += b;
    }
  }
  this.data = d;
  this._optimizeConstructedString(n);
  return this;
};

/**
 * Puts bytes in this buffer.
 *
 * @param bytes the bytes (as a UTF-8 encoded string) to put.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putBytes = function(bytes) {
  this.data += bytes;
  this._optimizeConstructedString(bytes.length);
  return this;
};

/**
 * Puts a UTF-16 encoded string into this buffer.
 *
 * @param str the string to put.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putString = function(str) {
  return this.putBytes(util.encodeUtf8(str));
};

/**
 * Puts a 16-bit integer in this buffer in big-endian order.
 *
 * @param i the 16-bit integer.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putInt16 = function(i) {
  return this.putBytes(
    String.fromCharCode(i >> 8 & 0xFF) +
    String.fromCharCode(i & 0xFF));
};

/**
 * Puts a 24-bit integer in this buffer in big-endian order.
 *
 * @param i the 24-bit integer.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putInt24 = function(i) {
  return this.putBytes(
    String.fromCharCode(i >> 16 & 0xFF) +
    String.fromCharCode(i >> 8 & 0xFF) +
    String.fromCharCode(i & 0xFF));
};

/**
 * Puts a 32-bit integer in this buffer in big-endian order.
 *
 * @param i the 32-bit integer.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putInt32 = function(i) {
  return this.putBytes(
    String.fromCharCode(i >> 24 & 0xFF) +
    String.fromCharCode(i >> 16 & 0xFF) +
    String.fromCharCode(i >> 8 & 0xFF) +
    String.fromCharCode(i & 0xFF));
};

/**
 * Puts a 16-bit integer in this buffer in little-endian order.
 *
 * @param i the 16-bit integer.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putInt16Le = function(i) {
  return this.putBytes(
    String.fromCharCode(i & 0xFF) +
    String.fromCharCode(i >> 8 & 0xFF));
};

/**
 * Puts a 24-bit integer in this buffer in little-endian order.
 *
 * @param i the 24-bit integer.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putInt24Le = function(i) {
  return this.putBytes(
    String.fromCharCode(i & 0xFF) +
    String.fromCharCode(i >> 8 & 0xFF) +
    String.fromCharCode(i >> 16 & 0xFF));
};

/**
 * Puts a 32-bit integer in this buffer in little-endian order.
 *
 * @param i the 32-bit integer.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putInt32Le = function(i) {
  return this.putBytes(
    String.fromCharCode(i & 0xFF) +
    String.fromCharCode(i >> 8 & 0xFF) +
    String.fromCharCode(i >> 16 & 0xFF) +
    String.fromCharCode(i >> 24 & 0xFF));
};

/**
 * Puts an n-bit integer in this buffer in big-endian order.
 *
 * @param i the n-bit integer.
 * @param n the number of bits in the integer (8, 16, 24, or 32).
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putInt = function(i, n) {
  _checkBitsParam(n);
  var bytes = '';
  do {
    n -= 8;
    bytes += String.fromCharCode((i >> n) & 0xFF);
  } while(n > 0);
  return this.putBytes(bytes);
};

/**
 * Puts a signed n-bit integer in this buffer in big-endian order. Two's
 * complement representation is used.
 *
 * @param i the n-bit integer.
 * @param n the number of bits in the integer (8, 16, 24, or 32).
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putSignedInt = function(i, n) {
  // putInt checks n
  if(i < 0) {
    i += 2 << (n - 1);
  }
  return this.putInt(i, n);
};

/**
 * Puts the given buffer into this buffer.
 *
 * @param buffer the buffer to put into this one.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.putBuffer = function(buffer) {
  return this.putBytes(buffer.getBytes());
};

/**
 * Gets a byte from this buffer and advances the read pointer by 1.
 *
 * @return the byte.
 */
util.ByteStringBuffer.prototype.getByte = function() {
  return this.data.charCodeAt(this.read++);
};

/**
 * Gets a uint16 from this buffer in big-endian order and advances the read
 * pointer by 2.
 *
 * @return the uint16.
 */
util.ByteStringBuffer.prototype.getInt16 = function() {
  var rval = (
    this.data.charCodeAt(this.read) << 8 ^
    this.data.charCodeAt(this.read + 1));
  this.read += 2;
  return rval;
};

/**
 * Gets a uint24 from this buffer in big-endian order and advances the read
 * pointer by 3.
 *
 * @return the uint24.
 */
util.ByteStringBuffer.prototype.getInt24 = function() {
  var rval = (
    this.data.charCodeAt(this.read) << 16 ^
    this.data.charCodeAt(this.read + 1) << 8 ^
    this.data.charCodeAt(this.read + 2));
  this.read += 3;
  return rval;
};

/**
 * Gets a uint32 from this buffer in big-endian order and advances the read
 * pointer by 4.
 *
 * @return the word.
 */
util.ByteStringBuffer.prototype.getInt32 = function() {
  var rval = (
    this.data.charCodeAt(this.read) << 24 ^
    this.data.charCodeAt(this.read + 1) << 16 ^
    this.data.charCodeAt(this.read + 2) << 8 ^
    this.data.charCodeAt(this.read + 3));
  this.read += 4;
  return rval;
};

/**
 * Gets a uint16 from this buffer in little-endian order and advances the read
 * pointer by 2.
 *
 * @return the uint16.
 */
util.ByteStringBuffer.prototype.getInt16Le = function() {
  var rval = (
    this.data.charCodeAt(this.read) ^
    this.data.charCodeAt(this.read + 1) << 8);
  this.read += 2;
  return rval;
};

/**
 * Gets a uint24 from this buffer in little-endian order and advances the read
 * pointer by 3.
 *
 * @return the uint24.
 */
util.ByteStringBuffer.prototype.getInt24Le = function() {
  var rval = (
    this.data.charCodeAt(this.read) ^
    this.data.charCodeAt(this.read + 1) << 8 ^
    this.data.charCodeAt(this.read + 2) << 16);
  this.read += 3;
  return rval;
};

/**
 * Gets a uint32 from this buffer in little-endian order and advances the read
 * pointer by 4.
 *
 * @return the word.
 */
util.ByteStringBuffer.prototype.getInt32Le = function() {
  var rval = (
    this.data.charCodeAt(this.read) ^
    this.data.charCodeAt(this.read + 1) << 8 ^
    this.data.charCodeAt(this.read + 2) << 16 ^
    this.data.charCodeAt(this.read + 3) << 24);
  this.read += 4;
  return rval;
};

/**
 * Gets an n-bit integer from this buffer in big-endian order and advances the
 * read pointer by ceil(n/8).
 *
 * @param n the number of bits in the integer (8, 16, 24, or 32).
 *
 * @return the integer.
 */
util.ByteStringBuffer.prototype.getInt = function(n) {
  _checkBitsParam(n);
  var rval = 0;
  do {
    // TODO: Use (rval * 0x100) if adding support for 33 to 53 bits.
    rval = (rval << 8) + this.data.charCodeAt(this.read++);
    n -= 8;
  } while(n > 0);
  return rval;
};

/**
 * Gets a signed n-bit integer from this buffer in big-endian order, using
 * two's complement, and advances the read pointer by n/8.
 *
 * @param n the number of bits in the integer (8, 16, 24, or 32).
 *
 * @return the integer.
 */
util.ByteStringBuffer.prototype.getSignedInt = function(n) {
  // getInt checks n
  var x = this.getInt(n);
  var max = 2 << (n - 2);
  if(x >= max) {
    x -= max << 1;
  }
  return x;
};

/**
 * Reads bytes out into a UTF-8 string and clears them from the buffer.
 *
 * @param count the number of bytes to read, undefined or null for all.
 *
 * @return a UTF-8 string of bytes.
 */
util.ByteStringBuffer.prototype.getBytes = function(count) {
  var rval;
  if(count) {
    // read count bytes
    count = Math.min(this.length(), count);
    rval = this.data.slice(this.read, this.read + count);
    this.read += count;
  } else if(count === 0) {
    rval = '';
  } else {
    // read all bytes, optimize to only copy when needed
    rval = (this.read === 0) ? this.data : this.data.slice(this.read);
    this.clear();
  }
  return rval;
};

/**
 * Gets a UTF-8 encoded string of the bytes from this buffer without modifying
 * the read pointer.
 *
 * @param count the number of bytes to get, omit to get all.
 *
 * @return a string full of UTF-8 encoded characters.
 */
util.ByteStringBuffer.prototype.bytes = function(count) {
  return (typeof(count) === 'undefined' ?
    this.data.slice(this.read) :
    this.data.slice(this.read, this.read + count));
};

/**
 * Gets a byte at the given index without modifying the read pointer.
 *
 * @param i the byte index.
 *
 * @return the byte.
 */
util.ByteStringBuffer.prototype.at = function(i) {
  return this.data.charCodeAt(this.read + i);
};

/**
 * Puts a byte at the given index without modifying the read pointer.
 *
 * @param i the byte index.
 * @param b the byte to put.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.setAt = function(i, b) {
  this.data = this.data.substr(0, this.read + i) +
    String.fromCharCode(b) +
    this.data.substr(this.read + i + 1);
  return this;
};

/**
 * Gets the last byte without modifying the read pointer.
 *
 * @return the last byte.
 */
util.ByteStringBuffer.prototype.last = function() {
  return this.data.charCodeAt(this.data.length - 1);
};

/**
 * Creates a copy of this buffer.
 *
 * @return the copy.
 */
util.ByteStringBuffer.prototype.copy = function() {
  var c = util.createBuffer(this.data);
  c.read = this.read;
  return c;
};

/**
 * Compacts this buffer.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.compact = function() {
  if(this.read > 0) {
    this.data = this.data.slice(this.read);
    this.read = 0;
  }
  return this;
};

/**
 * Clears this buffer.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.clear = function() {
  this.data = '';
  this.read = 0;
  return this;
};

/**
 * Shortens this buffer by triming bytes off of the end of this buffer.
 *
 * @param count the number of bytes to trim off.
 *
 * @return this buffer.
 */
util.ByteStringBuffer.prototype.truncate = function(count) {
  var len = Math.max(0, this.length() - count);
  this.data = this.data.substr(this.read, len);
  this.read = 0;
  return this;
};

/**
 * Converts this buffer to a hexadecimal string.
 *
 * @return a hexadecimal string.
 */
util.ByteStringBuffer.prototype.toHex = function() {
  var rval = '';
  for(var i = this.read; i < this.data.length; ++i) {
    var b = this.data.charCodeAt(i);
    if(b < 16) {
      rval += '0';
    }
    rval += b.toString(16);
  }
  return rval;
};

/**
 * Converts this buffer to a UTF-16 string (standard JavaScript string).
 *
 * @return a UTF-16 string.
 */
util.ByteStringBuffer.prototype.toString = function() {
  return util.decodeUtf8(this.bytes());
};

/** End Buffer w/BinaryString backing */

/** Buffer w/UInt8Array backing */

/**
 * FIXME: Experimental. Do not use yet.
 *
 * Constructor for an ArrayBuffer-backed byte buffer.
 *
 * The buffer may be constructed from a string, an ArrayBuffer, DataView, or a
 * TypedArray.
 *
 * If a string is given, its encoding should be provided as an option,
 * otherwise it will default to 'binary'. A 'binary' string is encoded such
 * that each character is one byte in length and size.
 *
 * If an ArrayBuffer, DataView, or TypedArray is given, it will be used
 * *directly* without any copying. Note that, if a write to the buffer requires
 * more space, the buffer will allocate a new backing ArrayBuffer to
 * accommodate. The starting read and write offsets for the buffer may be
 * given as options.
 *
 * @param [b] the initial bytes for this buffer.
 * @param options the options to use:
 *          [readOffset] the starting read offset to use (default: 0).
 *          [writeOffset] the starting write offset to use (default: the
 *            length of the first parameter).
 *          [growSize] the minimum amount, in bytes, to grow the buffer by to
 *            accommodate writes (default: 1024).
 *          [encoding] the encoding ('binary', 'utf8', 'utf16', 'hex') for the
 *            first parameter, if it is a string (default: 'binary').
 */
function DataBuffer(b, options) {
  // default options
  options = options || {};

  // pointers for read from/write to buffer
  this.read = options.readOffset || 0;
  this.growSize = options.growSize || 1024;

  var isArrayBuffer = util.isArrayBuffer(b);
  var isArrayBufferView = util.isArrayBufferView(b);
  if(isArrayBuffer || isArrayBufferView) {
    // use ArrayBuffer directly
    if(isArrayBuffer) {
      this.data = new DataView(b);
    } else {
      // TODO: adjust read/write offset based on the type of view
      // or specify that this must be done in the options ... that the
      // offsets are byte-based
      this.data = new DataView(b.buffer, b.byteOffset, b.byteLength);
    }
    this.write = ('writeOffset' in options ?
      options.writeOffset : this.data.byteLength);
    return;
  }

  // initialize to empty array buffer and add any given bytes using putBytes
  this.data = new DataView(new ArrayBuffer(0));
  this.write = 0;

  if(b !== null && b !== undefined) {
    this.putBytes(b);
  }

  if('writeOffset' in options) {
    this.write = options.writeOffset;
  }
}
util.DataBuffer = DataBuffer;

/**
 * Gets the number of bytes in this buffer.
 *
 * @return the number of bytes in this buffer.
 */
util.DataBuffer.prototype.length = function() {
  return this.write - this.read;
};

/**
 * Gets whether or not this buffer is empty.
 *
 * @return true if this buffer is empty, false if not.
 */
util.DataBuffer.prototype.isEmpty = function() {
  return this.length() <= 0;
};

/**
 * Ensures this buffer has enough empty space to accommodate the given number
 * of bytes. An optional parameter may be given that indicates a minimum
 * amount to grow the buffer if necessary. If the parameter is not given,
 * the buffer will be grown by some previously-specified default amount
 * or heuristic.
 *
 * @param amount the number of bytes to accommodate.
 * @param [growSize] the minimum amount, in bytes, to grow the buffer by if
 *          necessary.
 */
util.DataBuffer.prototype.accommodate = function(amount, growSize) {
  if(this.length() >= amount) {
    return this;
  }
  growSize = Math.max(growSize || this.growSize, amount);

  // grow buffer
  var src = new Uint8Array(
    this.data.buffer, this.data.byteOffset, this.data.byteLength);
  var dst = new Uint8Array(this.length() + growSize);
  dst.set(src);
  this.data = new DataView(dst.buffer);

  return this;
};

/**
 * Puts a byte in this buffer.
 *
 * @param b the byte to put.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putByte = function(b) {
  this.accommodate(1);
  this.data.setUint8(this.write++, b);
  return this;
};

/**
 * Puts a byte in this buffer N times.
 *
 * @param b the byte to put.
 * @param n the number of bytes of value b to put.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.fillWithByte = function(b, n) {
  this.accommodate(n);
  for(var i = 0; i < n; ++i) {
    this.data.setUint8(b);
  }
  return this;
};

/**
 * Puts bytes in this buffer. The bytes may be given as a string, an
 * ArrayBuffer, a DataView, or a TypedArray.
 *
 * @param bytes the bytes to put.
 * @param [encoding] the encoding for the first parameter ('binary', 'utf8',
 *          'utf16', 'hex'), if it is a string (default: 'binary').
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putBytes = function(bytes, encoding) {
  if(util.isArrayBufferView(bytes)) {
    var src = new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
    var len = src.byteLength - src.byteOffset;
    this.accommodate(len);
    var dst = new Uint8Array(this.data.buffer, this.write);
    dst.set(src);
    this.write += len;
    return this;
  }

  if(util.isArrayBuffer(bytes)) {
    var src = new Uint8Array(bytes);
    this.accommodate(src.byteLength);
    var dst = new Uint8Array(this.data.buffer);
    dst.set(src, this.write);
    this.write += src.byteLength;
    return this;
  }

  // bytes is a util.DataBuffer or equivalent
  if(bytes instanceof util.DataBuffer ||
    (typeof bytes === 'object' &&
    typeof bytes.read === 'number' && typeof bytes.write === 'number' &&
    util.isArrayBufferView(bytes.data))) {
    var src = new Uint8Array(bytes.data.byteLength, bytes.read, bytes.length());
    this.accommodate(src.byteLength);
    var dst = new Uint8Array(bytes.data.byteLength, this.write);
    dst.set(src);
    this.write += src.byteLength;
    return this;
  }

  if(bytes instanceof util.ByteStringBuffer) {
    // copy binary string and process as the same as a string parameter below
    bytes = bytes.data;
    encoding = 'binary';
  }

  // string conversion
  encoding = encoding || 'binary';
  if(typeof bytes === 'string') {
    var view;

    // decode from string
    if(encoding === 'hex') {
      this.accommodate(Math.ceil(bytes.length / 2));
      view = new Uint8Array(this.data.buffer, this.write);
      this.write += util.binary.hex.decode(bytes, view, this.write);
      return this;
    }
    if(encoding === 'base64') {
      this.accommodate(Math.ceil(bytes.length / 4) * 3);
      view = new Uint8Array(this.data.buffer, this.write);
      this.write += util.binary.base64.decode(bytes, view, this.write);
      return this;
    }

    // encode text as UTF-8 bytes
    if(encoding === 'utf8') {
      // encode as UTF-8 then decode string as raw binary
      bytes = util.encodeUtf8(bytes);
      encoding = 'binary';
    }

    // decode string as raw binary
    if(encoding === 'binary' || encoding === 'raw') {
      // one byte per character
      this.accommodate(bytes.length);
      view = new Uint8Array(this.data.buffer, this.write);
      this.write += util.binary.raw.decode(view);
      return this;
    }

    // encode text as UTF-16 bytes
    if(encoding === 'utf16') {
      // two bytes per character
      this.accommodate(bytes.length * 2);
      view = new Uint16Array(this.data.buffer, this.write);
      this.write += util.text.utf16.encode(view);
      return this;
    }

    throw new Error('Invalid encoding: ' + encoding);
  }

  throw Error('Invalid parameter: ' + bytes);
};

/**
 * Puts the given buffer into this buffer.
 *
 * @param buffer the buffer to put into this one.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putBuffer = function(buffer) {
  this.putBytes(buffer);
  buffer.clear();
  return this;
};

/**
 * Puts a string into this buffer.
 *
 * @param str the string to put.
 * @param [encoding] the encoding for the string (default: 'utf16').
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putString = function(str) {
  return this.putBytes(str, 'utf16');
};

/**
 * Puts a 16-bit integer in this buffer in big-endian order.
 *
 * @param i the 16-bit integer.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putInt16 = function(i) {
  this.accommodate(2);
  this.data.setInt16(this.write, i);
  this.write += 2;
  return this;
};

/**
 * Puts a 24-bit integer in this buffer in big-endian order.
 *
 * @param i the 24-bit integer.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putInt24 = function(i) {
  this.accommodate(3);
  this.data.setInt16(this.write, i >> 8 & 0xFFFF);
  this.data.setInt8(this.write, i >> 16 & 0xFF);
  this.write += 3;
  return this;
};

/**
 * Puts a 32-bit integer in this buffer in big-endian order.
 *
 * @param i the 32-bit integer.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putInt32 = function(i) {
  this.accommodate(4);
  this.data.setInt32(this.write, i);
  this.write += 4;
  return this;
};

/**
 * Puts a 16-bit integer in this buffer in little-endian order.
 *
 * @param i the 16-bit integer.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putInt16Le = function(i) {
  this.accommodate(2);
  this.data.setInt16(this.write, i, true);
  this.write += 2;
  return this;
};

/**
 * Puts a 24-bit integer in this buffer in little-endian order.
 *
 * @param i the 24-bit integer.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putInt24Le = function(i) {
  this.accommodate(3);
  this.data.setInt8(this.write, i >> 16 & 0xFF);
  this.data.setInt16(this.write, i >> 8 & 0xFFFF, true);
  this.write += 3;
  return this;
};

/**
 * Puts a 32-bit integer in this buffer in little-endian order.
 *
 * @param i the 32-bit integer.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putInt32Le = function(i) {
  this.accommodate(4);
  this.data.setInt32(this.write, i, true);
  this.write += 4;
  return this;
};

/**
 * Puts an n-bit integer in this buffer in big-endian order.
 *
 * @param i the n-bit integer.
 * @param n the number of bits in the integer (8, 16, 24, or 32).
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putInt = function(i, n) {
  _checkBitsParam(n);
  this.accommodate(n / 8);
  do {
    n -= 8;
    this.data.setInt8(this.write++, (i >> n) & 0xFF);
  } while(n > 0);
  return this;
};

/**
 * Puts a signed n-bit integer in this buffer in big-endian order. Two's
 * complement representation is used.
 *
 * @param i the n-bit integer.
 * @param n the number of bits in the integer.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.putSignedInt = function(i, n) {
  _checkBitsParam(n);
  this.accommodate(n / 8);
  if(i < 0) {
    i += 2 << (n - 1);
  }
  return this.putInt(i, n);
};

/**
 * Gets a byte from this buffer and advances the read pointer by 1.
 *
 * @return the byte.
 */
util.DataBuffer.prototype.getByte = function() {
  return this.data.getInt8(this.read++);
};

/**
 * Gets a uint16 from this buffer in big-endian order and advances the read
 * pointer by 2.
 *
 * @return the uint16.
 */
util.DataBuffer.prototype.getInt16 = function() {
  var rval = this.data.getInt16(this.read);
  this.read += 2;
  return rval;
};

/**
 * Gets a uint24 from this buffer in big-endian order and advances the read
 * pointer by 3.
 *
 * @return the uint24.
 */
util.DataBuffer.prototype.getInt24 = function() {
  var rval = (
    this.data.getInt16(this.read) << 8 ^
    this.data.getInt8(this.read + 2));
  this.read += 3;
  return rval;
};

/**
 * Gets a uint32 from this buffer in big-endian order and advances the read
 * pointer by 4.
 *
 * @return the word.
 */
util.DataBuffer.prototype.getInt32 = function() {
  var rval = this.data.getInt32(this.read);
  this.read += 4;
  return rval;
};

/**
 * Gets a uint16 from this buffer in little-endian order and advances the read
 * pointer by 2.
 *
 * @return the uint16.
 */
util.DataBuffer.prototype.getInt16Le = function() {
  var rval = this.data.getInt16(this.read, true);
  this.read += 2;
  return rval;
};

/**
 * Gets a uint24 from this buffer in little-endian order and advances the read
 * pointer by 3.
 *
 * @return the uint24.
 */
util.DataBuffer.prototype.getInt24Le = function() {
  var rval = (
    this.data.getInt8(this.read) ^
    this.data.getInt16(this.read + 1, true) << 8);
  this.read += 3;
  return rval;
};

/**
 * Gets a uint32 from this buffer in little-endian order and advances the read
 * pointer by 4.
 *
 * @return the word.
 */
util.DataBuffer.prototype.getInt32Le = function() {
  var rval = this.data.getInt32(this.read, true);
  this.read += 4;
  return rval;
};

/**
 * Gets an n-bit integer from this buffer in big-endian order and advances the
 * read pointer by n/8.
 *
 * @param n the number of bits in the integer (8, 16, 24, or 32).
 *
 * @return the integer.
 */
util.DataBuffer.prototype.getInt = function(n) {
  _checkBitsParam(n);
  var rval = 0;
  do {
    // TODO: Use (rval * 0x100) if adding support for 33 to 53 bits.
    rval = (rval << 8) + this.data.getInt8(this.read++);
    n -= 8;
  } while(n > 0);
  return rval;
};

/**
 * Gets a signed n-bit integer from this buffer in big-endian order, using
 * two's complement, and advances the read pointer by n/8.
 *
 * @param n the number of bits in the integer (8, 16, 24, or 32).
 *
 * @return the integer.
 */
util.DataBuffer.prototype.getSignedInt = function(n) {
  // getInt checks n
  var x = this.getInt(n);
  var max = 2 << (n - 2);
  if(x >= max) {
    x -= max << 1;
  }
  return x;
};

/**
 * Reads bytes out into a UTF-8 string and clears them from the buffer.
 *
 * @param count the number of bytes to read, undefined or null for all.
 *
 * @return a UTF-8 string of bytes.
 */
util.DataBuffer.prototype.getBytes = function(count) {
  // TODO: deprecate this method, it is poorly named and
  // this.toString('binary') replaces it
  // add a toTypedArray()/toArrayBuffer() function
  var rval;
  if(count) {
    // read count bytes
    count = Math.min(this.length(), count);
    rval = this.data.slice(this.read, this.read + count);
    this.read += count;
  } else if(count === 0) {
    rval = '';
  } else {
    // read all bytes, optimize to only copy when needed
    rval = (this.read === 0) ? this.data : this.data.slice(this.read);
    this.clear();
  }
  return rval;
};

/**
 * Gets a UTF-8 encoded string of the bytes from this buffer without modifying
 * the read pointer.
 *
 * @param count the number of bytes to get, omit to get all.
 *
 * @return a string full of UTF-8 encoded characters.
 */
util.DataBuffer.prototype.bytes = function(count) {
  // TODO: deprecate this method, it is poorly named, add "getString()"
  return (typeof(count) === 'undefined' ?
    this.data.slice(this.read) :
    this.data.slice(this.read, this.read + count));
};

/**
 * Gets a byte at the given index without modifying the read pointer.
 *
 * @param i the byte index.
 *
 * @return the byte.
 */
util.DataBuffer.prototype.at = function(i) {
  return this.data.getUint8(this.read + i);
};

/**
 * Puts a byte at the given index without modifying the read pointer.
 *
 * @param i the byte index.
 * @param b the byte to put.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.setAt = function(i, b) {
  this.data.setUint8(i, b);
  return this;
};

/**
 * Gets the last byte without modifying the read pointer.
 *
 * @return the last byte.
 */
util.DataBuffer.prototype.last = function() {
  return this.data.getUint8(this.write - 1);
};

/**
 * Creates a copy of this buffer.
 *
 * @return the copy.
 */
util.DataBuffer.prototype.copy = function() {
  return new util.DataBuffer(this);
};

/**
 * Compacts this buffer.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.compact = function() {
  if(this.read > 0) {
    var src = new Uint8Array(this.data.buffer, this.read);
    var dst = new Uint8Array(src.byteLength);
    dst.set(src);
    this.data = new DataView(dst);
    this.write -= this.read;
    this.read = 0;
  }
  return this;
};

/**
 * Clears this buffer.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.clear = function() {
  this.data = new DataView(new ArrayBuffer(0));
  this.read = this.write = 0;
  return this;
};

/**
 * Shortens this buffer by triming bytes off of the end of this buffer.
 *
 * @param count the number of bytes to trim off.
 *
 * @return this buffer.
 */
util.DataBuffer.prototype.truncate = function(count) {
  this.write = Math.max(0, this.length() - count);
  this.read = Math.min(this.read, this.write);
  return this;
};

/**
 * Converts this buffer to a hexadecimal string.
 *
 * @return a hexadecimal string.
 */
util.DataBuffer.prototype.toHex = function() {
  var rval = '';
  for(var i = this.read; i < this.data.byteLength; ++i) {
    var b = this.data.getUint8(i);
    if(b < 16) {
      rval += '0';
    }
    rval += b.toString(16);
  }
  return rval;
};

/**
 * Converts this buffer to a string, using the given encoding. If no
 * encoding is given, 'utf8' (UTF-8) is used.
 *
 * @param [encoding] the encoding to use: 'binary', 'utf8', 'utf16', 'hex',
 *          'base64' (default: 'utf8').
 *
 * @return a string representation of the bytes in this buffer.
 */
util.DataBuffer.prototype.toString = function(encoding) {
  var view = new Uint8Array(this.data, this.read, this.length());
  encoding = encoding || 'utf8';

  // encode to string
  if(encoding === 'binary' || encoding === 'raw') {
    return util.binary.raw.encode(view);
  }
  if(encoding === 'hex') {
    return util.binary.hex.encode(view);
  }
  if(encoding === 'base64') {
    return util.binary.base64.encode(view);
  }

  // decode to text
  if(encoding === 'utf8') {
    return util.text.utf8.decode(view);
  }
  if(encoding === 'utf16') {
    return util.text.utf16.decode(view);
  }

  throw new Error('Invalid encoding: ' + encoding);
};

/** End Buffer w/UInt8Array backing */

/**
 * Creates a buffer that stores bytes. A value may be given to put into the
 * buffer that is either a string of bytes or a UTF-16 string that will
 * be encoded using UTF-8 (to do the latter, specify 'utf8' as the encoding).
 *
 * @param [input] the bytes to wrap (as a string) or a UTF-16 string to encode
 *          as UTF-8.
 * @param [encoding] (default: 'raw', other: 'utf8').
 */
util.createBuffer = function(input, encoding) {
  // TODO: deprecate, use new ByteBuffer() instead
  encoding = encoding || 'raw';
  if(input !== undefined && encoding === 'utf8') {
    input = util.encodeUtf8(input);
  }
  return new util.ByteBuffer(input);
};

/**
 * Fills a string with a particular value. If you want the string to be a byte
 * string, pass in String.fromCharCode(theByte).
 *
 * @param c the character to fill the string with, use String.fromCharCode
 *          to fill the string with a byte value.
 * @param n the number of characters of value c to fill with.
 *
 * @return the filled string.
 */
util.fillString = function(c, n) {
  var s = '';
  while(n > 0) {
    if(n & 1) {
      s += c;
    }
    n >>>= 1;
    if(n > 0) {
      c += c;
    }
  }
  return s;
};

/**
 * Performs a per byte XOR between two byte strings and returns the result as a
 * string of bytes.
 *
 * @param s1 first string of bytes.
 * @param s2 second string of bytes.
 * @param n the number of bytes to XOR.
 *
 * @return the XOR'd result.
 */
util.xorBytes = function(s1, s2, n) {
  var s3 = '';
  var b = '';
  var t = '';
  var i = 0;
  var c = 0;
  for(; n > 0; --n, ++i) {
    b = s1.charCodeAt(i) ^ s2.charCodeAt(i);
    if(c >= 10) {
      s3 += t;
      t = '';
      c = 0;
    }
    t += String.fromCharCode(b);
    ++c;
  }
  s3 += t;
  return s3;
};

/**
 * Converts a hex string into a 'binary' encoded string of bytes.
 *
 * @param hex the hexadecimal string to convert.
 *
 * @return the binary-encoded string of bytes.
 */
util.hexToBytes = function(hex) {
  // TODO: deprecate: "Deprecated. Use util.binary.hex.decode instead."
  var rval = '';
  var i = 0;
  if(hex.length & 1 == 1) {
    // odd number of characters, convert first character alone
    i = 1;
    rval += String.fromCharCode(parseInt(hex[0], 16));
  }
  // convert 2 characters (1 byte) at a time
  for(; i < hex.length; i += 2) {
    rval += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
  }
  return rval;
};

/**
 * Converts a 'binary' encoded string of bytes to hex.
 *
 * @param bytes the byte string to convert.
 *
 * @return the string of hexadecimal characters.
 */
util.bytesToHex = function(bytes) {
  // TODO: deprecate: "Deprecated. Use util.binary.hex.encode instead."
  return util.createBuffer(bytes).toHex();
};

/**
 * Converts an 32-bit integer to 4-big-endian byte string.
 *
 * @param i the integer.
 *
 * @return the byte string.
 */
util.int32ToBytes = function(i) {
  return (
    String.fromCharCode(i >> 24 & 0xFF) +
    String.fromCharCode(i >> 16 & 0xFF) +
    String.fromCharCode(i >> 8 & 0xFF) +
    String.fromCharCode(i & 0xFF));
};

// base64 characters, reverse mapping
var _base64 =
  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var _base64Idx = [
/*43 -43 = 0*/
/*'+',  1,  2,  3,'/' */
   62, -1, -1, -1, 63,

/*'0','1','2','3','4','5','6','7','8','9' */
   52, 53, 54, 55, 56, 57, 58, 59, 60, 61,

/*15, 16, 17,'=', 19, 20, 21 */
  -1, -1, -1, 64, -1, -1, -1,

/*65 - 43 = 22*/
/*'A','B','C','D','E','F','G','H','I','J','K','L','M', */
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,

/*'N','O','P','Q','R','S','T','U','V','W','X','Y','Z' */
   13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,

/*91 - 43 = 48 */
/*48, 49, 50, 51, 52, 53 */
  -1, -1, -1, -1, -1, -1,

/*97 - 43 = 54*/
/*'a','b','c','d','e','f','g','h','i','j','k','l','m' */
   26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,

/*'n','o','p','q','r','s','t','u','v','w','x','y','z' */
   39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
];

// base58 characters (Bitcoin alphabet)
var _base58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';

/**
 * Base64 encodes a 'binary' encoded string of bytes.
 *
 * @param input the binary encoded string of bytes to base64-encode.
 * @param maxline the maximum number of encoded characters per line to use,
 *          defaults to none.
 *
 * @return the base64-encoded output.
 */
util.encode64 = function(input, maxline) {
  // TODO: deprecate: "Deprecated. Use util.binary.base64.encode instead."
  var line = '';
  var output = '';
  var chr1, chr2, chr3;
  var i = 0;
  while(i < input.length) {
    chr1 = input.charCodeAt(i++);
    chr2 = input.charCodeAt(i++);
    chr3 = input.charCodeAt(i++);

    // encode 4 character group
    line += _base64.charAt(chr1 >> 2);
    line += _base64.charAt(((chr1 & 3) << 4) | (chr2 >> 4));
    if(isNaN(chr2)) {
      line += '==';
    } else {
      line += _base64.charAt(((chr2 & 15) << 2) | (chr3 >> 6));
      line += isNaN(chr3) ? '=' : _base64.charAt(chr3 & 63);
    }

    if(maxline && line.length > maxline) {
      output += line.substr(0, maxline) + '\r\n';
      line = line.substr(maxline);
    }
  }
  output += line;
  return output;
};

/**
 * Base64 decodes a string into a 'binary' encoded string of bytes.
 *
 * @param input the base64-encoded input.
 *
 * @return the binary encoded string.
 */
util.decode64 = function(input) {
  // TODO: deprecate: "Deprecated. Use util.binary.base64.decode instead."

  // remove all non-base64 characters
  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');

  var output = '';
  var enc1, enc2, enc3, enc4;
  var i = 0;

  while(i < input.length) {
    enc1 = _base64Idx[input.charCodeAt(i++) - 43];
    enc2 = _base64Idx[input.charCodeAt(i++) - 43];
    enc3 = _base64Idx[input.charCodeAt(i++) - 43];
    enc4 = _base64Idx[input.charCodeAt(i++) - 43];

    output += String.fromCharCode((enc1 << 2) | (enc2 >> 4));
    if(enc3 !== 64) {
      // decoded at least 2 bytes
      output += String.fromCharCode(((enc2 & 15) << 4) | (enc3 >> 2));
      if(enc4 !== 64) {
        // decoded 3 bytes
        output += String.fromCharCode(((enc3 & 3) << 6) | enc4);
      }
    }
  }

  return output;
};

/**
 * UTF-8 encodes the given UTF-16 encoded string (a standard JavaScript
 * string). Non-ASCII characters will be encoded as multiple bytes according
 * to UTF-8.
 *
 * @param str the string to encode.
 *
 * @return the UTF-8 encoded string.
 */
util.encodeUtf8 = function(str) {
  return unescape(encodeURIComponent(str));
};

/**
 * Decodes a UTF-8 encoded string into a UTF-16 string.
 *
 * @param str the string to decode.
 *
 * @return the UTF-16 encoded string (standard JavaScript string).
 */
util.decodeUtf8 = function(str) {
  return decodeURIComponent(escape(str));
};

// binary encoding/decoding tools
// FIXME: Experimental. Do not use yet.
util.binary = {
  raw: {},
  hex: {},
  base64: {},
  base58: {},
  baseN : {
    encode: baseN.encode,
    decode: baseN.decode
  }
};

/**
 * Encodes a Uint8Array as a binary-encoded string. This encoding uses
 * a value between 0 and 255 for each character.
 *
 * @param bytes the Uint8Array to encode.
 *
 * @return the binary-encoded string.
 */
util.binary.raw.encode = function(bytes) {
  return String.fromCharCode.apply(null, bytes);
};

/**
 * Decodes a binary-encoded string to a Uint8Array. This encoding uses
 * a value between 0 and 255 for each character.
 *
 * @param str the binary-encoded string to decode.
 * @param [output] an optional Uint8Array to write the output to; if it
 *          is too small, an exception will be thrown.
 * @param [offset] the start offset for writing to the output (default: 0).
 *
 * @return the Uint8Array or the number of bytes written if output was given.
 */
util.binary.raw.decode = function(str, output, offset) {
  var out = output;
  if(!out) {
    out = new Uint8Array(str.length);
  }
  offset = offset || 0;
  var j = offset;
  for(var i = 0; i < str.length; ++i) {
    out[j++] = str.charCodeAt(i);
  }
  return output ? (j - offset) : out;
};

/**
 * Encodes a 'binary' string, ArrayBuffer, DataView, TypedArray, or
 * ByteBuffer as a string of hexadecimal characters.
 *
 * @param bytes the bytes to convert.
 *
 * @return the string of hexadecimal characters.
 */
util.binary.hex.encode = util.bytesToHex;

/**
 * Decodes a hex-encoded string to a Uint8Array.
 *
 * @param hex the hexadecimal string to convert.
 * @param [output] an optional Uint8Array to write the output to; if it
 *          is too small, an exception will be thrown.
 * @param [offset] the start offset for writing to the output (default: 0).
 *
 * @return the Uint8Array or the number of bytes written if output was given.
 */
util.binary.hex.decode = function(hex, output, offset) {
  var out = output;
  if(!out) {
    out = new Uint8Array(Math.ceil(hex.length / 2));
  }
  offset = offset || 0;
  var i = 0, j = offset;
  if(hex.length & 1) {
    // odd number of characters, convert first character alone
    i = 1;
    out[j++] = parseInt(hex[0], 16);
  }
  // convert 2 characters (1 byte) at a time
  for(; i < hex.length; i += 2) {
    out[j++] = parseInt(hex.substr(i, 2), 16);
  }
  return output ? (j - offset) : out;
};

/**
 * Base64-encodes a Uint8Array.
 *
 * @param input the Uint8Array to encode.
 * @param maxline the maximum number of encoded characters per line to use,
 *          defaults to none.
 *
 * @return the base64-encoded output string.
 */
util.binary.base64.encode = function(input, maxline) {
  var line = '';
  var output = '';
  var chr1, chr2, chr3;
  var i = 0;
  while(i < input.byteLength) {
    chr1 = input[i++];
    chr2 = input[i++];
    chr3 = input[i++];

    // encode 4 character group
    line += _base64.charAt(chr1 >> 2);
    line += _base64.charAt(((chr1 & 3) << 4) | (chr2 >> 4));
    if(isNaN(chr2)) {
      line += '==';
    } else {
      line += _base64.charAt(((chr2 & 15) << 2) | (chr3 >> 6));
      line += isNaN(chr3) ? '=' : _base64.charAt(chr3 & 63);
    }

    if(maxline && line.length > maxline) {
      output += line.substr(0, maxline) + '\r\n';
      line = line.substr(maxline);
    }
  }
  output += line;
  return output;
};

/**
 * Decodes a base64-encoded string to a Uint8Array.
 *
 * @param input the base64-encoded input string.
 * @param [output] an optional Uint8Array to write the output to; if it
 *          is too small, an exception will be thrown.
 * @param [offset] the start offset for writing to the output (default: 0).
 *
 * @return the Uint8Array or the number of bytes written if output was given.
 */
util.binary.base64.decode = function(input, output, offset) {
  var out = output;
  if(!out) {
    out = new Uint8Array(Math.ceil(input.length / 4) * 3);
  }

  // remove all non-base64 characters
  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');

  offset = offset || 0;
  var enc1, enc2, enc3, enc4;
  var i = 0, j = offset;

  while(i < input.length) {
    enc1 = _base64Idx[input.charCodeAt(i++) - 43];
    enc2 = _base64Idx[input.charCodeAt(i++) - 43];
    enc3 = _base64Idx[input.charCodeAt(i++) - 43];
    enc4 = _base64Idx[input.charCodeAt(i++) - 43];

    out[j++] = (enc1 << 2) | (enc2 >> 4);
    if(enc3 !== 64) {
      // decoded at least 2 bytes
      out[j++] = ((enc2 & 15) << 4) | (enc3 >> 2);
      if(enc4 !== 64) {
        // decoded 3 bytes
        out[j++] = ((enc3 & 3) << 6) | enc4;
      }
    }
  }

  // make sure result is the exact decoded length
  return output ? (j - offset) : out.subarray(0, j);
};

// add support for base58 encoding/decoding with Bitcoin alphabet
util.binary.base58.encode = function(input, maxline) {
  return util.binary.baseN.encode(input, _base58, maxline);
};
util.binary.base58.decode = function(input, maxline) {
  return util.binary.baseN.decode(input, _base58, maxline);
};

// text encoding/decoding tools
// FIXME: Experimental. Do not use yet.
util.text = {
  utf8: {},
  utf16: {}
};

/**
 * Encodes the given string as UTF-8 in a Uint8Array.
 *
 * @param str the string to encode.
 * @param [output] an optional Uint8Array to write the output to; if it
 *          is too small, an exception will be thrown.
 * @param [offset] the start offset for writing to the output (default: 0).
 *
 * @return the Uint8Array or the number of bytes written if output was given.
 */
util.text.utf8.encode = function(str, output, offset) {
  str = util.encodeUtf8(str);
  var out = output;
  if(!out) {
    out = new Uint8Array(str.length);
  }
  offset = offset || 0;
  var j = offset;
  for(var i = 0; i < str.length; ++i) {
    out[j++] = str.charCodeAt(i);
  }
  return output ? (j - offset) : out;
};

/**
 * Decodes the UTF-8 contents from a Uint8Array.
 *
 * @param bytes the Uint8Array to decode.
 *
 * @return the resulting string.
 */
util.text.utf8.decode = function(bytes) {
  return util.decodeUtf8(String.fromCharCode.apply(null, bytes));
};

/**
 * Encodes the given string as UTF-16 in a Uint8Array.
 *
 * @param str the string to encode.
 * @param [output] an optional Uint8Array to write the output to; if it
 *          is too small, an exception will be thrown.
 * @param [offset] the start offset for writing to the output (default: 0).
 *
 * @return the Uint8Array or the number of bytes written if output was given.
 */
util.text.utf16.encode = function(str, output, offset) {
  var out = output;
  if(!out) {
    out = new Uint8Array(str.length * 2);
  }
  var view = new Uint16Array(out.buffer);
  offset = offset || 0;
  var j = offset;
  var k = offset;
  for(var i = 0; i < str.length; ++i) {
    view[k++] = str.charCodeAt(i);
    j += 2;
  }
  return output ? (j - offset) : out;
};

/**
 * Decodes the UTF-16 contents from a Uint8Array.
 *
 * @param bytes the Uint8Array to decode.
 *
 * @return the resulting string.
 */
util.text.utf16.decode = function(bytes) {
  return String.fromCharCode.apply(null, new Uint16Array(bytes.buffer));
};

/**
 * Deflates the given data using a flash interface.
 *
 * @param api the flash interface.
 * @param bytes the data.
 * @param raw true to return only raw deflate data, false to include zlib
 *          header and trailer.
 *
 * @return the deflated data as a string.
 */
util.deflate = function(api, bytes, raw) {
  bytes = util.decode64(api.deflate(util.encode64(bytes)).rval);

  // strip zlib header and trailer if necessary
  if(raw) {
    // zlib header is 2 bytes (CMF,FLG) where FLG indicates that
    // there is a 4-byte DICT (alder-32) block before the data if
    // its 5th bit is set
    var start = 2;
    var flg = bytes.charCodeAt(1);
    if(flg & 0x20) {
      start = 6;
    }
    // zlib trailer is 4 bytes of adler-32
    bytes = bytes.substring(start, bytes.length - 4);
  }

  return bytes;
};

/**
 * Inflates the given data using a flash interface.
 *
 * @param api the flash interface.
 * @param bytes the data.
 * @param raw true if the incoming data has no zlib header or trailer and is
 *          raw DEFLATE data.
 *
 * @return the inflated data as a string, null on error.
 */
util.inflate = function(api, bytes, raw) {
  // TODO: add zlib header and trailer if necessary/possible
  var rval = api.inflate(util.encode64(bytes)).rval;
  return (rval === null) ? null : util.decode64(rval);
};

/**
 * Sets a storage object.
 *
 * @param api the storage interface.
 * @param id the storage ID to use.
 * @param obj the storage object, null to remove.
 */
var _setStorageObject = function(api, id, obj) {
  if(!api) {
    throw new Error('WebStorage not available.');
  }

  var rval;
  if(obj === null) {
    rval = api.removeItem(id);
  } else {
    // json-encode and base64-encode object
    obj = util.encode64(JSON.stringify(obj));
    rval = api.setItem(id, obj);
  }

  // handle potential flash error
  if(typeof(rval) !== 'undefined' && rval.rval !== true) {
    var error = new Error(rval.error.message);
    error.id = rval.error.id;
    error.name = rval.error.name;
    throw error;
  }
};

/**
 * Gets a storage object.
 *
 * @param api the storage interface.
 * @param id the storage ID to use.
 *
 * @return the storage object entry or null if none exists.
 */
var _getStorageObject = function(api, id) {
  if(!api) {
    throw new Error('WebStorage not available.');
  }

  // get the existing entry
  var rval = api.getItem(id);

  /* Note: We check api.init because we can't do (api == localStorage)
    on IE because of "Class doesn't support Automation" exception. Only
    the flash api has an init method so this works too, but we need a
    better solution in the future. */

  // flash returns item wrapped in an object, handle special case
  if(api.init) {
    if(rval.rval === null) {
      if(rval.error) {
        var error = new Error(rval.error.message);
        error.id = rval.error.id;
        error.name = rval.error.name;
        throw error;
      }
      // no error, but also no item
      rval = null;
    } else {
      rval = rval.rval;
    }
  }

  // handle decoding
  if(rval !== null) {
    // base64-decode and json-decode data
    rval = JSON.parse(util.decode64(rval));
  }

  return rval;
};

/**
 * Stores an item in local storage.
 *
 * @param api the storage interface.
 * @param id the storage ID to use.
 * @param key the key for the item.
 * @param data the data for the item (any javascript object/primitive).
 */
var _setItem = function(api, id, key, data) {
  // get storage object
  var obj = _getStorageObject(api, id);
  if(obj === null) {
    // create a new storage object
    obj = {};
  }
  // update key
  obj[key] = data;

  // set storage object
  _setStorageObject(api, id, obj);
};

/**
 * Gets an item from local storage.
 *
 * @param api the storage interface.
 * @param id the storage ID to use.
 * @param key the key for the item.
 *
 * @return the item.
 */
var _getItem = function(api, id, key) {
  // get storage object
  var rval = _getStorageObject(api, id);
  if(rval !== null) {
    // return data at key
    rval = (key in rval) ? rval[key] : null;
  }

  return rval;
};

/**
 * Removes an item from local storage.
 *
 * @param api the storage interface.
 * @param id the storage ID to use.
 * @param key the key for the item.
 */
var _removeItem = function(api, id, key) {
  // get storage object
  var obj = _getStorageObject(api, id);
  if(obj !== null && key in obj) {
    // remove key
    delete obj[key];

    // see if entry has no keys remaining
    var empty = true;
    for(var prop in obj) {
      empty = false;
      break;
    }
    if(empty) {
      // remove entry entirely if no keys are left
      obj = null;
    }

    // set storage object
    _setStorageObject(api, id, obj);
  }
};

/**
 * Clears the local disk storage identified by the given ID.
 *
 * @param api the storage interface.
 * @param id the storage ID to use.
 */
var _clearItems = function(api, id) {
  _setStorageObject(api, id, null);
};

/**
 * Calls a storage function.
 *
 * @param func the function to call.
 * @param args the arguments for the function.
 * @param location the location argument.
 *
 * @return the return value from the function.
 */
var _callStorageFunction = function(func, args, location) {
  var rval = null;

  // default storage types
  if(typeof(location) === 'undefined') {
    location = ['web', 'flash'];
  }

  // apply storage types in order of preference
  var type;
  var done = false;
  var exception = null;
  for(var idx in location) {
    type = location[idx];
    try {
      if(type === 'flash' || type === 'both') {
        if(args[0] === null) {
          throw new Error('Flash local storage not available.');
        }
        rval = func.apply(this, args);
        done = (type === 'flash');
      }
      if(type === 'web' || type === 'both') {
        args[0] = localStorage;
        rval = func.apply(this, args);
        done = true;
      }
    } catch(ex) {
      exception = ex;
    }
    if(done) {
      break;
    }
  }

  if(!done) {
    throw exception;
  }

  return rval;
};

/**
 * Stores an item on local disk.
 *
 * The available types of local storage include 'flash', 'web', and 'both'.
 *
 * The type 'flash' refers to flash local storage (SharedObject). In order
 * to use flash local storage, the 'api' parameter must be valid. The type
 * 'web' refers to WebStorage, if supported by the browser. The type 'both'
 * refers to storing using both 'flash' and 'web', not just one or the
 * other.
 *
 * The location array should list the storage types to use in order of
 * preference:
 *
 * ['flash']: flash only storage
 * ['web']: web only storage
 * ['both']: try to store in both
 * ['flash','web']: store in flash first, but if not available, 'web'
 * ['web','flash']: store in web first, but if not available, 'flash'
 *
 * The location array defaults to: ['web', 'flash']
 *
 * @param api the flash interface, null to use only WebStorage.
 * @param id the storage ID to use.
 * @param key the key for the item.
 * @param data the data for the item (any javascript object/primitive).
 * @param location an array with the preferred types of storage to use.
 */
util.setItem = function(api, id, key, data, location) {
  _callStorageFunction(_setItem, arguments, location);
};

/**
 * Gets an item on local disk.
 *
 * Set setItem() for details on storage types.
 *
 * @param api the flash interface, null to use only WebStorage.
 * @param id the storage ID to use.
 * @param key the key for the item.
 * @param location an array with the preferred types of storage to use.
 *
 * @return the item.
 */
util.getItem = function(api, id, key, location) {
  return _callStorageFunction(_getItem, arguments, location);
};

/**
 * Removes an item on local disk.
 *
 * Set setItem() for details on storage types.
 *
 * @param api the flash interface.
 * @param id the storage ID to use.
 * @param key the key for the item.
 * @param location an array with the preferred types of storage to use.
 */
util.removeItem = function(api, id, key, location) {
  _callStorageFunction(_removeItem, arguments, location);
};

/**
 * Clears the local disk storage identified by the given ID.
 *
 * Set setItem() for details on storage types.
 *
 * @param api the flash interface if flash is available.
 * @param id the storage ID to use.
 * @param location an array with the preferred types of storage to use.
 */
util.clearItems = function(api, id, location) {
  _callStorageFunction(_clearItems, arguments, location);
};

/**
 * Parses the scheme, host, and port from an http(s) url.
 *
 * @param str the url string.
 *
 * @return the parsed url object or null if the url is invalid.
 */
util.parseUrl = function(str) {
  // FIXME: this regex looks a bit broken
  var regex = /^(https?):\/\/([^:&^\/]*):?(\d*)(.*)$/g;
  regex.lastIndex = 0;
  var m = regex.exec(str);
  var url = (m === null) ? null : {
    full: str,
    scheme: m[1],
    host: m[2],
    port: m[3],
    path: m[4]
  };
  if(url) {
    url.fullHost = url.host;
    if(url.port) {
      if(url.port !== 80 && url.scheme === 'http') {
        url.fullHost += ':' + url.port;
      } else if(url.port !== 443 && url.scheme === 'https') {
        url.fullHost += ':' + url.port;
      }
    } else if(url.scheme === 'http') {
      url.port = 80;
    } else if(url.scheme === 'https') {
      url.port = 443;
    }
    url.full = url.scheme + '://' + url.fullHost;
  }
  return url;
};

/* Storage for query variables */
var _queryVariables = null;

/**
 * Returns the window location query variables. Query is parsed on the first
 * call and the same object is returned on subsequent calls. The mapping
 * is from keys to an array of values. Parameters without values will have
 * an object key set but no value added to the value array. Values are
 * unescaped.
 *
 * ...?k1=v1&k2=v2:
 * {
 *   "k1": ["v1"],
 *   "k2": ["v2"]
 * }
 *
 * ...?k1=v1&k1=v2:
 * {
 *   "k1": ["v1", "v2"]
 * }
 *
 * ...?k1=v1&k2:
 * {
 *   "k1": ["v1"],
 *   "k2": []
 * }
 *
 * ...?k1=v1&k1:
 * {
 *   "k1": ["v1"]
 * }
 *
 * ...?k1&k1:
 * {
 *   "k1": []
 * }
 *
 * @param query the query string to parse (optional, default to cached
 *          results from parsing window location search query).
 *
 * @return object mapping keys to variables.
 */
util.getQueryVariables = function(query) {
  var parse = function(q) {
    var rval = {};
    var kvpairs = q.split('&');
    for(var i = 0; i < kvpairs.length; i++) {
      var pos = kvpairs[i].indexOf('=');
      var key;
      var val;
      if(pos > 0) {
        key = kvpairs[i].substring(0, pos);
        val = kvpairs[i].substring(pos + 1);
      } else {
        key = kvpairs[i];
        val = null;
      }
      if(!(key in rval)) {
        rval[key] = [];
      }
      // disallow overriding object prototype keys
      if(!(key in Object.prototype) && val !== null) {
        rval[key].push(unescape(val));
      }
    }
    return rval;
  };

   var rval;
   if(typeof(query) === 'undefined') {
     // set cached variables if needed
     if(_queryVariables === null) {
       if(typeof(window) !== 'undefined' && window.location && window.location.search) {
          // parse window search query
          _queryVariables = parse(window.location.search.substring(1));
       } else {
          // no query variables available
          _queryVariables = {};
       }
     }
     rval = _queryVariables;
   } else {
     // parse given query
     rval = parse(query);
   }
   return rval;
};

/**
 * Parses a fragment into a path and query. This method will take a URI
 * fragment and break it up as if it were the main URI. For example:
 *    /bar/baz?a=1&b=2
 * results in:
 *    {
 *       path: ["bar", "baz"],
 *       query: {"k1": ["v1"], "k2": ["v2"]}
 *    }
 *
 * @return object with a path array and query object.
 */
util.parseFragment = function(fragment) {
  // default to whole fragment
  var fp = fragment;
  var fq = '';
  // split into path and query if possible at the first '?'
  var pos = fragment.indexOf('?');
  if(pos > 0) {
    fp = fragment.substring(0, pos);
    fq = fragment.substring(pos + 1);
  }
  // split path based on '/' and ignore first element if empty
  var path = fp.split('/');
  if(path.length > 0 && path[0] === '') {
    path.shift();
  }
  // convert query into object
  var query = (fq === '') ? {} : util.getQueryVariables(fq);

  return {
    pathString: fp,
    queryString: fq,
    path: path,
    query: query
  };
};

/**
 * Makes a request out of a URI-like request string. This is intended to
 * be used where a fragment id (after a URI '#') is parsed as a URI with
 * path and query parts. The string should have a path beginning and
 * delimited by '/' and optional query parameters following a '?'. The
 * query should be a standard URL set of key value pairs delimited by
 * '&'. For backwards compatibility the initial '/' on the path is not
 * required. The request object has the following API, (fully described
 * in the method code):
 *    {
 *       path: <the path string part>.
 *       query: <the query string part>,
 *       getPath(i): get part or all of the split path array,
 *       getQuery(k, i): get part or all of a query key array,
 *       getQueryLast(k, _default): get last element of a query key array.
 *    }
 *
 * @return object with request parameters.
 */
util.makeRequest = function(reqString) {
  var frag = util.parseFragment(reqString);
  var req = {
    // full path string
    path: frag.pathString,
    // full query string
    query: frag.queryString,
    /**
     * Get path or element in path.
     *
     * @param i optional path index.
     *
     * @return path or part of path if i provided.
     */
    getPath: function(i) {
      return (typeof(i) === 'undefined') ? frag.path : frag.path[i];
    },
    /**
     * Get query, values for a key, or value for a key index.
     *
     * @param k optional query key.
     * @param i optional query key index.
     *
     * @return query, values for a key, or value for a key index.
     */
    getQuery: function(k, i) {
      var rval;
      if(typeof(k) === 'undefined') {
        rval = frag.query;
      } else {
        rval = frag.query[k];
        if(rval && typeof(i) !== 'undefined') {
           rval = rval[i];
        }
      }
      return rval;
    },
    getQueryLast: function(k, _default) {
      var rval;
      var vals = req.getQuery(k);
      if(vals) {
        rval = vals[vals.length - 1];
      } else {
        rval = _default;
      }
      return rval;
    }
  };
  return req;
};

/**
 * Makes a URI out of a path, an object with query parameters, and a
 * fragment. Uses jQuery.param() internally for query string creation.
 * If the path is an array, it will be joined with '/'.
 *
 * @param path string path or array of strings.
 * @param query object with query parameters. (optional)
 * @param fragment fragment string. (optional)
 *
 * @return string object with request parameters.
 */
util.makeLink = function(path, query, fragment) {
  // join path parts if needed
  path = jQuery.isArray(path) ? path.join('/') : path;

  var qstr = jQuery.param(query || {});
  fragment = fragment || '';
  return path +
    ((qstr.length > 0) ? ('?' + qstr) : '') +
    ((fragment.length > 0) ? ('#' + fragment) : '');
};

/**
 * Follows a path of keys deep into an object hierarchy and set a value.
 * If a key does not exist or it's value is not an object, create an
 * object in it's place. This can be destructive to a object tree if
 * leaf nodes are given as non-final path keys.
 * Used to avoid exceptions from missing parts of the path.
 *
 * @param object the starting object.
 * @param keys an array of string keys.
 * @param value the value to set.
 */
util.setPath = function(object, keys, value) {
  // need to start at an object
  if(typeof(object) === 'object' && object !== null) {
    var i = 0;
    var len = keys.length;
    while(i < len) {
      var next = keys[i++];
      if(i == len) {
        // last
        object[next] = value;
      } else {
        // more
        var hasNext = (next in object);
        if(!hasNext ||
          (hasNext && typeof(object[next]) !== 'object') ||
          (hasNext && object[next] === null)) {
          object[next] = {};
        }
        object = object[next];
      }
    }
  }
};

/**
 * Follows a path of keys deep into an object hierarchy and return a value.
 * If a key does not exist, create an object in it's place.
 * Used to avoid exceptions from missing parts of the path.
 *
 * @param object the starting object.
 * @param keys an array of string keys.
 * @param _default value to return if path not found.
 *
 * @return the value at the path if found, else default if given, else
 *         undefined.
 */
util.getPath = function(object, keys, _default) {
  var i = 0;
  var len = keys.length;
  var hasNext = true;
  while(hasNext && i < len &&
    typeof(object) === 'object' && object !== null) {
    var next = keys[i++];
    hasNext = next in object;
    if(hasNext) {
      object = object[next];
    }
  }
  return (hasNext ? object : _default);
};

/**
 * Follow a path of keys deep into an object hierarchy and delete the
 * last one. If a key does not exist, do nothing.
 * Used to avoid exceptions from missing parts of the path.
 *
 * @param object the starting object.
 * @param keys an array of string keys.
 */
util.deletePath = function(object, keys) {
  // need to start at an object
  if(typeof(object) === 'object' && object !== null) {
    var i = 0;
    var len = keys.length;
    while(i < len) {
      var next = keys[i++];
      if(i == len) {
        // last
        delete object[next];
      } else {
        // more
        if(!(next in object) ||
          (typeof(object[next]) !== 'object') ||
          (object[next] === null)) {
           break;
        }
        object = object[next];
      }
    }
  }
};

/**
 * Check if an object is empty.
 *
 * Taken from:
 * http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object-from-json/679937#679937
 *
 * @param object the object to check.
 */
util.isEmpty = function(obj) {
  for(var prop in obj) {
    if(obj.hasOwnProperty(prop)) {
      return false;
    }
  }
  return true;
};

/**
 * Format with simple printf-style interpolation.
 *
 * %%: literal '%'
 * %s,%o: convert next argument into a string.
 *
 * @param format the string to format.
 * @param ... arguments to interpolate into the format string.
 */
util.format = function(format) {
  var re = /%./g;
  // current match
  var match;
  // current part
  var part;
  // current arg index
  var argi = 0;
  // collected parts to recombine later
  var parts = [];
  // last index found
  var last = 0;
  // loop while matches remain
  while((match = re.exec(format))) {
    part = format.substring(last, re.lastIndex - 2);
    // don't add empty strings (ie, parts between %s%s)
    if(part.length > 0) {
      parts.push(part);
    }
    last = re.lastIndex;
    // switch on % code
    var code = match[0][1];
    switch(code) {
    case 's':
    case 'o':
      // check if enough arguments were given
      if(argi < arguments.length) {
        parts.push(arguments[argi++ + 1]);
      } else {
        parts.push('<?>');
      }
      break;
    // FIXME: do proper formating for numbers, etc
    //case 'f':
    //case 'd':
    case '%':
      parts.push('%');
      break;
    default:
      parts.push('<%' + code + '?>');
    }
  }
  // add trailing part of format string
  parts.push(format.substring(last));
  return parts.join('');
};

/**
 * Formats a number.
 *
 * http://snipplr.com/view/5945/javascript-numberformat--ported-from-php/
 */
util.formatNumber = function(number, decimals, dec_point, thousands_sep) {
  // http://kevin.vanzonneveld.net
  // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +     bugfix by: Michael White (http://crestidg.com)
  // +     bugfix by: Benjamin Lupton
  // +     bugfix by: Allan Jensen (http://www.winternet.no)
  // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
  // *     example 1: number_format(1234.5678, 2, '.', '');
  // *     returns 1: 1234.57

  var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;
  var d = dec_point === undefined ? ',' : dec_point;
  var t = thousands_sep === undefined ?
   '.' : thousands_sep, s = n < 0 ? '-' : '';
  var i = parseInt((n = Math.abs(+n || 0).toFixed(c)), 10) + '';
  var j = (i.length > 3) ? i.length % 3 : 0;
  return s + (j ? i.substr(0, j) + t : '') +
    i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + t) +
    (c ? d + Math.abs(n - i).toFixed(c).slice(2) : '');
};

/**
 * Formats a byte size.
 *
 * http://snipplr.com/view/5949/format-humanize-file-byte-size-presentation-in-javascript/
 */
util.formatSize = function(size) {
  if(size >= 1073741824) {
    size = util.formatNumber(size / 1073741824, 2, '.', '') + ' GiB';
  } else if(size >= 1048576) {
    size = util.formatNumber(size / 1048576, 2, '.', '') + ' MiB';
  } else if(size >= 1024) {
    size = util.formatNumber(size / 1024, 0) + ' KiB';
  } else {
    size = util.formatNumber(size, 0) + ' bytes';
  }
  return size;
};

/**
 * Converts an IPv4 or IPv6 string representation into bytes (in network order).
 *
 * @param ip the IPv4 or IPv6 address to convert.
 *
 * @return the 4-byte IPv6 or 16-byte IPv6 address or null if the address can't
 *         be parsed.
 */
util.bytesFromIP = function(ip) {
  if(ip.indexOf('.') !== -1) {
    return util.bytesFromIPv4(ip);
  }
  if(ip.indexOf(':') !== -1) {
    return util.bytesFromIPv6(ip);
  }
  return null;
};

/**
 * Converts an IPv4 string representation into bytes (in network order).
 *
 * @param ip the IPv4 address to convert.
 *
 * @return the 4-byte address or null if the address can't be parsed.
 */
util.bytesFromIPv4 = function(ip) {
  ip = ip.split('.');
  if(ip.length !== 4) {
    return null;
  }
  var b = util.createBuffer();
  for(var i = 0; i < ip.length; ++i) {
    var num = parseInt(ip[i], 10);
    if(isNaN(num)) {
      return null;
    }
    b.putByte(num);
  }
  return b.getBytes();
};

/**
 * Converts an IPv6 string representation into bytes (in network order).
 *
 * @param ip the IPv6 address to convert.
 *
 * @return the 16-byte address or null if the address can't be parsed.
 */
util.bytesFromIPv6 = function(ip) {
  var blanks = 0;
  ip = ip.split(':').filter(function(e) {
    if(e.length === 0) ++blanks;
    return true;
  });
  var zeros = (8 - ip.length + blanks) * 2;
  var b = util.createBuffer();
  for(var i = 0; i < 8; ++i) {
    if(!ip[i] || ip[i].length === 0) {
      b.fillWithByte(0, zeros);
      zeros = 0;
      continue;
    }
    var bytes = util.hexToBytes(ip[i]);
    if(bytes.length < 2) {
      b.putByte(0);
    }
    b.putBytes(bytes);
  }
  return b.getBytes();
};

/**
 * Converts 4-bytes into an IPv4 string representation or 16-bytes into
 * an IPv6 string representation. The bytes must be in network order.
 *
 * @param bytes the bytes to convert.
 *
 * @return the IPv4 or IPv6 string representation if 4 or 16 bytes,
 *         respectively, are given, otherwise null.
 */
util.bytesToIP = function(bytes) {
  if(bytes.length === 4) {
    return util.bytesToIPv4(bytes);
  }
  if(bytes.length === 16) {
    return util.bytesToIPv6(bytes);
  }
  return null;
};

/**
 * Converts 4-bytes into an IPv4 string representation. The bytes must be
 * in network order.
 *
 * @param bytes the bytes to convert.
 *
 * @return the IPv4 string representation or null for an invalid # of bytes.
 */
util.bytesToIPv4 = function(bytes) {
  if(bytes.length !== 4) {
    return null;
  }
  var ip = [];
  for(var i = 0; i < bytes.length; ++i) {
    ip.push(bytes.charCodeAt(i));
  }
  return ip.join('.');
};

/**
 * Converts 16-bytes into an IPv16 string representation. The bytes must be
 * in network order.
 *
 * @param bytes the bytes to convert.
 *
 * @return the IPv16 string representation or null for an invalid # of bytes.
 */
util.bytesToIPv6 = function(bytes) {
  if(bytes.length !== 16) {
    return null;
  }
  var ip = [];
  var zeroGroups = [];
  var zeroMaxGroup = 0;
  for(var i = 0; i < bytes.length; i += 2) {
    var hex = util.bytesToHex(bytes[i] + bytes[i + 1]);
    // canonicalize zero representation
    while(hex[0] === '0' && hex !== '0') {
      hex = hex.substr(1);
    }
    if(hex === '0') {
      var last = zeroGroups[zeroGroups.length - 1];
      var idx = ip.length;
      if(!last || idx !== last.end + 1) {
        zeroGroups.push({start: idx, end: idx});
      } else {
        last.end = idx;
        if((last.end - last.start) >
          (zeroGroups[zeroMaxGroup].end - zeroGroups[zeroMaxGroup].start)) {
          zeroMaxGroup = zeroGroups.length - 1;
        }
      }
    }
    ip.push(hex);
  }
  if(zeroGroups.length > 0) {
    var group = zeroGroups[zeroMaxGroup];
    // only shorten group of length > 0
    if(group.end - group.start > 0) {
      ip.splice(group.start, group.end - group.start + 1, '');
      if(group.start === 0) {
        ip.unshift('');
      }
      if(group.end === 7) {
        ip.push('');
      }
    }
  }
  return ip.join(':');
};

/**
 * Estimates the number of processes that can be run concurrently. If
 * creating Web Workers, keep in mind that the main JavaScript process needs
 * its own core.
 *
 * @param options the options to use:
 *          update true to force an update (not use the cached value).
 * @param callback(err, max) called once the operation completes.
 */
util.estimateCores = function(options, callback) {
  if(typeof options === 'function') {
    callback = options;
    options = {};
  }
  options = options || {};
  if('cores' in util && !options.update) {
    return callback(null, util.cores);
  }
  if(typeof navigator !== 'undefined' &&
    'hardwareConcurrency' in navigator &&
    navigator.hardwareConcurrency > 0) {
    util.cores = navigator.hardwareConcurrency;
    return callback(null, util.cores);
  }
  if(typeof Worker === 'undefined') {
    // workers not available
    util.cores = 1;
    return callback(null, util.cores);
  }
  if(typeof Blob === 'undefined') {
    // can't estimate, default to 2
    util.cores = 2;
    return callback(null, util.cores);
  }

  // create worker concurrency estimation code as blob
  var blobUrl = URL.createObjectURL(new Blob(['(',
    function() {
      self.addEventListener('message', function(e) {
        // run worker for 4 ms
        var st = Date.now();
        var et = st + 4;
        while(Date.now() < et);
        self.postMessage({st: st, et: et});
      });
    }.toString(),
  ')()'], {type: 'application/javascript'}));

  // take 5 samples using 16 workers
  sample([], 5, 16);

  function sample(max, samples, numWorkers) {
    if(samples === 0) {
      // get overlap average
      var avg = Math.floor(max.reduce(function(avg, x) {
        return avg + x;
      }, 0) / max.length);
      util.cores = Math.max(1, avg);
      URL.revokeObjectURL(blobUrl);
      return callback(null, util.cores);
    }
    map(numWorkers, function(err, results) {
      max.push(reduce(numWorkers, results));
      sample(max, samples - 1, numWorkers);
    });
  }

  function map(numWorkers, callback) {
    var workers = [];
    var results = [];
    for(var i = 0; i < numWorkers; ++i) {
      var worker = new Worker(blobUrl);
      worker.addEventListener('message', function(e) {
        results.push(e.data);
        if(results.length === numWorkers) {
          for(var i = 0; i < numWorkers; ++i) {
            workers[i].terminate();
          }
          callback(null, results);
        }
      });
      workers.push(worker);
    }
    for(var i = 0; i < numWorkers; ++i) {
      workers[i].postMessage(i);
    }
  }

  function reduce(numWorkers, results) {
    // find overlapping time windows
    var overlaps = [];
    for(var n = 0; n < numWorkers; ++n) {
      var r1 = results[n];
      var overlap = overlaps[n] = [];
      for(var i = 0; i < numWorkers; ++i) {
        if(n === i) {
          continue;
        }
        var r2 = results[i];
        if((r1.st > r2.st && r1.st < r2.et) ||
          (r2.st > r1.st && r2.st < r1.et)) {
          overlap.push(i);
        }
      }
    }
    // get maximum overlaps ... don't include overlapping worker itself
    // as the main JS process was also being scheduled during the work and
    // would have to be subtracted from the estimate anyway
    return overlaps.reduce(function(max, overlap) {
      return Math.max(max, overlap.length);
    }, 0);
  }
};

}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],require("timers").setImmediate)
},{"./baseN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/baseN.js","./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browser-resolve/empty.js","timers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/timers-browserify/main.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/x509.js":[function(require,module,exports){
/**
 * Javascript implementation of X.509 and related components (such as
 * Certification Signing Requests) of a Public Key Infrastructure.
 *
 * @author Dave Longley
 *
 * Copyright (c) 2010-2014 Digital Bazaar, Inc.
 *
 * The ASN.1 representation of an X.509v3 certificate is as follows
 * (see RFC 2459):
 *
 * Certificate ::= SEQUENCE {
 *   tbsCertificate       TBSCertificate,
 *   signatureAlgorithm   AlgorithmIdentifier,
 *   signatureValue       BIT STRING
 * }
 *
 * TBSCertificate ::= SEQUENCE {
 *   version         [0]  EXPLICIT Version DEFAULT v1,
 *   serialNumber         CertificateSerialNumber,
 *   signature            AlgorithmIdentifier,
 *   issuer               Name,
 *   validity             Validity,
 *   subject              Name,
 *   subjectPublicKeyInfo SubjectPublicKeyInfo,
 *   issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
 *                        -- If present, version shall be v2 or v3
 *   subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
 *                        -- If present, version shall be v2 or v3
 *   extensions      [3]  EXPLICIT Extensions OPTIONAL
 *                        -- If present, version shall be v3
 * }
 *
 * Version ::= INTEGER  { v1(0), v2(1), v3(2) }
 *
 * CertificateSerialNumber ::= INTEGER
 *
 * Name ::= CHOICE {
 *   // only one possible choice for now
 *   RDNSequence
 * }
 *
 * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
 *
 * RelativeDistinguishedName ::= SET OF AttributeTypeAndValue
 *
 * AttributeTypeAndValue ::= SEQUENCE {
 *   type     AttributeType,
 *   value    AttributeValue
 * }
 * AttributeType ::= OBJECT IDENTIFIER
 * AttributeValue ::= ANY DEFINED BY AttributeType
 *
 * Validity ::= SEQUENCE {
 *   notBefore      Time,
 *   notAfter       Time
 * }
 *
 * Time ::= CHOICE {
 *   utcTime        UTCTime,
 *   generalTime    GeneralizedTime
 * }
 *
 * UniqueIdentifier ::= BIT STRING
 *
 * SubjectPublicKeyInfo ::= SEQUENCE {
 *   algorithm            AlgorithmIdentifier,
 *   subjectPublicKey     BIT STRING
 * }
 *
 * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
 *
 * Extension ::= SEQUENCE {
 *   extnID      OBJECT IDENTIFIER,
 *   critical    BOOLEAN DEFAULT FALSE,
 *   extnValue   OCTET STRING
 * }
 *
 * The only key algorithm currently supported for PKI is RSA.
 *
 * RSASSA-PSS signatures are described in RFC 3447 and RFC 4055.
 *
 * PKCS#10 v1.7 describes certificate signing requests:
 *
 * CertificationRequestInfo:
 *
 * CertificationRequestInfo ::= SEQUENCE {
 *   version       INTEGER { v1(0) } (v1,...),
 *   subject       Name,
 *   subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
 *   attributes    [0] Attributes{{ CRIAttributes }}
 * }
 *
 * Attributes { ATTRIBUTE:IOSet } ::= SET OF Attribute{{ IOSet }}
 *
 * CRIAttributes  ATTRIBUTE  ::= {
 *   ... -- add any locally defined attributes here -- }
 *
 * Attribute { ATTRIBUTE:IOSet } ::= SEQUENCE {
 *   type   ATTRIBUTE.&id({IOSet}),
 *   values SET SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{@type})
 * }
 *
 * CertificationRequest ::= SEQUENCE {
 *   certificationRequestInfo CertificationRequestInfo,
 *   signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
 *   signature          BIT STRING
 * }
 */
var forge = require('./forge');
require('./aes');
require('./asn1');
require('./des');
require('./md');
require('./mgf');
require('./oids');
require('./pem');
require('./pss');
require('./rsa');
require('./util');

// shortcut for asn.1 API
var asn1 = forge.asn1;

/* Public Key Infrastructure (PKI) implementation. */
var pki = module.exports = forge.pki = forge.pki || {};
var oids = pki.oids;

// short name OID mappings
var _shortNames = {};
_shortNames['CN'] = oids['commonName'];
_shortNames['commonName'] = 'CN';
_shortNames['C'] = oids['countryName'];
_shortNames['countryName'] = 'C';
_shortNames['L'] = oids['localityName'];
_shortNames['localityName'] = 'L';
_shortNames['ST'] = oids['stateOrProvinceName'];
_shortNames['stateOrProvinceName'] = 'ST';
_shortNames['O'] = oids['organizationName'];
_shortNames['organizationName'] = 'O';
_shortNames['OU'] = oids['organizationalUnitName'];
_shortNames['organizationalUnitName'] = 'OU';
_shortNames['E'] = oids['emailAddress'];
_shortNames['emailAddress'] = 'E';

// validator for an SubjectPublicKeyInfo structure
// Note: Currently only works with an RSA public key
var publicKeyValidator = forge.pki.rsa.publicKeyValidator;

// validator for an X.509v3 certificate
var x509CertificateValidator = {
  name: 'Certificate',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'Certificate.TBSCertificate',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    captureAsn1: 'tbsCertificate',
    value: [{
      name: 'Certificate.TBSCertificate.version',
      tagClass: asn1.Class.CONTEXT_SPECIFIC,
      type: 0,
      constructed: true,
      optional: true,
      value: [{
        name: 'Certificate.TBSCertificate.version.integer',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.INTEGER,
        constructed: false,
        capture: 'certVersion'
      }]
    }, {
      name: 'Certificate.TBSCertificate.serialNumber',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.INTEGER,
      constructed: false,
      capture: 'certSerialNumber'
    }, {
      name: 'Certificate.TBSCertificate.signature',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,
      constructed: true,
      value: [{
        name: 'Certificate.TBSCertificate.signature.algorithm',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.OID,
        constructed: false,
        capture: 'certinfoSignatureOid'
      }, {
        name: 'Certificate.TBSCertificate.signature.parameters',
        tagClass: asn1.Class.UNIVERSAL,
        optional: true,
        captureAsn1: 'certinfoSignatureParams'
      }]
    }, {
      name: 'Certificate.TBSCertificate.issuer',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,
      constructed: true,
      captureAsn1: 'certIssuer'
    }, {
      name: 'Certificate.TBSCertificate.validity',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,
      constructed: true,
      // Note: UTC and generalized times may both appear so the capture
      // names are based on their detected order, the names used below
      // are only for the common case, which validity time really means
      // "notBefore" and which means "notAfter" will be determined by order
      value: [{
        // notBefore (Time) (UTC time case)
        name: 'Certificate.TBSCertificate.validity.notBefore (utc)',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.UTCTIME,
        constructed: false,
        optional: true,
        capture: 'certValidity1UTCTime'
      }, {
        // notBefore (Time) (generalized time case)
        name: 'Certificate.TBSCertificate.validity.notBefore (generalized)',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.GENERALIZEDTIME,
        constructed: false,
        optional: true,
        capture: 'certValidity2GeneralizedTime'
      }, {
        // notAfter (Time) (only UTC time is supported)
        name: 'Certificate.TBSCertificate.validity.notAfter (utc)',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.UTCTIME,
        constructed: false,
        optional: true,
        capture: 'certValidity3UTCTime'
      }, {
        // notAfter (Time) (only UTC time is supported)
        name: 'Certificate.TBSCertificate.validity.notAfter (generalized)',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.GENERALIZEDTIME,
        constructed: false,
        optional: true,
        capture: 'certValidity4GeneralizedTime'
      }]
    }, {
      // Name (subject) (RDNSequence)
      name: 'Certificate.TBSCertificate.subject',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,
      constructed: true,
      captureAsn1: 'certSubject'
    },
    // SubjectPublicKeyInfo
    publicKeyValidator,
    {
      // issuerUniqueID (optional)
      name: 'Certificate.TBSCertificate.issuerUniqueID',
      tagClass: asn1.Class.CONTEXT_SPECIFIC,
      type: 1,
      constructed: true,
      optional: true,
      value: [{
        name: 'Certificate.TBSCertificate.issuerUniqueID.id',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.BITSTRING,
        constructed: false,
        // TODO: support arbitrary bit length ids
        captureBitStringValue: 'certIssuerUniqueId'
      }]
    }, {
      // subjectUniqueID (optional)
      name: 'Certificate.TBSCertificate.subjectUniqueID',
      tagClass: asn1.Class.CONTEXT_SPECIFIC,
      type: 2,
      constructed: true,
      optional: true,
      value: [{
        name: 'Certificate.TBSCertificate.subjectUniqueID.id',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.BITSTRING,
        constructed: false,
        // TODO: support arbitrary bit length ids
        captureBitStringValue: 'certSubjectUniqueId'
      }]
    }, {
      // Extensions (optional)
      name: 'Certificate.TBSCertificate.extensions',
      tagClass: asn1.Class.CONTEXT_SPECIFIC,
      type: 3,
      constructed: true,
      captureAsn1: 'certExtensions',
      optional: true
    }]
  }, {
    // AlgorithmIdentifier (signature algorithm)
    name: 'Certificate.signatureAlgorithm',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    value: [{
      // algorithm
      name: 'Certificate.signatureAlgorithm.algorithm',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.OID,
      constructed: false,
      capture: 'certSignatureOid'
    }, {
      name: 'Certificate.TBSCertificate.signature.parameters',
      tagClass: asn1.Class.UNIVERSAL,
      optional: true,
      captureAsn1: 'certSignatureParams'
    }]
  }, {
    // SignatureValue
    name: 'Certificate.signatureValue',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.BITSTRING,
    constructed: false,
    captureBitStringValue: 'certSignature'
  }]
};

var rsassaPssParameterValidator = {
  name: 'rsapss',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  value: [{
    name: 'rsapss.hashAlgorithm',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    type: 0,
    constructed: true,
    value: [{
      name: 'rsapss.hashAlgorithm.AlgorithmIdentifier',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Class.SEQUENCE,
      constructed: true,
      optional: true,
      value: [{
        name: 'rsapss.hashAlgorithm.AlgorithmIdentifier.algorithm',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.OID,
        constructed: false,
        capture: 'hashOid'
        /* parameter block omitted, for SHA1 NULL anyhow. */
      }]
    }]
  }, {
    name: 'rsapss.maskGenAlgorithm',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    type: 1,
    constructed: true,
    value: [{
      name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Class.SEQUENCE,
      constructed: true,
      optional: true,
      value: [{
        name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier.algorithm',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.OID,
        constructed: false,
        capture: 'maskGenOid'
      }, {
        name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier.params',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.SEQUENCE,
        constructed: true,
        value: [{
          name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier.params.algorithm',
          tagClass: asn1.Class.UNIVERSAL,
          type: asn1.Type.OID,
          constructed: false,
          capture: 'maskGenHashOid'
          /* parameter block omitted, for SHA1 NULL anyhow. */
        }]
      }]
    }]
  }, {
    name: 'rsapss.saltLength',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    type: 2,
    optional: true,
    value: [{
      name: 'rsapss.saltLength.saltLength',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Class.INTEGER,
      constructed: false,
      capture: 'saltLength'
    }]
  }, {
    name: 'rsapss.trailerField',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    type: 3,
    optional: true,
    value: [{
      name: 'rsapss.trailer.trailer',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Class.INTEGER,
      constructed: false,
      capture: 'trailer'
    }]
  }]
};

// validator for a CertificationRequestInfo structure
var certificationRequestInfoValidator = {
  name: 'CertificationRequestInfo',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  captureAsn1: 'certificationRequestInfo',
  value: [{
    name: 'CertificationRequestInfo.integer',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.INTEGER,
    constructed: false,
    capture: 'certificationRequestInfoVersion'
  }, {
    // Name (subject) (RDNSequence)
    name: 'CertificationRequestInfo.subject',
    tagClass: asn1.Class.UNIVERSAL,
    type: asn1.Type.SEQUENCE,
    constructed: true,
    captureAsn1: 'certificationRequestInfoSubject'
  },
  // SubjectPublicKeyInfo
  publicKeyValidator,
  {
    name: 'CertificationRequestInfo.attributes',
    tagClass: asn1.Class.CONTEXT_SPECIFIC,
    type: 0,
    constructed: true,
    optional: true,
    capture: 'certificationRequestInfoAttributes',
    value: [{
      name: 'CertificationRequestInfo.attributes',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,
      constructed: true,
      value: [{
        name: 'CertificationRequestInfo.attributes.type',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.OID,
        constructed: false
      }, {
        name: 'CertificationRequestInfo.attributes.value',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.SET,
        constructed: true
      }]
    }]
  }]
};

// validator for a CertificationRequest structure
var certificationRequestValidator = {
  name: 'CertificationRequest',
  tagClass: asn1.Class.UNIVERSAL,
  type: asn1.Type.SEQUENCE,
  constructed: true,
  captureAsn1: 'csr',
  value: [
    certificationRequestInfoValidator, {
      // AlgorithmIdentifier (signature algorithm)
      name: 'CertificationRequest.signatureAlgorithm',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.SEQUENCE,
      constructed: true,
      value: [{
        // algorithm
        name: 'CertificationRequest.signatureAlgorithm.algorithm',
        tagClass: asn1.Class.UNIVERSAL,
        type: asn1.Type.OID,
        constructed: false,
        capture: 'csrSignatureOid'
      }, {
        name: 'CertificationRequest.signatureAlgorithm.parameters',
        tagClass: asn1.Class.UNIVERSAL,
        optional: true,
        captureAsn1: 'csrSignatureParams'
      }]
    }, {
      // signature
      name: 'CertificationRequest.signature',
      tagClass: asn1.Class.UNIVERSAL,
      type: asn1.Type.BITSTRING,
      constructed: false,
      captureBitStringValue: 'csrSignature'
    }
  ]
};

/**
 * Converts an RDNSequence of ASN.1 DER-encoded RelativeDistinguishedName
 * sets into an array with objects that have type and value properties.
 *
 * @param rdn the RDNSequence to convert.
 * @param md a message digest to append type and value to if provided.
 */
pki.RDNAttributesAsArray = function(rdn, md) {
  var rval = [];

  // each value in 'rdn' in is a SET of RelativeDistinguishedName
  var set, attr, obj;
  for(var si = 0; si < rdn.value.length; ++si) {
    // get the RelativeDistinguishedName set
    set = rdn.value[si];

    // each value in the SET is an AttributeTypeAndValue sequence
    // containing first a type (an OID) and second a value (defined by
    // the OID)
    for(var i = 0; i < set.value.length; ++i) {
      obj = {};
      attr = set.value[i];
      obj.type = asn1.derToOid(attr.value[0].value);
      obj.value = attr.value[1].value;
      obj.valueTagClass = attr.value[1].type;
      // if the OID is known, get its name and short name
      if(obj.type in oids) {
        obj.name = oids[obj.type];
        if(obj.name in _shortNames) {
          obj.shortName = _shortNames[obj.name];
        }
      }
      if(md) {
        md.update(obj.type);
        md.update(obj.value);
      }
      rval.push(obj);
    }
  }

  return rval;
};

/**
 * Converts ASN.1 CRIAttributes into an array with objects that have type and
 * value properties.
 *
 * @param attributes the CRIAttributes to convert.
 */
pki.CRIAttributesAsArray = function(attributes) {
  var rval = [];

  // each value in 'attributes' in is a SEQUENCE with an OID and a SET
  for(var si = 0; si < attributes.length; ++si) {
    // get the attribute sequence
    var seq = attributes[si];

    // each value in the SEQUENCE containing first a type (an OID) and
    // second a set of values (defined by the OID)
    var type = asn1.derToOid(seq.value[0].value);
    var values = seq.value[1].value;
    for(var vi = 0; vi < values.length; ++vi) {
      var obj = {};
      obj.type = type;
      obj.value = values[vi].value;
      obj.valueTagClass = values[vi].type;
      // if the OID is known, get its name and short name
      if(obj.type in oids) {
        obj.name = oids[obj.type];
        if(obj.name in _shortNames) {
          obj.shortName = _shortNames[obj.name];
        }
      }
      // parse extensions
      if(obj.type === oids.extensionRequest) {
        obj.extensions = [];
        for(var ei = 0; ei < obj.value.length; ++ei) {
          obj.extensions.push(pki.certificateExtensionFromAsn1(obj.value[ei]));
        }
      }
      rval.push(obj);
    }
  }

  return rval;
};

/**
 * Gets an issuer or subject attribute from its name, type, or short name.
 *
 * @param obj the issuer or subject object.
 * @param options a short name string or an object with:
 *          shortName the short name for the attribute.
 *          name the name for the attribute.
 *          type the type for the attribute.
 *
 * @return the attribute.
 */
function _getAttribute(obj, options) {
  if(typeof options === 'string') {
    options = {shortName: options};
  }

  var rval = null;
  var attr;
  for(var i = 0; rval === null && i < obj.attributes.length; ++i) {
    attr = obj.attributes[i];
    if(options.type && options.type === attr.type) {
      rval = attr;
    } else if(options.name && options.name === attr.name) {
      rval = attr;
    } else if(options.shortName && options.shortName === attr.shortName) {
      rval = attr;
    }
  }
  return rval;
}

/**
 * Converts signature parameters from ASN.1 structure.
 *
 * Currently only RSASSA-PSS supported.  The PKCS#1 v1.5 signature scheme had
 * no parameters.
 *
 * RSASSA-PSS-params  ::=  SEQUENCE  {
 *   hashAlgorithm      [0] HashAlgorithm DEFAULT
 *                             sha1Identifier,
 *   maskGenAlgorithm   [1] MaskGenAlgorithm DEFAULT
 *                             mgf1SHA1Identifier,
 *   saltLength         [2] INTEGER DEFAULT 20,
 *   trailerField       [3] INTEGER DEFAULT 1
 * }
 *
 * HashAlgorithm  ::=  AlgorithmIdentifier
 *
 * MaskGenAlgorithm  ::=  AlgorithmIdentifier
 *
 * AlgorithmIdentifer ::= SEQUENCE {
 *   algorithm OBJECT IDENTIFIER,
 *   parameters ANY DEFINED BY algorithm OPTIONAL
 * }
 *
 * @param oid The OID specifying the signature algorithm
 * @param obj The ASN.1 structure holding the parameters
 * @param fillDefaults Whether to use return default values where omitted
 * @return signature parameter object
 */
var _readSignatureParameters = function(oid, obj, fillDefaults) {
  var params = {};

  if(oid !== oids['RSASSA-PSS']) {
    return params;
  }

  if(fillDefaults) {
    params = {
      hash: {
        algorithmOid: oids['sha1']
      },
      mgf: {
        algorithmOid: oids['mgf1'],
        hash: {
          algorithmOid: oids['sha1']
        }
      },
      saltLength: 20
    };
  }

  var capture = {};
  var errors = [];
  if(!asn1.validate(obj, rsassaPssParameterValidator, capture, errors)) {
    var error = new Error('Cannot read RSASSA-PSS parameter block.');
    error.errors = errors;
    throw error;
  }

  if(capture.hashOid !== undefined) {
    params.hash = params.hash || {};
    params.hash.algorithmOid = asn1.derToOid(capture.hashOid);
  }

  if(capture.maskGenOid !== undefined) {
    params.mgf = params.mgf || {};
    params.mgf.algorithmOid = asn1.derToOid(capture.maskGenOid);
    params.mgf.hash = params.mgf.hash || {};
    params.mgf.hash.algorithmOid = asn1.derToOid(capture.maskGenHashOid);
  }

  if(capture.saltLength !== undefined) {
    params.saltLength = capture.saltLength.charCodeAt(0);
  }

  return params;
};

/**
 * Converts an X.509 certificate from PEM format.
 *
 * Note: If the certificate is to be verified then compute hash should
 * be set to true. This will scan the TBSCertificate part of the ASN.1
 * object while it is converted so it doesn't need to be converted back
 * to ASN.1-DER-encoding later.
 *
 * @param pem the PEM-formatted certificate.
 * @param computeHash true to compute the hash for verification.
 * @param strict true to be strict when checking ASN.1 value lengths, false to
 *          allow truncated values (default: true).
 *
 * @return the certificate.
 */
pki.certificateFromPem = function(pem, computeHash, strict) {
  var msg = forge.pem.decode(pem)[0];

  if(msg.type !== 'CERTIFICATE' &&
    msg.type !== 'X509 CERTIFICATE' &&
    msg.type !== 'TRUSTED CERTIFICATE') {
    var error = new Error(
      'Could not convert certificate from PEM; PEM header type ' +
      'is not "CERTIFICATE", "X509 CERTIFICATE", or "TRUSTED CERTIFICATE".');
    error.headerType = msg.type;
    throw error;
  }
  if(msg.procType && msg.procType.type === 'ENCRYPTED') {
    throw new Error(
      'Could not convert certificate from PEM; PEM is encrypted.');
  }

  // convert DER to ASN.1 object
  var obj = asn1.fromDer(msg.body, strict);

  return pki.certificateFromAsn1(obj, computeHash);
};

/**
 * Converts an X.509 certificate to PEM format.
 *
 * @param cert the certificate.
 * @param maxline the maximum characters per line, defaults to 64.
 *
 * @return the PEM-formatted certificate.
 */
pki.certificateToPem = function(cert, maxline) {
  // convert to ASN.1, then DER, then PEM-encode
  var msg = {
    type: 'CERTIFICATE',
    body: asn1.toDer(pki.certificateToAsn1(cert)).getBytes()
  };
  return forge.pem.encode(msg, {maxline: maxline});
};

/**
 * Converts an RSA public key from PEM format.
 *
 * @param pem the PEM-formatted public key.
 *
 * @return the public key.
 */
pki.publicKeyFromPem = function(pem) {
  var msg = forge.pem.decode(pem)[0];

  if(msg.type !== 'PUBLIC KEY' && msg.type !== 'RSA PUBLIC KEY') {
    var error = new Error('Could not convert public key from PEM; PEM header ' +
      'type is not "PUBLIC KEY" or "RSA PUBLIC KEY".');
    error.headerType = msg.type;
    throw error;
  }
  if(msg.procType && msg.procType.type === 'ENCRYPTED') {
    throw new Error('Could not convert public key from PEM; PEM is encrypted.');
  }

  // convert DER to ASN.1 object
  var obj = asn1.fromDer(msg.body);

  return pki.publicKeyFromAsn1(obj);
};

/**
 * Converts an RSA public key to PEM format (using a SubjectPublicKeyInfo).
 *
 * @param key the public key.
 * @param maxline the maximum characters per line, defaults to 64.
 *
 * @return the PEM-formatted public key.
 */
pki.publicKeyToPem = function(key, maxline) {
  // convert to ASN.1, then DER, then PEM-encode
  var msg = {
    type: 'PUBLIC KEY',
    body: asn1.toDer(pki.publicKeyToAsn1(key)).getBytes()
  };
  return forge.pem.encode(msg, {maxline: maxline});
};

/**
 * Converts an RSA public key to PEM format (using an RSAPublicKey).
 *
 * @param key the public key.
 * @param maxline the maximum characters per line, defaults to 64.
 *
 * @return the PEM-formatted public key.
 */
pki.publicKeyToRSAPublicKeyPem = function(key, maxline) {
  // convert to ASN.1, then DER, then PEM-encode
  var msg = {
    type: 'RSA PUBLIC KEY',
    body: asn1.toDer(pki.publicKeyToRSAPublicKey(key)).getBytes()
  };
  return forge.pem.encode(msg, {maxline: maxline});
};

/**
 * Gets a fingerprint for the given public key.
 *
 * @param options the options to use.
 *          [md] the message digest object to use (defaults to forge.md.sha1).
 *          [type] the type of fingerprint, such as 'RSAPublicKey',
 *            'SubjectPublicKeyInfo' (defaults to 'RSAPublicKey').
 *          [encoding] an alternative output encoding, such as 'hex'
 *            (defaults to none, outputs a byte buffer).
 *          [delimiter] the delimiter to use between bytes for 'hex' encoded
 *            output, eg: ':' (defaults to none).
 *
 * @return the fingerprint as a byte buffer or other encoding based on options.
 */
pki.getPublicKeyFingerprint = function(key, options) {
  options = options || {};
  var md = options.md || forge.md.sha1.create();
  var type = options.type || 'RSAPublicKey';

  var bytes;
  switch(type) {
    case 'RSAPublicKey':
      bytes = asn1.toDer(pki.publicKeyToRSAPublicKey(key)).getBytes();
      break;
    case 'SubjectPublicKeyInfo':
      bytes = asn1.toDer(pki.publicKeyToAsn1(key)).getBytes();
      break;
    default:
      throw new Error('Unknown fingerprint type "' + options.type + '".');
  }

  // hash public key bytes
  md.start();
  md.update(bytes);
  var digest = md.digest();
  if(options.encoding === 'hex') {
    var hex = digest.toHex();
    if(options.delimiter) {
      return hex.match(/.{2}/g).join(options.delimiter);
    }
    return hex;
  } else if(options.encoding === 'binary') {
    return digest.getBytes();
  } else if(options.encoding) {
    throw new Error('Unknown encoding "' + options.encoding + '".');
  }
  return digest;
};

/**
 * Converts a PKCS#10 certification request (CSR) from PEM format.
 *
 * Note: If the certification request is to be verified then compute hash
 * should be set to true. This will scan the CertificationRequestInfo part of
 * the ASN.1 object while it is converted so it doesn't need to be converted
 * back to ASN.1-DER-encoding later.
 *
 * @param pem the PEM-formatted certificate.
 * @param computeHash true to compute the hash for verification.
 * @param strict true to be strict when checking ASN.1 value lengths, false to
 *          allow truncated values (default: true).
 *
 * @return the certification request (CSR).
 */
pki.certificationRequestFromPem = function(pem, computeHash, strict) {
  var msg = forge.pem.decode(pem)[0];

  if(msg.type !== 'CERTIFICATE REQUEST') {
    var error = new Error('Could not convert certification request from PEM; ' +
      'PEM header type is not "CERTIFICATE REQUEST".');
    error.headerType = msg.type;
    throw error;
  }
  if(msg.procType && msg.procType.type === 'ENCRYPTED') {
    throw new Error('Could not convert certification request from PEM; ' +
      'PEM is encrypted.');
  }

  // convert DER to ASN.1 object
  var obj = asn1.fromDer(msg.body, strict);

  return pki.certificationRequestFromAsn1(obj, computeHash);
};

/**
 * Converts a PKCS#10 certification request (CSR) to PEM format.
 *
 * @param csr the certification request.
 * @param maxline the maximum characters per line, defaults to 64.
 *
 * @return the PEM-formatted certification request.
 */
pki.certificationRequestToPem = function(csr, maxline) {
  // convert to ASN.1, then DER, then PEM-encode
  var msg = {
    type: 'CERTIFICATE REQUEST',
    body: asn1.toDer(pki.certificationRequestToAsn1(csr)).getBytes()
  };
  return forge.pem.encode(msg, {maxline: maxline});
};

/**
 * Creates an empty X.509v3 RSA certificate.
 *
 * @return the certificate.
 */
pki.createCertificate = function() {
  var cert = {};
  cert.version = 0x02;
  cert.serialNumber = '00';
  cert.signatureOid = null;
  cert.signature = null;
  cert.siginfo = {};
  cert.siginfo.algorithmOid = null;
  cert.validity = {};
  cert.validity.notBefore = new Date();
  cert.validity.notAfter = new Date();

  cert.issuer = {};
  cert.issuer.getField = function(sn) {
    return _getAttribute(cert.issuer, sn);
  };
  cert.issuer.addField = function(attr) {
    _fillMissingFields([attr]);
    cert.issuer.attributes.push(attr);
  };
  cert.issuer.attributes = [];
  cert.issuer.hash = null;

  cert.subject = {};
  cert.subject.getField = function(sn) {
    return _getAttribute(cert.subject, sn);
  };
  cert.subject.addField = function(attr) {
    _fillMissingFields([attr]);
    cert.subject.attributes.push(attr);
  };
  cert.subject.attributes = [];
  cert.subject.hash = null;

  cert.extensions = [];
  cert.publicKey = null;
  cert.md = null;

  /**
   * Sets the subject of this certificate.
   *
   * @param attrs the array of subject attributes to use.
   * @param uniqueId an optional a unique ID to use.
   */
  cert.setSubject = function(attrs, uniqueId) {
    // set new attributes, clear hash
    _fillMissingFields(attrs);
    cert.subject.attributes = attrs;
    delete cert.subject.uniqueId;
    if(uniqueId) {
      // TODO: support arbitrary bit length ids
      cert.subject.uniqueId = uniqueId;
    }
    cert.subject.hash = null;
  };

  /**
   * Sets the issuer of this certificate.
   *
   * @param attrs the array of issuer attributes to use.
   * @param uniqueId an optional a unique ID to use.
   */
  cert.setIssuer = function(attrs, uniqueId) {
    // set new attributes, clear hash
    _fillMissingFields(attrs);
    cert.issuer.attributes = attrs;
    delete cert.issuer.uniqueId;
    if(uniqueId) {
      // TODO: support arbitrary bit length ids
      cert.issuer.uniqueId = uniqueId;
    }
    cert.issuer.hash = null;
  };

  /**
   * Sets the extensions of this certificate.
   *
   * @param exts the array of extensions to use.
   */
  cert.setExtensions = function(exts) {
    for(var i = 0; i < exts.length; ++i) {
      _fillMissingExtensionFields(exts[i], {cert: cert});
    }
    // set new extensions
    cert.extensions = exts;
  };

  /**
   * Gets an extension by its name or id.
   *
   * @param options the name to use or an object with:
   *          name the name to use.
   *          id the id to use.
   *
   * @return the extension or null if not found.
   */
  cert.getExtension = function(options) {
    if(typeof options === 'string') {
      options = {name: options};
    }

    var rval = null;
    var ext;
    for(var i = 0; rval === null && i < cert.extensions.length; ++i) {
      ext = cert.extensions[i];
      if(options.id && ext.id === options.id) {
        rval = ext;
      } else if(options.name && ext.name === options.name) {
        rval = ext;
      }
    }
    return rval;
  };

  /**
   * Signs this certificate using the given private key.
   *
   * @param key the private key to sign with.
   * @param md the message digest object to use (defaults to forge.md.sha1).
   */
  cert.sign = function(key, md) {
    // TODO: get signature OID from private key
    cert.md = md || forge.md.sha1.create();
    var algorithmOid = oids[cert.md.algorithm + 'WithRSAEncryption'];
    if(!algorithmOid) {
      var error = new Error('Could not compute certificate digest. ' +
        'Unknown message digest algorithm OID.');
      error.algorithm = cert.md.algorithm;
      throw error;
    }
    cert.signatureOid = cert.siginfo.algorithmOid = algorithmOid;

    // get TBSCertificate, convert to DER
    cert.tbsCertificate = pki.getTBSCertificate(cert);
    var bytes = asn1.toDer(cert.tbsCertificate);

    // digest and sign
    cert.md.update(bytes.getBytes());
    cert.signature = key.sign(cert.md);
  };

  /**
   * Attempts verify the signature on the passed certificate using this
   * certificate's public key.
   *
   * @param child the certificate to verify.
   *
   * @return true if verified, false if not.
   */
  cert.verify = function(child) {
    var rval = false;

    if(!cert.issued(child)) {
      var issuer = child.issuer;
      var subject = cert.subject;
      var error = new Error(
        'The parent certificate did not issue the given child ' +
        'certificate; the child certificate\'s issuer does not match the ' +
        'parent\'s subject.');
      error.expectedIssuer = issuer.attributes;
      error.actualIssuer = subject.attributes;
      throw error;
    }

    var md = child.md;
    if(md === null) {
      // check signature OID for supported signature types
      if(child.signatureOid in oids) {
        var oid = oids[child.signatureOid];
        switch(oid) {
          case 'sha1WithRSAEncryption':
            md = forge.md.sha1.create();
            break;
          case 'md5WithRSAEncryption':
            md = forge.md.md5.create();
            break;
          case 'sha256WithRSAEncryption':
            md = forge.md.sha256.create();
            break;
          case 'sha384WithRSAEncryption':
            md = forge.md.sha384.create();
            break;
          case 'sha512WithRSAEncryption':
            md = forge.md.sha512.create();
            break;
          case 'RSASSA-PSS':
            md = forge.md.sha256.create();
            break;
        }
      }
      if(md === null) {
        var error = new Error('Could not compute certificate digest. ' +
          'Unknown signature OID.');
        error.signatureOid = child.signatureOid;
        throw error;
      }

      // produce DER formatted TBSCertificate and digest it
      var tbsCertificate = child.tbsCertificate || pki.getTBSCertificate(child);
      var bytes = asn1.toDer(tbsCertificate);
      md.update(bytes.getBytes());
    }

    if(md !== null) {
      var scheme;

      switch(child.signatureOid) {
        case oids.sha1WithRSAEncryption:
          scheme = undefined; /* use PKCS#1 v1.5 padding scheme */
          break;
        case oids['RSASSA-PSS']:
          var hash, mgf;

          /* initialize mgf */
          hash = oids[child.signatureParameters.mgf.hash.algorithmOid];
          if(hash === undefined || forge.md[hash] === undefined) {
            var error = new Error('Unsupported MGF hash function.');
            error.oid = child.signatureParameters.mgf.hash.algorithmOid;
            error.name = hash;
            throw error;
          }

          mgf = oids[child.signatureParameters.mgf.algorithmOid];
          if(mgf === undefined || forge.mgf[mgf] === undefined) {
            var error = new Error('Unsupported MGF function.');
            error.oid = child.signatureParameters.mgf.algorithmOid;
            error.name = mgf;
            throw error;
          }

          mgf = forge.mgf[mgf].create(forge.md[hash].create());

          /* initialize hash function */
          hash = oids[child.signatureParameters.hash.algorithmOid];
          if(hash === undefined || forge.md[hash] === undefined) {
            throw {
              message: 'Unsupported RSASSA-PSS hash function.',
              oid: child.signatureParameters.hash.algorithmOid,
              name: hash
            };
          }

          scheme = forge.pss.create(forge.md[hash].create(), mgf,
            child.signatureParameters.saltLength);
          break;
      }

      // verify signature on cert using public key
      rval = cert.publicKey.verify(
        md.digest().getBytes(), child.signature, scheme);
    }

    return rval;
  };

  /**
   * Returns true if this certificate's issuer matches the passed
   * certificate's subject. Note that no signature check is performed.
   *
   * @param parent the certificate to check.
   *
   * @return true if this certificate's issuer matches the passed certificate's
   *         subject.
   */
  cert.isIssuer = function(parent) {
    var rval = false;

    var i = cert.issuer;
    var s = parent.subject;

    // compare hashes if present
    if(i.hash && s.hash) {
      rval = (i.hash === s.hash);
    } else if(i.attributes.length === s.attributes.length) {
      // all attributes are the same so issuer matches subject
      rval = true;
      var iattr, sattr;
      for(var n = 0; rval && n < i.attributes.length; ++n) {
        iattr = i.attributes[n];
        sattr = s.attributes[n];
        if(iattr.type !== sattr.type || iattr.value !== sattr.value) {
          // attribute mismatch
          rval = false;
        }
      }
    }

    return rval;
  };

  /**
   * Returns true if this certificate's subject matches the issuer of the
   * given certificate). Note that not signature check is performed.
   *
   * @param child the certificate to check.
   *
   * @return true if this certificate's subject matches the passed
   *         certificate's issuer.
   */
  cert.issued = function(child) {
    return child.isIssuer(cert);
  };

  /**
   * Generates the subjectKeyIdentifier for this certificate as byte buffer.
   *
   * @return the subjectKeyIdentifier for this certificate as byte buffer.
   */
  cert.generateSubjectKeyIdentifier = function() {
    /* See: 4.2.1.2 section of the the RFC3280, keyIdentifier is either:

      (1) The keyIdentifier is composed of the 160-bit SHA-1 hash of the
        value of the BIT STRING subjectPublicKey (excluding the tag,
        length, and number of unused bits).

      (2) The keyIdentifier is composed of a four bit type field with
        the value 0100 followed by the least significant 60 bits of the
        SHA-1 hash of the value of the BIT STRING subjectPublicKey
        (excluding the tag, length, and number of unused bit string bits).
    */

    // skipping the tag, length, and number of unused bits is the same
    // as just using the RSAPublicKey (for RSA keys, which are the
    // only ones supported)
    return pki.getPublicKeyFingerprint(cert.publicKey, {type: 'RSAPublicKey'});
  };

  /**
   * Verifies the subjectKeyIdentifier extension value for this certificate
   * against its public key. If no extension is found, false will be
   * returned.
   *
   * @return true if verified, false if not.
   */
  cert.verifySubjectKeyIdentifier = function() {
    var oid = oids['subjectKeyIdentifier'];
    for(var i = 0; i < cert.extensions.length; ++i) {
      var ext = cert.extensions[i];
      if(ext.id === oid) {
        var ski = cert.generateSubjectKeyIdentifier().getBytes();
        return (forge.util.hexToBytes(ext.subjectKeyIdentifier) === ski);
      }
    }
    return false;
  };

  return cert;
};

/**
 * Converts an X.509v3 RSA certificate from an ASN.1 object.
 *
 * Note: If the certificate is to be verified then compute hash should
 * be set to true. There is currently no implementation for converting
 * a certificate back to ASN.1 so the TBSCertificate part of the ASN.1
 * object needs to be scanned before the cert object is created.
 *
 * @param obj the asn1 representation of an X.509v3 RSA certificate.
 * @param computeHash true to compute the hash for verification.
 *
 * @return the certificate.
 */
pki.certificateFromAsn1 = function(obj, computeHash) {
  // validate certificate and capture data
  var capture = {};
  var errors = [];
  if(!asn1.validate(obj, x509CertificateValidator, capture, errors)) {
    var error = new Error('Cannot read X.509 certificate. ' +
      'ASN.1 object is not an X509v3 Certificate.');
    error.errors = errors;
    throw error;
  }

  // get oid
  var oid = asn1.derToOid(capture.publicKeyOid);
  if(oid !== pki.oids.rsaEncryption) {
    throw new Error('Cannot read public key. OID is not RSA.');
  }

  // create certificate
  var cert = pki.createCertificate();
  cert.version = capture.certVersion ?
    capture.certVersion.charCodeAt(0) : 0;
  var serial = forge.util.createBuffer(capture.certSerialNumber);
  cert.serialNumber = serial.toHex();
  cert.signatureOid = forge.asn1.derToOid(capture.certSignatureOid);
  cert.signatureParameters = _readSignatureParameters(
    cert.signatureOid, capture.certSignatureParams, true);
  cert.siginfo.algorithmOid = forge.asn1.derToOid(capture.certinfoSignatureOid);
  cert.siginfo.parameters = _readSignatureParameters(cert.siginfo.algorithmOid,
    capture.certinfoSignatureParams, false);
  cert.signature = capture.certSignature;

  var validity = [];
  if(capture.certValidity1UTCTime !== undefined) {
    validity.push(asn1.utcTimeToDate(capture.certValidity1UTCTime));
  }
  if(capture.certValidity2GeneralizedTime !== undefined) {
    validity.push(asn1.generalizedTimeToDate(
      capture.certValidity2GeneralizedTime));
  }
  if(capture.certValidity3UTCTime !== undefined) {
    validity.push(asn1.utcTimeToDate(capture.certValidity3UTCTime));
  }
  if(capture.certValidity4GeneralizedTime !== undefined) {
    validity.push(asn1.generalizedTimeToDate(
      capture.certValidity4GeneralizedTime));
  }
  if(validity.length > 2) {
    throw new Error('Cannot read notBefore/notAfter validity times; more ' +
      'than two times were provided in the certificate.');
  }
  if(validity.length < 2) {
    throw new Error('Cannot read notBefore/notAfter validity times; they ' +
      'were not provided as either UTCTime or GeneralizedTime.');
  }
  cert.validity.notBefore = validity[0];
  cert.validity.notAfter = validity[1];

  // keep TBSCertificate to preserve signature when exporting
  cert.tbsCertificate = capture.tbsCertificate;

  if(computeHash) {
    // check signature OID for supported signature types
    cert.md = null;
    if(cert.signatureOid in oids) {
      var oid = oids[cert.signatureOid];
      switch(oid) {
        case 'sha1WithRSAEncryption':
          cert.md = forge.md.sha1.create();
          break;
        case 'md5WithRSAEncryption':
          cert.md = forge.md.md5.create();
          break;
        case 'sha256WithRSAEncryption':
          cert.md = forge.md.sha256.create();
          break;
        case 'sha384WithRSAEncryption':
          cert.md = forge.md.sha384.create();
          break;
        case 'sha512WithRSAEncryption':
          cert.md = forge.md.sha512.create();
          break;
        case 'RSASSA-PSS':
          cert.md = forge.md.sha256.create();
          break;
      }
    }
    if(cert.md === null) {
      var error = new Error('Could not compute certificate digest. ' +
        'Unknown signature OID.');
      error.signatureOid = cert.signatureOid;
      throw error;
    }

    // produce DER formatted TBSCertificate and digest it
    var bytes = asn1.toDer(cert.tbsCertificate);
    cert.md.update(bytes.getBytes());
  }

  // handle issuer, build issuer message digest
  var imd = forge.md.sha1.create();
  cert.issuer.getField = function(sn) {
    return _getAttribute(cert.issuer, sn);
  };
  cert.issuer.addField = function(attr) {
    _fillMissingFields([attr]);
    cert.issuer.attributes.push(attr);
  };
  cert.issuer.attributes = pki.RDNAttributesAsArray(capture.certIssuer, imd);
  if(capture.certIssuerUniqueId) {
    cert.issuer.uniqueId = capture.certIssuerUniqueId;
  }
  cert.issuer.hash = imd.digest().toHex();

  // handle subject, build subject message digest
  var smd = forge.md.sha1.create();
  cert.subject.getField = function(sn) {
    return _getAttribute(cert.subject, sn);
  };
  cert.subject.addField = function(attr) {
    _fillMissingFields([attr]);
    cert.subject.attributes.push(attr);
  };
  cert.subject.attributes = pki.RDNAttributesAsArray(capture.certSubject, smd);
  if(capture.certSubjectUniqueId) {
    cert.subject.uniqueId = capture.certSubjectUniqueId;
  }
  cert.subject.hash = smd.digest().toHex();

  // handle extensions
  if(capture.certExtensions) {
    cert.extensions = pki.certificateExtensionsFromAsn1(capture.certExtensions);
  } else {
    cert.extensions = [];
  }

  // convert RSA public key from ASN.1
  cert.publicKey = pki.publicKeyFromAsn1(capture.subjectPublicKeyInfo);

  return cert;
};

/**
 * Converts an ASN.1 extensions object (with extension sequences as its
 * values) into an array of extension objects with types and values.
 *
 * Supported extensions:
 *
 * id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }
 * KeyUsage ::= BIT STRING {
 *   digitalSignature        (0),
 *   nonRepudiation          (1),
 *   keyEncipherment         (2),
 *   dataEncipherment        (3),
 *   keyAgreement            (4),
 *   keyCertSign             (5),
 *   cRLSign                 (6),
 *   encipherOnly            (7),
 *   decipherOnly            (8)
 * }
 *
 * id-ce-basicConstraints OBJECT IDENTIFIER ::=  { id-ce 19 }
 * BasicConstraints ::= SEQUENCE {
 *   cA                      BOOLEAN DEFAULT FALSE,
 *   pathLenConstraint       INTEGER (0..MAX) OPTIONAL
 * }
 *
 * subjectAltName EXTENSION ::= {
 *   SYNTAX GeneralNames
 *   IDENTIFIED BY id-ce-subjectAltName
 * }
 *
 * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
 *
 * GeneralName ::= CHOICE {
 *   otherName      [0] INSTANCE OF OTHER-NAME,
 *   rfc822Name     [1] IA5String,
 *   dNSName        [2] IA5String,
 *   x400Address    [3] ORAddress,
 *   directoryName  [4] Name,
 *   ediPartyName   [5] EDIPartyName,
 *   uniformResourceIdentifier [6] IA5String,
 *   IPAddress      [7] OCTET STRING,
 *   registeredID   [8] OBJECT IDENTIFIER
 * }
 *
 * OTHER-NAME ::= TYPE-IDENTIFIER
 *
 * EDIPartyName ::= SEQUENCE {
 *   nameAssigner [0] DirectoryString {ub-name} OPTIONAL,
 *   partyName    [1] DirectoryString {ub-name}
 * }
 *
 * @param exts the extensions ASN.1 with extension sequences to parse.
 *
 * @return the array.
 */
pki.certificateExtensionsFromAsn1 = function(exts) {
  var rval = [];
  for(var i = 0; i < exts.value.length; ++i) {
    // get extension sequence
    var extseq = exts.value[i];
    for(var ei = 0; ei < extseq.value.length; ++ei) {
      rval.push(pki.certificateExtensionFromAsn1(extseq.value[ei]));
    }
  }

  return rval;
};

/**
 * Parses a single certificate extension from ASN.1.
 *
 * @param ext the extension in ASN.1 format.
 *
 * @return the parsed extension as an object.
 */
pki.certificateExtensionFromAsn1 = function(ext) {
  // an extension has:
  // [0] extnID      OBJECT IDENTIFIER
  // [1] critical    BOOLEAN DEFAULT FALSE
  // [2] extnValue   OCTET STRING
  var e = {};
  e.id = asn1.derToOid(ext.value[0].value);
  e.critical = false;
  if(ext.value[1].type === asn1.Type.BOOLEAN) {
    e.critical = (ext.value[1].value.charCodeAt(0) !== 0x00);
    e.value = ext.value[2].value;
  } else {
    e.value = ext.value[1].value;
  }
  // if the oid is known, get its name
  if(e.id in oids) {
    e.name = oids[e.id];

    // handle key usage
    if(e.name === 'keyUsage') {
      // get value as BIT STRING
      var ev = asn1.fromDer(e.value);
      var b2 = 0x00;
      var b3 = 0x00;
      if(ev.value.length > 1) {
        // skip first byte, just indicates unused bits which
        // will be padded with 0s anyway
        // get bytes with flag bits
        b2 = ev.value.charCodeAt(1);
        b3 = ev.value.length > 2 ? ev.value.charCodeAt(2) : 0;
      }
      // set flags
      e.digitalSignature = (b2 & 0x80) === 0x80;
      e.nonRepudiation = (b2 & 0x40) === 0x40;
      e.keyEncipherment = (b2 & 0x20) === 0x20;
      e.dataEncipherment = (b2 & 0x10) === 0x10;
      e.keyAgreement = (b2 & 0x08) === 0x08;
      e.keyCertSign = (b2 & 0x04) === 0x04;
      e.cRLSign = (b2 & 0x02) === 0x02;
      e.encipherOnly = (b2 & 0x01) === 0x01;
      e.decipherOnly = (b3 & 0x80) === 0x80;
    } else if(e.name === 'basicConstraints') {
      // handle basic constraints
      // get value as SEQUENCE
      var ev = asn1.fromDer(e.value);
      // get cA BOOLEAN flag (defaults to false)
      if(ev.value.length > 0 && ev.value[0].type === asn1.Type.BOOLEAN) {
        e.cA = (ev.value[0].value.charCodeAt(0) !== 0x00);
      } else {
        e.cA = false;
      }
      // get path length constraint
      var value = null;
      if(ev.value.length > 0 && ev.value[0].type === asn1.Type.INTEGER) {
        value = ev.value[0].value;
      } else if(ev.value.length > 1) {
        value = ev.value[1].value;
      }
      if(value !== null) {
        e.pathLenConstraint = asn1.derToInteger(value);
      }
    } else if(e.name === 'extKeyUsage') {
      // handle extKeyUsage
      // value is a SEQUENCE of OIDs
      var ev = asn1.fromDer(e.value);
      for(var vi = 0; vi < ev.value.length; ++vi) {
        var oid = asn1.derToOid(ev.value[vi].value);
        if(oid in oids) {
          e[oids[oid]] = true;
        } else {
          e[oid] = true;
        }
      }
    } else if(e.name === 'nsCertType') {
      // handle nsCertType
      // get value as BIT STRING
      var ev = asn1.fromDer(e.value);
      var b2 = 0x00;
      if(ev.value.length > 1) {
        // skip first byte, just indicates unused bits which
        // will be padded with 0s anyway
        // get bytes with flag bits
        b2 = ev.value.charCodeAt(1);
      }
      // set flags
      e.client = (b2 & 0x80) === 0x80;
      e.server = (b2 & 0x40) === 0x40;
      e.email = (b2 & 0x20) === 0x20;
      e.objsign = (b2 & 0x10) === 0x10;
      e.reserved = (b2 & 0x08) === 0x08;
      e.sslCA = (b2 & 0x04) === 0x04;
      e.emailCA = (b2 & 0x02) === 0x02;
      e.objCA = (b2 & 0x01) === 0x01;
    } else if(
      e.name === 'subjectAltName' ||
      e.name === 'issuerAltName') {
      // handle subjectAltName/issuerAltName
      e.altNames = [];

      // ev is a SYNTAX SEQUENCE
      var gn;
      var ev = asn1.fromDer(e.value);
      for(var n = 0; n < ev.value.length; ++n) {
        // get GeneralName
        gn = ev.value[n];

        var altName = {
          type: gn.type,
          value: gn.value
        };
        e.altNames.push(altName);

        // Note: Support for types 1,2,6,7,8
        switch(gn.type) {
          // rfc822Name
          case 1:
          // dNSName
          case 2:
          // uniformResourceIdentifier (URI)
          case 6:
            break;
          // IPAddress
          case 7:
            // convert to IPv4/IPv6 string representation
            altName.ip = forge.util.bytesToIP(gn.value);
            break;
          // registeredID
          case 8:
            altName.oid = asn1.derToOid(gn.value);
            break;
          default:
            // unsupported
        }
      }
    } else if(e.name === 'subjectKeyIdentifier') {
      // value is an OCTETSTRING w/the hash of the key-type specific
      // public key structure (eg: RSAPublicKey)
      var ev = asn1.fromDer(e.value);
      e.subjectKeyIdentifier = forge.util.bytesToHex(ev.value);
    }
  }
  return e;
};

/**
 * Converts a PKCS#10 certification request (CSR) from an ASN.1 object.
 *
 * Note: If the certification request is to be verified then compute hash
 * should be set to true. There is currently no implementation for converting
 * a certificate back to ASN.1 so the CertificationRequestInfo part of the
 * ASN.1 object needs to be scanned before the csr object is created.
 *
 * @param obj the asn1 representation of a PKCS#10 certification request (CSR).
 * @param computeHash true to compute the hash for verification.
 *
 * @return the certification request (CSR).
 */
pki.certificationRequestFromAsn1 = function(obj, computeHash) {
  // validate certification request and capture data
  var capture = {};
  var errors = [];
  if(!asn1.validate(obj, certificationRequestValidator, capture, errors)) {
    var error = new Error('Cannot read PKCS#10 certificate request. ' +
      'ASN.1 object is not a PKCS#10 CertificationRequest.');
    error.errors = errors;
    throw error;
  }

  // get oid
  var oid = asn1.derToOid(capture.publicKeyOid);
  if(oid !== pki.oids.rsaEncryption) {
    throw new Error('Cannot read public key. OID is not RSA.');
  }

  // create certification request
  var csr = pki.createCertificationRequest();
  csr.version = capture.csrVersion ? capture.csrVersion.charCodeAt(0) : 0;
  csr.signatureOid = forge.asn1.derToOid(capture.csrSignatureOid);
  csr.signatureParameters = _readSignatureParameters(
    csr.signatureOid, capture.csrSignatureParams, true);
  csr.siginfo.algorithmOid = forge.asn1.derToOid(capture.csrSignatureOid);
  csr.siginfo.parameters = _readSignatureParameters(
    csr.siginfo.algorithmOid, capture.csrSignatureParams, false);
  csr.signature = capture.csrSignature;

  // keep CertificationRequestInfo to preserve signature when exporting
  csr.certificationRequestInfo = capture.certificationRequestInfo;

  if(computeHash) {
    // check signature OID for supported signature types
    csr.md = null;
    if(csr.signatureOid in oids) {
      var oid = oids[csr.signatureOid];
      switch(oid) {
        case 'sha1WithRSAEncryption':
          csr.md = forge.md.sha1.create();
          break;
        case 'md5WithRSAEncryption':
          csr.md = forge.md.md5.create();
          break;
        case 'sha256WithRSAEncryption':
          csr.md = forge.md.sha256.create();
          break;
        case 'sha384WithRSAEncryption':
          csr.md = forge.md.sha384.create();
          break;
        case 'sha512WithRSAEncryption':
          csr.md = forge.md.sha512.create();
          break;
        case 'RSASSA-PSS':
          csr.md = forge.md.sha256.create();
          break;
      }
    }
    if(csr.md === null) {
      var error = new Error('Could not compute certification request digest. ' +
        'Unknown signature OID.');
      error.signatureOid = csr.signatureOid;
      throw error;
    }

    // produce DER formatted CertificationRequestInfo and digest it
    var bytes = asn1.toDer(csr.certificationRequestInfo);
    csr.md.update(bytes.getBytes());
  }

  // handle subject, build subject message digest
  var smd = forge.md.sha1.create();
  csr.subject.getField = function(sn) {
    return _getAttribute(csr.subject, sn);
  };
  csr.subject.addField = function(attr) {
    _fillMissingFields([attr]);
    csr.subject.attributes.push(attr);
  };
  csr.subject.attributes = pki.RDNAttributesAsArray(
    capture.certificationRequestInfoSubject, smd);
  csr.subject.hash = smd.digest().toHex();

  // convert RSA public key from ASN.1
  csr.publicKey = pki.publicKeyFromAsn1(capture.subjectPublicKeyInfo);

  // convert attributes from ASN.1
  csr.getAttribute = function(sn) {
    return _getAttribute(csr, sn);
  };
  csr.addAttribute = function(attr) {
    _fillMissingFields([attr]);
    csr.attributes.push(attr);
  };
  csr.attributes = pki.CRIAttributesAsArray(
    capture.certificationRequestInfoAttributes || []);

  return csr;
};

/**
 * Creates an empty certification request (a CSR or certificate signing
 * request). Once created, its public key and attributes can be set and then
 * it can be signed.
 *
 * @return the empty certification request.
 */
pki.createCertificationRequest = function() {
  var csr = {};
  csr.version = 0x00;
  csr.signatureOid = null;
  csr.signature = null;
  csr.siginfo = {};
  csr.siginfo.algorithmOid = null;

  csr.subject = {};
  csr.subject.getField = function(sn) {
    return _getAttribute(csr.subject, sn);
  };
  csr.subject.addField = function(attr) {
    _fillMissingFields([attr]);
    csr.subject.attributes.push(attr);
  };
  csr.subject.attributes = [];
  csr.subject.hash = null;

  csr.publicKey = null;
  csr.attributes = [];
  csr.getAttribute = function(sn) {
    return _getAttribute(csr, sn);
  };
  csr.addAttribute = function(attr) {
    _fillMissingFields([attr]);
    csr.attributes.push(attr);
  };
  csr.md = null;

  /**
   * Sets the subject of this certification request.
   *
   * @param attrs the array of subject attributes to use.
   */
  csr.setSubject = function(attrs) {
    // set new attributes
    _fillMissingFields(attrs);
    csr.subject.attributes = attrs;
    csr.subject.hash = null;
  };

  /**
   * Sets the attributes of this certification request.
   *
   * @param attrs the array of attributes to use.
   */
  csr.setAttributes = function(attrs) {
    // set new attributes
    _fillMissingFields(attrs);
    csr.attributes = attrs;
  };

  /**
   * Signs this certification request using the given private key.
   *
   * @param key the private key to sign with.
   * @param md the message digest object to use (defaults to forge.md.sha1).
   */
  csr.sign = function(key, md) {
    // TODO: get signature OID from private key
    csr.md = md || forge.md.sha1.create();
    var algorithmOid = oids[csr.md.algorithm + 'WithRSAEncryption'];
    if(!algorithmOid) {
      var error = new Error('Could not compute certification request digest. ' +
        'Unknown message digest algorithm OID.');
      error.algorithm = csr.md.algorithm;
      throw error;
    }
    csr.signatureOid = csr.siginfo.algorithmOid = algorithmOid;

    // get CertificationRequestInfo, convert to DER
    csr.certificationRequestInfo = pki.getCertificationRequestInfo(csr);
    var bytes = asn1.toDer(csr.certificationRequestInfo);

    // digest and sign
    csr.md.update(bytes.getBytes());
    csr.signature = key.sign(csr.md);
  };

  /**
   * Attempts verify the signature on the passed certification request using
   * its public key.
   *
   * A CSR that has been exported to a file in PEM format can be verified using
   * OpenSSL using this command:
   *
   * openssl req -in <the-csr-pem-file> -verify -noout -text
   *
   * @return true if verified, false if not.
   */
  csr.verify = function() {
    var rval = false;

    var md = csr.md;
    if(md === null) {
      // check signature OID for supported signature types
      if(csr.signatureOid in oids) {
        // TODO: create DRY `OID to md` function
        var oid = oids[csr.signatureOid];
        switch(oid) {
          case 'sha1WithRSAEncryption':
            md = forge.md.sha1.create();
            break;
          case 'md5WithRSAEncryption':
            md = forge.md.md5.create();
            break;
          case 'sha256WithRSAEncryption':
            md = forge.md.sha256.create();
            break;
          case 'sha384WithRSAEncryption':
            md = forge.md.sha384.create();
            break;
          case 'sha512WithRSAEncryption':
            md = forge.md.sha512.create();
            break;
          case 'RSASSA-PSS':
            md = forge.md.sha256.create();
            break;
        }
      }
      if(md === null) {
        var error = new Error(
          'Could not compute certification request digest. ' +
          'Unknown signature OID.');
        error.signatureOid = csr.signatureOid;
        throw error;
      }

      // produce DER formatted CertificationRequestInfo and digest it
      var cri = csr.certificationRequestInfo ||
        pki.getCertificationRequestInfo(csr);
      var bytes = asn1.toDer(cri);
      md.update(bytes.getBytes());
    }

    if(md !== null) {
      var scheme;

      switch(csr.signatureOid) {
        case oids.sha1WithRSAEncryption:
          /* use PKCS#1 v1.5 padding scheme */
          break;
        case oids['RSASSA-PSS']:
          var hash, mgf;

          /* initialize mgf */
          hash = oids[csr.signatureParameters.mgf.hash.algorithmOid];
          if(hash === undefined || forge.md[hash] === undefined) {
            var error = new Error('Unsupported MGF hash function.');
            error.oid = csr.signatureParameters.mgf.hash.algorithmOid;
            error.name = hash;
            throw error;
          }

          mgf = oids[csr.signatureParameters.mgf.algorithmOid];
          if(mgf === undefined || forge.mgf[mgf] === undefined) {
            var error = new Error('Unsupported MGF function.');
            error.oid = csr.signatureParameters.mgf.algorithmOid;
            error.name = mgf;
            throw error;
          }

          mgf = forge.mgf[mgf].create(forge.md[hash].create());

          /* initialize hash function */
          hash = oids[csr.signatureParameters.hash.algorithmOid];
          if(hash === undefined || forge.md[hash] === undefined) {
            var error = new Error('Unsupported RSASSA-PSS hash function.');
            error.oid = csr.signatureParameters.hash.algorithmOid;
            error.name = hash;
            throw error;
          }

          scheme = forge.pss.create(forge.md[hash].create(), mgf,
            csr.signatureParameters.saltLength);
          break;
      }

      // verify signature on csr using its public key
      rval = csr.publicKey.verify(
        md.digest().getBytes(), csr.signature, scheme);
    }

    return rval;
  };

  return csr;
};

/**
 * Converts an X.509 subject or issuer to an ASN.1 RDNSequence.
 *
 * @param obj the subject or issuer (distinguished name).
 *
 * @return the ASN.1 RDNSequence.
 */
function _dnToAsn1(obj) {
  // create an empty RDNSequence
  var rval = asn1.create(
    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);

  // iterate over attributes
  var attr, set;
  var attrs = obj.attributes;
  for(var i = 0; i < attrs.length; ++i) {
    attr = attrs[i];
    var value = attr.value;

    // reuse tag class for attribute value if available
    var valueTagClass = asn1.Type.PRINTABLESTRING;
    if('valueTagClass' in attr) {
      valueTagClass = attr.valueTagClass;

      if(valueTagClass === asn1.Type.UTF8) {
        value = forge.util.encodeUtf8(value);
      }
      // FIXME: handle more encodings
    }

    // create a RelativeDistinguishedName set
    // each value in the set is an AttributeTypeAndValue first
    // containing the type (an OID) and second the value
    set = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
        // AttributeType
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
          asn1.oidToDer(attr.type).getBytes()),
        // AttributeValue
        asn1.create(asn1.Class.UNIVERSAL, valueTagClass, false, value)
      ])
    ]);
    rval.value.push(set);
  }

  return rval;
}

/**
 * Gets all printable attributes (typically of an issuer or subject) in a
 * simplified JSON format for display.
 *
 * @param attrs the attributes.
 *
 * @return the JSON for display.
 */
function _getAttributesAsJson(attrs) {
  var rval = {};
  for(var i = 0; i < attrs.length; ++i) {
    var attr = attrs[i];
    if(attr.shortName && (
      attr.valueTagClass === asn1.Type.UTF8 ||
      attr.valueTagClass === asn1.Type.PRINTABLESTRING ||
      attr.valueTagClass === asn1.Type.IA5STRING)) {
      var value = attr.value;
      if(attr.valueTagClass === asn1.Type.UTF8) {
        value = forge.util.encodeUtf8(attr.value);
      }
      if(!(attr.shortName in rval)) {
        rval[attr.shortName] = value;
      } else if(forge.util.isArray(rval[attr.shortName])) {
        rval[attr.shortName].push(value);
      } else {
        rval[attr.shortName] = [rval[attr.shortName], value];
      }
    }
  }
  return rval;
}

/**
 * Fills in missing fields in attributes.
 *
 * @param attrs the attributes to fill missing fields in.
 */
function _fillMissingFields(attrs) {
  var attr;
  for(var i = 0; i < attrs.length; ++i) {
    attr = attrs[i];

    // populate missing name
    if(typeof attr.name === 'undefined') {
      if(attr.type && attr.type in pki.oids) {
        attr.name = pki.oids[attr.type];
      } else if(attr.shortName && attr.shortName in _shortNames) {
        attr.name = pki.oids[_shortNames[attr.shortName]];
      }
    }

    // populate missing type (OID)
    if(typeof attr.type === 'undefined') {
      if(attr.name && attr.name in pki.oids) {
        attr.type = pki.oids[attr.name];
      } else {
        var error = new Error('Attribute type not specified.');
        error.attribute = attr;
        throw error;
      }
    }

    // populate missing shortname
    if(typeof attr.shortName === 'undefined') {
      if(attr.name && attr.name in _shortNames) {
        attr.shortName = _shortNames[attr.name];
      }
    }

    // convert extensions to value
    if(attr.type === oids.extensionRequest) {
      attr.valueConstructed = true;
      attr.valueTagClass = asn1.Type.SEQUENCE;
      if(!attr.value && attr.extensions) {
        attr.value = [];
        for(var ei = 0; ei < attr.extensions.length; ++ei) {
          attr.value.push(pki.certificateExtensionToAsn1(
            _fillMissingExtensionFields(attr.extensions[ei])));
        }
      }
    }

    if(typeof attr.value === 'undefined') {
      var error = new Error('Attribute value not specified.');
      error.attribute = attr;
      throw error;
    }
  }
}

/**
 * Fills in missing fields in certificate extensions.
 *
 * @param e the extension.
 * @param [options] the options to use.
 *          [cert] the certificate the extensions are for.
 *
 * @return the extension.
 */
function _fillMissingExtensionFields(e, options) {
  options = options || {};

  // populate missing name
  if(typeof e.name === 'undefined') {
    if(e.id && e.id in pki.oids) {
      e.name = pki.oids[e.id];
    }
  }

  // populate missing id
  if(typeof e.id === 'undefined') {
    if(e.name && e.name in pki.oids) {
      e.id = pki.oids[e.name];
    } else {
      var error = new Error('Extension ID not specified.');
      error.extension = e;
      throw error;
    }
  }

  if(typeof e.value !== 'undefined') {
    return e;
  }

  // handle missing value:

  // value is a BIT STRING
  if(e.name === 'keyUsage') {
    // build flags
    var unused = 0;
    var b2 = 0x00;
    var b3 = 0x00;
    if(e.digitalSignature) {
      b2 |= 0x80;
      unused = 7;
    }
    if(e.nonRepudiation) {
      b2 |= 0x40;
      unused = 6;
    }
    if(e.keyEncipherment) {
      b2 |= 0x20;
      unused = 5;
    }
    if(e.dataEncipherment) {
      b2 |= 0x10;
      unused = 4;
    }
    if(e.keyAgreement) {
      b2 |= 0x08;
      unused = 3;
    }
    if(e.keyCertSign) {
      b2 |= 0x04;
      unused = 2;
    }
    if(e.cRLSign) {
      b2 |= 0x02;
      unused = 1;
    }
    if(e.encipherOnly) {
      b2 |= 0x01;
      unused = 0;
    }
    if(e.decipherOnly) {
      b3 |= 0x80;
      unused = 7;
    }

    // create bit string
    var value = String.fromCharCode(unused);
    if(b3 !== 0) {
      value += String.fromCharCode(b2) + String.fromCharCode(b3);
    } else if(b2 !== 0) {
      value += String.fromCharCode(b2);
    }
    e.value = asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, value);
  } else if(e.name === 'basicConstraints') {
    // basicConstraints is a SEQUENCE
    e.value = asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);
    // cA BOOLEAN flag defaults to false
    if(e.cA) {
      e.value.value.push(asn1.create(
        asn1.Class.UNIVERSAL, asn1.Type.BOOLEAN, false,
        String.fromCharCode(0xFF)));
    }
    if('pathLenConstraint' in e) {
      e.value.value.push(asn1.create(
        asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
        asn1.integerToDer(e.pathLenConstraint).getBytes()));
    }
  } else if(e.name === 'extKeyUsage') {
    // extKeyUsage is a SEQUENCE of OIDs
    e.value = asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);
    var seq = e.value.value;
    for(var key in e) {
      if(e[key] !== true) {
        continue;
      }
      // key is name in OID map
      if(key in oids) {
        seq.push(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID,
          false, asn1.oidToDer(oids[key]).getBytes()));
      } else if(key.indexOf('.') !== -1) {
        // assume key is an OID
        seq.push(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID,
          false, asn1.oidToDer(key).getBytes()));
      }
    }
  } else if(e.name === 'nsCertType') {
    // nsCertType is a BIT STRING
    // build flags
    var unused = 0;
    var b2 = 0x00;

    if(e.client) {
      b2 |= 0x80;
      unused = 7;
    }
    if(e.server) {
      b2 |= 0x40;
      unused = 6;
    }
    if(e.email) {
      b2 |= 0x20;
      unused = 5;
    }
    if(e.objsign) {
      b2 |= 0x10;
      unused = 4;
    }
    if(e.reserved) {
      b2 |= 0x08;
      unused = 3;
    }
    if(e.sslCA) {
      b2 |= 0x04;
      unused = 2;
    }
    if(e.emailCA) {
      b2 |= 0x02;
      unused = 1;
    }
    if(e.objCA) {
      b2 |= 0x01;
      unused = 0;
    }

    // create bit string
    var value = String.fromCharCode(unused);
    if(b2 !== 0) {
      value += String.fromCharCode(b2);
    }
    e.value = asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, value);
  } else if(e.name === 'subjectAltName' || e.name === 'issuerAltName') {
    // SYNTAX SEQUENCE
    e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);

    var altName;
    for(var n = 0; n < e.altNames.length; ++n) {
      altName = e.altNames[n];
      var value = altName.value;
      // handle IP
      if(altName.type === 7 && altName.ip) {
        value = forge.util.bytesFromIP(altName.ip);
        if(value === null) {
          var error = new Error(
            'Extension "ip" value is not a valid IPv4 or IPv6 address.');
          error.extension = e;
          throw error;
        }
      } else if(altName.type === 8) {
        // handle OID
        if(altName.oid) {
          value = asn1.oidToDer(asn1.oidToDer(altName.oid));
        } else {
          // deprecated ... convert value to OID
          value = asn1.oidToDer(value);
        }
      }
      e.value.value.push(asn1.create(
        asn1.Class.CONTEXT_SPECIFIC, altName.type, false,
        value));
    }
  } else if(e.name === 'nsComment' && options.cert) {
    // sanity check value is ASCII (req'd) and not too big
    if(!(/^[\x00-\x7F]*$/.test(e.comment)) ||
      (e.comment.length < 1) || (e.comment.length > 128)) {
      throw new Error('Invalid "nsComment" content.');
    }
    // IA5STRING opaque comment
    e.value = asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.IA5STRING, false, e.comment);
  } else if(e.name === 'subjectKeyIdentifier' && options.cert) {
    var ski = options.cert.generateSubjectKeyIdentifier();
    e.subjectKeyIdentifier = ski.toHex();
    // OCTETSTRING w/digest
    e.value = asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, ski.getBytes());
  } else if(e.name === 'authorityKeyIdentifier' && options.cert) {
    // SYNTAX SEQUENCE
    e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);
    var seq = e.value.value;

    if(e.keyIdentifier) {
      var keyIdentifier = (e.keyIdentifier === true ?
        options.cert.generateSubjectKeyIdentifier().getBytes() :
        e.keyIdentifier);
      seq.push(
        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, false, keyIdentifier));
    }

    if(e.authorityCertIssuer) {
      var authorityCertIssuer = [
        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 4, true, [
          _dnToAsn1(e.authorityCertIssuer === true ?
            options.cert.issuer : e.authorityCertIssuer)
        ])
      ];
      seq.push(
        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, authorityCertIssuer));
    }

    if(e.serialNumber) {
      var serialNumber = forge.util.hexToBytes(e.serialNumber === true ?
        options.cert.serialNumber : e.serialNumber);
      seq.push(
        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, false, serialNumber));
    }
  } else if(e.name === 'cRLDistributionPoints') {
    e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);
    var seq = e.value.value;

    // Create sub SEQUENCE of DistributionPointName
    var subSeq = asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);

    // Create fullName CHOICE
    var fullNameGeneralNames = asn1.create(
      asn1.Class.CONTEXT_SPECIFIC, 0, true, []);
    var altName;
    for(var n = 0; n < e.altNames.length; ++n) {
      altName = e.altNames[n];
      var value = altName.value;
      // handle IP
      if(altName.type === 7 && altName.ip) {
        value = forge.util.bytesFromIP(altName.ip);
        if(value === null) {
          var error = new Error(
            'Extension "ip" value is not a valid IPv4 or IPv6 address.');
          error.extension = e;
          throw error;
        }
      } else if(altName.type === 8) {
        // handle OID
        if(altName.oid) {
          value = asn1.oidToDer(asn1.oidToDer(altName.oid));
        } else {
          // deprecated ... convert value to OID
          value = asn1.oidToDer(value);
        }
      }
      fullNameGeneralNames.value.push(asn1.create(
        asn1.Class.CONTEXT_SPECIFIC, altName.type, false,
        value));
    }

    // Add to the parent SEQUENCE
    subSeq.value.push(asn1.create(
      asn1.Class.CONTEXT_SPECIFIC, 0, true, [fullNameGeneralNames]));
    seq.push(subSeq);
  }

  // ensure value has been defined by now
  if(typeof e.value === 'undefined') {
    var error = new Error('Extension value not specified.');
    error.extension = e;
    throw error;
  }

  return e;
}

/**
 * Convert signature parameters object to ASN.1
 *
 * @param {String} oid Signature algorithm OID
 * @param params The signature parametrs object
 * @return ASN.1 object representing signature parameters
 */
function _signatureParametersToAsn1(oid, params) {
  switch(oid) {
    case oids['RSASSA-PSS']:
      var parts = [];

      if(params.hash.algorithmOid !== undefined) {
        parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
              asn1.oidToDer(params.hash.algorithmOid).getBytes()),
            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')
          ])
        ]));
      }

      if(params.mgf.algorithmOid !== undefined) {
        parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, [
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
              asn1.oidToDer(params.mgf.algorithmOid).getBytes()),
            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
              asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
                asn1.oidToDer(params.mgf.hash.algorithmOid).getBytes()),
              asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')
            ])
          ])
        ]));
      }

      if(params.saltLength !== undefined) {
        parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, true, [
          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
            asn1.integerToDer(params.saltLength).getBytes())
        ]));
      }

      return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, parts);

    default:
      return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '');
  }
}

/**
 * Converts a certification request's attributes to an ASN.1 set of
 * CRIAttributes.
 *
 * @param csr certification request.
 *
 * @return the ASN.1 set of CRIAttributes.
 */
function _CRIAttributesToAsn1(csr) {
  // create an empty context-specific container
  var rval = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, []);

  // no attributes, return empty container
  if(csr.attributes.length === 0) {
    return rval;
  }

  // each attribute has a sequence with a type and a set of values
  var attrs = csr.attributes;
  for(var i = 0; i < attrs.length; ++i) {
    var attr = attrs[i];
    var value = attr.value;

    // reuse tag class for attribute value if available
    var valueTagClass = asn1.Type.UTF8;
    if('valueTagClass' in attr) {
      valueTagClass = attr.valueTagClass;
    }
    if(valueTagClass === asn1.Type.UTF8) {
      value = forge.util.encodeUtf8(value);
    }
    var valueConstructed = false;
    if('valueConstructed' in attr) {
      valueConstructed = attr.valueConstructed;
    }
    // FIXME: handle more encodings

    // create a RelativeDistinguishedName set
    // each value in the set is an AttributeTypeAndValue first
    // containing the type (an OID) and second the value
    var seq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // AttributeType
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        asn1.oidToDer(attr.type).getBytes()),
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [
        // AttributeValue
        asn1.create(
          asn1.Class.UNIVERSAL, valueTagClass, valueConstructed, value)
      ])
    ]);
    rval.value.push(seq);
  }

  return rval;
}

var jan_1_1950 = new Date('1950-01-01T00:00:00Z');
var jan_1_2050 = new Date('2050-01-01T00:00:00Z');

/**
 * Converts a Date object to ASN.1
 * Handles the different format before and after 1st January 2050
 *
 * @param date date object.
 *
 * @return the ASN.1 object representing the date.
 */
function _dateToAsn1(date) {
  if(date >= jan_1_1950 && date < jan_1_2050) {
    return asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.UTCTIME, false,
      asn1.dateToUtcTime(date));
  } else {
    return asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.GENERALIZEDTIME, false,
      asn1.dateToGeneralizedTime(date));
  }
}

/**
 * Gets the ASN.1 TBSCertificate part of an X.509v3 certificate.
 *
 * @param cert the certificate.
 *
 * @return the asn1 TBSCertificate.
 */
pki.getTBSCertificate = function(cert) {
  // TBSCertificate
  var notBefore = _dateToAsn1(cert.validity.notBefore);
  var notAfter = _dateToAsn1(cert.validity.notAfter);
  var tbs = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // version
    asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [
      // integer
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
        asn1.integerToDer(cert.version).getBytes())
    ]),
    // serialNumber
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      forge.util.hexToBytes(cert.serialNumber)),
    // signature
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // algorithm
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        asn1.oidToDer(cert.siginfo.algorithmOid).getBytes()),
      // parameters
      _signatureParametersToAsn1(
        cert.siginfo.algorithmOid, cert.siginfo.parameters)
    ]),
    // issuer
    _dnToAsn1(cert.issuer),
    // validity
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      notBefore,
      notAfter
    ]),
    // subject
    _dnToAsn1(cert.subject),
    // SubjectPublicKeyInfo
    pki.publicKeyToAsn1(cert.publicKey)
  ]);

  if(cert.issuer.uniqueId) {
    // issuerUniqueID (optional)
    tbs.value.push(
      asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, [
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,
          // TODO: support arbitrary bit length ids
          String.fromCharCode(0x00) +
          cert.issuer.uniqueId
        )
      ])
    );
  }
  if(cert.subject.uniqueId) {
    // subjectUniqueID (optional)
    tbs.value.push(
      asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, true, [
        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,
          // TODO: support arbitrary bit length ids
          String.fromCharCode(0x00) +
          cert.subject.uniqueId
        )
      ])
    );
  }

  if(cert.extensions.length > 0) {
    // extensions (optional)
    tbs.value.push(pki.certificateExtensionsToAsn1(cert.extensions));
  }

  return tbs;
};

/**
 * Gets the ASN.1 CertificationRequestInfo part of a
 * PKCS#10 CertificationRequest.
 *
 * @param csr the certification request.
 *
 * @return the asn1 CertificationRequestInfo.
 */
pki.getCertificationRequestInfo = function(csr) {
  // CertificationRequestInfo
  var cri = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // version
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,
      asn1.integerToDer(csr.version).getBytes()),
    // subject
    _dnToAsn1(csr.subject),
    // SubjectPublicKeyInfo
    pki.publicKeyToAsn1(csr.publicKey),
    // attributes
    _CRIAttributesToAsn1(csr)
  ]);

  return cri;
};

/**
 * Converts a DistinguishedName (subject or issuer) to an ASN.1 object.
 *
 * @param dn the DistinguishedName.
 *
 * @return the asn1 representation of a DistinguishedName.
 */
pki.distinguishedNameToAsn1 = function(dn) {
  return _dnToAsn1(dn);
};

/**
 * Converts an X.509v3 RSA certificate to an ASN.1 object.
 *
 * @param cert the certificate.
 *
 * @return the asn1 representation of an X.509v3 RSA certificate.
 */
pki.certificateToAsn1 = function(cert) {
  // prefer cached TBSCertificate over generating one
  var tbsCertificate = cert.tbsCertificate || pki.getTBSCertificate(cert);

  // Certificate
  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // TBSCertificate
    tbsCertificate,
    // AlgorithmIdentifier (signature algorithm)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // algorithm
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        asn1.oidToDer(cert.signatureOid).getBytes()),
      // parameters
      _signatureParametersToAsn1(cert.signatureOid, cert.signatureParameters)
    ]),
    // SignatureValue
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,
      String.fromCharCode(0x00) + cert.signature)
  ]);
};

/**
 * Converts X.509v3 certificate extensions to ASN.1.
 *
 * @param exts the extensions to convert.
 *
 * @return the extensions in ASN.1 format.
 */
pki.certificateExtensionsToAsn1 = function(exts) {
  // create top-level extension container
  var rval = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 3, true, []);

  // create extension sequence (stores a sequence for each extension)
  var seq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);
  rval.value.push(seq);

  for(var i = 0; i < exts.length; ++i) {
    seq.value.push(pki.certificateExtensionToAsn1(exts[i]));
  }

  return rval;
};

/**
 * Converts a single certificate extension to ASN.1.
 *
 * @param ext the extension to convert.
 *
 * @return the extension in ASN.1 format.
 */
pki.certificateExtensionToAsn1 = function(ext) {
  // create a sequence for each extension
  var extseq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);

  // extnID (OID)
  extseq.value.push(asn1.create(
    asn1.Class.UNIVERSAL, asn1.Type.OID, false,
    asn1.oidToDer(ext.id).getBytes()));

  // critical defaults to false
  if(ext.critical) {
    // critical BOOLEAN DEFAULT FALSE
    extseq.value.push(asn1.create(
      asn1.Class.UNIVERSAL, asn1.Type.BOOLEAN, false,
      String.fromCharCode(0xFF)));
  }

  var value = ext.value;
  if(typeof ext.value !== 'string') {
    // value is asn.1
    value = asn1.toDer(value).getBytes();
  }

  // extnValue (OCTET STRING)
  extseq.value.push(asn1.create(
    asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, value));

  return extseq;
};

/**
 * Converts a PKCS#10 certification request to an ASN.1 object.
 *
 * @param csr the certification request.
 *
 * @return the asn1 representation of a certification request.
 */
pki.certificationRequestToAsn1 = function(csr) {
  // prefer cached CertificationRequestInfo over generating one
  var cri = csr.certificationRequestInfo ||
    pki.getCertificationRequestInfo(csr);

  // Certificate
  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
    // CertificationRequestInfo
    cri,
    // AlgorithmIdentifier (signature algorithm)
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [
      // algorithm
      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,
        asn1.oidToDer(csr.signatureOid).getBytes()),
      // parameters
      _signatureParametersToAsn1(csr.signatureOid, csr.signatureParameters)
    ]),
    // signature
    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,
      String.fromCharCode(0x00) + csr.signature)
  ]);
};

/**
 * Creates a CA store.
 *
 * @param certs an optional array of certificate objects or PEM-formatted
 *          certificate strings to add to the CA store.
 *
 * @return the CA store.
 */
pki.createCaStore = function(certs) {
  // create CA store
  var caStore = {
    // stored certificates
    certs: {}
  };

  /**
   * Gets the certificate that issued the passed certificate or its
   * 'parent'.
   *
   * @param cert the certificate to get the parent for.
   *
   * @return the parent certificate or null if none was found.
   */
  caStore.getIssuer = function(cert) {
    var rval = getBySubject(cert.issuer);

    // see if there are multiple matches
    /*if(forge.util.isArray(rval)) {
      // TODO: resolve multiple matches by checking
      // authorityKey/subjectKey/issuerUniqueID/other identifiers, etc.
      // FIXME: or alternatively do authority key mapping
      // if possible (X.509v1 certs can't work?)
      throw new Error('Resolving multiple issuer matches not implemented yet.');
    }*/

    return rval;
  };

  /**
   * Adds a trusted certificate to the store.
   *
   * @param cert the certificate to add as a trusted certificate (either a
   *          pki.certificate object or a PEM-formatted certificate).
   */
  caStore.addCertificate = function(cert) {
    // convert from pem if necessary
    if(typeof cert === 'string') {
      cert = forge.pki.certificateFromPem(cert);
    }

    ensureSubjectHasHash(cert.subject);

    if(!caStore.hasCertificate(cert)) { // avoid duplicate certificates in store
      if(cert.subject.hash in caStore.certs) {
        // subject hash already exists, append to array
        var tmp = caStore.certs[cert.subject.hash];
        if(!forge.util.isArray(tmp)) {
          tmp = [tmp];
        }
        tmp.push(cert);
        caStore.certs[cert.subject.hash] = tmp;
      } else {
        caStore.certs[cert.subject.hash] = cert;
      }
    }
  };

  /**
   * Checks to see if the given certificate is in the store.
   *
   * @param cert the certificate to check (either a pki.certificate or a
   *          PEM-formatted certificate).
   *
   * @return true if the certificate is in the store, false if not.
   */
  caStore.hasCertificate = function(cert) {
    // convert from pem if necessary
    if(typeof cert === 'string') {
      cert = forge.pki.certificateFromPem(cert);
    }

    var match = getBySubject(cert.subject);
    if(!match) {
      return false;
    }
    if(!forge.util.isArray(match)) {
      match = [match];
    }
    // compare DER-encoding of certificates
    var der1 = asn1.toDer(pki.certificateToAsn1(cert)).getBytes();
    for(var i = 0; i < match.length; ++i) {
      var der2 = asn1.toDer(pki.certificateToAsn1(match[i])).getBytes();
      if(der1 === der2) {
        return true;
      }
    }
    return false;
  };

  /**
   * Lists all of the certificates kept in the store.
   *
   * @return an array of all of the pki.certificate objects in the store.
   */
  caStore.listAllCertificates = function() {
    var certList = [];

    for(var hash in caStore.certs) {
      if(caStore.certs.hasOwnProperty(hash)) {
        var value = caStore.certs[hash];
        if(!forge.util.isArray(value)) {
          certList.push(value);
        } else {
          for(var i = 0; i < value.length; ++i) {
            certList.push(value[i]);
          }
        }
      }
    }

    return certList;
  };

  /**
   * Removes a certificate from the store.
   *
   * @param cert the certificate to remove (either a pki.certificate or a
   *          PEM-formatted certificate).
   *
   * @return the certificate that was removed or null if the certificate
   *           wasn't in store.
   */
  caStore.removeCertificate = function(cert) {
    var result;

    // convert from pem if necessary
    if(typeof cert === 'string') {
      cert = forge.pki.certificateFromPem(cert);
    }
    ensureSubjectHasHash(cert.subject);
    if(!caStore.hasCertificate(cert)) {
      return null;
    }

    var match = getBySubject(cert.subject);

    if(!forge.util.isArray(match)) {
      result = caStore.certs[cert.subject.hash];
      delete caStore.certs[cert.subject.hash];
      return result;
    }

    // compare DER-encoding of certificates
    var der1 = asn1.toDer(pki.certificateToAsn1(cert)).getBytes();
    for(var i = 0; i < match.length; ++i) {
      var der2 = asn1.toDer(pki.certificateToAsn1(match[i])).getBytes();
      if(der1 === der2) {
        result = match[i];
        match.splice(i, 1);
      }
    }
    if(match.length === 0) {
      delete caStore.certs[cert.subject.hash];
    }

    return result;
  };

  function getBySubject(subject) {
    ensureSubjectHasHash(subject);
    return caStore.certs[subject.hash] || null;
  }

  function ensureSubjectHasHash(subject) {
    // produce subject hash if it doesn't exist
    if(!subject.hash) {
      var md = forge.md.sha1.create();
      subject.attributes = pki.RDNAttributesAsArray(_dnToAsn1(subject), md);
      subject.hash = md.digest().toHex();
    }
  }

  // auto-add passed in certs
  if(certs) {
    // parse PEM-formatted certificates as necessary
    for(var i = 0; i < certs.length; ++i) {
      var cert = certs[i];
      caStore.addCertificate(cert);
    }
  }

  return caStore;
};

/**
 * Certificate verification errors, based on TLS.
 */
pki.certificateError = {
  bad_certificate: 'forge.pki.BadCertificate',
  unsupported_certificate: 'forge.pki.UnsupportedCertificate',
  certificate_revoked: 'forge.pki.CertificateRevoked',
  certificate_expired: 'forge.pki.CertificateExpired',
  certificate_unknown: 'forge.pki.CertificateUnknown',
  unknown_ca: 'forge.pki.UnknownCertificateAuthority'
};

/**
 * Verifies a certificate chain against the given Certificate Authority store
 * with an optional custom verify callback.
 *
 * @param caStore a certificate store to verify against.
 * @param chain the certificate chain to verify, with the root or highest
 *          authority at the end (an array of certificates).
 * @param options a callback to be called for every certificate in the chain or
 *                  an object with:
 *                  verify a callback to be called for every certificate in the
 *                    chain
 *                  validityCheckDate the date against which the certificate
 *                    validity period should be checked. Pass null to not check
 *                    the validity period. By default, the current date is used.
 *
 * The verify callback has the following signature:
 *
 * verified - Set to true if certificate was verified, otherwise the
 *   pki.certificateError for why the certificate failed.
 * depth - The current index in the chain, where 0 is the end point's cert.
 * certs - The certificate chain, *NOTE* an empty chain indicates an anonymous
 *   end point.
 *
 * The function returns true on success and on failure either the appropriate
 * pki.certificateError or an object with 'error' set to the appropriate
 * pki.certificateError and 'message' set to a custom error message.
 *
 * @return true if successful, error thrown if not.
 */
pki.verifyCertificateChain = function(caStore, chain, options) {
  /* From: RFC3280 - Internet X.509 Public Key Infrastructure Certificate
    Section 6: Certification Path Validation
    See inline parentheticals related to this particular implementation.

    The primary goal of path validation is to verify the binding between
    a subject distinguished name or a subject alternative name and subject
    public key, as represented in the end entity certificate, based on the
    public key of the trust anchor. This requires obtaining a sequence of
    certificates that support that binding. That sequence should be provided
    in the passed 'chain'. The trust anchor should be in the given CA
    store. The 'end entity' certificate is the certificate provided by the
    end point (typically a server) and is the first in the chain.

    To meet this goal, the path validation process verifies, among other
    things, that a prospective certification path (a sequence of n
    certificates or a 'chain') satisfies the following conditions:

    (a) for all x in {1, ..., n-1}, the subject of certificate x is
          the issuer of certificate x+1;

    (b) certificate 1 is issued by the trust anchor;

    (c) certificate n is the certificate to be validated; and

    (d) for all x in {1, ..., n}, the certificate was valid at the
          time in question.

    Note that here 'n' is index 0 in the chain and 1 is the last certificate
    in the chain and it must be signed by a certificate in the connection's
    CA store.

    The path validation process also determines the set of certificate
    policies that are valid for this path, based on the certificate policies
    extension, policy mapping extension, policy constraints extension, and
    inhibit any-policy extension.

    Note: Policy mapping extension not supported (Not Required).

    Note: If the certificate has an unsupported critical extension, then it
    must be rejected.

    Note: A certificate is self-issued if the DNs that appear in the subject
    and issuer fields are identical and are not empty.

    The path validation algorithm assumes the following seven inputs are
    provided to the path processing logic. What this specific implementation
    will use is provided parenthetically:

    (a) a prospective certification path of length n (the 'chain')
    (b) the current date/time: ('now').
    (c) user-initial-policy-set: A set of certificate policy identifiers
          naming the policies that are acceptable to the certificate user.
          The user-initial-policy-set contains the special value any-policy
          if the user is not concerned about certificate policy
          (Not implemented. Any policy is accepted).
    (d) trust anchor information, describing a CA that serves as a trust
          anchor for the certification path. The trust anchor information
          includes:

      (1)  the trusted issuer name,
      (2)  the trusted public key algorithm,
      (3)  the trusted public key, and
      (4)  optionally, the trusted public key parameters associated
             with the public key.

      (Trust anchors are provided via certificates in the CA store).

      The trust anchor information may be provided to the path processing
      procedure in the form of a self-signed certificate. The trusted anchor
      information is trusted because it was delivered to the path processing
      procedure by some trustworthy out-of-band procedure. If the trusted
      public key algorithm requires parameters, then the parameters are
      provided along with the trusted public key (No parameters used in this
      implementation).

    (e) initial-policy-mapping-inhibit, which indicates if policy mapping is
          allowed in the certification path.
          (Not implemented, no policy checking)

    (f) initial-explicit-policy, which indicates if the path must be valid
          for at least one of the certificate policies in the user-initial-
          policy-set.
          (Not implemented, no policy checking)

    (g) initial-any-policy-inhibit, which indicates whether the
          anyPolicy OID should be processed if it is included in a
          certificate.
          (Not implemented, so any policy is valid provided that it is
          not marked as critical) */

  /* Basic Path Processing:

    For each certificate in the 'chain', the following is checked:

    1. The certificate validity period includes the current time.
    2. The certificate was signed by its parent (where the parent is either
       the next in the chain or from the CA store). Allow processing to
       continue to the next step if no parent is found but the certificate is
       in the CA store.
    3. TODO: The certificate has not been revoked.
    4. The certificate issuer name matches the parent's subject name.
    5. TODO: If the certificate is self-issued and not the final certificate
       in the chain, skip this step, otherwise verify that the subject name
       is within one of the permitted subtrees of X.500 distinguished names
       and that each of the alternative names in the subjectAltName extension
       (critical or non-critical) is within one of the permitted subtrees for
       that name type.
    6. TODO: If the certificate is self-issued and not the final certificate
       in the chain, skip this step, otherwise verify that the subject name
       is not within one of the excluded subtrees for X.500 distinguished
       names and none of the subjectAltName extension names are excluded for
       that name type.
    7. The other steps in the algorithm for basic path processing involve
       handling the policy extension which is not presently supported in this
       implementation. Instead, if a critical policy extension is found, the
       certificate is rejected as not supported.
    8. If the certificate is not the first or if its the only certificate in
       the chain (having no parent from the CA store or is self-signed) and it
       has a critical key usage extension, verify that the keyCertSign bit is
       set. If the key usage extension exists, verify that the basic
       constraints extension exists. If the basic constraints extension exists,
       verify that the cA flag is set. If pathLenConstraint is set, ensure that
       the number of certificates that precede in the chain (come earlier
       in the chain as implemented below), excluding the very first in the
       chain (typically the end-entity one), isn't greater than the
       pathLenConstraint. This constraint limits the number of intermediate
       CAs that may appear below a CA before only end-entity certificates
       may be issued. */

  // if a verify callback is passed as the third parameter, package it within
  // the options object. This is to support a legacy function signature that
  // expected the verify callback as the third parameter.
  if(typeof options === 'function') {
    options = {verify: options};
  }
  options = options || {};

  // copy cert chain references to another array to protect against changes
  // in verify callback
  chain = chain.slice(0);
  var certs = chain.slice(0);

  var validityCheckDate = options.validityCheckDate;
  // if no validityCheckDate is specified, default to the current date. Make
  // sure to maintain the value null because it indicates that the validity
  // period should not be checked.
  if(typeof validityCheckDate === 'undefined') {
    validityCheckDate = new Date();
  }

  // verify each cert in the chain using its parent, where the parent
  // is either the next in the chain or from the CA store
  var first = true;
  var error = null;
  var depth = 0;
  do {
    var cert = chain.shift();
    var parent = null;
    var selfSigned = false;

    if(validityCheckDate) {
      // 1. check valid time
      if(validityCheckDate < cert.validity.notBefore ||
         validityCheckDate > cert.validity.notAfter) {
        error = {
          message: 'Certificate is not valid yet or has expired.',
          error: pki.certificateError.certificate_expired,
          notBefore: cert.validity.notBefore,
          notAfter: cert.validity.notAfter,
          // TODO: we might want to reconsider renaming 'now' to
          // 'validityCheckDate' should this API be changed in the future.
          now: validityCheckDate
        };
      }
    }

    // 2. verify with parent from chain or CA store
    if(error === null) {
      parent = chain[0] || caStore.getIssuer(cert);
      if(parent === null) {
        // check for self-signed cert
        if(cert.isIssuer(cert)) {
          selfSigned = true;
          parent = cert;
        }
      }

      if(parent) {
        // FIXME: current CA store implementation might have multiple
        // certificates where the issuer can't be determined from the
        // certificate (happens rarely with, eg: old certificates) so normalize
        // by always putting parents into an array
        // TODO: there's may be an extreme degenerate case currently uncovered
        // where an old intermediate certificate seems to have a matching parent
        // but none of the parents actually verify ... but the intermediate
        // is in the CA and it should pass this check; needs investigation
        var parents = parent;
        if(!forge.util.isArray(parents)) {
          parents = [parents];
        }

        // try to verify with each possible parent (typically only one)
        var verified = false;
        while(!verified && parents.length > 0) {
          parent = parents.shift();
          try {
            verified = parent.verify(cert);
          } catch(ex) {
            // failure to verify, don't care why, try next one
          }
        }

        if(!verified) {
          error = {
            message: 'Certificate signature is invalid.',
            error: pki.certificateError.bad_certificate
          };
        }
      }

      if(error === null && (!parent || selfSigned) &&
        !caStore.hasCertificate(cert)) {
        // no parent issuer and certificate itself is not trusted
        error = {
          message: 'Certificate is not trusted.',
          error: pki.certificateError.unknown_ca
        };
      }
    }

    // TODO: 3. check revoked

    // 4. check for matching issuer/subject
    if(error === null && parent && !cert.isIssuer(parent)) {
      // parent is not issuer
      error = {
        message: 'Certificate issuer is invalid.',
        error: pki.certificateError.bad_certificate
      };
    }

    // 5. TODO: check names with permitted names tree

    // 6. TODO: check names against excluded names tree

    // 7. check for unsupported critical extensions
    if(error === null) {
      // supported extensions
      var se = {
        keyUsage: true,
        basicConstraints: true
      };
      for(var i = 0; error === null && i < cert.extensions.length; ++i) {
        var ext = cert.extensions[i];
        if(ext.critical && !(ext.name in se)) {
          error = {
            message:
              'Certificate has an unsupported critical extension.',
            error: pki.certificateError.unsupported_certificate
          };
        }
      }
    }

    // 8. check for CA if cert is not first or is the only certificate
    // remaining in chain with no parent or is self-signed
    if(error === null &&
      (!first || (chain.length === 0 && (!parent || selfSigned)))) {
      // first check keyUsage extension and then basic constraints
      var bcExt = cert.getExtension('basicConstraints');
      var keyUsageExt = cert.getExtension('keyUsage');
      if(keyUsageExt !== null) {
        // keyCertSign must be true and there must be a basic
        // constraints extension
        if(!keyUsageExt.keyCertSign || bcExt === null) {
          // bad certificate
          error = {
            message:
              'Certificate keyUsage or basicConstraints conflict ' +
              'or indicate that the certificate is not a CA. ' +
              'If the certificate is the only one in the chain or ' +
              'isn\'t the first then the certificate must be a ' +
              'valid CA.',
            error: pki.certificateError.bad_certificate
          };
        }
      }
      // basic constraints cA flag must be set
      if(error === null && bcExt !== null && !bcExt.cA) {
        // bad certificate
        error = {
          message:
            'Certificate basicConstraints indicates the certificate ' +
            'is not a CA.',
          error: pki.certificateError.bad_certificate
        };
      }
      // if error is not null and keyUsage is available, then we know it
      // has keyCertSign and there is a basic constraints extension too,
      // which means we can check pathLenConstraint (if it exists)
      if(error === null && keyUsageExt !== null &&
        'pathLenConstraint' in bcExt) {
        // pathLen is the maximum # of intermediate CA certs that can be
        // found between the current certificate and the end-entity (depth 0)
        // certificate; this number does not include the end-entity (depth 0,
        // last in the chain) even if it happens to be a CA certificate itself
        var pathLen = depth - 1;
        if(pathLen > bcExt.pathLenConstraint) {
          // pathLenConstraint violated, bad certificate
          error = {
            message:
              'Certificate basicConstraints pathLenConstraint violated.',
            error: pki.certificateError.bad_certificate
          };
        }
      }
    }

    // call application callback
    var vfd = (error === null) ? true : error.error;
    var ret = options.verify ? options.verify(vfd, depth, certs) : vfd;
    if(ret === true) {
      // clear any set error
      error = null;
    } else {
      // if passed basic tests, set default message and alert
      if(vfd === true) {
        error = {
          message: 'The application rejected the certificate.',
          error: pki.certificateError.bad_certificate
        };
      }

      // check for custom error info
      if(ret || ret === 0) {
        // set custom message and error
        if(typeof ret === 'object' && !forge.util.isArray(ret)) {
          if(ret.message) {
            error.message = ret.message;
          }
          if(ret.error) {
            error.error = ret.error;
          }
        } else if(typeof ret === 'string') {
          // set custom error
          error.error = ret;
        }
      }

      // throw error
      throw error;
    }

    // no longer first cert in chain
    first = false;
    ++depth;
  } while(chain.length > 0);

  return true;
};

},{"./aes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/aes.js","./asn1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/asn1.js","./des":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/des.js","./forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","./md":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/md.js","./mgf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/mgf.js","./oids":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/oids.js","./pem":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pem.js","./pss":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pss.js","./rsa":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/rsa.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/aes-cbc-hmac-sha2.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/aes-cbc-hmac-sha2.js - AES-CBC-HMAC-SHA2 Composited Encryption
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var helpers = require("./helpers.js"),
    HMAC = require("./hmac.js"),
    sha = require("./sha.js"),
    forge = require("../deps/forge.js"),
    DataBuffer = require("../util/databuffer.js"),
    util = require("../util");

function checkIv(iv) {
  if (16 !== iv.length) {
    throw new Error("invalid iv");
  }
}

function commonCbcEncryptFN(size) {
  // ### 'fallback' implementation -- uses forge
  var fallback = function(encKey, pdata, iv) {
    try {
      checkIv(iv);
    } catch (err) {
      return Promise.reject(err);
    }

    var promise = Promise.resolve();

    promise = promise.then(function() {
      var cipher = forge.cipher.createCipher("AES-CBC", new DataBuffer(encKey));
      cipher.start({
        iv: new DataBuffer(iv)
      });

      // TODO: chunk data
      cipher.update(new DataBuffer(pdata));
      if (!cipher.finish()) {
        return Promise.reject(new Error("encryption failed"));
      }

      var cdata = Buffer.from(cipher.output.bytes(), "binary");
      return cdata;
    });

    return promise;
  };

  // ### WebCryptoAPI implementation
  // TODO: cache CryptoKey sooner
  var webcrypto = function(encKey, pdata, iv) {
    try {
      checkIv(iv);
    } catch (err) {
      return Promise.reject(err);
    }

    var promise = Promise.resolve();

    promise = promise.then(function() {
      var alg = {
        name: "AES-CBC"
      };
      return helpers.subtleCrypto.importKey("raw", encKey, alg, true, ["encrypt"]);
    });
    promise = promise.then(function(key) {
      var alg = {
        name: "AES-CBC",
        iv: iv
      };
      return helpers.subtleCrypto.encrypt(alg, key, pdata);
    });
    promise = promise.then(function(cdata) {
      cdata = Buffer.from(cdata);
      return cdata;
    });

    return promise;
  };

  // ### NodeJS implementation
  var nodejs = function(encKey, pdata, iv) {
    try {
      checkIv(iv);
    } catch (err) {
      return Promise.reject(err);
    }

    var promise = Promise.resolve(pdata);

    promise = promise.then(function(pdata) {
      var name = "AES-" + size + "-CBC";
      var cipher = helpers.nodeCrypto.createCipheriv(name, encKey, iv);
      var cdata = Buffer.concat([
        cipher.update(pdata),
        cipher.final()
      ]);
      return cdata;
    });

    return promise;
  };

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

function commonCbcDecryptFN(size) {
  // ### 'fallback' implementation -- uses forge
  var fallback = function(encKey, cdata, iv) {
    // validate inputs
    try {
      checkIv(iv);
    } catch (err) {
      return Promise.reject(err);
    }

    var promise = Promise.resolve();

    promise = promise.then(function() {
      var cipher = forge.cipher.createDecipher("AES-CBC", new DataBuffer(encKey));
      cipher.start({
        iv: new DataBuffer(iv)
      });

      // TODO: chunk data
      cipher.update(new DataBuffer(cdata));
      if (!cipher.finish()) {
        return Promise.reject(new Error("encryption failed"));
      }

      var pdata = Buffer.from(cipher.output.bytes(), "binary");
      return pdata;
    });

    return promise;
  };

  // ### WebCryptoAPI implementation
  // TODO: cache CryptoKey sooner
  var webcrypto = function(encKey, cdata, iv) {
    // validate inputs
    try {
      checkIv(iv);
    } catch (err) {
      return Promise.reject(err);
    }

    var promise = Promise.resolve();

    promise = promise.then(function() {
      var alg = {
        name: "AES-CBC"
      };
      return helpers.subtleCrypto.importKey("raw", encKey, alg, true, ["decrypt"]);
    });
    promise = promise.then(function(key) {
      var alg = {
        name: "AES-CBC",
        iv: iv
      };
      return helpers.subtleCrypto.decrypt(alg, key, cdata);
    });
    promise = promise.then(function(pdata) {
      pdata = Buffer.from(pdata);
      return pdata;
    });

    return promise;
  };

  // ### NodeJS implementation
  var nodejs = function(encKey, cdata, iv) {
    // validate inputs
    try {
      checkIv(iv);
    } catch (err) {
      return Promise.reject(err);
    }

    var promise = Promise.resolve();

    promise = promise.then(function() {
      var name = "AES-" + size + "-CBC";
      var cipher = helpers.nodeCrypto.createDecipheriv(name, encKey, iv);
      var pdata = Buffer.concat([
        cipher.update(cdata),
        cipher.final()
      ]);
      return pdata;
    });

    return promise;
  };

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

function checkKey(key, size) {
  if ((size << 1) !== (key.length << 3)) {
    throw new Error("invalid encryption key size");
  }
}

function cbcHmacEncryptFN(size) {
  var commonEncrypt = commonCbcEncryptFN(size);
  return function(key, pdata, props) {
    // validate inputs
    try {
      checkKey(key, size);
    } catch (err) {
      return Promise.reject(err);
    }

    var eKey = key.slice(size / 8),
        iKey = key.slice(0, size / 8),
        iv = props.iv || Buffer.alloc(0),
        adata = props.aad || props.adata || Buffer.alloc(0);

    // STEP 1 -- Encrypt
    var promise = commonEncrypt(eKey, pdata, iv);

    // STEP 2 -- MAC
    promise = promise.then(function(cdata){
      var mdata = Buffer.concat([
        adata,
        iv,
        cdata,
        helpers.int64ToBuffer(adata.length * 8)
      ]);

      var promise;
      promise = HMAC["HS" + (size * 2)].sign(iKey, mdata, {
        length: size
      });
      promise = promise.then(function(result) {
        // TODO: move slice to hmac.js
        var tag = result.mac.slice(0, size / 8);
        return {
          data: cdata,
          tag: tag
        };
      });
      return promise;
    });

    return promise;
  };
}

function cbcHmacDecryptFN(size) {
  var commonDecrypt = commonCbcDecryptFN(size);

  return function(key, cdata, props) {
    // validate inputs
    try {
      checkKey(key, size);
    } catch (err) {
      return Promise.reject(err);
    }

    var eKey = key.slice(size / 8),
        iKey = key.slice(0, size / 8),
        iv = props.iv || Buffer.alloc(0),
        adata = props.aad || props.adata || Buffer.alloc(0),
        tag = props.tag || props.mac || Buffer.alloc(0);

    var promise = Promise.resolve();

    // STEP 1 -- MAC
    promise = promise.then(function() {
      var promise;
      // construct MAC input
      var mdata = Buffer.concat([
        adata,
        iv,
        cdata,
        helpers.int64ToBuffer(adata.length * 8)
      ]);
      promise = HMAC["HS" + (size * 2)].verify(iKey, mdata, tag, {
        length: size
      });
      promise = promise.then(function() {
        return cdata;
      }, function() {
        // failure -- invalid tag error
        throw new Error("mac check failed");
      });
      return promise;
    });

    // STEP 2 -- Decrypt
    promise = promise.then(function(){
      return commonDecrypt(eKey, cdata, iv);
    });

    return promise;
  };
}

var EncryptionLabel = Buffer.from("Encryption", "utf8");
var IntegrityLabel = Buffer.from("Integrity", "utf8");
var DotLabel = Buffer.from(".", "utf8");

function generateCek(masterKey, alg, epu, epv) {
  var masterSize = masterKey.length * 8;
  var cekSize = masterSize / 2;
  var promise = Promise.resolve();

  promise = promise.then(function(){
    var input = Buffer.concat([
      helpers.int32ToBuffer(1),
      masterKey,
      helpers.int32ToBuffer(cekSize),
      Buffer.from(alg, "utf8"),
      epu,
      epv,
      EncryptionLabel
    ]);

    return input;
  });

  promise = promise.then( function(input) {
    return sha["SHA-" + masterSize].digest(input).then(function(digest) {
      return digest.slice(0, cekSize / 8);
    });
  });
  promise = Promise.resolve(promise);

  return promise;
}

function generateCik(masterKey, alg, epu, epv) {
  var masterSize = masterKey.length * 8;
  var cikSize = masterSize;
  var promise = Promise.resolve();

  promise = promise.then(function(){
    var input = Buffer.concat([
      helpers.int32ToBuffer(1),
      masterKey,
      helpers.int32ToBuffer(cikSize),
      Buffer.from(alg, "utf8"),
      epu,
      epv,
      IntegrityLabel
    ]);

    return input;
  });

  promise = promise.then( function(input) {
    return sha["SHA-" + masterSize].digest(input).then(function(digest) {
      return digest.slice(0, cikSize / 8);
    });
  });
  promise = Promise.resolve(promise);

  return promise;
}

function concatKdfCbcHmacEncryptFN(size, alg) {
  var commonEncrypt = commonCbcEncryptFN(size);

  return function(key, pdata, props) {
    var epu = props.epu || helpers.int32ToBuffer(0),
        epv = props.epv || helpers.int32ToBuffer(0),
        iv = props.iv || Buffer.alloc(0),
        adata = props.aad || props.adata || Buffer.alloc(0),
        kdata = props.kdata || Buffer.alloc(0);

    // Pre Step 1 -- Generate Keys
    var promises = [
      generateCek(key, alg, epu, epv),
      generateCik(key, alg, epu, epv)
    ];

    var cek,
        cik;
    var promise = Promise.all(promises).then(function(keys) {
      cek = keys[0];
      cik = keys[1];
    });

    // STEP 1 -- Encrypt
    promise = promise.then(function(){
      return commonEncrypt(cek, pdata, iv);
    });

    // STEP 2 -- Mac
    promise = promise.then(function(cdata){
      var mdata = Buffer.concat([
        adata,
        DotLabel,
        Buffer.from(kdata),
        DotLabel,
        Buffer.from(util.base64url.encode(iv), "utf8"),
        DotLabel,
        Buffer.from(util.base64url.encode(cdata), "utf8")
      ]);
      return Promise.all([
        Promise.resolve(cdata),
        HMAC["HS" + (size * 2)].sign(cik, mdata, { length: size })
      ]);
    });
    promise = promise.then(function(result){
      return {
        data: result[0],
        tag: result[1].mac
      };
    });

    return promise;
  };
}

function concatKdfCbcHmacDecryptFN(size, alg) {
  var commonDecrypt = commonCbcDecryptFN(size);

  return function(key, cdata, props) {
    var epu = props.epu || helpers.int32ToBuffer(0),
        epv = props.epv || helpers.int32ToBuffer(0),
        iv = props.iv || Buffer.alloc(0),
        adata = props.aad || props.adata || Buffer.alloc(0),
        kdata = props.kdata || Buffer.alloc(0),
        tag = props.tag || props.mac || Buffer.alloc(0);

    // Pre Step 1 -- Generate Keys
    var promises = [
      generateCek(key, alg, epu, epv),
      generateCik(key, alg, epu, epv)
    ];

    var cek,
        cik;
    var promise = Promise.all(promises).then(function(keys){
      cek = keys[0];
      cik = keys[1];
    });


    // STEP 1 -- MAC
    promise = promise.then(function() {
      // construct MAC input
      var mdata = Buffer.concat([
        adata,
        DotLabel,
        Buffer.from(kdata),
        DotLabel,
        Buffer.from(util.base64url.encode(iv), "utf8"),
        DotLabel,
        Buffer.from(util.base64url.encode(cdata), "utf8")
      ]);

      try {
        return HMAC["HS" + (size * 2)].verify(cik, mdata, tag, {
          loose: false
        });
      } catch (e) {
        throw new Error("mac check failed");
      }
    });

    // STEP 2 -- Decrypt
    promise = promise.then(function(){
      return commonDecrypt(cek, cdata, iv);
    });

    return promise;
  };
}

// ### Public API
// * [name].encrypt
// * [name].decrypt
var aesCbcHmacSha2 = {};
[
  "A128CBC-HS256",
  "A192CBC-HS384",
  "A256CBC-HS512"
].forEach(function(alg) {
  var size = parseInt(/A(\d+)CBC-HS(\d+)?/g.exec(alg)[1]);
  aesCbcHmacSha2[alg] = {
    encrypt: cbcHmacEncryptFN(size),
    decrypt: cbcHmacDecryptFN(size)
  };
});

[
  "A128CBC+HS256",
  "A192CBC+HS384",
  "A256CBC+HS512"
].forEach(function(alg) {
  var size = parseInt(/A(\d+)CBC\+HS(\d+)?/g.exec(alg)[1]);
  aesCbcHmacSha2[alg] = {
    encrypt: concatKdfCbcHmacEncryptFN(size, alg),
    decrypt: concatKdfCbcHmacDecryptFN(size, alg)
  };
});

module.exports = aesCbcHmacSha2;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","../util/databuffer.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/databuffer.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js","./hmac.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/hmac.js","./sha.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/sha.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/aes-gcm.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/aes-gcm.js - AES-GCM Encryption and Key-Wrapping
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var helpers = require("./helpers.js"),
    util = require("../util"),
    CONSTANTS = require("./constants.js"),
    GCM = require("../deps/ciphermodes/gcm");

function gcmEncryptFN(size, wrap) {
  function commonChecks(key, iv) {
    if (size !== (key.length << 3)) {
       throw new Error("invalid key size");
    }
    if (!iv && !wrap) {
      throw new Error("invalid iv");
    }
    if (iv && 12 !== iv.length) {
      throw new Error("invalid iv");
    }
  }

  function prepareResults(results) {
    if (wrap) {
      var iv = util.base64url.encode(results.iv);
      var tag = util.base64url.encode(results.tag);

      results = {
        data: results.data,
        header: {
          iv: iv,
          tag: tag
        }
      };
    }

    return results;
  }

  // ### 'fallback' implementation -- uses forge
  var fallback = function(key, pdata, props) {
    var iv = props.iv,
        adata = props.aad || props.adata || Buffer.alloc(0),
        cipher,
        cdata;

    // validate inputs
    try {
      commonChecks(key, iv, adata);
    } catch (err) {
      return Promise.reject(err);
    }

    iv = iv || util.randomBytes(12);

    // setup cipher
    cipher = GCM.createCipher({
      key: key,
      iv: iv,
      additionalData: adata
    });
    // ciphertext is the same length as plaintext
    cdata = Buffer.alloc(pdata.length);

    var promise = new Promise(function(resolve, reject) {
      var amt = CONSTANTS.CHUNK_SIZE,
          clen = 0,
          poff = 0;

      (function doChunk() {
        var plen = Math.min(amt, pdata.length - poff);
        clen += cipher.update(pdata,
                              poff,
                              plen,
                              cdata,
                              clen);
        poff += plen;
        if (pdata.length > poff) {
          setTimeout(doChunk, 0);
          return;
        }

        // finish it
        clen += cipher.finish(cdata, clen);
        if (clen !== pdata.length) {
          reject(new Error("encryption failed"));
          return;
        }

        // resolve with output
        var tag = cipher.tag;
        resolve(prepareResults({
          data: cdata,
          iv: iv,
          tag: tag
        }));
      })();
    });

    return promise;
  };

  // ### WebCryptoAPI implementation
  // TODO: cache CryptoKey sooner
  var webcrypto = function(key, pdata, props) {
    var iv = props.iv,
        adata = props.aad || props.adata || Buffer.alloc(0);

    try {
      commonChecks(key, iv, adata);
    } catch (err) {
      return Promise.reject(err);
    }

    iv = iv || util.randomBytes(12);

    var alg = {
      name: "AES-GCM"
    };
    var promise;
    promise = helpers.subtleCrypto.importKey("raw", key, alg, true, ["encrypt"]);
    promise = promise.then(function(key) {
      alg.iv = iv;
      alg.tagLength = 128;
      if (adata.length) {
        alg.additionalData = adata;
      }

      return helpers.subtleCrypto.encrypt(alg, key, pdata);
    });
    promise = promise.then(function(result) {
      var tagStart = result.byteLength - 16;

      var tag = result.slice(tagStart);
      tag = Buffer.from(tag);

      var cdata = result.slice(0, tagStart);
      cdata = Buffer.from(cdata);

      return prepareResults({
        data: cdata,
        iv: iv,
        tag: tag
      });
    });

    return promise;
  };

  // ### NodeJS implementation
  var nodejs = function(key, pdata, props) {
    var iv = props.iv,
        adata = props.aad || props.adata || Buffer.alloc(0);

    try {
      commonChecks(key, iv, adata);
    } catch (err) {
      return Promise.reject(err);
    }

    iv = iv || util.randomBytes(12);

    var alg = "aes-" + (key.length * 8) + "-gcm";
    var cipher;
    try {
      cipher = helpers.nodeCrypto.createCipheriv(alg, key, iv);
    } catch (err) {
      throw new Error("unsupported algorithm: " + alg);
    }
    if ("function" !== typeof cipher.setAAD) {
      throw new Error("unsupported algorithm: " + alg);
    }
    if (adata.length) {
      cipher.setAAD(adata);
    }

    var cdata = Buffer.concat([
      cipher.update(pdata),
      cipher.final()
    ]);
    var tag = cipher.getAuthTag();

    return prepareResults({
      data: cdata,
      iv: iv,
      tag: tag
    });
  };

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

function gcmDecryptFN(size) {
  function commonChecks(key, iv, tag) {
    if (size !== (key.length << 3)) {
      throw new Error("invalid key size");
    }
    if (12 !== iv.length) {
      throw new Error("invalid iv");
    }
    if (16 !== tag.length) {
      throw new Error("invalid tag length");
    }
  }

  // ### fallback implementation -- uses forge
  var fallback = function(key, cdata, props) {
    var adata = props.aad || props.adata || Buffer.alloc(0),
        iv = props.iv || Buffer.alloc(0),
        tag = props.tag || props.mac || Buffer.alloc(0),
        cipher,
        pdata;

    // validate inputs
    try {
      commonChecks(key, iv, tag);
    } catch (err) {
      return Promise.reject(err);
    }

    // setup cipher
    cipher = GCM.createDecipher({
      key: key,
      iv: iv,
      additionalData: adata,
      tag: tag
    });
    // plaintext is the same length as ciphertext
    pdata = Buffer.alloc(cdata.length);

    var promise = new Promise(function(resolve, reject) {
      var amt = CONSTANTS.CHUNK_SIZE,
          plen = 0,
          coff = 0;

      (function doChunk() {
        var clen = Math.min(amt, cdata.length - coff);
        plen += cipher.update(cdata,
                              coff,
                              clen,
                              pdata,
                              plen);
        coff += clen;
        if (cdata.length > coff) {
          setTimeout(doChunk, 0);
          return;
        }

        try {
          plen += cipher.finish(pdata, plen);
        } catch (err) {
          reject(new Error("decryption failed"));
          return;
        }

        if (plen !== cdata.length) {
          reject(new Error("decryption failed"));
          return;
        }

        // resolve with output
        resolve(pdata);
      })();
    });

    return promise;
  };

  // ### WebCryptoAPI implementation
  // TODO: cache CryptoKey sooner
  var webcrypto = function(key, cdata, props) {
    var adata = props.aad || props.adata || Buffer.alloc(0),
        iv = props.iv || Buffer.alloc(0),
        tag = props.tag || props.mac || Buffer.alloc(0);

    // validate inputs
    try {
      commonChecks(key, iv, tag);
    } catch (err) {
      return Promise.reject(err);
    }

    var alg = {
      name: "AES-GCM"
    };
    var promise;
    promise = helpers.subtleCrypto.importKey("raw", key, alg, true, ["decrypt"]);
    promise = promise.then(function(key) {
      alg.iv = iv;
      alg.tagLength = 128;
      if (adata.length) {
        alg.additionalData = adata;
      }

      // concatenate cdata and tag
      cdata = Buffer.concat([cdata, tag], cdata.length + tag.length);

      return helpers.subtleCrypto.decrypt(alg, key, cdata);
    });
    promise = promise.then(function(pdata) {
      pdata = Buffer.from(pdata);
      return pdata;
    });

    return promise;
  };

  var nodejs = function(key, cdata, props) {
    var adata = props.aad || props.adata || Buffer.alloc(0),
        iv = props.iv || Buffer.alloc(0),
        tag = props.tag || props.mac || Buffer.alloc(0);

    // validate inputs
    try {
      commonChecks(key, iv, tag);
    } catch (err) {
      return Promise.reject(err);
    }

    var alg = "aes-" + (key.length * 8) + "-gcm";
    var cipher;
    try {
      cipher = helpers.nodeCrypto.createDecipheriv(alg, key, iv);
    } catch(err) {
      throw new Error("unsupported algorithm: " + alg);
    }
    if ("function" !== typeof cipher.setAAD) {
      throw new Error("unsupported algorithm: " + alg);
    }
    cipher.setAuthTag(tag);
    if (adata.length) {
      cipher.setAAD(adata);
    }

    try {
      var pdata = Buffer.concat([
        cipher.update(cdata),
        cipher.final()
      ]);

      return pdata;
    } catch (err) {
      throw new Error("decryption failed");
    }
  };

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

// ### Public API
// * [name].encrypt
// * [name].decrypt
var aesGcm = {};
[
  "A128GCM",
  "A192GCM",
  "A256GCM",
  "A128GCMKW",
  "A192GCMKW",
  "A256GCMKW"
].forEach(function(alg) {
  var parts = /A(\d+)GCM(KW)?/g.exec(alg);
  var size = parseInt(parts[1]);
  var wrap = (parts[2] === "KW");
  aesGcm[alg] = {
    encrypt: gcmEncryptFN(size, wrap),
    decrypt: gcmDecryptFN(size, wrap)
  };
});

module.exports = aesGcm;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/ciphermodes/gcm":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/gcm/index.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","./constants.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/constants.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/aes-kw.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/aes-kw.js - AES-KW Key-Wrapping
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var helpers = require("./helpers.js"),
    forge = require("../deps/forge.js"),
    DataBuffer = require("../util/databuffer.js");

var A0 = Buffer.from("a6a6a6a6a6a6a6a6", "hex");

// ### helpers
function xor(a, b) {
  var len = Math.max(a.length, b.length);
  var result = Buffer.alloc(len);
  for (var idx = 0; len > idx; idx++) {
    result[idx] = (a[idx] || 0) ^ (b[idx] || 0);
  }
  return result;
}

function split(input, size) {
  var output = [];
  for (var idx = 0; input.length > idx; idx += size) {
    output.push(input.slice(idx, idx + size));
  }
  return output;
}

function longToBigEndian(input) {
  var hi = Math.floor(input / 4294967296),
      lo = input % 4294967296;
  var output = Buffer.alloc(8);
  output[0] = 0xff & (hi >>> 24);
  output[1] = 0xff & (hi >>> 16);
  output[2] = 0xff & (hi >>> 8);
  output[3] = 0xff & (hi >>> 0);
  output[4] = 0xff & (lo >>> 24);
  output[5] = 0xff & (lo >>> 16);
  output[6] = 0xff & (lo >>> 8);
  output[7] = 0xff & (lo >>> 0);
  return output;
}

function kwEncryptFN(size) {
  function commonChecks(key, data) {
    if (size !== (key.length << 3)) {
      throw new Error("invalid key size");
    }
    if (0 < data.length && 0 !== (data.length % 8)) {
      throw new Error("invalid data length");
    }
  }

  // ### 'fallback' implementation -- uses forge
  var fallback = function(key, pdata) {
    try {
      commonChecks(key, pdata);
    } catch (err) {
      return Promise.reject(err);
    }

    // setup cipher
    var cipher = forge.cipher.createCipher("AES", new DataBuffer(key));

    // split input into chunks
    var R = split(pdata, 8);
    var A,
        B,
        count;
    A = A0;
    for (var jdx = 0; 6 > jdx; jdx++) {
      for (var idx = 0; R.length > idx; idx++) {
        count = (R.length * jdx) + idx + 1;
        B = Buffer.concat([A, R[idx]]);
        cipher.start();
        cipher.update(new DataBuffer(B));
        cipher.finish();
        B = Buffer.from(cipher.output.bytes(), "binary");

        A = xor(B.slice(0, 8),
                longToBigEndian(count));
        R[idx] = B.slice(8, 16);
      }
    }
    R = [A].concat(R);
    var cdata = Buffer.concat(R);
    return Promise.resolve({
      data: cdata
    });
  };
  // ### WebCryptoAPI implementation
  var webcrypto = function(key, pdata) {
    try {
      commonChecks(key, pdata);
    } catch (err) {
      return Promise.reject(err);
    }

    var alg = {
      name: "AES-KW"
    };
    var promise = [
      helpers.subtleCrypto.importKey("raw", pdata, { name: "HMAC", hash: "SHA-256" }, true, ["sign"]),
      helpers.subtleCrypto.importKey("raw", key, alg, true, ["wrapKey"])
    ];
    promise = Promise.all(promise);
    promise = promise.then(function(keys) {
      return helpers.subtleCrypto.wrapKey("raw",
                                          keys[0], // key
                                          keys[1], // wrappingKey
                                          alg);
    });
    promise = promise.then(function(result) {
      result = Buffer.from(result);

      return {
        data: result
      };
    });
    return promise;
  };
  var node = function(key, pdata) {
    try {
      commonChecks(key, pdata);
    } catch (err) {
      return Promise.reject(err);
    }

    // split input into chunks
    var R = split(pdata, 8),
        iv = Buffer.alloc(16);
    var A,
        B,
        count;
    A = A0;
    for (var jdx = 0; 6 > jdx; jdx++) {
      for (var idx = 0; R.length > idx; idx++) {
        count = (R.length * jdx) + idx + 1;
        B = Buffer.concat([A, R[idx]]);
        var cipher = helpers.nodeCrypto.createCipheriv("AES" + size, key, iv);
        B = cipher.update(B);

        A = xor(B.slice(0, 8),
                longToBigEndian(count));
        R[idx] = B.slice(8, 16);
      }
    }
    R = [A].concat(R);
    var cdata = Buffer.concat(R);
    return Promise.resolve({
      data: cdata
    });
  };

  return helpers.setupFallback(node, webcrypto, fallback);
}
function kwDecryptFN(size) {
  function commonChecks(key, data) {
    if (size !== (key.length << 3)) {
      throw new Error("invalid key size");
    }
    if (0 < (data.length - 8) && 0 !== (data.length % 8)) {
      throw new Error("invalid data length");
    }
  }

  // ### 'fallback' implementation -- uses forge
  var fallback = function(key, cdata) {
    try {
      commonChecks(key, cdata);
    } catch (err) {
      return Promise.reject(err);
    }

    // setup cipher
    var cipher = forge.cipher.createDecipher("AES", new DataBuffer(key));

    // prepare inputs
    var R = split(cdata, 8),
        A,
        B,
        count;
    A = R[0];
    R = R.slice(1);
    for (var jdx = 5; 0 <= jdx; --jdx) {
      for (var idx = R.length - 1; 0 <= idx; --idx) {
        count = (R.length * jdx) + idx + 1;
        B = xor(A,
                longToBigEndian(count));
        B = Buffer.concat([B, R[idx]]);
        cipher.start();
        cipher.update(new DataBuffer(B));
        cipher.finish();
        B = Buffer.from(cipher.output.bytes(), "binary");

        A = B.slice(0, 8);
        R[idx] = B.slice(8, 16);
      }
    }
    if (A.toString() !== A0.toString()) {
      return Promise.reject(new Error("decryption failed"));
    }
    var pdata = Buffer.concat(R);
    return Promise.resolve(pdata);
  };
  // ### WebCryptoAPI implementation
  var webcrypto = function(key, cdata) {
    try {
      commonChecks(key, cdata);
    } catch (err) {
      return Promise.reject(err);
    }

    var alg = {
      name: "AES-KW"
    };
    var promise = helpers.subtleCrypto.importKey("raw", key, alg, true, ["unwrapKey"]);
    promise = promise.then(function(key) {
      return helpers.subtleCrypto.unwrapKey("raw", cdata, key, alg, {name: "HMAC", hash: "SHA-256"}, true, ["sign"]);
    });
    promise = promise.then(function(result) {
      // unwrapped CryptoKey -- extract raw
      return helpers.subtleCrypto.exportKey("raw", result);
    });
    promise = promise.then(function(result) {
      result = Buffer.from(result);
      return result;
    });
    return promise;
  };
  var node = function(key, cdata) {
    try {
      commonChecks(key, cdata);
    } catch (err) {
      return Promise.reject(err);
    }

    // prepare inputs
    var R = split(cdata, 8),
        iv = Buffer.alloc(16),
        A,
        B,
        count;
    A = R[0];
    R = R.slice(1);
    for (var jdx = 5; 0 <= jdx; --jdx) {
      for (var idx = R.length - 1; 0 <= idx; --idx) {
        count = (R.length * jdx) + idx + 1;
        B = xor(A,
                longToBigEndian(count));
        B = Buffer.concat([B, R[idx], iv]);
        var cipher = helpers.nodeCrypto.createDecipheriv("AES" + size, key, iv);
        B = cipher.update(B);

        A = B.slice(0, 8);
        R[idx] = B.slice(8, 16);
      }
    }
    if (A.toString() !== A0.toString()) {
      return Promise.reject(new Error("decryption failed"));
    }
    var pdata = Buffer.concat(R);
    return Promise.resolve(pdata);
  };

  return helpers.setupFallback(node, webcrypto, fallback);
}

// ### Public API
// * [name].encrypt
// * [name].decrypt
var aesKw = {};
[
  "A128KW",
  "A192KW",
  "A256KW"
].forEach(function(alg) {
  var size = parseInt(/A(\d+)KW/g.exec(alg)[1]);
  aesKw[alg] = {
    encrypt: kwEncryptFN(size),
    decrypt: kwDecryptFN(size)
  };
});

module.exports = aesKw;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","../util/databuffer.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/databuffer.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/concat.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/concat.js - Concat Key Derivation
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var CONSTANTS = require("./constants.js"),
    sha = require("./sha.js");

function concatDeriveFn(name) {
  name = name.replace("CONCAT-", "");

  // NOTE: no nodejs/webcrypto/fallback model, since ConcatKDF is
  //       implemented using the SHA algorithms

  var fn = function(key, props) {
    props = props || {};

    var keyLen = props.length,
        hashLen = CONSTANTS.HASHLENGTH[name];
    if (!keyLen) {
      return Promise.reject(new Error("invalid key length"));
    }

    // setup otherInfo
    if (!props.otherInfo) {
      return Promise.reject(new Error("invalid otherInfo"));
    }
    var otherInfo = props.otherInfo;

    var op = sha[name].digest;
    var N = Math.ceil(keyLen / hashLen),
        idx = 0,
        okm = [];
    function step() {
      if (N === idx++) {
        return Buffer.concat(okm).slice(0, keyLen);
      }

      var T = Buffer.alloc(4 + key.length + otherInfo.length);
      T.writeUInt32BE(idx, 0);
      key.copy(T, 4);
      otherInfo.copy(T, 4 + key.length);
      return op(T).then(function(result) {
        okm.push(result);
        return step();
      });
    }

    return step();
  };

  return fn;
}

// Public API
// * [name].derive
var concat = {};
[
  "CONCAT-SHA-1",
  "CONCAT-SHA-256",
  "CONCAT-SHA-384",
  "CONCAT-SHA-512"
].forEach(function(name) {
  concat[name] = {
    derive: concatDeriveFn(name)
  };
});

module.exports = concat;

}).call(this)}).call(this,require("buffer").Buffer)
},{"./constants.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/constants.js","./sha.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/sha.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/constants.js":[function(require,module,exports){
/*!
 * algorithms/constants.js - Constants used in Cryptographic Algorithms
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
 "use strict";

module.exports = {
  CHUNK_SIZE: 1024,
  HASHLENGTH: {
    "SHA-1": 160,
    "SHA-256": 256,
    "SHA-384": 384,
    "SHA-512": 512
  },
  ENCLENGTH: {
    "AES-128-CBC": 128,
    "AES-192-CBC": 192,
    "AES-256-CBC": 256,
    "AES-128-KW": 128,
    "AES-192-KW": 192,
    "AES-256-KW": 256
  },
  KEYLENGTH: {
    "A128CBC-HS256": 256,
    "A192CBC-HS384": 384,
    "A256CBC-HS512": 512,
    "A128CBC+HS256": 256,
    "A192CBC+HS384": 384,
    "A256CBC+HS512": 512,
    "A128GCM": 128,
    "A192GCM": 192,
    "A256GCM": 256,
    "A128KW": 128,
    "A192KW": 192,
    "A256KW": 256,
    "ECDH-ES+A128KW": 128,
    "ECDH-ES+A192KW": 192,
    "ECDH-ES+A256KW": 256
  },
  NONCELENGTH: {
    "A128CBC-HS256": 128,
    "A192CBC-HS384": 128,
    "A256CBC-HS512": 128,
    "A128CBC+HS256": 128,
    "A192CBC+HS384": 128,
    "A256CBC+HS512": 128,
    "A128GCM": 96,
    "A192GCM": 96,
    "A256GCM": 96
  }
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/dir.js":[function(require,module,exports){
/*!
 * algorithms/dir.js - Direct key mode
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

function dirEncryptFN(key) {
  // NOTE: pdata unused
  // NOTE: props unused
  return Promise.resolve({
    data: key,
    once: true,
    direct: true
  });
}
function dirDecryptFN(key) {
  // NOTE: pdata unused
  // NOTE: props unused
  return Promise.resolve(key);
}

// ### Public API
// * [name].encrypt
// * [name].decrypt
var direct = {
  dir: {
    encrypt: dirEncryptFN,
    decrypt: dirDecryptFN
  }
};

module.exports = direct;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/ec-util.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/ec-util.js - Elliptic Curve Utility Functions
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var clone = require("lodash").clone,
    ecc = require("../deps/ecc"),
    forge = require("../deps/forge.js"),
    util = require("../util");

var EC_KEYSIZES = {
  "P-256": 256,
  "P-384": 384,
  "P-521": 521
};

function convertToForge(key, isPublic) {
  var parts = isPublic ?
              ["x", "y"] :
              ["d"];
  parts = parts.map(function(f) {
    return new forge.jsbn.BigInteger(key[f].toString("hex"), 16);
  });
  // prefix with curve
  parts = [key.crv].concat(parts);
  var fn = isPublic ?
           ecc.asPublicKey :
           ecc.asPrivateKey;
  return fn.apply(ecc, parts);
}

function convertToJWK(key, isPublic) {
  var result = clone(key);
  var parts = isPublic ?
              ["x", "y"] :
              ["x", "y", "d"];
  parts.forEach(function(f) {
    result[f] = util.base64url.encode(result[f]);
  });

  // remove potentially troublesome properties
  delete result.key_ops;
  delete result.use;
  delete result.alg;

  if (isPublic) {
    delete result.d;
  }

  return result;
}

function convertToObj(key, isPublic) {
  var result = clone(key);
  var parts = isPublic ?
              ["x", "y"] :
              ["d"];
  parts.forEach(function(f) {
    // assume string if base64url-encoded
    result[f] = util.asBuffer(result[f], "base64url");
  });

  return result;
}

var UNCOMPRESSED = Buffer.from([0x04]);
function convertToBuffer(key, isPublic) {
  key = convertToObj(key, isPublic);
  var result = isPublic ?
               Buffer.concat([UNCOMPRESSED, key.x, key.y]) :
               key.d;
  return result;
}

function curveSize(crv) {
  return EC_KEYSIZES[crv || ""] || NaN;
}

function curveNameToOid(crv) {
  switch (crv) {
    case "P-256":
      return "1.2.840.10045.3.1.7";
    case "P-384":
      return "1.3.132.0.34";
    case "P-521":
      return "1.3.132.0.35";
    default:
      return null;
  }
}

var EC_OID = "1.2.840.10045.2.1";
function convertToPEM(key, isPrivate) {
  // curveName to OID
  var oid = key.crv;
  oid = curveNameToOid(oid);
  oid = forge.asn1.oidToDer(oid);
  // key as bytes
  var type,
      pub,
      asn1;
  if (isPrivate) {
    type = "EC PRIVATE KEY";
    pub = Buffer.concat([
      Buffer.from([0x00, 0x04]),
      key.x,
      key.y
    ]).toString("binary");
    key = key.d.toString("binary");
    asn1 = forge.asn1.create(forge.asn1.Class.UNIVERSAL, forge.asn1.Type.SEQUENCE, true, [
      forge.asn1.create(forge.asn1.Class.UNIVERSAL, forge.asn1.Type.INTEGER, false, "\u0001"),
      forge.asn1.create(forge.asn1.Class.UNIVERSAL, forge.asn1.Type.OCTETSTRING, false, key),
      forge.asn1.create(forge.asn1.Class.CONTEXT_SPECIFIC, 0, true, [
        forge.asn1.create(forge.asn1.Class.UNIVERSAL, forge.asn1.Type.OID, false, oid.bytes())
      ]),
      forge.asn1.create(forge.asn1.Class.CONTEXT_SPECIFIC, 1, true, [
        forge.asn1.create(forge.asn1.Class.UNIVERSAL, forge.asn1.Type.BITSTRING, false, pub)
      ])
    ]);
  } else {
    type = "PUBLIC KEY";
    key = Buffer.concat([
      Buffer.from([0x00, 0x04]),
      key.x,
      key.y
    ]).toString("binary");
    asn1 = forge.asn1.create(forge.asn1.Class.UNIVERSAL, forge.asn1.Type.SEQUENCE, true, [
      forge.asn1.create(forge.asn1.Class.UNIVERSAL, forge.asn1.Type.SEQUENCE, true, [
        forge.asn1.create(forge.asn1.Class.UNIVERSAL, forge.asn1.Type.OID, false, forge.asn1.oidToDer(EC_OID).bytes()),
        forge.asn1.create(forge.asn1.Class.UNIVERSAL, forge.asn1.Type.OID, false, oid.bytes())
      ]),
      forge.asn1.create(forge.asn1.Class.UNIVERSAL, forge.asn1.Type.BITSTRING, false, key)
    ]);
  }
  asn1 = forge.asn1.toDer(asn1).bytes();
  var pem = forge.pem.encode({
    type: type,
    body: asn1
  });
  return pem;
}

// Inspired by teifip/node-webtokens/blob/master/lib/ecdsa.js
var ERR_MSG = "Could not extract parameters from DER signature";
function derToConcat(signature, size) {
  var offset = 0;
  if (signature[offset++] !== 0x30) {
    throw new Error(ERR_MSG);
  }
  var seqLength = signature[offset++];
  if (seqLength === 0x81) {
    seqLength = signature[offset++];
  }
  if (seqLength > signature.length - offset) {
    throw new Error(ERR_MSG);
  }
  if (signature[offset++] !== 0x02) {
    throw new Error(ERR_MSG);
  }
  var rLength = signature[offset++];
  if (rLength > signature.length - offset - 2) {
    throw new Error(ERR_MSG);
  }
  if (rLength > size + 1) {
    throw new Error(ERR_MSG);
  }
  var rOffset = offset;
  offset += rLength;
  if (signature[offset++] !== 0x02) {
    throw new Error(ERR_MSG);
  }
  var sLength = signature[offset++];
  if (sLength !== signature.length - offset) {
    throw new Error(ERR_MSG);
  }
  if (sLength > size + 1) {
    throw new Error(ERR_MSG);
  }
  var sOffset = offset;
  offset += sLength;
  if (offset !== signature.length) {
    throw new Error(ERR_MSG);
  }
  var rPadding = size - rLength;
  var sPadding = size - sLength;
  var dst = Buffer.alloc(rPadding + rLength + sPadding + sLength);
  for (offset = 0; offset < rPadding; ++offset) {
    dst[offset] = 0;
  }
  var rPad = Math.max(-rPadding, 0);
  signature.copy(dst, offset, rOffset + rPad, rOffset + rLength);
  offset = size;
  for (var o = offset; offset < o + sPadding; ++offset) {
    dst[offset] = 0;
  }
  var sPad = Math.max(-sPadding, 0);
  signature.copy(dst, offset, sOffset + sPad, sOffset + sLength);
  return dst;
}

function countPadding(buf, start, stop) {
  var padding = 0;
  while (start + padding < stop && buf[start + padding] === 0) {
    ++padding;
  }
  var needsSign = buf[start + padding] >= 0x80;
  if (needsSign) {
    --padding;
  }
  return padding;
}

function concatToDer(signature, size) {
  var rPadding = countPadding(signature, 0, size);
  var sPadding = countPadding(signature, size, signature.length);
  var rLength = size - rPadding;
  var sLength = size - sPadding;
  var rsBytes = rLength + sLength + 4;
  var shortLength = rsBytes < 0x80;
  var dst = Buffer.alloc((shortLength ? 2 : 3) + rsBytes);
  var offset = 0;
  dst[offset++] = 0x30;
  if (shortLength) {
    dst[offset++] = rsBytes;
  } else {
    dst[offset++] = 0x81;
    dst[offset++] = rsBytes & 0xFF;
  }
  dst[offset++] = 0x02;
  dst[offset++] = rLength;
  if (rPadding < 0) {
    dst[offset++] = 0;
    offset += signature.copy(dst, offset, 0, size);
  } else {
    offset += signature.copy(dst, offset, rPadding, size);
  }
  dst[offset++] = 0x02;
  dst[offset++] = sLength;
  if (sPadding < 0) {
    dst[offset++] = 0;
    signature.copy(dst, offset, size);
  } else {
    signature.copy(dst, offset, size + sPadding);
  }
  return dst;
}

module.exports = {
  convertToForge: convertToForge,
  convertToJWK: convertToJWK,
  convertToObj: convertToObj,
  convertToBuffer: convertToBuffer,
  curveSize: curveSize,
  derToConcat: derToConcat,
  concatToDer: concatToDer,
  convertToPEM: convertToPEM,
  EC_OID: EC_OID
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/ecc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ecc/index.js","../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/ecdh.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/ecdh.js - Elliptic Curve Diffie-Hellman algorithms
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var lodash = require("lodash"),
    merge = require("../util/merge"),
    util = require("../util"),
    ecUtil = require("./ec-util.js"),
    hkdf = require("./hkdf.js"),
    concat = require("./concat.js"),
    aesKw = require("./aes-kw.js"),
    helpers = require("./helpers.js"),
    CONSTANTS = require("./constants.js");

var clone = lodash.clone;
var omit = lodash.omit;
var pick = lodash.pick;

function idealHash(curve) {
  switch (curve) {
    case "P-256":
      return "SHA-256";
    case "P-384":
      return "SHA-384";
    case "P-521":
      return "SHA-512";
    default:
      throw new Error("unsupported curve: " + curve);
  }
}

// ### Exported
var ecdh = module.exports = {};

// ### Derivation algorithms
// ### "raw" ECDH
function ecdhDeriveFn() {
  var alg = {
    name: "ECDH"
  };

  var validatePublic = function(pk, form) {
    var pubKey = pk && ecUtil.convertToForge(pk, true);
    if (!pubKey || !pubKey.isValid()) {
      return Promise.reject(new Error("invalid EC public key"));
    }

    switch (form) {
      case "jwk":
        pubKey = ecUtil.convertToJWK(pk, true);
        break;
      case "buffer":
        pubKey = ecUtil.convertToBuffer(pk, true);
        break;
    }
    return Promise.resolve(pubKey);
  }

  // ### fallback implementation -- uses ecc + forge
  var fallback = function(key, props) {
    props = props || {};
    var keyLen = props.length || 0;
    // assume {key} is privateKey
    // assume {props.public} is publicKey
    var privKey = ecUtil.convertToForge(key, false);

    var p = validatePublic(props.public, "forge");
    p = p.then(function(pubKey) {
      // {pubKey} is "forge"

      var secret = privKey.computeSecret(pubKey);
      if (keyLen) {
        // truncate to requested key length
        if (secret.length < keyLen) {
          return Promise.reject(new Error("key length too large: " + keyLen));
        }
        secret = secret.slice(0, keyLen);
      }

      return secret;
    });
    return p;
  };

  // ### WebCryptoAPI implementation
  // TODO: cache CryptoKey sooner
  var webcrypto = function(key, props) {
    key = key || {};
    props = props || {};

    var keyLen = props.length || 0,
        algParams = merge(clone(alg), {
          namedCurve: key.crv
        });

    // assume {key} is privateKey
    if (!keyLen) {
      // calculate key length from private key size
      keyLen = key.d.length;
    }
    var privKey = ecUtil.convertToJWK(key, false);
    privKey = helpers.subtleCrypto.importKey("jwk",
                                             privKey,
                                             algParams,
                                             false,
                                             [ "deriveBits" ]);

    // assume {props.public} is publicKey
    var pubKey = validatePublic(props.public, "jwk");
    pubKey = pubKey.then(function(pubKey) {
      // {pubKey} is "jwk"
      return helpers.subtleCrypto.importKey("jwk",
                                            pubKey,
                                            algParams,
                                            false,
                                            []);
    });

    var p = Promise.all([privKey, pubKey]);
    p = p.then(function(keypair) {
      var privKey = keypair[0],
          pubKey = keypair[1];

      var algParams = merge(clone(alg), {
        public: pubKey
      });
      return helpers.subtleCrypto.deriveBits(algParams, privKey, keyLen * 8);
    });
    p = p.then(function(result) {
      result = Buffer.from(result);
      return result;
    });
    return p;
  };

  var nodejs = function(key, props) {
    if ("function" !== typeof helpers.nodeCrypto.createECDH) {
      throw new Error("unsupported algorithm: ECDH");
    }

    props = props || {};
    var keyLen = props.length || 0;
    var curve;
    switch (key.crv) {
      case "P-256":
        curve = "prime256v1";
        break;
      case "P-384":
        curve = "secp384r1";
        break;
      case "P-521":
        curve = "secp521r1";
        break;
      default:
        return Promise.reject(new Error("invalid curve: " + curve));
    }

    // assume {key} is privateKey
    // assume {props.public} is publicKey
    var privKey = ecUtil.convertToBuffer(key, false);

    var p = validatePublic(props.public, "buffer");
    p = p.then(function(pubKey) {
      // {pubKey} is "buffer"
      var ecdh = helpers.nodeCrypto.createECDH(curve);
      // dummy call so computeSecret doesn't fail
      // ecdh.generateKeys();
      ecdh.setPrivateKey(privKey);
      var secret = ecdh.computeSecret(pubKey);
      if (keyLen) {
        if (secret.length < keyLen) {
          return Promise.reject(new Error("key length too large: " + keyLen));
        }
        secret = secret.slice(0, keyLen);
      }
      return secret;
    });
    return p;
  };

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

function ecdhConcatDeriveFn() {
  // NOTE: no nodejs/webcrypto/fallback model, since this algorithm is
  //       implemented using other primitives

  var fn = function(key, props) {
    props = props || {};

    var hash;
    try {
      hash = props.hash || idealHash(key.crv);
      if (!hash) {
        throw new Error("invalid hash: " + hash);
      }
      hash.toUpperCase();
    } catch (ex) {
      return Promise.reject(ex);
    }

    var params = ["public"];
    // derive shared secret
    // NOTE: whitelist items from {props} for ECDH
    var promise = ecdh.ECDH.derive(key, pick(props, params));
    // expand
    promise = promise.then(function(shared) {
      // NOTE: blacklist items from {props} for ECDH
      return concat["CONCAT-" + hash].derive(shared, omit(props, params));
    });
    return promise;
  };

  return fn;
}

function ecdhHkdfDeriveFn() {
  // NOTE: no nodejs/webcrypto/fallback model, since this algorithm is
  //       implemented using other primitives

  var fn = function(key, props) {
    props = props || {};

    var hash;
    try {
      hash = props.hash || idealHash(key.crv);
      if (!hash) {
        throw new Error("invalid hash: " + hash);
      }
      hash.toUpperCase();
    } catch (ex) {
      return Promise.reject(ex);
    }

    var params = ["public"];
    // derive shared secret
    // NOTE: whitelist items from {props} for ECDH
    var promise = ecdh.ECDH.derive(key, pick(props, params));
    // extract-and-expand
    promise = promise.then(function(shared) {
      // NOTE: blacklist items from {props} for ECDH
      return hkdf["HKDF-" + hash].derive(shared, omit(props, params));
    });
    return promise;
  };

  return fn;
}

// ### Wrap/Unwrap algorithms
function doEcdhesCommonDerive(privKey, pubKey, props) {
  function prependLen(input) {
    return Buffer.concat([
      helpers.int32ToBuffer(input.length),
      input
    ]);
  }

  var algId = props.algorithm || "",
      keyLen = CONSTANTS.KEYLENGTH[algId],
      apu = util.asBuffer(props.apu || "", "base64url"),
      apv = util.asBuffer(props.apv || "", "base64url");
  var otherInfo = Buffer.concat([
    prependLen(Buffer.from(algId, "utf8")),
    prependLen(apu),
    prependLen(apv),
    helpers.int32ToBuffer(keyLen)
  ]);

  var params = {
    public: pubKey,
    length: keyLen / 8,
    hash: "SHA-256",
    otherInfo: otherInfo
  };
  return ecdh["ECDH-CONCAT"].derive(privKey, params);
}

function ecdhesDirEncryptFn() {
  // NOTE: no nodejs/webcrypto/fallback model, since this algorithm is
  //       implemented using other primitives
  var fn = function(key, pdata, props) {
    props = props || {};

    // {props.epk} is private
    if (!props.epk || !props.epk.d) {
      return Promise.reject(new Error("missing ephemeral private key"));
    }
    var epk = ecUtil.convertToObj(props.epk, false);

    // {key} is public
    if (!key || !key.x || !key.y) {
      return Promise.reject(new Error("missing static public key"));
    }
    var spk = ecUtil.convertToObj(key, true);

    // derive ECDH shared
    var promise = doEcdhesCommonDerive(epk, spk, {
      algorithm: props.enc,
      apu: props.apu,
      apv: props.apv
    });
    promise = promise.then(function(shared) {
      return {
        data: shared,
        once: true,
        direct: true
      };
    });
    return promise;
  };

  return fn;
}
function ecdhesDirDecryptFn() {
  // NOTE: no nodejs/webcrypto/fallback model, since this algorithm is
  //       implemented using other primitives
  var fn = function(key, cdata, props) {
    props = props || {};

    // {props.epk} is public
    if (!props.epk || !props.epk.x || !props.epk.y) {
      return Promise.reject(new Error("missing ephemeral public key"));
    }
    var epk = ecUtil.convertToObj(props.epk, true);

    // {key} is private
    if (!key || !key.d) {
      return Promise.reject(new Error("missing static private key"));
    }
    var spk = ecUtil.convertToObj(key, false);

    // derive ECDH shared
    var promise = doEcdhesCommonDerive(spk, epk, {
      algorithm: props.enc,
      apu: props.apu,
      apv: props.apv
    });
    promise = promise.then(function(shared) {
      return shared;
    });
    return promise;
  };

  return fn;
}

function ecdhesKwEncryptFn(wrap) {
  // NOTE: no nodejs/webcrypto/fallback model, since this algorithm is
  //       implemented using other primitives
  var fn = function(key, pdata, props) {
    props = props || {};

    // {props.epk} is private
    if (!props.epk || !props.epk.d) {
      return Promise.reject(new Error("missing ephemeral private key"));
    }
    var epk = ecUtil.convertToObj(props.epk, false);

    // {key} is public
    if (!key || !key.x || !key.y) {
      return Promise.reject(new Error("missing static public key"));
    }
    var spk = ecUtil.convertToObj(key, true);

    // derive ECDH shared
    var promise = doEcdhesCommonDerive(epk, spk, {
      algorithm: props.alg,
      apu: props.apu,
      apv: props.apv
    });
    promise = promise.then(function(shared) {
      // wrap provided key with ECDH shared
      return wrap(shared, pdata);
    });
    return promise;
  };

  return fn;
}

function ecdhesKwDecryptFn(unwrap) {
  // NOTE: no nodejs/webcrypto/fallback model, since this algorithm is
  //       implemented using other primitives
  var fn = function(key, cdata, props) {
    props = props || {};

    // {props.epk} is public
    if (!props.epk || !props.epk.x || !props.epk.y) {
      return Promise.reject(new Error("missing ephemeral public key"));
    }
    var epk = ecUtil.convertToObj(props.epk, true);

    // {key} is private
    if (!key || !key.d) {
      return Promise.reject(new Error("missing static private key"));
    }
    var spk = ecUtil.convertToObj(key, false);

    // derive ECDH shared
    var promise = doEcdhesCommonDerive(spk, epk, {
      algorithm: props.alg,
      apu: props.apu,
      apv: props.apv
    });
    promise = promise.then(function(shared) {
      // unwrap provided key with ECDH shared
      return unwrap(shared, cdata);
    });
    return promise;
  };

  return fn;
}

// ### Public API
// * [name].derive
[
  "ECDH",
  "ECDH-HKDF",
  "ECDH-CONCAT"
].forEach(function(name) {
  var kdf = /^ECDH(?:-(\w+))?$/g.exec(name || "")[1];
  var op = ecdh[name] = ecdh[name] || {};
  switch (kdf || "") {
    case "CONCAT":
      op.derive = ecdhConcatDeriveFn();
      break;
    case "HKDF":
      op.derive = ecdhHkdfDeriveFn();
      break;
    case "":
      op.derive = ecdhDeriveFn();
      break;
    default:
      op.derive = null;
  }
});

// * [name].encrypt
// * [name].decrypt
[
  "ECDH-ES",
  "ECDH-ES+A128KW",
  "ECDH-ES+A192KW",
  "ECDH-ES+A256KW"
].forEach(function(name) {
  var kw = /^ECDH-ES(?:\+(.+))?/g.exec(name || "")[1];
  var op = ecdh[name] = ecdh[name] || {};
  if (!kw) {
    op.encrypt = ecdhesDirEncryptFn();
    op.decrypt = ecdhesDirDecryptFn();
  } else {
    kw = aesKw[kw];
    if (kw) {
      op.encrypt = ecdhesKwEncryptFn(kw.encrypt);
      op.decrypt = ecdhesKwDecryptFn(kw.decrypt);
    } else {
      op.ecrypt = op.decrypt = null;
    }
  }
});
//*/

}).call(this)}).call(this,require("buffer").Buffer)
},{"../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","../util/merge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/merge.js","./aes-kw.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/aes-kw.js","./concat.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/concat.js","./constants.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/constants.js","./ec-util.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/ec-util.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js","./hkdf.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/hkdf.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/ecdsa.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/ecdsa.js - Elliptic Curve Digitial Signature Algorithms
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var ecUtil = require("./ec-util.js"),
    helpers = require("./helpers.js"),
    sha = require("./sha.js");

function idealCurve(hash) {
  switch (hash) {
    case "SHA-256":
      return "P-256";
    case "SHA-384":
      return "P-384";
    case "SHA-512":
      return "P-521";
    default:
      throw new Error("unsupported hash: " + hash);
  }
}

function ecdsaSignFN(hash) {
  var curve = idealCurve(hash);

  // ### Fallback implementation -- uses forge
  var fallback = function(key, pdata /*, props */) {
    if (curve !== key.crv) {
      return Promise.reject(new Error("invalid curve"));
    }
    var pk = ecUtil.convertToForge(key, false);

    var promise;
    // generate hash
    promise = sha[hash].digest(pdata);
    // sign hash
    promise = promise.then(function(result) {
      result = pk.sign(result);
      result = Buffer.concat([result.r, result.s]);
      return {
        data: pdata,
        mac: result
      };
    });
    return promise;
  };

  // ### WebCrypto API implementation
  var webcrypto = function(key, pdata /*, props */) {
    if (curve !== key.crv) {
      return Promise.reject(new Error("invalid curve"));
    }
    var pk = ecUtil.convertToJWK(key, false);

    var promise;
    var alg = {
      name: "ECDSA",
      namedCurve: pk.crv,
      hash: {
        name: hash
      }
    };
    promise = helpers.subtleCrypto.importKey("jwk",
                                             pk,
                                             alg,
                                             true,
                                             [ "sign" ]);
    promise = promise.then(function(key) {
      return helpers.subtleCrypto.sign(alg, key, pdata);
    });
    promise = promise.then(function(result) {
      result = Buffer.from(result);
      return {
        data: pdata,
        mac: result
      };
    });
    return promise;
  };

  var nodejs;
  var nodeHash = hash.toLowerCase().replace("-", "");
  if (helpers.nodeCrypto && helpers.nodeCrypto.getHashes().indexOf(nodeHash) > -1) {
    nodejs = function(key, pdata) {
      if (curve !== key.crv) {
        return Promise.reject(new Error("invalid curve"));
      }

      var promise;
      promise = Promise.resolve(helpers.nodeCrypto.createSign(nodeHash));
      promise = promise.then(function (sign) {
        sign.update(pdata);
        return sign;
      });

      var size;

      switch (nodeHash.slice(-3)) {
        case "384":
          size = 48;
          break;
        case "512":
          size = 66;
          break;
        default:
          size = 32;
      }

      promise = promise.then(function (sign) {
        return ecUtil.derToConcat(sign.sign(ecUtil.convertToPEM(key, true)), size);
      });

      promise = promise.then(function (result) {
        return {
          data: pdata,
          mac: result
        };
      });

      return promise;
    };
  }

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

function ecdsaVerifyFN(hash) {
  var curve = idealCurve(hash);

  // ### Fallback implementation -- uses forge
  var fallback = function(key, pdata, mac /*, props */) {
    if (curve !== key.crv) {
      return Promise.reject(new Error("invalid curve"));
    }
    var pk = ecUtil.convertToForge(key, true);

    var promise;
    // generate hash
    promise = sha[hash].digest(pdata);
    // verify hash
    promise = promise.then(function(result) {
      var len = mac.length / 2;
      var rs = {
        r: mac.slice(0, len),
        s: mac.slice(len)
      };
      if (!pk.verify(result, rs)) {
        return Promise.reject(new Error("verification failed"));
      }
      return {
        data: pdata,
        mac: mac,
        valid: true
      };
    });
    return promise;
  };

  // ### WebCrypto API implementation
  var webcrypto = function(key, pdata, mac /* , props */) {
    if (curve !== key.crv) {
      return Promise.reject(new Error("invalid curve"));
    }
    var pk = ecUtil.convertToJWK(key, true);

    var promise;
    var alg = {
      name: "ECDSA",
      namedCurve: pk.crv,
      hash: {
        name: hash
      }
    };
    promise = helpers.subtleCrypto.importKey("jwk",
                                             pk,
                                             alg,
                                             true,
                                             ["verify"]);
    promise = promise.then(function(key) {
      return helpers.subtleCrypto.verify(alg, key, mac, pdata);
    });
    promise = promise.then(function(result) {
      if (!result) {
        return Promise.reject(new Error("verification failed"));
      }
      return {
        data: pdata,
        mac: mac,
        valid: true
      };
    });
    return promise;
  };

  var nodejs;
  var nodeHash = hash.toLowerCase().replace("-", "");
  if (helpers.nodeCrypto && helpers.nodeCrypto.getHashes().indexOf(nodeHash) > -1) {
    nodejs = function(key, pdata, mac /* , props */) {
      if (curve !== key.crv) {
        return Promise.reject(new Error("invalid curve"));
      }

      var size;
      switch (nodeHash.slice(-3)) {
        case "384":
          size = 48;
          break;
        case "512":
          size = 66;
          break;
        default:
          size = 32;
      }

      var promise;
      promise = Promise.resolve(helpers.nodeCrypto.createVerify(nodeHash));
      promise = promise.then(function (verify) {
        verify.update(pdata);
        verify.end();
        return verify.verify(ecUtil.convertToPEM(key, false), ecUtil.concatToDer(mac, size));
      });
      promise = promise.then(function (result) {
        if (!result) {
          throw new Error("verification failed");
        }
        return {
          data: pdata,
          mac: mac,
          valid: true
        };
      });

      return promise;
    };
  }

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

// ### Public API
var ecdsa = {};

// * [name].sign
// * [name].verify
[
  "ES256",
  "ES384",
  "ES512"
].forEach(function(name) {
  var hash = name.replace(/ES(\d+)/g, function(m, size) {
    return "SHA-" + size;
  });
  ecdsa[name] = {
    sign: ecdsaSignFN(hash),
    verify: ecdsaVerifyFN(hash)
  };
});

module.exports = ecdsa;

}).call(this)}).call(this,require("buffer").Buffer)
},{"./ec-util.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/ec-util.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js","./sha.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/sha.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/helpers.js - Internal functions and fields used in Cryptographic
 * Algorithms
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

if (typeof Promise === "undefined") {
  require("es6-promise").polyfill();
}

// ###
exports.int32ToBuffer = function(v, b) {
  b = b || Buffer.alloc(4);
  b[0] = (v >>> 24) & 0xff;
  b[1] = (v >>> 16) & 0xff;
  b[2] = (v >>> 8) & 0xff;
  b[3] = v & 0xff;
  return b;
};

var MAX_INT32 = Math.pow(2, 32);
exports.int64ToBuffer = function(v, b) {
  b = b || Buffer.alloc(8);
  var hi = Math.floor(v / MAX_INT32),
      lo = v % MAX_INT32;
  hi = exports.int32ToBuffer(hi);
  lo = exports.int32ToBuffer(lo);
  b = Buffer.concat([hi, lo]);
  return b;
};

// ### crypto and DOMException in browsers ###
/* global crypto:false, DOMException:false */

function getCryptoSubtle() {
  if ("undefined" !== typeof crypto) {
    if ("undefined" !== typeof crypto.subtle) {
      return crypto.subtle;
    }
  }

  return undefined;
}
function getCryptoNodeJS() {
  var crypto;
  try {
    crypto = require("crypto");
  } catch (err) {
    return undefined;
  }

  if (!Object.keys(crypto).length) {
    // treat empty the same as missing
    return undefined;
  }

  return crypto;
}

var supported = {};
Object.defineProperty(exports, "subtleCrypto", {
  get: function() {
    var result;

    if ("subtleCrypto" in supported) {
      result = supported.subtleCrypto;
    } else {
      result = supported.subtleCrypto = getCryptoSubtle();
    }

    return result;
  },
  enumerable: true
});
Object.defineProperty(exports, "nodeCrypto", {
  get: function() {
    var result;

    if ("nodeCrypto" in supported) {
      result = supported.nodeCrypto;
    } else {
      result = supported.nodeCrypto = getCryptoNodeJS();
    }

    return result;
  },
  enumerable: true
});

exports.setupFallback = function(nodejs, webcrypto, fallback) {
  var impl;

  if (nodejs && exports.nodeCrypto) {
    impl = function main() {
      var args = arguments,
          promise;

      function check(err) {
        if (0 === err.message.indexOf("unsupported algorithm:")) {
          impl = fallback;
          return impl.apply(null, args);
        }

        return Promise.reject(err);
      }

      try {
        promise = Promise.resolve(nodejs.apply(null, args));
      } catch(err) {
        promise = check(err);
      }

      return promise;
    };
  } else if (webcrypto && exports.subtleCrypto) {
    impl = function main() {
      var args = arguments,
         promise;

      function check(err) {
        if (err.code === DOMException.NOT_SUPPORTED_ERR ||
            // Firefox rejects some operations erroneously complaining about inputs
            err.message === "Only ArrayBuffer and ArrayBufferView objects can be passed as CryptoOperationData" ||
            // MS Edge rejects with not an Error
            !(err instanceof Error)) {
          // not actually supported -- always use fallback
          impl = fallback;
          return impl.apply(null, args);
        }

       return Promise.reject(err);
      }

      try {
        promise = webcrypto.apply(null, args);
        promise = promise.catch(check);
      } catch(err) {
        promise = check(err);
      }

      return promise;
    };
  } else {
    impl = fallback;
  }

  return impl;
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","crypto":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browser-resolve/empty.js","es6-promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/es6-promise/dist/es6-promise.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/hkdf.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/hkdf.js - HMAC-based Extract-and-Expand Key Derivation
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var CONSTANTS = require("./constants.js"),
    hmac = require("./hmac.js");

function hkdfDeriveFn(name) {
  var hash = name.replace("HKDF-", ""),
      op = name.replace("HKDF-SHA-", "HS");

  // NOTE: no nodejs/webcrypto/fallback model, since this HKDF is
  //       implemented using the HMAC algorithms

  var fn = function(key, props) {
    var hashLen = CONSTANTS.HASHLENGTH[hash] / 8;

    if ("string" === typeof op) {
      op = hmac[op].sign;
    }

    // prepare options
    props = props || {};
    var salt = props.salt;
    if (!salt || 0 === salt.length) {
      salt = Buffer.alloc(hashLen);
    }
    var info = props.info || Buffer.alloc(0);
    var keyLen = props.length || hashLen;

    var promise;

    // Setup Expansion
    var N = Math.ceil(keyLen / hashLen),
        okm = [],
        idx = 0;
    function expand(key, T) {
      if (N === idx++) {
        return Buffer.concat(okm).slice(0, keyLen);
      }

      if (!T) {
        T = Buffer.alloc(0);
      }
      T = Buffer.concat([T, info, Buffer.from([idx])]);
      T = op(key, T);
      T = T.then(function(result) {
        T = result.mac;
        okm.push(T);

        return expand(key, T);
      });
      return T;
    }

    // Step 1: Extract
    promise = op(salt, key, { length: salt.length * 8 });
    promise = promise.then(function(result) {
      // Step 2: Expand
      return expand(result.mac);
    });

    return promise;
  };

  return fn;
}

// Public API
// * [name].derive
var hkdf = {};
[
  "HKDF-SHA-1",
  "HKDF-SHA-256",
  "HKDF-SHA-384",
  "HKDF-SHA-512"
].forEach(function(name) {
  hkdf[name] = {
    derive: hkdfDeriveFn(name)
  };
});

module.exports = hkdf;

}).call(this)}).call(this,require("buffer").Buffer)
},{"./constants.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/constants.js","./hmac.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/hmac.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/hmac.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/hmac.js - HMAC-based "signatures"
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var CONSTANTS = require("./constants"),
    forge = require("../deps/forge.js"),
    DataBuffer = require("../util/databuffer.js"),
    helpers = require("./helpers.js");

function hmacSignFN(name) {
  var md = name.replace("HS", "SHA").toLowerCase(),
      hash = name.replace("HS", "SHA-");

  function checkKeyLength(len, key) {
    len = (len || CONSTANTS.HASHLENGTH[hash]) / 8;
    if (len > key.length) {
      return Promise.reject(new Error("invalid key length"));
    }

    return Promise.resolve(key);
  }

  // ### Fallback Implementation -- uses forge
  var fallback = function(key, pdata, props) {
    props = props || {};
    var promise;
    promise = checkKeyLength(props.length, key);
    promise = promise.then(function() {
      var sig = forge.hmac.create();
      sig.start(md, key.toString("binary"));
      sig.update(pdata.toString("binary"));
      sig = Buffer.from(sig.digest().bytes(), "binary");

      return {
        data: pdata,
        mac: sig
      }
    });
    return promise;
  };

  // ### WebCryptoAPI Implementation
  var webcrypto = function(key, pdata, props) {
    props = props || {};

    var alg = {
      name: "HMAC",
      hash: {
        name: hash
      }
    };
    var promise;
    promise = checkKeyLength(props.length, key);
    promise = promise.then(function() {
      return helpers.subtleCrypto.importKey("raw", key, alg, true, ["sign"]);
    });
    promise = promise.then(function(key) {
      return helpers.subtleCrypto.sign(alg, key, pdata);
    });
    promise = promise.then(function(result) {
      var sig = Buffer.from(result);
      return {
        data: pdata,
        mac: sig
      };
    });

    return promise;
  };

  // ### NodeJS implementation
  var nodejs = function(key, pdata, props) {
    props = props || {};

    var promise;
    promise = checkKeyLength(props.length, key);
    promise = promise.then(function() {
      var hmac = helpers.nodeCrypto.createHmac(md, key);
      hmac.update(pdata);

      var sig = hmac.digest();
      return {
        data: pdata,
        mac: sig
      };
    });
    return promise;
  };

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

function hmacVerifyFN(name) {
  var md = name.replace("HS", "SHA").toLowerCase(),
      hash = name.replace("HS", "SHA-");

  function compare(len, expected, actual) {
    len = (len || CONSTANTS.HASHLENGTH[hash]) / 8;
    var valid = true;
    for (var idx = 0; len > idx; idx++) {
      valid = valid && (expected[idx] === actual[idx]);
    }
    return valid;
  }

  // ### Fallback Implementation -- uses forge
  var fallback = function(key, pdata, mac, props) {
    props = props || {};

    var vrfy = forge.hmac.create();
    vrfy.start(md, new DataBuffer(key));
    vrfy.update(pdata.toString("binary"));
    vrfy = Buffer.from(vrfy.digest().bytes(), "binary");

    if (compare(props.length, mac, vrfy)) {
      return Promise.resolve({
        data: pdata,
        mac: mac,
        valid: true
      });
    } else {
      return Promise.reject(new Error("verification failed"));
    }
  };

  var webcrypto = function(key, pdata, mac, props) {
    props = props || {};

    var alg = {
      name: "HMAC",
      hash: {
        name: hash
      }
    };
    var promise;
    if (props.length) {
      promise = helpers.subtleCrypto.importKey("raw", key, alg, true, ["sign"]);
      promise = promise.then(function(key) {
        return helpers.subtleCrypto.sign(alg, key, pdata);
      });
      promise = promise.then(function(result) {
        var sig = Buffer.from(result);
        return compare(props.length, mac, sig);
      });
    } else {
      promise = helpers.subtleCrypto.importKey("raw", key, alg, true, ["verify"]);
      promise = promise.then(function(key) {
        return helpers.subtleCrypto.verify(alg, key, mac, pdata);
      });
    }
    promise = promise.then(function(result) {
      if (!result) {
        return Promise.reject(new Error("verifaction failed"));
      }

      return {
        data: pdata,
        mac: mac,
        valid: true
      };
    });

    return promise;
  };

  var nodejs = function(key, pdata, mac, props) {
    props = props || {};

    var hmac = helpers.nodeCrypto.createHmac(md, key);
    hmac.update(pdata);

    var sig = hmac.digest();
    if (!compare(props.length, mac, sig)) {
      throw new Error("verification failed");
    }
    return {
      data: pdata,
      mac: sig,
      valid: true
    };
  };

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

// ### Public API
// * [name].sign
// * [name].verify
var hmac = {};
[
  "HS1",
  "HS256",
  "HS384",
  "HS512"
].forEach(function(alg) {
  hmac[alg] = {
    sign: hmacSignFN(alg),
    verify: hmacVerifyFN(alg)
  };
});

module.exports = hmac;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","../util/databuffer.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/databuffer.js","./constants":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/constants.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/index.js":[function(require,module,exports){
/*!
 * algorithms/index.js - Cryptographic Algorithms Entry Point
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

// setup implementations
var implementations = [
  require("./aes-cbc-hmac-sha2.js"),
  require("./aes-gcm.js"),
  require("./aes-kw.js"),
  require("./concat.js"),
  require("./dir.js"),
  require("./ecdh.js"),
  require("./ecdsa.js"),
  require("./hkdf.js"),
  require("./hmac.js"),
  require("./pbes2.js"),
  require("./rsaes.js"),
  require("./rsassa.js"),
  require("./sha.js")
];

var ALGS_DIGEST = {};
var ALGS_DERIVE = {};
var ALGS_SIGN = {},
    ALGS_VRFY = {};
var ALGS_ENC = {},
    ALGS_DEC = {};

implementations.forEach(function(mod) {
  Object.keys(mod).forEach(function(alg) {
    var op = mod[alg];

    if ("function" === typeof op.encrypt) {
      ALGS_ENC[alg] = op.encrypt;
    }
    if ("function" === typeof op.decrypt) {
      ALGS_DEC[alg] = op.decrypt;
    }
    if ("function" === typeof op.sign) {
      ALGS_SIGN[alg] = op.sign;
    }
    if ("function" === typeof op.verify) {
      ALGS_VRFY[alg] = op.verify;
    }
    if ("function" === typeof op.digest) {
      ALGS_DIGEST[alg] = op.digest;
    }
    if ("function" === typeof op.derive) {
      ALGS_DERIVE[alg] = op.derive;
    }
  });
});

// public API
exports.digest = function(alg, data, props) {
  var op = ALGS_DIGEST[alg];
  if (!op) {
    return Promise.reject(new Error("unsupported algorithm: " + alg));
  }

  return op(data, props);
};

exports.derive = function(alg, key, props) {
  var op = ALGS_DERIVE[alg];
  if (!op) {
    return Promise.reject(new Error("unsupported algorithm: " + alg));
  }

  return op(key, props);
};

exports.sign = function(alg, key, pdata, props) {
  var op = ALGS_SIGN[alg];
  if (!op) {
    return Promise.reject(new Error("unsupported algorithm: " + alg));
  }

  return op(key, pdata, props || {});
};

exports.verify = function(alg, key, pdata, mac, props) {
  var op = ALGS_VRFY[alg];
  if (!op) {
    return Promise.reject(new Error("unsupported algorithm: " + alg));
  }

  return op(key, pdata, mac, props || {});
};

exports.encrypt = function(alg, key, pdata, props) {
  var op = ALGS_ENC[alg];
  if (!op) {
    return Promise.reject(new Error("unsupported algorithm: " + alg));
  }

  return op(key, pdata, props || {});
};

exports.decrypt = function(alg, key, cdata, props) {
  var op = ALGS_DEC[alg];
  if (!op) {
    return Promise.reject(new Error("unsupported algorithm: " + alg));
  }

  return op(key, cdata, props || {});
};

},{"./aes-cbc-hmac-sha2.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/aes-cbc-hmac-sha2.js","./aes-gcm.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/aes-gcm.js","./aes-kw.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/aes-kw.js","./concat.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/concat.js","./dir.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/dir.js","./ecdh.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/ecdh.js","./ecdsa.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/ecdsa.js","./hkdf.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/hkdf.js","./hmac.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/hmac.js","./pbes2.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/pbes2.js","./rsaes.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/rsaes.js","./rsassa.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/rsassa.js","./sha.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/sha.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/pbes2.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/pbes2.js - Password-Based Encryption (v2) Algorithms
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var forge = require("../deps/forge.js"),
    merge = require("../util/merge.js"),
    util = require("../util"),
    helpers = require("./helpers.js"),
    CONSTANTS = require("./constants.js"),
    KW = require("./aes-kw.js");

var NULL_BUFFER = Buffer.from([0]);
var DEFAULT_ITERATIONS = 8192;
var DEFAULT_SALT_LENGTH = 16;

function fixSalt(hmac, kw, salt) {
  var alg = "PBES2-" + hmac + "+" + kw;
  var output = [
    Buffer.from(alg, "utf8"),
    NULL_BUFFER,
    salt
  ];
  return Buffer.concat(output);
}

function pbkdf2Fn(hash) {
  function prepareProps(props) {
    props = props || {};
    var keyLen = props.length || 0;
    var salt = util.asBuffer(props.salt || Buffer.alloc(0), "base64u4l"),
        itrs = props.iterations || 0;

    if (0 >= keyLen) {
      throw new Error("invalid key length");
    }
    if (0 >= itrs) {
      throw new Error("invalid iteration count");
    }

    props.length = keyLen;
    props.salt = salt;
    props.iterations = itrs;

    return props;
  }

  var fallback = function(key, props) {
    try {
      props = prepareProps(props);
    } catch (err) {
      return Promise.reject(err);
    }

    var keyLen = props.length,
        salt = props.salt,
        itrs = props.iterations;

    var promise = new Promise(function(resolve, reject) {
      var md = forge.md[hash.replace("-", "").toLowerCase()].create();
      var cb = function(err, dk) {
        if (err) {
          reject(err);
        } else {
          dk = Buffer.from(dk, "binary");
          resolve(dk);
        }
      };

      forge.pkcs5.pbkdf2(key.toString("binary"),
                         salt.toString("binary"),
                         itrs,
                         keyLen,
                         md,
                         cb);
    });
    return promise;
  };
  var webcrypto = function(key, props) {
    try {
      props = prepareProps(props);
    } catch (err) {
      return Promise.reject(err);
    }

    var keyLen = props.length,
        salt = props.salt,
        itrs = props.iterations;

    var promise = Promise.resolve(key);
    promise = promise.then(function(keyval) {
      return helpers.subtleCrypto.importKey("raw", keyval, "PBKDF2", false, ["deriveBits"]);
    });
    promise = promise.then(function(key) {
      var mainAlgo = {
        name: "PBKDF2",
        salt: new Uint8Array(salt),
        iterations: itrs,
        hash: hash
      };

      return helpers.subtleCrypto.deriveBits(mainAlgo, key, keyLen * 8);
    });
    promise = promise.then(function(result) {
      return util.asBuffer(result);
    });
    return promise;
  };
  var nodejs = function(key, props) {
    if (6 > helpers.nodeCrypto.pbkdf2.length) {
      throw new Error("unsupported algorithm: PBKDF2-" + hash);
    }

    try {
      props = prepareProps(props);
    } catch (err) {
      return Promise.reject(err);
    }

    var keyLen = props.length,
        salt = props.salt,
        itrs = props.iterations;

        var md = hash.replace("-", "");
    var promise = new Promise(function(resolve, reject) {
      function cb(err, dk) {
        if (err) {
          reject(err);
        } else {
          resolve(dk);
        }
      }
      helpers.nodeCrypto.pbkdf2(key, salt, itrs, keyLen, md, cb);
    });
    return promise;
  };

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

function pbes2EncryptFN(hmac, kw) {
  var deriveAlg = "PBKDF2-" + hmac.replace("HS", "SHA-");
  var keyLen = CONSTANTS.KEYLENGTH[kw] / 8;

  return function(key, pdata, props) {
    props = props || {};

    var salt = util.asBuffer(props.p2s || Buffer.alloc(0), "base64url"),
      itrs = props.p2c || DEFAULT_ITERATIONS;

    if (0 >= itrs) {
      throw new Error("invalid iteration count");
    }
    if (0 === salt.length) {
      salt = util.randomBytes(DEFAULT_SALT_LENGTH);
    } else if (8 > salt.length) {
      throw new Error("salt too small");
    }
    var header = {
      p2s: util.base64url.encode(salt),
      p2c: itrs
    };
    salt = fixSalt(hmac, kw, salt);
    props = merge(props, {
      salt: salt,
      iterations: itrs,
      length: keyLen
    });

    var promise = Promise.resolve(key);
    // STEP 1: derive shared key
    promise = promise.then(function (key) {
      return pbes2[deriveAlg].derive(key, props);
    });
    // STEP 2: encrypt cek
    promise = promise.then(function (dk) {
      return KW[kw].encrypt(dk, pdata);
    });
    // STEP 3: (re-)apply headers
    promise = promise.then(function (results) {
      results.header = merge(results.header || {}, header);
      return results;
    });

    return promise;
  };
}

function pbes2DecryptFN(hmac, kw) {
  var deriveAlg = "PBKDF2-" + hmac.replace("HS", "SHA-");
  var keyLen = CONSTANTS.KEYLENGTH[kw] / 8;

  return function(key, cdata, props) {
    props = props || {};

    var salt = util.asBuffer(props.p2s || Buffer.alloc(0), "base64url"),
        itrs = props.p2c || 0;

    if (0 >= itrs) {
      return Promise.reject(new Error("invalid iteration count"));
    }

    if (8 > salt.length) {
      return Promise.reject(new Error("salt too small"));
    }
    salt = fixSalt(hmac, kw, salt);
    props = merge(props, {
      salt: salt,
      iterations: itrs,
      length: keyLen
    });

    var promise = Promise.resolve(key);

    // STEP 1: derived shared key
    promise = promise.then(function(key) {
      return pbes2[deriveAlg].derive(key, props);
    });
    // STEP 2: decrypt cek
    promise = promise.then(function(dk) {
      return KW[kw].decrypt(dk, cdata);
    });

    return promise;
  };
}

// ### Public API
var pbes2 = {};

// * [name].derive
[
  "PBKDF2-SHA-256",
  "PBKDF2-SHA-384",
  "PBKDF2-SHA-512"
].forEach(function(alg) {
  var hash = alg.replace("PBKDF2-", "");
  pbes2[alg] = {
    derive: pbkdf2Fn(hash)
  };
});

// [name].encrypt
// [name].decrypt
[
  "PBES2-HS256+A128KW",
  "PBES2-HS384+A192KW",
  "PBES2-HS512+A256KW"
].forEach(function(alg) {
  var parts = /PBES2-(HS\d+)\+(A\d+KW)/g.exec(alg);
  var hmac = parts[1],
      kw = parts[2];
  pbes2[alg] = {
    encrypt: pbes2EncryptFN(hmac, kw),
    decrypt: pbes2DecryptFN(hmac, kw)
  };
});

module.exports = pbes2;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","../util/merge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/merge.js","./aes-kw.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/aes-kw.js","./constants.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/constants.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/rsa-util.js":[function(require,module,exports){
/*!
 * algorithms/rsa-util.js - RSA Utility Functions
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var clone = require("lodash").clone,
    forge = require("../deps/forge.js"),
    util = require("../util");

// ### RSA-specific Helpers
function convertToForge(key, isPublic) {
  var parts = isPublic ?
              ["n", "e"] :
              ["n", "e", "d", "p", "q", "dp", "dq", "qi"];
  parts = parts.map(function(f) {
    return new forge.jsbn.BigInteger(key[f].toString("hex"), 16);
  });

  var fn = isPublic ?
           forge.pki.rsa.setPublicKey :
           forge.pki.rsa.setPrivateKey;
  return fn.apply(forge.pki.rsa, parts);
}

function convertToJWK(key, isPublic) {
  var result = clone(key);
  var parts = isPublic ?
              ["n", "e"] :
              ["n", "e", "d", "p", "q", "dp", "dq", "qi"];
  parts.forEach(function(f) {
    result[f] = util.base64url.encode(result[f]);
  });

  // remove potentially troublesome properties
  delete result.key_ops;
  delete result.use;
  delete result.alg;

  if (isPublic) {
    delete result.d;
    delete result.p;
    delete result.q;
    delete result.dp;
    delete result.dq;
    delete result.qi;
  }

  return result;
}

function convertToPem(key, isPublic) {
  var cacheKey = isPublic ? "__cachedPublicPem" : "__cachedPrivatePem";
  if (key[cacheKey]) {
    return key[cacheKey];
  }

  var value;
  if (isPublic) {
    value = forge.pki.publicKeyToPem(convertToForge(key, isPublic));
  } else {
    value = forge.pki.privateKeyToPem(convertToForge(key, isPublic));
  }

  Object.defineProperty(key, cacheKey, { value: value });
  return value;
}

module.exports = {
  convertToForge: convertToForge,
  convertToJWK: convertToJWK,
  convertToPem: convertToPem
};

},{"../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/rsaes.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/rsaes.js - RSA Signatures
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var forge = require("../deps/forge.js"),
    helpers = require("./helpers.js"),
    DataBuffer = require("../util/databuffer.js"),
    rsaUtil = require("./rsa-util.js");

var nodeSupport = {
  "RSA-OAEP": "RSA_PKCS1_OAEP_PADDING",
  RSA1_5: "RSA_PKCS1_PADDING"
};

function nodeSupportCheck(name) {
  return helpers.nodeCrypto && helpers.nodeCrypto.constants && Object.keys(nodeSupport).indexOf(name) !== -1;
}

// ### RSAES-PKCS1-v1_5

// ### RSAES-OAEP
function rsaesEncryptFn(name) {
  var alg = {
    name: name
  };

  if ("RSA-OAEP-256" === name) {
    alg.name = "RSA-OAEP";
    alg.hash = {
      name: "SHA-256"
    };
  } else if ("RSA-OAEP" === name) {
    alg.hash = {
      name: "SHA-1"
    };
  } else {
    alg.name = "RSAES-PKCS1-v1_5";
  }

  // ### Fallback Implementation -- uses forge
  var fallback = function(key, pdata) {
    // convert pdata to byte string
    pdata = new DataBuffer(pdata).bytes();

    // encrypt it
    var pki = rsaUtil.convertToForge(key, true),
        params = {};
    if ("RSA-OAEP" === alg.name) {
      params.md = alg.hash.name.toLowerCase().replace(/-/g, "");
      params.md = forge.md[params.md].create();
    }
    var cdata = pki.encrypt(pdata, alg.name.toUpperCase(), params);

    // convert cdata to Buffer
    cdata = new DataBuffer(cdata).native();

    return Promise.resolve({
      data: cdata
    });
  };

  // ### WebCryptoAPI Implementation
  var webcrypto;
  if ("RSAES-PKCS1-v1_5" !== alg.name) {
    webcrypto = function(key, pdata) {
      key = rsaUtil.convertToJWK(key, true);
      var promise;
      promise = helpers.subtleCrypto.importKey("jwk", key, alg, true, ["encrypt"]);
      promise = promise.then(function(key) {
        return helpers.subtleCrypto.encrypt(alg, key, pdata);
      });
      promise = promise.then(function(result) {
        var cdata = Buffer.from(result);
        return {
          data: cdata
        };
      });

      return promise;
    };
  } else {
    webcrypto = null;
  }

  var nodejs;
  if (nodeSupportCheck(name)) {
    nodejs = function (key, pdata) {
      key = rsaUtil.convertToPem(key, true);

      var cdata = helpers.nodeCrypto.publicEncrypt({
        key: key,
        padding: helpers.nodeCrypto.constants[nodeSupport[name]]
      }, pdata);

      return {
        data: cdata
      };
    };
  }

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

function rsaesDecryptFn(name) {
  var alg = {
    name: name
  };

  if ("RSA-OAEP-256" === name) {
    alg.name = "RSA-OAEP";
    alg.hash = {
      name: "SHA-256"
    };
  } else if ("RSA-OAEP" === name) {
    alg.hash = {
      name: "SHA-1"
    };
  } else {
    alg.name = "RSAES-PKCS1-v1_5";
  }

  // ### Fallback Implementation -- uses forge
  var fallback = function(key, cdata) {
    // convert cdata to byte string
    cdata = new DataBuffer(cdata).bytes();

    // decrypt it
    var pki = rsaUtil.convertToForge(key, false),
        params = {};
    if ("RSA-OAEP" === alg.name) {
      params.md = alg.hash.name.toLowerCase().replace(/-/g, "");
      params.md = forge.md[params.md].create();
    }
    var pdata = pki.decrypt(cdata, alg.name.toUpperCase(), params);

    // convert pdata to Buffer
    pdata = new DataBuffer(pdata).native();

    return Promise.resolve(pdata);
  };

  // ### WebCryptoAPI Implementation
  var webcrypto;
  if ("RSAES-PKCS1-v1_5" !== alg.name) {
    webcrypto = function(key, pdata) {
      key = rsaUtil.convertToJWK(key, false);
      var promise;
      promise = helpers.subtleCrypto.importKey("jwk", key, alg, true, ["decrypt"]);
      promise = promise.then(function(key) {
        return helpers.subtleCrypto.decrypt(alg, key, pdata);
      });
      promise = promise.then(function(result) {
        var pdata = Buffer.from(result);
        return pdata;
      });

      return promise;
    };
  } else {
    webcrypto = null;
  }

  var nodejs;
  if (nodeSupportCheck(name)) { // node ^6.12.0 || >= 8.0.0
    nodejs = function(key, pdata) {
      key = rsaUtil.convertToPem(key, false);
      return helpers.nodeCrypto.privateDecrypt({
        key: key,
        padding: helpers.nodeCrypto.constants[nodeSupport[name]]
      }, pdata);
    };
  } else if (helpers.nodeCrypto && name === "RSA-OAEP") { // node (>= 6.0.0 && < 6.12.0) || ^7.0.0
    nodejs = function(key, pdata) {
      key = rsaUtil.convertToPem(key, false);
      return helpers.nodeCrypto.privateDecrypt(key, pdata);
    };
  }

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

// ### Public API
// * [name].encrypt
// * [name].decrypt
var rsaes = {};
[
  "RSA-OAEP",
  "RSA-OAEP-256",
  "RSA1_5"
].forEach(function(name) {
  rsaes[name] = {
    encrypt: rsaesEncryptFn(name),
    decrypt: rsaesDecryptFn(name)
  };
});

module.exports = rsaes;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","../util/databuffer.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/databuffer.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js","./rsa-util.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/rsa-util.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/rsassa.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/rsassa.js - RSA Signatures
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var forge = require("../deps/forge.js"),
    CONSTANTS = require("./constants"),
    helpers = require("./helpers.js"),
    rsaUtil = require("./rsa-util.js");

function nodePSSsupport() {
  return helpers.nodeCrypto && helpers.nodeCrypto.constants && helpers.nodeCrypto.constants.RSA_PSS_SALTLEN_DIGEST;
}

// ### RSASSA-PKCS1-v1_5

function rsassaV15SignFn(name) {
  var md = name.replace("RS", "SHA").toLowerCase(),
      hash = name.replace("RS", "SHA-");

  var alg = {
    name: "RSASSA-PKCS1-V1_5",
    hash: {
      name: hash
    }
  };

  // ### Fallback Implementation -- uses forge
  var fallback = function(key, pdata) {
    // create the digest
    var digest = forge.md[md].create();
    digest.start();
    digest.update(pdata);

    // sign it
    var pki = rsaUtil.convertToForge(key, false);
    var sig = pki.sign(digest, "RSASSA-PKCS1-V1_5");
    sig = Buffer.from(sig, "binary");

    return Promise.resolve({
      data: pdata,
      mac: sig
    });
  };

  // ### WebCryptoAPI Implementation
  var webcrypto = function(key, pdata) {
    key = rsaUtil.convertToJWK(key, false);
    var promise;
    promise = helpers.subtleCrypto.importKey("jwk", key, alg, true, ["sign"]);
    promise = promise.then(function(key) {
      return helpers.subtleCrypto.sign(alg, key, pdata);
    });
    promise = promise.then(function(result) {
      var sig = Buffer.from(result);
      return {
        data: pdata,
        mac: sig
      };
    });

    return promise;
  };

  var nodejs;
  var nodeHash = "RSA-" + hash.replace("-", "");
  if (helpers.nodeCrypto && helpers.nodeCrypto.getHashes().indexOf(nodeHash) > -1) {
    nodejs = function(key, pdata) {
      var sign = helpers.nodeCrypto.createSign(nodeHash);
      sign.update(pdata);

      return {
        data: pdata,
        mac: sign.sign(rsaUtil.convertToPem(key, false))
      };
    };
  }

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

function rsassaV15VerifyFn(name) {
  var md = name.replace("RS", "SHA").toLowerCase(),
      hash = name.replace("RS", "SHA-");
  var alg = {
    name: "RSASSA-PKCS1-V1_5",
    hash: {
      name: hash
    }
  };

  // ### Fallback implementation -- uses forge
  var fallback = function(key, pdata, mac) {
    // create the digest
    var digest = forge.md[md].create();
    digest.start();
    digest.update(pdata);
    digest = digest.digest().bytes();

    // verify it
    var pki = rsaUtil.convertToForge(key, true);
    var sig = mac.toString("binary");
    var result = pki.verify(digest, sig, "RSASSA-PKCS1-V1_5");
    if (!result) {
      return Promise.reject(new Error("verification failed"));
    }
    return Promise.resolve({
      data: pdata,
      mac: mac,
      valid: true
    });
  };

  // ### WebCryptoAPI Implementation
  var webcrypto = function(key, pdata, mac) {
    key = rsaUtil.convertToJWK(key, true);
    var promise;
    promise = helpers.subtleCrypto.importKey("jwk", key, alg, true, ["verify"]);
    promise = promise.then(function(key) {
      return helpers.subtleCrypto.verify(alg, key, mac, pdata);
    });
    promise = promise.then(function(result) {
      if (!result) {
        return Promise.reject(new Error("verification failed"));
      }

      return {
        data: pdata,
        mac: mac,
        valid: true
      };
    });

    return promise;
  };

  var nodejs;
  if (helpers.nodeCrypto && helpers.nodeCrypto.getHashes().indexOf(md) > -1) {
    nodejs = function(key, pdata, mac) {
      var verify = helpers.nodeCrypto.createVerify(md);
      verify.update(pdata);
      verify.end();
      var result = verify.verify(rsaUtil.convertToPem(key, true), mac);
      if (!result) {
        return Promise.reject(new Error("verification failed"));
      }

      return {
        data: pdata,
        mac: mac,
        valid: true
      };
    };
  }

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

// ### RSA-PSS
function rsassaPssSignFn(name) {
  var md = name.replace("PS", "SHA").toLowerCase(),
      hash = name.replace("PS", "SHA-");

  var alg = {
    name: "RSA-PSS",
    hash: {
      name: hash
    },
    saltLength: CONSTANTS.HASHLENGTH[hash] / 8
  };

  // ### Fallback implementation -- uses forge
  var fallback = function (key, pdata) {
    // create the digest
    var digest = forge.md[md].create();
    digest.start();
    digest.update(pdata);

    // setup padding
    var pss = forge.pss.create({
      md: forge.md[md].create(),
      mgf: forge.mgf.mgf1.create(forge.md[md].create()),
      saltLength: CONSTANTS.HASHLENGTH[hash] / 8
    });

    // sign it
    var pki = rsaUtil.convertToForge(key, false);
    var sig = pki.sign(digest, pss);
    sig = Buffer.from(sig, "binary");

    return Promise.resolve({
      data: pdata,
      mac: sig
    });
  };

  // ### WebCryptoAPI Implementation
  var webcrypto = function(key, pdata) {
    key = rsaUtil.convertToJWK(key, false);
    var promise;
    promise = helpers.subtleCrypto.importKey("jwk", key, alg, true, ["sign"]);
    promise = promise.then(function (key) {
      return helpers.subtleCrypto.sign(alg, key, pdata);
    });
    promise = promise.then(function (result) {
      var sig = Buffer.from(result);
      return {
        data: pdata,
        mac: sig
      };
    });

    return promise;
  };

  var nodejs;
  var nodeHash = "RSA-" + hash.replace("-", "");
  if (nodePSSsupport()) {
    nodejs = function(key, pdata) {
      var sign = helpers.nodeCrypto.createSign(nodeHash);
      sign.update(pdata);

      var sig = sign.sign({
        key: rsaUtil.convertToPem(key, false),
        padding: helpers.nodeCrypto.constants.RSA_PKCS1_PSS_PADDING,
        saltLength: helpers.nodeCrypto.constants.RSA_PSS_SALTLEN_DIGEST
      });

      return {
        data: pdata,
        mac: sig
      };
    };
  }

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

function rsassaPssVerifyFn(name) {
  var md = name.replace("PS", "SHA").toLowerCase(),
      hash = name.replace("PS", "SHA-");

  var alg = {
    name: "RSA-PSS",
    hash: {
      name: hash
    },
    saltLength: CONSTANTS.HASHLENGTH[hash] / 8
  };

  // ### Fallback implementation -- uses forge
  var fallback = function (key, pdata, mac) {
    // create the digest
    var digest = forge.md[md].create();
    digest.start();
    digest.update(pdata);
    digest = digest.digest().bytes();

    // setup padding
    var pss = forge.pss.create({
      md: forge.md[md].create(),
      mgf: forge.mgf.mgf1.create(forge.md[md].create()),
      saltLength: CONSTANTS.HASHLENGTH[hash] / 8
    });

    // verify it
    var pki = rsaUtil.convertToForge(key, true);
    var sig = mac.toString("binary");
    var result = pki.verify(digest, sig, pss);
    if (!result) {
      return Promise.reject(new Error("verification failed"));
    }
    return Promise.resolve({
      data: pdata,
      mac: mac,
      valid: true
    });
  };

  // ### WebCryptoAPI Implementation
  var webcrypto = function(key, pdata, mac) {
    key = rsaUtil.convertToJWK(key, true);
    var promise;
    promise = helpers.subtleCrypto.importKey("jwk", key, alg, true, ["verify"]);
    promise = promise.then(function (key) {
      return helpers.subtleCrypto.verify(alg, key, mac, pdata);
    });
    promise = promise.then(function (result) {
      if (!result) {
        return Promise.reject(new Error("verification failed"));
      }

      return {
        data: pdata,
        mac: mac,
        valid: true
      };
    });

    return promise;
  };

  var nodejs;
  if (nodePSSsupport()) {
    nodejs = function(key, pdata, mac) {
      var verify = helpers.nodeCrypto.createVerify(md);
      verify.update(pdata);
      verify.end();
      var result = verify.verify({
        key: rsaUtil.convertToPem(key, true),
        padding: helpers.nodeCrypto.constants.RSA_PKCS1_PSS_PADDING,
        saltLength: helpers.nodeCrypto.constants.RSA_PSS_SALTLEN_DIGEST
      }, mac);
      if (!result) {
        return Promise.reject(new Error("verification failed"));
      }

      return {
        data: pdata,
        mac: mac,
        valid: true
      };
    };
  }

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

// ### Public API
// * [name].sign
// * [name].verify
var rsassa = {};
[
  "PS256",
  "PS384",
  "PS512"
].forEach(function(name) {
  rsassa[name] = {
    sign: rsassaPssSignFn(name),
    verify: rsassaPssVerifyFn(name)
  };
});

[
  "RS256",
  "RS384",
  "RS512"
].forEach(function(name) {
  rsassa[name] = {
    sign: rsassaV15SignFn(name),
    verify: rsassaV15VerifyFn(name)
  };
});

module.exports = rsassa;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","./constants":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/constants.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js","./rsa-util.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/rsa-util.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/sha.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * algorithms/sha.js - Cryptographic Secure Hash Algorithms, versions 1 and 2
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var forge = require("../deps/forge.js"),
    helpers = require("./helpers.js");

function hashDigestFN(hash) {
  var md = hash.replace("SHA-", "SHA").toLowerCase();

  var alg = {
    name: hash
  };

  // ### Fallback Implementation -- uses forge
  var fallback = function(pdata /* props */) {
    var digest = forge.md[md].create();
    digest.update(pdata.toString("binary"));
    digest = Buffer.from(digest.digest().bytes(), "binary");

    return Promise.resolve(digest);
  };

  // ### WebCryptoAPI Implementation
  var webcrypto = function(pdata /* props */) {
    var promise;
    promise = helpers.subtleCrypto.digest(alg, pdata);
    promise = promise.then(function(result) {
      result = Buffer.from(result);
      return result;
    });
    return promise;
  };

  // ### nodejs Implementation
  var nodejs = function(pdata /* props */) {
    var digest = helpers.nodeCrypto.createHash(md);
    digest.update(pdata);
    return digest.digest();
  };

  return helpers.setupFallback(nodejs, webcrypto, fallback);
}

// Public API
// * [name].digest
var sha = {};
[
  "SHA-1",
  "SHA-256",
  "SHA-384",
  "SHA-512"
].forEach(function(name) {
  sha[name] = {
    digest: hashDigestFN(name)
  };
});

module.exports = sha;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/gcm/helpers.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * deps/ciphermodes/gcm/helpers.js - AES-GCM Helper Functions
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var Long = require("long"),
    fill = require("lodash").fill,
    pack = require("../pack.js");

var E1 = 0xe1000000,
    E1B = 0xe1,
    E1L = new Long(E1 >> 8);

function generateLookup() {
  var lookup = [];

  for (var c = 0; c < 256; ++c) {
    var v = 0;
    for (var i = 7; i >= 0; --i) {
      if ((c & (1 << i)) !== 0) {
        v ^= (E1 >>> (7 - i));
      }
    }
    lookup.push(v);
  }

  return lookup;
}

var helpers = module.exports = {
  // ### Constants
  E1: E1,
  E1B: E1B,
  E1L: E1L,
  LOOKUP: generateLookup(),

  // ### Array Helpers
  arrayCopy: function(src, srcPos, dest, destPos, length) {
    // Start by checking for negatives since arrays in JS auto-expand
    if (srcPos < 0 || destPos < 0 || length < 0) {
      throw new TypeError("Invalid input.");
    }

    if (dest instanceof Uint8Array) {
      // Check for overflow if dest is a typed-array
      if (destPos >= dest.length || (destPos + length) > dest.length) {
        throw new TypeError("Invalid input.");
      }

      if (srcPos !== 0 || length < src.length) {
        if (src instanceof Uint8Array) {
          src = src.subarray(srcPos, srcPos + length);
        } else {
          src = src.slice(srcPos, srcPos + length);
        }
      }

      dest.set(src, destPos);
    } else {
      for (var i = 0; i < length; ++i) {
        dest[destPos + i] = src[srcPos + i];
      }
    }
  },
  arrayEqual: function(a1, a2) {
    a1 = a1 || [];
    a2 = a2 || [];

    var len = Math.min(a1.length, a2.length),
        result = (a1.length === a2.length);

    for (var idx = 0; idx < len; idx++) {
      result = result &&
               ("undefined" !== typeof a1[idx]) &&
               ("undefined" !== typeof a2[idx]) &&
               (a1[idx] === a2[idx]);
    }

    return result;
  },

  // ### Conversions
  asBytes: function(x, z) {
    switch (arguments.length) {
      case 1:
        z = Buffer.alloc(16);
        pack.intToBigEndian(x, z, 0);
        return z;
      case 2:
        pack.intToBigEndian(x, z, 0);
        break;
      default:
        throw new TypeError("Expected 1 or 2 arguments.");
    }
  },
  asInts: function(x, z) {
    switch (arguments.length) {
      case 1:
        z = [];
        fill(z, 0, 0, 4);
        pack.bigEndianToInt(x, 0, z);
        return z;
      case 2:
        pack.bigEndianToInt(x, 0, z);
        break;
      default:
        throw new TypeError("Expected 1 or 2 arguments.");
    }
  },
  oneAsInts: function() {
    var tmp = [];
    for (var c = 0; c < 4; ++c) {
        tmp.push(1 << 31);
    }
    return tmp;
  },

  // ## Bit-wise
  shiftRight: function(x, z) {
    var b, c;
    switch (arguments.length) {
      case 1:
        b = x[0];
        x[0] = b >>> 1;
        c = b << 31;
        b = x[1];
        x[1] = (b >>> 1) | c;
        c = b << 31;
        b = x[2];
        x[2] = (b >>> 1) | c;
        c = b << 31;
        b = x[3];
        x[3] = (b >>> 1) | c;
        return (b << 31) & 0xffffffff;
      case 2:
        b = x[0];
        z[0] = b >>> 1;
        c = b << 31;
        b = x[1];
        z[1] = (b >>> 1) | c;
        c = b << 31;
        b = x[2];
        z[2] = (b >>> 1) | c;
        c = b << 31;
        b = x[3];
        z[3] = (b >>> 1) | c;
        return (b << 31) & 0xffffffff;
      default:
        throw new TypeError("Expected 1 or 2 arguments.");
    }
  },
  shiftRightN: function(x, n, z) {
    var nInv, b, c;
    switch (arguments.length) {
      case 2:
        b = x[0];
        nInv = 32 - n;
        x[0] = b >>> n;
        c = b << nInv;
        b = x[1];
        x[1] = (b >>> n) | c;
        c = b << nInv;
        b = x[2];
        x[2] = (b >>> n) | c;
        c = b << nInv;
        b = x[3];
        x[3] = (b >>> n) | c;
        return b << nInv;
      case 3:
        b = x[0];
        nInv = 32 - n;
        z[0] = b >>> n;
        c = b << nInv;
        b = x[1];
        z[1] = (b >>> n) | c;
        c = b << nInv;
        b = x[2];
        z[2] = (b >>> n) | c;
        c = b << nInv;
        b = x[3];
        z[3] = (b >>> n) | c;
        return b << nInv;
      default:
        throw new TypeError("Expected 2 or 3 arguments.");
    }
  },
  xor: function(x, y, z) {
    switch (arguments.length) {
      case 2:
        x[0] ^= y[0];
        x[1] ^= y[1];
        x[2] ^= y[2];
        x[3] ^= y[3];
        break;
      case 3:
        z[0] = x[0] ^ y[0];
        z[1] = x[1] ^ y[1];
        z[2] = x[2] ^ y[2];
        z[3] = x[3] ^ y[3];
        break;
      default:
        throw new TypeError("Expected 2 or 3 arguments.");
    }
  },

  multiply: function(x, y) {
    var r0 = x.slice();
    var r1 = [];

    for (var i = 0; i < 4; ++i) {
      var bits = y[i];
      for (var j = 31; j >= 0; --j) {
        if ((bits & (1 << j)) !== 0) {
          helpers.xor(r1, r0);
        }

        if (helpers.shiftRight(r0) !== 0) {
          r0[0] ^= helpers.E1;
        }
      }
    }

    helpers.arrayCopy(r1, 0, x, 0, 4);
  },
  multiplyP: function(x, y) {
    switch (arguments.length) {
      case 1:
        if (helpers.shiftRight(x) !== 0) {
          x[0] ^= helpers.E1;
        }
        break;
      case 2:
        if (helpers.shiftRight(x, y) !== 0) {
          y[0] ^= helpers.E1;
        }
        break;
      default:
        throw new TypeError("Expected 1 or 2 arguments.");
    }
  },
  multiplyP8: function(x, y) {
    var c;
    switch (arguments.length) {
      case 1:
        c = helpers.shiftRightN(x, 8);
        x[0] ^= helpers.LOOKUP[c >>> 24];
        break;
      case 2:
        c = helpers.shiftRightN(x, 8, y);
        y[0] ^= helpers.LOOKUP[c >>> 24];
        break;
      default:
        throw new TypeError("Expected 1 or 2 arguments.");
    }
  }
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"../pack.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/pack.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js","long":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/long/src/long.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/gcm/index.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * deps/ciphermodes/gcm/index.js - AES-GCM implementation Entry Point
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
 "use strict";

var Long = require("long"),
    forge = require("../../../deps/forge.js"),
    multipliers = require("./multipliers.js"),
    helpers = require("./helpers.js"),
    pack = require("../pack.js"),
    DataBuffer = require("../../../util/databuffer.js"),
    cipherHelpers = require("../helpers.js");

var BLOCK_SIZE = 16;

// ### GCM Mode
// ### Constructor
function Gcm(options) {
  options = options || {};

  this.name = "GCM";
  this.cipher = options.cipher;
  this.blockSize = this.blockSize || 16;
}

// ### exports
module.exports = {
  createCipher: function(options) {
    var alg = new forge.aes.Algorithm("AES-GCM", Gcm);
    alg.initialize({
      key: new DataBuffer(options.key)
    });
    alg.mode.start(options);

    return alg.mode;
  },
  createDecipher: function(options) {
    var alg = new forge.aes.Algorithm("AES-GCM", Gcm);
    alg.initialize({
      key: new DataBuffer(options.key)
    });
    alg.mode._decrypt = true;
    alg.mode.start(options);

    return alg.mode;
  }
};

// ### Public API
Gcm.prototype.start = function(options) {
  this.tag = null;

  options = options || {};

  if (!("iv" in options)) {
    throw new Error("Gcm needs ParametersWithIV or AEADParameters");
  }
  this.nonce = options.iv;
  if (this.nonce == null || this.nonce.length < 1) {
    throw new Error("IV must be at least 1 byte");
  }

  // TODO: variable tagLength?
  this.tagLength = 16;

  // TODO: validate tag
  if ("tag" in options) {
    this.tag = Buffer.from(options.tag);
  }

  var bufLength = !this._decrypt ?
                  this.blockSize :
                  (this.blockSize + this.tagLength);
  this.bufBlock = Buffer.alloc(bufLength);

  var multiplier = options.multiplier;
  if (multiplier == null) {
    multiplier = new (multipliers["8k"])();
  }
  this.multiplier = multiplier;

  this.H = this.zeroBlock();
  cipherHelpers.encrypt(this.cipher, this.H, 0, this.H, 0);

  // GcmMultiplier tables don"t change unless the key changes
  // (and are expensive to init)
  this.multiplier.init(this.H);
  this.exp = null;

  this.J0 = this.zeroBlock();

  if (this.nonce.length === 12) {
    this.nonce.copy(this.J0, 0, 0, this.nonce.length);
    this.J0[this.blockSize - 1] = 0x01;
  } else {
    this.gHASH(this.J0, this.nonce, this.nonce.length);
    var X = this.zeroBlock();
    pack.longToBigEndian(new Long(this.nonce.length).
                         multiply(8), X, 8);
    this.gHASHBlock(this.J0, X);
  }

  this.S = this.zeroBlock();
  this.SAt = this.zeroBlock();
  this.SAtPre = this.zeroBlock();
  this.atBlock = this.zeroBlock();
  this.atBlockPos = 0;
  this.atLength = Long.ZERO;
  this.atLengthPre = Long.ZERO;
  this.counter = Buffer.from(this.J0);
  this.bufOff = 0;
  this.totalLength = Long.ZERO;

  if ("additionalData" in options) {
    this.processAADBytes(options.additionalData, 0, options.additionalData.length);
  }
};

Gcm.prototype.update = function(inV, inOff, len, out, outOff) {
  var resultLen = 0;

  while (len > 0) {
    var inLen = Math.min(len, this.bufBlock.length - this.bufOff);
    inV.copy(this.bufBlock, this.bufOff, inOff, inOff + inLen);
    len -= inLen;
    inOff += inLen;
    this.bufOff += inLen;
    if (this.bufOff === this.bufBlock.length) {
      this.outputBlock(out, outOff + resultLen);
      resultLen += this.blockSize;
    }
  }

  return resultLen;
};
Gcm.prototype.finish = function(out, outOff) {
  var resultLen = 0;

  if (this._decrypt) {
    // append tag
    resultLen += this.update(this.tag, 0, this.tag.length, out, outOff);
  }

  if (this.totalLength.isZero()) {
    this.initCipher();
  }

  var extra = this.bufOff;
  if (this._decrypt) {
    if (extra < this.tagLength) {
      throw new Error("data too short");
    }
    extra -= this.tagLength;
  }

  if (extra > 0) {
    this.gCTRPartial(this.bufBlock, 0, extra, out, outOff + resultLen);
    resultLen += extra;
  }

  this.atLength = this.atLength.add(this.atBlockPos);

  // Final gHASH
  var X = this.zeroBlock();
  pack.longToBigEndian(this.atLength.multiply(8),
                       X,
                       0);
  pack.longToBigEndian(this.totalLength.multiply(8),
                       X,
                       8);

  this.gHASHBlock(this.S, X);

  // TODO Fix this if tagLength becomes configurable
  // T = MSBt(GCTRk(J0,S))
  var tag = Buffer.alloc(this.blockSize);
  cipherHelpers.encrypt(this.cipher, this.J0, 0, tag, 0);
  this.xor(tag, this.S);

  if (this._decrypt) {
    if (!helpers.arrayEqual(this.tag, tag)) {
      throw new Error("mac check in Gcm failed");
    }
  } else {
    // We place into tag our calculated value for T
    this.tag = Buffer.alloc(this.tagLength);
    tag.copy(this.tag, 0, 0, this.tagLength);
  }

  return resultLen;
};

// ### "Internal" Helper Functions
Gcm.prototype.initCipher = function() {
  if (this.atLength.greaterThan(Long.ZERO)) {
    this.SAt.copy(this.SAtPre, 0, 0, this.blockSize);
    this.atLengthPre = this.atLength.add(Long.ZERO);
  }

  // Finish hash for partial AAD block
  if (this.atBlockPos > 0) {
    this.gHASHPartial(this.SAtPre, this.atBlock, 0, this.atBlockPos);
    this.atLengthPre = this.atLengthPre.add(this.atBlockPos);
  }

  if (this.atLengthPre.greaterThan(Long.ZERO)) {
    this.SAtPre.copy(this.S, 0, 0, this.blockSize);
  }
};

Gcm.prototype.outputBlock = function(output, offset) {
  if (this.totalLength.isZero()) {
    this.initCipher();
  }
  this.gCTRBlock(this.bufBlock, output, offset);
  if (!this._decrypt) {
    this.bufOff = 0;
  } else {
    this.bufBlock.copy(this.bufBlock, 0, this.blockSize, this.blockSize + this.tagLength);
    this.bufOff = this.tagLength;
  }
};

Gcm.prototype.processAADBytes = function(inV, inOff, len) {
  for (var i = 0; i < len; ++i) {
    this.atBlock[this.atBlockPos] = inV[inOff + i];
    if (++this.atBlockPos === this.blockSize) {
      // Hash each block as it fills
      this.gHASHBlock(this.SAt, this.atBlock);
      this.atBlockPos = 0;
      this.atLength = this.atLength.add(this.blockSize);
    }
  }
};

Gcm.prototype.getNextCounterBlock = function() {
  for (var i = 15; i >= 12; --i) {
    var b = ((this.counter[i] + 1) & 0xff);
    this.counter[i] = b;

    if (b !== 0) {
      break;
    }
  }

  // encrypt counter
  var outb = Buffer.alloc(this.blockSize);
  cipherHelpers.encrypt(this.cipher, this.counter, 0, outb, 0);

  return outb;
};

Gcm.prototype.gCTRBlock = function(block, out, outOff) {
  var tmp = this.getNextCounterBlock();

  this.xor(tmp, block);
  tmp.copy(out, outOff, 0, this.blockSize);

  this.gHASHBlock(this.S, !this._decrypt ? tmp : block);

  this.totalLength = this.totalLength.add(this.blockSize);
};
Gcm.prototype.gCTRPartial = function(buf, off, len, out, outOff) {
  var tmp = this.getNextCounterBlock();

  this.xor(tmp, buf, off, len);
  tmp.copy(out, outOff, 0, len);

  this.gHASHPartial(this.S, !this._decrypt ? tmp : buf, 0, len);

  this.totalLength = this.totalLength.add(len);
};

Gcm.prototype.gHASHBlock = function(Y, b) {
  this.xor(Y, b);
  this.multiplier.multiplyH(Y);
};
Gcm.prototype.gHASHPartial = function(Y, b, off, len) {
  this.xor(Y, b, off, len);
  this.multiplier.multiplyH(Y);
};

Gcm.prototype.xor = function(block, val, off, len) {
  switch (arguments.length) {
    case 2:
      for (var i = 15; i >= 0; --i) {
        block[i] ^= val[i];
      }
      break;
    case 4:
      while (len-- > 0) {
        block[len] ^= val[off + len];
      }
      break;
    default:
      throw new TypeError("Expected 2 or 4 arguments.");
  }

  return block;
};

Gcm.prototype.zeroBlock = function() {
  var block = Buffer.alloc(BLOCK_SIZE);
  return block;
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"../../../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","../../../util/databuffer.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/databuffer.js","../helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/helpers.js","../pack.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/pack.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/gcm/helpers.js","./multipliers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/gcm/multipliers.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","long":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/long/src/long.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/gcm/multipliers.js":[function(require,module,exports){
/*!
 * deps/ciphermodes/gcm/multipliers.js - AES-GCM Multipliers
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
 "use strict";

var helpers = require("./helpers.js"),
    pack = require("../pack.js");


// ### 8K Table Multiplier
function Gcm8KMultiplier() {
  this.H = [];
  this.M = null;
}

Gcm8KMultiplier.prototype.init = function(H) {
  var i, j, k;
  if (this.M == null) {
    // sc: I realize this UGLY...
    //M = new int[32][16][4];
    this.M = [];
    for (i = 0; i < 32; ++i) {
      this.M[i] = [];
      for (j = 0; j < 16; ++j) {
        this.M[i][j] = [];
        for (k = 0; k < 4; ++k) {
          this.M[i][j][k] = 0;
        }
      }
    }
  } else if (helpers.arrayEqual(this.H, H)) {
    return;
  }

  this.H = H.slice();

  // M[0][0] is ZEROES;
  // M[1][0] is ZEROES;
  helpers.asInts(H, this.M[1][8]);

  for (j = 4; j >= 1; j >>= 1) {
    helpers.multiplyP(this.M[1][j + j], this.M[1][j]);
  }
  helpers.multiplyP(this.M[1][1], this.M[0][8]);

  for (j = 4; j >= 1; j >>= 1) {
    helpers.multiplyP(this.M[0][j + j], this.M[0][j]);
  }

  i = 0;
  for (;;) {
    for (j = 2; j < 16; j += j) {
      for (k = 1; k < j; ++k) {
        helpers.xor(this.M[i][j], this.M[i][k], this.M[i][j + k]);
      }
    }

    if (++i === 32) {
      return;
    }

    if (i > 1) {
      // M[i][0] is ZEROES;
      for (j = 8; j > 0; j >>= 1) {
        helpers.multiplyP8(this.M[i - 2][j], this.M[i][j]);
      }
    }
  }
};
Gcm8KMultiplier.prototype.multiplyH = function(x) {
  var z = [];
  for (var i = 15; i >= 0; --i) {
    var m = this.M[i + i][x[i] & 0x0f];
    z[0] ^= m[0];
    z[1] ^= m[1];
    z[2] ^= m[2];
    z[3] ^= m[3];
    m = this.M[i + i + 1][(x[i] & 0xf0) >>> 4];
    z[0] ^= m[0];
    z[1] ^= m[1];
    z[2] ^= m[2];
    z[3] ^= m[3];
  }

  pack.intToBigEndian(z, x, 0);
};


module.exports = {
  "8k": Gcm8KMultiplier
};

},{"../pack.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/pack.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/gcm/helpers.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/helpers.js":[function(require,module,exports){
/*!
 * deps/ciphermodes/helpers.js - Cipher Helper Functions
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var pack = require("./pack.js");

function doEncrypt(cipher, inb, inOff, outb, outOff) {
  var input = new Array(4),
      output = new Array(4);

  pack.bigEndianToInt(inb, inOff, input);
  cipher.encrypt(input, output);
  pack.intToBigEndian(output, outb, outOff);
}

module.exports = {
  encrypt: doEncrypt
};

},{"./pack.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/pack.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ciphermodes/pack.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * deps/ciphermodes/pack.js - Pack/Unpack Functions
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var Long = require("long");

var pack = module.exports = {
  intToBigEndian: function(n, bs, off) {
    if (typeof n === "number") {
      switch (arguments.length) {
        case 1:
          bs = Buffer.alloc(4);
          pack.intToBigEndian(n, bs, 0);
          break;
        case 3:
          bs[off] = 0xff & (n >>> 24);
          bs[++off] = 0xff & (n >>> 16);
          bs[++off] = 0xff & (n >>> 8);
          bs[++off] = 0xff & (n);
          break;
        default:
          throw new TypeError("Expected 1 or 3 arguments.");
      }
    } else {
      switch (arguments.length) {
        case 1:
          bs = Buffer.alloc(4 * n.length);
          pack.intToBigEndian(n, bs, 0);
          break;
        case 3:
          for (var i = 0; i < n.length; ++i) {
            pack.intToBigEndian(n[i], bs, off);
            off += 4;
          }
          break;
        default:
          throw new TypeError("Expected 1 or 3 arguments.");
      }
    }

    return bs;
  },
  longToBigEndian: function(n, bs, off) {
    if (!Array.isArray(n)) {
      // Single
      switch (arguments.length) {
        case 1:
          bs = Buffer.alloc(8);
          pack.longToBigEndian(n, bs, 0);
          break;
        case 3:
          var lo = n.low,
              hi = n.high;
          pack.intToBigEndian(hi, bs, off);
          pack.intToBigEndian(lo, bs, off + 4);
          break;
        default:
          throw new TypeError("Expected 1 or 3 arguments.");
      }
    } else {
      // Array
      switch (arguments.length) {
        case 1:
          bs = Buffer.alloc(8 * n.length);
          pack.longToBigEndian(n, bs, 0);
          break;
        case 3:
          for (var i = 0; i < n.length; ++i) {
            pack.longToBigEndian(n[i], bs, off);
            off += 8;
          }
          break;
        default:
          throw new TypeError("Expected 1 or 3 arguments.");
      }
    }

    return bs;
  },

  bigEndianToInt: function(bs, off, ns) {
    switch (arguments.length) {
      case 2:
        var n = bs[off] << 24;
        n |= (bs[++off] & 0xff) << 16;
        n |= (bs[++off] & 0xff) << 8;
        n |= (bs[++off] & 0xff);
        return n;
      case 3:
        for (var i = 0; i < ns.length; ++i) {
          ns[i] = pack.bigEndianToInt(bs, off);
          off += 4;
        }
        break;
      default:
        throw new TypeError("Expected 2 or 3 arguments.");
    }
  },
  bigEndianToLong: function(bs, off, ns) {
    switch (arguments.length) {
      case 2:
        var hi = pack.bigEndianToInt(bs, off);
        var lo = pack.bigEndianToInt(bs, off + 4);
        var num = new Long(lo, hi);
        return num;
      case 3:
        for (var i = 0; i < ns.length; ++i) {
          ns[i] = pack.bigEndianToLong(bs, off);
          off += 8;
        }
        break;
      default:
        throw new TypeError("Expected 2 or 3 arguments.");
    }
  }
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","long":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/long/src/long.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ecc/curves.js":[function(require,module,exports){
/**
 * deps/ecc/curves.js - Elliptic Curve NIST/SECG/X9.62 Parameters
 * Original Copyright (c) 2003-2005  Tom Wu.
 * Modifications Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 *
 * Ported from Tom Wu, which is ported from BouncyCastle
 * Modified to reuse existing external NPM modules, restricted to the
 * NIST//SECG/X9.62 prime curves only, and formatted to match project
 * coding styles.
 */
"use strict";

// Named EC curves

var BigInteger = require("../../deps/forge").jsbn.BigInteger,
    ec = require("./math.js");

// ----------------
// X9ECParameters

// constructor
function X9ECParameters(curve, g, n, h) {
  this.curve = curve;
  this.g = g;
  this.n = n;
  this.h = h;
}

function x9getCurve() {
  return this.curve;
}

function x9getG() {
  return this.g;
}

function x9getN() {
  return this.n;
}

function x9getH() {
  return this.h;
}

X9ECParameters.prototype.getCurve = x9getCurve;
X9ECParameters.prototype.getG = x9getG;
X9ECParameters.prototype.getN = x9getN;
X9ECParameters.prototype.getH = x9getH;

// ----------------
// SECNamedCurves

function fromHex(s) { return new BigInteger(s, 16); }

function secp256r1() {
  // p = 2^224 (2^32 - 1) + 2^192 + 2^96 - 1
  var p = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF");
  var a = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC");
  var b = fromHex("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B");
  var n = fromHex("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551");
  var h = BigInteger.ONE;
  var curve = new ec.ECCurveFp(p, a, b);
  var G = curve.decodePointHex("04"
              + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"
              + "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5");
  return new X9ECParameters(curve, G, n, h);
}

function secp384r1() {
  // p = 2^384 - 2^128 - 2^96 + 2^32 - 1
  var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF");
  var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC");
  var b = fromHex("B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF");
  var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973");
  var h = BigInteger.ONE;
  var curve = new ec.ECCurveFp(p, a, b);
  var G = curve.decodePointHex("04"
              + "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7"
              + "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F");
  return new X9ECParameters(curve, G, n, h);
}

function secp521r1() {
  // p = 2^521 - 1
  var p = fromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
  var a = fromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC");
  var b = fromHex("0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00");
  var n = fromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409");
  var h = BigInteger.ONE;
  var curve = new ec.ECCurveFp(p, a, b);
  var G = curve.decodePointHex("04"
                + "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66"
                + "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650");
  return new X9ECParameters(curve, G, n, h);
}

// ----------------
// Public API

var CURVES = module.exports = {
  "secp256r1": secp256r1(),
  "secp384r1": secp384r1(),
  "secp521r1": secp521r1()
};

// also export NIST names
CURVES["P-256"] = CURVES.secp256r1;
CURVES["P-384"] = CURVES.secp384r1;
CURVES["P-521"] = CURVES.secp521r1;

},{"../../deps/forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","./math.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ecc/math.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ecc/index.js":[function(require,module,exports){
(function (Buffer){(function (){
/**
 * deps/ecc/index.js - Elliptic Curve Entry Point
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var forge = require("../../deps/forge"),
    BigInteger = forge.jsbn.BigInteger,
    ec = require("./math.js"),
    CURVES = require("./curves.js");

// ### Helpers
function hex2bn(s) {
  return new BigInteger(s, 16);
}

function bn2bin(bn, len) {
  if (!len) {
    len = Math.ceil(bn.bitLength() / 8);
  }
  len = len * 2;

  var hex = bn.toString(16);
  // truncate-left if too large
  hex = hex.substring(Math.max(hex.length - len, 0));
  // pad-left if too small
  while (len > hex.length) {
    hex = "0" + hex;
  }

  return Buffer.from(hex, "hex");
}
function bin2bn(s) {
  if ("string" === typeof s) {
    s = Buffer.from(s, "binary");
  }
  return hex2bn(s.toString("hex"));
}

function keySizeBytes(params) {
  return Math.ceil(params.getN().bitLength() / 8);
}

function namedCurve(curve) {
  var params = CURVES[curve];
  if (!params) {
    throw new TypeError("unsupported named curve: " + curve);
  }

  return params;
}

function normalizeEcdsa(params, md) {
  var log2n = params.getN().bitLength(),
      mdLen = md.length * 8;

  var e = bin2bn(md);
  if (log2n < mdLen) {
    e = e.shiftRight(mdLen - log2n);
  }

  return e;
}

// ### EC Public Key

/**
 *
 * @param {String} curve The named curve
 * @param {BigInteger} x The X coordinate
 * @param {BigInteger} y The Y coordinate
 */
function ECPublicKey(curve, x, y) {
  var params = namedCurve(curve),
      c = params.getCurve();
  var key = new ec.ECPointFp(c,
                             c.fromBigInteger(x),
                             c.fromBigInteger(y));

  this.curve = curve;
  this.params = params;
  this.point = key;

  var size = keySizeBytes(params);
  this.x = bn2bin(x, size);
  this.y = bn2bin(y, size);
}

// basics
ECPublicKey.prototype.isValid = function() {
  return this.params.curve.contains(this.point);
}

// ECDSA
ECPublicKey.prototype.verify = function(md, sig) {
  var N = this.params.getN(),
      G = this.params.getG();

  // prepare and validate (r, s)
  var r = bin2bn(sig.r),
      s = bin2bn(sig.s);
  if (r.compareTo(BigInteger.ONE) < 0 || r.compareTo(N) >= 0) {
    return false;
  }
  if (s.compareTo(BigInteger.ONE) < 0 || r.compareTo(N) >= 0) {
    return false;
  }

  // normalize input
  var e = normalizeEcdsa(this.params, md);
  // verify (r, s)
  var w = s.modInverse(N),
      u1 = e.multiply(w).mod(N),
      u2 = r.multiply(w).mod(N);

  var v = G.multiplyTwo(u1, this.point, u2).getX().toBigInteger();
  v = v.mod(N);

  return v.equals(r);
};

// ### EC Private Key

/**
 * @param {String} curve The named curve
 * @param {Buffer} key The private key value
 */
function ECPrivateKey(curve, key) {
  var params = namedCurve(curve);
  this.curve = curve;
  this.params = params;

  var size = keySizeBytes(params);
  this.d = bn2bin(key, size);
}

ECPrivateKey.prototype.toPublicKey = function() {
  var d = bin2bn(this.d);
  var P = this.params.getG().multiply(d);
  return new ECPublicKey(this.curve,
                         P.getX().toBigInteger(),
                         P.getY().toBigInteger());
};

// ECDSA
ECPrivateKey.prototype.sign = function(md) {
  var keysize = keySizeBytes(this.params),
      N = this.params.getN(),
      G = this.params.getG(),
      e = normalizeEcdsa(this.params, md),
      d = bin2bn(this.d);

  var r, s;
  var k, x1, z;
  do {
    do {
      // determine random nonce
      do {
        k = bin2bn(forge.random.getBytes(keysize));
      } while (k.equals(BigInteger.ZERO) || k.compareTo(N) >= 0);
      // (x1, y1) = k * G
      x1 = G.multiply(k).getX().toBigInteger();
      // r = x1 mod N
      r = x1.mod(N);
    } while (r.equals(BigInteger.ZERO));
    // s = (k^-1 * (e + r * d)) mod N
    z = d.multiply(r);
    z = e.add(z);
    s = k.modInverse(N).multiply(z).mod(N);
  } while (s.equals(BigInteger.ONE));

  // convert (r, s) to bytes
  var len = keySizeBytes(this.params);
  r = bn2bin(r, len);
  s = bn2bin(s, len);

  return {
    r: r,
    s: s
  };
};

// basics
ECPrivateKey.prototype.isValid = function() {
  var d = bin2bn(this.d),
      n1 = this.params.getN().subtract(BigInteger.ONE);

  return (d.compareTo(BigInteger.ONE) >= 0) &&
         (d.compareTo(n1) < 0);
}

// ECDH
ECPrivateKey.prototype.computeSecret = function(pubkey) {
  var d = bin2bn(this.d);
  var S = pubkey.point.multiply(d).getX().toBigInteger();
  S = bn2bin(S, keySizeBytes(this.params));
  return S;
};

// ### Public API
exports.generateKeyPair = function(curve) {
  var params = namedCurve(curve),
      n = params.getN();

  // generate random within range [1, N-1)
  var r = forge.random.getBytes(keySizeBytes(params));
  r = bin2bn(r);

  var n1 = n.subtract(BigInteger.ONE);
  var d = r.mod(n1).add(BigInteger.ONE);

  var privkey = new ECPrivateKey(curve, d),
      pubkey = privkey.toPublicKey();

  return {
    "private": privkey,
    "public": pubkey
  };
};

exports.asPublicKey = function(curve, x, y) {
  if ("string" === typeof x) {
    x = hex2bn(x);
  } else if (Buffer.isBuffer(x)) {
    x = bin2bn(x);
  }

  if ("string" === typeof y) {
    y = hex2bn(y);
  } else if (Buffer.isBuffer(y)) {
    y = bin2bn(y);
  }

  var pubkey = new ECPublicKey(curve, x, y);
  return pubkey;
};
exports.asPrivateKey = function(curve, d) {
  // Elaborate way to get to a Buffer from a (String|Buffer|BigInteger)
  if ("string" === typeof d) {
    d = hex2bn(d);
  } else if (Buffer.isBuffer(d)) {
    d = bin2bn(d);
  }

  var privkey = new ECPrivateKey(curve, d);
  return privkey;
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"../../deps/forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","./curves.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ecc/curves.js","./math.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ecc/math.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ecc/math.js":[function(require,module,exports){
/**
 * deps/ecc/math.js - Elliptic Curve Math
 * Original Copyright (c) 2003-2005  Tom Wu.
 * Modifications Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 *
 * Ported from Tom Wu, which is ported from BouncyCastle
 * Modified to reuse existing external NPM modules, restricted to the
 * NIST//SECG/X9.62 prime curves only, and formatted to match project
 * coding styles.
 */
"use strict";

// Basic Javascript Elliptic Curve implementation
// Ported loosely from BouncyCastle's Java EC code
// Only Fp curves implemented for now

var BigInteger = require("../../deps/forge").jsbn.BigInteger;

// ----------------
// Helpers

function nbi() {
  return new BigInteger(null);
}

// ----------------
// Barrett modular reduction

// constructor
function Barrett(m) {
  // setup Barrett
  this.r2 = nbi();
  this.q3 = nbi();
  BigInteger.ONE.dlShiftTo(2*m.t,this.r2);
  this.mu = this.r2.divide(m);
  this.m = m;
}

function barrettConvert(x) {
  if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);
  else if(x.compareTo(this.m) < 0) return x;
  else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
}

function barrettRevert(x) { return x; }

// x = x mod m (HAC 14.42)
function barrettReduce(x) {
  x.drShiftTo(this.m.t-1,this.r2);
  if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }
  this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);
  this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);
  while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);
  x.subTo(this.r2,x);
  while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
}

// r = x^2 mod m; x != r
function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

// r = x*y mod m; x,y != r
function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }

Barrett.prototype.convert = barrettConvert;
Barrett.prototype.revert = barrettRevert;
Barrett.prototype.reduce = barrettReduce;
Barrett.prototype.mulTo = barrettMulTo;
Barrett.prototype.sqrTo = barrettSqrTo;

// ----------------
// ECFieldElementFp

// constructor
function ECFieldElementFp(q, x) {
  this.x = x;
  // TODO if(x.compareTo(q) >= 0) error
  this.p = q;
}

function feFpEquals(other) {
  if (other === this) {
    return true;
  }
  return (this.p.equals(other.p) && this.x.equals(other.x));
}

function feFpToBigInteger() {
  return this.x;
}

function feFpNegate() {
  return new ECFieldElementFp(this.p, this.x.negate().mod(this.p));
}

function feFpAdd(b) {
  return new ECFieldElementFp(this.p, this.x.add(b.toBigInteger()).mod(this.p));
}

function feFpSubtract(b) {
  return new ECFieldElementFp(this.p, this.x.subtract(b.toBigInteger()).mod(this.p));
}

function feFpMultiply(b) {
  return new ECFieldElementFp(this.p, this.x.multiply(b.toBigInteger()).mod(this.p));
}

function feFpSquare() {
  return new ECFieldElementFp(this.p, this.x.pow(2).mod(this.p));
}

function feFpDivide(b) {
  return new ECFieldElementFp(this.p, this.x.multiply(b.toBigInteger().modInverse(this.p)).mod(this.p));
}

ECFieldElementFp.prototype.equals = feFpEquals;
ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;
ECFieldElementFp.prototype.negate = feFpNegate;
ECFieldElementFp.prototype.add = feFpAdd;
ECFieldElementFp.prototype.subtract = feFpSubtract;
ECFieldElementFp.prototype.multiply = feFpMultiply;
ECFieldElementFp.prototype.square = feFpSquare;
ECFieldElementFp.prototype.divide = feFpDivide;

// ----------------
// ECPointFp

// constructor
function ECPointFp(curve, x, y, z) {
  this.curve = curve;
  this.x = x;
  this.y = y;
  // Projective coordinates: either zinv == null or z * zinv == 1
  // z and zinv are just BigIntegers, not fieldElements
  if (!z) {
    this.z = BigInteger.ONE;
  } else {
    this.z = z;
  }
  this.zinv = null;
  //TODO: compression flag
}

function pointFpGetX() {
  if(!this.zinv) {
    this.zinv = this.z.modInverse(this.curve.p);
  }
  var r = this.x.toBigInteger().multiply(this.zinv);
  this.curve.reduce(r);
  return this.curve.fromBigInteger(r);
}

function pointFpGetY() {
  if(!this.zinv) {
    this.zinv = this.z.modInverse(this.curve.p);
  }
  var r = this.y.toBigInteger().multiply(this.zinv);
  this.curve.reduce(r);
  return this.curve.fromBigInteger(r);
}

function pointFpEquals(other) {
  if (other === this) {
    return true;
  }
  if (this.isInfinity()) {
    return other.isInfinity();
  }
  if (other.isInfinity()) {
    return this.isInfinity();
  }
  var u, v;
  // u = Y2 * Z1 - Y1 * Z2
  u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.p);
  if (!u.equals(BigInteger.ZERO)) {
    return false;
  }
  // v = X2 * Z1 - X1 * Z2
  v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.p);
  return v.equals(BigInteger.ZERO);
}

function pointFpIsInfinity() {
  if ((this.x == null) && (this.y == null)) {
    return true;
  }
  return (this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO));
}

function pointFpNegate() {
    return new ECPointFp(this.curve, this.x, this.y.negate(), this.z);
}

function pointFpAdd(b) {
  if (this.isInfinity()) {
    return b;
  }
  if (b.isInfinity()) {
    return this;
  }

  // u = Y2 * Z1 - Y1 * Z2
  var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.p);
  // v = X2 * Z1 - X1 * Z2
  var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.p);

  if (BigInteger.ZERO.equals(v)) {
    if (BigInteger.ZERO.equals(u)) {
      return this.twice(); // this == b, so double
    }
    return this.curve.getInfinity(); // this = -b, so infinity
  }

  var THREE = new BigInteger("3");
  var x1 = this.x.toBigInteger();
  var y1 = this.y.toBigInteger();

  var v2 = v.pow(2);
  var v3 = v2.multiply(v);
  var x1v2 = x1.multiply(v2);
  var zu2 = u.pow(2).multiply(this.z);

  // x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3)
  var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.p);
  // y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3
  var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.p);
  // z3 = v^3 * z1 * z2
  var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.p);

  return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
}

function pointFpTwice() {
  if(this.isInfinity()) {
    return this;
  }
  if (this.y.toBigInteger().signum() === 0) {
    return this.curve.getInfinity();
  }

  // TODO: optimized handling of constants
  var THREE = new BigInteger("3");
  var x1 = this.x.toBigInteger();
  var y1 = this.y.toBigInteger();

  var y1z1 = y1.multiply(this.z);
  var y1sqz1 = y1z1.multiply(y1).mod(this.curve.p);
  var a = this.curve.a.toBigInteger();

  // w = 3 * x1^2 + a * z1^2
  var w = x1.pow(2).multiply(THREE);
  if (!BigInteger.ZERO.equals(a)) {
    w = w.add(this.z.pow(2).multiply(a));
  }
  w = w.mod(this.curve.p);
  //this.curve.reduce(w);
  // x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1)
  var x3 = w.pow(2).subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.p);
  // y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3
  var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.pow(2).multiply(w)).mod(this.curve.p);
  // z3 = 8 * (y1 * z1)^3
  var z3 = y1z1.pow(2).multiply(y1z1).shiftLeft(3).mod(this.curve.p);

  return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
}

// Simple NAF (Non-Adjacent Form) multiplication algorithm
// TODO: modularize the multiplication algorithm
function pointFpMultiply(k) {
  if (this.isInfinity()) {
    return this;
  }
  if (k.signum() === 0) {
    return this.curve.getInfinity();
  }

  var e = k;
  var h = e.multiply(new BigInteger("3"));

  var neg = this.negate();
  var R = this;

  var i;
  for(i = h.bitLength() - 2; i > 0; --i) {
    R = R.twice();

    var hBit = h.testBit(i);
    var eBit = e.testBit(i);

    if (hBit !== eBit) {
      R = R.add(hBit ? this : neg);
    }
  }

  return R;
}

// Compute this*j + x*k (simultaneous multiplication)
function pointFpMultiplyTwo(j, x, k) {
  var i;
  if (j.bitLength() > k.bitLength()) {
    i = j.bitLength() - 1;
  } else {
    i = k.bitLength() - 1;
  }

  var R = this.curve.getInfinity();
  var both = this.add(x);
  while (i >= 0) {
    R = R.twice();
    if (j.testBit(i)) {
      if (k.testBit(i)) {
        R = R.add(both);
      }
      else {
        R = R.add(this);
      }
    }
    else {
      if (k.testBit(i)) {
        R = R.add(x);
      }
    }
    --i;
  }

  return R;
}

ECPointFp.prototype.getX = pointFpGetX;
ECPointFp.prototype.getY = pointFpGetY;
ECPointFp.prototype.equals = pointFpEquals;
ECPointFp.prototype.isInfinity = pointFpIsInfinity;
ECPointFp.prototype.negate = pointFpNegate;
ECPointFp.prototype.add = pointFpAdd;
ECPointFp.prototype.twice = pointFpTwice;
ECPointFp.prototype.multiply = pointFpMultiply;
ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;

// ----------------
// ECCurveFp

// constructor
function ECCurveFp(p, a, b) {
  this.p = p;
  this.a = this.fromBigInteger(a);
  this.b = this.fromBigInteger(b);
  this.infinity = new ECPointFp(this, null, null);
  this.reducer = new Barrett(this.p);
}

function curveFpgetP() {
  return this.p;
}

function curveFpGetA() {
  return this.a;
}

function curveFpGetB() {
  return this.b;
}

function curveFpEquals(other) {
  if (other === this) {
    return true;
  }
  return (this.p.equals(other.p) && this.a.equals(other.a) && this.b.equals(other.b));
}

function curveFpContains(pt) {
  // y^2 = x^3 + a*x + b mod p
  var x = pt.getX().toBigInteger(),
      y = pt.getY().toBigInteger(),
      a = this.a.toBigInteger(),
      b = this.b.toBigInteger(),
      p = this.p;

  var left = y.pow(2).mod(p),
      right = x.pow(3).add(a.multiply(x)).add(b).mod(p)

  return left.equals(right);
}

function curveFpGetInfinity() {
  return this.infinity;
}

function curveFpFromBigInteger(x) {
  return new ECFieldElementFp(this.p, x);
}

function curveReduce(x) {
  this.reducer.reduce(x);
}

// for now, work with hex strings because they're easier in JS
function curveFpDecodePointHex(s) {
  switch (parseInt(s.substring(0, 2), 16)) {
    // first byte
    case 0:
      return this.infinity;
    case 2:
    case 3:
      // point compression not supported yet
      return null;
    case 4:
    case 6:
    case 7:
      var len = (s.length - 2) / 2;
      var xHex = s.substr(2, len);
      var yHex = s.substr(len + 2, len);

      return new ECPointFp(this,
                           this.fromBigInteger(new BigInteger(xHex, 16)),
                           this.fromBigInteger(new BigInteger(yHex, 16)));

    default: // unsupported
      return null;
    }
}

function curveFpEncodePointHex(p) {
  if (p.isInfinity()) {
    return "00";
  }
  var xHex = p.getX().toBigInteger().toString(16);
  var yHex = p.getY().toBigInteger().toString(16);
  var oLen = this.getP().toString(16).length;
  if ((oLen % 2) !== 0) {
    oLen++;
  }
  while (xHex.length < oLen) {
    xHex = "0" + xHex;
  }
  while (yHex.length < oLen) {
    yHex = "0" + yHex;
  }
  return "04" + xHex + yHex;
}

ECCurveFp.prototype.getP = curveFpgetP;
ECCurveFp.prototype.getA = curveFpGetA;
ECCurveFp.prototype.getB = curveFpGetB;
ECCurveFp.prototype.equals = curveFpEquals;
ECCurveFp.prototype.contains = curveFpContains;
ECCurveFp.prototype.getInfinity = curveFpGetInfinity;
ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;
ECCurveFp.prototype.reduce = curveReduce;
ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex;
ECCurveFp.prototype.encodePointHex = curveFpEncodePointHex;

// Exports
module.exports = {
  ECFieldElementFp: ECFieldElementFp,
  ECPointFp: ECPointFp,
  ECCurveFp: ECCurveFp
};

},{"../../deps/forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js":[function(require,module,exports){
/*!
 * deps/forge.js - Forge Package Customization
 *
 * Copyright (c) 2015 Cisco Systems, Inc.  See LICENSE file.
 */
"use strict";

var forge = require("node-forge/lib/forge");
require("node-forge/lib/aes");
require("node-forge/lib/asn1");
require("node-forge/lib/cipher");
require("node-forge/lib/hmac");
require("node-forge/lib/mgf1");
require("node-forge/lib/pbkdf2");
require("node-forge/lib/pem");
require("node-forge/lib/pkcs1");
require("node-forge/lib/pkcs7");
require("node-forge/lib/pki");
require("node-forge/lib/prime");
require("node-forge/lib/prng");
require("node-forge/lib/pss");
require("node-forge/lib/random");
require("node-forge/lib/sha1");
require("node-forge/lib/sha256");
require("node-forge/lib/sha512");
require("node-forge/lib/util");

// Define AES "raw" cipher mode
function modeRaw(options) {
  options = options || {};
  this.name = "";
  this.cipher = options.cipher;
  this.blockSize = options.blockSize || 16;
  this._blocks = this.blockSize / 4;
  this._inBlock = new Array(this._blocks);
  this._outBlock = new Array(this._blocks);
}

modeRaw.prototype.start = function() {};

modeRaw.prototype.encrypt = function(input, output, finish) {
  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {
    return true;
  }

  var i;

  // get next block
  for(i = 0; i < this._blocks; ++i) {
    this._inBlock[i] = input.getInt32();
  }

  // encrypt block
  this.cipher.encrypt(this._inBlock, this._outBlock);

  // write output
  for(i = 0; i < this._blocks; ++i) {
    output.putInt32(this._outBlock[i]);
  }
};

modeRaw.prototype.decrypt = function(input, output, finish) {
  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {
    return true;
  }

  var i;

  // get next block
  for(i = 0; i < this._blocks; ++i) {
    this._inBlock[i] = input.getInt32();
  }

  // decrypt block
  this.cipher.decrypt(this._inBlock, this._outBlock);

  // write output
  for(i = 0; i < this._blocks; ++i) {
    output.putInt32(this._outBlock[i]);
  }
};

(function() {
  var name = "AES",
      mode = modeRaw,
      factory;
  factory = function() { return new forge.aes.Algorithm(name, mode); };
  forge.cipher.registerAlgorithm(name, factory);
})();

module.exports = forge;

},{"node-forge/lib/aes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/aes.js","node-forge/lib/asn1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/asn1.js","node-forge/lib/cipher":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/cipher.js","node-forge/lib/forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/forge.js","node-forge/lib/hmac":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/hmac.js","node-forge/lib/mgf1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/mgf1.js","node-forge/lib/pbkdf2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pbkdf2.js","node-forge/lib/pem":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pem.js","node-forge/lib/pkcs1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pkcs1.js","node-forge/lib/pkcs7":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pkcs7.js","node-forge/lib/pki":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pki.js","node-forge/lib/prime":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/prime.js","node-forge/lib/prng":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/prng.js","node-forge/lib/pss":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/pss.js","node-forge/lib/random":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/random.js","node-forge/lib/sha1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/sha1.js","node-forge/lib/sha256":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/sha256.js","node-forge/lib/sha512":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/sha512.js","node-forge/lib/util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-forge/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/index.js":[function(require,module,exports){
(function (process,global,Buffer){(function (){
/*!
 * index.js - Main Entry Point
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

if (typeof Promise === "undefined") {
  require("es6-promise").polyfill();
}

if (typeof Buffer === "undefined") {
  (global || window).Buffer = require("buffer").Buffer;
}

if (typeof process === "undefined") {
  (global || window).process = require("process");
}

if (!process.version) {
  process.version = "";
}

var JWS = require("./jws");

module.exports = {
  JWA: require("./algorithms"),
  JWE: require("./jwe"),
  JWK: require("./jwk"),
  JWS: JWS,
  util: require("./util"),
  parse: require("./parse"),
  canYouSee: JWS.createVerify
};

}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
},{"./algorithms":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/index.js","./jwe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/index.js","./jwk":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/index.js","./jws":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/index.js","./parse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/parse/index.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","es6-promise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/es6-promise/dist/es6-promise.js","process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/decrypt.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * jwe/decrypt.js - Decrypt from a JWE
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var base64url = require("../util/base64url"),
    AlgConfig = require("../util/algconfig"),
    JWK = require("../jwk"),
    merge = require("../util/merge"),
    zlib = require("zlib");

var DEFAULT_OPTIONS = {
  algorithms: "*"
};

/**
 * @class JWE.Decrypter
 * @classdesc Processor of encrypted data.
 *
 * @description
 * **NOTE:** This class cannot be instantiated directly. Instead
 * call {@link JWE.createDecrypt}.
 */
function JWEDecrypter(ks, globalOpts) {
  var assumedKey,
    keystore;

  if (JWK.isKey(ks)) {
    assumedKey = ks;
    keystore = assumedKey.keystore;
  } else if (JWK.isKeyStore(ks)) {
    keystore = ks;
  } else {
    throw new TypeError("Keystore must be provided");
  }

  globalOpts = merge(DEFAULT_OPTIONS, globalOpts);

  /**
   * Decrypts the given input.
   *
   * {opts}, if provided, is used to customize this specific decrypt operation.
   * This argument has the same semantics as {JWE.createDecrypt}, and takes
   * precedence over those options.
   *
   * The returned PRomise, when fulfilled, returns an object with the
   * following members:
   *
   * - `header` - The JOSE Header, combined from the relevant "header" and
   *            "protected" fields from the original JWE object.
   * - `protected` - An array containing the names of the protected fields
   * - `key` - The used to decrypt the content
   * - `payload` - The decrypted content (as a Buffer)
   * - `plaintext` - An alias for `payload`
   *
   * @param {Object|String} input The encrypted content
   * @param {Object} [opts] The options for this decryption operation.
   * @returns {Promise} A promise for the decyprted plaintext
   */
  Object.defineProperty(this, "decrypt", {
    value: function(input, opts) {
      opts = merge({}, globalOpts, opts || {});
      var extraHandlers = opts.handlers || {};
      var handlerKeys = Object.keys(extraHandlers);
      var algSpec = new AlgConfig(opts.algorithms);

      /* eslint camelcase: [0] */
      if (typeof input === "string") {
        input = input.split(".");
        input = {
          protected: input[0],
          recipients: [
            {
              encrypted_key: input[1]
            }
          ],
          iv: input[2],
          ciphertext: input[3],
          tag: input[4]
        };
      } else if (!input || typeof input !== "object") {
        throw new Error("invalid input");
      }
      if ("encrypted_key" in input) {
        input.recipients = [
          {
            encrypted_key: input.encrypted_key
          }
        ];
      }

      var promise;

      // ensure recipients exists
      var rcptList = input.recipients || [{}];
      promise = Promise.resolve(rcptList);

      //combine fields
      var fields,
          protect;
      promise = promise.then(function(rcptList) {
        if (input.protected) {
          protect = base64url.decode(input.protected).toString("utf8");
          protect = JSON.parse(protect);

          // verify "crit" field first
          var crit = protect.crit;
          if (crit) {
            if (!Array.isArray(crit)) {
              return Promise.reject(new Error("Invalid 'crit' header"));
            }
            for (var idx = 0; crit.length > idx; idx++) {
              if (-1 === handlerKeys.indexOf(crit[idx])) {
                return Promise.reject(new Error(
                    "Critical extension is not supported: " + crit[idx]
                ));
              }
            }
          }

          fields = protect;
          protect = Object.keys(protect);
        } else {
          fields = {};
          protect = [];
        }
        fields = merge(input.unprotected || {}, fields);

        rcptList = rcptList.map(function(r) {
          var promise = Promise.resolve();
          var header = r.header || {};
          header = merge(header, fields);
          r.header = header;
          r.protected = protect;

          // check on allowed algorithms
          if (!algSpec.match(header.alg)) {
            promise = promise.then(function() {
              return Promise.reject(new Error("Algorithm not allowed: " + header.alg));
            });
          }
          if (!algSpec.match(header.enc)) {
            promise = promise.then(function () {
              return Promise.reject(new Error("Algorithm not allowed: " + header.enc));
            });
          }

          if (header.epk) {
            promise = promise.then(function() {
              return JWK.asKey(header.epk);
            });
            promise = promise.then(function(epk) {
              header.epk = epk.toObject(false);
            });
          }
          return promise.then(function() {
            return r;
          });
        });

        return Promise.all(rcptList);
      });

      // decrypt with first key found
      var algKey,
        encKey,
        kdata;
      promise = promise.then(function(rcptList) {
        var jwe = {};
        return new Promise(function(resolve, reject) {
          var processKey = function() {
            var rcpt = rcptList.shift();
            if (!rcpt) {
              reject(new Error("no key found"));
              return;
            }

            var algPromise = Promise.resolve(rcpt);
            algPromise = algPromise.then(function(rcpt) {
              // try to unwrap encrypted key
              var prekey = kdata = rcpt.encrypted_key || "";
              prekey = base64url.decode(prekey);
              algKey = assumedKey || keystore.get({
                use: "enc",
                alg: rcpt.header.alg,
                kid: rcpt.header.kid
              });
              if (algKey) {
                return algKey.unwrap(rcpt.header.alg, prekey, rcpt.header);
              } else {
                return Promise.reject();
              }
            });
            algPromise = algPromise.then(function(key) {
              encKey = {
                "kty": "oct",
                "k": base64url.encode(key)
              };
              encKey = JWK.asKey(encKey);
              jwe.key = algKey;
              jwe.header = rcpt.header;
              jwe.protected = rcpt.protected;
              resolve(jwe);
            });
            algPromise.catch(processKey);
          };
          processKey();
        });
      });

      // assign decipher inputs
      promise = promise.then(function(jwe) {
        jwe.iv = input.iv;
        jwe.tag = input.tag;
        jwe.ciphertext = input.ciphertext;

        return jwe;
      });

      // process any prepare-decrypt handlers
      promise = promise.then(function(jwe) {
        var processing = [];
        handlerKeys.forEach(function(h) {
          h = extraHandlers[h];
          var p;
          if ("function" === typeof h) {
            p = h(jwe);
          } else if ("object" === typeof h && "function" === typeof h.prepare) {
            p = h.prepare(jwe);
          }
          if (p) {
            processing.push(Promise.resolve(p));
          }
        });
        return Promise.all(processing).then(function() {
          // don't actually care about individual handler results
          // assume {jwe} is updated
          return jwe;
        });
      });

      // prepare decrypt inputs
      promise = promise.then(function(jwe) {
        if (!Buffer.isBuffer(jwe.ciphertext)) {
          jwe.ciphertext = base64url.decode(jwe.ciphertext);
        }

        return jwe;
      });

      // decrypt it!
      promise = promise.then(function(jwe) {
        var adata = input.protected;
        if ("aad" in input && null != input.aad) {
          adata += "." + input.aad;
        }

        var params = {
          iv: jwe.iv,
          adata: adata,
          tag: jwe.tag,
          kdata: kdata,
          epu: jwe.epu,
          epv: jwe.epv
        };
        var cdata = jwe.ciphertext;

        delete jwe.iv;
        delete jwe.tag;
        delete jwe.ciphertext;

        return encKey.
          then(function(enkKey) {
            return enkKey.decrypt(jwe.header.enc, cdata, params).
              then(function(pdata) {
                jwe.payload = jwe.plaintext = pdata;
                return jwe;
              });
          });
      });

      // (OPTIONAL) decompress plaintext
      promise = promise.then(function(jwe) {
        if ("DEF" === jwe.header.zip) {
          return new Promise(function(resolve, reject) {
            zlib.inflateRaw(Buffer.from(jwe.plaintext), function(err, data) {
              if (err) {
                reject(err);
              }
              else {
                jwe.payload = jwe.plaintext = data;
                resolve(jwe);
              }
            });
          });
        }
        return jwe;
      });

      // process any post-decrypt handlers
      promise = promise.then(function(jwe) {
        var processing = [];
        handlerKeys.forEach(function(h) {
          h = extraHandlers[h];
          var p;
          if ("object" === typeof h && "function" === typeof h.complete) {
            p = h.complete(jwe);
          }
          if (p) {
            processing.push(Promise.resolve(p));
          }
        });
        return Promise.all(processing).then(function() {
          // don't actually care about individual handler results
          // assume {jwe} is updated
          return jwe;
        });
      });

      return promise;
    }
  });
}

/**
 * @description
 * Creates a new Decrypter for the given Key or KeyStore.
 *
 * {opts}, when provided, is used to customize decryption processes. The
 * following options are currently supported:
 *
 * - `handlers` - An object where each name is a JOSE header member name and
 *   the value can be a boolean, function, or an object.
 *
 * Handlers are intended to support 'crit' extensions. When a boolean value,
 * the member is expected to be processed once decryption is fully complete.
 * When a function, it is called just before the ciphertext is decrypted
 * (processed as if it were a `prepare` handler, as decribed below). When an
 * object, it can contain any of the following members:
 *
 * - `recipient` - A function called after a valid key is determined; it takes
 *   an object describing the recipient, and returns a Promise that is
 *   fulfilled once the handler's processing is complete.
 * - `prepare` - A function called just prior to decrypting the ciphertext;
 *   it takes an object describing the decryption result (but containing
 *   `ciphertext` and `tag' instead of `payload` and `plaintext`), and
 *   returns a Promise that is fulfilled once the handler's processing is
 *   complete.
 * - `complete` - A function called once decryption is complete, just prior
 *   to fulfilling the Promise returned by `decrypt()`; it takes the object
 *   that will be returned by `decrypt()`'s fulfilled Promise, and returns
 *   a Promise that is fulfilled once the handler's processing is complete.
 *
 * Note that normal processing of `decrypt()` does not continue until all
 * relevant handlers have completed. Any changes handlers make to the
 * provided objects affects `decrypt()`'s processing.
 *
 * @param {JWK.Key|JWK.KeyStore} ks The Key or KeyStore to use for decryption.
 * @param {Object} [opts] The options for this Decrypter.
 * @returns {JWE.Decrypter} The new Decrypter.
 */
function createDecrypt(ks, opts) {
  var dec = new JWEDecrypter(ks, opts);
  return dec;
}

module.exports = {
  decrypter: JWEDecrypter,
  createDecrypt: createDecrypt
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"../jwk":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/index.js","../util/algconfig":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/algconfig.js","../util/base64url":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/base64url.js","../util/merge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/merge.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","zlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify-zlib/lib/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/defaults.js":[function(require,module,exports){
/*!
 * jwe/defaults.js - Defaults for JWEs
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

/**
 * @description
 * The default options for {@link JWE.createEncrypt}.
 *
 * @property {Boolean|String} zip Determines the compression algorithm to
 *           apply to the plaintext (if any) before it is encrypted. This can
 *           also be `true` (which is equivalent to `"DEF"`) or **`false`**
 *           (the default, which is equivalent to no compression).
 * @property {String} format Determines the serialization format of the
 *           output.  Expected to be `"general"` for general JSON
 *           Serialization, `"flattened"` for flattened JSON Serialization,
 *           or `"compact"` for Compact Serialization (default is
 *           **`"general"`**).
 * @property {Boolean} compact Determines if the output is the Compact
 *           serialization (`true`) or the JSON serialization (**`false`**,
 *           the default).
 * @property {String} contentAlg The algorithm used to encrypt the plaintext
 *           (default is **`"A128CBC-HS256"`**).
 * @property {String|String[]} protect The names of the headers to integrity
 *           protect.  The value `""` means that none of the header parameters
 *           are integrity protected, while `"*"` (the default) means that all
 *           header parameters are integrity protected.
 */
var JWEDefaults = {
  zip: false,
  format: "general",
  contentAlg: "A128CBC-HS256",
  protect: "*"
};

module.exports = JWEDefaults;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/encrypt.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * jwe/encrypt.js - Encrypt to a JWE
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var lodash = require("lodash"),
    util = require("../util"),
    generateCEK = require("./helpers").generateCEK,
    JWK = require("../jwk"),
    slice = require("./helpers").slice,
    zlib = require("zlib"),
    CONSTANTS = require("../algorithms/constants");

var assign = lodash.assign;
var clone = lodash.clone;

var DEFAULTS = require("./defaults");

/**
 * @class JWE.Encrypter
 * @classdesc
 * Generator of encrypted data.
 *
 * @description
 * **NOTE:** This class cannot be instantiated directly. Instead call {@link
 * JWE.createEncrypt}.
 */
function JWEEncrypter(cfg, fields, recipients) {
  var finalized = false,
    format = cfg.format || "general",
    protectAll = !!cfg.protectAll,
    content = Buffer.alloc(0);

  /**
   * @member {String} JWE.Encrypter#zip
   * @readonly
   * @description
   * Indicates the compression algorithm applied to the plaintext
   * before it is encrypted.  The possible values are:
   *
   * + **`"DEF"`**: Compress the plaintext using the DEFLATE algorithm.
   * + **`""`**: Do not compress the plaintext.
   */
  Object.defineProperty(this, "zip", {
    get: function() {
      return fields.zip || "";
    },
    enumerable: true
  });
  /**
   * @member {Boolean} JWE.Encrypter#compact
   * @readonly
   * @description
   * Indicates whether the output of this encryption generator is
   * using the Compact serialization (`true`) or the JSON
   * serialization (`false`).
   */
  Object.defineProperty(this, "compact", {
    get: function() { return "compact" === format; },
    enumerable: true
  });
  /**
   * @member {String} JWE.Encrypter#format
   * @readonly
   * @description
   * Indicates the format the output of this encryption generator takes.
   */
  Object.defineProperty(this, "format", {
    get: function() { return format; },
    enumerable: true
  });
  /**
   * @member {String[]} JWE.Encrypter#protected
   * @readonly
   * @description
   * The header parameter names that are protected. Protected header fields
   * are first serialized to UTF-8 then encoded as util.base64url, then used as
   * the additional authenticated data in the encryption operation.
   */
  Object.defineProperty(this, "protected", {
    get: function() {
      return clone(cfg.protect);
    },
    enumerable: true
  });
  /**
   * @member {Object} JWE.Encrypter#header
   * @readonly
   * @description
   * The global header parameters, both protected and unprotected. Call
   * {@link JWE.Encrypter#protected} to determine which parameters will
   * be protected.
   */
  Object.defineProperty(this, "header", {
    get: function() {
      return clone(fields);
    },
    enumerable: true
  });

  /**
   * @method JWE.Encrypter#update
   * @description
   * Updates the plaintext data for the encryption generator. The plaintext
   * is appended to the end of any other plaintext already applied.
   *
   * If {data} is a Buffer, {encoding} is ignored. Otherwise, {data} is
   * converted to a Buffer internally to {encoding}.
   *
   * @param {Buffer|String} [data] The plaintext to apply.
   * @param {String} [encoding] The encoding of the plaintext.
   * @returns {JWE.Encrypter} This encryption generator.
   * @throws {Error} If ciphertext has already been generated.
   */
  Object.defineProperty(this, "update", {
    value: function(data, encoding) {
      if (finalized) {
        throw new Error("already final");
      }
      if (data != null) {
        data = util.asBuffer(data, encoding);
        if (content.length) {
          content = Buffer.concat([content, data],
                      content.length + data.length);
        } else {
          content = data;
        }
      }

      return this;
    }
  });
  /**
   * @method JWE.Encrypter#final
   * @description
   * Finishes the encryption operation.
   *
   * The returned Promise, when fulfilled, is the JSON Web Encryption (JWE)
   * object, either in the Compact (if {@link JWE.Encrypter#compact} is
   * `true`) or the JSON serialization.
   *
   * @param {Buffer|String} [data] The final plaintext data to apply.
   * @param {String} [encoding] The encoding of the final plaintext data
   *        (if any).
   * @returns {Promise} A promise for the encryption operation.
   * @throws {Error} If ciphertext has already been generated.
   */
  Object.defineProperty(this, "final", {
    value: function(data, encoding) {
      if (finalized) {
        return Promise.reject(new Error("already final"));
      }

      // last-minute data
      this.update(data, encoding);

      // mark as done...ish
      finalized = true;
      var promise = Promise.resolve({});

      // determine CEK and IV
      var encAlg = fields.enc;
      var encKey;
      promise = promise.then(function(jwe) {
        if (cfg.cek) {
          encKey = JWK.asKey(cfg.cek);
        }
        return jwe;
      });

      // process recipients
      promise = promise.then(function(jwe) {
        var procR = function(r, one) {
          var props = {};
          props = assign(props, fields);
          props = assign(props, r.header);

          var algKey = r.key,
              algAlg = props.alg;

          // generate Ephemeral EC Key
          var tks,
              rpromise;
          if ((props.alg || "").indexOf("ECDH-ES") === 0) {
            tks = algKey.keystore.temp();
            if (r.epk) {
              rpromise = Promise.resolve(r.epk).
                then(function(epk) {
                  r.header.epk = epk.toJSON(false, ["kid"]);
                  props.epk = epk.toObject(true, ["kid"]);
                });
            } else {
              rpromise = tks.generate("EC", algKey.get("crv")).
                then(function(epk) {
                  r.header.epk = epk.toJSON(false, ["kid"]);
                  props.epk = epk.toObject(true, ["kid"]);
                });
            }
          } else {
            rpromise = Promise.resolve();
          }

          // encrypt the CEK
          rpromise = rpromise.then(function() {
            var cek,
                p;
            // special case 'alg=dir'
            if ("dir" === algAlg && one) {
              encKey = Promise.resolve(algKey);
              p = encKey.then(function(jwk) {
                // fixup encAlg
                if (!encAlg) {
                  props.enc = fields.enc = encAlg = jwk.algorithms(JWK.MODE_ENCRYPT)[0];
                }
                return {
                  once: true,
                  direct: true
                };
              });
            } else {
              if (!encKey) {
                if (!encAlg) {
                  props.enc = fields.enc = encAlg = cfg.contentAlg;
                }
                encKey = generateCEK(encAlg);
              }
              p = encKey.then(function(jwk) {
                cek = jwk.get("k", true);
                // algKey may or may not be a promise
                return algKey;
              });
              p = p.then(function(algKey) {
                return algKey.wrap(algAlg, cek, props);
              });
            }
            return p;
          });
          rpromise = rpromise.then(function(wrapped) {
            if (wrapped.once && !one) {
              return Promise.reject(new Error("cannot use 'alg':'" + algAlg + "' with multiple recipients"));
            }

            var rjwe = {},
                cek;
            if (wrapped.data) {
              cek = wrapped.data;
              cek = util.base64url.encode(cek);
            }

            if (wrapped.direct && cek) {
              // replace content key
              encKey = JWK.asKey({
                kty: "oct",
                k: cek
              });
            } else if (cek) {
              /* eslint camelcase: [0] */
              rjwe.encrypted_key = cek;
            }

            if (r.header && Object.keys(r.header).length) {
              rjwe.header = clone(r.header || {});
            }
            if (wrapped.header) {
              rjwe.header = assign(rjwe.header || {},
                                     wrapped.header);
            }

            return rjwe;
           });
           return rpromise;
        };

        var p = Promise.all(recipients);
        p = p.then(function(rcpts) {
          var single = (1 === rcpts.length);
          rcpts = rcpts.map(function(r) {
            return procR(r, single);
          });
          return Promise.all(rcpts);
        });
        p = p.then(function(rcpts) {
          jwe.recipients = rcpts.filter(function(r) { return !!r; });
          return jwe;
        });
        return p;
      });

      // normalize headers
      var props = {};
      promise = promise.then(function(jwe) {
        var protect,
          lenProtect,
          unprotect,
          lenUnprotect;

        unprotect = clone(fields);
        if ((protectAll && jwe.recipients.length === 1) || "compact" === format) {
          // merge single recipient into fields
          protect = {};
          protect = assign({},
                     unprotect,
                    jwe.recipients[0].header);
          lenProtect = Object.keys(protect).length;

          unprotect = undefined;
          lenUnprotect = 0;

          delete jwe.recipients[0].header;
          if (Object.keys(jwe.recipients[0]).length === 0) {
            jwe.recipients.splice(0, 1);
          }
        } else {
          protect = {};
          lenProtect = 0;
          lenUnprotect = Object.keys(unprotect).length;
          cfg.protect.forEach(function(f) {
            // remove protected header values from body unprotected header
            if (!(f in unprotect)) {
              return;
            }
            protect[f] = unprotect[f];
            lenProtect++;

            delete unprotect[f];
            lenUnprotect--;
          });

          jwe.recipients = (jwe.recipients || []).map(function(rcpt) {
            rcpt = rcpt || {};
            var header = rcpt.header;
            if (header) {
              Object.keys(header).forEach(function (f) {
                if (f in protect) { delete header[f]; }
              });
              if (!Object.keys(header).length) {
                delete rcpt.header;
              }
            }
            return rcpt;
          });
        }

        if (!jwe.recipients || jwe.recipients.length === 0) {
          delete jwe.recipients;
        }

        // "serialize" (and setup merged props)
        if (unprotect && lenUnprotect > 0) {
          props = assign(props, unprotect);
          jwe.unprotected = unprotect;
        }
        if (protect && lenProtect > 0) {
          props = assign(props, protect);
          protect = JSON.stringify(protect);
          jwe.protected = util.base64url.encode(protect, "utf8");
        }

        return jwe;
      });

      // (OPTIONAL) compress plaintext
      promise = promise.then(function(jwe) {
        var pdata = content;
        if (!props.zip) {
          jwe.plaintext = pdata;
          return jwe;
        } else if (props.zip === "DEF") {
          return new Promise(function(resolve, reject) {
            zlib.deflateRaw(Buffer.from(pdata, "binary"), function(err, data) {
              if (err) {
                reject(err);
              }
              else {
                jwe.plaintext = data;
                resolve(jwe);
              }
            });
          });
        }
        return Promise.reject(new Error("unsupported 'zip' mode"));
      });

      // encrypt plaintext
      promise = promise.then(function(jwe) {
        props.adata = jwe.protected;
        if ("aad" in cfg && cfg.aad != null) {
          props.adata += "." + cfg.aad;
          props.adata = Buffer.from(props.adata, "utf8");
        }
        // calculate IV
        var iv = cfg.iv ||
                 util.randomBytes(CONSTANTS.NONCELENGTH[encAlg] / 8);
        if ("string" === typeof iv) {
          iv = util.base64url.decode(iv);
        }
        props.iv = iv;

        if ("recipients" in jwe && jwe.recipients.length === 1) {
          props.kdata = jwe.recipients[0].encrypted_key;
        }

        if ("epu" in cfg && cfg.epu != null) {
          props.epu = cfg.epu;
        }

        if ("epv" in cfg && cfg.epv != null) {
          props.epv = cfg.epv;
        }

        var pdata = jwe.plaintext;
        delete jwe.plaintext;
        return encKey.then(function(encKey) {
          var p = encKey.encrypt(encAlg, pdata, props);
          p = p.then(function(result) {
            jwe.iv = util.base64url.encode(iv, "binary");
            if ("aad" in cfg && cfg.aad != null) {
             jwe.aad = cfg.aad;
            }
            jwe.ciphertext = util.base64url.encode(result.data, "binary");
            jwe.tag = util.base64url.encode(result.tag, "binary");
            return jwe;
          });
          return p;
        });
      });

      // (OPTIONAL) compact/flattened results
      switch (format) {
        case "compact":
          promise = promise.then(function(jwe) {
            var compact = new Array(5);

            compact[0] = jwe.protected;
            if (jwe.recipients && jwe.recipients[0]) {
              compact[1] = jwe.recipients[0].encrypted_key;
            }

            compact[2] = jwe.iv;
            compact[3] = jwe.ciphertext;
            compact[4] = jwe.tag;
            compact = compact.join(".");

            return compact;
          });
          break;
        case "flattened":
          promise = promise.then(function(jwe) {
            var flattened = {},
                rcpt = jwe.recipients && jwe.recipients[0];

            if (jwe.protected) {
              flattened.protected = jwe.protected;
            }
            if (jwe.unprotected) {
              flattened.unprotected = jwe.unprotected;
            }
            ["header", "encrypted_key"].forEach(function(f) {
              if (!rcpt) { return; }
              if (!(f in rcpt)) { return; }
              if (!rcpt[f]) { return; }
              if ("object" === typeof rcpt[f] && !Object.keys(rcpt[f]).length) { return; }
              flattened[f] = rcpt[f];
            });
            if (jwe.aad) {
              flattened.aad = jwe.aad;
            }
            flattened.iv = jwe.iv;
            flattened.ciphertext = jwe.ciphertext;
            flattened.tag = jwe.tag;

            return flattened;
          });
          break;
        case "general":
          promise = promise.then(function(jwe) {
            var recipients = jwe.recipients || [];
            recipients = recipients.map(function (rcpt) {
              if (!Object.keys(rcpt).length) { return undefined; }
              return rcpt;
            });
            recipients = recipients.filter(function (rcpt) { return !!rcpt; });
            if (recipients.length) {
              jwe.recipients = recipients;
            } else {
              delete jwe.recipients;
            }

            return jwe;
          });
      }

      return promise;
    }
  });
}

function createEncrypt(opts, rcpts) {
  // fixup recipients
  var options = opts,
    rcptStart = 1,
    rcptList = rcpts;

  if (arguments.length === 0) {
    throw new Error("at least one recipient must be provided");
  }
  if (arguments.length === 1) {
    // assume opts is the recipient list
    rcptList = opts;
    rcptStart = 0;
    options = {};
  } else if (JWK.isKey(opts) ||
        (opts && "kty" in opts) ||
        (opts && "key" in opts &&
        (JWK.isKey(opts.key) || "kty" in opts.key))) {
    rcptList = opts;
    rcptStart = 0;
    options = {};
  } else {
    options = clone(opts);
  }
  if (!Array.isArray(rcptList)) {
    rcptList = slice(arguments, rcptStart);
  }

  // fixup options
  options = assign(clone(DEFAULTS), options);

  // setup header fields
  var fields = clone(options.fields || {});
  if (options.zip) {
    fields.zip = (typeof options.zip === "boolean") ?
           (options.zip ? "DEF" : false) :
           options.zip;
  }
  options.format = (options.compact ? "compact" : options.format) || "general";
  switch (options.format) {
    case "compact":
      if ("aad" in opts) {
        throw new Error("additional authenticated data cannot be used for compact serialization");
      }
      /* eslint no-fallthrough: [0] */
    case "flattened":
      if (rcptList.length > 1) {
        throw new Error("too many recipients for compact serialization");
      }
      break;
  }

  // note protected fields (globally)
  // protected fields are global only
  var protectAll = false;
  if ("compact" === options.format || "*" === options.protect) {
    protectAll = true;
    options.protect = Object.keys(fields).concat("enc");
  } else if (typeof options.protect === "string") {
    options.protect = [options.protect];
  } else if (Array.isArray(options.protect)) {
    options.protect = options.protect.concat();
  } else if (!options.protect) {
    options.protect = [];
  } else {
    throw new Error("protect must be a list of fields");
  }

  if (protectAll && 1 < rcptList.length) {
    throw new Error("too many recipients to protect all header parameters");
  }

  rcptList = rcptList.map(function(r, idx) {
    var p;

    // resolve a key
    if (r && "kty" in r) {
      p = JWK.asKey(r);
      p = p.then(function(k) {
        return {
          key: k
        };
      });
    } else if (r) {
      p = JWK.asKey(r.key);
      p = p.then(function(k) {
        return {
          header: r.header,
          reference: r.reference,
          key: k
        };
      });
    } else {
      p = Promise.reject(new Error("missing key for recipient " + idx));
    }

    // convert ephemeral key (if present)
    if (r.epk) {
      p = p.then(function(recipient) {
        return JWK.asKey(r.epk).
          then(function(epk) {
            recipient.epk = epk;
            return recipient;
          });
      });
    }

    // resolve the complete recipient
    p = p.then(function(recipient) {
      var key = recipient.key;

      // prepare the recipient header
      var header = recipient.header || {};
      recipient.header = header;
      var props = {};
      props = assign(props, fields);
      props = assign(props, recipient.header);

      // ensure key protection algorithm is set
      if (!props.alg) {
        props.alg = key.algorithms(JWK.MODE_WRAP)[0];
        header.alg = props.alg;
      }
      if (!props.alg) {
        return Promise.reject(new Error("key not valid for encrypting to recipient " + idx));
      }
      header.alg = props.alg;

      // determine the key reference
      var ref = recipient.reference;
      delete recipient.reference;
      if (undefined === ref) {
        // header already contains the key reference
        ref = ["kid", "jku", "x5c", "x5t", "x5u"].some(function(k) {
          return (k in header);
        });
        ref = !ref ? "kid" : null;
      } else if ("boolean" === typeof ref) {
        // explicit (positive | negative) request for key reference
        ref = ref ? "kid" : null;
      }
      var jwk;
      if (ref) {
        jwk = key.toJSON();
        if ("jwk" === ref) {
          if ("oct" === key.kty) {
            return Promise.reject(new Error("cannot embed key"));
          }
          header.jwk = jwk;
        } else if (ref in jwk) {
          header[ref] = jwk[ref];
        }
      }

      // freeze recipient
      recipient = Object.freeze(recipient);
      return recipient;
    });

    return p;
  });

  // create and configure encryption
  var cfg = {
    aad: ("aad" in options) ? util.base64url.encode(options.aad || "") : null,
    contentAlg: options.contentAlg,
    format: options.format,
    protect: options.protect,
    cek: options.cek,
    iv: options.iv,
    protectAll: protectAll
  };
  var enc = new JWEEncrypter(cfg, fields, rcptList);

  return enc;
}

module.exports = {
  encrypter: JWEEncrypter,
  createEncrypt: createEncrypt
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"../algorithms/constants":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/constants.js","../jwk":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/index.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","./defaults":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/defaults.js","./helpers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/helpers.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js","zlib":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify-zlib/lib/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/helpers.js":[function(require,module,exports){
/*!
 * jwe/helpers.js - JWE Internal Helper Functions
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var CONSTANTS = require("../algorithms/constants"),
    JWK = require("../jwk");

module.exports = {
  slice: function(input, start) {
    return Array.prototype.slice.call(input, start || 0);
  },
  generateCEK: function(enc) {
    var ks = JWK.createKeyStore();
    var len = CONSTANTS.KEYLENGTH[enc];

    if (len) {
        return ks.generate("oct", len);
    }

    throw new Error("unsupported encryption algorithm");
  }
};

},{"../algorithms/constants":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/constants.js","../jwk":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/index.js":[function(require,module,exports){
/*!
 * jwe/index.js - JSON Web Encryption (JWE) Entry Point
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var JWE = {
  createEncrypt: require("./encrypt").createEncrypt,
  createDecrypt: require("./decrypt").createDecrypt
};

module.exports = JWE;

},{"./decrypt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/decrypt.js","./encrypt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/encrypt.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/basekey.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * jwk/basekey.js - JWK Key Base Class Implementation
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var lodash = require("lodash"),
    merge = require("../util/merge"),
    uuid = require("uuid");

var assign = lodash.assign;
var clone = lodash.clone;
var flatten = lodash.flatten;
var intersection = lodash.intersection;
var omit = lodash.omit;
var pick = lodash.pick;
var uniq = lodash.uniq;

var ALGORITHMS = require("../algorithms"),
    CONSTANTS = require("./constants.js"),
    HELPERS = require("./helpers.js"),
    UTIL = require("../util");

/**
 * @class JWK.Key
 * @classdesc
 * Represents a JSON Web Key instance.
 *
 * @description
 * **NOTE:** This class cannot be instantiated directly. Instead call
 * {@link JWK.asKey}, {@link JWK.KeyStore#add}, or
 * {@link JWK.KeyStore#generate}.
 */
var JWKBaseKeyObject = function(kty, ks, props, cfg) {
  // ### validate/coerce arguments ###
  if (!kty) {
    throw new Error("kty cannot be null");
  }

  if (!ks) {
    throw new Error("keystore cannot be null");
  }

  if (!props) {
    throw new Error("props cannot be null");
  } else if ("string" === typeof props) {
    props = JSON.parse(props);
  }

  if (!cfg) {
    throw new Error("cfg cannot be null");
  }

  var excluded = [];
  var keys = {},
      json = {},
      prints,
      kid;

  props = clone(props);
  // strip thumbprints if present
  prints = assign({}, props[HELPERS.INTERNALS.THUMBPRINT_KEY] || {});
  delete props[HELPERS.INTERNALS.THUMBPRINT_KEY];
  Object.keys(prints).forEach(function(a) {
    var h = prints[a];
    if (!kid) {
      kid = h;
      if (Buffer.isBuffer(kid)) {
        kid = UTIL.base64url.encode(kid);
      }
    }
    if (!Buffer.isBuffer(h)) {
      h = UTIL.base64url.decode(h);
      prints[a] = h;
    }
  });

  // force certain values
  props.kty = kty;
  props.kid = props.kid || kid || uuid();

  // setup base info
  var included = Object.keys(HELPERS.COMMON_PROPS).map(function(p) {
    return HELPERS.COMMON_PROPS[p].name;
  });
  json.base = pick(props, included);
  excluded = excluded.concat(Object.keys(json.base));

  // setup public information
  json.public = clone(props);
  keys.public = cfg.publicKey(json.public);
  if (keys.public) {
    // exclude public values from extra
    excluded = excluded.concat(Object.keys(json.public));
  }

  // setup private information
  json.private = clone(props);
  keys.private = cfg.privateKey(json.private);
  if (keys.private) {
    // exclude private values from extra
    excluded = excluded.concat(Object.keys(json.private));
  }

  // setup extra information
  json.extra = omit(props, excluded);

  // TODO: validate 'alg' against supported algorithms

  // setup calculated values
  var keyLen;
  if (keys.public && ("length" in keys.public)) {
    keyLen = keys.public.length;
  } else if (keys.private && ("length" in keys.private)) {
    keyLen = keys.private.length;
  } else {
    keyLen = NaN;
  }

  // ### Public Properties ###
  /**
   * @member {JWK.KeyStore} JWK.Key#keystore
   * @description
   * The owning keystore.
   */
  Object.defineProperty(this, "keystore", {
    value: ks,
    enumerable: true
  });
  /**
   * @member {Number} JWK.Key#length
   * @description
   * The size of this Key, in bits.
   */
  Object.defineProperty(this, "length", {
    value: keyLen,
    enumerable: true
  });
  /**
   * @member {String} JWK.Key#kty
   * @description
   * The type of Key.
   */
  Object.defineProperty(this, "kty", {
    value: kty,
    enumerable: true
  });

  /**
   * @member {String} JWK.Key#kid
   * @description
   * The identifier for this Key.
   */
  Object.defineProperty(this, "kid", {
    value: json.base.kid,
    enumerable: true
  });
  /**
   * @member {String} JWK.Key#use
   * @description
   * The usage for this Key.
   */
  Object.defineProperty(this, "use", {
    value: json.base.use || "",
    enumerable: true
  });
  /**
   * @member {String} JWK.Key#alg
   * @description
   * The sole algorithm this key can be used for.
   */
  Object.defineProperty(this, "alg", {
    value: json.base.alg || "",
    enumerable: true
  });

  // ### Public Methods ###
  /**
   * Generates the thumbprint of this Key.
   *
   * @param {String} [] The hash algorithm to use
   * @returns {Promise} The promise for the thumbprint generation.
   */
  Object.defineProperty(this, "thumbprint", {
    value: function(hash) {
      hash = (hash || HELPERS.INTERNALS.THUMBPRINT_HASH).toUpperCase();
      if (prints[hash]) {
        // return cached value
        return Promise.resolve(prints[hash]);
      }
      var p = HELPERS.thumbprint(cfg, json, hash);
      p = p.then(function(result) {
        if (result) {
          prints[hash] = result;
        }
        return result;
      });
      return p;
    }
  });
  /**
   * @method JWK.Key#algorithms
   * @description
   * The possible algorithms this Key can be used for. The returned
   * list is not any particular order, but is filtered based on the
   * Key's intended usage.
   *
   * @param {String} mode The operation mode
   * @returns {String[]} The list of supported algorithms
   * @see JWK.Key#supports
   */
  Object.defineProperty(this, "algorithms", {
    value: function(mode) {
      var modes = [];
      if (!this.use || this.use === "sig") {
        if (!mode || CONSTANTS.MODE_SIGN === mode) {
          modes.push(CONSTANTS.MODE_SIGN);
        }
        if (!mode || CONSTANTS.MODE_VERIFY === mode) {
          modes.push(CONSTANTS.MODE_VERIFY);
        }
      }
      if (!this.use || this.use === "enc") {
        if (!mode || CONSTANTS.MODE_ENCRYPT === mode) {
          modes.push(CONSTANTS.MODE_ENCRYPT);
        }
        if (!mode || CONSTANTS.MODE_DECRYPT === mode) {
          modes.push(CONSTANTS.MODE_DECRYPT);
        }
        if (!mode || CONSTANTS.MODE_WRAP === mode) {
          modes.push(CONSTANTS.MODE_WRAP);
        }
        if (!mode || CONSTANTS.MODE_UNWRAP === mode) {
          modes.push(CONSTANTS.MODE_UNWRAP);
        }
      }

      var self = this;
      var algs = modes.map(function(m) {
        return cfg.algorithms.call(self, keys, m);
      });
      algs = flatten(algs);
      algs = uniq(algs);
      if (this.alg) {
        // TODO: fix this correctly
        var valid;
        if ("oct" === kty) {
          valid = [this.alg, "dir"];
        } else {
          valid = [this.alg];
        }
        algs = intersection(algs, valid);
      }

      return algs;
    }
  });
  /**
   * @method JWK.Key#supports
   * @description
   * Determines if the given algorithm is supported.
   *
   * @param {String} alg The algorithm in question
   * @param {String} [mode] The operation mode
   * @returns {Boolean} `true` if {alg} is supported, and `false` otherwise.
   * @see JWK.Key#algorithms
   */
  Object.defineProperty(this, "supports", {
    value: function(alg, mode) {
      return (this.algorithms(mode).indexOf(alg) !== -1);
    }
  });
  /**
   * @method JWK.Key#has
   * @description
   * Determines if this Key contains the given parameter.
   *
   * @param {String} name The name of the parameter
   * @param {Boolean} [isPrivate=false] `true` if private parameters should be
   *        checked.
   * @returns {Boolean} `true` if the given parameter is present; `false`
   *          otherwise.
   */
  Object.defineProperty(this, "has", {
    value: function(name, isPrivate) {
      var contains = false;
      contains = contains || !!(json.base &&
                                (name in json.base));
      contains = contains || !!(keys.public &&
                                (name in keys.public));
      contains = contains || !!(json.extra &&
                                (name in json.extra));
      contains = contains || !!(isPrivate &&
                                keys.private &&
                                (name in keys.private));
      // TODO: check for export restrictions

      return contains;
    }
  });
  /**
   * @method JWK.Key#get
   * @description
   * Retrieves the value of the given parameter. The value returned by this
   * method is in its natural format, which might not exactly match its
   * JSON encoding (e.g., a binary string rather than a base64url-encoded
   * string).
   *
   * **NOTE:** This method can return `false`. Call
   * {@link JWK.Key#has} to determine if the parameter is present.
   *
   * @param {String} name The name of the parameter
   * @param {Boolean} [isPrivate=false] `true` if private parameters should
   *        be checked.
   * @returns {any} The value of the named parameter, or undefined if
   *          it is not present.
   */
  Object.defineProperty(this, "get", {
    value: function(name, isPrivate) {
      var src;
      if (json.base && (name in json.base)) {
        src = json.base;
      } else if (keys.public && (name in keys.public)) {
        src = keys.public;
      } else if (json.extra && (name in json.extra)) {
        src = json.extra;
      } else if (isPrivate && keys.private && (name in keys.private)) {
        // TODO: check for export restrictions
        src = keys.private;
      }

      return src && src[name] || null;
    }
  });
  /**
   * @method JWK.Key#toJSON
   * @description
   * Returns the JSON representation of this Key.  All properties of the
   * returned JSON object are properly encoded (e.g., base64url encoding for
   * any binary strings).
   *
   * @param {Boolean} [isPrivate=false] `true` if private parameters should be
   *        included.
   * @param {String[]} [excluded] The list of parameters to exclude from
   *        the returned JSON.
   * @returns {Object} The plain JSON object
   */
  Object.defineProperty(this, "toJSON", {
    value: function(isPrivate, excluded) {
      // coerce arguments
      if (Array.isArray(isPrivate)) {
        excluded = isPrivate;
        isPrivate = false;
      }
      var result = {};

      // TODO: check for export restrictions
      result = merge(result,
                       json.base,
                       json.public,
                       ("boolean" === typeof isPrivate && isPrivate) ? json.private : {},
                       json.extra);
      result = omit(result, excluded || []);

      return result;
    }
  });

  /**
   * @method JWK.Key#toPEM
   * @description
   * Returns the PEM representation of this Key as a string.
   *
   * @param {Boolean} [isPrivate=false] `true` if private parameters should be
   *        included.
   * @returns {string} The PEM-encoded string
   */
  Object.defineProperty(this, "toPEM", {
    value: function(isPrivate) {
      if (isPrivate === null) {
        isPrivate = false;
      }

      if (!cfg.convertToPEM) {
        throw new Error("Unsupported key type for PEM encoding");
      }
      var k = (isPrivate) ? keys.private : keys.public;
      if (!k) {
        throw new Error("Invalid key");
      }
      return cfg.convertToPEM.call(this, k, isPrivate);
    }
  });

  /**
   * @method JWK.Key#toObject
   * @description
   * Returns the plain object representing this Key.  All properties of the
   * returned object are in their natural encoding (e.g., binary strings
   * instead of base64url encoded).
   *
   * @param {Boolean} [isPrivate=false] `true` if private parameters should be
   *        included.
   * @param {String[]} [excluded] The list of parameters to exclude from
   *        the returned object.
   * @returns {Object} The plain Object.
   */
  Object.defineProperty(this, "toObject", {
    value: function(isPrivate, excluded) {
      // coerce arguments
      if (Array.isArray(isPrivate)) {
        excluded = isPrivate;
        isPrivate = false;
      }
      var result = {};

      // TODO: check for export restrictions
      result = merge(result,
                       json.base,
                       keys.public,
                       ("boolean" === typeof isPrivate && isPrivate) ? keys.private : {},
                       json.extra);
      result = omit(result, (excluded || []).concat("length"));

      return result;
    }
  });

  /**
   * @method JWK.Key#sign
   * @description
   * Sign the given data using the specified algorithm.
   *
   * **NOTE:** This is the primitive signing operation; the output is
   * _**NOT**_ a JSON Web Signature (JWS) object.
   *
   * The Promise, when fulfilled, returns an Object with the following
   * properties:
   *
   * + **data**: The data that was signed (and should be equal to {data}).
   * + **mac**: The signature or message authentication code (MAC).
   *
   * @param {String} alg The signing algorithm
   * @param {String|Buffer} data The data to sign
   * @param {Object} [props] Additional properties for the signing
   *        algorithm.
   * @returns {Promise} The promise for the signing operation.
   * @throws {Error} If {alg} is not appropriate for this Key; or if
   *         this Key does not contain the appropriate parameters.
   */
  Object.defineProperty(this, "sign", {
    value: function(alg, data, props) {
      // validate appropriateness
      if (this.algorithms("sign").indexOf(alg) === -1) {
        return Promise.reject(new Error("unsupported algorithm"));
      }
      var k = cfg.signKey.call(this, alg, keys);
      if (!k) {
        return Promise.reject(new Error("improper key"));
      }

      // prepare properties (if any)
      props = (props) ?
              clone(props) :
              {};
      if (cfg.signProps) {
        props = merge(props, cfg.signProps.call(this, alg, props));
      }
      return ALGORITHMS.sign(alg, k, data, props);
    }
  });
  /**
   * @method JWK.Key#verify
   * @description
   * Verify the given data and signature using the specified algorithm.
   *
   * **NOTE:** This is the primitive verification operation; the input is
   * _**NOT**_ a JSON Web Signature.</p>
   *
   * The Promise, when fulfilled, returns an Object with the following
   * properties:
   *
   * + **data**: The data that was verified (and should be equal to
   *   {data}).
   * + **mac**: The signature or MAC that was verified (and should be equal
   *   to {mac}).
   * + **valid**: `true` if {mac} is valid for {data}.
   *
   * @param {String} alg The verification algorithm
   * @param {String|Buffer} data The data to verify
   * @param {String|Buffer} mac The signature or MAC to verify
   * @param {Object} [props] Additional properties for the verification
   *        algorithm.
   * @returns {Promise} The promise for the verification operation.
   * @throws {Error} If {alg} is not appropriate for this Key; or if
   *         the Key does not contain the appropriate properties.
   */
  Object.defineProperty(this, "verify", {
    value: function(alg, data, mac, props) {
      // validate appropriateness
      if (this.algorithms("verify").indexOf(alg) === -1) {
        return Promise.reject(new Error("unsupported algorithm"));
      }
      var k = cfg.verifyKey.call(this, alg, keys);
      if (!k) {
        return Promise.reject(new Error("improper key"));
      }

      // prepare properties (if any)
      props = (props) ?
              clone(props) :
              {};
      if (cfg.verifyProps) {
        props = merge(props, cfg.verifyProps.call(this, alg, props));
      }
      return ALGORITHMS.verify(alg, k, data, mac, props);
    }
  });

  /**
   * @method JWK.Key#encrypt
   * @description
   * Encrypts the given data using the specified algorithm.
   *
   * **NOTE:** This is the primitive encryption operation; the output is
   * _**NOT**_ a JSON Web Encryption (JWE) object.
   *
   * **NOTE:** This operation is treated as distinct from {@link
   * JWK.Key#wrap}, as different algorithms and properties are often
   * used for wrapping a key versues encrypting arbitrary data.
   *
   * The Promise, when fulfilled, returns an object with the following
   * properties:
   *
   * + **data**: The ciphertext data
   * + **mac**: The associated message authentication code (MAC).
   *
   * @param {String} alg The encryption algorithm
   * @param {Buffer|String} data The data to encrypt
   * @param {Object} [props] Additional properties for the encryption
   *        algorithm.
   * @returns {Promise} The promise for the encryption operation.
   * @throws {Error} If {alg} is not appropriate for this Key; or if
   *         this Key does not contain the appropriate parameters.
   */
  Object.defineProperty(this, "encrypt", {
    value: function(alg, data, props) {
      // validate appropriateness
      if (this.algorithms("encrypt").indexOf(alg) === -1) {
        return Promise.reject(new Error("unsupported algorithm"));
      }
      var k = cfg.encryptKey.call(this, alg, keys);
      if (!k) {
        return Promise.reject(new Error("improper key"));
      }

      // prepare properties (if any)
      props = (props) ?
              clone(props) :
              {};
      if (cfg.encryptProps) {
        props = merge(props, cfg.encryptProps.call(this, alg, props));
      }
      return ALGORITHMS.encrypt(alg, k, data, props);
    }
  });
  /**
   * @method JWK.Key#decrypt
   * @description
   * Decrypts the given data using the specified algorithm.
   *
   * **NOTE:** This is the primitive decryption operation; the input is
   * _**NOT**_ a JSON Web Encryption (JWE) object.
   *
   * **NOTE:** This operation is treated as distinct from {@link
   * JWK.Key#unwrap}, as different algorithms and properties are often used
   * for unwrapping a key versues decrypting arbitrary data.
   *
   * The Promise, when fulfilled, returns the plaintext data.
   *
   * @param {String} alg The decryption algorithm.
   * @param {Buffer|String} data The data to decypt.
   * @param {Object} [props] Additional data for the decryption operation.
   * @returns {Promise} The promise for the decryption operation.
   * @throws {Error} If {alg} is not appropriate for this Key; or if
   *         the Key does not contain the appropriate properties.
   */
  Object.defineProperty(this, "decrypt", {
    value: function(alg, data, props) {
      // validate appropriateness
      if (this.algorithms("decrypt").indexOf(alg) === -1) {
        return Promise.reject(new Error("unsupported algorithm"));
      }
      var k = cfg.decryptKey.call(this, alg, keys);
      if (!k) {
        return Promise.reject(new Error("improper key"));
      }

      // prepare properties (if any)
      props = (props) ?
              clone(props) :
              {};
      if (cfg.decryptProps) {
        props = merge(props, cfg.decryptProps.call(this, alg, props));
      }
      return ALGORITHMS.decrypt(alg, k, data, props);
    }
  });

  /**
   * @method JWK.Key#wrap
   * @description
   * Wraps the given key using the specified algorithm.
   *
   * **NOTE:** This is the primitive encryption operation; the output is
   * _**NOT**_ a JSON Web Encryption (JWE) object.
   *
   * **NOTE:** This operation is treated as distinct from {@link
   * JWK.Key#encrypt}, as different algorithms and properties are
   * often used for wrapping a key versues encrypting arbitrary data.
   *
   * The Promise, when fulfilled, returns an object with the following
   * properties:
   *
   * + **data**: The ciphertext data
   * + **headers**: The additional header parameters to apply to a JWE.
   *
   * @param {String} alg The encryption algorithm
   * @param {Buffer|String} data The data to encrypt
   * @param {Object} [props] Additional properties for the encryption
   *        algorithm.
   * @returns {Promise} The promise for the encryption operation.
   * @throws {Error} If {alg} is not appropriate for this Key; or if
   *         this Key does not contain the appropriate parameters.
   */
  Object.defineProperty(this, "wrap", {
    value: function(alg, data, props) {
      // validate appropriateness
      if (this.algorithms("wrap").indexOf(alg) === -1) {
        return Promise.reject(new Error("unsupported algorithm"));
      }
      var k = cfg.wrapKey.call(this, alg, keys);
      if (!k) {
        return Promise.reject(new Error("improper key"));
      }

      // prepare properties (if any)
      props = (props) ?
              clone(props) :
              {};
      if (cfg.wrapProps) {
        props = merge(props, cfg.wrapProps.call(this, alg, props));
      }
      return ALGORITHMS.encrypt(alg, k, data, props);
    }
  });
  /**
   * @method JWK.Key#unwrap
   * @description
   * Unwraps the given key using the specified algorithm.
   *
   * **NOTE:** This is the primitive unwrap operation; the input is
   * _**NOT**_ a JSON Web Encryption (JWE) object.
   *
   * **NOTE:** This operation is treated as distinct from {@link
   * JWK.Key#decrypt}, as different algorithms and properties are often used
   * for unwrapping a key versues decrypting arbitrary data.
   *
   * The Promise, when fulfilled, returns the unwrapped key.
   *
   * @param {String} alg The unwrap algorithm.
   * @param {Buffer|String} data The data to unwrap.
   * @param {Object} [props] Additional data for the unwrap operation.
   * @returns {Promise} The promise for the unwrap operation.
   * @throws {Error} If {alg} is not appropriate for this Key; or if
   *         the Key does not contain the appropriate properties.
   */
  Object.defineProperty(this, "unwrap", {
    value: function(alg, data, props) {
      // validate appropriateness
      if (this.algorithms("unwrap").indexOf(alg) === -1) {
        return Promise.reject(new Error("unsupported algorithm"));
      }
      var k = cfg.unwrapKey.call(this, alg, keys);
      if (!k) {
        return Promise.reject(new Error("improper key"));
      }

      // prepare properties (if any)
      props = (props) ?
              clone(props) :
              {};
      if (cfg.unwrapProps) {
        props = merge(props, cfg.unwrapProps.call(this, alg, props));
      }
      return ALGORITHMS.decrypt(alg, k, data, props);
    }
  });
};

module.exports = JWKBaseKeyObject;

}).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
},{"../../../is-buffer/index.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-buffer/index.js","../algorithms":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/index.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","../util/merge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/merge.js","./constants.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/constants.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/helpers.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js","uuid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/constants.js":[function(require,module,exports){
/*!
 * jwk/constants.js - Constants for JWKs
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

module.exports = {
  MODE_SIGN: "sign",
  MODE_VERIFY: "verify",
  MODE_ENCRYPT: "encrypt",
  MODE_DECRYPT: "decrypt",
  MODE_WRAP: "wrap",
  MODE_UNWRAP: "unwrap"
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/eckey.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * jwk/rsa.js - RSA Key Representation
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var ecutil = require("../algorithms/ec-util.js"),
    forge = require("../deps/forge"),
    depsecc = require("../deps/ecc");

var JWK = {
  BaseKey: require("./basekey.js"),
  helpers: require("./helpers.js")
};

var SIG_ALGS = [
  "ES256",
  "ES384",
  "ES512"
];
var WRAP_ALGS = [
  "ECDH-ES",
  "ECDH-ES+A128KW",
  "ECDH-ES+A192KW",
  "ECDH-ES+A256KW"
];

var EC_OID = ecutil.EC_OID;
function oidToCurveName(oid) {
  switch (oid) {
    case "1.2.840.10045.3.1.7":
      return "P-256";
    case "1.3.132.0.34":
      return "P-384";
    case "1.3.132.0.35":
      return "P-521";
    default:
      return null;
  }
}

var JWKEcCfg = {
  publicKey: function(props) {
    var fields = JWK.helpers.COMMON_PROPS.concat([
      {name: "crv", type: "string"},
      {name: "x", type: "binary"},
      {name: "y", type: "binary"}
    ]);
    var pk = JWK.helpers.unpackProps(props, fields);
    if (pk && pk.crv && pk.x && pk.y) {
      pk.length = ecutil.curveSize(pk.crv);
    } else {
      delete pk.crv;
      delete pk.x;
      delete pk.y;
    }

    return pk;
  },
  privateKey: function(props) {
    var fields = JWK.helpers.COMMON_PROPS.concat([
      {name: "crv", type: "string"},
      {name: "x", type: "binary"},
      {name: "y", type: "binary"},
      {name: "d", type: "binary"}
    ]);
    var pk = JWK.helpers.unpackProps(props, fields);
    if (pk && pk.crv && pk.x && pk.y && pk.d) {
      pk.length = ecutil.curveSize(pk.crv);
    } else {
      pk = undefined;
    }

    return pk;
  },
  thumbprint: function(json) {
    if (json.public) {
      json = json.public;
    }
    var fields = {
      crv: json.crv,
      kty: "EC",
      x: json.x,
      y: json.y
    };
    return fields;
  },
  algorithms: function(keys, mode) {
    var len = (keys.public && keys.public.length) ||
              (keys.private && keys.private.length) ||
              0;
    // NOTE: 521 is the actual, but 512 is the expected
    if (len === 521) {
        len = 512;
    }

    switch (mode) {
      case "encrypt":
      case "decrypt":
        return [];
      case "wrap":
        return (keys.public && WRAP_ALGS) || [];
      case "unwrap":
        return (keys.private && WRAP_ALGS) || [];
      case "sign":
        if (!keys.private) {
          return [];
        }
        return SIG_ALGS.filter(function(a) {
          return (a === ("ES" + len));
        });
      case "verify":
        if (!keys.public) {
          return [];
        }
        return SIG_ALGS.filter(function(a) {
          return (a === ("ES" + len));
        });
    }
  },

  encryptKey: function(alg, keys) {
    return keys.public;
  },
  decryptKey: function(alg, keys) {
    return keys.private;
  },

  wrapKey: function(alg, keys) {
    return keys.public;
  },
  unwrapKey: function(alg, keys) {
    return keys.private;
  },

  signKey: function(alg, keys) {
    return keys.private;
  },
  verifyKey: function(alg, keys) {
    return keys.public;
  }
};
JWKEcCfg.convertToPEM = ecutil.convertToPEM;

// Inspired by digitalbaazar/node-forge/js/rsa.js
var validators = {
  oid: EC_OID,
  privateKey: {
    // ECPrivateKey
    name: "ECPrivateKey",
    tagClass: forge.asn1.Class.UNIVERSAL,
    type: forge.asn1.Type.SEQUENCE,
    constructed: true,
    value: [
      {
        // EC version
        name: "ECPrivateKey.version",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false
      },
      {
        // private value (d)
        name: "ECPrivateKey.private",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.OCTETSTRING,
        constructed: false,
        capture: "d"
      },
      {
        // EC parameters
        tagClass: forge.asn1.Class.CONTEXT_SPECIFIC,
        name: "ECPrivateKey.parameters",
        constructed: true,
        value: [
          {
            // namedCurve (crv)
            name: "ECPrivateKey.namedCurve",
            tagClass: forge.asn1.Class.UNIVERSAL,
            type: forge.asn1.Type.OID,
            constructed: false,
            capture: "crv"
          }
        ]
      },
      {
        // publicKey
        name: "ECPrivateKey.publicKey",
        tagClass: forge.asn1.Class.CONTEXT_SPECIFIC,
        constructed: true,
        value: [
          {
            name: "ECPrivateKey.point",
            tagClass: forge.asn1.Class.UNIVERSAL,
            type: forge.asn1.Type.BITSTRING,
            constructed: false,
            capture: "point"
          }
        ]
      }
    ]
  },
  embeddedPrivateKey: {
    // ECPrivateKey
    name: "ECPrivateKey",
    tagClass: forge.asn1.Class.UNIVERSAL,
    type: forge.asn1.Type.SEQUENCE,
    constructed: true,
    value: [
      {
        // EC version
        name: "ECPrivateKey.version",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false
      },
      {
        // private value (d)
        name: "ECPrivateKey.private",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.OCTETSTRING,
        constructed: false,
        capture: "d"
      },
      {
        // publicKey
        name: "ECPrivateKey.publicKey",
        tagClass: forge.asn1.Class.CONTEXT_SPECIFIC,
        constructed: true,
        value: [
          {
            name: "ECPrivateKey.point",
            tagClass: forge.asn1.Class.UNIVERSAL,
            type: forge.asn1.Type.BITSTRING,
            constructed: false,
            capture: "point"
          }
        ]
      }
    ]
  }
};

var JWKEcFactory = {
  kty: "EC",
  validators: validators,
  prepare: function(props) {
    // TODO: validate key properties
    var cfg = JWKEcCfg;
    var p = Promise.resolve(props);
    p = p.then(function(json) {
      return JWK.helpers.thumbprint(cfg, json);
    });
    p = p.then(function(hash) {
      var prints = {};
      prints[JWK.helpers.INTERNALS.THUMBPRINT_HASH] = hash;
      props[JWK.helpers.INTERNALS.THUMBPRINT_KEY] = prints;
      return cfg;
    });
    return p;
  },
  generate: function(size) {
    var keypair = depsecc.generateKeyPair(size);
    var result = {
      "crv": size,
      "x": keypair.public.x,
      "y": keypair.public.y,
      "d": keypair.private.d
    };
    return Promise.resolve(result);
  },
  import: function(input) {
    if (validators.oid !== input.keyOid) {
      return null;
    }

    // coerce key params to OID
    var crv;
    if (input.keyParams && forge.asn1.Type.OID === input.keyParams.type) {
      crv = forge.asn1.derToOid(input.keyParams.value);
      crv = oidToCurveName(crv);
    } else if (input.crv) {
      crv = forge.asn1.derToOid(input.crv);
      crv = oidToCurveName(crv);
    }
    if (!crv) {
      return null;
    }

    if (!input.parsed) {
      var capture = {},
          errors = [];
      if ("private" === input.type) {
        // coerce capture.value to DER *iff* private
        if ("string" === typeof input.keyValue) {
          input.keyValue = forge.asn1.fromDer(input.keyValue);
        } else if (Array.isArray(input.keyValue)) {
          input.keyValue = input.keyValue[0];
        }

        if (!forge.asn1.validate(input.keyValue,
                                 validators.embeddedPrivateKey,
                                 capture,
                                 errors)) {
          return null;
        }
      } else {
        capture.point = input.keyValue;
      }
      input = capture;
    }

    // convert factors to Buffers
    var output = {
      kty: "EC",
      crv: crv
    };
    if (input.d) {
      output.d = Buffer.from(input.d, "binary");
    }
    if (input.point) {
      var pt = Buffer.from(input.point, "binary");
      // only support uncompressed
      if (4 !== pt.readUInt16BE(0)) {
        return null;
      }
      pt = pt.slice(2);
      var len = pt.length / 2;
      output.x = pt.slice(0, len);
      output.y = pt.slice(len);
    }
    return output;
  }
};
// public API
module.exports = Object.freeze({
  config: JWKEcCfg,
  factory: JWKEcFactory
});

// registration
(function(REGISTRY) {
  REGISTRY.register(JWKEcFactory);
})(require("./keystore").registry);

}).call(this)}).call(this,require("buffer").Buffer)
},{"../algorithms/ec-util.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/ec-util.js","../deps/ecc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/ecc/index.js","../deps/forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","./basekey.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/basekey.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/helpers.js","./keystore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/keystore.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/helpers.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * jwk/helpers.js - JWK Internal Helper Functions and Constants
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var clone = require("lodash").clone,
    util = require("../util"),
    forge = require("../deps/forge");

var ALGORITHMS = require("../algorithms");

// ### ASN.1 Validators
// Adapted from digitalbazaar/node-forge/js/asn1.js
// PrivateKeyInfo
var privateKeyValidator = {
  name: "PrivateKeyInfo",
  tagClass: forge.asn1.Class.UNIVERSAL,
  type: forge.asn1.Type.SEQUENCE,
  constructed: true,
  value: [
    {
      // Version (INTEGER)
      name: "PrivateKeyInfo.version",
      tagClass: forge.asn1.Class.UNIVERSAL,
      type: forge.asn1.Type.INTEGER,
      constructed: false,
      capture: "keyVersion"
    },
    {
      name: "PrivateKeyInfo.privateKeyAlgorithm",
      tagClass: forge.asn1.Class.UNIVERSAL,
      type: forge.asn1.Type.SEQUENCE,
      constructed: true,
      value: [
        {
          name: "AlgorithmIdentifier.algorithm",
          tagClass: forge.asn1.Class.UNIVERSAL,
          type: forge.asn1.Type.OID,
          constructed: false,
          capture: "keyOid"
        },
        {
          name: "AlgorithmIdentifier.parameters",
          captureAsn1: "keyParams"
        }
      ]
    },
    {
      name: "PrivateKeyInfo",
      tagClass: forge.asn1.Class.UNIVERSAL,
      type: forge.asn1.Type.OCTETSTRING,
      constructed: false,
      capture: "keyValue"
    }
  ]
};
// Adapted from digitalbazaar/node-forge/x509.js
var publicKeyValidator = {
  name: "SubjectPublicKeyInfo",
  tagClass: forge.asn1.Class.UNIVERSAL,
  type: forge.asn1.Type.SEQUENCE,
  constructed: true,
  value: [
    {
      name: "SubjectPublicKeyInfo.AlgorithmIdentifier",
      tagClass: forge.asn1.Class.UNIVERSAL,
      type: forge.asn1.Type.SEQUENCE,
      constructed: true,
      value: [
        {
          name: "AlgorithmIdentifier.algorithm",
          tagClass: forge.asn1.Class.UNIVERSAL,
          type: forge.asn1.Type.OID,
          constructed: false,
          capture: "keyOid"
        },
        {
          name: "AlgorithmIdentifier.parameters",
          captureAsn1: "keyParams"
        }
      ]
    },
    {
      name: "SubjectPublicKeyInfo.subjectPublicKey",
      tagClass: forge.asn1.Class.UNIVERSAL,
      type: forge.asn1.Type.BITSTRING,
      constructed: false,
      capture: "keyValue"
    }
  ]
};
// Adapted from digitalbazaar/node-forge/x509.js
var X509CertificateValidator = {
  name: "Certificate",
  tagClass: forge.asn1.Class.UNIVERSAL,
  type: forge.asn1.Type.SEQUENCE,
  constructed: true,
  value: [
    {
      name: "Certificate.TBSCertificate",
      tagClass: forge.asn1.Class.UNIVERSAL,
      type: forge.asn1.Type.SEQUENCE,
      constructed: true,
      captureAsn1: "certificate",
      value: [
        {
          name: "Certificate.TBSCertificate.version",
          tagClass: forge.asn1.Class.CONTEXT_SPECIFIC,
          type: 0,
          constructed: true,
          optional: true,
          value: [
            {
              name: "Certificate.TBSCertificate.version.integer",
              tagClass: forge.asn1.Class.UNIVERSAL,
              type: forge.asn1.Type.INTEGER,
              constructed: false,
              capture: "certVersion"
            }
          ]
        },
        {
          name: "Certificate.TBSCertificate.serialNumber",
          tagClass: forge.asn1.Class.UNIVERSAL,
          type: forge.asn1.Type.INTEGER,
          constructed: false,
          capture: "certSerialNumber"
        },
        {
          name: "Certificate.TBSCertificate.signature",
          tagClass: forge.asn1.Class.UNIVERSAL,
          type: forge.asn1.Type.SEQUENCE,
          constructed: true,
          value: [
            {
              name: "Certificate.TBSCertificate.signature.algorithm",
              tagClass: forge.asn1.Class.UNIVERSAL,
              type: forge.asn1.Type.OID,
              constructed: false,
              capture: "certSignatureOid"
            }, {
              name: "Certificate.TBSCertificate.signature.parameters",
              tagClass: forge.asn1.Class.UNIVERSAL,
              optional: true,
              captureAsn1: "certSignatureParams"
            }
          ]
        },
        {
          name: "Certificate.TBSCertificate.issuer",
          tagClass: forge.asn1.Class.UNIVERSAL,
          type: forge.asn1.Type.SEQUENCE,
          constructed: true,
          captureAsn1: "certIssuer"
        },
        {
          name: "Certificate.TBSCertificate.validity",
          tagClass: forge.asn1.Class.UNIVERSAL,
          type: forge.asn1.Type.SEQUENCE,
          constructed: true,
          // Note: UTC and generalized times may both appear so the capture
          // names are based on their detected order, the names used below
          // are only for the common case, which validity time really means
          // "notBefore" and which means "notAfter" will be determined by order
          value: [
            {
              // notBefore (Time) (UTC time case)
              name: "Certificate.TBSCertificate.validity.notBefore (utc)",
              tagClass: forge.asn1.Class.UNIVERSAL,
              type: forge.asn1.Type.UTCTIME,
              constructed: false,
              optional: true,
              capture: "certValidity1UTCTime"
            },
            {
              // notBefore (Time) (generalized time case)
              name: "Certificate.TBSCertificate.validity.notBefore (generalized)",
              tagClass: forge.asn1.Class.UNIVERSAL,
              type: forge.asn1.Type.GENERALIZEDTIME,
              constructed: false,
              optional: true,
              capture: "certValidity2GeneralizedTime"
            },
            {
              // notAfter (Time) (only UTC time is supported)
              name: "Certificate.TBSCertificate.validity.notAfter (utc)",
              tagClass: forge.asn1.Class.UNIVERSAL,
              type: forge.asn1.Type.UTCTIME,
              constructed: false,
              optional: true,
              capture: "certValidity3UTCTime"
            },
            {
              // notAfter (Time) (only UTC time is supported)
              name: "Certificate.TBSCertificate.validity.notAfter (generalized)",
              tagClass: forge.asn1.Class.UNIVERSAL,
              type: forge.asn1.Type.GENERALIZEDTIME,
              constructed: false,
              optional: true,
              capture: "certValidity4GeneralizedTime"
            }
          ]
        }, {
          // Name (subject) (RDNSequence)
          name: "Certificate.TBSCertificate.subject",
          tagClass: forge.asn1.Class.UNIVERSAL,
          type: forge.asn1.Type.SEQUENCE,
          constructed: true,
          captureAsn1: "certSubject"
        },
        // SubjectPublicKeyInfo
        publicKeyValidator,
        {
          // issuerUniqueID (optional)
          name: "Certificate.TBSCertificate.issuerUniqueID",
          tagClass: forge.asn1.Class.CONTEXT_SPECIFIC,
          type: 1,
          constructed: true,
          optional: true,
          value: [
            {
              name: "Certificate.TBSCertificate.issuerUniqueID.id",
              tagClass: forge.asn1.Class.UNIVERSAL,
              type: forge.asn1.Type.BITSTRING,
              constructed: false,
              capture: "certIssuerUniqueId"
            }
          ]
        },
        {
          // subjectUniqueID (optional)
          name: "Certificate.TBSCertificate.subjectUniqueID",
          tagClass: forge.asn1.Class.CONTEXT_SPECIFIC,
          type: 2,
          constructed: true,
          optional: true,
          value: [
            {
              name: "Certificate.TBSCertificate.subjectUniqueID.id",
              tagClass: forge.asn1.Class.UNIVERSAL,
              type: forge.asn1.Type.BITSTRING,
              constructed: false,
              capture: "certSubjectUniqueId"
            }
          ]
        },
        {
          // Extensions (optional)
          name: "Certificate.TBSCertificate.extensions",
          tagClass: forge.asn1.Class.CONTEXT_SPECIFIC,
          type: 3,
          constructed: true,
          captureAsn1: "certExtensions",
          optional: true
        }
      ]
    },
    {
      // AlgorithmIdentifier (signature algorithm)
      name: "Certificate.signatureAlgorithm",
      tagClass: forge.asn1.Class.UNIVERSAL,
      type: forge.asn1.Type.SEQUENCE,
      constructed: true,
      value: [
        {
          // algorithm
          name: "Certificate.signatureAlgorithm.algorithm",
          tagClass: forge.asn1.Class.UNIVERSAL,
          type: forge.asn1.Type.OID,
          constructed: false,
          capture: "certSignatureOid"
        },
        {
          name: "Certificate.TBSCertificate.signature.parameters",
          tagClass: forge.asn1.Class.UNIVERSAL,
          optional: true,
          captureAsn1: "certSignatureParams"
        }
      ]
    },
    {
      // SignatureValue
      name: "Certificate.signatureValue",
      tagClass: forge.asn1.Class.UNIVERSAL,
      type: forge.asn1.Type.BITSTRING,
      constructed: false,
      capture: "certSignature"
    }
  ]
};

var INTERNALS = {
  THUMBPRINT_KEY: "internal\u0000thumbprint",
  THUMBPRINT_HASH: "SHA-256"
};

module.exports = {
  validators: {
    privateKey: privateKeyValidator,
    publicKey: publicKeyValidator,
    certificate: X509CertificateValidator
  },

  thumbprint: function(cfg, json, hash) {
    if ("function" !== typeof cfg.thumbprint) {
      return Promise.reject(new Error("thumbprint not supported"));
    }

    hash = (hash || INTERNALS.THUMBPRINT_HASH).toUpperCase();
    var fields = cfg.thumbprint(json);
    var input = Object.keys(fields).
                sort().
                map(function(k) {
      var v = fields[k];
      if (Buffer.isBuffer(v)) {
        v = util.base64url.encode(v);
      }
      return JSON.stringify(k) + ":" + JSON.stringify(v);
    });
    input = "{" + input.join(",") + "}";
    try {
      return ALGORITHMS.digest(hash, Buffer.from(input, "utf8"));
    } catch (err) {
      return Promise.reject(err);
    }
  },
  unpackProps: function(props, allowed) {
    var output;

    // apply all of the existing values
    allowed.forEach(function(cfg) {
      if (!(cfg.name in props)) {
        return;
      }
      output = output || {};
      var value = props[cfg.name];
      switch (cfg.type) {
        case "binary":
          if (Buffer.isBuffer(value)) {
            props[cfg.name] = util.base64url.encode(value);
          } else {
            value = util.base64url.decode(value);
          }
          break;
        case "string":
        case "number":
        case "boolean":
          break;
        case "array":
          value = [].concat(value);
          break;
        case "object":
          value = clone(value);
          break;
        default:
          // TODO: deep clone?
          break;
      }
      output[cfg.name] = value;
    });

    // remove any from json that didn't apply
    var check = output || {};
    Object.keys(props).
           forEach(function(n) {
              if (n in check) { return; }
              delete props[n];
           });

    return output;
  },
  COMMON_PROPS: [
    {name: "kty", type: "string"},
    {name: "kid", type: "string"},
    {name: "use", type: "string"},
    {name: "alg", type: "string"},
    {name: "x5c", type: "array"},
    {name: "x5t", type: "binary"},
    {name: "x5u", type: "string"},
    {name: "key_ops", type: "array"}
  ],
  INTERNALS: INTERNALS
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"../algorithms":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/index.js","../deps/forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/index.js":[function(require,module,exports){
/*!
 * jwk/index.js - JSON Web Key (JWK) Entry Point
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var JWKStore = require("./keystore.js");

// Public API -- Key and KeyStore methods
Object.keys(JWKStore.KeyStore).forEach(function(name) {
  exports[name] = JWKStore.KeyStore[name];
});

// Public API -- constants
var CONSTANTS = require("./constants.js");
Object.keys(CONSTANTS).forEach(function(name) {
  exports[name] = CONSTANTS[name];
});

// Registered Key Types
require("./octkey.js");
require("./rsakey.js");
require("./eckey.js");

},{"./constants.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/constants.js","./eckey.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/eckey.js","./keystore.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/keystore.js","./octkey.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/octkey.js","./rsakey.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/rsakey.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/keystore.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * jwk/keystore.js - JWK KeyStore Implementation
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var clone = require("lodash").clone,
    merge = require("../util/merge"),
    forge = require("../deps/forge"),
    util = require("../util");

var JWK = {
  BaseKey: require("./basekey.js"),
  helpers: require("./helpers.js")
};

/**
 * @class JWK.KeyStoreRegistry
 * @classdesc
 * A registry of JWK.Key types that can be used.
 *
 * @description
 * **NOTE:** This constructor cannot be called directly. Instead use the
 * global {JWK.registry}
 */
var JWKRegistry = function() {
  var types = {};

  Object.defineProperty(this, "register", {
    value: function(factory) {
      if (!factory || "string" !== typeof factory.kty || !factory.kty) {
        throw new Error("invalid Key factory");
      }

      var kty = factory.kty;
      types[kty] = factory;
      return this;
    }
  });
  Object.defineProperty(this, "unregister", {
    value: function(factory) {
      if (!factory || "string" !== typeof factory.kty || !factory.kty) {
        throw new Error("invalid Key factory");
      }

      var kty = factory.kty;
      if (factory === types[kty]) {
        delete types[kty];
      }
      return this;
    }
  });

  Object.defineProperty(this, "get", {
    value: function(kty) {
      return types[kty || ""] || undefined;
    }
  });
  Object.defineProperty(this, "all", {
    value: function() {
      return Object.keys(types).map(function(t) { return types[t]; });
    }
  });
};

// Globals
var GLOBAL_REGISTRY = new JWKRegistry();

// importer
function processCert(input) {
  // convert certIssuer to readable attributes
  ["certIssuer", "certSubject"].forEach(function(field) {
    /* eslint new-cap: [0] */
    var attrs = forge.pki.RDNAttributesAsArray(input[field]);
    var result = input[field] = {};
    attrs.forEach(function(a) {
      result[a.name || a.type] = a.value;
    });
  });

  return input;
}

function fromPEM(input) {
  var result = {};
  var pems = forge.pem.decode(input);
  var found = pems.some(function(p) {
    switch (p.type) {
      case "CERTIFICATE":
        result.form = "pkix";
        break;
      case "PUBLIC KEY":
        result.form = "spki";
        break;
      case "PRIVATE KEY":
        result.form = "pkcs8";
        break;
      case "EC PRIVATE KEY":
        /* eslint no-fallthrough: [0] */
      case "RSA PRIVATE KEY":
        result.form = "private";
        break;
      default:
        return false;
    }

    result.body = p.body;
    return true;
  });
  if (!found) {
    throw new Error("supported PEM type not found");
  }
  return result;
}
function importFrom(registry, input) {
  // form can be one of:
  //  'private' | 'pkcs8' | 'public' | 'spki' | 'pkix' | 'x509'
  var capture = {},
      errors = [],
      result;

  // conver from DER to ASN1
  var form = input.form,
      der = input.body,
      thumbprint = null;
  input = forge.asn1.fromDer(der);
  switch(form) {
    case "private":
      registry.all().some(function(factory) {
        if (result) {
          return false;
        }
        if (!factory.validators) {
          return false;
        }

        var oid = factory.validators.oid,
            validator = factory.validators.privateKey;
        if (!validator) {
          return false;
        }
        capture = {};
        errors = [];
        result = forge.asn1.validate(input, validator, capture, errors);
        if (result) {
          capture.keyOid = forge.asn1.oidToDer(oid);
          capture.parsed = true;
        }
        return result;
      });
      capture.type = "private";
      break;
    case "pkcs8":
      result = forge.asn1.validate(input, JWK.helpers.validators.privateKey, capture, errors);
      capture.type = "private";
      break;
    case "public":
      // eslint no-fallthrough: [0] */
    case "spki":
      result = forge.asn1.validate(input, JWK.helpers.validators.publicKey, capture, errors);
      capture.type = "public";
      break;
    case "pkix":
      /* eslint no-fallthrough: [0] */
    case "x509":
      result = forge.asn1.validate(input, JWK.helpers.validators.certificate, capture, errors);
      if (result) {
        capture = processCert(capture);
        var md = forge.md.sha1.create();
        md.update(der);
        thumbprint = util.base64url.encode(Buffer.from(md.digest().toHex(), "hex"));
      }
      capture.type = "public";
      break;
  }
  if (!result) {
    return null;
  }

  // convert oids
  if (capture.keyOid) {
    capture.keyOid = forge.asn1.derToOid(capture.keyOid);
  }

  // find and invoke the importer
  result = null;
  GLOBAL_REGISTRY.all().forEach(function(factory) {
    if (result) {
      return;
    }
    if (!factory) {
      return;
    }
    if ("function" !== typeof factory.import) {
      return;
    }
    result = factory.import(capture);
  });
  if (result && capture.certSubject && capture.certSubject.commonName) {
    result.kid = capture.certSubject.commonName;
  }
  if (result && thumbprint) {
    result.x5t = thumbprint;
  }
  return result;
}

/**
 * @class JWK.KeyStore
 * @classdesc
 * Represents a collection of Keys.
 *
 * @description
 * **NOTE:** This constructor cannot be called directly. Instead call {@link
 * JWK.createKeyStore}.
 */
var JWKStore = function(registry, parent) {
  var keysets = {};

  /**
   * @method JWK.KeyStore#generate
   * @description
   * Generates a new random Key into this KeyStore.
   *
   * The type of {size} depends on the value of {kty}:
   *
   * + **`EC`**: String naming the curve to use, which can be one of:
   *   `"P-256"`, `"P-384"`, or `"P-521"` (default is **`"P-256"`**).
   * + **`RSA`**: Number describing the size of the key, in bits (default is
   *   **`2048`**).
   * + **`oct`**: Number describing the size of the key, in bits (default is
   *   **`256`**).
   *
   * Any properties in {props} are applied before the key is generated,
   * and are expected to be data types acceptable in JSON.  This allows the
   * generated key to have a specific key identifier, or to specify its
   * acceptable usage.
   *
   * The returned Promise, when fulfilled, returns the generated Key.
   *
   * @param {String} kty The type of generated key
   * @param {String|Number} [size] The size of the generated key
   * @param {Object} [props] Additional properties to apply to the generated
   *        key.
   * @returns {Promise} The promise for the generated Key
   * @throws {Error} If {kty} is not supported
   */
  Object.defineProperty(this, "generate", {
    value: function(kty, size, props) {
      var keytype = registry.get(kty);
      if (!keytype) {
        return Promise.reject(new Error("unsupported key type"));
      }

      props = clone(props || {});
      props.kty = kty;

      var self = this,
          promise = keytype.generate(size);
      return promise.then(function(jwk) {
        jwk = merge(props, jwk, {
          kty: kty
        });
        return self.add(jwk);
      });
    }
  });
  /**
   * @method JWK.KeyStore#add
   * @description
   * Adds a Key to this KeyStore. If {jwk} is a string, it is first
   * parsed into a plain JSON object. If {jwk} is already an instance
   * of JWK.Key, its (public) JSON representation is first obtained
   * then applied to a new JWK.Key object within this KeyStore.
   *
   * @param {String|Object} jwk The JSON Web Key (JWK)
   * @param {String} [form] The format of a String key to expect
   * @param {Object} [extras] extra jwk fields inserted when importing from a non json string (eg "pem")
   * @returns {Promise} The promise for the added key
   */
  Object.defineProperty(this, "add", {
    value: function(jwk, form, extras) {
      extras = extras || {};

      var factors;
      if (Buffer.isBuffer(jwk) || typeof jwk === "string") {
        // form can be 'json', 'pkcs8', 'spki', 'pkix', 'x509', 'pem'
        form = (form || "json").toLowerCase();
        if ("json" === form) {
          jwk = JSON.parse(jwk.toString("utf8"));
        } else {
          try {
            if ("pem" === form) {
              // convert *first* PEM -> DER
              factors = fromPEM(jwk);
            } else {
              factors = {
                body: jwk.toString("binary"),
                form: form
              };
            }
            jwk = importFrom(registry, factors);
            if (!jwk) {
              throw new Error("no importer for key");
            }
            Object.keys(extras).forEach(function(field){
              jwk[field] = extras[field];
            });
          } catch (err) {
            return Promise.reject(err);
          }
        }
      } else if (JWKStore.isKey(jwk)) {
        // assume a complete duplicate is desired
        jwk = jwk.toJSON(true);
      } else {
        jwk = clone(jwk);
      }

      var keytype = registry.get(jwk.kty);
      if (!keytype) {
        return Promise.reject(new Error("unsupported key type"));
      }

      var self = this,
          promise = keytype.prepare(jwk);
      return promise.then(function(cfg) {
        return new JWK.BaseKey(jwk.kty, self, jwk, cfg);
      }).then(function(jwk) {
        var kid = jwk.kid || "";
        var keys = keysets[kid] = keysets[kid] || [];
        keys.push(jwk);

        return jwk;
      });
    }
  });
  /**
   * @method JWK.KeyStore#remove
   * @description
   * Removes a Key from this KeyStore.
   *
   * **NOTE:** The removed Key's {keystore} property is not changed.
   *
   * @param {JWK.Key} jwk The key to remove.
   */
  Object.defineProperty(this, "remove", {
    value: function(jwk) {
      if (!jwk) {
        return;
      }

      var keys = keysets[jwk.kid];
      if (!keys) {
        return;
      }

      var pos = keys.indexOf(jwk);
      if (pos === -1) {
        return;
      }

      keys.splice(pos, 1);
      if (!keys.length) {
        delete keysets[jwk.kid];
      }
    }
  });

  /**
   * @method JWK.KeyStore#all
   * @description
   * Retrieves all of the contained Keys that optinally match all of the
   * given properties.
   *
   * If {props} are specified, this method only returns Keys which exactly
   * match the given properties. The properties can be any of the
   * following:
   *
   * + **alg**: The algorithm for the Key.
   * + **use**: The usage for the Key.
   * + **kid**: The identifier for the Key.
   *
   * If no properties are given, this method returns all of the Keys for this
   * KeyStore.
   *
   * @param {Object} [props] The properties to match against
   * @param {Boolean} [local = false] `true` if only the Keys
   *        directly contained by this KeyStore should be returned, or
   *        `false` if it should return all Keys of this KeyStore and
   *        its ancestors.
   * @returns {JWK.Key[]} The list of matching Keys, or an empty array if no
   *          matches are found.
   */
  Object.defineProperty(this, "all", {
    value: function(props, local) {
      props = props || {};

      // workaround for issues/109
      if (props.kid !== undefined && props.kid !== null && typeof props.kid !== "string") {
        props.kid = String(props.kid);
      }

      var candidates = [];
      var matches = function(key) {
        // match on 'kty'
        if (props.kty &&
            key.kty &&
            props.kty !== key.kty) {
          return false;
        }
        // match on 'use'
        if (props.use &&
            key.use &&
            props.use !== key.use) {
          return false;
        }
        // match on 'alg'
        if (props.alg) {
          if (props.alg !== "dir" &&
              key.alg &&
              props.alg !== key.alg) {
            return false;
          }
          return key.supports(props.alg);
        }
        //TODO: match on 'key_ops'

        return true;
      };
      Object.keys(keysets).forEach(function(id) {
        if (props.kid && props.kid !== id) {
          return;
        }

        var keys = keysets[id].filter(matches);
        if (keys.length) {
          candidates = candidates.concat(keys);
        }
      });

      if (!local && parent) {
        candidates = candidates.concat(parent.all(props));
      }

      return candidates;
    }
  });
  /**
   * @method JWK.KeyStore#get
   * @description
   * Retrieves the contained Key matching the given {kid}, and optionally
   * all of the given properties.  This method equivalent to calling
   * {@link JWK.Store#all}, then returning the first Key whose
   * "kid" is {kid}. If {kid} is undefined, then the first Key that
   * is returned from `all()` is returned.
   *
   * @param {String} [kid] The key identifier to match against.
   * @param {Object} [props] The properties to match against.
   * @param {Boolean} [local = false] `true` if only the Keys
   *        directly contained by this KeyStore should be returned, or
   *        `false` if it should return all Keys of this KeyStore and
   *        its ancestors.
   * @returns {JWK.Key} The Key matching {kid} and {props}, or `null`
   *          if no match is found.
   */
  Object.defineProperty(this, "get", {
    value: function(kid, props, local) {
      // reconcile arguments
      if (typeof kid === "boolean") {
        local = kid;
        props = kid = null;
      } else if (typeof kid === "object") {
        local = props;
        props = kid;
        kid = null;
      }

      // fixup props
      props = props || {};
      if (kid) {
        props.kid = kid;
      }

      // workaround for issues/109
      if (props.kid !== undefined && props.kid !== null && typeof props.kid !== "string") {
       props.kid = String(props.kid);
      }

      var candidates = this.all(props, true);
      if (!candidates.length && parent && !local) {
        candidates = parent.get(props, local);
      }
      return candidates[0] || null;
    }
  });

  /**
   * @method JWK.KeyStore#temp
   * @description
   * Creates a temporary KeyStore based on this KeyStore.
   *
   * @returns {JWK.KeyStore} The temporary KeyStore.
   */
  Object.defineProperty(this, "temp", {
    value: function() {
      return new JWKStore(registry, this);
    }
  });

  /**
   * @method JWK.KeyStore#toJSON
   * @description
   * Generates a JSON representation of this KeyStore, which conforms
   * to a JWK Set from {I-D.ietf-jose-json-web-key}.
   *
   * @param {Boolean} [isPrivate = false] `true` if the private fields
   *        of stored keys are to be included.
   * @returns {Object} The JSON representation of this KeyStore.
   */
  Object.defineProperty(this, "toJSON", {
    value: function(isPrivate) {
      var keys = [];

      Object.keys(keysets).forEach(function(kid) {
        var items = keysets[kid].map(function(k) {
          return k.toJSON(isPrivate);
        });
        keys = keys.concat(items);
      });

      return {
        keys: keys
      };
    }
  });
};

/**
 * Determines if the given object is an instance of JWK.KeyStore.
 *
 * @param {Object} obj The object to test
 * @returns {Boolean} `true` if {obj} is an instance of JWK.KeyStore,
 *          and `false` otherwise.
 */
JWKStore.isKeyStore = function(obj) {
  if (!obj) {
    return false;
  }

  if ("object" !== typeof obj) {
    return false;
  }

  if ("function" !== typeof obj.get ||
      "function" !== typeof obj.all ||
      "function" !== typeof obj.generate ||
      "function" !== typeof obj.add ||
      "function" !== typeof obj.remove) {
    return false;
  }

  return true;
};

/**
 * Creates a new empty KeyStore.
 *
 * @returns {JWK.KeyStore} The empty KeyStore.
 */
JWKStore.createKeyStore = function() {
  return new JWKStore(GLOBAL_REGISTRY);
};

/**
 * Coerces the given object into a KeyStore. This method uses the following
 * algorithm to coerce {ks}:
 *
 * 1. if {ks} is an instance of JWK.KeyStore, it is returned directly
 * 2. if {ks} is a string, it is parsed into a JSON value
 * 3. if {ks} is an array, it creates a new JWK.KeyStore and calls {@link
 *    JWK.KeyStore#add} for each element in the {ks} array.
 * 4. if {ks} is a JSON object, it creates a new JWK.KeyStore and calls {@link
 *    JWK.KeyStore#add} for each element in the "keys" property.
 *
 * @param {Object|String} ks The value to coerce into a
 *        KeyStore
 * @returns {Promise(JWK.KeyStore)} A promise for the coerced KeyStore.
 */
JWKStore.asKeyStore = function(ks) {
  if (JWKStore.isKeyStore(ks)) {
    return Promise.resolve(ks);
  }

  var store = JWKStore.createKeyStore(),
      keys;

  if (typeof ks === "string") {
    ks = JSON.parse(ks);
  }

  if (Array.isArray(ks)) {
    keys = ks;
  } else if ("keys" in ks) {
    keys = ks.keys;
  } else {
    return Promise.reject(new Error("invalid keystore"));
  }

  keys = keys.map(function(k) {
    return store.add(k);
  });

  var promise = Promise.all(keys);
  promise = promise.then(function() {
    return store;
  });

  return promise;
};


/**
 * Determines if the given object is a JWK.Key instance.
 *
 * @param {Object} obj The object to test
 * @returns `true` if {obj} is a JWK.Key
 */
JWKStore.isKey = function(obj) {
  if (!obj) {
    return false;
  }

  if ("object" !== typeof obj) {
    return false;
  }

  if (!JWKStore.isKeyStore(obj.keystore)) {
    return false;
  }

  if ("string" !== typeof obj.kty ||
      "number" !== typeof obj.length ||
      "function" !== typeof obj.algorithms ||
      "function" !== typeof obj.supports ||
      "function" !== typeof obj.encrypt ||
      "function" !== typeof obj.decrypt ||
      "function" !== typeof obj.wrap ||
      "function" !== typeof obj.unwrap ||
      "function" !== typeof obj.sign ||
      "function" !== typeof obj.verify) {
    return false;
  }

  return true;
};

/**
 * Creates a new key with the given properties.  This method is a convenience
 * to calling `JWK.createKeyStore()` then `generate()` on the returned keystore.
 *
 * @param {String} kty The type of generated key
 * @param {String|Number} [size] The size of the generated key
 * @param {Object} [props] Additional properties to apply to the generated
 *        key.
 * @returns {Promise} The promise for the generated Key
 * @throws {Error} If {kty} is not supported
 * @see JWKStore#generate
 */
JWKStore.createKey = function(kty, size, props) {
  var ks = JWKStore.createKeyStore();
  return ks.generate(kty, size, props);
}

/**
 * Coerces the given object into a Key. If {key} is an instance of JWK.Key,
 * it is returned directly. Otherwise, this method first creates a new
 * JWK.KeyStore and calls {@link JWK.KeyStore#add} on this new KeyStore.
 *
 * @param {Object|String} key The value to coerce into a Key
 * @param {String} [form] The format of a String Key to expect
 * @param {Object} [extras] extra jwk fields inserted when importing from a non json string (eg "pem")
 * @returns {Promise(JWK.Key)} A promise for the coerced Key.
 */
JWKStore.asKey = function(key, form, extras) {
  if (JWKStore.isKey(key)) {
    return Promise.resolve(key);
  }

  var ks = JWKStore.createKeyStore();
  key = ks.add(key, form, extras);

  return key;
};

module.exports = {
  KeyRegistry: JWKRegistry,
  KeyStore: JWKStore,
  registry: GLOBAL_REGISTRY
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/forge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","../util/merge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/merge.js","./basekey.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/basekey.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/helpers.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/octkey.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * jwk/octkey.js - Symmetric Octet Key Representation
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var util = require("../util");

var JWK = {
  BaseKey: require("./basekey.js"),
  helpers: require("./helpers.js")
};

var SIG_ALGS = [
  "HS256",
  "HS384",
  "HS512"
];
var ENC_ALGS = [
  "A128GCM",
  "A192GCM",
  "A256GCM",
  "A128CBC-HS256",
  "A192CBC-HS384",
  "A256CBC-HS512",
  "A128CBC+HS256",
  "A192CBC+HS384",
  "A256CBC+HS512"
];
var WRAP_ALGS = [
  "A128KW",
  "A192KW",
  "A256KW",
  "A128GCMKW",
  "A192GCMKW",
  "A256GCMKW",
  "PBES2-HS256+A128KW",
  "PBES2-HS384+A192KW",
  "PBES2-HS512+A256KW",
  "dir"
];

function adjustDecryptProps(alg, props) {
  if ("iv" in props) {
    props.iv = Buffer.isBuffer(props.iv) ?
               props.iv :
               util.base64url.decode(props.iv || "");
  }
  if ("adata" in props) {
    props.adata = Buffer.isBuffer(props.adata) ?
                  props.adata :
                  Buffer.from(props.adata || "", "utf8");
  }
  if ("mac" in props) {
    props.mac = Buffer.isBuffer(props.mac) ?
                props.mac :
                util.base64url.decode(props.mac || "");
  }
  if ("tag" in props) {
    props.tag = Buffer.isBuffer(props.tag) ?
                props.tag :
                util.base64url.decode(props.tag || "");
  }

  return props;
}
function adjustEncryptProps(alg, props) {
  if ("iv" in props) {
    props.iv = Buffer.isBuffer(props.iv) ?
               props.iv :
               util.base64url.decode(props.iv || "");
  }
  if ("adata" in props) {
    props.adata = Buffer.isBuffer(props.adata) ?
                  props.adata :
                  Buffer.from(props.adata || "", "utf8");
  }

  return props;
}

var JWKOctetCfg = {
  publicKey: function(props) {
    var fields = JWK.helpers.COMMON_PROPS.concat([
    ]);

    var pk;
    pk = JWK.helpers.unpackProps(props, fields);

    return pk;
  },
  privateKey: function(props) {
    var fields = JWK.helpers.COMMON_PROPS.concat([
      {name: "k", type: "binary"}
    ]);

    var pk;
    pk = JWK.helpers.unpackProps(props, fields);
    if (pk && pk.k) {
      pk.length = pk.k.length * 8;
    } else {
      pk = undefined;
    }

    return pk;
  },

  thumbprint: function(json) {
    if (json.private) {
      json = json.private;
    }
    var fields;
    fields = {
      k: json.k || "",
      kty: "oct"
    };
    return fields;
  },
  algorithms: function(keys, mode) {
    var len = keys.private && (keys.private.k.length * 8);
    var mins = [256, 384, 512];

    if (!len) {
      return [];
    }
    switch (mode) {
      case "encrypt":
      case "decrypt":
        return ENC_ALGS.filter(function(a) {
          return (a === ("A" + (len / 2) + "CBC-HS" + len)) ||
                 (a === ("A" + (len / 2) + "CBC+HS" + len)) ||
                 (a === ("A" + len + "GCM"));
        });
      case "sign":
      case "verify":
        // TODO: allow for HS{less-than-keysize}
        return SIG_ALGS.filter(function(a) {
          var result = false;
          mins.forEach(function(m) {
            if (m > len) { return; }
            result = result | (a === ("HS" + m));
          });
          return result;
        });
      case "wrap":
      case "unwrap":
        return WRAP_ALGS.filter(function(a) {
          return (a === ("A" + len + "KW")) ||
                 (a === ("A" + len + "GCMKW")) ||
                 (a.indexOf("PBES2-") === 0) ||
                 (a === "dir");
        });
    }

    return [];
  },
  encryptKey: function(alg, keys) {
    return keys.private && keys.private.k;
  },
  encryptProps: adjustEncryptProps,

  decryptKey: function(alg, keys) {
    return keys.private && keys.private.k;
  },
  decryptProps: adjustDecryptProps,

  wrapKey: function(alg, keys) {
    return keys.private && keys.private.k;
  },
  wrapProps: adjustEncryptProps,

  unwrapKey: function(alg, keys) {
    return keys.private && keys.private.k;
  },
  unwrapProps: adjustDecryptProps,

  signKey: function(alg, keys) {
    return keys.private && keys.private.k;
  },
  verifyKey: function(alg, keys) {
    return keys.private && keys.private.k;
  }
};

// Factory
var JWKOctetFactory = {
  kty: "oct",
  prepare: function(props) {
    // TODO: validate key properties
    var cfg = JWKOctetCfg;
    var p = Promise.resolve(props);
    p = p.then(function(json) {
      return JWK.helpers.thumbprint(cfg, json);
    });
    p = p.then(function(hash) {
      var prints = {};
      prints[JWK.helpers.INTERNALS.THUMBPRINT_HASH] = hash;
      props[JWK.helpers.INTERNALS.THUMBPRINT_KEY] = prints;
      return cfg;
    });
    return p;
  },
  generate: function(size) {
    // TODO: validate key sizes
    var key = util.randomBytes(size / 8);

    return Promise.resolve({
      k: key
    });
  }
};

// public API
module.exports = Object.freeze({
  config: JWKOctetCfg,
  factory: JWKOctetFactory
});

// registration
(function(REGISTRY) {
  REGISTRY.register(JWKOctetFactory);
})(require("./keystore").registry);

}).call(this)}).call(this,require("buffer").Buffer)
},{"../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","./basekey.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/basekey.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/helpers.js","./keystore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/keystore.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/rsakey.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * jwk/rsa.js - RSA Key Representation
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var forge = require("../deps/forge.js"),
    rsau = require("../algorithms/rsa-util"),
    nodeCrypto = require("../algorithms/helpers").nodeCrypto;

var JWK = {
  BaseKey: require("./basekey.js"),
  helpers: require("./helpers.js")
};

var SIG_ALGS = [
  "RS256",
  "RS384",
  "RS512",
  "PS256",
  "PS384",
  "PS512"
];
var WRAP_ALGS = [
  "RSA-OAEP",
  "RSA-OAEP-256",
  "RSA1_5"
];

var JWKRsaCfg = {
  publicKey: function(props) {
    var fields = JWK.helpers.COMMON_PROPS.concat([
      {name: "n", type: "binary"},
      {name: "e", type: "binary"}
    ]);
    var pk;
    pk = JWK.helpers.unpackProps(props, fields);
    if (pk && pk.n && pk.e) {
      pk.length = pk.n.length * 8;
    } else {
      delete pk.e;
      delete pk.n;
    }

    return pk;
  },
  privateKey: function(props) {
    var fields = JWK.helpers.COMMON_PROPS.concat([
      {name: "n", type: "binary"},
      {name: "e", type: "binary"},
      {name: "d", type: "binary"},
      {name: "p", type: "binary"},
      {name: "q", type: "binary"},
      {name: "dp", type: "binary"},
      {name: "dq", type: "binary"},
      {name: "qi", type: "binary"}
    ]);

    var pk;
    pk = JWK.helpers.unpackProps(props, fields);
    if (pk && pk.d && pk.n && pk.e && pk.p && pk.q && pk.dp && pk.dq && pk.qi) {
      pk.length = pk.d.length * 8;
    } else {
      pk = undefined;
    }

    return pk;
  },
  thumbprint: function(json) {
    if (json.public) {
      json = json.public;
    }
    var fields = {
      e: json.e,
      kty: "RSA",
      n: json.n
    };
    return fields;
  },
  algorithms: function(keys, mode) {
    switch (mode) {
    case "encrypt":
    case "decrypt":
      return [];
    case "wrap":
      return (keys.public && WRAP_ALGS.slice()) || [];
    case "unwrap":
      return (keys.private && WRAP_ALGS.slice()) || [];
    case "sign":
      return (keys.private && SIG_ALGS.slice()) || [];
    case "verify":
      return (keys.public && SIG_ALGS.slice()) || [];
    }

    return [];
  },

  wrapKey: function(alg, keys) {
    return keys.public;
  },
  unwrapKey: function(alg, keys) {
    return keys.private;
  },

  signKey: function(alg, keys) {
    return keys.private;
  },
  verifyKey: function(alg, keys) {
    return keys.public;
  },

  convertToPEM: function(key, isPrivate) {
    var k = rsau.convertToForge(key, !isPrivate);
    if (!isPrivate) {
      return forge.pki.publicKeyToPem(k);
    }
    return forge.pki.privateKeyToPem(k);
  }
};

function convertBNtoBuffer(bn) {
  bn = bn.toString(16);
  if (bn.length % 2) {
    bn = "0" + bn;
  }
  return Buffer.from(bn, "hex");
}

// Adapted from digitalbaazar/node-forge/js/rsa.js
var validators = {
  oid: "1.2.840.113549.1.1.1",
  privateKey: {
    name: "RSAPrivateKey",
    tagClass: forge.asn1.Class.UNIVERSAL,
    type: forge.asn1.Type.SEQUENCE,
    constructed: true,
    value: [
      {
        // Version (INTEGER)
        name: "RSAPrivateKey.version",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false,
        capture: "version"
      },
      {
        // modulus (n)
        name: "RSAPrivateKey.modulus",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false,
        capture: "n"
      },
      {
        // publicExponent (e)
        name: "RSAPrivateKey.publicExponent",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false,
        capture: "e"
      },
      {
        // privateExponent (d)
        name: "RSAPrivateKey.privateExponent",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false,
        capture: "d"
      },
      {
        // prime1 (p)
        name: "RSAPrivateKey.prime1",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false,
        capture: "p"
      },
      {
        // prime2 (q)
        name: "RSAPrivateKey.prime2",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false,
        capture: "q"
      },
      {
        // exponent1 (d mod (p-1))
        name: "RSAPrivateKey.exponent1",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false,
        capture: "dp"
      },
      {
        // exponent2 (d mod (q-1))
        name: "RSAPrivateKey.exponent2",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false,
        capture: "dq"
      },
      {
        // coefficient ((inverse of q) mod p)
        name: "RSAPrivateKey.coefficient",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false,
        capture: "qi"
      }
    ]
  },
  publicKey: {
    // RSAPublicKey
    name: "RSAPublicKey",
    tagClass: forge.asn1.Class.UNIVERSAL,
    type: forge.asn1.Type.SEQUENCE,
    constructed: true,
    value: [
      {
        // modulus (n)
        name: "RSAPublicKey.modulus",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false,
        capture: "n"
      },
      {
        // publicExponent (e)
        name: "RSAPublicKey.exponent",
        tagClass: forge.asn1.Class.UNIVERSAL,
        type: forge.asn1.Type.INTEGER,
        constructed: false,
        capture: "e"
      }
    ]
  }
};

// Factory
var JWKRsaFactory = {
  kty: "RSA",
  validators: validators,
  prepare: function(props) {
    // TODO: validate key properties
    var cfg = JWKRsaCfg;
    var p = Promise.resolve(props);
    p = p.then(function(json) {
      return JWK.helpers.thumbprint(cfg, json);
    });
    p = p.then(function(hash) {
      var prints = {};
      prints[JWK.helpers.INTERNALS.THUMBPRINT_HASH] = hash;
      props[JWK.helpers.INTERNALS.THUMBPRINT_KEY] = prints;
      return cfg;
    });
    return p;
  },
  generate: function(size) {
    // TODO: validate key sizes
    var promise;

    if (nodeCrypto) {
      promise = new Promise(function (resolve, reject) {
        forge.pki.rsa.generateKeyPair({
          bits: size,
          e: 0x010001
        }, function (err, key) {
          if (err) return reject(err);
          resolve(key.privateKey);
        });
      });
    } else {
      var key = forge.pki.rsa.generateKeyPair({
        bits: size,
        e: 0x010001
      });
      promise = Promise.resolve(key.privateKey);
    }

    return promise.then(function (key) {

      // convert to JSON-ish
      var result = {};
      [
        "e",
        "n",
        "d",
        "p",
        "q",
        {incoming: "dP", outgoing: "dp"},
        {incoming: "dQ", outgoing: "dq"},
        {incoming: "qInv", outgoing: "qi"}
      ].forEach(function(f) {
        var incoming,
            outgoing;

        if ("string" === typeof f) {
          incoming = outgoing = f;
        } else {
          incoming = f.incoming;
          outgoing = f.outgoing;
        }

        if (incoming in key) {
          result[outgoing] = convertBNtoBuffer(key[incoming]);
        }
      });

      return result;
    });
  },
  import: function(input) {
    if (validators.oid !== input.keyOid) {
      return null;
    }

    if (!input.parsed) {
      // coerce capture.keyValue to DER
      if ("string" === typeof input.keyValue) {
        input.keyValue = forge.asn1.fromDer(input.keyValue);
      } else if (Array.isArray(input.keyValue)) {
        input.keyValue = input.keyValue[0];
      }
      // capture key factors
      var validator = ("private" === input.type) ?
                      validators.privateKey :
                      validators.publicKey;
      var capture = {},
          errors = [];
      if (!forge.asn1.validate(input.keyValue, validator, capture, errors)) {
        return null;
      }
      input = capture;
    }

    // convert factors to Buffers
    var output = {
      kty: "RSA"
    };
    ["n", "e", "d", "p", "q", "dp", "dq", "qi"].forEach(function(f) {
      if (!(f in input)) {
        return;
      }
      var b = Buffer.from(input[f], "binary");
      // remove leading zero padding if any
      if (0 === b[0]) {
        b = b.slice(1);
      }
      output[f] = b;
    });
    return output;
  }
};

// public API
module.exports = Object.freeze({
  config: JWKRsaCfg,
  factory: JWKRsaFactory
});

// registration
(function(REGISTRY) {
  REGISTRY.register(JWKRsaFactory);
})(require("./keystore").registry);

}).call(this)}).call(this,require("buffer").Buffer)
},{"../algorithms/helpers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/helpers.js","../algorithms/rsa-util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/algorithms/rsa-util.js","../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","./basekey.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/basekey.js","./helpers.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/helpers.js","./keystore":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/keystore.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/defaults.js":[function(require,module,exports){
/*!
 * jws/defaults.js - Defaults for JWSs
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

/**
 * @description
 * The default options for {@link JWS.createSign}.
 *
 * @property {Boolean} compact Determines if the output is the Compact
 *           serialization (`true`) or the JSON serialization (**`false`**,
 *           the default).
 * @property {String|String[]} protect The names of the headers to integrity
 *           protect.  The value `""` means that none of header parameters
 *           are integrity protected, while `"*"` (the default) means that all
 *           headers parameter sare integrity protected.
 */
var JWSDefaults = {
    compact: false,
    protect: "*"
};

module.exports = JWSDefaults;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/helpers.js":[function(require,module,exports){
/*!
 * jws/helpers.js - JWS Internal Helper Functions
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

module.exports = {
  slice: function(input, start) {
    return Array.prototype.slice.call(input, start || 0);
  }
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/index.js":[function(require,module,exports){
/*!
 * jws/index.js - JSON Web Signature (JWS) Entry Point
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var JWS = {
  createSign: require("./sign").createSign,
  createVerify: require("./verify").createVerify
};

module.exports = JWS;

},{"./sign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/sign.js","./verify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/verify.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/sign.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * jws/sign.js - Sign to JWS
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var lodash = require("lodash"),
    merge = require("../util/merge"),
    util = require("../util"),
    JWK = require("../jwk"),
    slice = require("./helpers").slice;

var clone = lodash.clone;
var uniq = lodash.uniq;

var DEFAULTS = require("./defaults");

/**
 * @class JWS.Signer
 * @classdesc Generator of signed content.
 *
 * @description
 * **NOTE:** this class cannot be instantiated directly. Instead call {@link
 * JWS.createSign}.
 */
var JWSSigner = function(cfg, signatories) {
  var finalized = false,
      format = cfg.format || "general",
      content = Buffer.alloc(0);

  /**
  * @member {Boolean} JWS.Signer#compact
  * @description
  * Indicates whether the outuput of this signature generator is using
  * the Compact serialization (`true`) or the JSON serialization
  * (`false`).
  */
  Object.defineProperty(this, "compact", {
    get: function() {
      return "compact" === format;
    },
    enumerable: true
  });
  Object.defineProperty(this, "format", {
    get: function() {
      return format;
    },
    enumerable: true
  });

  /**
  * @method JWS.Signer#update
  * @description
  * Updates the signing content for this signature content. The content
  * is appended to the end of any other content already applied.
  *
  * If {data} is a Buffer, {encoding} is ignored. Otherwise, {data} is
  * converted to a Buffer internally to {encoding}.
  *
  * @param {Buffer|String} data The data to sign.
  * @param {String} [encoding="binary"] The encoding of {data}.
  * @returns {JWS.Signer} This signature generator.
  * @throws {Error} If a signature has already been generated.
  */
  Object.defineProperty(this, "update", {
    value: function(data, encoding) {
      if (finalized) {
        throw new Error("already final");
      }
      if (data != null) {
        data = util.asBuffer(data, encoding);
        if (content.length) {
          content = Buffer.concat([content, data],
                      content.length + data.length);
        } else {
          content = data;
        }
      }

      return this;
    }
  });
  /**
  * @method JWS.Signer#final
  * @description
  * Finishes the signature operation.
  *
  * The returned Promise, when fulfilled, is the JSON Web Signature (JWS)
  * object, either in the Compact (if {@link JWS.Signer#format} is
  * `"compact"`), the flattened JSON (if {@link JWS.Signer#format} is
  * "flattened"), or the general JSON serialization.
  *
  * @param {Buffer|String} [data] The final content to apply.
  * @param {String} [encoding="binary"] The encoding of the final content
  *        (if any).
  * @returns {Promise} The promise for the signatures
  * @throws {Error} If a signature has already been generated.
  */
  Object.defineProperty(this, "final", {
    value: function(data, encoding) {
      if (finalized) {
        return Promise.reject(new Error("already final"));
      }

      // last-minute data
      this.update(data, encoding);

      // mark as done...ish
      finalized = true;
      var promise;

      // map signatory promises to just signatories
      promise = Promise.all(signatories);
      promise = promise.then(function(sigs) {
        // prepare content
        content = util.base64url.encode(content);

        sigs = sigs.map(function(s) {
          // prepare protected
          var protect = {},
              lenProtect = 0,
              unprotect = clone(s.header),
              lenUnprotect = Object.keys(unprotect).length;
          s.protected.forEach(function(h) {
            if (!(h in unprotect)) {
              return;
            }
            protect[h] = unprotect[h];
            lenProtect++;
            delete unprotect[h];
            lenUnprotect--;
          });
          if (lenProtect > 0) {
            protect = JSON.stringify(protect);
            protect = util.base64url.encode(protect);
          } else {
            protect = "";
          }

          // signit!
          var data = Buffer.from(protect + "." + content, "ascii");
          s = s.key.sign(s.header.alg, data, s.header);
          s = s.then(function(result) {
            var sig = {};
            if (0 < lenProtect) {
              sig.protected = protect;
            }
            if (0 < lenUnprotect) {
              sig.header = unprotect;
            }
            sig.signature = util.base64url.encode(result.mac);
            return sig;
          });
          return s;
        });
        sigs = [Promise.resolve(content)].concat(sigs);
        return Promise.all(sigs);
      });
      promise = promise.then(function(results) {
        var content = results[0];
        return {
          payload: content,
          signatures: results.slice(1)
        };
      });
      switch (format) {
        case "compact":
          promise = promise.then(function(jws) {
            var compact = [
              jws.signatures[0].protected,
              jws.payload,
              jws.signatures[0].signature
            ];
            compact = compact.join(".");
            return compact;
          });
          break;
        case "flattened":
          promise = promise.then(function(jws) {
            var flattened = {};
            flattened.payload = jws.payload;

            var sig = jws.signatures[0];
            if (sig.protected) {
              flattened.protected = sig.protected;
            }
            if (sig.header) {
              flattened.header = sig.header;
            }
            flattened.signature = sig.signature;

            return flattened;
          });
          break;
      }

      return promise;
    }
  });
};


/**
 * @description
 * Creates a new JWS.Signer with the given options and signatories.
 *
 * @param {Object} [opts] The signing options
 * @param {Boolean} [opts.compact] Use compact serialization?
 * @param {String} [opts.format] The serialization format to use ("compact",
 *                 "flattened", "general")
 * @param {Object} [opts.fields] Additional header fields
 * @param {JWK.Key[]|Object[]} [signs] Signatories, either as an array of
 *        JWK.Key instances; or an array of objects, each with the following
 *        properties
 * @param {JWK.Key} signs.key Key used to sign content
 * @param {Object} [signs.header] Per-signatory header fields
 * @param {String} [signs.reference] Reference field to identify the key
 * @param {String[]|String} [signs.protect] List of fields to integrity
 *        protect ("*" to protect all fields)
 * @returns {JWS.Signer} The signature generator.
 * @throws {Error} If Compact serialization is requested but there are
 *         multiple signatories
 */
function createSign(opts, signs) {
  // fixup signatories
  var options = opts,
      signStart = 1,
      signList = signs;

  if (arguments.length === 0) {
    throw new Error("at least one signatory must be provided");
  }
  if (arguments.length === 1) {
    signList = opts;
    signStart = 0;
    options = {};
  } else if (JWK.isKey(opts) ||
            (opts && "kty" in opts) ||
            (opts && "key" in opts &&
            (JWK.isKey(opts.key) || "kty" in opts.key))) {
    signList = opts;
    signStart = 0;
    options = {};
  } else {
    options = clone(opts);
  }
  if (!Array.isArray(signList)) {
    signList = slice(arguments, signStart);
  }

  // fixup options
  options = merge(clone(DEFAULTS), options);

  // setup header fields
  var allFields = options.fields || {};
  // setup serialization format
  var format = options.format;
  if (!format) {
    format = options.compact ? "compact" : "general";
  }
  if (("compact" === format || "flattened" === format) && 1 < signList.length) {
    throw new Error("too many signatories for compact or flattened JSON serialization");
  }

  // note protected fields (globally)
  // protected fields are per signature
  var protectAll = ("*" === options.protect);
  if (options.compact) {
    protectAll = true;
  }

  signList = signList.map(function(s, idx) {
    var p;

    // resolve a key
    if (s && "kty" in s) {
      p = JWK.asKey(s);
      p = p.then(function(k) {
        return {
          key: k
        };
      });
    } else if (s) {
      p = JWK.asKey(s.key);
      p = p.then(function(k) {
        return {
          header: s.header,
          reference: s.reference,
          protect: s.protect,
          key: k
        };
      });
    } else {
      p = Promise.reject(new Error("missing key for signatory " + idx));
    }

    // resolve the complete signatory
    p = p.then(function(signatory) {
      var key = signatory.key;

      // make sure there is a header
      var header = signatory.header || {};
      header = merge(merge({}, allFields), header);
      signatory.header = header;

      // ensure an algorithm
      if (!header.alg) {
        header.alg = key.algorithms(JWK.MODE_SIGN)[0] || "";
      }

      // determine the key reference
      var ref = signatory.reference;
      delete signatory.reference;
      if (undefined === ref) {
        // header already contains the key reference
        ref = ["kid", "jku", "x5c", "x5t", "x5u"].some(function(k) {
          return (k in header);
        });
        ref = !ref ? "kid" : null;
      } else if ("boolean" === typeof ref) {
        // explicit (positive | negative) request for key reference
        ref = ref ? "kid" : null;
      }
      var jwk;
      if (ref) {
        jwk = key.toJSON();
        if ("jwk" === ref) {
          if ("oct" === key.kty) {
            return Promise.reject(new Error("cannot embed key"));
          }
          header.jwk = jwk;
        } else if (ref in jwk) {
          header[ref] = jwk[ref];
        }
      }

      // determine protected fields
      var protect = signatory.protect;
      if (protectAll || "*" === protect) {
        protect = Object.keys(header);
      } else if ("string" === protect) {
        protect = [protect];
      } else if (Array.isArray(protect)) {
        protect = protect.concat();
      } else if (!protect) {
        protect = [];
      } else {
        return Promise.reject(new Error("protect must be a list of fields"));
      }
      protect = uniq(protect);
      signatory.protected = protect;

      // freeze signatory
      signatory = Object.freeze(signatory);
      return signatory;
    });

    return p;
  });

  var cfg = {
    format: format
  };
  return new JWSSigner(cfg,
                       signList);
}

module.exports = {
  signer: JWSSigner,
  createSign: createSign
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"../jwk":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/index.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","../util/merge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/merge.js","./defaults":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/defaults.js","./helpers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/helpers.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/verify.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * jws/verify.js - Verifies from a JWS
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var clone = require("lodash").clone,
    merge = require("../util/merge"),
    base64url = require("../util/base64url"),
    AlgConfig = require("../util/algconfig"),
    JWK = require("../jwk");

var DEFAULT_OPTIONS = {
  algorithms: "*",
  allowEmbeddedKey: false
};

/**
 * @class JWS.Verifier
 * @classdesc Parser of signed content.
 *
 * @description
 * **NOTE:** this class cannot be instantiated directly. Instead call {@link
 * JWS.createVerify}.
 */
var JWSVerifier = function(ks, globalOpts) {
  var assumedKey,
      keystore;

  if (JWK.isKey(ks)) {
    assumedKey = ks;
    keystore = assumedKey.keystore;
  } else if (JWK.isKeyStore(ks)) {
    keystore = ks;
  } else {
    keystore = JWK.createKeyStore();
  }

  globalOpts = merge(DEFAULT_OPTIONS, globalOpts);

  Object.defineProperty(this, "defaultKey", {
    value: assumedKey || undefined,
    enumerable: true
  });
  Object.defineProperty(this, "keystore", {
    value: keystore,
    enumerable: true
  });

  Object.defineProperty(this, "verify", {
    value: function(input, opts) {
      opts = merge({}, globalOpts, opts || {});
      var extraHandlers = opts.handlers || {};
      var handlerKeys = Object.keys(extraHandlers);
      var algSpec = new AlgConfig(opts.algorithms);

      if ("string" === typeof input) {
        input = input.split(".");
        input = {
          payload: input[1],
          signatures: [
            {
              protected: input[0],
              signature: input[2]
            }
          ]
        };
      } else if (!input || "object" !== typeof input) {
        throw new Error("invalid input");
      }

      // fixup "flattened JSON" to look like "general JSON"
      if (input.signature) {
        input.signatures = [
          {
            protected: input.protected || undefined,
            header: input.header || undefined,
            signature: input.signature
          }
        ];
      }

      // ensure signatories exists
      var sigList = input.signatures || [{}];

      // combine fields and decode signature per signatory
      sigList = sigList.map(function(s) {
        var header = clone(s.header || {});
        var protect = s.protected ?
                      JSON.parse(base64url.decode(s.protected, "utf8")) :
                      {};
        header = merge(header, protect);
        var signature = base64url.decode(s.signature);

        // process allowed algorithims
        if (!algSpec.match(header.alg)) {
          return Promise.reject(new Error("Algorithm not allowed: " + header.alg));
        }

        // process "crit" first
        var crit = protect.crit;
        if (crit) {
          if (!Array.isArray(crit)) {
            return Promise.reject(new Error("Invalid 'crit' header"));
          }
          for (var idx = 0; crit.length > idx; idx++) {
            if (-1 === handlerKeys.indexOf(crit[idx])) {
              return Promise.reject(new Error(
                  "Critical extension is not supported: " + crit[idx]
              ));
            }
          }
        }
        protect = Object.keys(protect);

        return Promise.resolve({
          protected: protect,
          aad: s.protected || "",
          header: header,
          signature: signature
        });
      });

      var promise = Promise.all(sigList);
      promise = promise.then(function(sigList) {
        return new Promise(function(resolve, reject) {
          var processSig = function() {
            var sig = sigList.shift();
            if (!sig) {
              reject(new Error("no key found"));
              return;
            }

            sig = merge({}, sig, {
              payload: input.payload
            });
            var p = Promise.resolve(sig);
            // find the key
            p = p.then(function(sig) {
              var algKey;
              // TODO: resolve jku, x5c, x5u
              if (opts.allowEmbeddedKey && sig.header.jwk) {
                algKey = JWK.asKey(sig.header.jwk);
              } else if (opts.allowEmbeddedKey && sig.header.x5c) {
                algKey = sig.header.x5c[0];
                algKey = Buffer.from(algKey, "base64");
                // TODO: callback to validate chain
                algKey = JWK.asKey(algKey, "pkix");
              } else {
                algKey = Promise.resolve(assumedKey || keystore.get({
                  use: "sig",
                  alg: sig.header.alg,
                  kid: sig.header.kid
                }));
              }
              return algKey.then(function(k) {
                if (!k) {
                  return Promise.reject(new Error("key does not match"));
                }
                sig.key = k;
                return sig;
              });
            });

            // process any prepare-verify handlers
            p = p.then(function(sig) {
              var processing = [];
              handlerKeys.forEach(function(h) {
                h = extraHandlers[h];
                var p;
                if ("function" === typeof h) {
                  p = h(sig);
                } else if ("object" === typeof h && "function" === typeof h.prepare) {
                  p = h.prepare(sig);
                }
                if (p) {
                  processing.push(Promise.resolve(p));
                }
              });
              return Promise.all(processing).then(function() {
                // don't actually care about individual handler results
                // assume {sig} is updated
                return sig;
              });
            });

            // prepare verify inputs
            p = p.then(function(sig) {
              var aad = sig.aad || "",
                  payload = sig.payload || "";
              var content = Buffer.alloc(1 + aad.length + payload.length),
                  pos = 0;
              content.write(aad, pos, "ascii");
              pos += aad.length;
              content.write(".", pos, "ascii");
              pos++;

              if (Buffer.isBuffer(payload)) {
                payload.copy(content, pos);
              } else {
                content.write(payload, pos, "binary");
              }
              sig.content = content;
              return sig;
            });

            p = p.then(function(sig) {
              return sig.key.verify(sig.header.alg,
                                    sig.content,
                                    sig.signature);
            });

            p = p.then(function(result) {
              var payload = sig.payload;
              payload = base64url.decode(payload);
              return {
                protected: sig.protected,
                header: sig.header,
                payload: payload,
                signature: result.mac,
                key: sig.key
              };
            });

            // process any post-verify handlers
            p = p.then(function(jws) {
              var processing = [];
              handlerKeys.forEach(function(h) {
                h = extraHandlers[h];
                var p;
                if ("object" === typeof h && "function" === typeof h.complete) {
                  p = h.complete(jws);
                }
                if (p) {
                  processing.push(Promise.resolve(p));
                }
              });
              return Promise.all(processing).then(function() {
                // don't actually care about individual handler results
                // assume {jws} is updated
                return jws;
              });
            });
            p.then(resolve, processSig);
          };
          processSig();
        });
      });
      return promise;
    }
  });
};

/**
 * @description
 * Creates a new JWS.Verifier with the given Key or KeyStore.
 *
 * @param {JWK.Key|JWK.KeyStore} ks The Key or KeyStore to use for verification.
 * @returns {JWS.Verifier} The new Verifier.
 */
function createVerify(ks, opts) {
  var vfy = new JWSVerifier(ks, opts);

  return vfy;
}

module.exports = {
  verifier: JWSVerifier,
  createVerify: createVerify
};

}).call(this)}).call(this,require("buffer").Buffer)
},{"../jwk":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwk/index.js","../util/algconfig":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/algconfig.js","../util/base64url":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/base64url.js","../util/merge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/merge.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/parse/compact.js":[function(require,module,exports){
/*!
 * parse/compact.js - JOSE Compact Serialization Parser
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var jose = {
  JWE: require("../jwe"),
  JWS: require("../jws"),
  util: require("../util")
};

function parseCompact(input) {
  var parts = input.split(".");

  var type,
      op;
  if (3 === parts.length) {
    // JWS
    type = "JWS";
    op = function(ks, opts) {
      return jose.JWS.createVerify(ks).
             verify(input, opts);
    };
  } else if (5 === parts.length) {
    // JWE
    type = "JWE";
    op = function(ks, opts) {
      return jose.JWE.createDecrypt(ks).
             decrypt(input, opts);
    };
  } else {
    throw new TypeError("invalid jose serialization");
  }

  // parse header
  var header;
  header = jose.util.base64url.decode(parts[0], "utf8");
  header = JSON.parse(header);
  return {
    type: type,
    format: "compact",
    input: input,
    header: header,
    perform: op
  };
}

module.exports = parseCompact;

},{"../jwe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/index.js","../jws":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/index.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/parse/index.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * parse/index.js - JOSE Parser Entry Point
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var compact = require("./compact"),
    json = require("./json");

var parse = module.exports = function(input) {
  if (Buffer.isBuffer(input)) {
    // assume buffer holds a Compact Serialization string
    return compact(input.toString("ascii"));
  } else if ("string" === typeof input) {
    return compact(input);
  } else if (input) {
    return json(input);
  } else {
    throw new TypeError("invalid input");
  }
};

parse.compact = compact;
parse.json = json;

}).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
},{"../../../is-buffer/index.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-buffer/index.js","./compact":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/parse/compact.js","./json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/parse/json.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/parse/json.js":[function(require,module,exports){
/*!
 * parse/compact.js - JOSE JSON Serialization Parser
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var merge = require("../util/merge");

var jose = {
  JWE: require("../jwe"),
  JWS: require("../jws"),
  util: require("../util")
};

function parseJSON(input) {
  var type,
      op,
      headers;

  if ("signatures" in input || "signature" in input) {
    // JWS
    type = "JWS";
    op = function(ks, opts) {
      return jose.JWS.createVerify(ks).
             verify(input, opts);
    };
    // headers can be (signatures[].protected, signatures[].header, signature.protected, signature.header)
    headers = input.signatures ||
              [ {
                protected: input.protected,
                header: input.header,
                signature: input.signature
              }];
    headers = headers.map(function(sig) {
      var all = {};
      if (sig.header) {
        all = merge(all, sig.header);
      }

      var prot;
      if (sig.protected) {
        prot = sig.protected;
        prot = jose.util.base64url.decode(prot, "utf8");
        prot = JSON.parse(prot);
        all = merge(all, prot);
      }

      return all;
    });
  } else if ("ciphertext" in input) {
    // JWE
    type = "JWE";
    op = function(ks, opts) {
      return jose.JWE.createDecrypt(ks).
             decrypt(input, opts);
    };
    // headers can be (protected, unprotected, recipients[].header)
    var root = {};
    if (input.protected) {
      root.protected = input.protected;
      root.protected = jose.util.base64url.decode(root.protected, "utf8");
      root.protected = JSON.parse(root.protected);
    }
    if (input.unprotected) {
      root.unprotected = input.unprotected;
    }

    headers = input.recipients || [{}];
    headers = headers.map(function(rcpt) {
      var all = {};
      if (rcpt.header) {
        all = merge(all, rcpt.header);
      }
      if (root.unprotected) {
        all = merge(all, root.unprotected);
      }
      if (root.protected) {
        all = merge(all, root.protected);
      }

      return all;
    });
  }

  return {
    type: type,
    format: "json",
    input: input,
    all: headers,
    perform: op
  };
}

module.exports = parseJSON;

},{"../jwe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jwe/index.js","../jws":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/jws/index.js","../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js","../util/merge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/merge.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/algconfig.js":[function(require,module,exports){
/*!
 * util/algconfig.js - Functions for managing algorithm set options
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

function quoteRE(str) {
  return str.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
}

function makeRE(prefix, wildcard, suffix) {
  var parts = [];

  parts.push("^");
  if (prefix) {
    prefix = quoteRE(prefix);
    parts.push(prefix);
  }
  if (wildcard) {
    parts.push((prefix || suffix) ? ".*" : ".+");
  }
  if (suffix) {
    suffix = quoteRE(suffix);
    parts.push(suffix);
  }
  parts.push("$");

  return parts.join("");
}

var AlgConfig = function(algspec) {
  if (!algspec) {
    algspec = [];
  } else if ("string" === typeof algspec) {
    algspec = algspec.split(" ");
  }

  var specAllowed = [], specDisallowed = [];
  var ptnAllowed = [], ptnDisallowed = [];
  var ptn = /^(!)?([^*]*)(\*?)([^*]*)$/, fmt;
  algspec.forEach(function (a) {
    if (!a) { return; }

    ptn.lastIndex = 0;
    var parts = ptn.exec(a);
    if (!parts) { return; }

    fmt = "(" + makeRE(parts[2], parts[3], parts[4]) + ")";
    if (!parts[1]) {
      // allowed pattern
      ptnAllowed.push(fmt);
      specAllowed.push(parts[0]);
    } else {
      // disallowed pattern
      ptnDisallowed.push(fmt);
      specDisallowed.push(parts[0]);
    }
  });

  ptnAllowed = (ptnAllowed.length) ?
            new RegExp(ptnAllowed.join("|")) :
            null;
  ptnDisallowed = (ptnDisallowed.length) ?
               new RegExp(ptnDisallowed.join("|")) :
               null;
  if (!specAllowed.length) {
    specAllowed = ["*"];
  }

  Object.defineProperty(this, "spec", {
    value: specAllowed.join(" ") + " " + specDisallowed.join(" "),
    enumerable: true
  });
  Object.defineProperty(this, "match", {
    value: function(alg) {
      var result = Boolean(alg);

      if (result && ptnAllowed) {
        ptnAllowed.lastIndex = 0;
        result = ptnAllowed.test(alg);
      }
      if (result && ptnDisallowed) {
        ptnDisallowed.lastIndex = 0;
        result = !ptnDisallowed.test(alg);
      }

      return result;
    }
  });
}

module.exports = AlgConfig;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/base64url.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * util/base64url.js - Implementation of web-safe Base64 Encoder/Decoder
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var impl = require("base64url");

/**
 * @namespace base64url
 * @description
 * Provides methods to encode and decode data according to the
 * base64url alphabet.
 */
var base64url = {
  /**
   * @function
   * Encodes the input to base64url.
   *
   * If {input} is a Buffer, then {encoding} is ignored. Otherwise,
   * {encoding} can be one of "binary", "base64", "hex", "utf8".
   *
   * @param {Buffer|String} input The data to encode.
   * @param {String} [encoding = binary] The input encoding format.
   * @returns {String} the base64url encoding of {input}.
   */
  encode: function encode(buffer, encoding) {
    if (buffer instanceof ArrayBuffer) {
      buffer = new Uint8Array(buffer);
    }

    if (!Buffer.isBuffer(buffer)) {
      buffer = Buffer.from(buffer, encoding);
    }

    return impl.encode(buffer);
  },
  /**
   * @function
   * Decodes the input from base64url.
   *
   * @param {String} input The data to decode.
   * @returns {Buffer|String} the base64url decoding of {input}.
   */
  decode: impl.toBuffer
};

module.exports = base64url;

}).call(this)}).call(this,require("buffer").Buffer)
},{"base64url":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/base64url/index.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/databuffer.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * util/databuffer.js - Forge-compatible Buffer based on Node.js Buffers
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var forge = require("../deps/forge.js"),
    base64url = require("./base64url.js");

/**
 *
 */
function DataBuffer(b, options) {
  options = options || {};

  // treat (views of) (Array)Buffers special
  // NOTE: default implementation creates copies, but efficiently
  //       wherever possible
  if (Buffer.isBuffer(b)) {
    this.data = b;
  } else if (forge.util.isArrayBuffer(b)) {
    b = new Uint8Array(b);
    this.data = Buffer.from(b);
  } else if (forge.util.isArrayBufferView(b)) {
    b = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
    this.data = Buffer.from(b);
  }

  if (this.data) {
    this.write = this.data.length;
    b = undefined;
  }

  // setup growth rate
  this.growSize = options.growSize || DataBuffer.DEFAULT_GROW_SIZE;

  // initialize pointers and data
  this.write = this.write || 0;
  this.read = this.read || 0;
  if (b) {
    this.putBytes(b);
  } else if (!this.data) {
    this.accommodate(0);
  }

  // massage read/write pointers
  options.readOffset = ("readOffset" in options) ?
                       options.readOffset :
                       this.read;
  this.write = ("writeOffset" in options) ?
               options.writeOffset :
               this.write;
  this.read = Math.min(options.readOffset, this.write);
}
DataBuffer.DEFAULT_GROW_SIZE = 16;

DataBuffer.prototype.length = function() {
  return this.write - this.read;
};
DataBuffer.prototype.available = function() {
  return this.data.length - this.write;
};
DataBuffer.prototype.isEmpty = function() {
  return this.length() <= 0;
};

DataBuffer.prototype.accommodate = function(length) {
  if (!this.data) {
    // initializes a new buffer
    length = Math.max(this.write + length, this.growSize);

    this.data = Buffer.alloc(length);
  } else if (this.available() < length) {
    length = Math.max(length, this.growSize);

    // create a new empty buffer, and copy current one into it
    var src = this.data;
    var dst = Buffer.alloc(src.length + length);
    src.copy(dst, 0);

    // set data as the new buffer
    this.data = dst;
  }
  // ensure the rest is 0
  this.data.fill(0, this.write);

  return this;
};
DataBuffer.prototype.clear = function() {
  this.read = this.write = 0;
  this.data = Buffer.alloc(0);
  return this;
};
DataBuffer.prototype.truncate = function(count) {
  // chop off <count> bytes from the end
  this.write = this.read + Math.max(0, this.length() - count);
  // ensure the remainder is 0
  this.data.fill(0, this.write);
  return this;
};
DataBuffer.prototype.compact = function() {
  if (this.read > 0) {
    if (this.write === this.read) {
      this.read = this.write = 0;
    } else {
      this.data.copy(this.data, 0, this.read, this.write);
      this.write = this.write - this.read;
      this.read = 0;
    }
    // ensure remainder is 0
    this.data.fill(0, this.write);
  }
  return this;
};
DataBuffer.prototype.copy = function() {
  return new DataBuffer(this, {
    readOffset: this.read,
    writeOffset: this.write,
    growSize: this.growSize
  });
};

DataBuffer.prototype.equals = function(test) {
  if (!DataBuffer.isBuffer(test)) {
    return false;
  }

  if (test.length() !== this.length()) {
    return false;
  }

  var rval = true,
      delta = this.read - test.read;
  // constant time
  for (var idx = test.read; test.write > idx; idx++) {
    rval = rval && (this.data[idx + delta] === test.data[idx]);
  }
  return rval;
};
DataBuffer.prototype.at = function(idx) {
  return this.data[this.read + idx];
};
DataBuffer.prototype.setAt = function(idx, b) {
  this.data[this.read + idx] = b;
  return this;
};
DataBuffer.prototype.last = function() {
  return this.data[this.write - 1];
};
DataBuffer.prototype.bytes = function(count) {
  var rval;
  if (undefined === count) {
    count = this.length();
  } else if (count) {
    count = Math.min(count, this.length());
  }

  if (0 === count) {
    rval = "";
  } else {
    var begin = this.read,
        end = begin + count,
        data = this.data.slice(begin, end);
    rval = String.fromCharCode.apply(null, data);
  }

  return rval;
};
DataBuffer.prototype.buffer = function(count) {
  var rval;
  if (undefined === count) {
    count = this.length();
  } else if (count) {
    count = Math.min(count, this.length());
  }

  if (0 === count) {
    rval = new ArrayBuffer(0);
  } else {
    var begin = this.read,
        end = begin + count,
        data = this.data.slice(begin, end);
    rval = new Uint8Array(end - begin);
    rval.set(data);
  }

  return rval;
};
DataBuffer.prototype.native = function(count) {
  var rval;
  if ("undefined" === typeof count) {
    count = this.length();
  } else if (count) {
    count = Math.min(count, this.length());
  }

  if (0 === count) {
    rval = Buffer.alloc(0);
  } else {
    var begin = this.read,
        end = begin + count;
    rval = this.data.slice(begin, end);
  }

  return rval;
};

DataBuffer.prototype.toHex = function() {
  return this.toString("hex");
};
DataBuffer.prototype.toString = function(encoding) {
  // short circuit empty string
  if (0 === this.length()) {
    return "";
  }

  var view = this.data.slice(this.read, this.write);
  encoding = encoding || "utf8";
  // special cases, then built-in support
  switch (encoding) {
    case "raw":
      return view.toString("binary");
    case "base64url":
      return base64url.encode(view);
    case "utf16":
      return view.toString("ucs2");
    default:
      return view.toString(encoding);
  }
};

DataBuffer.prototype.fillWithByte = function(b, n) {
  if (!n) {
    n = this.available();
  }
  this.accommodate(n);
  this.data.fill(b, this.write, this.write + n);
  this.write += n;

  return this;
};

DataBuffer.prototype.getBuffer = function(count) {
  var rval = this.buffer(count);
  this.read += rval.byteLength;

  return rval;
};
DataBuffer.prototype.putBuffer = function(bytes) {
  return this.putBytes(bytes);
};

DataBuffer.prototype.getBytes = function(count) {
  var rval = this.bytes(count);
  this.read += rval.length;
  return rval;
};
DataBuffer.prototype.putBytes = function(bytes, encoding) {
  if ("string" === typeof bytes) {
    // fixup encoding
    encoding = encoding || "binary";
    switch (encoding) {
      case "utf16":
        // treat as UCS-2/UTF-16BE
        encoding = "ucs-2";
        break;
      case "raw":
        encoding = "binary";
        break;
      case "base64url":
        // NOTE: this returns a Buffer
        bytes = base64url.decode(bytes);
        break;
    }

    // replace bytes with decoded Buffer (if not already)
    if (!Buffer.isBuffer(bytes)) {
      bytes = Buffer.from(bytes, encoding);
    }
  }

  var src, dst;
  if (bytes instanceof DataBuffer) {
    // be slightly more efficient
    var orig = bytes;
    bytes = orig.data.slice(orig.read, orig.write);
    orig.read = orig.write;
  } else if (bytes instanceof forge.util.ByteStringBuffer) {
    bytes = bytes.getBytes();
  }

  // process array
  if (Buffer.isBuffer(bytes)) {
    src = bytes;
  } else if (Array.isArray(bytes)) {
    src = Buffer.from(bytes);
  } else if (forge.util.isArrayBuffer(bytes)) {
    src = new Uint8Array(bytes);
    src = Buffer.from(src);
  } else if (forge.util.isArrayBufferView(bytes)) {
    src = (bytes instanceof Uint8Array) ?
              bytes :
              new Uint8Array(bytes.buffer,
                             bytes.byteOffset,
                             bytes.byteLength);
    src = Buffer.from(src);
  } else {
    throw new TypeError("invalid source type");
  }

  this.accommodate(src.length);
  dst = this.data;
  src.copy(dst, this.write);
  this.write += src.length;

  return this;
};

DataBuffer.prototype.getNative = function(count) {
  var rval = this.native(count);
  this.read += rval.length;
  return rval;
};
DataBuffer.prototype.putNative = DataBuffer.prototype.putBuffer;

DataBuffer.prototype.getByte = function() {
  var b = this.data[this.read];
  this.read = Math.min(this.read + 1, this.write);
  return b;
};
DataBuffer.prototype.putByte = function(b) {
  this.accommodate(1);
  this.data[this.write] = b & 0xff;
  this.write++;

  return this;
};

DataBuffer.prototype.getInt16 = function() {
  var n = (this.data[this.read] << 8) ^
          (this.data[this.read + 1]);
  this.read = Math.min(this.read + 2, this.write);
  return n;
};
DataBuffer.prototype.putInt16 = function(n) {
  this.accommodate(2);
  this.data[this.write] = (n >>> 8) & 0xff;
  this.data[this.write + 1] = n & 0xff;
  this.write += 2;
  return this;
};

DataBuffer.prototype.getInt24 = function() {
  var n = (this.data[this.read] << 16) ^
          (this.data[this.read + 1] << 8) ^
          this.data[this.read + 2];
  this.read = Math.min(this.read + 3, this.write);
  return n;
};
DataBuffer.prototype.putInt24 = function(n) {
  this.accommodate(3);
  this.data[this.write] = (n >>> 16) & 0xff;
  this.data[this.write + 1] = (n >>> 8) & 0xff;
  this.data[this.write + 2] = n & 0xff;
  this.write += 3;
  return this;
};

DataBuffer.prototype.getInt32 = function() {
  var n = (this.data[this.read] << 24) ^
          (this.data[this.read + 1] << 16) ^
          (this.data[this.read + 2] << 8) ^
          this.data[this.read + 3];
  this.read = Math.min(this.read + 4, this.write);
  return n;
};
DataBuffer.prototype.putInt32 = function(n) {
  this.accommodate(4);
  this.data[this.write] = (n >>> 24) & 0xff;
  this.data[this.write + 1] = (n >>> 16) & 0xff;
  this.data[this.write + 2] = (n >>> 8) & 0xff;
  this.data[this.write + 3] = n & 0xff;
  this.write += 4;
  return this;
};

DataBuffer.prototype.getInt16Le = function() {
  var n = (this.data[this.read + 1] << 8) ^
          this.data[this.read];
  this.read = Math.min(this.read + 2, this.write);
  return n;
};
DataBuffer.prototype.putInt16Le = function(n) {
  this.accommodate(2);
  this.data[this.write + 1] = (n >>> 8) & 0xff;
  this.data[this.write] = n & 0xff;
  this.write += 2;
  return this;
};

DataBuffer.prototype.getInt24Le = function() {
  var n = (this.data[this.read + 2] << 16) ^
          (this.data[this.read + 1] << 8) ^
          this.data[this.read];
  this.read = Math.min(this.read + 3, this.write);
  return n;
};
DataBuffer.prototype.putInt24Le = function(n) {
  this.accommodate(3);
  this.data[this.write + 2] = (n >>> 16) & 0xff;
  this.data[this.write + 1] = (n >>> 8) & 0xff;
  this.data[this.write] = n & 0xff;
  this.write += 3;
  return this;
};
DataBuffer.prototype.getInt32Le = function() {
  var n = (this.data[this.read + 3] << 24) ^
          (this.data[this.read + 2] << 16) ^
          (this.data[this.read + 1] << 8) ^
          this.data[this.read];
  this.read = Math.min(this.read + 4, this.write);
  return n;
};
DataBuffer.prototype.putInt32Le = function(n) {
  this.accommodate(4);
  this.data[this.write + 3] = (n >>> 24) & 0xff;
  this.data[this.write + 2] = (n >>> 16) & 0xff;
  this.data[this.write + 1] = (n >>> 8) & 0xff;
  this.data[this.write] = n & 0xff;
  this.write += 4;
  return this;
};

DataBuffer.prototype.getInt = function(bits) {
  var rval = 0;
  do {
    rval = (rval << 8) | this.getByte();
    bits -= 8;
  } while (bits > 0);
  return rval;
};
DataBuffer.prototype.putInt = function(n, bits) {
  this.accommodate(Math.ceil(bits / 8));
  do {
    bits -= 8;
    this.putByte((n >> bits) & 0xff);
  } while (bits > 0);
  return this;
};

DataBuffer.prototype.putSignedInt = function(n, bits) {
  if (n < 0) {
    n += 2 << (bits - 1);
  }
  return this.putInt(n, bits);
};

DataBuffer.prototype.putString = function(str) {
  return this.putBytes(str, "utf16");
};

DataBuffer.isBuffer = function(test) {
  return (test instanceof DataBuffer);
};
DataBuffer.asBuffer = function(orig) {
  return DataBuffer.isBuffer(orig) ?
         orig :
         orig ?
         new DataBuffer(orig) :
         new DataBuffer();
};

module.exports = DataBuffer;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","./base64url.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/base64url.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/index.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * util/index.js - Utilities Entry Point
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var forge = require("../deps/forge.js");

var util;

function asBuffer(input, encoding) {
  if (Buffer.isBuffer(input)) {
    return input;
  }

  if ("string" === typeof input) {
    encoding = encoding || "binary";
    if ("base64url" === encoding) {
      return util.base64url.decode(input);
    }
    return Buffer.from(input, encoding);
  }

  // assume input is an Array, ArrayBuffer, or ArrayBufferView
  if (forge.util.isArrayBufferView(input)) {
    input = (input instanceof Uint8Array) ?
            input :
            new Uint8Array(input.buffer, input.byteOffset, input.byteOffset + input.byteLength);
  } else if (forge.util.isArrayBuffer(input)) {
    input = new Uint8Array(input);
  }

  var output;
  output = Buffer.from(input);

  return output;
}

function randomBytes(len) {
  return Buffer.from(forge.random.getBytes(len), "binary");
}

util = {
  base64url: require("./base64url.js"),
  utf8: require("./utf8.js"),
  asBuffer: asBuffer,
  randomBytes: randomBytes
};
module.exports = util;

}).call(this)}).call(this,require("buffer").Buffer)
},{"../deps/forge.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/deps/forge.js","./base64url.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/base64url.js","./utf8.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/utf8.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/merge.js":[function(require,module,exports){
(function (Buffer){(function (){
/*!
 * util/utf8.js - Implementation of UTF-8 Encoder/Decoder
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var lodash = require("lodash");

var partialRight = lodash.partialRight;
var merge = lodash.merge;

var typedArrayCtors = (function() {
  var ctors = [];
  if ("undefined" !== typeof Uint8ClampedArray) {
    ctors.push(Uint8ClampedArray);
  }
  if ("undefined" !== typeof Uint8Array) {
    ctors.push(Uint8Array);
  }
  if ("undefined" !== typeof Uint16Array) {
    ctors.push(Uint16Array);
  }
  if ("undefined" !== typeof Uint32Array) {
    ctors.push(Uint32Array);
  }
  if ("undefined" !== typeof Float32Array) {
    ctors.push(Float32Array);
  }
  if ("undefined" !== typeof Float64Array) {
    ctors.push(Float64Array);
  }
  return ctors;
})();

function findTypedArrayFor(ta) {
  var ctor;
  for (var idx = 0; !ctor && typedArrayCtors.length > idx; idx++) {
    if (ta instanceof typedArrayCtors[idx]) {
      ctor = typedArrayCtors[idx];
    }
  }
  return ctor;
}

function mergeBuffer(a, b) {
  // TODO: should this be a copy, or the reference itself?
  if (Buffer.isBuffer(b)) {
    b = Buffer.from(b);
  } else {
    var Ctor = findTypedArrayFor(b);
    b = Ctor ?
        new Ctor(b, b.byteOffset, b.byteLength) :
        undefined;
  }

  // TODO: QUESTION: create a merged <whatever-a-is>??
  // for now, a is b
  a = b;

  return b;
}

module.exports = partialRight(merge, mergeBuffer);

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js","lodash":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/lodash/lodash.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-jose/lib/util/utf8.js":[function(require,module,exports){
/*!
 * util/utf8.js - Implementation of UTF-8 Encoder/Decoder
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var utf8 = exports;

utf8.encode = function(input) {
  var output = encodeURIComponent(input || "");
  output = output.replace(/%([0-9a-fA-F]{2})/g, function(m, code) {
    code = parseInt(code, 16);
    return String.fromCharCode(code);
  });

  return output;
};
utf8.decode = function(input) {
  var output = (input || "").replace(/[\u0080-\u00ff]/g, function(m) {
    var code = (0x100 | m.charCodeAt(0)).toString(16).substring(1);
    return "%" + code;
  });
  output = decodeURIComponent(output);

  return output;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/Decoder.js":[function(require,module,exports){
/**
 * Created by coolbong on 2017-02-24.
 */

var toNumber = require('./util').toNumber;
var toAscii = require('./util').toAscii;

// SELECT
var Pdol = require('./decoder/Select').Pdol;


// GET_PROCESSING_OPTION
var Gpo = require('./decoder/Gpo');

// READ_RECORD
var Record = require('./decoder/Record');


// GENERAGE_AC
var GAC = require('./decoder/Gac');


// GET_DATA
var GetData = require('./decoder/GetData');


var Template = require('./decoder/Template');

// Terminal
var Terminal = require('./decoder/Terminal');

// only emv element
var emv = {
    // SELECT
    '84': {
        name: 'Dedicated File (DF) Name',
        decoder: isPse
    },
    'A5' : {
        name: 'File Control Information (FCI) Proprietary Template',
    },
    '50': {
        name: 'Application Label',
        decoder: ascii
    },
    '5F2D' : {
        name : 'Language Preference',
        decoder: ascii
    },
    '9F12' : {
        name: 'Application Preferred Name',
        decoder: ascii
    },
    '9F38' : {
        name: 'Processing Options Data Object List (PDOL)',
        decoder: Pdol
    },
    // GET_PROCESSING_OPTION
    '82' : {
        name: 'Application Interchange Profile',
        decoder: Gpo.ApplicationInterchangeProfile
    },
    '94' : {
        name: 'Application File Locator (AFL) (contact)',
        decoder: Gpo.ApplicationFileLocator,
        func: Gpo.ApplicationFileLocatorFunction
    },

    // READ_RECORD
    '56' : {
        name: 'Track 1 Data',
        decoder: Record.Track1Data
    },
    '57' : {
        name: 'Track 2 Equivalent Data',
        decoder: Record.Track2Data
    },
    '5F20' : {
        name: 'Card holder name',
        decoder: ascii
    },
    '5F25' : {
        name : 'Application Effective Date',
        decoder: getDateFormat
    },
    '5F24' : {
        name: 'Application Expiration Date',
        decoder: getDateFormat
    },
    '5F28': {
        name : 'Issuer Country Code',
        decoder: getCountryCode
    },
    '5F30': {
        name: 'Service Code',
        decoder: Record.ServiceCode
    },
    '8C' : {
        name: 'CDOL1 (Card Risk Management Data Object List 1)',
        decoder: Record.CDOL1
    },
    '8D' : {
        name: 'CDOL2 (Card Risk Management Data Object List 2)',
        decoder: Record.CDOL2
    },
    '8E' : {
        name: 'CVM List (Cardholder Verification Method List)',
        decoder: Record.CVMList
    },
    '9F07' : {
        name: 'Application Usage Control',
        decoder: Record.ApplicationUsageControl
    },
    '9F0D' : {
        name: 'Issuer Action Code - Default',
        decoder: Record.IssuerActionCode
    },
    '9F0E' : {
        name: 'Issuer Action Code - Denial',
        decoder: Record.IssuerActionCode
    },
    '9F0F' : {
        name: 'Issuer Action Code - Online',
        decoder: Record.IssuerActionCode
    },
    '9F1F' : {
        name: 'Track 1 Discretionary Data',
        decoder: Record.Track1DiscretionaryData
    },
    '9F6B' : {
        name: 'Track 2 Data',
        decoder: Record.Track2Data
    },

    // GENERATE AC RESP
    '9F10' : {
        name: 'IAD (Issuer Application Data)',
        decoder: GAC.IssuerApplicationData
    },
    '9F27' : {
        name: 'CID (Cryptogram Information Data)',
        decoder: GAC.CryptogramInformationData
    },
    '9F36' : {
        name: 'ATC (Application Transaction Count',
        decoder: number
    },

    // GENERATE AC CMD
    '5F2A' : {
        name: 'Transaction Currency Code',
        decoder: getCurrencyCode
    },
    '9F1A' : {
        name: 'Terminal Country Code',
        decoder: getCountryCode
    },
    '9F35' : {
        name: 'Terminal Type',
        decoder: GAC.TerminalType
    },
    '9F42' : {
        name: 'Application Currency Code',
        decoder: getCurrencyCode
    },

    // GET_DATA
    '9F4F' : {
        name: 'Log Format',
        decoder: GetData.LogFormat
    },
    'C3' : {
        name: 'Card Issuer Action Code - Decline (contact)',
        decoder: GetData.IssuerActionCode
    },
    'C4' : {
        name: 'Card Issuer Action Code – Default (contact)',
        decoder: GetData.IssuerActionCode
    },
    'C5' : {
        name: 'Card Issuer Action Code - Online (contact)',
        decoder: GetData.IssuerActionCode
    },
    'CD' : {
        name: 'Card Issuer Action Code – Default (contactless)',
        decoder: GetData.IssuerActionCode
    },
    
    'CE' : {
        name: 'Card Issuer Action Code - Online (contactless)',
        decoder: GetData.IssuerActionCode
    },
    'CF' : {
        name: 'Card Issuer Action Code - Decline (contactless)',
        decoder: GetData.IssuerActionCode
    },
    'C8' : {
        name: 'CRM Country Code',
        decoder: getCountryCode
    },

    'D5' : {
        name: 'Application Control (Contact)',
        decoder: GetData.ApplicationControl
    },
    'D7' : {
        name: 'Application Control (Contactless)',
        decoder: GetData.ApplicationControl
    },

    // TERMINAL
    '95' : {
        name: 'Terminal Verification Results',
        decoder: Terminal.TerminalVerificationResult
    },

    // for CPA
    'C1' : {
        name: 'Application Control',
        decoder: GetData.ApplicationControl4Cpa
    },

    // CPA template 
    'BF30' : {
        name : 'Accumulator Value(DF0X) / Limit(DF1X)',
    },
    'BF31' : {
        name : 'Accumulator Profile Control',
        decoder: Template.AccumulatorProfileControl
    },
    'BF32' : {
        name : 'Accumulator x Control',
        decoder: Template.AccumulatorControl
    },
    'BF36' : {
        name : 'Counter Profile Control',
        decoder: Template.CounterProfileControl
    },
    'BF37' : {
        name : 'Counter x Control',
        decoder: Template.CounterControl
    },

    'BF3B' : {
        name: 'Issuer Options Profile Control',
        decoder : Template.IssuerOptionsProfileControl
    },
    //// BF3D	DF01	MTA Profile Control 1	4	Fixed	08181F00
    'BF3D' : {
        name: 'MTA Profile Control',
        decoder : Template.MtaProfileCotnrol
    },
};


function setDecoder(tlv) {
    var tag = tlv.getTag();

    if (tag[0] === 'D' && tag[1] === 'F') { // is template tag
        var parent = tlv.parent;
        if (parent !== undefined) {
            tlv.name = parent.name;
            tlv.desc = parent.desc;
            return;
        }
    }

    if (emv[tag] !== undefined) {
        tlv.name = emv[tag].name;
        tlv.desc = emv[tag].decoder;
        if (emv[tag].func) {	
            // for extra function (afl getCommand)
            emv[tag].func(tlv);	
        }
    }

}


function ascii(tlv) {
    return [toAscii(tlv.getValue())];
}

function number(tlv) {
    return ['DEC: ' + toNumber(tlv.getValue())];
}

function getCountryCode(tlv) {
    var value = tlv.getValue();
    var countryCode = require('./decoder/json/CountryCode.json');
    var obj = countryCode[value];

    var desc = [];
    if (obj !== undefined) {
        desc.push('country info: name : ' + obj['country'] + ' (' + obj['A3'] + ')');
    } else {
        desc.push('unknown country code. plz update ISO3166.');
    }
    return desc;
}

function getDateFormat(tlv) {
    var desc = [];
    var value = tlv.getValue();
    var year = '20' + value.slice(0, 2);
    var month = value.slice(2, 4);
    var date = value.slice(4);
    desc.push('YYYY-MM-DD: '+ year + '-' + month + '-' + date);
    return desc;
}

function isPse(tlv) {
    var value = tlv.getValue();

    if ('315041592E5359532E4444463031' === value || '325041592E5359532E4444463031' === value) {
        return ascii(tlv)
    }

    // FIXME AID

    return [];
}

/**
 *
 * tag: '5F2A' Transaction Currency Code
 * tag: '9F42' Application Currency Code
 *
 * data from
 * https://www.currency-iso.org/en/home/tables/table-a1.html
 * https://www.currency-iso.org/dam/downloads/lists/list_one.xml
 * @param tlv
 */
function getCurrencyCode(tlv) {
    var value = tlv.getValue();
    var currencyCode = require('./decoder/json/CurrencyCode.json');

    var list = currencyCode['list'];

    var desc = [];
    if (list !== undefined) {
        var array = [];
        list.forEach( function (item) {
            if (item['number'] === value) {
                array.push(item);
            }
        });

        var obj = array[0];
        if (obj)
            desc.push('Code: [' + obj['code'] + '] : ' + obj['currency']);
        else
            desc.push('unknown country code ' + value + '. plz update ISO3166.');
    } else {
        desc.push('no country codes? plz load.');
    }
    return desc;
}

module.exports = {
    setDecoder: setDecoder
};

//FIXME visa, master, amex tag
},{"./decoder/Gac":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Gac.js","./decoder/GetData":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/GetData.js","./decoder/Gpo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Gpo.js","./decoder/Record":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Record.js","./decoder/Select":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Select.js","./decoder/Template":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Template.js","./decoder/Terminal":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Terminal.js","./decoder/json/CountryCode.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/json/CountryCode.json","./decoder/json/CurrencyCode.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/json/CurrencyCode.json","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/Dictionary.js":[function(require,module,exports){
/**
 * Created by coolbong on 2015-04-28.
 */

//FIXME function (TAG) return  {tag, length, description};
//need length information string info to {}

function Dictionary() {

}

// FIXME: dictionary data to  { tag: 42, desc: 'Application Identifier(AID)', length: ?? }

var emvDictionary = {
    '42' : 'Issuer Identification Number (IIN)',
    '4F' : 'Application Identifier(AID)',
    '50' : 'Application Label',
    '57' : 'Track 2 Equivalent Data',
    '5A' : 'Application Primary Account Number (PAN)',
    '5F20' : 'Cardholder Name',
    '5F24' : 'Application Expiration Date',
    '5F25' : 'Application Effective Date',
    '5F28' : 'Issuer Country Code',
    '5F2A' : 'Transaction Currency Code',
    '5F2D' : 'Language Preference',
    '5F30' : 'Service Code',
    '5F34' : 'Application Primary Account Number (PAN) Sequence Number',
    '5F36' : 'Transaction Currency Exponent',
    '5F50' : 'Issuer URL',
    '5F53' : 'International Bank Account Number (IBAN)',
    '5F54' : 'Bank Identifier Code (BIC)',
    '5F55' : 'Issuer Country Code (alpha2 format)',
    '5F56' : 'Issuer Country Code (alpha3 format)',
    '61' : 'Application Template',
    '6F' : 'File Control Information (FCI) Template',
    '70' : 'READ RECORD Response Message Template',
    '71' : 'Issuer Script Template 1',
    '72' : 'Issuer Script Template 2',
    '73' : 'Directory Discretionary Template',
    '77' : 'Response Message Template Format 2',
    '80' : 'Response Message Template Format 1',
    '81' : 'Amount, Authorised (Binary)',
    '82' : 'Application Interchange Profile',
    '83' : 'Command Template',
    '84' : 'Dedicated File (DF) Name',
    '86' : 'Issuer Script Command',
    '87' : 'Application Priority Indicator',
    '88' : 'Short File Identifier (SFI)',
    '89' : 'Authorisation Code',
    '8A' : 'Authorisation Response Code',
    '8C' : 'Card Risk Management Data Object List 1 (CDOL1)',
    '8D' : 'Card Risk Management Data Object List 2 (CDOL2)',
    '8E' : 'Cardholder Verification Method (CVM) List',
    '8F' : 'Certification Authority Public Key Index',
    '90' : 'Issuer Public Key Certificate',
    '91' : 'Issuer Authentication Data',
    '92' : 'Issuer Public Key Remainder',
    '93' : 'Signed Static Application Data',
    '94' : 'Application File Locator (AFL) (contact)',

    '95' : 'Terminal Verification Results',
    '97' : 'Transaction Certificate Data Object List (TDOL)',
    '98' : 'Transaction Certificate (TC) Hash Value',
    '99' : 'Transaction Personal Identification Number (PIN) Data',
    '9A' : 'Transaction Date',
    '9B' : 'Transaction Status Information',
    '9C' : 'Transaction Type',
    '9D' : 'Directory Definition File (DDF) Name',
    '9F01' : 'Acquirer Identifier',
    '9F02' : 'Amount, Authorised (Numeric)',
    '9F03' : 'Amount, Other (Numeric)',
    '9F04' : 'Amount, Other (Binary)',
    '9F05' : 'Application Discretionary Data',
    '9F06' : 'Application Identifier (AID) - terminal',
    '9F07' : 'Application Usage Control',
    '9F08' : 'Application Version Number',
    '9F09' : 'Application Version Number',
    '9F0B' : 'Cardholder Name Extended',
    '9F0D' : 'Issuer Action Code - Default',
    '9F0E' : 'Issuer Action Code - Denial',
    '9F0F' : 'Issuer Action Code - Online',
    '9F10' : 'Issuer Application Data',
    '9F11' : 'Issuer Code Table Index',
    '9F12' : 'Application Preferred Name',
    '9F13' : 'Last Online Application Transaction Counter (ATC) Register',
    '9F14' : 'Lower Consecutive Offline Limit',
    '9F15' : 'Merchant Category Code',
    '9F16' : 'Merchant Identifier',
    '9F18' : 'Issuer Script Identifier',
    '9F1A' : 'Terminal Country Code',
    '9F1B' : 'Terminal Floor Limit',
    '9F1C' : 'Terminal Identification',
    '9F1D' : 'Terminal Risk Management Data',
    '9F1E' : 'Interface Device (IFD) Serial Number',
    '9F1F' : 'Track 1 Discretionary Data',
    '9F20' : 'Track 2 Discretionary Data',
    '9F21' : 'Transaction Time',
    '9F23' : 'Upper Consecutive Offline Limit',
    '9F26' : 'Application Cryptogram',
    '9F27' : 'Cryptogram Information Data',
    '9F2D' : 'ICC PIN Encipherment Public Key Certificate',
    '9F2E' : 'ICC PIN Encipherment Public Key Exponent',
    '9F2F' : 'ICC PIN Encipherment Public Key Remainder',
    '9F32' : 'Issuer Public Key Exponent',
    '9F33' : 'Terminal Capabilities',
    '9F34' : 'Cardholder Verification Method (CVM) Results',
    '9F35' : 'Terminal Type',
    '9F36' : 'Application Transaction Counter (ATC)',
    '9F37' : 'Unpredictable Number',
    '9F38' : 'Processing Options Data Object List (PDOL)',
    '9F39' : 'Point-of-Service (POS) Entry Mode',
    '9F3A' : 'Amount, Reference Currency',
    '9F3B' : 'Application Reference Currency',
    '9F3C' : 'Transaction Reference Currency Code',
    '9F3D' : 'Transaction Reference Currency Exponent',
    '9F40' : 'Additional Terminal Capabilities',
    '9F41' : 'Transaction Sequence Counter',
    '9F42' : 'Application Currency Code',
    '9F43' : 'Application Reference Currency Exponent',
    '9F44' : 'Application Currency Exponent',
    '9F45' : 'Data Authentication Code',
    '9F46' : 'ICC Public Key Certificate',
    '9F47' : 'ICC Public Key Exponent',
    '9F48' : 'ICC Public Key Remainder',
    '9F49' : 'Dynamic Data Authentication Data Object List (DDOL)',
    '9F4A' : 'Static Data Authentication Tag List',
    '9F4B' : 'Signed Dynamic Application Data',
    '9F4C' : 'ICC Dynamic Number',
    '9F4D' : 'Log Entry',
    '9F4E' : 'Merchant Name and Location',
    '9F4F' : 'Log Format',
    '9F7C' : 'Merchant Custom Data',
    'A5' : 'File Control Information (FCI) Proprietary Template',
    'BF0C' : 'File Control Information (FCI) Issuer Discretionary Data',

    // contactless
    'D9' : 'Application File Locator (AFL) (contactless)',

    // EMV ContactlessSpecifications for Payment Systems
    // Book C-2 Kernel 2 Specification Version 2.6 February 2016

    '9F29' : 'Extended Selection',
    '9F2A' : 'Kernel Identifier',
    '5F57' : 'Account Type',
    '9F50' : 'Offline Accumulator Balance',
    '9F52' : 'Card Verification Result',
    '9F53' : 'Transaction Category Code',
    '9F5D' : 'Application Capabilities Information',
    '9F5E' : 'DS ID',
    '9F60' : 'CVC3 (Track1)',
    '9F61' : 'CVC3 (Track2)',
    '9F69' : 'UDOL',
    '9F6A' : 'Unpredictable Number (Numeric)',
    '9F6D' : 'Mag-stripe Application Version Number (Reader)',
    '9F6E' : 'Third Party Data',
    '9F70' : 'Protected Data Envelope 1',
    '9F71' : 'Protected Data Envelope 2',
    '9F72' : 'Protected Data Envelope 3',
    '9F73' : 'Protected Data Envelope 4',
    '9F74' : 'Protected Data Envelope 5',
    '9F75' : 'Unprotected Data Envelope 1',
    '9F76' : 'Unprotected Data Envelope 2',
    '9F77' : 'Unprotected Data Envelope 3',
    '9F78' : 'Unprotected Data Envelope 4',
    '9F79' : 'Unprotected Data Envelope 5',
    'DF41' : 'DS Management Control',
    'DF4B' : 'POS Cardholder Interaction Information',
    'DF60' : 'DS Input (Card)',
    'DF61' : 'DS Digest H',
    'DF62' : 'DS ODS Info',
    'DF63' : 'DS ODS Term',
    'DF8104' : 'Balance Read Before Gen AC',
    'DF8105' : 'Balance Read After Gen AC',
    'DF8106' : 'Data Needed',
    'DF8107' : 'CDOL1 Related Data',
    'DF8108' : 'DS AC Type',
    'DF8109' : 'DS Input (Term)',
    'DF810A' : 'DS ODS Info For Reader',
    'DF810B' : 'DS Summary Status',
    'DF810C' : 'Kernel ID',
    'DF810D' : 'DSVN Term',
    'DF810E' : 'Post-Gen AC Put Data Status',
    'DF810F' : 'Pre-Gen AC Put Data Status',
    'DF8110' : 'Proceed To First Write Flag',
    'DF8111' : 'PDOL Related Data',
    'DF8112' : 'Tags To Read',
    'DF8113' : 'DRDOL Related Data',
    'DF8114' : 'Reference Control Parameter',
    'DF8115' : 'Error Indication',
    'DF8116' : 'User Interface Request Data',
    'DF8117' : 'Card Data Input Capability',
    'DF8118' : 'CVM Capability – CVM Required',
    'DF8119' : 'CVM Capability – No CVM Required',
    'DF811A' : 'Default UDOL',
    'DF811B' : 'Kernel Configuration',
    'DF811C' : 'Max Lifetime of Torn Transaction Log Record',
    'DF811D' : 'Max Number of Torn Transaction Log Records',
    'DF811E' : 'Mag-stripe CVM Capability – CVM Required',
    'DF811F' : 'Security Capability',
    'DF8120' : 'Terminal Action Code – Default',
    'DF8121' : 'Terminal Action Code – Denial',
    'DF8122' : 'Terminal Action Code – Online',
    'DF8123' : 'Reader Contactless Floor Limit',
    'DF8124' : 'Reader Contactless Transaction Limit (No On-device CVM)',
    'DF8125' : 'Reader Contactless Transaction Limit (On-device CVM)',
    'DF8126' : 'Reader CVM Required Limit',
    'DF8127' : 'Time Out Value',
    'DF8128' : 'IDS Status',
    'DF8129' : 'Outcome Parameter Set',
    'DF812A' : 'DD Card (Track1)',
    'DF812B' : 'DD Card (Track2)',
    'DF812C' : 'Mag-stripe CVM Capability – No CVM Required',
    'DF812D' : 'Message Hold Time',
    'DF8130' : 'Hold Time Value',
    'DF8131' : 'Phone Message Table',
    'DF8132' : 'Minimum Relay Resistance Grace Period',
    'DF8133' : 'Maximum Relay Resistance Grace Period',
    'DF8134' : 'Terminal Expected Transmission Time For Relay Resistance CAPDU',
    'DF8135' : 'Terminal Expected Transmission Time For Relay Resistance RAPDU',
    'DF8136' : 'Relay Resistance Accuracy Threshold',
    'DF8137' : 'Relay Resistance Transmission Time Mismatch Threshold',
    'FF8101' : 'Torn Record',
    'FF8102' : 'Tags To Write Before Gen AC',
    'FF8103' : 'Tags To Write After Gen AC',
    'FF8104' : 'Data To Send',
    'FF8105' : 'Data Record',
    'FF8106' : 'Discretionary Data',



    //master card
    'C6': 'PIN Try Limit',
    '9F17': 'PIN Try Counter',
    '9F6C' : 'Mag Stripe Application Version Number',
    '9F62' : 'Track 1 Bit Map for CVC3 (PCVC3TRACK1)',
    '9F63' :'Track 1 Bit Map for UN and ATC (PUNATCTRACK1)',
    '56' : 'Track 1 Data',
    '9F64' : 'Track 1 Nr of ATC Digits (NATCTRACK1)',
    '9F65' : 'Track 2 Bit Map for CVC3 (PCVC3TRACK2)',
    '9F66' : 'Track 2 Bit Map for UN and ATC (PUNATCTRACK2)',
    '9F6B' : 'Track 2 Data',
    '9F67' : 'Track 2 Nr of ATC Digits (NATCTRACK2)',
    '9F5B' : 'DSDOL',
    '9F51' : 'DRDOL',
    '9F5F' : 'DS Slot Availability',
    '9F7F' : 'DS Unpredictable Number',
    '9F7D' : 'DS Summary 1',
    '9F6F' : 'DS Slot Management Control',
    '9F54' : 'DS ODS Card',
    'DF36' : 'PIN Decipherments Error Counter Limit',
    'DF3A' : 'AC Session Key Counter Limit (contact)',
    'DF32' : 'SMI Session Key Counter Limit (contact)',
    'DF34' : 'AC Session Key Counter Limit (contactless)',
    'DF33' : 'SMI Session Key Counter Limit (contactless)',
    'C9' : 'Accumulator 1 Currency Code',
    'D1' : 'Accumulator 1 Currency Conversion Table',
    'CA' : 'Accumulator 1 Lower Limit',
    'CB' : 'Accumulator 1 Upper Limit',
    'DF16' : 'Accumulator 2 Currency Code',
    'DF17' : 'Accumulator 2 Currency Conversion Table',
    'DF18' : 'Accumulator 2 Lower Limit',
    'DF19' : 'Accumulator 2 Upper Limit',
    'D3' : 'Additional check table',
    '9F7E' : 'Application life cycle data',
    'C7' : 'CDOL1 related data length',
    'DF1F' : 'Counter 2 Lower Limit',
    'DF21' : 'Counter 2 Upper Limit',
    'C8' : 'CRM Country Code',
    'D6' : 'Default ARPC Response Code',
    'DE' : 'Log Data Table',
    'DF24' : 'MTA Currency Code',
    'DF27' : 'Number of Days Offline Limit',
    'DF11' : 'Accumulator 1 Control (contact)',
    'DF12' : 'Accumulator 1 Control (contactless)',
    'DF28' : 'Accumulator 1 CVR Dependency Data (contact)',
    'DF29' : 'Accumulator 1 CVR Dependency Data (contactless)',
    'DF14' : 'Accumulator 2 Control (contact)',
    'DF15' : 'Accumulator 2 Control (contactless)',
    'DF2A' : 'Accumulator 2 CVR Dependency Data (contact)',
    'DF2B' : 'Accumulator 2 CVR Dependency Data (contactless)',
    'D5' : 'Application Control (contact)',
    'D7' : 'Application Control  (contactless) ',
    'D8' : 'Application Interchange Profile contactless',
    'C4' : 'Card Issuer Action Code – Default (contact)',
    'CD' : 'Card Issuer Action Code – Default (contactless) ',
    'C5' : 'Card Issuer Action Code - Online (contact)',
    'CE' : 'Card Issuer Action Code - Online (contactless)',
    'C3' : 'Card Issuer Action Code - Decline (contact)',
    'CF' : 'Card Issuer Action Code - Decline (contactless)',
    'DF1A' : 'Counter 1 control (Contact)',
    'DF1B' : 'Counter 1 control (contactless)',
    'DF2C' : 'Counter 1 CVR Dependency Data (Contact)',
    'DF2D' : 'Counter 1 CVR Dependency Data (contactless)',
    'DF1D' : 'Counter 2 control (Contact)',
    'DF1E' : 'Counter 2 control (contactless)',
    'DF2E' : 'Counter 2 CVR Dependency Data (Contact)',
    'DF2F' : 'Counter 2 CVR Dependency Data (contactless)',
    'DF30' : 'Interface Enabling Switch',
    'DF22' : 'MTA CVM (contact)',
    'DF23' : 'MTA CVM (contactless)',
    'DF25' : 'MTA NoCVM (contact)',
    'DF26' : 'MTA NoCVM (contactless)',
    'DF3F' : 'Read Record Filter (contact)',
    'DF40' : 'Read Record Filter (contactless)',
    'DF3E' : 'Interface Identifier (contactless)',
    'DF3C' : 'CVR Issuer Discretionary Data (contact)',
    'DF3D' : 'CVR Issuer Discretionary Data (contactless)',
    'DF3B' : 'Accumulator 1 Amount',
    'DF13' : 'Accumulator 2 Amount',
    'DF1C' : 'Counter 1 Number',
    'DF20' : 'Counter 2 Number',
    'DF38' : 'ICVC3 TRACK1 (contact)',
    'DC' : 'ICVC3 TRACK1 (contactless)',
    'DF39' : 'ICVC3 TRACK2 (contact)',
    'DD' : 'ICVC3 TRACK2 (contactless)',


    //master data storage
    '9F5C' : 'DS Requested Operator ID',


    // CPA
    'C1' : 'Application Control'

};


Dictionary.setTlv = function (tag) {

};

var toNumber = require('./util').toNumber;
var gpoResp = require('./decoder/Gpo');
var record = require('./decoder/Record');

var func = [];


function Map(tag) {
    tag = toNumber(tag);
    return func[tag];
}

Map.TAG_CARDHOLDER_NAME = 0x5f20;
Map.TAG_CDOL1   = 0x8C;
Map.TAG_CDOL2   = 0x8D;
Map.TAG_CVMLIST = 0x8E;
Map.TAG_ISSUER_COUNTRYT_CODE = 0x5F28;
Map.TAG_SERVICE_CODE = 0x5F30;

Map.TAG_AIP    = 0x82;
Map.TAG_AIP_CL = 0xD8;

func[Map.TAG_CARDHOLDER_NAME] = record.CardHolderName;
func[Map.TAG_CDOL1] = record.CDOL1;
func[Map.TAG_CDOL2] = record.CDOL2;
// func[Map.TAG_CVMLIST] = record.CVMList;
func[Map.TAG_ISSUER_COUNTRYT_CODE] = record.IssuerCountryCode;
func[Map.TAG_SERVICE_CODE] = record.ServiceCode;


func[Map.TAG_AIP]    = gpoResp.ApplicationInterchangeProfile;
func[Map.TAG_AIP_CL] = gpoResp.ApplicationInterchangeProfile;

Dictionary.getName = function(tag) {
    // fixme i need more tags
    return emvDictionary[tag];
};


Dictionary.getInfo = function(tlv) {

    tlv.desc = Map(tlv.getTag());
    tlv.setName(Dictionary.getName());
};


module.exports = Dictionary;
},{"./decoder/Gpo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Gpo.js","./decoder/Record":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Record.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/TLV.js":[function(require,module,exports){
(function (Buffer){(function (){
/**
 * Created by coolbong on 2016-03-23.
 *
 * reference 
 * - http://www.openscdp.org/scsh3/tlv.html
 * - ISO7816-4 5.2 Data object
 * - EMV Card Personalization Specification July 2007 Version 1.1
 */
// TODO add input type Uint8Array
// TODO new Buffer to Buffer.from


// constant
var Dictionary = require('./Dictionary');

var setDecoder = require('./Decoder').setDecoder;

var ut = require('./util');
var toHexString = ut.toHexString;
var toBuffer = ut.toBuffer;
var toNumber = ut.toNumber;
var toAscii = ut.toAscii;
var newBuffer = ut.newBuffer;
var un = ut.un;

var strip = ut.strip;



TLV.EMV = 0x00;
TLV.DGI = 0x01;


TLV.DOL = DOL;
TLV.TL = TL;




/**
 * Create a TLV object.
 *
 * @param {string | number} tag
 * @param {string} value
 * @param {number} [encoding] TLV.EMV / TLV.DGI
 * @returns {TLV}
 * @constructor
 */
function TLV (tag, value, encoding) {

    if (!(this instanceof TLV)) {
        return new TLV(tag, value, encoding);
    }
    this.encodingMode = encoding || TLV.EMV;             //number

    // parameter check
    if ((this.encodingMode !== TLV.EMV) && (this.encodingMode !== TLV.DGI)) {
        throw new Error('Not supported encoding mode');
    }

    this.tag    = TLV.adjustTag(tag, this.encodingMode); //string
    this.value  = TLV.adjustValue(value);                //string
    this.length = this.value.length / 2;                 //number

    //to buffer
    if (Buffer.isBuffer(value)) {
        this.bValue = newBuffer(value);
    } else {
        this.bValue = newBuffer(this.value);
    }

    // buffered data
    this.bTag = newBuffer(this.tag);
    this.bLength = TLV.getBufferLength(this.length, this.encodingMode);
    //size:  tag length , length length, value length
    //Combined length of tag, length and value field
    this.size = this.bTag.length + this.bLength.length + this.bValue.length;

    var offset = 0;
    var child;
    this.info = {};
    this.child = [];

    if (this.encodingMode === TLV.DGI) {
        // it's not spec.
        if ((this.bValue[0] === 0x70) || (this.tag == '9102')) {
            this.info.encoding = 'constructed';
            this.isConstructed = true;
            while(offset < this.length) {
                child = TLV.parse(this.bValue.slice(offset));
                offset += child.size;
                this.child.push(child);
            }
        } else {
            this.info.encoding = 'primitive';
            this.isConstructed = false;
        }
    } else {
        //info
        this.name = Dictionary.getName(this.tag);
        this.info = {};

        var CLASS_UNIVERSAL             = 0x00; //0000 0000 b
        var CLASS_APPLICATION           = 0x40; //0100 0000 b
        var CLASS_CONTEXT_SPECIFIC      = 0X80; //1000 0000 b
        var CLASS_PRIVATE               = 0xC0; //1100 0000 b

        var ENCODING_PRIMITIVE          = 0x00; //0000 0000 b
        var ENCODING_CONSTRUCTED        = 0x20; //0010 0000 b

        //var SUBSEQUENT_BYTE             = 0x1F; //0001 1111 b
        //var ANOTHER_SUBSEQUENT_BYTE     = 0x80; //1000 0000 b

        var tlv_class       = this.bTag[0] & CLASS_PRIVATE;
        var tlv_encoding    = this.bTag[0] & ENCODING_CONSTRUCTED;

        switch(tlv_class) {
            case CLASS_UNIVERSAL:
                //'00 indicates a data object of the universal class'
                this.info.clazz = 'universal';
                break;
            case CLASS_APPLICATION:
                //'01 indicates a data object of the application class'
                this.info.clazz = 'application';
                break;
            case CLASS_CONTEXT_SPECIFIC:
                //'10 indicates a data object of the application class'
                this.info.clazz = 'context specific';
                break;
            case CLASS_PRIVATE:
                //'11 indicates a data object of the application class'
                this.info.clazz = 'private';
                break;
        }

        if(tlv_encoding === ENCODING_PRIMITIVE) {
            //'bit 6 value 0 indicates a primitive encoding'
            this.info.encoding = 'primitive';
            this.isConstructed = false;
        } else {
            //'bit 6 value 1 indicates a constructed encoding'
            this.info.encoding = 'constructed';
            this.isConstructed = true;
        }

        setDecoder(this);

        if(this.isConstructed) {
            while(offset < this.length) {
                child = TLV.parse(this.bValue.slice(offset));
                child.parent = this;
                setDecoder(child);
                offset += child.size;
                this.child.push(child);
            }
        }


    }
}

/**
 * Return the value of the tag field of the TLV.
 *
 * @param {string} [encoding] return type ('number' / 'hex' / 'buffer'). 'hex' is default
 * @returns {string|number|buffer} string value of the tag
 */
TLV.prototype.getTag =  function(encoding) {
    //string
    if (encoding === 'number') {
        return toNumber(this.tag);
    } else if (encoding === 'buffer') {
        return toBuffer(this.tag);
    } else {
        return this.tag;
    }
};

/**
 * Return the value of the length field of the TLV.
 *
 * @param {string} [encoding] return type ('number' / 'hex' / 'buffer'). 'number' is default
 * @returns {number|string|buffer} the length field of the TLV.
 */
TLV.prototype.getLength = function(encoding) {
    //number
    if (encoding === 'hex') {
        return toHexString(this.bLength);
    } else if (encoding === 'buffer') {
        return TLV.getBufferLength(this.length, this.encodingMode);
    } else {
        return this.length;
    }
};

/**
 * Return the length of the TLV (tag + length + value)
 *
 * @returns {number} the length of the TLV
 */
TLV.prototype.getSize = function() {
    // number
    return this.size;
};

/**
 * Return the value of the value field of the TLV.
 * @param {string} [encoding] return type ('buffer' / 'hex' / 'ascii'). 'hex' is default
 * @returns {string|Buffer} the value field of the TLV.
 */
TLV.prototype.getValue = function(encoding) {
    if (encoding === 'buffer') {
        //buffer
        return toBuffer(this.value);
    } else if (encoding === 'ascii') {
        return toAscii(this.value);
    } else {
        //string
        return this.value;
    }
};

/**
 * Return the name of the TLV.
 *
 * @returns {string} the name of the TLV.
 */
TLV.prototype.getName = function() {
    return this.name || '';
};

/**
 * Return the value of the encoding of the TLV.
 *
 * @returns {number} TLV.EMV / TLV.DGI
 */
TLV.prototype.getEncoding = function() {
    // TLV.EMV / TLV.DGI
    return this.encodingMode;
};

/**
 * Return the value of the length field as string
 *
 * @returns {string} hex string
 */
TLV.prototype.getL = function(flag) {
    if (flag) {
        return toHexString(this.length);
    } else {
        return toHexString(this.bLength);
    }
};

/**
 * Return the value of the tag, length fields as string
 *
 * @returns {string} hex string
 */
TLV.prototype.getTL = function() {
    return this.tag + toHexString(this.bLength);
};

/**
 * Return the value of the length, value field as string
 *
 * @returns {string} hex string
 */
TLV.prototype.getLV = function(flag) {
    if (flag) {
        return toHexString(this.length) + this.value;
    } else {
        return toHexString(this.bLength) + this.value;
    }
};

/**
 * Return the value of the tag, value field as string.
 *
 * @returns {string} hex string
 */
TLV.prototype.getTV = function() {
    return this.tag + this.value;
};

/**
 * Return the value of the tag, length, value field as string.
 *
 * @returns {string} hex string
 */
TLV.prototype.getTLV = function() {
    return this.tag + toHexString(this.bLength) + this.value;
};

/**
 * Print the TLV structure.
 *
 * @param {number} [indent] tab space
 */
TLV.prototype.print = function(indent) {

    if (this.length === 0) {
        return;
    }

    var tab = '\t';
    indent = indent || 0;

    var prefix = '';
    for(var i=0; i<indent; i++) {
        prefix += tab;
    }

    var tld = this.tag + ' ' + toHexString(this.bLength) + ' (' + this.length + ')';

    if (this.name !== undefined) {
        tld = tld + ' [' + this.name + ']';
    }

    console.log(prefix + tld);

    //value

    if (this.child.length !== 0) {
        this.child.forEach(function(child){
            child.print(indent + 1);
        });
    } else {
        console.log(prefix + tab + this.value);

        if (this.desc) {
            var arr = this.desc(this);
            if (arr.length !== 0) {
                console.log(prefix + tab + arr.join('\n' + prefix + tab));
            }
        }
    }
};

TLV.prototype.print2 = function(indent) {

    if (this.length === 0) {
        return;
    }

    var tab = '\t';
    indent = indent || 0;

    var prefix = '';
    for(var i=0; i<indent; i++) {
        prefix += tab;
    }

    //var tld = this.tag + ' ' + toHexString(this.bLength) + ' (' + this.length + ')';

    var tld = "'" + this.tag + "', ";

    var tag_name = '';
    if (this.name !== undefined) {
        tag_name = ' // ' + this.name;
    }

    //console.log(prefix + tld);

    //value

    if (this.child.length !== 0) {
        this.child.forEach(function(child){
            child.print2(indent + 1);
        });
    } else {
        //console.log(prefix + tab + this.value);
        console.log("TLV(" + tld + "'" + this.value + "'), " + tag_name);

        if (this.desc) {
            var arr = this.desc(this);
            // if (arr.length !== 0) {
            //     console.log(prefix + tab + arr.join('\n' + prefix + tab));
            // }
        }
    }
};


/**
 * Get child TLV objects.
 *
 * @returns {TLV[]} array of TLV
 */
TLV.prototype.getChild = function () {
    // tlv (array)
    return this.child;
};


/**
 * Find tlv object.
 *
 * @param {string | number} tag
 * @returns {TLV}
 */
TLV.prototype.find = function(tag) {
    var upperTAG = TLV.adjustTag(tag);

    var child;
    var tlv;
    for (var i=0; i<this.child.length; i++) {
        child = this.child[i];
        if (child.tag === upperTAG) {
            return this.child[i];
        }

        if (child.isConstructed) {
            tlv = this.child[i].find(tag);
            if(tlv !== undefined) {
                return tlv;
            }
        }
    }
};

/**
 * Find tlv object.
 *
 * @param {string | number} tag
 * @returns {[TLV]]} list of tlv 
 */
TLV.prototype.findAll = function(tag) {
    var upperTAG = TLV.adjustTag(tag);

    var child;
    var results = []
    var tlv;
    for (var i=0; i<this.child.length; i++) {
        child = this.child[i];
        if (child.tag === upperTAG) {
            results.push(child)
        }

        if (child.isConstructed) {
            tlv = child.findAll(tag);
            if(tlv.length !== 0) {
                results = results.concat(tlv)
            }
        }
    }
    return results
};



/**
 * ditto getTLV().
 *
 * @returns {string} hex string
 */
TLV.prototype.toString = function() {
    return this.getTLV();
};


/**
 * Get Child TLV objects.
 *
 * @param {string | number} tag
 * @returns {TLV[]} array of TLV
 */
TLV.prototype.getTlvByTag = function(tag) {
    var upperTAG;
    var all = false;
    if ((tag === '*') || (tag === '') || (tag === undefined)) {
        all = true;
    } else {
        upperTAG = TLV.adjustTag(tag);
    }

    var ret = [];
    var child;
    for (var i=0; i<this.child.length; i++) {
        child = this.child[i];
        if ((all === true) || (child.tag === upperTAG)) {
            ret.push(child);
        }

        if (child.isConstructed) {
            ret = ret.concat(child.getTlvByTag(tag));
        }
    }

    return ret;
};


TLV.prototype.parseDolValue = function() {
    return DOL.parse(this.getValue());
};

// static api

/**
 * Get TLV objects.
 *
 * @param data
 * @param encoding
 * @returns {TLV[]} array of TLV
 */
TLV.parseList = function(data, encoding) {
    encoding = encoding || TLV.EMV;

    var tlv = new TLV(0x20, data, encoding); // tag for constructed encoding


    return tlv.getChild();
};
/**
 * Parse
 * @param {string | Buffer} data TAG, LENGTH, VALUE hex string
 * @param {number} [encoding] TLV.EMV / TLV.DGI
 * @returns {TLV}
 */
TLV.parse = function(data, encoding) {

    encoding = encoding || TLV.EMV;

    var buf = toBuffer(data);

    var tag;
    var lenTag;
    var length;
    var len;  // byte length of length
    var value;

    // DGI TLV
    if (encoding === TLV.DGI) {
        if (buf.length < 3) {
            throw Error('Invalid data');
        }
        var pos;
        tag = toHexString(buf.slice(0, 2));

        if (buf[2] === 0xff) {
            length = buf[3] << 8 | buf[4];
            pos = 5;
        } else {
            length = buf[2];
            pos = 3;
        }

        value = buf.slice(pos, pos+length);
        return new TLV(tag, value, encoding);

    } else {
        // EMV TLV
        lenTag = 1;
        if((buf[0] & 0x1f) === 0x1f) { // subsequent byte
            var idx = 1;
            do {
                lenTag++;
                if (idx > 4) {
                    throw Error('Invalid tag length');
                }
            } while((buf[idx++] & 0x80) === 0x80); // another subsequent byte
        }

        // handle tag
        tag = toHexString(buf.slice(0, lenTag));

        var lenOffset = lenTag;

        //81, 82, 83, 84
        if((buf[lenOffset] & 0x80) === 0x80) {
            len = (buf[lenOffset] & 0x7F) + 1;
        } else {
            len = 1;
        }

        // handle length
        if (len === 1) {
            length = buf[lenOffset];
        } else if (len === 2) {
            length = buf[(lenOffset + 1)];
        } else if (len === 3) {
            length = (buf[(lenOffset+1)] << 8) | buf[(lenOffset+2)];
        } else if (len === 4) {
            length = (buf[(lenOffset+1)] << 16) | (buf[(lenOffset+2)] << 8) | buf[(lenOffset+3)];
        } else if (len === 5) {
            length = (buf[(lenOffset+1)] << 24) | (buf[(lenOffset+2)] << 16) | (buf[(lenOffset+3)] << 8) | (buf[(lenOffset+4)]);
        } else {
            throw Error('Invalid length');
        }

        //handle value
        value = buf.slice(lenTag + len, lenTag+len+length);
        return new TLV(tag, value, encoding);
    }
};

/**
 * Return value of the length field as string.
 *
 * @param {string | Buffer | number} tag
 * @returns {string} hex string
 * @constructor
 */
TLV.T = function(tag) {
    var tlv = new TLV(tag, '');
    return tlv.getTag();
};

TLV.log = function(data, encoding) {
    TLV.parse(data, encoding).print();
};

/**
 * Return value of the length field as string.
 *
 * @param {string | Buffer} value
 * @param {boolean} [flag] default false
 * @returns {string} hex string
 */
TLV.L = function(value, flag) {
    var tlv = new TLV('', value);
    return tlv.getL(flag);
};


/**
 * Return value of the length field and the value field as string
 *
 * @param {string | Buffer} value
 * @param {boolean} [flag]
 * @return {string}
 */
TLV.LV = function (value, flag) {
    var tlv = new TLV('', value);
    return tlv.getLV(flag);
};

/**
 * Return value of the value field as string
 *
 * @param value
 * @returns {string}
 * @constructor
 */
TLV.V = function (value) {
    var tlv = new TLV('', value);
    return tlv.getValue();
};

/**
 *
 * @param {string | number} tag
 * @param {string} value
 * @param {number} [encoding] TLV.EMV / TLV.DGI
 * @return {string}
 */
TLV.TLV = function(tag, value, encoding) {
    var tlv = new TLV(tag, value, encoding);
    // string
    return tlv.getTLV();
};

/**
 *
 * @param buf
 * @param encoding
 * @returns {Buffer}
 */
TLV.getBufferTag = function(buf, encoding) {

    if ((buf === undefined) || (buf.length === 0)) {
        throw Error('Invalid data');
    }

    if (encoding === TLV.DGI) {
        if (buf.length < 2) {
            throw new Error('Invalid Tag length TLV.DGI')
        }
        return buf.slice(0, 2);
    } else {
        // SUBSEQUENT_BYTE              0x1f 0b0001 1111
        // ANOTHER_SUBSEQUENT_BYTE      0x80 0b1000 0000
        var lenTag = 1;
        if((buf[0] & 0x1f) === 0x1f) { // subsequent byte
            var idx = 1;
            do {
                lenTag++;
            }while((buf[idx] & 0x80) === 0x80); // another subsequent byte

            if (idx > 4) {
                throw Error('Invalid tag length TLV.EMV');
            }
        }

        return buf.slice(0, lenTag);
    }
};

/**
 *
 * @param {number} len
 * @param {number} [encoding]
 * @returns {Buffer}
 */
TLV.getBufferLength = function(len, encoding) {

    var bLen;

    if (encoding === TLV.DGI) {
        if (len > 0xFE) {
            bLen = newBuffer(3);
            bLen[0] = 0xff;
            bLen[1] = len >>> 8;
            bLen[2] = len;
        } else {
            bLen = newBuffer(1);
            bLen[0] = len;
        }
    } else {
        // refer to Table 8 ? BER-TLV length fields in ISO/IEC 7816
        if(len < 0x80) { //  0x00 ~ 0x7f
            bLen = newBuffer(1);
            bLen[0] = len;
        } else if(len < 0x0100) { //  0x00 ~ 0xff
            bLen = newBuffer(2);
            bLen[0] = 0x81;
            bLen[1] = len;
        } else if (len < 0x010000) { // 0x0000~0xffff
            bLen = newBuffer(3);
            bLen[0] = 0x82;
            bLen[1] = len >>> 8;
            bLen[2] = len;
        } else if (len < 0x01000000) { // 0x00000000 to 0x00ffffff
            bLen = newBuffer(4);
            bLen[0] = 0x83;
            bLen[1] = len >>> 16;
            bLen[2] = len >>> 8;
            bLen[3] = len;
        } else {
            bLen = newBuffer(5);
            bLen[0] = 0x84;
            bLen[1] = len >>> 24;
            bLen[2] = len >>> 16;
            bLen[3] = len >>> 8;
            bLen[4] = len;
        }
    }

    return bLen;
};

/**
 *
 * @param {string | Buffer | number} tag
 * @param {number} [encoding]
 * @returns {string}
 */
TLV.adjustTag = function (tag, encoding) {

    tag = tag || '';

    var ret;
    if (typeof tag === 'number') {
        ret = toHexString(tag);
    } else if (typeof tag === 'string') {
        tag = strip(tag);
        if ((tag.length === 0) || (tag === '')) {
            ret = '';
        } else {
            var num = toNumber(tag);
            ret = toHexString(num);
        }
    } else if (Buffer.isBuffer(tag)) {
        if (tag.length > 3) {
            throw new Error('Invalid tag length: ' + tag.length);
        }
        ret = toNumber(tag); // '[00, 82]' -> 82
        ret = toHexString(ret);  // 82 -> '82'
    } else {
        throw new Error('Invalid tag type');
    }

    
    if ((encoding === TLV.DGI) && (ret.length !== 4)) {
        // dgi tag length have to be 2 byte
        //throw Error('Invalid DGI tag');
        ret += '00';
    }

    return ret;
};

/**
 *
 * @param {string | Buffer} value
 *
 * @returns {string}
 */
TLV.adjustValue = function(value) {
    value = value || '';

    if (Buffer.isBuffer(value)) {
        return toHexString(value);
    } else if (typeof value === 'string') {
        value = strip(value);
        if ((value.length & 0x01) === 0x01) {
            throw Error('Invalid value length');
        }
        return value;
    } else {
        throw Error('Invalid value type: ' + typeof (value));
    }
};

/**
 *
 * @param {number | string} length number or hex string
 * @returns {number}
 */
TLV.adjustLength = function(length) {
    var ret;

    length = length || 0;

    if (typeof length === 'number') {
        ret = length;
    } else if (typeof length === 'string') {
        length = strip(length);
        ret = toNumber(length);
    } else {
        throw new Error('Invalid tag type');
    }
    return ret;
};

/**
 * Return the name of the TLV.
 *
 * @param {number | string} tag
 * @returns {string} the name of the TLV.
 */
TLV.getName = function (tag) {
    return Dictionary.getName(toHexString(tag)) || '';
};









/**
 *
 * @param tag
 * @param length
 * @returns {TL}
 * @constructor
 */
function TL(tag, length) {
    if (!(this instanceof TL)) {
        return new TL(tag, length);
    }

    this.tag    = TLV.adjustTag(tag);
    this.length = TLV.adjustLength(length);

    this.bTag = newBuffer(this.tag);
    this.bLength = TLV.getBufferLength(this.length);
    this.size = this.bTag.length + this.bLength.length;

    this.name = Dictionary.getName(this.tag);
}

/**
 * Return the value of the tag field of the TL.
 *
 * @returns {string|number} string value of the tag
 */
TL.prototype.getTag = function(type) {
    if (type === 'number') {
        return toNumber(this.tag);
    } else {
        return this.tag;
    }
};

TL.prototype.getLength = function() {
    return this.length;
};

TL.prototype.getSize = function() {
    return this.size;
};

TL.prototype.getName = function() {
    return this.name;
};

TL.prototype.setValue = function(value) {
    this.value = toHexString(value);
};

TL.prototype.getTL = function() {
    return this.tag + toHexString(this.bLength);
};


TL.prototype.getL = function(flag) {
    if (flag) {
        return toHexString(this.length);
    } else {
        return toHexString(this.bLength);
    }
};

TL.prototype.toString = function() {
    return this.getTL();
};

TL.prototype.toTLV = function(value) {
    return new TLV(this.tag, value);
};

TL.prototype.print = function(indent) {
    if (this.length === 0) {
        return;
    }

    var tab = '\t';
    indent = indent || 0;

    var prefix = '';
    for(var i=0; i<indent; i++) {
        prefix += tab;
    }

    var tld = this.tag + ' ' + toHexString(this.bLength) + ' (' + this.length + ')';

    if (this.name !== undefined) {
        tld = tld + ' [' + this.name + ']';
    }

    console.log(prefix + tld);
};

function DOL(dolData) {
    var buf = toBuffer(dolData);

    var offset = 0;
    var tag;
    var lenTag;
    var length;
    var len;  // byte length of length

    this.list = [];

    do {
        lenTag = 1;
        if((buf[offset] & 0x1f) === 0x1f) { // subsequent byte
            var idx = offset + 1;
            do {
                lenTag++;
            }while((buf[idx] & 0x80) === 0x80); // another subsequent byte
        }

        // handle tag
        tag = toHexString(buf.slice(offset, (offset + lenTag)));
        offset += lenTag;

        var lenOffset = offset;
        len = 1;

        //81, 82, 83, 84
        if((buf[lenOffset] & 0x80) === 0x80) {
            len = (buf[lenOffset] & 0x7F) + 1;
        }

        // handle length
        if (len === 1) {
            length = buf[lenOffset]; offset += 1;
        } else if (len === 2) {
            length = buf[(lenOffset + 1)]; offset += 2;
        } else if (len === 3) {
            length = (buf[(lenOffset+1)] << 8) | buf[(lenOffset+2)]; offset += 3;
        } else if (len === 4) {
            length = (buf[(lenOffset+1)] << 16) | (buf[(lenOffset+2)] << 8) | buf[(lenOffset+3)]; offset += 4;
        } else if (len === 5) {
            length = (buf[(lenOffset+1)] << 24) | (buf[(lenOffset+2)] << 16) | (buf[(lenOffset+3)] << 8) | (buf[(lenOffset+4)]); offset += 5;
        } else {
            console.log('error:' + this.tag );
            return;
            //throw Error('Invalid length');
        }

        this.list.push(new TL(tag, length));

    } while(offset < buf.length);

}

DOL.prototype.print = function() {

    this.list.forEach(function(item) {
        item.print();
    });
};

DOL.prototype.setValue = function(values) {
    values = toBuffer(values);

    var offset = 0;
    var tlvlist = [];
    this.list.forEach(function(item) {
        var tag   = item.getTag();
        var length = item.getLength();
        var value = un(values, offset, length);
        offset += length;

        item.setValue(value);
        tlvlist.push(new TLV(tag, value));
    });

    return tlvlist;
};

DOL.prototype.getList = function() {
    return this.list;
};

DOL.prototype.find = function(tag) {
    tag = TLV.adjustTag(tag);

    this.list.forEach(function(item) {
        if (tag === item.tag) {
            return item;
        }
    });
};

DOL.prototype.count = function() {
    return this.list.length;
};

DOL.prototype.getDolRelatedDataLength = function() {

    var len = 0;
    this.list.forEach(function(item) {
        len += item.length;
    });

    return len;
};

/**
 *
 * @param {string | Number} dolData
 * @return {DOL}
 */
DOL.parse = function(dolData) {
    return new DOL(dolData);
};


module.exports = TLV;


//FIXME add command api
//FIXME add TLV async api
//FIXME DOL to TLV API
//TODO TLV Builder
//TODO TLV Decoder

}).call(this)}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
},{"../../is-buffer/index.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-buffer/index.js","./Decoder":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/Decoder.js","./Dictionary":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/Dictionary.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Gac.js":[function(require,module,exports){
/**
 * Created by coolbong on 2017-02-27.
 */
var ut = require('../util');
var toHexString = ut.toHexString;
var toBuffer = ut.toBuffer;
var bitOn = ut.bitOn;
var u1 = ut.u1;
var u2 = ut.u2;
var un = ut.un;

/**
 * CID (Cryptogram Information Data)
 * tag: 9F27
 * length: 1
 *
 * @param tlv
 * @return {Array}
 */
function CryptogramInformationData(tlv) {
    var desc = [];
    var value = tlv.getValue('buffer');
    var code;

    code = value[0] & 0xc0;
    if (code == 0x80) {
        desc.push('10XX XXXX ARQC (Authorization Request Cryptogram): Online authorisation requested');
    } else if (code == 0x40) {
        desc.push('01XX XXXX TC (Transaction Certificate): Transaction approved');
    } else if (code == 0x00) {
        desc.push('00XX XXXX AAC (Application Authentication Cryptogram): Transaction declined');
    }

    return desc;
}


/**
 * IAD (Issuer Application Data)
 * tag: 9F10
 *
 * @param tlv
 * @return {Array}
 */
function IssuerApplicationData(tlv) {
    var buf = tlv.getValue('buffer');

    var format = buf[0];

    switch(format) {
        case 0x0F:
            return [' Issuer Application Data for a Common Core DefinitionsCompliant Application'];
        case 0x06:
        case 0x1F:
            return IssuerApplicationDataVisa(tlv);
        default:
            return IssuerApplicationDataMaster(tlv);
    }
}


/**
 * IAD (Issuer Application Data) for master
 * tag: 9F10
 * length: 18, 20, 26 or 28
 *
 * @param tlv
 * @return {Array}
 */
function IssuerApplicationDataMaster(tlv) {
    var desc = [];
    var buf = tlv.getValue('buffer');

    var len = buf.length;
    var offset = 0;

    desc.push('Key Derivation index: ' + u1(buf, offset)); offset += 1;
    desc.push('Cryptogram version number: ' + u1(buf, offset)); offset += 1;

    var cvr = un(buf, offset, 6); offset += 6;

    desc = desc.concat(CardVerificationResultsMaster(cvr));
    desc.push('DAC/ICC Dynamic Number: ' + u2(buf, offset)); offset += 2;

    var remainder = len-offset;

    //console.log(remainder);
    switch(remainder) {
        case 8:
        case 16:
            desc.push('Plaintext/Encrypted Counters: ' + un(buf, offset, remainder)); offset += remainder;
            break;
        case 10:
        case 18:
            desc.push('Plaintext/Encrypted Counters: ' + un(buf, offset, remainder)); offset += remainder;
            desc.push('Last Online ATC'); offset += 2;
            break;
    }

    return desc;
}


/**
 * IAD (Issuer Application Data) for visa
 * tag: 9F10
 *
 * @param tlv
 * @return {Array}
 */
function IssuerApplicationDataVisa(tlv) {
    var desc = [];
    var buf = tlv.getValue('buffer');

    var offset = 0;

    desc.push('length of  Visa Discretionary Data: ' + u1(buf, offset)); offset += 1;
    if (buf[0] === 0x06) {
        // IAD Format 0/1/3 (Current)
        desc.push('Derivation key index: ' + u1(buf, offset)); offset += 1;
        desc.push('Cryptogram version number: ' + u1(buf, offset)); offset += 1;

        var cvr = un(buf, offset, 4); offset += 4;

        var data = CardVerificationResultsVisa(cvr);
        desc = desc.concat(data);
        var discretionary_data = un(buf, offset);
        if (discretionary_data !== '') {
            desc.push('Issuer Discretionary Data:' + discretionary_data);
        }

    } else if (buf[0] === 0x1F) {
        // IAD Format 2 (New in VIS 1.6)
        desc.push('Cryptogram version number: ' + u1(buf, offset)); offset += 1;
        desc.push('Derivation key index: ' + u1(buf, offset)); offset += 1;
        desc.push('Card Verifcation Result: ' + un(buf, offset, 5)); offset += 5;
        desc.push('Issuer Discretionary Data:' + un(buf, offset));
    }
    return desc;
}

/**
 * CVR (Card Verification Results)
 * tag: '9F52'
 * length: 6
 *
 * @param buf
 * @returns {Array}
 */
function CardVerificationResultsMaster(buf) {

    var desc = [];
    //var buf = tlv.getValue('buffer');

    buf = toBuffer(buf);

    desc.push('Card Verification Result: ' + toHexString(buf));

    desc.push('byte1: ' + toHexString(buf[0]));
    var code = (buf[0] & 0xc0);
    //desc.push('b8-7 AC Returned In Second Generate AC');
    if (code == 0x00) {
        desc.push('\tb8-7 00: AAC Returned In Second Generate AC');
    } else if (code == 0x40) {
        desc.push('\tb8-7 01: TC Returned In Second Generate AC');
    } else if (code == 0x80) {
        desc.push('\tb8-7 10: AC Not Requested In Second Generate AC');
    }

    code = (buf[0] & 0x30);
    //desc.push('b6-5 AC Returned In First Generate AC');
    if (code == 0x00) {
        desc.push('\tb6-5 00: AAC Returned In First Generate AC');
    } else if (code == 0x20) {
        desc.push('\tb6-5 10: ARQC Returned In First Generate AC');
    } else if (code == 0x01) {
        desc.push('\tb6-5 01: TC Returned In First Generate AC');
    }

    code = buf[0] & 0x0f;
    if ((code & 0x08) == 0x08) {
        desc.push('b4 Date Check Failed');
    }

    if ((code & 0x04) == 0x04) {
        desc.push('b3 Offline PIN Verification Performed');
    }

    if ((code & 0x02) == 0x02) {
        desc.push('b2 Offline Encrypted PIN Verification Performed');
    }

    if ((code & 0x01) == 0x01) {
        desc.push('b1 Offline PIN Verification Successful');
    }

    code = buf[1];
    desc.push('byte2: ' + toHexString(buf[1]));
    if ((code & 0x80) == 0x80) {
        desc.push('\tb8 DDA Returned');
    }
    if ((code & 0x40) == 0x40) {
        desc.push('\tb7 Combined DDA/AC Generation Returned In First Generate AC');
    }
    if ((code & 0x20) == 0x20) {
        desc.push('\tb6 Combined DDA/AC Generation Returned In Second Generate AC');
    }
    if ((code & 0x10) == 0x10) {
        desc.push('\tb5 Issuer Authentication Performed');
    }
    if ((code & 0x08) == 0x08) {
        desc.push('\tb4 CIAC-Default Skipped On CAT3');
    }
    if ((code & 0x04) == 0x04) {
        desc.push('\tb3 Offline Change PIN Result');
    }
    //if ((code & 0x03) == 0x01) {
    //	desc.push('\tb2-1 Issuer Discretionary');
    //}

    code = buf[2];
    desc.push('byte3: ' + toHexString(code));
    desc.push('\tb8-5 Low Order Nibble Of Script Counter: ' + (code >>> 4));
    desc.push('\tb4-1 Low Order Nibble Of PIN Try Counter: ' + (code & 0x0f));


    code = buf[3];
    desc.push('byte4: ' + toHexString(code));
    if ((code & 0x80) == 0x80) {
        desc.push('\tb8 Last Online Transaction Not Completed');
    }
    if ((code & 0x40) == 0x40) {
        desc.push('\tb7 Unable To Go Online Indicated');
    }
    if ((code & 0x20) == 0x20) {
        desc.push('\tb6 Offline PIN Verification Not Performed');
    }
    if ((code & 0x10) == 0x10) {
        desc.push('\tb5 Offline PIN Verification Failed');
    }
    if ((code & 0x08) == 0x08) {
        desc.push('\tb4 PTL Exceeded');
    }
    if ((code & 0x04) == 0x04) {
        desc.push('\tb3 International Transaction');
    }
    if ((code & 0x02) == 0x02) {
        desc.push('\tb2 Domestic Transaction');
    }
    if ((code & 0x01) == 0x01) {
        desc.push('\tb1 Terminal Erroneously Considers Offline PIN OK');
    }

    code = buf[4];
    desc.push('byte5: ' + toHexString(code));
    if ((code & 0x80) == 0x80) {
        desc.push('\tb8 Lower Consecutive Counter 1 Limit Exceeded');
    }
    if ((code & 0x40) == 0x40) {
        desc.push('\tb7 Upper Consecutive Counter 1 Limit Exceeded');
    }
    if ((code & 0x20) == 0x20) {
        desc.push('\tb6 Lower Cumulative Accumulator 1 Limit Exceeded');
    }
    if ((code & 0x10) == 0x10) {
        desc.push('\tb5 Upper Cumulative Accumulator 1 Limit Exceeded');
    }
    if ((code & 0x08) == 0x08) {
        desc.push('\tb4 Go Online On Next Transaction Was Set');
    }
    if ((code & 0x04) == 0x04) {
        desc.push('\tb3 Issuer Authentication Failed');
    }
    if ((code & 0x02) == 0x02) {
        desc.push('\tb2 Script Received');
    }
    if ((code & 0x01) == 0x01) {
        desc.push('\tb1 Script Failed');
    }

    code = buf[5];
    desc.push('byte6: ' + toHexString(code));
    if ((code & 0x80) == 0x80) {
        desc.push('\tb8 Lower Consecutive Counter 2 Limit Exceeded');
    }
    if ((code & 0x40) == 0x40) {
        desc.push('\tb7 Upper Consecutive Counter 2 Limit Exceeded');
    }
    if ((code & 0x20) == 0x20) {
        desc.push('\tb6 Lower Cumulative Accumulator 2 Limit Exceeded');
    }
    if ((code & 0x10) == 0x10) {
        desc.push('\tb5 Upper Cumulative Accumulator 2 Limit Exceeded');
    }
    if ((code & 0x08) == 0x08) {
        desc.push('\tb4 MTA Limit Exceeded');
    }
    if ((code & 0x04) == 0x04) {
        desc.push('\tb3 Number Of Days Offline Limit Exceeded');
    }
    if ((code & 0x02) == 0x02) {
        desc.push('\tb2 Match Found In Additional Check Table');
    }
    if ((code & 0x01) == 0x01) {
        desc.push('\tb1 No Match Found In Additional Check Table');
    }
    return desc;
}

function CardVerificationResultsVisa(buf) {
    buf = toBuffer(buf);
    var desc = [];
    desc.push('Card Verification Result: ' + toHexString(buf));

    //CVR for IAD Format 0/1/3
    if (buf[0] === 0x03) {
        desc.push('byte 1: CVR length: ' + toHexString(buf[0]));
    } else {
        desc.push('byte 1: ' + toHexString(buf[0]));
    }
    var oneByte = buf[1] & 0x30;
    desc.push('byte2: ' + toHexString(buf[1]));
    if (oneByte == 0x00) {
        desc.push('\tb8-7 00: AAC Returned In Second Generate AC');
    } else if (oneByte == 0x40) {
        desc.push('\tb8-7 01: TC Returned In Second Generate AC');
    } else if (oneByte == 0x80) {
        desc.push('\tb8-7 10: AC Not Requested In Second Generate AC');
    }
    oneByte = (buf[1] & 0x30);
    if (oneByte == 0x00) {
        desc.push('\tb6-5 00: AAC Returned In First Generate AC');
    } else if (oneByte == 0x20) {
        desc.push('\tb6-5 10: ARQC Returned In First Generate AC');
    } else if (oneByte == 0x01) {
        desc.push('\tb6-5 01: TC Returned In First Generate AC');
    }
    oneByte = buf[1] & 0x0f;
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Issuer Authentication performed and failed');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Offline PIN verification performed');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Offline PIN verification failed');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Unable to go online');

    oneByte = buf[2];
    desc.push('byte3: ' + toHexString(buf[2]));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Last online transaction not completed');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 PIN Try Limit exceeded');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Exceeded velocity checking counters');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 New card');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Issuer Authentication failure on last online transaction');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Issuer Authentication not performed after online authorization');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Application blocked by card because PIN Try Limit exceeded');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Offline static data authentication failed on last transaction and transaction declined offline');

    oneByte = buf[3];
    desc.push('byte4: ' + toHexString(buf[3]));
    desc.push('\tb8-5 Number of Issuer Script commands: ' + (buf[3]>>4));
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Issuer Script processing failed');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Offline dynamic data authentication failed on last transaction and transaction declined offline');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Offline dynamic data authentication performed');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 PIN verification command not received for a PINExpecting card');

    if (buf[0] !== 0x03 ) {
        //CVR for IAD Format 2
        oneByte = buf[4];
        desc.push('byte3: ' + toHexString(buf[4]));
        if (bitOn(oneByte, 0x02)) desc.push('\tb2 CDCVM Successfully Performed');
        if (bitOn(oneByte, 0x01)) desc.push('\tb1 Secure Messaging uses EMV Session keybased derivation');

    }
    return desc;
}

/**
 * Terminal Type
 * tag: '9F35'
 * length: 1
 *
 * https://www.emvco.com/faq.aspx?id=40#36
 * @param tlv
 * @returns {Array}
 */
function TerminalType(tlv) {
    var terminalType = require('./json/TerminalType.json');
    var key = tlv.getValue();
    var obj = terminalType[key];

    var desc = [];
    if (obj !== undefined) {
        var str;
        str =  'environment: ' + obj['environment'] + ' ';
        str += 'operator: ' + obj['operator'] + ' ';
        str += 'transaction type: ' + obj['type'];
        desc.push(str);
    } else {
        desc.push('unknown terminal type');
    }

    return desc;
}


module.exports = {
    CryptogramInformationData: CryptogramInformationData,
    IssuerApplicationData: IssuerApplicationData,
    TerminalType: TerminalType
};
},{"../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/util.js","./json/TerminalType.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/json/TerminalType.json"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/GetData.js":[function(require,module,exports){
/**
 * Created by coolbong on 2017-02-27.
 */

var bitOn = require('../util').bitOn;
var toHexString = require('../util').toHexString;

/**
 * CIAC (Card Issuer Action Code)
 * tag: 'C3', 'C4', 'C5', 'CD', 'CE', 'CF'
 *
 * @param tlv
 * @return {Array}
 */
function CardIssuerActionCode4Master(tlv) {
    var desc = [];

    var buf = tlv.getValue('buffer');
    var oneByte;

    oneByte = buf[0];
    desc.push('Byte 1: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Last Online Transaction Not Completed');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Unable To Go Online Indicated');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Offline PIN Verification Not Performed');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Offline PIN Verification Failed');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 PTL Exceeded');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 International Transaction');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Domestic Transaction');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Terminal Erroneously Considers Offline PIN OK');

    oneByte = buf[1];
    desc.push('Byte 2: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Lower Consecutive Counter 1 Limit Exceeded');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Upper Consecutive Counter 1 Limit Exceeded');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Lower Cumulative Accumulator 1 Limit Exceeded');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Upper Cumulative Accumulator 1 Limit Exceeded');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Go Online On Next Transaction Was Set');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Issuer Authentication Failed');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Script Received');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Script Failed');

    oneByte = buf[2];
    desc.push('Byte 3: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Lower Consecutive Counter 2 Limit Exceeded');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Upper Consecutive Counter 2 Limit Exceeded');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Lower Cumulative Accumulator 2 Limit Exceeded');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Upper Cumulative Accumulator 2 Limit Exceeded');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 MTA Limit Exceeded');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Number Of Days Offline Limit Exceeded');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Match Found In Additional Check Table');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 No Match Found In Additional Check Table');
    return desc;
}

/**
 * CIAC (Issuer Action Code) for CPA
 * tag: 'C3', 'C4', 'C5', 'CD', 'CE', 'CF'
 *
 * @param tlv
 * @return {Array}
 */
function IssuerActionCode(tlv) {
    var desc = [];

    var buf = tlv.getValue('buffer');
    var oneByte;


    oneByte = buf[0];
    desc.push('Byte 1: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Last Online Transaction Not Completed');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Go Online On Next Transaction Was Set');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Issuer Script Processing Failed');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Issuer Authentication Failed');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Issuer Authentication Data Not Received in Previous Online Transaction');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 PIN Try Limit Exceeded');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Offline PIN Verification Not Performed');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Offline PIN Verification Failed');

    oneByte = buf[1];
    desc.push('Byte 2: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Unable To Go Online');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Terminal Erroneously Considers Offline PIN OK');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Script Received');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Offline Data Authentication Failed on Previous Transaction');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Match Found In Additional Check Table 1');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 No Match Found In Additional Check Table 1');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Match Found In Additional Check Table 2');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 No Match Found In Additional Check Table 2');

    oneByte = buf[2];
    desc.push('Byte 3: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Accumulator 1 Lower Limit Exceeded');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Accumulator 2 Lower Limit Exceeded');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Counter 1 Lower Limit Exceeded');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Counter 2 Lower Limit Exceeded');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Counter 3 Lower Limit Exceeded');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Additional Accumulator Lower Limit Exceeded');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Additional Counter Lower Limit Exceeded');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Number of Days Offline Limit Exceeded');

    oneByte = buf[3];
    desc.push('Byte 4: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Accumulator 1 Upper Limit Exceeded');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Accumulator 2 Upper Limit Exceeded');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Counter 1 Upper Limit Exceeded');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Counter 2 Upper Limit Exceeded');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Counter 3 Upper Limit Exceeded');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Additional Accumulator Upper Limit Exceeded');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Additional Counter Upper Limit Exceeded');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 MTA exceeded');

    oneByte = buf[4];
    desc.push('Byte 5: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Cyclic Accumulator 1 Limit Exceeded');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Cyclic Accumulator 2 Limit Exceeded');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Additional Cyclic Accumulator Limit Exceeded');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Check Failed');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 RFU');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 RFU');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 RFU');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 RFU');

    oneByte = buf[5];
    desc.push('Byte 6: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 RFU for Issuer');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 RFU for Issuer');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 RFU for Issuer');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 RFU for Issuer');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 RFU for Issuer');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 RFU for Issuer');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 RFU for Issuer');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 RFU for Issuer');

    return desc;
}

// master application
/**
 * Application Control
 * tag:
 *   'D5'(Contact), 'D7' (Contactless)
 *
 * Description: The Application Control activates or de-activates functions in the application
 * @param tlv
 * @returns {Array}
 */
function ApplicationControl(tlv) {
    var desc = [];
    var buf = tlv.getValue('buffer');
    var oneByte;

    oneByte = buf[0];
    desc.push('byte1: ' + toHexString(oneByte));
    // Byte 1     b8 Accept Online Transactions Without ARPC
    // Byte 1     b7 Skip CIAC-Default On CAT3
    // Byte 1     b6 RFU
    // Byte 1     b5     Key For Offline Encrypted PIN Verification 0: DDA Key
    // Byte 1     b5     Key For Offline Encrypted PIN Verification 1: Dedicated Key
    // Byte 1     b4     Offline Encrypted PIN Verification
    // Byte 1     b3     Offline Plaintext PIN Verification
    // Byte 1     b2     Session Key Derivation 0: MasterCard Proprietary SKD
    // Byte 1     b2     Session Key Derivation 1: EMV CSK
    // Byte 1     b1     Encrypt Offline Counters
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Accept Online Transactions Without ARPC');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Skip CIAC-Default On CAT3');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 RFU');

    if (bitOn(oneByte, 0x10)) {
        desc.push('\tb5 Key For Offline Encrypted PIN Verification 1: Dedicated Key');
    } else {
        desc.push('\tb5 Key For Offline Encrypted PIN Verification 0: DDA Key');
    }

    if (bitOn(oneByte, 0x08)) {
        desc.push('\tb4 Offline Encrypted PIN Verification');
    } else {
        desc.push('\tb4 Offline Encrypted PIN verification is not supported');
    }

    if (bitOn(oneByte, 0x04)) {
        desc.push('\tb3 Offline Plaintext PIN Verification');
    } else {
        desc.push('\tb3 Offline Plaintext PIN verification is not supported');
    }

    if (bitOn(oneByte, 0x02)) {
        desc.push('\tb2 Session Key Derivation 1: EMV CSK');
    } else {
        desc.push('\tb2 Session Key Derivation 0: MasterCard Proprietary SKD');
    }
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Encrypt Offline Counters');


    oneByte = buf[1];
    desc.push('byte2: ' + toHexString(oneByte));
    // Byte 2     b3     Additional Check Table
    // Byte 2     b2     Allow Retrieval Of Balance
    // Byte 2     b1     Include Counters In AC
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Additional Check Table');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Allow Retrieval Of Balance');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Include Counters In AC');

    oneByte = buf[2];
    desc.push('byte3: ' + toHexString(oneByte));
    // Byte 3     b87     Compute Cryptographic Checksum 00: RFU
    // Byte 3     b87     Compute Cryptographic Checksum 01: Compute Cryptographic Checksum Supported
    // Byte 3     b87     Compute Cryptographic Checksum 10: Compute Cryptographic Checksum Not Supported
    // Byte 3     b87     Compute Cryptographic Checksum 11: RFU
    // Byte 3     b6     Decline If CDA Not Requested And RRP Performed
    // Byte 3     b5     Go Online If RRP Not Performed
    // Byte 3     b4     Decline If Unable To Go Online And RRP Not Performed
    // Byte 3     b3     Use M/Chip 4 CDOL1
    // Byte 3     b2     Enable Alternate Interface After TC Generated
    // Byte 3     b1     Enable Alternate Interface After Successful Verify

    if ((oneByte & 0xc0) === 0x40) {
        desc.push('\tCompute Cryptographic Checksum 01: Compute Cryptographic Checksum Supported');
    } else if ((oneByte & 0xc0) === 0x80) {
        desc.push('\tCompute Cryptographic Checksum 10: Compute Cryptographic Checksum Not Supported');
    } else {
        desc.push('\tCompute Cryptographic Checksum 00 or 11: RFU');
    }

    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Decline If CDA Not Requested And RRP Performed');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Go Online If RRP Not Performed');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Decline If Unable To Go Online And RRP Not Performed');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Use M/Chip 4 CDOL1');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Enable Alternate Interface After TC Generated');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Enable Alternate Interface After Successful Verify');


    oneByte = buf[3];
    desc.push('byte4: ' + toHexString(oneByte));
    // Byte 4     b8     Include Transaction In CRM If ARQC Is Requested
    // Byte 4     b7     Use CIAC-online To Decide On ARQC Request
    // Byte 4     b6     Generate Only TC Or AAC On TC Request
    // Byte 4     b5     MTA Check
    // Byte 4     b4     Maximum Number Of Days Offline Check
    // Byte 4     b3     Include RRP Data in Counters
    // Byte 4     b2     Plaintext Offline Change PIN
    // Byte 4     b1     Encrypted Offline Change PIN
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Include Transaction In CRM If ARQC Is Requested');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Use CIAC-online To Decide On ARQC Request');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Generate Only TC Or AAC On TC Request');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 MTA Check');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Maximum Number Of Days Offline Check');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Include RRP Data in Counters');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Plaintext Offline Change PIN');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Encrypted Offline Change PIN');

    oneByte = buf[4];
    desc.push('byte5: ' + toHexString(oneByte));
    // Byte 5     b8     AAC Logging
    // Byte 5     b7     TC Logging
    // Byte 5     b6     ARQC Pre-logging
    // Byte 5     b5     Include Last Online ATC in IAD
    // Byte 5     b432   Issuer Host Backwards Compatibility 000: No Host Backwards Compatibility
    // Byte 5     b432   Issuer Host Backwards Compatibility 001: V2.1/V2.2 Host Backwards Compatibility
    // Byte 5     b432   Issuer Host Backwards Compatibility 010: V2.05 Host Backwards Compatibility
    // Byte 5     b432   Issuer Host Backwards Compatibility 011: V1.1/V1.3 Host Backwards Compatibility
    // Byte 5     b432   Issuer Host Backwards Compatibility 1xx: RFU
    // Byte 5     b1     Partial Authorization

    if (bitOn(oneByte, 0x80)) desc.push('\tb8 AAC Logging');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 TC Logging');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 ARQC Pre-logging');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Include Last Online ATC in IAD');


    if ((oneByte & 0x0E) === 0x00) {
        desc.push('\tb432 Issuer Host Backwards Compatibility 000: No Host Backwards Compatibility');
    } else if ((oneByte & 0x0E) === 0x02) {
        desc.push('\tb432 Issuer Host Backwards Compatibility 001: V2.1/V2.2 Host Backwards Compatibility');
    } else if ((oneByte & 0x0E) === 0x04) {
        desc.push('\tb432 Issuer Host Backwards Compatibility 010: V2.05 Host Backwards Compatibility');
    } else if ((oneByte & 0x0E) === 0x06) {
        desc.push('\tb432 Issuer Host Backwards Compatibility 011: V1.1/V1.3 Host Backwards Compatibility');
    }

    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Partial Authorization');

    oneByte = buf[5];
    desc.push('byte6: ' + toHexString(oneByte));
    // Byte 6     b8     Enable Alternate Interface After First Gen AC
    // Byte 6     b7     Save Accumulators And Counters on ARQC Response
    // Byte 6     b6     AC for MAS4C 0: AAC
    // Byte 6     b6     AC for MAS4C 1: ARQC
    // Byte 6     b5     Key for MAS4C Processing Flow 0: AC Master Key
    // Byte 6     b5     Key for MAS4C Processing Flow 1: AC Master Key (MAS4C)
    // Byte 6     b4     Torn Transaction Recovery
    // Byte 6     b3     MAS4C Processing Flow
    // Byte 6     b2     Reset Script Counter With Online Response
    // Byte 6     b1     Allow Retrieval Of Transaction Log Records
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Enable Alternate Interface After First Gen AC');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Save Accumulators And Counters on ARQC Response');
    if (bitOn(oneByte, 0x20)) {
        desc.push('\tb6 AC for MAS4C 0: AAC');
    } else {
        desc.push('\tb6 AC for MAS4C 1: ARQC');
    }
    if (bitOn(oneByte, 0x01)) {
        desc.push('\tb5 Key for MAS4C Processing Flow 1: AC Master Key (MAS4C)');
    } else {
        desc.push('\tb5 Key for MAS4C Processing Flow 0: AC Master Key');
    }
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Torn Transaction Recovery');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 MAS4C Processing Flow');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Reset Script Counter With Online Response');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 Allow Retrieval Of Transaction Log Records');

    return desc;
}

function ApplicationControl4Cpa(tlv) {
    var desc = [];
    var buf = tlv.getValue('buffer');
    var oneByte;

    oneByte = buf[0];
    desc.push('byte1: ' + toHexString(oneByte));

    if (bitOn(oneByte, 0x80)) desc.push('\tB1b8 1 Issuer Authentication Required to be performed');
    if (bitOn(oneByte, 0x40)) desc.push('\tB1b7 1 Issuer Authentication Required to Pass when Performed');
    if (bitOn(oneByte, 0x20)) desc.push('\tB1b6 1 Issuer Authentication Requirements apply to Resetting of Non-Velocity-Checking Indicators and Counters)');
    if (bitOn(oneByte, 0x10)) desc.push('\tB1b5 1 Issuer Authentication Requirements apply to Resetting of Velocity-Checking Counters)');
    if (bitOn(oneByte, 0x08)) { 
        desc.push('\tB1b4 1 [Enciphered PIN] Use ICC PIN Encipherment Public/Private key pair');
    } else {
        desc.push('\tB1b4 0 [Enciphered PIN] Use ICC Public/Private key pair');
    }
    if (bitOn(oneByte, 0x04)) desc.push('\tB1b3 1 Offline Enciphered PIN Verification Supported');
    if (bitOn(oneByte, 0x02)) desc.push('\tB1b2 1 Offline Plaintext PIN Verification Supported');
    if (bitOn(oneByte, 0x01)) desc.push('\tB1b1 1 Allow Retrieval of Values and Limits of Accumulators and Counters');
    
    oneByte = buf[1];
    desc.push('byte2: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) { 
        desc.push('\tB2b8  1  Use Default Update Counters if CSU is Generated by Issuer Proxy');
    } else {
        desc.push('\tB2b8  0  Use Update Counters Received in CSU if CSU is Generated by Issuer Proxy'); 
    }
    
    if ((oneByte & 0x60) === 0x00) {
        desc.push('\tB2b76 00 Do Not Update Offline Counters');
    } else if ((oneByte & 0x60) === 0x40) {
        desc.push('\tB2b76 01 Set Offline Counters to Upper Offline Limits');
    } else if ((oneByte & 0x60) === 0x20) {
        desc.push('\tB2b76 10 Reset Offline Counters to Zero');
    } else {
        desc.push('\tB2b76 11 Add Transaction to Offline Counters');
    }

    if (bitOn(oneByte, 0x08)) { desc.push('\tB2b4  1  Activate Profile Selection File'); }
    if (bitOn(oneByte, 0x04)) { desc.push('\tB2b3  1  Amounts Included in CDOL2'); }
    if (bitOn(oneByte, 0x02)) { desc.push('\tRFU'); }
    if (bitOn(oneByte, 0x01)) { desc.push('\tRFU'); }

    oneByte = buf[2];
    desc.push('byte3: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) { desc.push('\tB3b8 1 Log Declined Transactions'); }
    if (bitOn(oneByte, 0x40)) { desc.push('\tB3b7 1 Log Approved Transactions'); }

    if (bitOn(oneByte, 0x20)) { 
        desc.push('\tB3b6 1 Log Offline Only'); 
    } else {
        desc.push('\tB3b6 0 Log Both Offline and Online');
    }
    if (bitOn(oneByte, 0x10)) { desc.push('\tB3b5 1 Log the ATC'); }
    if (bitOn(oneByte, 0x08)) { desc.push('\tB3b4 1 Log the CID'); }
    if (bitOn(oneByte, 0x04)) { desc.push('\tB3b3 1 Log the CVR'); }
    if (bitOn(oneByte, 0x02)) { desc.push('\tB3b2 1 Log the Profile ID'); }
    if (bitOn(oneByte, 0x01)) { desc.push('\tB3b1 1 RFU'); }

    oneByte = buf[3];
    desc.push('byte4: ' + toHexString(oneByte));
    if ((oneByte & 0xF0) !== 0x00) {
        desc.push('Reserved for use by Payment Systems for optional extensions');
    }

    if ((oneByte & 0x0F) !== 0x00) {
        desc.push('Reserved for use by Issuer');
    }

    return desc;
}

function LogFormat(tlv) {
    var dol = tlv.parseDolValue();

    var desc = [];
    desc.push('LogFormat: 9F4F DOL Related Data length: ' + toHexString(dol.getDolRelatedDataLength()) + ' (' + dol.getDolRelatedDataLength() + ')');
    var dolList = dol.getList();
    dolList.forEach(function (tl) {
        desc.push(tl.getTag() + ' ' + tl.getL() + ' (' + tl.getLength() + ') ' + tl.getName());
    });

    return desc;
}

module.exports = {
    CardIssuerActionCode4Master: CardIssuerActionCode4Master,
    IssuerActionCode: IssuerActionCode,
    ApplicationControl: ApplicationControl,
    LogFormat: LogFormat,
    ApplicationControl4Cpa: ApplicationControl4Cpa,
};
},{"../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Gpo.js":[function(require,module,exports){
/**
 * Created by coolbong on 2017-02-14.
 */

var toBuffer = require('../util').toBuffer;
var toHexString = require('../util').toHexString;

/**
 * AIP (Application Interchange Profile)
 * tag: 82 (contact)
 * tag: D8 (contactless)
 *
 * @param tlv
 * @returns {Array}
 */
function ApplicationInterchangeProfile(tlv) {
    var value = toBuffer(tlv.getValue());

    var code = value[0];
    var desc = [];
    //desc.push('Application Interchange Profile [' + tlv.getTag() + ']: ' + tlv.getValue());

    if ((code & 0x80) === 0x80) {
        desc.push('RFU');
    }

    if ((code & 0x40) === 0x40) {
        desc.push('4000 Byte 1 b7: SDA supported (Offline Static Data Authenticate)');
    }

    if ((code & 0x20) === 0x20) {
        desc.push('2000 Byte 1 b6: DDA supported (Offline Dynamic Data Authenticate)');
    }

    if ((code & 0x10) === 0x10) {
        desc.push('1000 Byte 1 b5: Cardholder verification is supported');
    }

    if ((code & 0x08) === 0x08) {
        desc.push('0800 Byte 1 b4: Terminal risk management is to be performed');
    }

    if ((code & 0x04) === 0x04) {
        desc.push('0400 Byte 1 b3: Issuer authentication is supported');
    }

    if ((code & 0x02) === 0x02) {
        desc.push('0200 Byte 1 b2: RFU');
    }

    if ((code & 0x01) === 0x01) {
        desc.push('0100 Byte 1 b1: CDA supported');
    }

    code = value[1];
    if ((code & 0x80) === 0x80) {
        desc.push('0080 Byte 2 b8: Reserved for use by the EMV Contactless Specifications');
    }

    return desc;
}

/**
 * AFL (Application File Locator)
 * '94' contact
 * 'D9' contactless
 *
 * @param tlv
 * @return {Array}
 */
function ApplicationFileLocator(tlv) {


    var buf = toBuffer(tlv.getValue());
    var len = buf.length;

    if (len % 4 !== 0) {
        return [('Invalid data length: length % 4: ' + (len % 4))];
    }

    var cnt = len / 4;
    var offset = 0;
    var items = [];

    for (var i=0; i<cnt; i++) {
        var chunk = buf.slice(offset, offset + 4); offset += 4;
        items.push(chunk);
    }


    var desc = [];
    var str;
    items.forEach(function (item) {
        str = toHexString(item);
        str += ' SFI: ' + toHexString(item[0] >> 3) + ' ';
        if (item[1] === item[2]) {
            str += ' record: ' + toHexString(item[1]);
        } else {
            str += ' record: ' + toHexString(item[1]) + ' - ' + toHexString(item[2]);
        }
        desc.push(str);
    });

    tlv.afe = items;
    tlv.getCommand = function() {
        var cmds = [];
        tlv.afe.forEach(function (data) {
            var cmd;
            var p2;
            for(var i=data[1]; i<=data[2]; i++) {
                p2 = data[0] | 0x04;
                cmd = '00B2';
                cmd += toHexString(i);
                cmd += toHexString(p2);
                cmd += '00';
                cmds.push(cmd);
            }
        });
        return cmds;
    };

    return desc
}

function ApplicationFileLocatorFunction(tlv) {
  var buf = tlv.getValue('buffer');
  var cnt = tlv.getLength() / 4;
  var offset = 0;
  var items = [];

  for (var i=0; i<cnt; i++) {
    var chunk = buf.slice(offset, offset + 4); offset += 4;
    items.push(chunk);
  }
  tlv.afe = items;
  tlv.getCommand = function() {
    var cmds = [];
    tlv.afe.forEach(function (data) {
      var cmd;
      var p2;
      for(var i=data[1]; i<=data[2]; i++) {
        p2 = data[0] | 0x04;
        cmd = '00B2';
        cmd += toHexString(i);
        cmd += toHexString(p2);
        cmd += '00';
        cmds.push(cmd);
      }
    });
    return cmds;
  };
}



module.exports = {
    ApplicationFileLocator : ApplicationFileLocator,
    ApplicationFileLocatorFunction: ApplicationFileLocatorFunction,
    ApplicationInterchangeProfile : ApplicationInterchangeProfile
};

},{"../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Record.js":[function(require,module,exports){
/**
 * Created by coolbong on 2017-02-14.
 */
var toBuffer = require('../util').toBuffer;
var toHexString = require('../util').toHexString;
var toAscii = require('../util').toAscii;
var bitOn = require('../util').bitOn;


/**
 * Track 1 Data
 * The Track 1 Data contains the data objects of the track 1 according to ISO/IEC 7813
 * Structure B, excluding start sentinel, end sentinel and LRC. The Track 1 Data may be
 * used by the terminal for authorization and clearing.
 *
 * tag: '56'
 * [Exclude] STX : Start sentinel "%"
 * FC : Format code "B" (The format described here. Format "A" is reserved for proprietary use.)
 * PAN : Primary Account Number, up to 19 digits
 * FS : Separator "^"
 * NM : Name, 2 to 26 characters (including separators, where appropriate, between surname, first name etc.)
 * FS : Separator "^"
 * ED : Expiration data, 4 digits or "^"
 * SC : Service code, 3 digits or "^"
 * DD : Discretionary data, balance of characters
 * [Exclude] ETX : End sentinel "?"
 * [Exclude] LRC : Longitudinal redundancy check, calculated according to ISO/IEC 7811-2
 *
 * @param tlv
 * @return {Array}
 */
function Track1Data(tlv) {

    var desc = [];
    var value = toAscii(tlv.getValue());
    var offset = 0;

    if (value[0] !== 'B') {
        desc.push('Invalid format code (tract 1 data): ' + value[0]);
        return desc;
    }
    desc.push('FC: ' + value[0]); offset += 1;
    var idx = value.indexOf('^');

    desc.push('PAN: ' + value.substring(offset, idx)); offset = idx;
    desc.push('FS : (Field Separator): ' + value[offset]); offset += 1;
    idx = value.indexOf('^', offset);
    desc.push('NM : (Name): ' + value.substring(offset, idx)); offset = idx;
    desc.push('FS : (Field Separator): ' + value[offset]); offset += 1;
    desc.push('ED : (Expiration data YY/MM): ' + value.substring(offset, offset+2) + '/' + value.substring(offset+2, offset+4)); offset += 4;
    desc.push('SC : (Service Code): ' + value.substring(offset, offset+3)); offset += 3;
    desc.push('DD : (Discretionary data) : ' + value.substring(offset));


    return desc;
}

/**
 * Track 2 Data
 * Track 2 Equivalent Data
 * Contains the data objects of track 2 of the magnetic stripe according to the ISO.IEC
 * 7813, excluding start sentinel, end sentinel, and longitudinal redundancy check (LRC)
 *
 * tag: '57'
 *
 * ISO/IEC 7813
 * https://en.wikipedia.org/wiki/ISO/IEC_7813#Track_2
 *
 * [Exclude] STX : Start sentinel ";"
 * PAN : Primary Account Number, up to 19 digits, as defined in ISO/IEC 7812-1
 * FS : Separator "="
 * ED : Expiration date, YYMM or "=" if not present
 * SC : Service code, 3 digits or "=" if not present
 * DD : Discretionary data, balance of available digits
 * [Exclude]ETX : End sentinel "?"
 * [Exclude]LRC : Longitudinal redundancy check, calculated according to ISO/IEC 7811-2
 *
 * @param tlv
 * @returns {Array}
 */
function Track2Data(tlv) {
    var desc = [];
    var value = tlv.getValue();
    var offset = 0;

    var idx = value.indexOf('D');
    if (idx === -1) {
        desc.push('invalid Track 2 equivalent data');
        return desc;
    }
    desc.push('PAN: ' + value.substring(offset, idx)); offset = idx;
    offset += 1; // for FS Separator 'D'
    desc.push('ED : (Expiration data YY/MM): ' + value.substring(offset, offset+2) + '/' + value.substring(offset+2, offset+4)); offset += 4;
    desc.push('SC : (Service Code): ' + value.substring(offset, offset+3)); offset += 3;
    idx = value.indexOf('F', offset);

    if (idx !== -1) {
        desc.push('DD : (Discretionary data) : ' + value.substring(offset, idx));
    }
    return desc;
}


/**
 * Track 1 Discretionary Data
 *
 * Discretionary part of track 1 according to ISO/IEC 7813
 * @param tlv
 */
function Track1DiscretionaryData(tlv) {
    var desc = [];
    desc.push(toAscii(tlv.getValue()));
    return desc;
}

/**
 * CDOL1 (Card Risk Management Data Object List 1)
 * tag: 8C
 *
 * @param tlv
 * @returns {Array}
 */
function CDOL1 (tlv) {
    var dol = tlv.parseDolValue();

    var desc = [];
    desc.push('CDOL1: 8C CDOL1 Related Data length: ' + toHexString(dol.getDolRelatedDataLength()) + ' (' + dol.getDolRelatedDataLength() + ')');
    var dolList = dol.getList();
    dolList.forEach(function (tl) {
        desc.push(tl.getTag() + ' ' + tl.getL() + ' (' + tl.getLength() + ') ' + tl.getName());
    });

    return desc;
}


/**
 * CDOL2 (Card Risk Management Data Object List 2)
 * tag: '8D'
 *
 * @param tlv
 * @returns {Array}
 */
function CDOL2 (tlv) {
    var dol = tlv.parseDolValue();
    var desc = [];
    desc.push('CDOL2: CDOL2 Related Data length: ' + toHexString(dol.getDolRelatedDataLength()) + ' (' + dol.getDolRelatedDataLength() + ')');
    var dolList = dol.getList();
    dolList.forEach(function (tl) {
        desc.push(tl.getTag() + ' ' + tl.getL() + ' (' + tl.getLength() + ') ' + tl.getName());
    });

    return desc;
}



function CVM(data) {
    var value = toBuffer(data);
    var desc = [];
    var code = value[0] & 0x3F;

    desc.push('CVM: ' + toHexString(value));
    //desc.push('CV Rule Byte 1 (Leftmost): Cardholder Verification Method (CVM) codes: ' + toHexString(this.value[0]));

    if ((value[0] & 0x40) === 0x40)  {
        desc.push('\tMove to next rule if verification is unsuccessful');
    } else {
        desc.push('\tFail cardholder verification if this CVM is unsuccessful');
    }

    if (code === 0x00) { // 0b0000 0000
        desc.push('\tFail CVM processing');
    } else if (code === 0x01) { // 0b0000 0001
        desc.push('\tPlaintext PIN verification performed by ICC');
    } else if (code === 0x02) { // 0b0000 0010
        desc.push('\tEnciphered PIN verified online')
    } else if (code === 0x03) { // 0b0000 0011
        desc.push('\tPlaintext PIN verification performed by ICC and signature(paper)');
    } else if (code === 0x04) { // 0b0000 0100
        desc.push('\tEnciphered PIN verification performed by ICC');
    } else if (code === 0x05) { // 0b0000 0101
        desc.push('\tEnciphered PIN verification performed by ICC and signature (paper)');
    } else if (code === 0x1E) { // 0b0001 1110
        desc.push('\tSignature (paper)');
    } else if (code === 0x1F) { // 0b0001 1111
        desc.push('\tNo CVM required');
    }

    code = value[1];

    //desc.push('CV Rule Byte 2  Cardholder Verification Method (CVM)  Condition codes: ' + toHexString(this.value[1]));
    if (code === 0x00) {
        desc.push('\tAlways');
    } else if (code === 0x01) {
        desc.push('\tIf unattended cash');
    } else if (code === 0x02) {
        desc.push('\tIf not unattended cash and not manual cash and not purchase with cashback');
    } else if (code === 0x03) {
        desc.push('\tIf terminal supports the CVM');
    } else if (code === 0x04) {
        desc.push('\tIf manual cash');
    } else if (code === 0x05) {
        desc.push('\tIf purchase with cashback');
    } else if (code === 0x06) {
        desc.push('\tIf transaction is in the application currency 21 and is under X value (see section 10.5 for a discussion of X)');
    } else if (code === 0x07) {
        desc.push('\tIf transaction is in the application currency and is over X value');
    } else if (code === 0x08) {
        desc.push('\tIf transaction is in the application currency and is under Y value (see section 10.5 for a discussion of Y)');
    } else if (code === 0x09) {
        desc.push('\tIf transaction is in the application currency and is over Y value');
    }

    return desc;
}


/**
 * CVM List (Cardholder Verification Method List)
 * tag: '8E'
 *
 * @pram tlv
 * @returns {Array}
 */

function CVMList(tlv) {

    value = toBuffer(tlv.getValue());
    this.cvm = [];
    var len = value.length;

    // x : 4 byte
    this.amountX = value.slice(0, 4);
    this.amountY = value.slice(4, 8);

    var value = value.slice(8, len);

    var cnt = value.length / 2;
    var offset = 0;
    for (var i=0; i<cnt; i++) {
        var item = value.slice(offset, offset+2);
        offset += 2;
        this.cvm.push(item);
    }

    var desc = [];
    desc.push('amount x: ' + toHexString(this.amountX));
    desc.push('amount y: ' + toHexString(this.amountY));

    this.cvm.forEach(function(item) {
        desc = desc.concat(CVM(item));
        //desc = desc.concat(toHexString(item));
        //desc.push('');
    });
    return desc;
}


/**
 * Issuer Country Code
 * tag: '5F28'
 *
 * @param tlv
 * @returns {Array}
 */
function IssuerCountryCode(tlv) {

    var value = tlv.getValue();
    var issuerCountryCode = require('./json/CountryCode.json');
    var obj = issuerCountryCode[value];

    var desc = [];
    if (obj !== undefined) {
        desc.push('country info: name : ' + obj['country'] + ' (' + obj['A3'] + ')');
    } else {
        desc.push('unknown country code. plz update ISO3166.');
    }
    return desc;
}


/**
 * Service Code
 * http://www.gae.ucm.es/~padilla/extrawork/tracks.html
 * tag: '5F30'
 *
 * @param tlv
 * @returns {Array}
 */
function ServiceCode(tlv) {
    var value = tlv.getValue();

    var desc = [];
    //Digit 1 (most significant): Interchange and technology:
    var digit = parseInt(value[1]);
    var digit1InterchangeAndTech = {
        0: '0: Reserved for future use by ISO.',
        1: '1: Available for international interchange.',
        2: '2: Available for international interchange and with integrated circuit, which should be used for the financial transaction when feasible.',
        3: '3: Reserved for future use by ISO.',
        4: '4: Reserved for future use by ISO.',
        5: '5: Available for national interchange only, except under bilateral agreement.',
        6: '6: Available for national interchange only, except under bilateral agreement, and with integrated circuit, which should be used for the financial transaction when feasible.',
        7: '7: Not available for general interchange, except under bilateral agreement.',
        8: '8: Reserved for future use by ISO.',
        9: '9: Test.'
    };

    desc.push(digit1InterchangeAndTech[digit]);


    digit = parseInt(value[2]);
    var digit2AuthorizingProcessing = {
        0: '0: Transactions are authorized following the normal rules.',
        1: '1: Reserved for future use by ISO.',
        2: '2: Transactions are authorized by issuer and should be online.',
        3: '3: Reserved for future use by ISO.',
        4: '4: Transactions are authorized by issuer and should be online, except under bilateral agreement.',
        5: '5: Reserved for future use by ISO.',
        6: '6: Reserved for future use by ISO.',
        7: '7: Reserved for future use by ISO.',
        8: '8: Reserved for future use by ISO.',
        9: '9: Reserved for future use by ISO.'
    };
    desc.push(digit2AuthorizingProcessing[digit]);


    digit = parseInt(value[3]);
    var digit3RangeOfServices = {
        0: '0: No restrictions and PIN required.',
        1: '1: No restrictions.',
        2: '2: Goods and services only (no cash).',
        3: '3: ATM only and PIN required.',
        4: '4: Cash only.',
        5: '5: Goods and services only (no cash) and PIN required.',
        6: '6: No restrictions and require PIN when feasible.',
        7: '7: Goods and services only (no cash) and require PIN when feasible.',
        8: '8: Reserved for future use by ISO.',
        9: '9: Reserved for future use by ISO.'
    };

    desc.push(digit3RangeOfServices[digit]);

    return desc;
}

/**
 * Application Usage Control
 *
 * Indicates issuer's specified restrictions on the geographic usage and services allowed for the application
 * tag: '9F07'
 *
 * @param tlv
 * @returns {Array}
 */
function ApplicationUsageControl(tlv) {
    var buff = toBuffer(tlv.getValue());
    var code = buff[0];
    var desc = [];

    desc.push('byte1: ' + toHexString(code));
    if ((code & 0x80) === 0x80) {
        desc.push('\tb8 Valid for domestic cash transactions');
    }
    if ((code & 0x40) === 0x40) {
        desc.push('\tb7 Valid for international cash transactions');
    }
    if ((code & 0x20) === 0x20) {
        desc.push('\tb6 Valid for domestic goods');
    }
    if ((code & 0x10) === 0x10) {
        desc.push('\tb5 Valid for international goods');
    }
    if ((code & 0x08) === 0x08) {
        desc.push('\tb4 Valid for domestic services');
    }
    if ((code & 0x04) === 0x04) {
        desc.push('\tb3 Valid for international services');
    }
    if ((code & 0x02) === 0x02) {
        desc.push('\tb2 Valid at ATMs');
    }
    if ((code & 0x01) === 0x01) {
        desc.push('\tb1 Valid at terminals other than ATMs');
    }

    code = buff[1];
    desc.push('byte2: ' + toHexString(code));
    if ((code & 0x80) === 0x80) {
        desc.push('\tb8 Domestic cash-back allowed');
    }
    if ((code & 0x40) === 0x40) {
        desc.push('\tb7 International cash-back allowed');
    }
    return desc;
}

/**
 * IAC (Issuer Action Code)
 * tag: '9F0D': 'Default', '9F0E': Denial , '9F0F': Online
 * length: 5
 *
 * @param tlv
 * @return {Array}
 */
function IssuerActionCode(tlv) {
    var desc = [];

    var buf = tlv.getValue('buffer');

    var oneByte = buf[0];
    desc.push('Byte 1: ' + toHexString(oneByte));

    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Offline Data authentication was not performed');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 SDA failed');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 ICC Data missing');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Card appears on terminal exception file');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 DDA failed');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 CDA failed');
    //if (bitOn(oneByte, 0x03))desc.push('\tb2-1 RFU');

    oneByte = buf[1];
    desc.push('Byte 2: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Chip card and terminal have different application versions');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Expired application');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Application not yet effective');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Requested service not allowed for card product');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 New card');
    //if (bitOn(oneByte, 0x07)) desc.push('\tb3-b1 RFU');

    oneByte = buf[2];
    desc.push('Byte 3: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Cardholder verification was not successful');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Unrecognized Cardholder Verification Method (CVM)');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 PIN Try Limit exceeded');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 PIN entry required but PIN pad not present/working');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 PIN entry required, PIN pad present but PIN not entered');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Online PIN entered');
    //if (bitOn(oneByte, 0x03)) desc.push('\tb2-1 RFU');

    oneByte = buf[3];
    desc.push('Byte 4: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Transaction exceeds floor limit');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Lower consecutive offline limit exceeded');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Upper consecutive offline limit exceeded');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Transaction selected randomly for online processing');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Merchant forced transaction online');
    //if (bitOn(oneByte, 0x04)) desc.push('\tb3-1 RFU');

    oneByte = buf[4];
    desc.push('Byte 5: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Default TDOL used');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Issuer Authentication was unsuccessful');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Script processing failed before final GENERATE AC');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Script processing failed after final GENERATE AC');
    //if (bitOn(oneByte, 0x0F)) desc.push('\tb4-1 RFU');

    return desc;
}



module.exports = {
    Track1Data: Track1Data,
    Track2Data: Track2Data,
    Track1DiscretionaryData: Track1DiscretionaryData,
    CDOL1 : CDOL1,
    CDOL2 : CDOL2,
    CVMList : CVMList,
    IssuerCountryCode : IssuerCountryCode,
    ServiceCode : ServiceCode,
    ApplicationUsageControl : ApplicationUsageControl,
    IssuerActionCode: IssuerActionCode
};
},{"../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/util.js","./json/CountryCode.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/json/CountryCode.json"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Select.js":[function(require,module,exports){
/**
 * Created by coolbong on 2017-02-24.
 */

var toHexString = require('../util').toHexString;

/**
 * Processing Options Data Object List (PDOL)
 * tag: 9F38
 * length: variable
 *
 * @param tlv
 * @returns {Array}
 */
function Pdol(tlv) {
    var dol = tlv.parseDolValue();

    var desc = [];
    desc.push('PDOL: ' + tlv.getTag() + ' PDOL Related Data length: ' + toHexString(dol.getDolRelatedDataLength()) + ' (' + dol.getDolRelatedDataLength() + ')');
    var dolList = dol.getList();
    dolList.forEach(function (tl) {
        desc.push(tl.getTag() + ' ' + tl.getL() + ' (' + tl.getLength() + ') ' + tl.getName());
    });

    return desc;
}

module.exports = {
    Pdol: Pdol
};
},{"../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Template.js":[function(require,module,exports){
var bitOn = require('../util').bitOn;
var u2 = require('../util').u2;
var toHexString = require('../util').toHexString;


function AccumulatorProfileControl(tlv) {
    var desc = [];
    var oneByte;
    var buf = tlv.getValue('buffer');

    oneByte = buf[0];
    desc.push('Byte 1: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80))  {
        desc.push('\tb8 Allow Accumulation');
    } else {
        desc.push('\tb8 Do Not Allow Accumulation');
    }
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Reset Accumulator with online response');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Send Accumulator in IAD');
    if (bitOn(oneByte, 0x10)) {
        desc.push('\tb5 Send Accumulator x Balance');
    } else {
        desc.push('\tb5 Send Accumulator x value');
    }

    if (bitOn(oneByte, 0x08)) desc.push('\tb4 RFU');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 RFU');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 RFU');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 RFU');

    oneByte = buf[1];
    desc.push('Byte 2: ' + toHexString(oneByte));
    // b876 RFU
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 RFU');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 RFU');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 RFU');

    if (bitOn(oneByte, 0x10)) {
        desc.push('\tb5 Use Limit Set 1');
    } else {
        desc.push('\tb5 Use Limit Set 0');
    }

    if ((oneByte & 0x0f) === 0x0f) {
        desc.push('\tb4321 Currency Conversion Not Allowed');
    } else {
        desc.push('\tb4321 Currency Conversion Table ID: ' + toHexString(oneByte & 0x0f));
    }
    

    return desc;
}

function AccumulatorControl(tlv) {
    var desc = [];

    var oneByte;
    var buf = tlv.getValue('buffer');

    //desc.push('Template: BF32');
    desc.push('byte 1-2: Accumulator Currency Code: ' + tlv.getValue().substring(0, 4));
    
    oneByte = buf[2];
    desc.push('byte 3: Accumulator Parameters: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Include ARQC Transaction in CRM Test');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Include Offline Approvals');

    return desc;
}

function CounterProfileControl(tlv) {
    var desc = [];
    var oneByte;
    var buf = tlv.getValue('buffer');

    oneByte = buf[0];
    desc.push('Template: BF36 byte1: ' + toHexString(oneByte));
    // b876 RFU
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 RFU');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 RFU');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 RFU');
    if (bitOn(oneByte, 0x10)) {
        desc.push('\tb5 Use Limit Set 1');
    } else {
        desc.push('\tb5 Use Limit Set 0');
    }

    if (bitOn(oneByte, 0x08))  {
        desc.push('\tb4 Allow Counting');
    } else {
        desc.push('\tb4 Do Not Allow Counting');
    }
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Reset Counter with online response');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Send Counter in IAD');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 RFU');

    return desc;
}

function CounterControl(tlv) {
    var desc = [];
    var oneByte;
    var buf = tlv.getValue('buffer');

    oneByte = buf[0];
    desc.push('byte1: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Include ARQC Transaction in CRM Test');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Include Offline Declines');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Include Offline Approval');
    if (bitOn(oneByte, 0x10)) {
        desc.push('\tb5 include always');
    } else {
        desc.push('\tb5 include only if Not Accumulated');
    }

    if (bitOn(oneByte, 0x08)) {
        desc.push('\tb4 include only if International');
    } else {
        desc.push('\tb4 include always');
    }
    if (bitOn(oneByte, 0x04)) desc.push('\tb1 RFU');
    if (bitOn(oneByte, 0x02)) desc.push('\tb1 RFU');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 RFU');

    return desc;
}

function IssuerOptionsProfileControl(tlv) {
    var desc = [];
    var oneByte;
    var buf = tlv.getValue('buffer');

    oneByte = buf[0];
    desc.push('byte1: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) {
        desc.push('\tb8 Log Transactions');
    } else {
        desc.push('\tb8 Do Not Log Transactions');
    }
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Activate Additional Check Table 1 Check');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Activate Additional Check Table 2 Check');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Activate Maximum Number of Days Offline Check');

    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Reset Maximum Number of Days offline with online response');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Allow Override of CIAC-Default for Transactions at Terminal Type 26');
    if (bitOn(oneByte, 0x02)) desc.push('\tb2 Encipher Counters portion of IAD');
    if (bitOn(oneByte, 0x01)) desc.push('\tb1 RFU');

    oneByte = buf[1];
    desc.push('byte2: 1st GAC Length: ' + toHexString(oneByte) + '(' + oneByte + ')');
    
    oneByte = buf[2];
    desc.push('byte3: 2nd GAC Length: ' + toHexString(oneByte) + '(' + oneByte + ')');
    
    oneByte = buf[3];
    desc.push('byte4: Profile CCI: ' + toHexString(oneByte));
    
    oneByte = buf[4];
    desc.push('byte5: Profile DKI: ' + toHexString(oneByte));
    
    oneByte = buf[5];
    desc.push('byte6: RFU: ' + toHexString(oneByte));
    
    oneByte = buf[6];
    desc.push('byte7: RFU for Issuer: ' + toHexString(oneByte));

    return desc;
}

function MtaProfileCotnrol(tlv) {
    var desc = [];
    var oneByte;
    var buf = tlv.getValue('buffer');

    desc.push('byte 1-2: Currency Code for Maximum Transaction Amount: ' + tlv.getValue().substring(0, 4));
    
    oneByte = buf[2];
    desc.push('byte 3: MTA parameters: ' + toHexString(oneByte));
    
    const limit_entry_id = (oneByte & 0xF0) >> 4;
    desc.push('\tb8765: Limits Entry ID: ' + limit_entry_id);

    const currency_conversion_table_id = (oneByte & 0x0F);
    if (currency_conversion_table_id === 0x0f) {
        desc.push('\tb4321: Currency Conversion Not Allowed');
    } else {
        desc.push('\tb4321: Currency Conversion Table ID: ' + currency_conversion_table_id);
    }

    oneByte = buf[3];
    desc.push('byte 4: RFU: ' + toHexString(oneByte));
    
    return desc;
}


module.exports = {
    AccumulatorProfileControl: AccumulatorProfileControl,
    AccumulatorControl: AccumulatorControl,
    CounterProfileControl: CounterProfileControl,
    CounterControl: CounterControl,
    IssuerOptionsProfileControl: IssuerOptionsProfileControl,
    MtaProfileCotnrol: MtaProfileCotnrol,
};
},{"../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/Terminal.js":[function(require,module,exports){
/**
 * Created by coolbong on 2017-03-09.
 */
var bitOn = require('../util').bitOn;
var toHexString = require('../util').toHexString;

function TerminalVerificationResult(tlv) {
    var desc = [];
    var oneByte;
    var buf = tlv.getValue('buffer');

    oneByte = buf[0];
    desc.push('byte1: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Offline Data Authentication Was Not Performed');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 SDA Failed');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 ICC Data Missing');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Card Appears On Terminal Exception File');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 DDA Failed');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 CDA Failed');

    oneByte = buf[1];
    desc.push('byte2: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 ICC And Terminal Have Different Application Versions');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Expired Application');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Application Not Yet Effective');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Requested Service Not Allowed For Card Product');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 New Card');

    oneByte = buf[2];
    desc.push('byte3: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Cardholder Verification Was Not Successful');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Unrecognised CVM');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 PIN Try Limit Exceeded');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 PIN Entry Required And PIN Pad Not Present Or Not Working');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 PIN Entry Required, PIN Pad Present, But PIN Was Not Entered');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Online PIN Entered');

    oneByte = buf[3];
    desc.push('byte4: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Transaction Exceeded Floor Limit');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Lower Consecutive Offline Limit Exceeded');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Upper Consecutive Offline Limit Exceeded');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Transaction Selected Randomly For Online Processing');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Merchant Forced Transaction Online');

    oneByte = buf[4];
    desc.push('byte5: ' + toHexString(oneByte));
    if (bitOn(oneByte, 0x80)) desc.push('\tb8 Default TDOL Used');
    if (bitOn(oneByte, 0x40)) desc.push('\tb7 Issuer Authentication Failed');
    if (bitOn(oneByte, 0x20)) desc.push('\tb6 Script Processing Failed Before Final Generate AC');
    if (bitOn(oneByte, 0x10)) desc.push('\tb5 Script Processing Failed After Final Generate AC');
    if (bitOn(oneByte, 0x08)) desc.push('\tb4 Relay Resistance Threshold Exceeded');
    if (bitOn(oneByte, 0x04)) desc.push('\tb3 Relay Resistance Time Limits Exceeded');

    if ((oneByte & 0x03) === 0x00) {
        //desc.push('b2-1 00: Relay resistance protocol not supported');
    } else if ((oneByte & 0x03) === 0x01) {
        desc.push('b2-1 01: RRP Not Performed');
    } else if ((oneByte & 0x03) === 0x02) {
        desc.push('b2-1 10: RRP Performed');
    }

    return desc;
}


module.exports = {
    TerminalVerificationResult:TerminalVerificationResult
};
},{"../util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/json/CountryCode.json":[function(require,module,exports){
module.exports={
  "0004": {
    "country": "AFGHANISTAN",
    "A2": "AF",
    "A3": "AFG",
    "number": "0004"
  },
  "0008": {
    "country": "ALBANIA",
    "A2": "AL",
    "A3": "ALB",
    "number": "0008"
  },
  "0012": {
    "country": "ALGERIA",
    "A2": "DZ",
    "A3": "DZA",
    "number": "0012"
  },
  "0016": {
    "country": "AMERICAN SAMOA",
    "A2": "AS",
    "A3": "ASM",
    "number": "0016"
  },
  "0020": {
    "country": "ANDORRA",
    "A2": "AD",
    "A3": "AND",
    "number": "0020"
  },
  "0024": {
    "country": "ANGOLA",
    "A2": "AO",
    "A3": "AGO",
    "number": "0024"
  },
  "0660": {
    "country": "ANGUILLA",
    "A2": "AI",
    "A3": "AIA",
    "number": "0660"
  },
  "0010": {
    "country": "ANTARCTICA",
    "A2": "AQ",
    "A3": "ATA",
    "number": "0010"
  },
  "0028": {
    "country": "ANTIGUA AND BARBUDA",
    "A2": "AG",
    "A3": "ATG",
    "number": "0028"
  },
  "0032": {
    "country": "ARGENTINA",
    "A2": "AR",
    "A3": "ARG",
    "number": "0032"
  },
  "0051": {
    "country": "ARMENIA",
    "A2": "AM",
    "A3": "ARM",
    "number": "0051"
  },
  "0533": {
    "country": "ARUBA",
    "A2": "AW",
    "A3": "ABW",
    "number": "0533"
  },
  "0036": {
    "country": "AUSTRALIA",
    "A2": "AU",
    "A3": "AUS",
    "number": "0036"
  },
  "0040": {
    "country": "AUSTRIA",
    "A2": "AT",
    "A3": "AUT",
    "number": "0040"
  },
  "0031": {
    "country": "AZERBAIJAN",
    "A2": "AZ",
    "A3": "AZE",
    "number": "0031"
  },
  "0044": {
    "country": "BAHAMAS",
    "A2": "BS",
    "A3": "BHS",
    "number": "0044"
  },
  "0048": {
    "country": "BAHRAIN",
    "A2": "BH",
    "A3": "BHR",
    "number": "0048"
  },
  "0050": {
    "country": "BANGLADESH",
    "A2": "BD",
    "A3": "BGD",
    "number": "0050"
  },
  "0052": {
    "country": "BARBADOS",
    "A2": "BB",
    "A3": "BRB",
    "number": "0052"
  },
  "0112": {
    "country": "BELARUS",
    "A2": "BY",
    "A3": "BLR",
    "number": "0112"
  },
  "0056": {
    "country": "BELGIUM",
    "A2": "BE",
    "A3": "BEL",
    "number": "0056"
  },
  "0084": {
    "country": "BELIZE",
    "A2": "BZ",
    "A3": "BLZ",
    "number": "0084"
  },
  "0204": {
    "country": "BENIN",
    "A2": "BJ",
    "A3": "BEN",
    "number": "0204"
  },
  "0060": {
    "country": "BERMUDA",
    "A2": "BM",
    "A3": "BMU",
    "number": "0060"
  },
  "0064": {
    "country": "BHUTAN",
    "A2": "BT",
    "A3": "BTN",
    "number": "0064"
  },
  "0068": {
    "country": "BOLIVIA",
    "A2": "BO",
    "A3": "BOL",
    "number": "0068"
  },
  "0070": {
    "country": "BOSNIA AND HERZEGOWINA",
    "A2": "BA",
    "A3": "BIH",
    "number": "0070"
  },
  "0072": {
    "country": "BOTSWANA",
    "A2": "BW",
    "A3": "BWA",
    "number": "0072"
  },
  "0074": {
    "country": "BOUVET ISLAND",
    "A2": "BV",
    "A3": "BVT",
    "number": "0074"
  },
  "0076": {
    "country": "BRAZIL",
    "A2": "BR",
    "A3": "BRA",
    "number": "0076"
  },
  "0086": {
    "country": "BRITISH INDIAN OCEAN TERRITORY",
    "A2": "IO",
    "A3": "IOT",
    "number": "0086"
  },
  "0096": {
    "country": "BRUNEI DARUSSALAM",
    "A2": "BN",
    "A3": "BRN",
    "number": "0096"
  },
  "0100": {
    "country": "BULGARIA",
    "A2": "BG",
    "A3": "BGR",
    "number": "0100"
  },
  "0854": {
    "country": "BURKINA FASO",
    "A2": "BF",
    "A3": "BFA",
    "number": "0854"
  },
  "0108": {
    "country": "BURUNDI",
    "A2": "BI",
    "A3": "BDI",
    "number": "0108"
  },
  "0116": {
    "country": "CAMBODIA",
    "A2": "KH",
    "A3": "KHM",
    "number": "0116"
  },
  "0120": {
    "country": "CAMEROON",
    "A2": "CM",
    "A3": "CMR",
    "number": "0120"
  },
  "0124": {
    "country": "CANADA",
    "A2": "CA",
    "A3": "CAN",
    "number": "0124"
  },
  "0132": {
    "country": "CAPE VERDE",
    "A2": "CV",
    "A3": "CPV",
    "number": "0132"
  },
  "0136": {
    "country": "CAYMAN ISLANDS",
    "A2": "KY",
    "A3": "CYM",
    "number": "0136"
  },
  "0140": {
    "country": "CENTRAL AFRICAN REPUBLIC",
    "A2": "CF",
    "A3": "CAF",
    "number": "0140"
  },
  "0148": {
    "country": "CHAD",
    "A2": "TD",
    "A3": "TCD",
    "number": "0148"
  },
  "0152": {
    "country": "CHILE",
    "A2": "CL",
    "A3": "CHL",
    "number": "0152"
  },
  "0156": {
    "country": "CHINA",
    "A2": "CN",
    "A3": "CHN",
    "number": "0156"
  },
  "0162": {
    "country": "CHRISTMAS ISLAND",
    "A2": "CX",
    "A3": "CXR",
    "number": "0162"
  },
  "0166": {
    "country": "COCOS (KEELING) ISLANDS",
    "A2": "CC",
    "A3": "CCK",
    "number": "0166"
  },
  "0170": {
    "country": "COLOMBIA",
    "A2": "CO",
    "A3": "COL",
    "number": "0170"
  },
  "0174": {
    "country": "COMOROS",
    "A2": "KM",
    "A3": "COM",
    "number": "0174"
  },
  "0178": {
    "country": "CONGO",
    "A2": "CG",
    "A3": "COG",
    "number": "0178"
  },
  "0180": {
    "country": "CONGO, THE DEMOCRATIC REPUBLIC OF THE",
    "A2": "CD",
    "A3": "COD",
    "number": "0180"
  },
  "0184": {
    "country": "COOK ISLANDS",
    "A2": "CK",
    "A3": "COK",
    "number": "0184"
  },
  "0188": {
    "country": "COSTA RICA",
    "A2": "CR",
    "A3": "CRI",
    "number": "0188"
  },
  "0384": {
    "country": "COTE D'IVOIRE",
    "A2": "CI",
    "A3": "CIV",
    "number": "0384"
  },
  "0191": {
    "country": "CROATIA (local name: Hrvatska)",
    "A2": "HR",
    "A3": "HRV",
    "number": "0191"
  },
  "0192": {
    "country": "CUBA",
    "A2": "CU",
    "A3": "CUB",
    "number": "0192"
  },
  "0196": {
    "country": "CYPRUS",
    "A2": "CY",
    "A3": "CYP",
    "number": "0196"
  },
  "0203": {
    "country": "CZECH REPUBLIC",
    "A2": "CZ",
    "A3": "CZE",
    "number": "0203"
  },
  "0208": {
    "country": "DENMARK",
    "A2": "DK",
    "A3": "DNK",
    "number": "0208"
  },
  "0262": {
    "country": "DJIBOUTI",
    "A2": "DJ",
    "A3": "DJI",
    "number": "0262"
  },
  "0212": {
    "country": "DOMINICA",
    "A2": "DM",
    "A3": "DMA",
    "number": "0212"
  },
  "0214": {
    "country": "DOMINICAN REPUBLIC",
    "A2": "DO",
    "A3": "DOM",
    "number": "0214"
  },
  "0626": {
    "country": "EAST TIMOR",
    "A2": "TP",
    "A3": "TMP",
    "number": "0626"
  },
  "0218": {
    "country": "ECUADOR",
    "A2": "EC",
    "A3": "ECU",
    "number": "0218"
  },
  "0818": {
    "country": "EGYPT",
    "A2": "EG",
    "A3": "EGY",
    "number": "0818"
  },
  "0222": {
    "country": "EL SALVADOR",
    "A2": "SV",
    "A3": "SLV",
    "number": "0222"
  },
  "0226": {
    "country": "EQUATORIAL GUINEA",
    "A2": "GQ",
    "A3": "GNQ",
    "number": "0226"
  },
  "0232": {
    "country": "ERITREA",
    "A2": "ER",
    "A3": "ERI",
    "number": "0232"
  },
  "0233": {
    "country": "ESTONIA",
    "A2": "EE",
    "A3": "EST",
    "number": "0233"
  },
  "0231": {
    "country": "ETHIOPIA",
    "A2": "ET",
    "A3": "ETH",
    "number": "0231"
  },
  "0238": {
    "country": "FALKLAND ISLANDS (MALVINAS)",
    "A2": "FK",
    "A3": "FLK",
    "number": "0238"
  },
  "0234": {
    "country": "FAROE ISLANDS",
    "A2": "FO",
    "A3": "FRO",
    "number": "0234"
  },
  "0242": {
    "country": "FIJI",
    "A2": "FJ",
    "A3": "FJI",
    "number": "0242"
  },
  "0246": {
    "country": "FINLAND",
    "A2": "FI",
    "A3": "FIN",
    "number": "0246"
  },
  "0250": {
    "country": "FRANCE",
    "A2": "FR",
    "A3": "FRA",
    "number": "0250"
  },
  "0249": {
    "country": "FRANCE, METROPOLITAN",
    "A2": "FX",
    "A3": "FXX",
    "number": "0249"
  },
  "0254": {
    "country": "FRENCH GUIANA",
    "A2": "GF",
    "A3": "GUF",
    "number": "0254"
  },
  "0258": {
    "country": "FRENCH POLYNESIA",
    "A2": "PF",
    "A3": "PYF",
    "number": "0258"
  },
  "0260": {
    "country": "FRENCH SOUTHERN TERRITORIES",
    "A2": "TF",
    "A3": "ATF",
    "number": "0260"
  },
  "0266": {
    "country": "GABON",
    "A2": "GA",
    "A3": "GAB",
    "number": "0266"
  },
  "0270": {
    "country": "GAMBIA",
    "A2": "GM",
    "A3": "GMB",
    "number": "0270"
  },
  "0268": {
    "country": "GEORGIA",
    "A2": "GE",
    "A3": "GEO",
    "number": "0268"
  },
  "0276": {
    "country": "GERMANY",
    "A2": "DE",
    "A3": "DEU",
    "number": "0276"
  },
  "0288": {
    "country": "GHANA",
    "A2": "GH",
    "A3": "GHA",
    "number": "0288"
  },
  "0292": {
    "country": "GIBRALTAR",
    "A2": "GI",
    "A3": "GIB",
    "number": "0292"
  },
  "0300": {
    "country": "GREECE",
    "A2": "GR",
    "A3": "GRC",
    "number": "0300"
  },
  "0304": {
    "country": "GREENLAND",
    "A2": "GL",
    "A3": "GRL",
    "number": "0304"
  },
  "0308": {
    "country": "GRENADA",
    "A2": "GD",
    "A3": "GRD",
    "number": "0308"
  },
  "0312": {
    "country": "GUADELOUPE",
    "A2": "GP",
    "A3": "GLP",
    "number": "0312"
  },
  "0316": {
    "country": "GUAM",
    "A2": "GU",
    "A3": "GUM",
    "number": "0316"
  },
  "0320": {
    "country": "GUATEMALA",
    "A2": "GT",
    "A3": "GTM",
    "number": "0320"
  },
  "0324": {
    "country": "GUINEA",
    "A2": "GN",
    "A3": "GIN",
    "number": "0324"
  },
  "0624": {
    "country": "GUINEA-BISSAU",
    "A2": "GW",
    "A3": "GNB",
    "number": "0624"
  },
  "0328": {
    "country": "GUYANA",
    "A2": "GY",
    "A3": "GUY",
    "number": "0328"
  },
  "0332": {
    "country": "HAITI",
    "A2": "HT",
    "A3": "HTI",
    "number": "0332"
  },
  "0334": {
    "country": "HEARD AND MC DONALD ISLANDS",
    "A2": "HM",
    "A3": "HMD",
    "number": "0334"
  },
  "0336": {
    "country": "HOLY SEE (VATICAN CITY STATE)",
    "A2": "VA",
    "A3": "VAT",
    "number": "0336"
  },
  "0340": {
    "country": "HONDURAS",
    "A2": "HN",
    "A3": "HND",
    "number": "0340"
  },
  "0344": {
    "country": "HONG KONG",
    "A2": "HK",
    "A3": "HKG",
    "number": "0344"
  },
  "0348": {
    "country": "HUNGARY",
    "A2": "HU",
    "A3": "HUN",
    "number": "0348"
  },
  "0352": {
    "country": "ICELAND",
    "A2": "IS",
    "A3": "ISL",
    "number": "0352"
  },
  "0356": {
    "country": "INDIA",
    "A2": "IN",
    "A3": "IND",
    "number": "0356"
  },
  "0360": {
    "country": "INDONESIA",
    "A2": "ID",
    "A3": "IDN",
    "number": "0360"
  },
  "0364": {
    "country": "IRAN (ISLAMIC REPUBLIC OF)",
    "A2": "IR",
    "A3": "IRN",
    "number": "0364"
  },
  "0368": {
    "country": "IRAQ",
    "A2": "IQ",
    "A3": "IRQ",
    "number": "0368"
  },
  "0372": {
    "country": "IRELAND",
    "A2": "IE",
    "A3": "IRL",
    "number": "0372"
  },
  "0376": {
    "country": "ISRAEL",
    "A2": "IL",
    "A3": "ISR",
    "number": "0376"
  },
  "0380": {
    "country": "ITALY",
    "A2": "IT",
    "A3": "ITA",
    "number": "0380"
  },
  "0388": {
    "country": "JAMAICA",
    "A2": "JM",
    "A3": "JAM",
    "number": "0388"
  },
  "0392": {
    "country": "JAPAN",
    "A2": "JP",
    "A3": "JPN",
    "number": "0392"
  },
  "0400": {
    "country": "JORDAN",
    "A2": "JO",
    "A3": "JOR",
    "number": "0400"
  },
  "0398": {
    "country": "KAZAKHSTAN",
    "A2": "KZ",
    "A3": "KAZ",
    "number": "0398"
  },
  "0404": {
    "country": "KENYA",
    "A2": "KE",
    "A3": "KEN",
    "number": "0404"
  },
  "0296": {
    "country": "KIRIBATI",
    "A2": "KI",
    "A3": "KIR",
    "number": "0296"
  },
  "0408": {
    "country": "KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF",
    "A2": "KP",
    "A3": "PRK",
    "number": "0408"
  },
  "0410": {
    "country": "KOREA, REPUBLIC OF",
    "A2": "KR",
    "A3": "KOR",
    "number": "0410"
  },
  "0414": {
    "country": "KUWAIT",
    "A2": "KW",
    "A3": "KWT",
    "number": "0414"
  },
  "0417": {
    "country": "KYRGYZSTAN",
    "A2": "KG",
    "A3": "KGZ",
    "number": "0417"
  },
  "0418": {
    "country": "LAO PEOPLE'S DEMOCRATIC REPUBLIC",
    "A2": "LA",
    "A3": "LAO",
    "number": "0418"
  },
  "0428": {
    "country": "LATVIA",
    "A2": "LV",
    "A3": "LVA",
    "number": "0428"
  },
  "0422": {
    "country": "LEBANON",
    "A2": "LB",
    "A3": "LBN",
    "number": "0422"
  },
  "0426": {
    "country": "LESOTHO",
    "A2": "LS",
    "A3": "LSO",
    "number": "0426"
  },
  "0430": {
    "country": "LIBERIA",
    "A2": "LR",
    "A3": "LBR",
    "number": "0430"
  },
  "0434": {
    "country": "LIBYAN ARAB JAMAHIRIYA",
    "A2": "LY",
    "A3": "LBY",
    "number": "0434"
  },
  "0438": {
    "country": "LIECHTENSTEIN",
    "A2": "LI",
    "A3": "LIE",
    "number": "0438"
  },
  "0440": {
    "country": "LITHUANIA",
    "A2": "LT",
    "A3": "LTU",
    "number": "0440"
  },
  "0442": {
    "country": "LUXEMBOURG",
    "A2": "LU",
    "A3": "LUX",
    "number": "0442"
  },
  "0446": {
    "country": "MACAU",
    "A2": "MO",
    "A3": "MAC",
    "number": "0446"
  },
  "0807": {
    "country": "MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF",
    "A2": "MK",
    "A3": "MKD",
    "number": "0807"
  },
  "0450": {
    "country": "MADAGASCAR",
    "A2": "MG",
    "A3": "MDG",
    "number": "0450"
  },
  "0454": {
    "country": "MALAWI",
    "A2": "MW",
    "A3": "MWI",
    "number": "0454"
  },
  "0458": {
    "country": "MALAYSIA",
    "A2": "MY",
    "A3": "MYS",
    "number": "0458"
  },
  "0462": {
    "country": "MALDIVES",
    "A2": "MV",
    "A3": "MDV",
    "number": "0462"
  },
  "0466": {
    "country": "MALI",
    "A2": "ML",
    "A3": "MLI",
    "number": "0466"
  },
  "0470": {
    "country": "MALTA",
    "A2": "MT",
    "A3": "MLT",
    "number": "0470"
  },
  "0584": {
    "country": "MARSHALL ISLANDS",
    "A2": "MH",
    "A3": "MHL",
    "number": "0584"
  },
  "0474": {
    "country": "MARTINIQUE",
    "A2": "MQ",
    "A3": "MTQ",
    "number": "0474"
  },
  "0478": {
    "country": "MAURITANIA",
    "A2": "MR",
    "A3": "MRT",
    "number": "0478"
  },
  "0480": {
    "country": "MAURITIUS",
    "A2": "MU",
    "A3": "MUS",
    "number": "0480"
  },
  "0175": {
    "country": "MAYOTTE",
    "A2": "YT",
    "A3": "MYT",
    "number": "0175"
  },
  "0484": {
    "country": "MEXICO",
    "A2": "MX",
    "A3": "MEX",
    "number": "0484"
  },
  "0583": {
    "country": "MICRONESIA, FEDERATED STATES OF",
    "A2": "FM",
    "A3": "FSM",
    "number": "0583"
  },
  "0498": {
    "country": "MOLDOVA, REPUBLIC OF",
    "A2": "MD",
    "A3": "MDA",
    "number": "0498"
  },
  "0492": {
    "country": "MONACO",
    "A2": "MC",
    "A3": "MCO",
    "number": "0492"
  },
  "0496": {
    "country": "MONGOLIA",
    "A2": "MN",
    "A3": "MNG",
    "number": "0496"
  },
  "0500": {
    "country": "MONTSERRAT",
    "A2": "MS",
    "A3": "MSR",
    "number": "0500"
  },
  "0504": {
    "country": "MOROCCO",
    "A2": "MA",
    "A3": "MAR",
    "number": "0504"
  },
  "0508": {
    "country": "MOZAMBIQUE",
    "A2": "MZ",
    "A3": "MOZ",
    "number": "0508"
  },
  "0104": {
    "country": "MYANMAR",
    "A2": "MM",
    "A3": "MMR",
    "number": "0104"
  },
  "0516": {
    "country": "NAMIBIA",
    "A2": "NA",
    "A3": "NAM",
    "number": "0516"
  },
  "0520": {
    "country": "NAURU",
    "A2": "NR",
    "A3": "NRU",
    "number": "0520"
  },
  "0524": {
    "country": "NEPAL",
    "A2": "NP",
    "A3": "NPL",
    "number": "0524"
  },
  "0528": {
    "country": "NETHERLANDS",
    "A2": "NL",
    "A3": "NLD",
    "number": "0528"
  },
  "0530": {
    "country": "NETHERLANDS ANTILLES",
    "A2": "AN",
    "A3": "ANT",
    "number": "0530"
  },
  "0540": {
    "country": "NEW CALEDONIA",
    "A2": "NC",
    "A3": "NCL",
    "number": "0540"
  },
  "0554": {
    "country": "NEW ZEALAND",
    "A2": "NZ",
    "A3": "NZL",
    "number": "0554"
  },
  "0558": {
    "country": "NICARAGUA",
    "A2": "NI",
    "A3": "NIC",
    "number": "0558"
  },
  "0562": {
    "country": "NIGER",
    "A2": "NE",
    "A3": "NER",
    "number": "0562"
  },
  "0566": {
    "country": "NIGERIA",
    "A2": "NG",
    "A3": "NGA",
    "number": "0566"
  },
  "0570": {
    "country": "NIUE",
    "A2": "NU",
    "A3": "NIU",
    "number": "0570"
  },
  "0574": {
    "country": "NORFOLK ISLAND",
    "A2": "NF",
    "A3": "NFK",
    "number": "0574"
  },
  "0580": {
    "country": "NORTHERN MARIANA ISLANDS",
    "A2": "MP",
    "A3": "MNP",
    "number": "0580"
  },
  "0578": {
    "country": "NORWAY",
    "A2": "NO",
    "A3": "NOR",
    "number": "0578"
  },
  "0512": {
    "country": "OMAN",
    "A2": "OM",
    "A3": "OMN",
    "number": "0512"
  },
  "0586": {
    "country": "PAKISTAN",
    "A2": "PK",
    "A3": "PAK",
    "number": "0586"
  },
  "0585": {
    "country": "PALAU",
    "A2": "PW",
    "A3": "PLW",
    "number": "0585"
  },
  "0591": {
    "country": "PANAMA",
    "A2": "PA",
    "A3": "PAN",
    "number": "0591"
  },
  "0598": {
    "country": "PAPUA NEW GUINEA",
    "A2": "PG",
    "A3": "PNG",
    "number": "0598"
  },
  "0600": {
    "country": "PARAGUAY",
    "A2": "PY",
    "A3": "PRY",
    "number": "0600"
  },
  "0604": {
    "country": "PERU",
    "A2": "PE",
    "A3": "PER",
    "number": "0604"
  },
  "0608": {
    "country": "PHILIPPINES",
    "A2": "PH",
    "A3": "PHL",
    "number": "0608"
  },
  "0612": {
    "country": "PITCAIRN",
    "A2": "PN",
    "A3": "PCN",
    "number": "0612"
  },
  "0616": {
    "country": "POLAND",
    "A2": "PL",
    "A3": "POL",
    "number": "0616"
  },
  "0620": {
    "country": "PORTUGAL",
    "A2": "PT",
    "A3": "PRT",
    "number": "0620"
  },
  "0630": {
    "country": "PUERTO RICO",
    "A2": "PR",
    "A3": "PRI",
    "number": "0630"
  },
  "0634": {
    "country": "QATAR",
    "A2": "QA",
    "A3": "QAT",
    "number": "0634"
  },
  "0638": {
    "country": "REUNION",
    "A2": "RE",
    "A3": "REU",
    "number": "0638"
  },
  "0642": {
    "country": "ROMANIA",
    "A2": "RO",
    "A3": "ROM",
    "number": "0642"
  },
  "0643": {
    "country": "RUSSIAN FEDERATION",
    "A2": "RU",
    "A3": "RUS",
    "number": "0643"
  },
  "0646": {
    "country": "RWANDA",
    "A2": "RW",
    "A3": "RWA",
    "number": "0646"
  },
  "0659": {
    "country": "SAINT KITTS AND NEVIS",
    "A2": "KN",
    "A3": "KNA",
    "number": "0659"
  },
  "0662": {
    "country": "SAINT LUCIA",
    "A2": "LC",
    "A3": "LCA",
    "number": "0662"
  },
  "0670": {
    "country": "SAINT VINCENT AND THE GRENADINES",
    "A2": "VC",
    "A3": "VCT",
    "number": "0670"
  },
  "0882": {
    "country": "SAMOA",
    "A2": "WS",
    "A3": "WSM",
    "number": "0882"
  },
  "0674": {
    "country": "SAN MARINO",
    "A2": "SM",
    "A3": "SMR",
    "number": "0674"
  },
  "0678": {
    "country": "SAO TOME AND PRINCIPE",
    "A2": "ST",
    "A3": "STP",
    "number": "0678"
  },
  "0682": {
    "country": "SAUDI ARABIA",
    "A2": "SA",
    "A3": "SAU",
    "number": "0682"
  },
  "0686": {
    "country": "SENEGAL",
    "A2": "SN",
    "A3": "SEN",
    "number": "0686"
  },
  "0690": {
    "country": "SEYCHELLES",
    "A2": "SC",
    "A3": "SYC",
    "number": "0690"
  },
  "0694": {
    "country": "SIERRA LEONE",
    "A2": "SL",
    "A3": "SLE",
    "number": "0694"
  },
  "0702": {
    "country": "SINGAPORE",
    "A2": "SG",
    "A3": "SGP",
    "number": "0702"
  },
  "0703": {
    "country": "SLOVAKIA (Slovak Republic)",
    "A2": "SK",
    "A3": "SVK",
    "number": "0703"
  },
  "0705": {
    "country": "SLOVENIA",
    "A2": "SI",
    "A3": "SVN",
    "number": "0705"
  },
  "0090": {
    "country": "SOLOMON ISLANDS",
    "A2": "SB",
    "A3": "SLB",
    "number": "0090"
  },
  "0706": {
    "country": "SOMALIA",
    "A2": "SO",
    "A3": "SOM",
    "number": "0706"
  },
  "0710": {
    "country": "SOUTH AFRICA",
    "A2": "ZA",
    "A3": "ZAF",
    "number": "0710"
  },
  "0239": {
    "country": "SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS",
    "A2": "GS",
    "A3": "SGS",
    "number": "0239"
  },
  "0724": {
    "country": "SPAIN",
    "A2": "ES",
    "A3": "ESP",
    "number": "0724"
  },
  "0144": {
    "country": "SRI LANKA",
    "A2": "LK",
    "A3": "LKA",
    "number": "0144"
  },
  "0654": {
    "country": "ST. HELENA",
    "A2": "SH",
    "A3": "SHN",
    "number": "0654"
  },
  "0666": {
    "country": "ST. PIERRE AND MIQUELON",
    "A2": "PM",
    "A3": "SPM",
    "number": "0666"
  },
  "0736": {
    "country": "SUDAN",
    "A2": "SD",
    "A3": "SDN",
    "number": "0736"
  },
  "0740": {
    "country": "SURINAME",
    "A2": "SR",
    "A3": "SUR",
    "number": "0740"
  },
  "0744": {
    "country": "SVALBARD AND JAN MAYEN ISLANDS",
    "A2": "SJ",
    "A3": "SJM",
    "number": "0744"
  },
  "0748": {
    "country": "SWAZILAND",
    "A2": "SZ",
    "A3": "SWZ",
    "number": "0748"
  },
  "0752": {
    "country": "SWEDEN",
    "A2": "SE",
    "A3": "SWE",
    "number": "0752"
  },
  "0756": {
    "country": "SWITZERLAND",
    "A2": "CH",
    "A3": "CHE",
    "number": "0756"
  },
  "0760": {
    "country": "SYRIAN ARAB REPUBLIC",
    "A2": "SY",
    "A3": "SYR",
    "number": "0760"
  },
  "0158": {
    "country": "TAIWAN, PROVINCE OF CHINA",
    "A2": "TW",
    "A3": "TWN",
    "number": "0158"
  },
  "0762": {
    "country": "TAJIKISTAN",
    "A2": "TJ",
    "A3": "TJK",
    "number": "0762"
  },
  "0834": {
    "country": "TANZANIA, UNITED REPUBLIC OF",
    "A2": "TZ",
    "A3": "TZA",
    "number": "0834"
  },
  "0764": {
    "country": "THAILAND",
    "A2": "TH",
    "A3": "THA",
    "number": "0764"
  },
  "0768": {
    "country": "TOGO",
    "A2": "TG",
    "A3": "TGO",
    "number": "0768"
  },
  "0772": {
    "country": "TOKELAU",
    "A2": "TK",
    "A3": "TKL",
    "number": "0772"
  },
  "0776": {
    "country": "TONGA",
    "A2": "TO",
    "A3": "TON",
    "number": "0776"
  },
  "0780": {
    "country": "TRINIDAD AND TOBAGO",
    "A2": "TT",
    "A3": "TTO",
    "number": "0780"
  },
  "0788": {
    "country": "TUNISIA",
    "A2": "TN",
    "A3": "TUN",
    "number": "0788"
  },
  "0792": {
    "country": "TURKEY",
    "A2": "TR",
    "A3": "TUR",
    "number": "0792"
  },
  "0795": {
    "country": "TURKMENISTAN",
    "A2": "TM",
    "A3": "TKM",
    "number": "0795"
  },
  "0796": {
    "country": "TURKS AND CAICOS ISLANDS",
    "A2": "TC",
    "A3": "TCA",
    "number": "0796"
  },
  "0798": {
    "country": "TUVALU",
    "A2": "TV",
    "A3": "TUV",
    "number": "0798"
  },
  "0800": {
    "country": "UGANDA",
    "A2": "UG",
    "A3": "UGA",
    "number": "0800"
  },
  "0804": {
    "country": "UKRAINE",
    "A2": "UA",
    "A3": "UKR",
    "number": "0804"
  },
  "0784": {
    "country": "UNITED ARAB EMIRATES",
    "A2": "AE",
    "A3": "ARE",
    "number": "0784"
  },
  "0826": {
    "country": "UNITED KINGDOM",
    "A2": "GB",
    "A3": "GBR",
    "number": "0826"
  },
  "0840": {
    "country": "UNITED STATES",
    "A2": "US",
    "A3": "USA",
    "number": "0840"
  },
  "0581": {
    "country": "UNITED STATES MINOR OUTLYING ISLANDS",
    "A2": "UM",
    "A3": "UMI",
    "number": "0581"
  },
  "0858": {
    "country": "URUGUAY",
    "A2": "UY",
    "A3": "URY",
    "number": "0858"
  },
  "0860": {
    "country": "UZBEKISTAN",
    "A2": "UZ",
    "A3": "UZB",
    "number": "0860"
  },
  "0548": {
    "country": "VANUATU",
    "A2": "VU",
    "A3": "VUT",
    "number": "0548"
  },
  "0862": {
    "country": "VENEZUELA",
    "A2": "VE",
    "A3": "VEN",
    "number": "0862"
  },
  "0704": {
    "country": "VIET NAM",
    "A2": "VN",
    "A3": "VNM",
    "number": "0704"
  },
  "0092": {
    "country": "VIRGIN ISLANDS (BRITISH)",
    "A2": "VG",
    "A3": "VGB",
    "number": "0092"
  },
  "0850": {
    "country": "VIRGIN ISLANDS (U.S.)",
    "A2": "VI",
    "A3": "VIR",
    "number": "0850"
  },
  "0876": {
    "country": "WALLIS AND FUTUNA ISLANDS",
    "A2": "WF",
    "A3": "WLF",
    "number": "0876"
  },
  "0732": {
    "country": "WESTERN SAHARA",
    "A2": "EH",
    "A3": "ESH",
    "number": "0732"
  },
  "0887": {
    "country": "YEMEN",
    "A2": "YE",
    "A3": "YEM",
    "number": "0887"
  },
  "0891": {
    "country": "YUGOSLAVIA",
    "A2": "YU",
    "A3": "YUG",
    "number": "0891"
  },
  "0894": {
    "country": "ZAMBIA",
    "A2": "ZM",
    "A3": "ZMB",
    "number": "0894"
  },
  "0716": {
    "country": "ZIMBABWE",
    "A2": "ZW",
    "A3": "ZWE",
    "number": "0716"
  }
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/json/CurrencyCode.json":[function(require,module,exports){
module.exports={
  "list": [
    {
      "code": "AFN", 
      "country": "AFGHANISTAN", 
      "currency": "Afghani", 
      "number": "0971"
    }, 
    {
      "code": "EUR", 
      "country": "ÅLAND ISLANDS", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "ALL", 
      "country": "ALBANIA", 
      "currency": "Lek", 
      "number": "0008"
    }, 
    {
      "code": "DZD", 
      "country": "ALGERIA", 
      "currency": "Algerian Dinar", 
      "number": "0012"
    }, 
    {
      "code": "USD", 
      "country": "AMERICAN SAMOA", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "EUR", 
      "country": "ANDORRA", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "AOA", 
      "country": "ANGOLA", 
      "currency": "Kwanza", 
      "number": "0973"
    }, 
    {
      "code": "XCD", 
      "country": "ANGUILLA", 
      "currency": "East Caribbean Dollar", 
      "number": "0951"
    }, 
    {
      "code": "XCD", 
      "country": "ANTIGUA AND BARBUDA", 
      "currency": "East Caribbean Dollar", 
      "number": "0951"
    }, 
    {
      "code": "ARS", 
      "country": "ARGENTINA", 
      "currency": "Argentine Peso", 
      "number": "0032"
    }, 
    {
      "code": "AMD", 
      "country": "ARMENIA", 
      "currency": "Armenian Dram", 
      "number": "0051"
    }, 
    {
      "code": "AWG", 
      "country": "ARUBA", 
      "currency": "Aruban Florin", 
      "number": "0533"
    }, 
    {
      "code": "AUD", 
      "country": "AUSTRALIA", 
      "currency": "Australian Dollar", 
      "number": "0036"
    }, 
    {
      "code": "EUR", 
      "country": "AUSTRIA", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "AZN", 
      "country": "AZERBAIJAN", 
      "currency": "Azerbaijanian Manat", 
      "number": "0944"
    }, 
    {
      "code": "BSD", 
      "country": "BAHAMAS (THE)", 
      "currency": "Bahamian Dollar", 
      "number": "0044"
    }, 
    {
      "code": "BHD", 
      "country": "BAHRAIN", 
      "currency": "Bahraini Dinar", 
      "number": "0048"
    }, 
    {
      "code": "BDT", 
      "country": "BANGLADESH", 
      "currency": "Taka", 
      "number": "0050"
    }, 
    {
      "code": "BBD", 
      "country": "BARBADOS", 
      "currency": "Barbados Dollar", 
      "number": "0052"
    }, 
    {
      "code": "BYN", 
      "country": "BELARUS", 
      "currency": "Belarusian Ruble", 
      "number": "0933"
    }, 
    {
      "code": "EUR", 
      "country": "BELGIUM", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "BZD", 
      "country": "BELIZE", 
      "currency": "Belize Dollar", 
      "number": "0084"
    }, 
    {
      "code": "XOF", 
      "country": "BENIN", 
      "currency": "CFA Franc BCEAO", 
      "number": "0952"
    }, 
    {
      "code": "BMD", 
      "country": "BERMUDA", 
      "currency": "Bermudian Dollar", 
      "number": "0060"
    }, 
    {
      "code": "INR", 
      "country": "BHUTAN", 
      "currency": "Indian Rupee", 
      "number": "0356"
    }, 
    {
      "code": "BTN", 
      "country": "BHUTAN", 
      "currency": "Ngultrum", 
      "number": "0064"
    }, 
    {
      "code": "BOB", 
      "country": "BOLIVIA (PLURINATIONAL STATE OF)", 
      "currency": "Boliviano", 
      "number": "0068"
    }, 
    {
      "code": "BOV", 
      "country": "BOLIVIA (PLURINATIONAL STATE OF)", 
      "currency": "Mvdol", 
      "number": "0984"
    }, 
    {
      "code": "USD", 
      "country": "BONAIRE, SINT EUSTATIUS AND SABA", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "BAM", 
      "country": "BOSNIA AND HERZEGOVINA", 
      "currency": "Convertible Mark", 
      "number": "0977"
    }, 
    {
      "code": "BWP", 
      "country": "BOTSWANA", 
      "currency": "Pula", 
      "number": "0072"
    }, 
    {
      "code": "NOK", 
      "country": "BOUVET ISLAND", 
      "currency": "Norwegian Krone", 
      "number": "0578"
    }, 
    {
      "code": "BRL", 
      "country": "BRAZIL", 
      "currency": "Brazilian Real", 
      "number": "0986"
    }, 
    {
      "code": "USD", 
      "country": "BRITISH INDIAN OCEAN TERRITORY (THE)", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "BND", 
      "country": "BRUNEI DARUSSALAM", 
      "currency": "Brunei Dollar", 
      "number": "0096"
    }, 
    {
      "code": "BGN", 
      "country": "BULGARIA", 
      "currency": "Bulgarian Lev", 
      "number": "0975"
    }, 
    {
      "code": "XOF", 
      "country": "BURKINA FASO", 
      "currency": "CFA Franc BCEAO", 
      "number": "0952"
    }, 
    {
      "code": "BIF", 
      "country": "BURUNDI", 
      "currency": "Burundi Franc", 
      "number": "0108"
    }, 
    {
      "code": "CVE", 
      "country": "CABO VERDE", 
      "currency": "Cabo Verde Escudo", 
      "number": "0132"
    }, 
    {
      "code": "KHR", 
      "country": "CAMBODIA", 
      "currency": "Riel", 
      "number": "0116"
    }, 
    {
      "code": "XAF", 
      "country": "CAMEROON", 
      "currency": "CFA Franc BEAC", 
      "number": "0950"
    }, 
    {
      "code": "CAD", 
      "country": "CANADA", 
      "currency": "Canadian Dollar", 
      "number": "0124"
    }, 
    {
      "code": "KYD", 
      "country": "CAYMAN ISLANDS (THE)", 
      "currency": "Cayman Islands Dollar", 
      "number": "0136"
    }, 
    {
      "code": "XAF", 
      "country": "CENTRAL AFRICAN REPUBLIC (THE)", 
      "currency": "CFA Franc BEAC", 
      "number": "0950"
    }, 
    {
      "code": "XAF", 
      "country": "CHAD", 
      "currency": "CFA Franc BEAC", 
      "number": "0950"
    }, 
    {
      "code": "CLP", 
      "country": "CHILE", 
      "currency": "Chilean Peso", 
      "number": "0152"
    }, 
    {
      "code": "CLF", 
      "country": "CHILE", 
      "currency": "Unidad de Fomento", 
      "number": "0990"
    }, 
    {
      "code": "CNY", 
      "country": "CHINA", 
      "currency": "Yuan Renminbi", 
      "number": "0156"
    }, 
    {
      "code": "AUD", 
      "country": "CHRISTMAS ISLAND", 
      "currency": "Australian Dollar", 
      "number": "0036"
    }, 
    {
      "code": "AUD", 
      "country": "COCOS (KEELING) ISLANDS (THE)", 
      "currency": "Australian Dollar", 
      "number": "0036"
    }, 
    {
      "code": "COP", 
      "country": "COLOMBIA", 
      "currency": "Colombian Peso", 
      "number": "0170"
    }, 
    {
      "code": "COU", 
      "country": "COLOMBIA", 
      "currency": "Unidad de Valor Real", 
      "number": "0970"
    }, 
    {
      "code": "KMF", 
      "country": "COMOROS (THE)", 
      "currency": "Comoro Franc", 
      "number": "0174"
    }, 
    {
      "code": "CDF", 
      "country": "CONGO (THE DEMOCRATIC REPUBLIC OF THE)", 
      "currency": "Congolese Franc", 
      "number": "0976"
    }, 
    {
      "code": "XAF", 
      "country": "CONGO (THE)", 
      "currency": "CFA Franc BEAC", 
      "number": "0950"
    }, 
    {
      "code": "NZD", 
      "country": "COOK ISLANDS (THE)", 
      "currency": "New Zealand Dollar", 
      "number": "0554"
    }, 
    {
      "code": "CRC", 
      "country": "COSTA RICA", 
      "currency": "Costa Rican Colon", 
      "number": "0188"
    }, 
    {
      "code": "XOF", 
      "country": "CÔTE D'IVOIRE", 
      "currency": "CFA Franc BCEAO", 
      "number": "0952"
    }, 
    {
      "code": "HRK", 
      "country": "CROATIA", 
      "currency": "Kuna", 
      "number": "0191"
    }, 
    {
      "code": "CUP", 
      "country": "CUBA", 
      "currency": "Cuban Peso", 
      "number": "0192"
    }, 
    {
      "code": "CUC", 
      "country": "CUBA", 
      "currency": "Peso Convertible", 
      "number": "0931"
    }, 
    {
      "code": "ANG", 
      "country": "CURAÇAO", 
      "currency": "Netherlands Antillean Guilder", 
      "number": "0532"
    }, 
    {
      "code": "EUR", 
      "country": "CYPRUS", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "CZK", 
      "country": "CZECH REPUBLIC (THE)", 
      "currency": "Czech Koruna", 
      "number": "0203"
    }, 
    {
      "code": "DKK", 
      "country": "DENMARK", 
      "currency": "Danish Krone", 
      "number": "0208"
    }, 
    {
      "code": "DJF", 
      "country": "DJIBOUTI", 
      "currency": "Djibouti Franc", 
      "number": "0262"
    }, 
    {
      "code": "XCD", 
      "country": "DOMINICA", 
      "currency": "East Caribbean Dollar", 
      "number": "0951"
    }, 
    {
      "code": "DOP", 
      "country": "DOMINICAN REPUBLIC (THE)", 
      "currency": "Dominican Peso", 
      "number": "0214"
    }, 
    {
      "code": "USD", 
      "country": "ECUADOR", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "EGP", 
      "country": "EGYPT", 
      "currency": "Egyptian Pound", 
      "number": "0818"
    }, 
    {
      "code": "SVC", 
      "country": "EL SALVADOR", 
      "currency": "El Salvador Colon", 
      "number": "0222"
    }, 
    {
      "code": "USD", 
      "country": "EL SALVADOR", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "XAF", 
      "country": "EQUATORIAL GUINEA", 
      "currency": "CFA Franc BEAC", 
      "number": "0950"
    }, 
    {
      "code": "ERN", 
      "country": "ERITREA", 
      "currency": "Nakfa", 
      "number": "0232"
    }, 
    {
      "code": "EUR", 
      "country": "ESTONIA", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "ETB", 
      "country": "ETHIOPIA", 
      "currency": "Ethiopian Birr", 
      "number": "0230"
    }, 
    {
      "code": "EUR", 
      "country": "EUROPEAN UNION", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "FKP", 
      "country": "FALKLAND ISLANDS (THE) [MALVINAS]", 
      "currency": "Falkland Islands Pound", 
      "number": "0238"
    }, 
    {
      "code": "DKK", 
      "country": "FAROE ISLANDS (THE)", 
      "currency": "Danish Krone", 
      "number": "0208"
    }, 
    {
      "code": "FJD", 
      "country": "FIJI", 
      "currency": "Fiji Dollar", 
      "number": "0242"
    }, 
    {
      "code": "EUR", 
      "country": "FINLAND", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "EUR", 
      "country": "FRANCE", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "EUR", 
      "country": "FRENCH GUIANA", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "XPF", 
      "country": "FRENCH POLYNESIA", 
      "currency": "CFP Franc", 
      "number": "0953"
    }, 
    {
      "code": "EUR", 
      "country": "FRENCH SOUTHERN TERRITORIES (THE)", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "XAF", 
      "country": "GABON", 
      "currency": "CFA Franc BEAC", 
      "number": "0950"
    }, 
    {
      "code": "GMD", 
      "country": "GAMBIA (THE)", 
      "currency": "Dalasi", 
      "number": "0270"
    }, 
    {
      "code": "GEL", 
      "country": "GEORGIA", 
      "currency": "Lari", 
      "number": "0981"
    }, 
    {
      "code": "EUR", 
      "country": "GERMANY", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "GHS", 
      "country": "GHANA", 
      "currency": "Ghana Cedi", 
      "number": "0936"
    }, 
    {
      "code": "GIP", 
      "country": "GIBRALTAR", 
      "currency": "Gibraltar Pound", 
      "number": "0292"
    }, 
    {
      "code": "EUR", 
      "country": "GREECE", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "DKK", 
      "country": "GREENLAND", 
      "currency": "Danish Krone", 
      "number": "0208"
    }, 
    {
      "code": "XCD", 
      "country": "GRENADA", 
      "currency": "East Caribbean Dollar", 
      "number": "0951"
    }, 
    {
      "code": "EUR", 
      "country": "GUADELOUPE", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "USD", 
      "country": "GUAM", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "GTQ", 
      "country": "GUATEMALA", 
      "currency": "Quetzal", 
      "number": "0320"
    }, 
    {
      "code": "GBP", 
      "country": "GUERNSEY", 
      "currency": "Pound Sterling", 
      "number": "0826"
    }, 
    {
      "code": "GNF", 
      "country": "GUINEA", 
      "currency": "Guinea Franc", 
      "number": "0324"
    }, 
    {
      "code": "XOF", 
      "country": "GUINEA-BISSAU", 
      "currency": "CFA Franc BCEAO", 
      "number": "0952"
    }, 
    {
      "code": "GYD", 
      "country": "GUYANA", 
      "currency": "Guyana Dollar", 
      "number": "0328"
    }, 
    {
      "code": "HTG", 
      "country": "HAITI", 
      "currency": "Gourde", 
      "number": "0332"
    }, 
    {
      "code": "USD", 
      "country": "HAITI", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "AUD", 
      "country": "HEARD ISLAND AND McDONALD ISLANDS", 
      "currency": "Australian Dollar", 
      "number": "0036"
    }, 
    {
      "code": "EUR", 
      "country": "HOLY SEE (THE)", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "HNL", 
      "country": "HONDURAS", 
      "currency": "Lempira", 
      "number": "0340"
    }, 
    {
      "code": "HKD", 
      "country": "HONG KONG", 
      "currency": "Hong Kong Dollar", 
      "number": "0344"
    }, 
    {
      "code": "HUF", 
      "country": "HUNGARY", 
      "currency": "Forint", 
      "number": "0348"
    }, 
    {
      "code": "ISK", 
      "country": "ICELAND", 
      "currency": "Iceland Krona", 
      "number": "0352"
    }, 
    {
      "code": "INR", 
      "country": "INDIA", 
      "currency": "Indian Rupee", 
      "number": "0356"
    }, 
    {
      "code": "IDR", 
      "country": "INDONESIA", 
      "currency": "Rupiah", 
      "number": "0360"
    }, 
    {
      "code": "XDR", 
      "country": "INTERNATIONAL MONETARY FUND (IMF) ", 
      "currency": "SDR (Special Drawing Right)", 
      "number": "0960"
    }, 
    {
      "code": "IRR", 
      "country": "IRAN (ISLAMIC REPUBLIC OF)", 
      "currency": "Iranian Rial", 
      "number": "0364"
    }, 
    {
      "code": "IQD", 
      "country": "IRAQ", 
      "currency": "Iraqi Dinar", 
      "number": "0368"
    }, 
    {
      "code": "EUR", 
      "country": "IRELAND", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "GBP", 
      "country": "ISLE OF MAN", 
      "currency": "Pound Sterling", 
      "number": "0826"
    }, 
    {
      "code": "ILS", 
      "country": "ISRAEL", 
      "currency": "New Israeli Sheqel", 
      "number": "0376"
    }, 
    {
      "code": "EUR", 
      "country": "ITALY", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "JMD", 
      "country": "JAMAICA", 
      "currency": "Jamaican Dollar", 
      "number": "0388"
    }, 
    {
      "code": "JPY", 
      "country": "JAPAN", 
      "currency": "Yen", 
      "number": "0392"
    }, 
    {
      "code": "GBP", 
      "country": "JERSEY", 
      "currency": "Pound Sterling", 
      "number": "0826"
    }, 
    {
      "code": "JOD", 
      "country": "JORDAN", 
      "currency": "Jordanian Dinar", 
      "number": "0400"
    }, 
    {
      "code": "KZT", 
      "country": "KAZAKHSTAN", 
      "currency": "Tenge", 
      "number": "0398"
    }, 
    {
      "code": "KES", 
      "country": "KENYA", 
      "currency": "Kenyan Shilling", 
      "number": "0404"
    }, 
    {
      "code": "AUD", 
      "country": "KIRIBATI", 
      "currency": "Australian Dollar", 
      "number": "0036"
    }, 
    {
      "code": "KPW", 
      "country": "KOREA (THE DEMOCRATIC PEOPLE’S REPUBLIC OF)", 
      "currency": "North Korean Won", 
      "number": "0408"
    }, 
    {
      "code": "KRW", 
      "country": "KOREA (THE REPUBLIC OF)", 
      "currency": "Won", 
      "number": "0410"
    }, 
    {
      "code": "KWD", 
      "country": "KUWAIT", 
      "currency": "Kuwaiti Dinar", 
      "number": "0414"
    }, 
    {
      "code": "KGS", 
      "country": "KYRGYZSTAN", 
      "currency": "Som", 
      "number": "0417"
    }, 
    {
      "code": "LAK", 
      "country": "LAO PEOPLE’S DEMOCRATIC REPUBLIC (THE)", 
      "currency": "Kip", 
      "number": "0418"
    }, 
    {
      "code": "EUR", 
      "country": "LATVIA", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "LBP", 
      "country": "LEBANON", 
      "currency": "Lebanese Pound", 
      "number": "0422"
    }, 
    {
      "code": "LSL", 
      "country": "LESOTHO", 
      "currency": "Loti", 
      "number": "0426"
    }, 
    {
      "code": "ZAR", 
      "country": "LESOTHO", 
      "currency": "Rand", 
      "number": "0710"
    }, 
    {
      "code": "LRD", 
      "country": "LIBERIA", 
      "currency": "Liberian Dollar", 
      "number": "0430"
    }, 
    {
      "code": "LYD", 
      "country": "LIBYA", 
      "currency": "Libyan Dinar", 
      "number": "0434"
    }, 
    {
      "code": "CHF", 
      "country": "LIECHTENSTEIN", 
      "currency": "Swiss Franc", 
      "number": "0756"
    }, 
    {
      "code": "EUR", 
      "country": "LITHUANIA", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "EUR", 
      "country": "LUXEMBOURG", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "MOP", 
      "country": "MACAO", 
      "currency": "Pataca", 
      "number": "0446"
    }, 
    {
      "code": "MKD", 
      "country": "MACEDONIA (THE FORMER YUGOSLAV REPUBLIC OF)", 
      "currency": "Denar", 
      "number": "0807"
    }, 
    {
      "code": "MGA", 
      "country": "MADAGASCAR", 
      "currency": "Malagasy Ariary", 
      "number": "0969"
    }, 
    {
      "code": "MWK", 
      "country": "MALAWI", 
      "currency": "Malawi Kwacha", 
      "number": "0454"
    }, 
    {
      "code": "MYR", 
      "country": "MALAYSIA", 
      "currency": "Malaysian Ringgit", 
      "number": "0458"
    }, 
    {
      "code": "MVR", 
      "country": "MALDIVES", 
      "currency": "Rufiyaa", 
      "number": "0462"
    }, 
    {
      "code": "XOF", 
      "country": "MALI", 
      "currency": "CFA Franc BCEAO", 
      "number": "0952"
    }, 
    {
      "code": "EUR", 
      "country": "MALTA", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "USD", 
      "country": "MARSHALL ISLANDS (THE)", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "EUR", 
      "country": "MARTINIQUE", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "MRO", 
      "country": "MAURITANIA", 
      "currency": "Ouguiya", 
      "number": "0478"
    }, 
    {
      "code": "MUR", 
      "country": "MAURITIUS", 
      "currency": "Mauritius Rupee", 
      "number": "0480"
    }, 
    {
      "code": "EUR", 
      "country": "MAYOTTE", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "XUA", 
      "country": "MEMBER COUNTRIES OF THE AFRICAN DEVELOPMENT BANK GROUP", 
      "currency": "ADB Unit of Account", 
      "number": "0965"
    }, 
    {
      "code": "MXN", 
      "country": "MEXICO", 
      "currency": "Mexican Peso", 
      "number": "0484"
    }, 
    {
      "code": "MXV", 
      "country": "MEXICO", 
      "currency": "Mexican Unidad de Inversion (UDI)", 
      "number": "0979"
    }, 
    {
      "code": "USD", 
      "country": "MICRONESIA (FEDERATED STATES OF)", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "MDL", 
      "country": "MOLDOVA (THE REPUBLIC OF)", 
      "currency": "Moldovan Leu", 
      "number": "0498"
    }, 
    {
      "code": "EUR", 
      "country": "MONACO", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "MNT", 
      "country": "MONGOLIA", 
      "currency": "Tugrik", 
      "number": "0496"
    }, 
    {
      "code": "EUR", 
      "country": "MONTENEGRO", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "XCD", 
      "country": "MONTSERRAT", 
      "currency": "East Caribbean Dollar", 
      "number": "0951"
    }, 
    {
      "code": "MAD", 
      "country": "MOROCCO", 
      "currency": "Moroccan Dirham", 
      "number": "0504"
    }, 
    {
      "code": "MZN", 
      "country": "MOZAMBIQUE", 
      "currency": "Mozambique Metical", 
      "number": "0943"
    }, 
    {
      "code": "MMK", 
      "country": "MYANMAR", 
      "currency": "Kyat", 
      "number": "0104"
    }, 
    {
      "code": "NAD", 
      "country": "NAMIBIA", 
      "currency": "Namibia Dollar", 
      "number": "0516"
    }, 
    {
      "code": "ZAR", 
      "country": "NAMIBIA", 
      "currency": "Rand", 
      "number": "0710"
    }, 
    {
      "code": "AUD", 
      "country": "NAURU", 
      "currency": "Australian Dollar", 
      "number": "0036"
    }, 
    {
      "code": "NPR", 
      "country": "NEPAL", 
      "currency": "Nepalese Rupee", 
      "number": "0524"
    }, 
    {
      "code": "EUR", 
      "country": "NETHERLANDS (THE)", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "XPF", 
      "country": "NEW CALEDONIA", 
      "currency": "CFP Franc", 
      "number": "0953"
    }, 
    {
      "code": "NZD", 
      "country": "NEW ZEALAND", 
      "currency": "New Zealand Dollar", 
      "number": "0554"
    }, 
    {
      "code": "NIO", 
      "country": "NICARAGUA", 
      "currency": "Cordoba Oro", 
      "number": "0558"
    }, 
    {
      "code": "XOF", 
      "country": "NIGER (THE)", 
      "currency": "CFA Franc BCEAO", 
      "number": "0952"
    }, 
    {
      "code": "NGN", 
      "country": "NIGERIA", 
      "currency": "Naira", 
      "number": "0566"
    }, 
    {
      "code": "NZD", 
      "country": "NIUE", 
      "currency": "New Zealand Dollar", 
      "number": "0554"
    }, 
    {
      "code": "AUD", 
      "country": "NORFOLK ISLAND", 
      "currency": "Australian Dollar", 
      "number": "0036"
    }, 
    {
      "code": "USD", 
      "country": "NORTHERN MARIANA ISLANDS (THE)", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "NOK", 
      "country": "NORWAY", 
      "currency": "Norwegian Krone", 
      "number": "0578"
    }, 
    {
      "code": "OMR", 
      "country": "OMAN", 
      "currency": "Rial Omani", 
      "number": "0512"
    }, 
    {
      "code": "PKR", 
      "country": "PAKISTAN", 
      "currency": "Pakistan Rupee", 
      "number": "0586"
    }, 
    {
      "code": "USD", 
      "country": "PALAU", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "PAB", 
      "country": "PANAMA", 
      "currency": "Balboa", 
      "number": "0590"
    }, 
    {
      "code": "USD", 
      "country": "PANAMA", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "PGK", 
      "country": "PAPUA NEW GUINEA", 
      "currency": "Kina", 
      "number": "0598"
    }, 
    {
      "code": "PYG", 
      "country": "PARAGUAY", 
      "currency": "Guarani", 
      "number": "0600"
    }, 
    {
      "code": "PEN", 
      "country": "PERU", 
      "currency": "Sol", 
      "number": "0604"
    }, 
    {
      "code": "PHP", 
      "country": "PHILIPPINES (THE)", 
      "currency": "Philippine Peso", 
      "number": "0608"
    }, 
    {
      "code": "NZD", 
      "country": "PITCAIRN", 
      "currency": "New Zealand Dollar", 
      "number": "0554"
    }, 
    {
      "code": "PLN", 
      "country": "POLAND", 
      "currency": "Zloty", 
      "number": "0985"
    }, 
    {
      "code": "EUR", 
      "country": "PORTUGAL", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "USD", 
      "country": "PUERTO RICO", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "QAR", 
      "country": "QATAR", 
      "currency": "Qatari Rial", 
      "number": "0634"
    }, 
    {
      "code": "EUR", 
      "country": "RÉUNION", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "RON", 
      "country": "ROMANIA", 
      "currency": "Romanian Leu", 
      "number": "0946"
    }, 
    {
      "code": "RUB", 
      "country": "RUSSIAN FEDERATION (THE)", 
      "currency": "Russian Ruble", 
      "number": "0643"
    }, 
    {
      "code": "RWF", 
      "country": "RWANDA", 
      "currency": "Rwanda Franc", 
      "number": "0646"
    }, 
    {
      "code": "EUR", 
      "country": "SAINT BARTHÉLEMY", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "SHP", 
      "country": "SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA", 
      "currency": "Saint Helena Pound", 
      "number": "0654"
    }, 
    {
      "code": "XCD", 
      "country": "SAINT KITTS AND NEVIS", 
      "currency": "East Caribbean Dollar", 
      "number": "0951"
    }, 
    {
      "code": "XCD", 
      "country": "SAINT LUCIA", 
      "currency": "East Caribbean Dollar", 
      "number": "0951"
    }, 
    {
      "code": "EUR", 
      "country": "SAINT MARTIN (FRENCH PART)", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "EUR", 
      "country": "SAINT PIERRE AND MIQUELON", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "XCD", 
      "country": "SAINT VINCENT AND THE GRENADINES", 
      "currency": "East Caribbean Dollar", 
      "number": "0951"
    }, 
    {
      "code": "WST", 
      "country": "SAMOA", 
      "currency": "Tala", 
      "number": "0882"
    }, 
    {
      "code": "EUR", 
      "country": "SAN MARINO", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "STD", 
      "country": "SAO TOME AND PRINCIPE", 
      "currency": "Dobra", 
      "number": "0678"
    }, 
    {
      "code": "SAR", 
      "country": "SAUDI ARABIA", 
      "currency": "Saudi Riyal", 
      "number": "0682"
    }, 
    {
      "code": "XOF", 
      "country": "SENEGAL", 
      "currency": "CFA Franc BCEAO", 
      "number": "0952"
    }, 
    {
      "code": "RSD", 
      "country": "SERBIA", 
      "currency": "Serbian Dinar", 
      "number": "0941"
    }, 
    {
      "code": "SCR", 
      "country": "SEYCHELLES", 
      "currency": "Seychelles Rupee", 
      "number": "0690"
    }, 
    {
      "code": "SLL", 
      "country": "SIERRA LEONE", 
      "currency": "Leone", 
      "number": "0694"
    }, 
    {
      "code": "SGD", 
      "country": "SINGAPORE", 
      "currency": "Singapore Dollar", 
      "number": "0702"
    }, 
    {
      "code": "ANG", 
      "country": "SINT MAARTEN (DUTCH PART)", 
      "currency": "Netherlands Antillean Guilder", 
      "number": "0532"
    }, 
    {
      "code": "XSU", 
      "country": "SISTEMA UNITARIO DE COMPENSACION REGIONAL DE PAGOS \"SUCRE\"", 
      "currency": "Sucre", 
      "number": "0994"
    }, 
    {
      "code": "EUR", 
      "country": "SLOVAKIA", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "EUR", 
      "country": "SLOVENIA", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "SBD", 
      "country": "SOLOMON ISLANDS", 
      "currency": "Solomon Islands Dollar", 
      "number": "0090"
    }, 
    {
      "code": "SOS", 
      "country": "SOMALIA", 
      "currency": "Somali Shilling", 
      "number": "0706"
    }, 
    {
      "code": "ZAR", 
      "country": "SOUTH AFRICA", 
      "currency": "Rand", 
      "number": "0710"
    }, 
    {
      "code": "SSP", 
      "country": "SOUTH SUDAN", 
      "currency": "South Sudanese Pound", 
      "number": "0728"
    }, 
    {
      "code": "EUR", 
      "country": "SPAIN", 
      "currency": "Euro", 
      "number": "0978"
    }, 
    {
      "code": "LKR", 
      "country": "SRI LANKA", 
      "currency": "Sri Lanka Rupee", 
      "number": "0144"
    }, 
    {
      "code": "SDG", 
      "country": "SUDAN (THE)", 
      "currency": "Sudanese Pound", 
      "number": "0938"
    }, 
    {
      "code": "SRD", 
      "country": "SURINAME", 
      "currency": "Surinam Dollar", 
      "number": "0968"
    }, 
    {
      "code": "NOK", 
      "country": "SVALBARD AND JAN MAYEN", 
      "currency": "Norwegian Krone", 
      "number": "0578"
    }, 
    {
      "code": "SZL", 
      "country": "SWAZILAND", 
      "currency": "Lilangeni", 
      "number": "0748"
    }, 
    {
      "code": "SEK", 
      "country": "SWEDEN", 
      "currency": "Swedish Krona", 
      "number": "0752"
    }, 
    {
      "code": "CHF", 
      "country": "SWITZERLAND", 
      "currency": "Swiss Franc", 
      "number": "0756"
    }, 
    {
      "code": "CHE", 
      "country": "SWITZERLAND", 
      "currency": "WIR Euro", 
      "number": "0947"
    }, 
    {
      "code": "CHW", 
      "country": "SWITZERLAND", 
      "currency": "WIR Franc", 
      "number": "0948"
    }, 
    {
      "code": "SYP", 
      "country": "SYRIAN ARAB REPUBLIC", 
      "currency": "Syrian Pound", 
      "number": "0760"
    }, 
    {
      "code": "TWD", 
      "country": "TAIWAN (PROVINCE OF CHINA)", 
      "currency": "New Taiwan Dollar", 
      "number": "0901"
    }, 
    {
      "code": "TJS", 
      "country": "TAJIKISTAN", 
      "currency": "Somoni", 
      "number": "0972"
    }, 
    {
      "code": "TZS", 
      "country": "TANZANIA, UNITED REPUBLIC OF", 
      "currency": "Tanzanian Shilling", 
      "number": "0834"
    }, 
    {
      "code": "THB", 
      "country": "THAILAND", 
      "currency": "Baht", 
      "number": "0764"
    }, 
    {
      "code": "USD", 
      "country": "TIMOR-LESTE", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "XOF", 
      "country": "TOGO", 
      "currency": "CFA Franc BCEAO", 
      "number": "0952"
    }, 
    {
      "code": "NZD", 
      "country": "TOKELAU", 
      "currency": "New Zealand Dollar", 
      "number": "0554"
    }, 
    {
      "code": "TOP", 
      "country": "TONGA", 
      "currency": "Pa’anga", 
      "number": "0776"
    }, 
    {
      "code": "TTD", 
      "country": "TRINIDAD AND TOBAGO", 
      "currency": "Trinidad and Tobago Dollar", 
      "number": "0780"
    }, 
    {
      "code": "TND", 
      "country": "TUNISIA", 
      "currency": "Tunisian Dinar", 
      "number": "0788"
    }, 
    {
      "code": "TRY", 
      "country": "TURKEY", 
      "currency": "Turkish Lira", 
      "number": "0949"
    }, 
    {
      "code": "TMT", 
      "country": "TURKMENISTAN", 
      "currency": "Turkmenistan New Manat", 
      "number": "0934"
    }, 
    {
      "code": "USD", 
      "country": "TURKS AND CAICOS ISLANDS (THE)", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "AUD", 
      "country": "TUVALU", 
      "currency": "Australian Dollar", 
      "number": "0036"
    }, 
    {
      "code": "UGX", 
      "country": "UGANDA", 
      "currency": "Uganda Shilling", 
      "number": "0800"
    }, 
    {
      "code": "UAH", 
      "country": "UKRAINE", 
      "currency": "Hryvnia", 
      "number": "0980"
    }, 
    {
      "code": "AED", 
      "country": "UNITED ARAB EMIRATES (THE)", 
      "currency": "UAE Dirham", 
      "number": "0784"
    }, 
    {
      "code": "GBP", 
      "country": "UNITED KINGDOM OF GREAT BRITAIN AND NORTHERN IRELAND (THE)", 
      "currency": "Pound Sterling", 
      "number": "0826"
    }, 
    {
      "code": "USD", 
      "country": "UNITED STATES MINOR OUTLYING ISLANDS (THE)", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "USD", 
      "country": "UNITED STATES OF AMERICA (THE)", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "USN", 
      "country": "UNITED STATES OF AMERICA (THE)", 
      "currency": "US Dollar (Next day)", 
      "number": "0997"
    }, 
    {
      "code": "UYU", 
      "country": "URUGUAY", 
      "currency": "Peso Uruguayo", 
      "number": "0858"
    }, 
    {
      "code": "UYI", 
      "country": "URUGUAY", 
      "currency": "Uruguay Peso en Unidades Indexadas (URUIURUI)", 
      "number": "0940"
    }, 
    {
      "code": "UZS", 
      "country": "UZBEKISTAN", 
      "currency": "Uzbekistan Sum", 
      "number": "0860"
    }, 
    {
      "code": "VUV", 
      "country": "VANUATU", 
      "currency": "Vatu", 
      "number": "0548"
    }, 
    {
      "code": "VEF", 
      "country": "VENEZUELA (BOLIVARIAN REPUBLIC OF)", 
      "currency": "Bolívar", 
      "number": "0937"
    }, 
    {
      "code": "VND", 
      "country": "VIET NAM", 
      "currency": "Dong", 
      "number": "0704"
    }, 
    {
      "code": "USD", 
      "country": "VIRGIN ISLANDS (BRITISH)", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "USD", 
      "country": "VIRGIN ISLANDS (U.S.)", 
      "currency": "US Dollar", 
      "number": "0840"
    }, 
    {
      "code": "XPF", 
      "country": "WALLIS AND FUTUNA", 
      "currency": "CFP Franc", 
      "number": "0953"
    }, 
    {
      "code": "MAD", 
      "country": "WESTERN SAHARA", 
      "currency": "Moroccan Dirham", 
      "number": "0504"
    }, 
    {
      "code": "YER", 
      "country": "YEMEN", 
      "currency": "Yemeni Rial", 
      "number": "0886"
    }, 
    {
      "code": "ZMW", 
      "country": "ZAMBIA", 
      "currency": "Zambian Kwacha", 
      "number": "0967"
    }, 
    {
      "code": "ZWL", 
      "country": "ZIMBABWE", 
      "currency": "Zimbabwe Dollar", 
      "number": "0932"
    }, 
    {
      "code": "XBA", 
      "country": "ZZ01_Bond Markets Unit European_EURCO", 
      "currency": "Bond Markets Unit European Composite Unit (EURCO)", 
      "number": "0955"
    }, 
    {
      "code": "XBB", 
      "country": "ZZ02_Bond Markets Unit European_EMU-6", 
      "currency": "Bond Markets Unit European Monetary Unit (E.M.U.-6)", 
      "number": "0956"
    }, 
    {
      "code": "XBC", 
      "country": "ZZ03_Bond Markets Unit European_EUA-9", 
      "currency": "Bond Markets Unit European Unit of Account 9 (E.U.A.-9)", 
      "number": "0957"
    }, 
    {
      "code": "XBD", 
      "country": "ZZ04_Bond Markets Unit European_EUA-17", 
      "currency": "Bond Markets Unit European Unit of Account 17 (E.U.A.-17)", 
      "number": "0958"
    }, 
    {
      "code": "XTS", 
      "country": "ZZ06_Testing_Code", 
      "currency": "Codes specifically reserved for testing purposes", 
      "number": "0963"
    }, 
    {
      "code": "XXX", 
      "country": "ZZ07_No_Currency", 
      "currency": "The codes assigned for transactions where no currency is involved", 
      "number": "0999"
    }, 
    {
      "code": "XAU", 
      "country": "ZZ08_Gold", 
      "currency": "Gold", 
      "number": "0959"
    }, 
    {
      "code": "XPD", 
      "country": "ZZ09_Palladium", 
      "currency": "Palladium", 
      "number": "0964"
    }, 
    {
      "code": "XPT", 
      "country": "ZZ10_Platinum", 
      "currency": "Platinum", 
      "number": "0962"
    }, 
    {
      "code": "XAG", 
      "country": "ZZ11_Silver", 
      "currency": "Silver", 
      "number": "0961"
    }
  ]
}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/decoder/json/TerminalType.json":[function(require,module,exports){
module.exports={
  "11": {
    "operator": "Financial Institution",
    "type": "Online only",
    "environment": "attended"
  },
  "12": {
    "operator": "Financial Institution",
    "type": "Offline with online capabilities",
    "environment": "attended"
  },
  "13": {
    "operator": "Financial Institution",
    "type": "Offline only",
    "environment": "attended"
  },
  "14": {
    "operator": "Financial Institution",
    "type": "Online only",
    "environment": "unattended"
  },
  "15": {
    "operator": "Financial Institution",
    "type": "Offline with online capabilities",
    "environment": "unattended"
  },
  "16": {
    "operator": "Financial Institution",
    "type": "Offline only",
    "environment": "unattended"
  },

  "21": {
    "operator": "Merchant",
    "type": "Online only",
    "environment": "attended"
  },
  "22": {
    "operator": "Merchant",
    "type": "Offline with online capabilities",
    "environment": "attended"
  },
  "23": {
    "operator": "Merchant",
    "type": "Offline only",
    "environment": "attended"
  },
  "24": {
    "operator": "Merchant",
    "type": "Online only",
    "environment": "unattended"
  },
  "25": {
    "operator": "Merchant",
    "type": "Offline with online capabilities",
    "environment": "unattended"
  },
  "26": {
    "operator": "Merchant",
    "type": "Offline only",
    "environment": "unattended"
  },

  "34": {
    "operator": "Cardholder",
    "type": "Online only",
    "environment": "unattended"
  },
  "35": {
    "operator": "Cardholder",
    "type": "Offline with online capabilities",
    "environment": "unattended"
  },
  "36": {
    "operator": "Cardholder",
    "type": "Offline only",
    "environment": "unattended"
  }


}
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/node-tlv/lib/util.js":[function(require,module,exports){
(function (Buffer){(function (){
/**
 * Created by coolbong on 2017-02-03.
 */


/**
 * convert to Buffer
 * @param {string | Buffer | number} data
 * @return {Buffer}
 */
function toBuffer(data) {
    if (Buffer.isBuffer(data)) {
        return newBuffer(data);
    } else if (typeof data === 'string') {
        data = strip(data);
        return newBuffer(data);
    } else if (typeof data === 'number') {
        var h = data.toString(16);
        if ((h.length & 1) === 1) {
            h = '0' + h;
        }
        return newBuffer(h);
    } else {
        return newBuffer(0);
    }
}


/**
 * make new Buffer
 *
 * @param {string | Buffer | number} num
 * @returns {Buffer}
 */
function newBuffer(num) {
    if (Buffer.isBuffer(num)) {
        return Buffer.from(num);
    } else if (typeof num === 'string') {
        return Buffer.from(num, 'hex');
    } else if (typeof num === 'number') {
        return Buffer.alloc(num);
    } else {
        return Buffer.alloc(num);
    }
}



/**
 * convert to hex string
 *
 * @param {number | Buffer | string} num
 * @returns {string}
 */
function toHexString(num) {
    num = num || 0;

    if (Buffer.isBuffer(num)) {
        return num.toString('hex').toUpperCase();
    } else if (typeof num === 'string') {
        num = strip(num);
        if ((num.length === 0) || num === '') {
            num = '';
        }
        return num;
    } else {
        var h = num.toString(16).toUpperCase();
        if ((h.length & 1) === 1) {
            h = '0' + h;
        }
        return h;
    }
}

function toAscii(hexstr) {
    hexstr = hexstr || '';

    var buf = toBuffer(hexstr);

    return buf.toString('ascii');
}

/**
 * convert to number
 *
 * @param {string | buffer | number} val
 * @returns {number}
 */
function toNumber(val) {
    val = val || '';
    var str;
    if (Buffer.isBuffer(val)) {
        str = toHexString(val);
    } else if (typeof val === 'string') {
        str = strip(val)
    } else if (typeof val === 'number'){
        return val;
    } else {
        return 0;
    }

    return parseInt(str, 16);
}


/**
 *  remove space and tab
 *
 * @param {string} str
 * @returns {string}
 */
function strip(str) {
    str = str || '';
    return str.replace(/\s+/g, '');
}

function u1(buffer, offset, encoding) {
    encoding = encoding || 'hex';
    if (encoding === 'hex') {
        return toHexString(buffer[offset]);
    } else if (encoding === 'number') {
        return toNumber(toHexString(buffer.slice(offset, offset+2)));
    }
}

function u2(buffer, offset, encoding) {
    encoding = encoding || 'hex';
    if (encoding === 'hex') {
        return toHexString(buffer.slice(offset, offset+2));
    } else if (encoding === 'number') {
        return toNumber(toHexString(buffer.slice(offset, offset+2)));
    }
}

function un(buffer, offset, len, encoding) {
    encoding = encoding || 'hex';
    len = len || buffer.length;
    if (encoding === 'hex') {
        return toHexString(buffer.slice(offset, offset+len));
    } else if (encoding === 'number') {
        return toNumber(toHexString(buffer.slice(offset, offset+len)));
    }
}

function bitOn(number, bit) {
    return ((number & bit) === bit);
}

module.exports  = {
    toBuffer: toBuffer,
    newBuffer: newBuffer,
    toHexString: toHexString,
    toAscii: toAscii,
    toNumber: toNumber,
    strip: strip,
    u1: u1,
    u2: u2,
    un: un,
    bitOn: bitOn
};
}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-assign/index.js":[function(require,module,exports){
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/

'use strict';
/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;

function toObject(val) {
	if (val === null || val === undefined) {
		throw new TypeError('Object.assign cannot be called with null or undefined');
	}

	return Object(val);
}

function shouldUseNative() {
	try {
		if (!Object.assign) {
			return false;
		}

		// Detect buggy property enumeration order in older V8 versions.

		// https://bugs.chromium.org/p/v8/issues/detail?id=4118
		var test1 = new String('abc');  // eslint-disable-line no-new-wrappers
		test1[5] = 'de';
		if (Object.getOwnPropertyNames(test1)[0] === '5') {
			return false;
		}

		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
		var test2 = {};
		for (var i = 0; i < 10; i++) {
			test2['_' + String.fromCharCode(i)] = i;
		}
		var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
			return test2[n];
		});
		if (order2.join('') !== '0123456789') {
			return false;
		}

		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
		var test3 = {};
		'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
			test3[letter] = letter;
		});
		if (Object.keys(Object.assign({}, test3)).join('') !==
				'abcdefghijklmnopqrst') {
			return false;
		}

		return true;
	} catch (err) {
		// We don't expect any of the above to throw, but better to be safe.
		return false;
	}
}

module.exports = shouldUseNative() ? Object.assign : function (target, source) {
	var from;
	var to = toObject(target);
	var symbols;

	for (var s = 1; s < arguments.length; s++) {
		from = Object(arguments[s]);

		for (var key in from) {
			if (hasOwnProperty.call(from, key)) {
				to[key] = from[key];
			}
		}

		if (getOwnPropertySymbols) {
			symbols = getOwnPropertySymbols(from);
			for (var i = 0; i < symbols.length; i++) {
				if (propIsEnumerable.call(from, symbols[i])) {
					to[symbols[i]] = from[symbols[i]];
				}
			}
		}
	}

	return to;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-inspect/index.js":[function(require,module,exports){
var hasMap = typeof Map === 'function' && Map.prototype;
var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;
var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;
var mapForEach = hasMap && Map.prototype.forEach;
var hasSet = typeof Set === 'function' && Set.prototype;
var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;
var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;
var setForEach = hasSet && Set.prototype.forEach;
var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;
var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;
var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;
var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;
var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;
var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;
var booleanValueOf = Boolean.prototype.valueOf;
var objectToString = Object.prototype.toString;
var functionToString = Function.prototype.toString;
var $match = String.prototype.match;
var $slice = String.prototype.slice;
var $replace = String.prototype.replace;
var $toUpperCase = String.prototype.toUpperCase;
var $toLowerCase = String.prototype.toLowerCase;
var $test = RegExp.prototype.test;
var $concat = Array.prototype.concat;
var $join = Array.prototype.join;
var $arrSlice = Array.prototype.slice;
var $floor = Math.floor;
var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;
var gOPS = Object.getOwnPropertySymbols;
var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;
var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';
// ie, `has-tostringtag/shams
var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')
    ? Symbol.toStringTag
    : null;
var isEnumerable = Object.prototype.propertyIsEnumerable;

var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (
    [].__proto__ === Array.prototype // eslint-disable-line no-proto
        ? function (O) {
            return O.__proto__; // eslint-disable-line no-proto
        }
        : null
);

function addNumericSeparator(num, str) {
    if (
        num === Infinity
        || num === -Infinity
        || num !== num
        || (num && num > -1000 && num < 1000)
        || $test.call(/e/, str)
    ) {
        return str;
    }
    var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;
    if (typeof num === 'number') {
        var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)
        if (int !== num) {
            var intStr = String(int);
            var dec = $slice.call(str, intStr.length + 1);
            return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');
        }
    }
    return $replace.call(str, sepRegex, '$&_');
}

var inspectCustom = require('./util.inspect').custom;
var inspectSymbol = inspectCustom && isSymbol(inspectCustom) ? inspectCustom : null;

module.exports = function inspect_(obj, options, depth, seen) {
    var opts = options || {};

    if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) {
        throw new TypeError('option "quoteStyle" must be "single" or "double"');
    }
    if (
        has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'
            ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity
            : opts.maxStringLength !== null
        )
    ) {
        throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');
    }
    var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;
    if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {
        throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`');
    }

    if (
        has(opts, 'indent')
        && opts.indent !== null
        && opts.indent !== '\t'
        && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)
    ) {
        throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');
    }
    if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {
        throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');
    }
    var numericSeparator = opts.numericSeparator;

    if (typeof obj === 'undefined') {
        return 'undefined';
    }
    if (obj === null) {
        return 'null';
    }
    if (typeof obj === 'boolean') {
        return obj ? 'true' : 'false';
    }

    if (typeof obj === 'string') {
        return inspectString(obj, opts);
    }
    if (typeof obj === 'number') {
        if (obj === 0) {
            return Infinity / obj > 0 ? '0' : '-0';
        }
        var str = String(obj);
        return numericSeparator ? addNumericSeparator(obj, str) : str;
    }
    if (typeof obj === 'bigint') {
        var bigIntStr = String(obj) + 'n';
        return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;
    }

    var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
    if (typeof depth === 'undefined') { depth = 0; }
    if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {
        return isArray(obj) ? '[Array]' : '[Object]';
    }

    var indent = getIndent(opts, depth);

    if (typeof seen === 'undefined') {
        seen = [];
    } else if (indexOf(seen, obj) >= 0) {
        return '[Circular]';
    }

    function inspect(value, from, noIndent) {
        if (from) {
            seen = $arrSlice.call(seen);
            seen.push(from);
        }
        if (noIndent) {
            var newOpts = {
                depth: opts.depth
            };
            if (has(opts, 'quoteStyle')) {
                newOpts.quoteStyle = opts.quoteStyle;
            }
            return inspect_(value, newOpts, depth + 1, seen);
        }
        return inspect_(value, opts, depth + 1, seen);
    }

    if (typeof obj === 'function') {
        var name = nameOf(obj);
        var keys = arrObjKeys(obj, inspect);
        return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');
    }
    if (isSymbol(obj)) {
        var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj);
        return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;
    }
    if (isElement(obj)) {
        var s = '<' + $toLowerCase.call(String(obj.nodeName));
        var attrs = obj.attributes || [];
        for (var i = 0; i < attrs.length; i++) {
            s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);
        }
        s += '>';
        if (obj.childNodes && obj.childNodes.length) { s += '...'; }
        s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>';
        return s;
    }
    if (isArray(obj)) {
        if (obj.length === 0) { return '[]'; }
        var xs = arrObjKeys(obj, inspect);
        if (indent && !singleLineValues(xs)) {
            return '[' + indentedJoin(xs, indent) + ']';
        }
        return '[ ' + $join.call(xs, ', ') + ' ]';
    }
    if (isError(obj)) {
        var parts = arrObjKeys(obj, inspect);
        if ('cause' in obj && !isEnumerable.call(obj, 'cause')) {
            return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';
        }
        if (parts.length === 0) { return '[' + String(obj) + ']'; }
        return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';
    }
    if (typeof obj === 'object' && customInspect) {
        if (inspectSymbol && typeof obj[inspectSymbol] === 'function') {
            return obj[inspectSymbol]();
        } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {
            return obj.inspect();
        }
    }
    if (isMap(obj)) {
        var mapParts = [];
        mapForEach.call(obj, function (value, key) {
            mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));
        });
        return collectionOf('Map', mapSize.call(obj), mapParts, indent);
    }
    if (isSet(obj)) {
        var setParts = [];
        setForEach.call(obj, function (value) {
            setParts.push(inspect(value, obj));
        });
        return collectionOf('Set', setSize.call(obj), setParts, indent);
    }
    if (isWeakMap(obj)) {
        return weakCollectionOf('WeakMap');
    }
    if (isWeakSet(obj)) {
        return weakCollectionOf('WeakSet');
    }
    if (isWeakRef(obj)) {
        return weakCollectionOf('WeakRef');
    }
    if (isNumber(obj)) {
        return markBoxed(inspect(Number(obj)));
    }
    if (isBigInt(obj)) {
        return markBoxed(inspect(bigIntValueOf.call(obj)));
    }
    if (isBoolean(obj)) {
        return markBoxed(booleanValueOf.call(obj));
    }
    if (isString(obj)) {
        return markBoxed(inspect(String(obj)));
    }
    if (!isDate(obj) && !isRegExp(obj)) {
        var ys = arrObjKeys(obj, inspect);
        var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;
        var protoTag = obj instanceof Object ? '' : 'null prototype';
        var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';
        var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';
        var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');
        if (ys.length === 0) { return tag + '{}'; }
        if (indent) {
            return tag + '{' + indentedJoin(ys, indent) + '}';
        }
        return tag + '{ ' + $join.call(ys, ', ') + ' }';
    }
    return String(obj);
};

function wrapQuotes(s, defaultStyle, opts) {
    var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'";
    return quoteChar + s + quoteChar;
}

function quote(s) {
    return $replace.call(String(s), /"/g, '&quot;');
}

function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }

// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives
function isSymbol(obj) {
    if (hasShammedSymbols) {
        return obj && typeof obj === 'object' && obj instanceof Symbol;
    }
    if (typeof obj === 'symbol') {
        return true;
    }
    if (!obj || typeof obj !== 'object' || !symToString) {
        return false;
    }
    try {
        symToString.call(obj);
        return true;
    } catch (e) {}
    return false;
}

function isBigInt(obj) {
    if (!obj || typeof obj !== 'object' || !bigIntValueOf) {
        return false;
    }
    try {
        bigIntValueOf.call(obj);
        return true;
    } catch (e) {}
    return false;
}

var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };
function has(obj, key) {
    return hasOwn.call(obj, key);
}

function toStr(obj) {
    return objectToString.call(obj);
}

function nameOf(f) {
    if (f.name) { return f.name; }
    var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/);
    if (m) { return m[1]; }
    return null;
}

function indexOf(xs, x) {
    if (xs.indexOf) { return xs.indexOf(x); }
    for (var i = 0, l = xs.length; i < l; i++) {
        if (xs[i] === x) { return i; }
    }
    return -1;
}

function isMap(x) {
    if (!mapSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        mapSize.call(x);
        try {
            setSize.call(x);
        } catch (s) {
            return true;
        }
        return x instanceof Map; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakMap(x) {
    if (!weakMapHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakMapHas.call(x, weakMapHas);
        try {
            weakSetHas.call(x, weakSetHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakMap; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakRef(x) {
    if (!weakRefDeref || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakRefDeref.call(x);
        return true;
    } catch (e) {}
    return false;
}

function isSet(x) {
    if (!setSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        setSize.call(x);
        try {
            mapSize.call(x);
        } catch (m) {
            return true;
        }
        return x instanceof Set; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakSet(x) {
    if (!weakSetHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakSetHas.call(x, weakSetHas);
        try {
            weakMapHas.call(x, weakMapHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakSet; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isElement(x) {
    if (!x || typeof x !== 'object') { return false; }
    if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
        return true;
    }
    return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';
}

function inspectString(str, opts) {
    if (str.length > opts.maxStringLength) {
        var remaining = str.length - opts.maxStringLength;
        var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');
        return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;
    }
    // eslint-disable-next-line no-control-regex
    var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte);
    return wrapQuotes(s, 'single', opts);
}

function lowbyte(c) {
    var n = c.charCodeAt(0);
    var x = {
        8: 'b',
        9: 't',
        10: 'n',
        12: 'f',
        13: 'r'
    }[n];
    if (x) { return '\\' + x; }
    return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));
}

function markBoxed(str) {
    return 'Object(' + str + ')';
}

function weakCollectionOf(type) {
    return type + ' { ? }';
}

function collectionOf(type, size, entries, indent) {
    var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');
    return type + ' (' + size + ') {' + joinedEntries + '}';
}

function singleLineValues(xs) {
    for (var i = 0; i < xs.length; i++) {
        if (indexOf(xs[i], '\n') >= 0) {
            return false;
        }
    }
    return true;
}

function getIndent(opts, depth) {
    var baseIndent;
    if (opts.indent === '\t') {
        baseIndent = '\t';
    } else if (typeof opts.indent === 'number' && opts.indent > 0) {
        baseIndent = $join.call(Array(opts.indent + 1), ' ');
    } else {
        return null;
    }
    return {
        base: baseIndent,
        prev: $join.call(Array(depth + 1), baseIndent)
    };
}

function indentedJoin(xs, indent) {
    if (xs.length === 0) { return ''; }
    var lineJoiner = '\n' + indent.prev + indent.base;
    return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev;
}

function arrObjKeys(obj, inspect) {
    var isArr = isArray(obj);
    var xs = [];
    if (isArr) {
        xs.length = obj.length;
        for (var i = 0; i < obj.length; i++) {
            xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';
        }
    }
    var syms = typeof gOPS === 'function' ? gOPS(obj) : [];
    var symMap;
    if (hasShammedSymbols) {
        symMap = {};
        for (var k = 0; k < syms.length; k++) {
            symMap['$' + syms[k]] = syms[k];
        }
    }

    for (var key in obj) { // eslint-disable-line no-restricted-syntax
        if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {
            // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section
            continue; // eslint-disable-line no-restricted-syntax, no-continue
        } else if ($test.call(/[^\w$]/, key)) {
            xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));
        } else {
            xs.push(key + ': ' + inspect(obj[key], obj));
        }
    }
    if (typeof gOPS === 'function') {
        for (var j = 0; j < syms.length; j++) {
            if (isEnumerable.call(obj, syms[j])) {
                xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));
            }
        }
    }
    return xs;
}

},{"./util.inspect":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browser-resolve/empty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-is/implementation.js":[function(require,module,exports){
'use strict';

var numberIsNaN = function (value) {
	return value !== value;
};

module.exports = function is(a, b) {
	if (a === 0 && b === 0) {
		return 1 / a === 1 / b;
	}
	if (a === b) {
		return true;
	}
	if (numberIsNaN(a) && numberIsNaN(b)) {
		return true;
	}
	return false;
};


},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-is/index.js":[function(require,module,exports){
'use strict';

var define = require('define-properties');
var callBind = require('call-bind');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var polyfill = callBind(getPolyfill(), Object);

define(polyfill, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = polyfill;

},{"./implementation":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-is/implementation.js","./polyfill":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-is/polyfill.js","./shim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-is/shim.js","call-bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/call-bind/index.js","define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/define-properties/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-is/polyfill.js":[function(require,module,exports){
'use strict';

var implementation = require('./implementation');

module.exports = function getPolyfill() {
	return typeof Object.is === 'function' ? Object.is : implementation;
};

},{"./implementation":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-is/implementation.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-is/shim.js":[function(require,module,exports){
'use strict';

var getPolyfill = require('./polyfill');
var define = require('define-properties');

module.exports = function shimObjectIs() {
	var polyfill = getPolyfill();
	define(Object, { is: polyfill }, {
		is: function testObjectIs() {
			return Object.is !== polyfill;
		}
	});
	return polyfill;
};

},{"./polyfill":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-is/polyfill.js","define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/define-properties/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-keys/implementation.js":[function(require,module,exports){
'use strict';

var keysShim;
if (!Object.keys) {
	// modified from https://github.com/es-shims/es5-shim
	var has = Object.prototype.hasOwnProperty;
	var toStr = Object.prototype.toString;
	var isArgs = require('./isArguments'); // eslint-disable-line global-require
	var isEnumerable = Object.prototype.propertyIsEnumerable;
	var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
	var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
	var dontEnums = [
		'toString',
		'toLocaleString',
		'valueOf',
		'hasOwnProperty',
		'isPrototypeOf',
		'propertyIsEnumerable',
		'constructor'
	];
	var equalsConstructorPrototype = function (o) {
		var ctor = o.constructor;
		return ctor && ctor.prototype === o;
	};
	var excludedKeys = {
		$applicationCache: true,
		$console: true,
		$external: true,
		$frame: true,
		$frameElement: true,
		$frames: true,
		$innerHeight: true,
		$innerWidth: true,
		$onmozfullscreenchange: true,
		$onmozfullscreenerror: true,
		$outerHeight: true,
		$outerWidth: true,
		$pageXOffset: true,
		$pageYOffset: true,
		$parent: true,
		$scrollLeft: true,
		$scrollTop: true,
		$scrollX: true,
		$scrollY: true,
		$self: true,
		$webkitIndexedDB: true,
		$webkitStorageInfo: true,
		$window: true
	};
	var hasAutomationEqualityBug = (function () {
		/* global window */
		if (typeof window === 'undefined') { return false; }
		for (var k in window) {
			try {
				if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
					try {
						equalsConstructorPrototype(window[k]);
					} catch (e) {
						return true;
					}
				}
			} catch (e) {
				return true;
			}
		}
		return false;
	}());
	var equalsConstructorPrototypeIfNotBuggy = function (o) {
		/* global window */
		if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
			return equalsConstructorPrototype(o);
		}
		try {
			return equalsConstructorPrototype(o);
		} catch (e) {
			return false;
		}
	};

	keysShim = function keys(object) {
		var isObject = object !== null && typeof object === 'object';
		var isFunction = toStr.call(object) === '[object Function]';
		var isArguments = isArgs(object);
		var isString = isObject && toStr.call(object) === '[object String]';
		var theKeys = [];

		if (!isObject && !isFunction && !isArguments) {
			throw new TypeError('Object.keys called on a non-object');
		}

		var skipProto = hasProtoEnumBug && isFunction;
		if (isString && object.length > 0 && !has.call(object, 0)) {
			for (var i = 0; i < object.length; ++i) {
				theKeys.push(String(i));
			}
		}

		if (isArguments && object.length > 0) {
			for (var j = 0; j < object.length; ++j) {
				theKeys.push(String(j));
			}
		} else {
			for (var name in object) {
				if (!(skipProto && name === 'prototype') && has.call(object, name)) {
					theKeys.push(String(name));
				}
			}
		}

		if (hasDontEnumBug) {
			var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);

			for (var k = 0; k < dontEnums.length; ++k) {
				if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
					theKeys.push(dontEnums[k]);
				}
			}
		}
		return theKeys;
	};
}
module.exports = keysShim;

},{"./isArguments":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-keys/isArguments.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-keys/index.js":[function(require,module,exports){
'use strict';

var slice = Array.prototype.slice;
var isArgs = require('./isArguments');

var origKeys = Object.keys;
var keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');

var originalKeys = Object.keys;

keysShim.shim = function shimObjectKeys() {
	if (Object.keys) {
		var keysWorksWithArguments = (function () {
			// Safari 5.0 bug
			var args = Object.keys(arguments);
			return args && args.length === arguments.length;
		}(1, 2));
		if (!keysWorksWithArguments) {
			Object.keys = function keys(object) { // eslint-disable-line func-name-matching
				if (isArgs(object)) {
					return originalKeys(slice.call(object));
				}
				return originalKeys(object);
			};
		}
	} else {
		Object.keys = keysShim;
	}
	return Object.keys || keysShim;
};

module.exports = keysShim;

},{"./implementation":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-keys/implementation.js","./isArguments":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-keys/isArguments.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-keys/isArguments.js":[function(require,module,exports){
'use strict';

var toStr = Object.prototype.toString;

module.exports = function isArguments(value) {
	var str = toStr.call(value);
	var isArgs = str === '[object Arguments]';
	if (!isArgs) {
		isArgs = str !== '[object Array]' &&
			value !== null &&
			typeof value === 'object' &&
			typeof value.length === 'number' &&
			value.length >= 0 &&
			toStr.call(value.callee) === '[object Function]';
	}
	return isArgs;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/utils/common.js":[function(require,module,exports){
'use strict';


var TYPED_OK =  (typeof Uint8Array !== 'undefined') &&
                (typeof Uint16Array !== 'undefined') &&
                (typeof Int32Array !== 'undefined');

function _has(obj, key) {
  return Object.prototype.hasOwnProperty.call(obj, key);
}

exports.assign = function (obj /*from1, from2, from3, ...*/) {
  var sources = Array.prototype.slice.call(arguments, 1);
  while (sources.length) {
    var source = sources.shift();
    if (!source) { continue; }

    if (typeof source !== 'object') {
      throw new TypeError(source + 'must be non-object');
    }

    for (var p in source) {
      if (_has(source, p)) {
        obj[p] = source[p];
      }
    }
  }

  return obj;
};


// reduce buffer size, avoiding mem copy
exports.shrinkBuf = function (buf, size) {
  if (buf.length === size) { return buf; }
  if (buf.subarray) { return buf.subarray(0, size); }
  buf.length = size;
  return buf;
};


var fnTyped = {
  arraySet: function (dest, src, src_offs, len, dest_offs) {
    if (src.subarray && dest.subarray) {
      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
      return;
    }
    // Fallback to ordinary array
    for (var i = 0; i < len; i++) {
      dest[dest_offs + i] = src[src_offs + i];
    }
  },
  // Join array of chunks to single array.
  flattenChunks: function (chunks) {
    var i, l, len, pos, chunk, result;

    // calculate data length
    len = 0;
    for (i = 0, l = chunks.length; i < l; i++) {
      len += chunks[i].length;
    }

    // join chunks
    result = new Uint8Array(len);
    pos = 0;
    for (i = 0, l = chunks.length; i < l; i++) {
      chunk = chunks[i];
      result.set(chunk, pos);
      pos += chunk.length;
    }

    return result;
  }
};

var fnUntyped = {
  arraySet: function (dest, src, src_offs, len, dest_offs) {
    for (var i = 0; i < len; i++) {
      dest[dest_offs + i] = src[src_offs + i];
    }
  },
  // Join array of chunks to single array.
  flattenChunks: function (chunks) {
    return [].concat.apply([], chunks);
  }
};


// Enable/Disable typed arrays use, for testing
//
exports.setTyped = function (on) {
  if (on) {
    exports.Buf8  = Uint8Array;
    exports.Buf16 = Uint16Array;
    exports.Buf32 = Int32Array;
    exports.assign(exports, fnTyped);
  } else {
    exports.Buf8  = Array;
    exports.Buf16 = Array;
    exports.Buf32 = Array;
    exports.assign(exports, fnUntyped);
  }
};

exports.setTyped(TYPED_OK);

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/adler32.js":[function(require,module,exports){
'use strict';

// Note: adler32 takes 12% for level 0 and 2% for level 6.
// It isn't worth it to make additional optimizations as in original.
// Small size is preferable.

// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//   claim that you wrote the original software. If you use this software
//   in a product, an acknowledgment in the product documentation would be
//   appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
//   misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.

function adler32(adler, buf, len, pos) {
  var s1 = (adler & 0xffff) |0,
      s2 = ((adler >>> 16) & 0xffff) |0,
      n = 0;

  while (len !== 0) {
    // Set limit ~ twice less than 5552, to keep
    // s2 in 31-bits, because we force signed ints.
    // in other case %= will fail.
    n = len > 2000 ? 2000 : len;
    len -= n;

    do {
      s1 = (s1 + buf[pos++]) |0;
      s2 = (s2 + s1) |0;
    } while (--n);

    s1 %= 65521;
    s2 %= 65521;
  }

  return (s1 | (s2 << 16)) |0;
}


module.exports = adler32;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/constants.js":[function(require,module,exports){
'use strict';

// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//   claim that you wrote the original software. If you use this software
//   in a product, an acknowledgment in the product documentation would be
//   appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
//   misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.

module.exports = {

  /* Allowed flush values; see deflate() and inflate() below for details */
  Z_NO_FLUSH:         0,
  Z_PARTIAL_FLUSH:    1,
  Z_SYNC_FLUSH:       2,
  Z_FULL_FLUSH:       3,
  Z_FINISH:           4,
  Z_BLOCK:            5,
  Z_TREES:            6,

  /* Return codes for the compression/decompression functions. Negative values
  * are errors, positive values are used for special but normal events.
  */
  Z_OK:               0,
  Z_STREAM_END:       1,
  Z_NEED_DICT:        2,
  Z_ERRNO:           -1,
  Z_STREAM_ERROR:    -2,
  Z_DATA_ERROR:      -3,
  //Z_MEM_ERROR:     -4,
  Z_BUF_ERROR:       -5,
  //Z_VERSION_ERROR: -6,

  /* compression levels */
  Z_NO_COMPRESSION:         0,
  Z_BEST_SPEED:             1,
  Z_BEST_COMPRESSION:       9,
  Z_DEFAULT_COMPRESSION:   -1,


  Z_FILTERED:               1,
  Z_HUFFMAN_ONLY:           2,
  Z_RLE:                    3,
  Z_FIXED:                  4,
  Z_DEFAULT_STRATEGY:       0,

  /* Possible values of the data_type field (though see inflate()) */
  Z_BINARY:                 0,
  Z_TEXT:                   1,
  //Z_ASCII:                1, // = Z_TEXT (deprecated)
  Z_UNKNOWN:                2,

  /* The deflate compression method */
  Z_DEFLATED:               8
  //Z_NULL:                 null // Use -1 or null inline, depending on var type
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/crc32.js":[function(require,module,exports){
'use strict';

// Note: we can't get significant speed boost here.
// So write code to minimize size - no pregenerated tables
// and array tools dependencies.

// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//   claim that you wrote the original software. If you use this software
//   in a product, an acknowledgment in the product documentation would be
//   appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
//   misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.

// Use ordinary array, since untyped makes no boost here
function makeTable() {
  var c, table = [];

  for (var n = 0; n < 256; n++) {
    c = n;
    for (var k = 0; k < 8; k++) {
      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
    }
    table[n] = c;
  }

  return table;
}

// Create table on load. Just 255 signed longs. Not a problem.
var crcTable = makeTable();


function crc32(crc, buf, len, pos) {
  var t = crcTable,
      end = pos + len;

  crc ^= -1;

  for (var i = pos; i < end; i++) {
    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
  }

  return (crc ^ (-1)); // >>> 0;
}


module.exports = crc32;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/deflate.js":[function(require,module,exports){
'use strict';

// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//   claim that you wrote the original software. If you use this software
//   in a product, an acknowledgment in the product documentation would be
//   appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
//   misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.

var utils   = require('../utils/common');
var trees   = require('./trees');
var adler32 = require('./adler32');
var crc32   = require('./crc32');
var msg     = require('./messages');

/* Public constants ==========================================================*/
/* ===========================================================================*/


/* Allowed flush values; see deflate() and inflate() below for details */
var Z_NO_FLUSH      = 0;
var Z_PARTIAL_FLUSH = 1;
//var Z_SYNC_FLUSH    = 2;
var Z_FULL_FLUSH    = 3;
var Z_FINISH        = 4;
var Z_BLOCK         = 5;
//var Z_TREES         = 6;


/* Return codes for the compression/decompression functions. Negative values
 * are errors, positive values are used for special but normal events.
 */
var Z_OK            = 0;
var Z_STREAM_END    = 1;
//var Z_NEED_DICT     = 2;
//var Z_ERRNO         = -1;
var Z_STREAM_ERROR  = -2;
var Z_DATA_ERROR    = -3;
//var Z_MEM_ERROR     = -4;
var Z_BUF_ERROR     = -5;
//var Z_VERSION_ERROR = -6;


/* compression levels */
//var Z_NO_COMPRESSION      = 0;
//var Z_BEST_SPEED          = 1;
//var Z_BEST_COMPRESSION    = 9;
var Z_DEFAULT_COMPRESSION = -1;


var Z_FILTERED            = 1;
var Z_HUFFMAN_ONLY        = 2;
var Z_RLE                 = 3;
var Z_FIXED               = 4;
var Z_DEFAULT_STRATEGY    = 0;

/* Possible values of the data_type field (though see inflate()) */
//var Z_BINARY              = 0;
//var Z_TEXT                = 1;
//var Z_ASCII               = 1; // = Z_TEXT
var Z_UNKNOWN             = 2;


/* The deflate compression method */
var Z_DEFLATED  = 8;

/*============================================================================*/


var MAX_MEM_LEVEL = 9;
/* Maximum value for memLevel in deflateInit2 */
var MAX_WBITS = 15;
/* 32K LZ77 window */
var DEF_MEM_LEVEL = 8;


var LENGTH_CODES  = 29;
/* number of length codes, not counting the special END_BLOCK code */
var LITERALS      = 256;
/* number of literal bytes 0..255 */
var L_CODES       = LITERALS + 1 + LENGTH_CODES;
/* number of Literal or Length codes, including the END_BLOCK code */
var D_CODES       = 30;
/* number of distance codes */
var BL_CODES      = 19;
/* number of codes used to transfer the bit lengths */
var HEAP_SIZE     = 2 * L_CODES + 1;
/* maximum heap size */
var MAX_BITS  = 15;
/* All codes must not exceed MAX_BITS bits */

var MIN_MATCH = 3;
var MAX_MATCH = 258;
var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);

var PRESET_DICT = 0x20;

var INIT_STATE = 42;
var EXTRA_STATE = 69;
var NAME_STATE = 73;
var COMMENT_STATE = 91;
var HCRC_STATE = 103;
var BUSY_STATE = 113;
var FINISH_STATE = 666;

var BS_NEED_MORE      = 1; /* block not completed, need more input or more output */
var BS_BLOCK_DONE     = 2; /* block flush performed */
var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
var BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */

var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.

function err(strm, errorCode) {
  strm.msg = msg[errorCode];
  return errorCode;
}

function rank(f) {
  return ((f) << 1) - ((f) > 4 ? 9 : 0);
}

function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }


/* =========================================================================
 * Flush as much pending output as possible. All deflate() output goes
 * through this function so some applications may wish to modify it
 * to avoid allocating a large strm->output buffer and copying into it.
 * (See also read_buf()).
 */
function flush_pending(strm) {
  var s = strm.state;

  //_tr_flush_bits(s);
  var len = s.pending;
  if (len > strm.avail_out) {
    len = strm.avail_out;
  }
  if (len === 0) { return; }

  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
  strm.next_out += len;
  s.pending_out += len;
  strm.total_out += len;
  strm.avail_out -= len;
  s.pending -= len;
  if (s.pending === 0) {
    s.pending_out = 0;
  }
}


function flush_block_only(s, last) {
  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
  s.block_start = s.strstart;
  flush_pending(s.strm);
}


function put_byte(s, b) {
  s.pending_buf[s.pending++] = b;
}


/* =========================================================================
 * Put a short in the pending buffer. The 16-bit value is put in MSB order.
 * IN assertion: the stream state is correct and there is enough room in
 * pending_buf.
 */
function putShortMSB(s, b) {
//  put_byte(s, (Byte)(b >> 8));
//  put_byte(s, (Byte)(b & 0xff));
  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
  s.pending_buf[s.pending++] = b & 0xff;
}


/* ===========================================================================
 * Read a new buffer from the current input stream, update the adler32
 * and total number of bytes read.  All deflate() input goes through
 * this function so some applications may wish to modify it to avoid
 * allocating a large strm->input buffer and copying from it.
 * (See also flush_pending()).
 */
function read_buf(strm, buf, start, size) {
  var len = strm.avail_in;

  if (len > size) { len = size; }
  if (len === 0) { return 0; }

  strm.avail_in -= len;

  // zmemcpy(buf, strm->next_in, len);
  utils.arraySet(buf, strm.input, strm.next_in, len, start);
  if (strm.state.wrap === 1) {
    strm.adler = adler32(strm.adler, buf, len, start);
  }

  else if (strm.state.wrap === 2) {
    strm.adler = crc32(strm.adler, buf, len, start);
  }

  strm.next_in += len;
  strm.total_in += len;

  return len;
}


/* ===========================================================================
 * Set match_start to the longest match starting at the given string and
 * return its length. Matches shorter or equal to prev_length are discarded,
 * in which case the result is equal to prev_length and match_start is
 * garbage.
 * IN assertions: cur_match is the head of the hash chain for the current
 *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
 * OUT assertion: the match length is not greater than s->lookahead.
 */
function longest_match(s, cur_match) {
  var chain_length = s.max_chain_length;      /* max hash chain length */
  var scan = s.strstart; /* current string */
  var match;                       /* matched string */
  var len;                           /* length of current match */
  var best_len = s.prev_length;              /* best match length so far */
  var nice_match = s.nice_match;             /* stop if match long enough */
  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;

  var _win = s.window; // shortcut

  var wmask = s.w_mask;
  var prev  = s.prev;

  /* Stop when cur_match becomes <= limit. To simplify the code,
   * we prevent matches with the string of window index 0.
   */

  var strend = s.strstart + MAX_MATCH;
  var scan_end1  = _win[scan + best_len - 1];
  var scan_end   = _win[scan + best_len];

  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
   * It is easy to get rid of this optimization if necessary.
   */
  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");

  /* Do not waste too much time if we already have a good match: */
  if (s.prev_length >= s.good_match) {
    chain_length >>= 2;
  }
  /* Do not look for matches beyond the end of the input. This is necessary
   * to make deflate deterministic.
   */
  if (nice_match > s.lookahead) { nice_match = s.lookahead; }

  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");

  do {
    // Assert(cur_match < s->strstart, "no future");
    match = cur_match;

    /* Skip to next match if the match length cannot increase
     * or if the match length is less than 2.  Note that the checks below
     * for insufficient lookahead only occur occasionally for performance
     * reasons.  Therefore uninitialized memory will be accessed, and
     * conditional jumps will be made that depend on those values.
     * However the length of the match is limited to the lookahead, so
     * the output of deflate is not affected by the uninitialized values.
     */

    if (_win[match + best_len]     !== scan_end  ||
        _win[match + best_len - 1] !== scan_end1 ||
        _win[match]                !== _win[scan] ||
        _win[++match]              !== _win[scan + 1]) {
      continue;
    }

    /* The check at best_len-1 can be removed because it will be made
     * again later. (This heuristic is not always a win.)
     * It is not necessary to compare scan[2] and match[2] since they
     * are always equal when the other bytes match, given that
     * the hash keys are equal and that HASH_BITS >= 8.
     */
    scan += 2;
    match++;
    // Assert(*scan == *match, "match[2]?");

    /* We check for insufficient lookahead only every 8th comparison;
     * the 256th check will be made at strstart+258.
     */
    do {
      /*jshint noempty:false*/
    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
             scan < strend);

    // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");

    len = MAX_MATCH - (strend - scan);
    scan = strend - MAX_MATCH;

    if (len > best_len) {
      s.match_start = cur_match;
      best_len = len;
      if (len >= nice_match) {
        break;
      }
      scan_end1  = _win[scan + best_len - 1];
      scan_end   = _win[scan + best_len];
    }
  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);

  if (best_len <= s.lookahead) {
    return best_len;
  }
  return s.lookahead;
}


/* ===========================================================================
 * Fill the window when the lookahead becomes insufficient.
 * Updates strstart and lookahead.
 *
 * IN assertion: lookahead < MIN_LOOKAHEAD
 * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
 *    At least one byte has been read, or avail_in == 0; reads are
 *    performed for at least two bytes (required for the zip translate_eol
 *    option -- not supported here).
 */
function fill_window(s) {
  var _w_size = s.w_size;
  var p, n, m, more, str;

  //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");

  do {
    more = s.window_size - s.lookahead - s.strstart;

    // JS ints have 32 bit, block below not needed
    /* Deal with !@#$% 64K limit: */
    //if (sizeof(int) <= 2) {
    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
    //        more = wsize;
    //
    //  } else if (more == (unsigned)(-1)) {
    //        /* Very unlikely, but possible on 16 bit machine if
    //         * strstart == 0 && lookahead == 1 (input done a byte at time)
    //         */
    //        more--;
    //    }
    //}


    /* If the window is almost full and there is insufficient lookahead,
     * move the upper half to the lower one to make room in the upper half.
     */
    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {

      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
      s.match_start -= _w_size;
      s.strstart -= _w_size;
      /* we now have strstart >= MAX_DIST */
      s.block_start -= _w_size;

      /* Slide the hash table (could be avoided with 32 bit values
       at the expense of memory usage). We slide even when level == 0
       to keep the hash table consistent if we switch back to level > 0
       later. (Using level 0 permanently is not an optimal usage of
       zlib, so we don't care about this pathological case.)
       */

      n = s.hash_size;
      p = n;
      do {
        m = s.head[--p];
        s.head[p] = (m >= _w_size ? m - _w_size : 0);
      } while (--n);

      n = _w_size;
      p = n;
      do {
        m = s.prev[--p];
        s.prev[p] = (m >= _w_size ? m - _w_size : 0);
        /* If n is not on any hash chain, prev[n] is garbage but
         * its value will never be used.
         */
      } while (--n);

      more += _w_size;
    }
    if (s.strm.avail_in === 0) {
      break;
    }

    /* If there was no sliding:
     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
     *    more == window_size - lookahead - strstart
     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
     * => more >= window_size - 2*WSIZE + 2
     * In the BIG_MEM or MMAP case (not yet supported),
     *   window_size == input_size + MIN_LOOKAHEAD  &&
     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
     * Otherwise, window_size == 2*WSIZE so more >= 2.
     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
     */
    //Assert(more >= 2, "more < 2");
    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
    s.lookahead += n;

    /* Initialize the hash value now that we have some input: */
    if (s.lookahead + s.insert >= MIN_MATCH) {
      str = s.strstart - s.insert;
      s.ins_h = s.window[str];

      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
//#if MIN_MATCH != 3
//        Call update_hash() MIN_MATCH-3 more times
//#endif
      while (s.insert) {
        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;

        s.prev[str & s.w_mask] = s.head[s.ins_h];
        s.head[s.ins_h] = str;
        str++;
        s.insert--;
        if (s.lookahead + s.insert < MIN_MATCH) {
          break;
        }
      }
    }
    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
     * but this is not important since only literal bytes will be emitted.
     */

  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);

  /* If the WIN_INIT bytes after the end of the current data have never been
   * written, then zero those bytes in order to avoid memory check reports of
   * the use of uninitialized (or uninitialised as Julian writes) bytes by
   * the longest match routines.  Update the high water mark for the next
   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
   */
//  if (s.high_water < s.window_size) {
//    var curr = s.strstart + s.lookahead;
//    var init = 0;
//
//    if (s.high_water < curr) {
//      /* Previous high water mark below current data -- zero WIN_INIT
//       * bytes or up to end of window, whichever is less.
//       */
//      init = s.window_size - curr;
//      if (init > WIN_INIT)
//        init = WIN_INIT;
//      zmemzero(s->window + curr, (unsigned)init);
//      s->high_water = curr + init;
//    }
//    else if (s->high_water < (ulg)curr + WIN_INIT) {
//      /* High water mark at or above current data, but below current data
//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
//       * to end of window, whichever is less.
//       */
//      init = (ulg)curr + WIN_INIT - s->high_water;
//      if (init > s->window_size - s->high_water)
//        init = s->window_size - s->high_water;
//      zmemzero(s->window + s->high_water, (unsigned)init);
//      s->high_water += init;
//    }
//  }
//
//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
//    "not enough room for search");
}

/* ===========================================================================
 * Copy without compression as much as possible from the input stream, return
 * the current block state.
 * This function does not insert new strings in the dictionary since
 * uncompressible data is probably not useful. This function is used
 * only for the level=0 compression option.
 * NOTE: this function should be optimized to avoid extra copying from
 * window to pending_buf.
 */
function deflate_stored(s, flush) {
  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
   * to pending_buf_size, and each stored block has a 5 byte header:
   */
  var max_block_size = 0xffff;

  if (max_block_size > s.pending_buf_size - 5) {
    max_block_size = s.pending_buf_size - 5;
  }

  /* Copy as much as possible from input to output: */
  for (;;) {
    /* Fill the window as much as possible: */
    if (s.lookahead <= 1) {

      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
      //  s->block_start >= (long)s->w_size, "slide too late");
//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
//        s.block_start >= s.w_size)) {
//        throw  new Error("slide too late");
//      }

      fill_window(s);
      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
        return BS_NEED_MORE;
      }

      if (s.lookahead === 0) {
        break;
      }
      /* flush the current block */
    }
    //Assert(s->block_start >= 0L, "block gone");
//    if (s.block_start < 0) throw new Error("block gone");

    s.strstart += s.lookahead;
    s.lookahead = 0;

    /* Emit a stored block if pending_buf will be full: */
    var max_start = s.block_start + max_block_size;

    if (s.strstart === 0 || s.strstart >= max_start) {
      /* strstart == 0 is possible when wraparound on 16-bit machine */
      s.lookahead = s.strstart - max_start;
      s.strstart = max_start;
      /*** FLUSH_BLOCK(s, 0); ***/
      flush_block_only(s, false);
      if (s.strm.avail_out === 0) {
        return BS_NEED_MORE;
      }
      /***/


    }
    /* Flush if we may have to slide, otherwise block_start may become
     * negative and the data will be gone:
     */
    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
      /*** FLUSH_BLOCK(s, 0); ***/
      flush_block_only(s, false);
      if (s.strm.avail_out === 0) {
        return BS_NEED_MORE;
      }
      /***/
    }
  }

  s.insert = 0;

  if (flush === Z_FINISH) {
    /*** FLUSH_BLOCK(s, 1); ***/
    flush_block_only(s, true);
    if (s.strm.avail_out === 0) {
      return BS_FINISH_STARTED;
    }
    /***/
    return BS_FINISH_DONE;
  }

  if (s.strstart > s.block_start) {
    /*** FLUSH_BLOCK(s, 0); ***/
    flush_block_only(s, false);
    if (s.strm.avail_out === 0) {
      return BS_NEED_MORE;
    }
    /***/
  }

  return BS_NEED_MORE;
}

/* ===========================================================================
 * Compress as much as possible from the input stream, return the current
 * block state.
 * This function does not perform lazy evaluation of matches and inserts
 * new strings in the dictionary only for unmatched strings or for short
 * matches. It is used only for the fast compression options.
 */
function deflate_fast(s, flush) {
  var hash_head;        /* head of the hash chain */
  var bflush;           /* set if current block must be flushed */

  for (;;) {
    /* Make sure that we always have enough lookahead, except
     * at the end of the input file. We need MAX_MATCH bytes
     * for the next match, plus MIN_MATCH bytes to insert the
     * string following the next match.
     */
    if (s.lookahead < MIN_LOOKAHEAD) {
      fill_window(s);
      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
        return BS_NEED_MORE;
      }
      if (s.lookahead === 0) {
        break; /* flush the current block */
      }
    }

    /* Insert the string window[strstart .. strstart+2] in the
     * dictionary, and set hash_head to the head of the hash chain:
     */
    hash_head = 0/*NIL*/;
    if (s.lookahead >= MIN_MATCH) {
      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
      s.head[s.ins_h] = s.strstart;
      /***/
    }

    /* Find the longest match, discarding those <= prev_length.
     * At this point we have always match_length < MIN_MATCH
     */
    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
      /* To simplify the code, we prevent matches with the string
       * of window index 0 (in particular we have to avoid a match
       * of the string with itself at the start of the input file).
       */
      s.match_length = longest_match(s, hash_head);
      /* longest_match() sets match_start */
    }
    if (s.match_length >= MIN_MATCH) {
      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only

      /*** _tr_tally_dist(s, s.strstart - s.match_start,
                     s.match_length - MIN_MATCH, bflush); ***/
      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);

      s.lookahead -= s.match_length;

      /* Insert new strings in the hash table only if the match length
       * is not too large. This saves time but degrades compression.
       */
      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
        s.match_length--; /* string at strstart already in table */
        do {
          s.strstart++;
          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
          s.head[s.ins_h] = s.strstart;
          /***/
          /* strstart never exceeds WSIZE-MAX_MATCH, so there are
           * always MIN_MATCH bytes ahead.
           */
        } while (--s.match_length !== 0);
        s.strstart++;
      } else
      {
        s.strstart += s.match_length;
        s.match_length = 0;
        s.ins_h = s.window[s.strstart];
        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;

//#if MIN_MATCH != 3
//                Call UPDATE_HASH() MIN_MATCH-3 more times
//#endif
        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
         * matter since it will be recomputed at next deflate call.
         */
      }
    } else {
      /* No match, output a literal byte */
      //Tracevv((stderr,"%c", s.window[s.strstart]));
      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);

      s.lookahead--;
      s.strstart++;
    }
    if (bflush) {
      /*** FLUSH_BLOCK(s, 0); ***/
      flush_block_only(s, false);
      if (s.strm.avail_out === 0) {
        return BS_NEED_MORE;
      }
      /***/
    }
  }
  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);
  if (flush === Z_FINISH) {
    /*** FLUSH_BLOCK(s, 1); ***/
    flush_block_only(s, true);
    if (s.strm.avail_out === 0) {
      return BS_FINISH_STARTED;
    }
    /***/
    return BS_FINISH_DONE;
  }
  if (s.last_lit) {
    /*** FLUSH_BLOCK(s, 0); ***/
    flush_block_only(s, false);
    if (s.strm.avail_out === 0) {
      return BS_NEED_MORE;
    }
    /***/
  }
  return BS_BLOCK_DONE;
}

/* ===========================================================================
 * Same as above, but achieves better compression. We use a lazy
 * evaluation for matches: a match is finally adopted only if there is
 * no better match at the next window position.
 */
function deflate_slow(s, flush) {
  var hash_head;          /* head of hash chain */
  var bflush;              /* set if current block must be flushed */

  var max_insert;

  /* Process the input block. */
  for (;;) {
    /* Make sure that we always have enough lookahead, except
     * at the end of the input file. We need MAX_MATCH bytes
     * for the next match, plus MIN_MATCH bytes to insert the
     * string following the next match.
     */
    if (s.lookahead < MIN_LOOKAHEAD) {
      fill_window(s);
      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
        return BS_NEED_MORE;
      }
      if (s.lookahead === 0) { break; } /* flush the current block */
    }

    /* Insert the string window[strstart .. strstart+2] in the
     * dictionary, and set hash_head to the head of the hash chain:
     */
    hash_head = 0/*NIL*/;
    if (s.lookahead >= MIN_MATCH) {
      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
      s.head[s.ins_h] = s.strstart;
      /***/
    }

    /* Find the longest match, discarding those <= prev_length.
     */
    s.prev_length = s.match_length;
    s.prev_match = s.match_start;
    s.match_length = MIN_MATCH - 1;

    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
      /* To simplify the code, we prevent matches with the string
       * of window index 0 (in particular we have to avoid a match
       * of the string with itself at the start of the input file).
       */
      s.match_length = longest_match(s, hash_head);
      /* longest_match() sets match_start */

      if (s.match_length <= 5 &&
         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {

        /* If prev_match is also MIN_MATCH, match_start is garbage
         * but we will ignore the current match anyway.
         */
        s.match_length = MIN_MATCH - 1;
      }
    }
    /* If there was a match at the previous step and the current
     * match is not better, output the previous match:
     */
    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
      max_insert = s.strstart + s.lookahead - MIN_MATCH;
      /* Do not insert strings in hash table beyond this. */

      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);

      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
                     s.prev_length - MIN_MATCH, bflush);***/
      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);
      /* Insert in hash table all strings up to the end of the match.
       * strstart-1 and strstart are already inserted. If there is not
       * enough lookahead, the last two strings are not inserted in
       * the hash table.
       */
      s.lookahead -= s.prev_length - 1;
      s.prev_length -= 2;
      do {
        if (++s.strstart <= max_insert) {
          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
          s.head[s.ins_h] = s.strstart;
          /***/
        }
      } while (--s.prev_length !== 0);
      s.match_available = 0;
      s.match_length = MIN_MATCH - 1;
      s.strstart++;

      if (bflush) {
        /*** FLUSH_BLOCK(s, 0); ***/
        flush_block_only(s, false);
        if (s.strm.avail_out === 0) {
          return BS_NEED_MORE;
        }
        /***/
      }

    } else if (s.match_available) {
      /* If there was no match at the previous position, output a
       * single literal. If there was a match but the current match
       * is longer, truncate the previous match to a single literal.
       */
      //Tracevv((stderr,"%c", s->window[s->strstart-1]));
      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);

      if (bflush) {
        /*** FLUSH_BLOCK_ONLY(s, 0) ***/
        flush_block_only(s, false);
        /***/
      }
      s.strstart++;
      s.lookahead--;
      if (s.strm.avail_out === 0) {
        return BS_NEED_MORE;
      }
    } else {
      /* There is no previous match to compare with, wait for
       * the next step to decide.
       */
      s.match_available = 1;
      s.strstart++;
      s.lookahead--;
    }
  }
  //Assert (flush != Z_NO_FLUSH, "no flush?");
  if (s.match_available) {
    //Tracevv((stderr,"%c", s->window[s->strstart-1]));
    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);

    s.match_available = 0;
  }
  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;
  if (flush === Z_FINISH) {
    /*** FLUSH_BLOCK(s, 1); ***/
    flush_block_only(s, true);
    if (s.strm.avail_out === 0) {
      return BS_FINISH_STARTED;
    }
    /***/
    return BS_FINISH_DONE;
  }
  if (s.last_lit) {
    /*** FLUSH_BLOCK(s, 0); ***/
    flush_block_only(s, false);
    if (s.strm.avail_out === 0) {
      return BS_NEED_MORE;
    }
    /***/
  }

  return BS_BLOCK_DONE;
}


/* ===========================================================================
 * For Z_RLE, simply look for runs of bytes, generate matches only of distance
 * one.  Do not maintain a hash table.  (It will be regenerated if this run of
 * deflate switches away from Z_RLE.)
 */
function deflate_rle(s, flush) {
  var bflush;            /* set if current block must be flushed */
  var prev;              /* byte at distance one to match */
  var scan, strend;      /* scan goes up to strend for length of run */

  var _win = s.window;

  for (;;) {
    /* Make sure that we always have enough lookahead, except
     * at the end of the input file. We need MAX_MATCH bytes
     * for the longest run, plus one for the unrolled loop.
     */
    if (s.lookahead <= MAX_MATCH) {
      fill_window(s);
      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
        return BS_NEED_MORE;
      }
      if (s.lookahead === 0) { break; } /* flush the current block */
    }

    /* See how many times the previous byte repeats */
    s.match_length = 0;
    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
      scan = s.strstart - 1;
      prev = _win[scan];
      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
        strend = s.strstart + MAX_MATCH;
        do {
          /*jshint noempty:false*/
        } while (prev === _win[++scan] && prev === _win[++scan] &&
                 prev === _win[++scan] && prev === _win[++scan] &&
                 prev === _win[++scan] && prev === _win[++scan] &&
                 prev === _win[++scan] && prev === _win[++scan] &&
                 scan < strend);
        s.match_length = MAX_MATCH - (strend - scan);
        if (s.match_length > s.lookahead) {
          s.match_length = s.lookahead;
        }
      }
      //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
    }

    /* Emit match if have run of MIN_MATCH or longer, else emit literal */
    if (s.match_length >= MIN_MATCH) {
      //check_match(s, s.strstart, s.strstart - 1, s.match_length);

      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);

      s.lookahead -= s.match_length;
      s.strstart += s.match_length;
      s.match_length = 0;
    } else {
      /* No match, output a literal byte */
      //Tracevv((stderr,"%c", s->window[s->strstart]));
      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);

      s.lookahead--;
      s.strstart++;
    }
    if (bflush) {
      /*** FLUSH_BLOCK(s, 0); ***/
      flush_block_only(s, false);
      if (s.strm.avail_out === 0) {
        return BS_NEED_MORE;
      }
      /***/
    }
  }
  s.insert = 0;
  if (flush === Z_FINISH) {
    /*** FLUSH_BLOCK(s, 1); ***/
    flush_block_only(s, true);
    if (s.strm.avail_out === 0) {
      return BS_FINISH_STARTED;
    }
    /***/
    return BS_FINISH_DONE;
  }
  if (s.last_lit) {
    /*** FLUSH_BLOCK(s, 0); ***/
    flush_block_only(s, false);
    if (s.strm.avail_out === 0) {
      return BS_NEED_MORE;
    }
    /***/
  }
  return BS_BLOCK_DONE;
}

/* ===========================================================================
 * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
 * (It will be regenerated if this run of deflate switches away from Huffman.)
 */
function deflate_huff(s, flush) {
  var bflush;             /* set if current block must be flushed */

  for (;;) {
    /* Make sure that we have a literal to write. */
    if (s.lookahead === 0) {
      fill_window(s);
      if (s.lookahead === 0) {
        if (flush === Z_NO_FLUSH) {
          return BS_NEED_MORE;
        }
        break;      /* flush the current block */
      }
    }

    /* Output a literal byte */
    s.match_length = 0;
    //Tracevv((stderr,"%c", s->window[s->strstart]));
    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
    s.lookahead--;
    s.strstart++;
    if (bflush) {
      /*** FLUSH_BLOCK(s, 0); ***/
      flush_block_only(s, false);
      if (s.strm.avail_out === 0) {
        return BS_NEED_MORE;
      }
      /***/
    }
  }
  s.insert = 0;
  if (flush === Z_FINISH) {
    /*** FLUSH_BLOCK(s, 1); ***/
    flush_block_only(s, true);
    if (s.strm.avail_out === 0) {
      return BS_FINISH_STARTED;
    }
    /***/
    return BS_FINISH_DONE;
  }
  if (s.last_lit) {
    /*** FLUSH_BLOCK(s, 0); ***/
    flush_block_only(s, false);
    if (s.strm.avail_out === 0) {
      return BS_NEED_MORE;
    }
    /***/
  }
  return BS_BLOCK_DONE;
}

/* Values for max_lazy_match, good_match and max_chain_length, depending on
 * the desired pack level (0..9). The values given below have been tuned to
 * exclude worst case performance for pathological files. Better values may be
 * found for specific files.
 */
function Config(good_length, max_lazy, nice_length, max_chain, func) {
  this.good_length = good_length;
  this.max_lazy = max_lazy;
  this.nice_length = nice_length;
  this.max_chain = max_chain;
  this.func = func;
}

var configuration_table;

configuration_table = [
  /*      good lazy nice chain */
  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */
  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */
  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */
  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */

  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */
  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */
  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */
  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */
  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */
  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */
];


/* ===========================================================================
 * Initialize the "longest match" routines for a new zlib stream
 */
function lm_init(s) {
  s.window_size = 2 * s.w_size;

  /*** CLEAR_HASH(s); ***/
  zero(s.head); // Fill with NIL (= 0);

  /* Set the default configuration parameters:
   */
  s.max_lazy_match = configuration_table[s.level].max_lazy;
  s.good_match = configuration_table[s.level].good_length;
  s.nice_match = configuration_table[s.level].nice_length;
  s.max_chain_length = configuration_table[s.level].max_chain;

  s.strstart = 0;
  s.block_start = 0;
  s.lookahead = 0;
  s.insert = 0;
  s.match_length = s.prev_length = MIN_MATCH - 1;
  s.match_available = 0;
  s.ins_h = 0;
}


function DeflateState() {
  this.strm = null;            /* pointer back to this zlib stream */
  this.status = 0;            /* as the name implies */
  this.pending_buf = null;      /* output still pending */
  this.pending_buf_size = 0;  /* size of pending_buf */
  this.pending_out = 0;       /* next pending byte to output to the stream */
  this.pending = 0;           /* nb of bytes in the pending buffer */
  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
  this.gzhead = null;         /* gzip header information to write */
  this.gzindex = 0;           /* where in extra, name, or comment */
  this.method = Z_DEFLATED; /* can only be DEFLATED */
  this.last_flush = -1;   /* value of flush param for previous deflate call */

  this.w_size = 0;  /* LZ77 window size (32K by default) */
  this.w_bits = 0;  /* log2(w_size)  (8..16) */
  this.w_mask = 0;  /* w_size - 1 */

  this.window = null;
  /* Sliding window. Input bytes are read into the second half of the window,
   * and move to the first half later to keep a dictionary of at least wSize
   * bytes. With this organization, matches are limited to a distance of
   * wSize-MAX_MATCH bytes, but this ensures that IO is always
   * performed with a length multiple of the block size.
   */

  this.window_size = 0;
  /* Actual size of window: 2*wSize, except when the user input buffer
   * is directly used as sliding window.
   */

  this.prev = null;
  /* Link to older string with same hash index. To limit the size of this
   * array to 64K, this link is maintained only for the last 32K strings.
   * An index in this array is thus a window index modulo 32K.
   */

  this.head = null;   /* Heads of the hash chains or NIL. */

  this.ins_h = 0;       /* hash index of string to be inserted */
  this.hash_size = 0;   /* number of elements in hash table */
  this.hash_bits = 0;   /* log2(hash_size) */
  this.hash_mask = 0;   /* hash_size-1 */

  this.hash_shift = 0;
  /* Number of bits by which ins_h must be shifted at each input
   * step. It must be such that after MIN_MATCH steps, the oldest
   * byte no longer takes part in the hash key, that is:
   *   hash_shift * MIN_MATCH >= hash_bits
   */

  this.block_start = 0;
  /* Window position at the beginning of the current output block. Gets
   * negative when the window is moved backwards.
   */

  this.match_length = 0;      /* length of best match */
  this.prev_match = 0;        /* previous match */
  this.match_available = 0;   /* set if previous match exists */
  this.strstart = 0;          /* start of string to insert */
  this.match_start = 0;       /* start of matching string */
  this.lookahead = 0;         /* number of valid bytes ahead in window */

  this.prev_length = 0;
  /* Length of the best match at previous step. Matches not greater than this
   * are discarded. This is used in the lazy match evaluation.
   */

  this.max_chain_length = 0;
  /* To speed up deflation, hash chains are never searched beyond this
   * length.  A higher limit improves compression ratio but degrades the
   * speed.
   */

  this.max_lazy_match = 0;
  /* Attempt to find a better match only when the current match is strictly
   * smaller than this value. This mechanism is used only for compression
   * levels >= 4.
   */
  // That's alias to max_lazy_match, don't use directly
  //this.max_insert_length = 0;
  /* Insert new strings in the hash table only if the match length is not
   * greater than this length. This saves time but degrades compression.
   * max_insert_length is used only for compression levels <= 3.
   */

  this.level = 0;     /* compression level (1..9) */
  this.strategy = 0;  /* favor or force Huffman coding*/

  this.good_match = 0;
  /* Use a faster search when the previous match is longer than this */

  this.nice_match = 0; /* Stop searching when current match exceeds this */

              /* used by trees.c: */

  /* Didn't use ct_data typedef below to suppress compiler warning */

  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */

  // Use flat array of DOUBLE size, with interleaved fata,
  // because JS does not support effective
  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);
  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);
  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);
  zero(this.dyn_ltree);
  zero(this.dyn_dtree);
  zero(this.bl_tree);

  this.l_desc   = null;         /* desc. for literal tree */
  this.d_desc   = null;         /* desc. for distance tree */
  this.bl_desc  = null;         /* desc. for bit length tree */

  //ush bl_count[MAX_BITS+1];
  this.bl_count = new utils.Buf16(MAX_BITS + 1);
  /* number of codes at each bit length for an optimal tree */

  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */
  zero(this.heap);

  this.heap_len = 0;               /* number of elements in the heap */
  this.heap_max = 0;               /* element of largest frequency */
  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
   * The same heap array is used to build all trees.
   */

  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];
  zero(this.depth);
  /* Depth of each subtree used as tie breaker for trees of equal frequency
   */

  this.l_buf = 0;          /* buffer index for literals or lengths */

  this.lit_bufsize = 0;
  /* Size of match buffer for literals/lengths.  There are 4 reasons for
   * limiting lit_bufsize to 64K:
   *   - frequencies can be kept in 16 bit counters
   *   - if compression is not successful for the first block, all input
   *     data is still in the window so we can still emit a stored block even
   *     when input comes from standard input.  (This can also be done for
   *     all blocks if lit_bufsize is not greater than 32K.)
   *   - if compression is not successful for a file smaller than 64K, we can
   *     even emit a stored file instead of a stored block (saving 5 bytes).
   *     This is applicable only for zip (not gzip or zlib).
   *   - creating new Huffman trees less frequently may not provide fast
   *     adaptation to changes in the input data statistics. (Take for
   *     example a binary file with poorly compressible code followed by
   *     a highly compressible string table.) Smaller buffer sizes give
   *     fast adaptation but have of course the overhead of transmitting
   *     trees more frequently.
   *   - I can't count above 4
   */

  this.last_lit = 0;      /* running index in l_buf */

  this.d_buf = 0;
  /* Buffer index for distances. To simplify the code, d_buf and l_buf have
   * the same number of elements. To use different lengths, an extra flag
   * array would be necessary.
   */

  this.opt_len = 0;       /* bit length of current block with optimal trees */
  this.static_len = 0;    /* bit length of current block with static trees */
  this.matches = 0;       /* number of string matches in current block */
  this.insert = 0;        /* bytes at end of window left to insert */


  this.bi_buf = 0;
  /* Output buffer. bits are inserted starting at the bottom (least
   * significant bits).
   */
  this.bi_valid = 0;
  /* Number of valid bits in bi_buf.  All bits above the last valid bit
   * are always zero.
   */

  // Used for window memory init. We safely ignore it for JS. That makes
  // sense only for pointers and memory check tools.
  //this.high_water = 0;
  /* High water mark offset in window for initialized bytes -- bytes above
   * this are set to zero in order to avoid memory check warnings when
   * longest match routines access bytes past the input.  This is then
   * updated to the new high water mark.
   */
}


function deflateResetKeep(strm) {
  var s;

  if (!strm || !strm.state) {
    return err(strm, Z_STREAM_ERROR);
  }

  strm.total_in = strm.total_out = 0;
  strm.data_type = Z_UNKNOWN;

  s = strm.state;
  s.pending = 0;
  s.pending_out = 0;

  if (s.wrap < 0) {
    s.wrap = -s.wrap;
    /* was made negative by deflate(..., Z_FINISH); */
  }
  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
  strm.adler = (s.wrap === 2) ?
    0  // crc32(0, Z_NULL, 0)
  :
    1; // adler32(0, Z_NULL, 0)
  s.last_flush = Z_NO_FLUSH;
  trees._tr_init(s);
  return Z_OK;
}


function deflateReset(strm) {
  var ret = deflateResetKeep(strm);
  if (ret === Z_OK) {
    lm_init(strm.state);
  }
  return ret;
}


function deflateSetHeader(strm, head) {
  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
  strm.state.gzhead = head;
  return Z_OK;
}


function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
  if (!strm) { // === Z_NULL
    return Z_STREAM_ERROR;
  }
  var wrap = 1;

  if (level === Z_DEFAULT_COMPRESSION) {
    level = 6;
  }

  if (windowBits < 0) { /* suppress zlib wrapper */
    wrap = 0;
    windowBits = -windowBits;
  }

  else if (windowBits > 15) {
    wrap = 2;           /* write gzip wrapper instead */
    windowBits -= 16;
  }


  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
    strategy < 0 || strategy > Z_FIXED) {
    return err(strm, Z_STREAM_ERROR);
  }


  if (windowBits === 8) {
    windowBits = 9;
  }
  /* until 256-byte window bug fixed */

  var s = new DeflateState();

  strm.state = s;
  s.strm = strm;

  s.wrap = wrap;
  s.gzhead = null;
  s.w_bits = windowBits;
  s.w_size = 1 << s.w_bits;
  s.w_mask = s.w_size - 1;

  s.hash_bits = memLevel + 7;
  s.hash_size = 1 << s.hash_bits;
  s.hash_mask = s.hash_size - 1;
  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);

  s.window = new utils.Buf8(s.w_size * 2);
  s.head = new utils.Buf16(s.hash_size);
  s.prev = new utils.Buf16(s.w_size);

  // Don't need mem init magic for JS.
  //s.high_water = 0;  /* nothing written to s->window yet */

  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */

  s.pending_buf_size = s.lit_bufsize * 4;

  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
  //s->pending_buf = (uchf *) overlay;
  s.pending_buf = new utils.Buf8(s.pending_buf_size);

  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)
  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
  s.d_buf = 1 * s.lit_bufsize;

  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
  s.l_buf = (1 + 2) * s.lit_bufsize;

  s.level = level;
  s.strategy = strategy;
  s.method = method;

  return deflateReset(strm);
}

function deflateInit(strm, level) {
  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
}


function deflate(strm, flush) {
  var old_flush, s;
  var beg, val; // for gzip header write only

  if (!strm || !strm.state ||
    flush > Z_BLOCK || flush < 0) {
    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
  }

  s = strm.state;

  if (!strm.output ||
      (!strm.input && strm.avail_in !== 0) ||
      (s.status === FINISH_STATE && flush !== Z_FINISH)) {
    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
  }

  s.strm = strm; /* just in case */
  old_flush = s.last_flush;
  s.last_flush = flush;

  /* Write the header */
  if (s.status === INIT_STATE) {

    if (s.wrap === 2) { // GZIP header
      strm.adler = 0;  //crc32(0L, Z_NULL, 0);
      put_byte(s, 31);
      put_byte(s, 139);
      put_byte(s, 8);
      if (!s.gzhead) { // s->gzhead == Z_NULL
        put_byte(s, 0);
        put_byte(s, 0);
        put_byte(s, 0);
        put_byte(s, 0);
        put_byte(s, 0);
        put_byte(s, s.level === 9 ? 2 :
                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
                     4 : 0));
        put_byte(s, OS_CODE);
        s.status = BUSY_STATE;
      }
      else {
        put_byte(s, (s.gzhead.text ? 1 : 0) +
                    (s.gzhead.hcrc ? 2 : 0) +
                    (!s.gzhead.extra ? 0 : 4) +
                    (!s.gzhead.name ? 0 : 8) +
                    (!s.gzhead.comment ? 0 : 16)
        );
        put_byte(s, s.gzhead.time & 0xff);
        put_byte(s, (s.gzhead.time >> 8) & 0xff);
        put_byte(s, (s.gzhead.time >> 16) & 0xff);
        put_byte(s, (s.gzhead.time >> 24) & 0xff);
        put_byte(s, s.level === 9 ? 2 :
                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
                     4 : 0));
        put_byte(s, s.gzhead.os & 0xff);
        if (s.gzhead.extra && s.gzhead.extra.length) {
          put_byte(s, s.gzhead.extra.length & 0xff);
          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
        }
        if (s.gzhead.hcrc) {
          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
        }
        s.gzindex = 0;
        s.status = EXTRA_STATE;
      }
    }
    else // DEFLATE header
    {
      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
      var level_flags = -1;

      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
        level_flags = 0;
      } else if (s.level < 6) {
        level_flags = 1;
      } else if (s.level === 6) {
        level_flags = 2;
      } else {
        level_flags = 3;
      }
      header |= (level_flags << 6);
      if (s.strstart !== 0) { header |= PRESET_DICT; }
      header += 31 - (header % 31);

      s.status = BUSY_STATE;
      putShortMSB(s, header);

      /* Save the adler32 of the preset dictionary: */
      if (s.strstart !== 0) {
        putShortMSB(s, strm.adler >>> 16);
        putShortMSB(s, strm.adler & 0xffff);
      }
      strm.adler = 1; // adler32(0L, Z_NULL, 0);
    }
  }

//#ifdef GZIP
  if (s.status === EXTRA_STATE) {
    if (s.gzhead.extra/* != Z_NULL*/) {
      beg = s.pending;  /* start of bytes to update crc */

      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
        if (s.pending === s.pending_buf_size) {
          if (s.gzhead.hcrc && s.pending > beg) {
            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
          }
          flush_pending(strm);
          beg = s.pending;
          if (s.pending === s.pending_buf_size) {
            break;
          }
        }
        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
        s.gzindex++;
      }
      if (s.gzhead.hcrc && s.pending > beg) {
        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
      }
      if (s.gzindex === s.gzhead.extra.length) {
        s.gzindex = 0;
        s.status = NAME_STATE;
      }
    }
    else {
      s.status = NAME_STATE;
    }
  }
  if (s.status === NAME_STATE) {
    if (s.gzhead.name/* != Z_NULL*/) {
      beg = s.pending;  /* start of bytes to update crc */
      //int val;

      do {
        if (s.pending === s.pending_buf_size) {
          if (s.gzhead.hcrc && s.pending > beg) {
            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
          }
          flush_pending(strm);
          beg = s.pending;
          if (s.pending === s.pending_buf_size) {
            val = 1;
            break;
          }
        }
        // JS specific: little magic to add zero terminator to end of string
        if (s.gzindex < s.gzhead.name.length) {
          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
        } else {
          val = 0;
        }
        put_byte(s, val);
      } while (val !== 0);

      if (s.gzhead.hcrc && s.pending > beg) {
        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
      }
      if (val === 0) {
        s.gzindex = 0;
        s.status = COMMENT_STATE;
      }
    }
    else {
      s.status = COMMENT_STATE;
    }
  }
  if (s.status === COMMENT_STATE) {
    if (s.gzhead.comment/* != Z_NULL*/) {
      beg = s.pending;  /* start of bytes to update crc */
      //int val;

      do {
        if (s.pending === s.pending_buf_size) {
          if (s.gzhead.hcrc && s.pending > beg) {
            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
          }
          flush_pending(strm);
          beg = s.pending;
          if (s.pending === s.pending_buf_size) {
            val = 1;
            break;
          }
        }
        // JS specific: little magic to add zero terminator to end of string
        if (s.gzindex < s.gzhead.comment.length) {
          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
        } else {
          val = 0;
        }
        put_byte(s, val);
      } while (val !== 0);

      if (s.gzhead.hcrc && s.pending > beg) {
        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
      }
      if (val === 0) {
        s.status = HCRC_STATE;
      }
    }
    else {
      s.status = HCRC_STATE;
    }
  }
  if (s.status === HCRC_STATE) {
    if (s.gzhead.hcrc) {
      if (s.pending + 2 > s.pending_buf_size) {
        flush_pending(strm);
      }
      if (s.pending + 2 <= s.pending_buf_size) {
        put_byte(s, strm.adler & 0xff);
        put_byte(s, (strm.adler >> 8) & 0xff);
        strm.adler = 0; //crc32(0L, Z_NULL, 0);
        s.status = BUSY_STATE;
      }
    }
    else {
      s.status = BUSY_STATE;
    }
  }
//#endif

  /* Flush as much pending output as possible */
  if (s.pending !== 0) {
    flush_pending(strm);
    if (strm.avail_out === 0) {
      /* Since avail_out is 0, deflate will be called again with
       * more output space, but possibly with both pending and
       * avail_in equal to zero. There won't be anything to do,
       * but this is not an error situation so make sure we
       * return OK instead of BUF_ERROR at next call of deflate:
       */
      s.last_flush = -1;
      return Z_OK;
    }

    /* Make sure there is something to do and avoid duplicate consecutive
     * flushes. For repeated and useless calls with Z_FINISH, we keep
     * returning Z_STREAM_END instead of Z_BUF_ERROR.
     */
  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
    flush !== Z_FINISH) {
    return err(strm, Z_BUF_ERROR);
  }

  /* User must not provide more input after the first FINISH: */
  if (s.status === FINISH_STATE && strm.avail_in !== 0) {
    return err(strm, Z_BUF_ERROR);
  }

  /* Start a new block or continue the current one.
   */
  if (strm.avail_in !== 0 || s.lookahead !== 0 ||
    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
      (s.strategy === Z_RLE ? deflate_rle(s, flush) :
        configuration_table[s.level].func(s, flush));

    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
      s.status = FINISH_STATE;
    }
    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
      if (strm.avail_out === 0) {
        s.last_flush = -1;
        /* avoid BUF_ERROR next call, see above */
      }
      return Z_OK;
      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
       * of deflate should use the same flush parameter to make sure
       * that the flush is complete. So we don't have to output an
       * empty block here, this will be done at next call. This also
       * ensures that for a very small output buffer, we emit at most
       * one empty block.
       */
    }
    if (bstate === BS_BLOCK_DONE) {
      if (flush === Z_PARTIAL_FLUSH) {
        trees._tr_align(s);
      }
      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */

        trees._tr_stored_block(s, 0, 0, false);
        /* For a full flush, this empty block will be recognized
         * as a special marker by inflate_sync().
         */
        if (flush === Z_FULL_FLUSH) {
          /*** CLEAR_HASH(s); ***/             /* forget history */
          zero(s.head); // Fill with NIL (= 0);

          if (s.lookahead === 0) {
            s.strstart = 0;
            s.block_start = 0;
            s.insert = 0;
          }
        }
      }
      flush_pending(strm);
      if (strm.avail_out === 0) {
        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
        return Z_OK;
      }
    }
  }
  //Assert(strm->avail_out > 0, "bug2");
  //if (strm.avail_out <= 0) { throw new Error("bug2");}

  if (flush !== Z_FINISH) { return Z_OK; }
  if (s.wrap <= 0) { return Z_STREAM_END; }

  /* Write the trailer */
  if (s.wrap === 2) {
    put_byte(s, strm.adler & 0xff);
    put_byte(s, (strm.adler >> 8) & 0xff);
    put_byte(s, (strm.adler >> 16) & 0xff);
    put_byte(s, (strm.adler >> 24) & 0xff);
    put_byte(s, strm.total_in & 0xff);
    put_byte(s, (strm.total_in >> 8) & 0xff);
    put_byte(s, (strm.total_in >> 16) & 0xff);
    put_byte(s, (strm.total_in >> 24) & 0xff);
  }
  else
  {
    putShortMSB(s, strm.adler >>> 16);
    putShortMSB(s, strm.adler & 0xffff);
  }

  flush_pending(strm);
  /* If avail_out is zero, the application will call deflate again
   * to flush the rest.
   */
  if (s.wrap > 0) { s.wrap = -s.wrap; }
  /* write the trailer only once! */
  return s.pending !== 0 ? Z_OK : Z_STREAM_END;
}

function deflateEnd(strm) {
  var status;

  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
    return Z_STREAM_ERROR;
  }

  status = strm.state.status;
  if (status !== INIT_STATE &&
    status !== EXTRA_STATE &&
    status !== NAME_STATE &&
    status !== COMMENT_STATE &&
    status !== HCRC_STATE &&
    status !== BUSY_STATE &&
    status !== FINISH_STATE
  ) {
    return err(strm, Z_STREAM_ERROR);
  }

  strm.state = null;

  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
}


/* =========================================================================
 * Initializes the compression dictionary from the given byte
 * sequence without producing any compressed output.
 */
function deflateSetDictionary(strm, dictionary) {
  var dictLength = dictionary.length;

  var s;
  var str, n;
  var wrap;
  var avail;
  var next;
  var input;
  var tmpDict;

  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
    return Z_STREAM_ERROR;
  }

  s = strm.state;
  wrap = s.wrap;

  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {
    return Z_STREAM_ERROR;
  }

  /* when using zlib wrappers, compute Adler-32 for provided dictionary */
  if (wrap === 1) {
    /* adler32(strm->adler, dictionary, dictLength); */
    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);
  }

  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */

  /* if dictionary would fill window, just replace the history */
  if (dictLength >= s.w_size) {
    if (wrap === 0) {            /* already empty otherwise */
      /*** CLEAR_HASH(s); ***/
      zero(s.head); // Fill with NIL (= 0);
      s.strstart = 0;
      s.block_start = 0;
      s.insert = 0;
    }
    /* use the tail */
    // dictionary = dictionary.slice(dictLength - s.w_size);
    tmpDict = new utils.Buf8(s.w_size);
    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);
    dictionary = tmpDict;
    dictLength = s.w_size;
  }
  /* insert dictionary into window and hash */
  avail = strm.avail_in;
  next = strm.next_in;
  input = strm.input;
  strm.avail_in = dictLength;
  strm.next_in = 0;
  strm.input = dictionary;
  fill_window(s);
  while (s.lookahead >= MIN_MATCH) {
    str = s.strstart;
    n = s.lookahead - (MIN_MATCH - 1);
    do {
      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;

      s.prev[str & s.w_mask] = s.head[s.ins_h];

      s.head[s.ins_h] = str;
      str++;
    } while (--n);
    s.strstart = str;
    s.lookahead = MIN_MATCH - 1;
    fill_window(s);
  }
  s.strstart += s.lookahead;
  s.block_start = s.strstart;
  s.insert = s.lookahead;
  s.lookahead = 0;
  s.match_length = s.prev_length = MIN_MATCH - 1;
  s.match_available = 0;
  strm.next_in = next;
  strm.input = input;
  strm.avail_in = avail;
  s.wrap = wrap;
  return Z_OK;
}


exports.deflateInit = deflateInit;
exports.deflateInit2 = deflateInit2;
exports.deflateReset = deflateReset;
exports.deflateResetKeep = deflateResetKeep;
exports.deflateSetHeader = deflateSetHeader;
exports.deflate = deflate;
exports.deflateEnd = deflateEnd;
exports.deflateSetDictionary = deflateSetDictionary;
exports.deflateInfo = 'pako deflate (from Nodeca project)';

/* Not implemented
exports.deflateBound = deflateBound;
exports.deflateCopy = deflateCopy;
exports.deflateParams = deflateParams;
exports.deflatePending = deflatePending;
exports.deflatePrime = deflatePrime;
exports.deflateTune = deflateTune;
*/

},{"../utils/common":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/utils/common.js","./adler32":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/adler32.js","./crc32":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/crc32.js","./messages":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/messages.js","./trees":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/trees.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/inffast.js":[function(require,module,exports){
'use strict';

// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//   claim that you wrote the original software. If you use this software
//   in a product, an acknowledgment in the product documentation would be
//   appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
//   misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.

// See state defs from inflate.js
var BAD = 30;       /* got a data error -- remain here until reset */
var TYPE = 12;      /* i: waiting for type bits, including last-flag bit */

/*
   Decode literal, length, and distance codes and write out the resulting
   literal and match bytes until either not enough input or output is
   available, an end-of-block is encountered, or a data error is encountered.
   When large enough input and output buffers are supplied to inflate(), for
   example, a 16K input buffer and a 64K output buffer, more than 95% of the
   inflate execution time is spent in this routine.

   Entry assumptions:

        state.mode === LEN
        strm.avail_in >= 6
        strm.avail_out >= 258
        start >= strm.avail_out
        state.bits < 8

   On return, state.mode is one of:

        LEN -- ran out of enough output space or enough available input
        TYPE -- reached end of block code, inflate() to interpret next block
        BAD -- error in block data

   Notes:

    - The maximum input bits used by a length/distance pair is 15 bits for the
      length code, 5 bits for the length extra, 15 bits for the distance code,
      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
      Therefore if strm.avail_in >= 6, then there is enough input to avoid
      checking for available input while decoding.

    - The maximum bytes that a single length/distance pair can output is 258
      bytes, which is the maximum length that can be coded.  inflate_fast()
      requires strm.avail_out >= 258 for each loop to avoid checking for
      output space.
 */
module.exports = function inflate_fast(strm, start) {
  var state;
  var _in;                    /* local strm.input */
  var last;                   /* have enough input while in < last */
  var _out;                   /* local strm.output */
  var beg;                    /* inflate()'s initial strm.output */
  var end;                    /* while out < end, enough space available */
//#ifdef INFLATE_STRICT
  var dmax;                   /* maximum distance from zlib header */
//#endif
  var wsize;                  /* window size or zero if not using window */
  var whave;                  /* valid bytes in the window */
  var wnext;                  /* window write index */
  // Use `s_window` instead `window`, avoid conflict with instrumentation tools
  var s_window;               /* allocated sliding window, if wsize != 0 */
  var hold;                   /* local strm.hold */
  var bits;                   /* local strm.bits */
  var lcode;                  /* local strm.lencode */
  var dcode;                  /* local strm.distcode */
  var lmask;                  /* mask for first level of length codes */
  var dmask;                  /* mask for first level of distance codes */
  var here;                   /* retrieved table entry */
  var op;                     /* code bits, operation, extra bits, or */
                              /*  window position, window bytes to copy */
  var len;                    /* match length, unused bytes */
  var dist;                   /* match distance */
  var from;                   /* where to copy match from */
  var from_source;


  var input, output; // JS specific, because we have no pointers

  /* copy state to local variables */
  state = strm.state;
  //here = state.here;
  _in = strm.next_in;
  input = strm.input;
  last = _in + (strm.avail_in - 5);
  _out = strm.next_out;
  output = strm.output;
  beg = _out - (start - strm.avail_out);
  end = _out + (strm.avail_out - 257);
//#ifdef INFLATE_STRICT
  dmax = state.dmax;
//#endif
  wsize = state.wsize;
  whave = state.whave;
  wnext = state.wnext;
  s_window = state.window;
  hold = state.hold;
  bits = state.bits;
  lcode = state.lencode;
  dcode = state.distcode;
  lmask = (1 << state.lenbits) - 1;
  dmask = (1 << state.distbits) - 1;


  /* decode literals and length/distances until end-of-block or not enough
     input data or output space */

  top:
  do {
    if (bits < 15) {
      hold += input[_in++] << bits;
      bits += 8;
      hold += input[_in++] << bits;
      bits += 8;
    }

    here = lcode[hold & lmask];

    dolen:
    for (;;) { // Goto emulation
      op = here >>> 24/*here.bits*/;
      hold >>>= op;
      bits -= op;
      op = (here >>> 16) & 0xff/*here.op*/;
      if (op === 0) {                          /* literal */
        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
        //        "inflate:         literal '%c'\n" :
        //        "inflate:         literal 0x%02x\n", here.val));
        output[_out++] = here & 0xffff/*here.val*/;
      }
      else if (op & 16) {                     /* length base */
        len = here & 0xffff/*here.val*/;
        op &= 15;                           /* number of extra bits */
        if (op) {
          if (bits < op) {
            hold += input[_in++] << bits;
            bits += 8;
          }
          len += hold & ((1 << op) - 1);
          hold >>>= op;
          bits -= op;
        }
        //Tracevv((stderr, "inflate:         length %u\n", len));
        if (bits < 15) {
          hold += input[_in++] << bits;
          bits += 8;
          hold += input[_in++] << bits;
          bits += 8;
        }
        here = dcode[hold & dmask];

        dodist:
        for (;;) { // goto emulation
          op = here >>> 24/*here.bits*/;
          hold >>>= op;
          bits -= op;
          op = (here >>> 16) & 0xff/*here.op*/;

          if (op & 16) {                      /* distance base */
            dist = here & 0xffff/*here.val*/;
            op &= 15;                       /* number of extra bits */
            if (bits < op) {
              hold += input[_in++] << bits;
              bits += 8;
              if (bits < op) {
                hold += input[_in++] << bits;
                bits += 8;
              }
            }
            dist += hold & ((1 << op) - 1);
//#ifdef INFLATE_STRICT
            if (dist > dmax) {
              strm.msg = 'invalid distance too far back';
              state.mode = BAD;
              break top;
            }
//#endif
            hold >>>= op;
            bits -= op;
            //Tracevv((stderr, "inflate:         distance %u\n", dist));
            op = _out - beg;                /* max distance in output */
            if (dist > op) {                /* see if copy from window */
              op = dist - op;               /* distance back in window */
              if (op > whave) {
                if (state.sane) {
                  strm.msg = 'invalid distance too far back';
                  state.mode = BAD;
                  break top;
                }

// (!) This block is disabled in zlib defaults,
// don't enable it for binary compatibility
//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
//                if (len <= op - whave) {
//                  do {
//                    output[_out++] = 0;
//                  } while (--len);
//                  continue top;
//                }
//                len -= op - whave;
//                do {
//                  output[_out++] = 0;
//                } while (--op > whave);
//                if (op === 0) {
//                  from = _out - dist;
//                  do {
//                    output[_out++] = output[from++];
//                  } while (--len);
//                  continue top;
//                }
//#endif
              }
              from = 0; // window index
              from_source = s_window;
              if (wnext === 0) {           /* very common case */
                from += wsize - op;
                if (op < len) {         /* some from window */
                  len -= op;
                  do {
                    output[_out++] = s_window[from++];
                  } while (--op);
                  from = _out - dist;  /* rest from output */
                  from_source = output;
                }
              }
              else if (wnext < op) {      /* wrap around window */
                from += wsize + wnext - op;
                op -= wnext;
                if (op < len) {         /* some from end of window */
                  len -= op;
                  do {
                    output[_out++] = s_window[from++];
                  } while (--op);
                  from = 0;
                  if (wnext < len) {  /* some from start of window */
                    op = wnext;
                    len -= op;
                    do {
                      output[_out++] = s_window[from++];
                    } while (--op);
                    from = _out - dist;      /* rest from output */
                    from_source = output;
                  }
                }
              }
              else {                      /* contiguous in window */
                from += wnext - op;
                if (op < len) {         /* some from window */
                  len -= op;
                  do {
                    output[_out++] = s_window[from++];
                  } while (--op);
                  from = _out - dist;  /* rest from output */
                  from_source = output;
                }
              }
              while (len > 2) {
                output[_out++] = from_source[from++];
                output[_out++] = from_source[from++];
                output[_out++] = from_source[from++];
                len -= 3;
              }
              if (len) {
                output[_out++] = from_source[from++];
                if (len > 1) {
                  output[_out++] = from_source[from++];
                }
              }
            }
            else {
              from = _out - dist;          /* copy direct from output */
              do {                        /* minimum length is three */
                output[_out++] = output[from++];
                output[_out++] = output[from++];
                output[_out++] = output[from++];
                len -= 3;
              } while (len > 2);
              if (len) {
                output[_out++] = output[from++];
                if (len > 1) {
                  output[_out++] = output[from++];
                }
              }
            }
          }
          else if ((op & 64) === 0) {          /* 2nd level distance code */
            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
            continue dodist;
          }
          else {
            strm.msg = 'invalid distance code';
            state.mode = BAD;
            break top;
          }

          break; // need to emulate goto via "continue"
        }
      }
      else if ((op & 64) === 0) {              /* 2nd level length code */
        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
        continue dolen;
      }
      else if (op & 32) {                     /* end-of-block */
        //Tracevv((stderr, "inflate:         end of block\n"));
        state.mode = TYPE;
        break top;
      }
      else {
        strm.msg = 'invalid literal/length code';
        state.mode = BAD;
        break top;
      }

      break; // need to emulate goto via "continue"
    }
  } while (_in < last && _out < end);

  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
  len = bits >> 3;
  _in -= len;
  bits -= len << 3;
  hold &= (1 << bits) - 1;

  /* update state and return */
  strm.next_in = _in;
  strm.next_out = _out;
  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
  state.hold = hold;
  state.bits = bits;
  return;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/inflate.js":[function(require,module,exports){
'use strict';

// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//   claim that you wrote the original software. If you use this software
//   in a product, an acknowledgment in the product documentation would be
//   appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
//   misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.

var utils         = require('../utils/common');
var adler32       = require('./adler32');
var crc32         = require('./crc32');
var inflate_fast  = require('./inffast');
var inflate_table = require('./inftrees');

var CODES = 0;
var LENS = 1;
var DISTS = 2;

/* Public constants ==========================================================*/
/* ===========================================================================*/


/* Allowed flush values; see deflate() and inflate() below for details */
//var Z_NO_FLUSH      = 0;
//var Z_PARTIAL_FLUSH = 1;
//var Z_SYNC_FLUSH    = 2;
//var Z_FULL_FLUSH    = 3;
var Z_FINISH        = 4;
var Z_BLOCK         = 5;
var Z_TREES         = 6;


/* Return codes for the compression/decompression functions. Negative values
 * are errors, positive values are used for special but normal events.
 */
var Z_OK            = 0;
var Z_STREAM_END    = 1;
var Z_NEED_DICT     = 2;
//var Z_ERRNO         = -1;
var Z_STREAM_ERROR  = -2;
var Z_DATA_ERROR    = -3;
var Z_MEM_ERROR     = -4;
var Z_BUF_ERROR     = -5;
//var Z_VERSION_ERROR = -6;

/* The deflate compression method */
var Z_DEFLATED  = 8;


/* STATES ====================================================================*/
/* ===========================================================================*/


var    HEAD = 1;       /* i: waiting for magic header */
var    FLAGS = 2;      /* i: waiting for method and flags (gzip) */
var    TIME = 3;       /* i: waiting for modification time (gzip) */
var    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */
var    EXLEN = 5;      /* i: waiting for extra length (gzip) */
var    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */
var    NAME = 7;       /* i: waiting for end of file name (gzip) */
var    COMMENT = 8;    /* i: waiting for end of comment (gzip) */
var    HCRC = 9;       /* i: waiting for header crc (gzip) */
var    DICTID = 10;    /* i: waiting for dictionary check value */
var    DICT = 11;      /* waiting for inflateSetDictionary() call */
var        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
var        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */
var        STORED = 14;    /* i: waiting for stored size (length and complement) */
var        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */
var        COPY = 16;      /* i/o: waiting for input or output to copy stored block */
var        TABLE = 17;     /* i: waiting for dynamic block table lengths */
var        LENLENS = 18;   /* i: waiting for code length code lengths */
var        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */
var            LEN_ = 20;      /* i: same as LEN below, but only first time in */
var            LEN = 21;       /* i: waiting for length/lit/eob code */
var            LENEXT = 22;    /* i: waiting for length extra bits */
var            DIST = 23;      /* i: waiting for distance code */
var            DISTEXT = 24;   /* i: waiting for distance extra bits */
var            MATCH = 25;     /* o: waiting for output space to copy string */
var            LIT = 26;       /* o: waiting for output space to write literal */
var    CHECK = 27;     /* i: waiting for 32-bit check value */
var    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */
var    DONE = 29;      /* finished check, done -- remain here until reset */
var    BAD = 30;       /* got a data error -- remain here until reset */
var    MEM = 31;       /* got an inflate() memory error -- remain here until reset */
var    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */

/* ===========================================================================*/



var ENOUGH_LENS = 852;
var ENOUGH_DISTS = 592;
//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);

var MAX_WBITS = 15;
/* 32K LZ77 window */
var DEF_WBITS = MAX_WBITS;


function zswap32(q) {
  return  (((q >>> 24) & 0xff) +
          ((q >>> 8) & 0xff00) +
          ((q & 0xff00) << 8) +
          ((q & 0xff) << 24));
}


function InflateState() {
  this.mode = 0;             /* current inflate mode */
  this.last = false;          /* true if processing last block */
  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
  this.havedict = false;      /* true if dictionary provided */
  this.flags = 0;             /* gzip header method and flags (0 if zlib) */
  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
  this.check = 0;             /* protected copy of check value */
  this.total = 0;             /* protected copy of output count */
  // TODO: may be {}
  this.head = null;           /* where to save gzip header information */

  /* sliding window */
  this.wbits = 0;             /* log base 2 of requested window size */
  this.wsize = 0;             /* window size or zero if not using window */
  this.whave = 0;             /* valid bytes in the window */
  this.wnext = 0;             /* window write index */
  this.window = null;         /* allocated sliding window, if needed */

  /* bit accumulator */
  this.hold = 0;              /* input bit accumulator */
  this.bits = 0;              /* number of bits in "in" */

  /* for string and stored block copying */
  this.length = 0;            /* literal or length of data to copy */
  this.offset = 0;            /* distance back to copy string from */

  /* for table and code decoding */
  this.extra = 0;             /* extra bits needed */

  /* fixed and dynamic code tables */
  this.lencode = null;          /* starting table for length/literal codes */
  this.distcode = null;         /* starting table for distance codes */
  this.lenbits = 0;           /* index bits for lencode */
  this.distbits = 0;          /* index bits for distcode */

  /* dynamic table building */
  this.ncode = 0;             /* number of code length code lengths */
  this.nlen = 0;              /* number of length code lengths */
  this.ndist = 0;             /* number of distance code lengths */
  this.have = 0;              /* number of code lengths in lens[] */
  this.next = null;              /* next available space in codes[] */

  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
  this.work = new utils.Buf16(288); /* work area for code table building */

  /*
   because we don't have pointers in js, we use lencode and distcode directly
   as buffers so we don't need codes
  */
  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */
  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */
  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */
  this.sane = 0;                   /* if false, allow invalid distance too far */
  this.back = 0;                   /* bits back of last unprocessed length/lit */
  this.was = 0;                    /* initial length of match */
}

function inflateResetKeep(strm) {
  var state;

  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  state = strm.state;
  strm.total_in = strm.total_out = state.total = 0;
  strm.msg = ''; /*Z_NULL*/
  if (state.wrap) {       /* to support ill-conceived Java test suite */
    strm.adler = state.wrap & 1;
  }
  state.mode = HEAD;
  state.last = 0;
  state.havedict = 0;
  state.dmax = 32768;
  state.head = null/*Z_NULL*/;
  state.hold = 0;
  state.bits = 0;
  //state.lencode = state.distcode = state.next = state.codes;
  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);

  state.sane = 1;
  state.back = -1;
  //Tracev((stderr, "inflate: reset\n"));
  return Z_OK;
}

function inflateReset(strm) {
  var state;

  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  state = strm.state;
  state.wsize = 0;
  state.whave = 0;
  state.wnext = 0;
  return inflateResetKeep(strm);

}

function inflateReset2(strm, windowBits) {
  var wrap;
  var state;

  /* get the state */
  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  state = strm.state;

  /* extract wrap request from windowBits parameter */
  if (windowBits < 0) {
    wrap = 0;
    windowBits = -windowBits;
  }
  else {
    wrap = (windowBits >> 4) + 1;
    if (windowBits < 48) {
      windowBits &= 15;
    }
  }

  /* set number of window bits, free window if different */
  if (windowBits && (windowBits < 8 || windowBits > 15)) {
    return Z_STREAM_ERROR;
  }
  if (state.window !== null && state.wbits !== windowBits) {
    state.window = null;
  }

  /* update state and reset the rest of it */
  state.wrap = wrap;
  state.wbits = windowBits;
  return inflateReset(strm);
}

function inflateInit2(strm, windowBits) {
  var ret;
  var state;

  if (!strm) { return Z_STREAM_ERROR; }
  //strm.msg = Z_NULL;                 /* in case we return an error */

  state = new InflateState();

  //if (state === Z_NULL) return Z_MEM_ERROR;
  //Tracev((stderr, "inflate: allocated\n"));
  strm.state = state;
  state.window = null/*Z_NULL*/;
  ret = inflateReset2(strm, windowBits);
  if (ret !== Z_OK) {
    strm.state = null/*Z_NULL*/;
  }
  return ret;
}

function inflateInit(strm) {
  return inflateInit2(strm, DEF_WBITS);
}


/*
 Return state with length and distance decoding tables and index sizes set to
 fixed code decoding.  Normally this returns fixed tables from inffixed.h.
 If BUILDFIXED is defined, then instead this routine builds the tables the
 first time it's called, and returns those tables the first time and
 thereafter.  This reduces the size of the code by about 2K bytes, in
 exchange for a little execution time.  However, BUILDFIXED should not be
 used for threaded applications, since the rewriting of the tables and virgin
 may not be thread-safe.
 */
var virgin = true;

var lenfix, distfix; // We have no pointers in JS, so keep tables separate

function fixedtables(state) {
  /* build fixed huffman tables if first call (may not be thread safe) */
  if (virgin) {
    var sym;

    lenfix = new utils.Buf32(512);
    distfix = new utils.Buf32(32);

    /* literal/length table */
    sym = 0;
    while (sym < 144) { state.lens[sym++] = 8; }
    while (sym < 256) { state.lens[sym++] = 9; }
    while (sym < 280) { state.lens[sym++] = 7; }
    while (sym < 288) { state.lens[sym++] = 8; }

    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });

    /* distance table */
    sym = 0;
    while (sym < 32) { state.lens[sym++] = 5; }

    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });

    /* do this just once */
    virgin = false;
  }

  state.lencode = lenfix;
  state.lenbits = 9;
  state.distcode = distfix;
  state.distbits = 5;
}


/*
 Update the window with the last wsize (normally 32K) bytes written before
 returning.  If window does not exist yet, create it.  This is only called
 when a window is already in use, or when output has been written during this
 inflate call, but the end of the deflate stream has not been reached yet.
 It is also called to create a window for dictionary data when a dictionary
 is loaded.

 Providing output buffers larger than 32K to inflate() should provide a speed
 advantage, since only the last 32K of output is copied to the sliding window
 upon return from inflate(), and since all distances after the first 32K of
 output will fall in the output data, making match copies simpler and faster.
 The advantage may be dependent on the size of the processor's data caches.
 */
function updatewindow(strm, src, end, copy) {
  var dist;
  var state = strm.state;

  /* if it hasn't been done already, allocate space for the window */
  if (state.window === null) {
    state.wsize = 1 << state.wbits;
    state.wnext = 0;
    state.whave = 0;

    state.window = new utils.Buf8(state.wsize);
  }

  /* copy state->wsize or less output bytes into the circular window */
  if (copy >= state.wsize) {
    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
    state.wnext = 0;
    state.whave = state.wsize;
  }
  else {
    dist = state.wsize - state.wnext;
    if (dist > copy) {
      dist = copy;
    }
    //zmemcpy(state->window + state->wnext, end - copy, dist);
    utils.arraySet(state.window, src, end - copy, dist, state.wnext);
    copy -= dist;
    if (copy) {
      //zmemcpy(state->window, end - copy, copy);
      utils.arraySet(state.window, src, end - copy, copy, 0);
      state.wnext = copy;
      state.whave = state.wsize;
    }
    else {
      state.wnext += dist;
      if (state.wnext === state.wsize) { state.wnext = 0; }
      if (state.whave < state.wsize) { state.whave += dist; }
    }
  }
  return 0;
}

function inflate(strm, flush) {
  var state;
  var input, output;          // input/output buffers
  var next;                   /* next input INDEX */
  var put;                    /* next output INDEX */
  var have, left;             /* available input and output */
  var hold;                   /* bit buffer */
  var bits;                   /* bits in bit buffer */
  var _in, _out;              /* save starting available input and output */
  var copy;                   /* number of stored or match bytes to copy */
  var from;                   /* where to copy match bytes from */
  var from_source;
  var here = 0;               /* current decoding table entry */
  var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
  //var last;                   /* parent table entry */
  var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
  var len;                    /* length to copy for repeats, bits to drop */
  var ret;                    /* return code */
  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */
  var opts;

  var n; // temporary var for NEED_BITS

  var order = /* permutation of code lengths */
    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];


  if (!strm || !strm.state || !strm.output ||
      (!strm.input && strm.avail_in !== 0)) {
    return Z_STREAM_ERROR;
  }

  state = strm.state;
  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */


  //--- LOAD() ---
  put = strm.next_out;
  output = strm.output;
  left = strm.avail_out;
  next = strm.next_in;
  input = strm.input;
  have = strm.avail_in;
  hold = state.hold;
  bits = state.bits;
  //---

  _in = have;
  _out = left;
  ret = Z_OK;

  inf_leave: // goto emulation
  for (;;) {
    switch (state.mode) {
      case HEAD:
        if (state.wrap === 0) {
          state.mode = TYPEDO;
          break;
        }
        //=== NEEDBITS(16);
        while (bits < 16) {
          if (have === 0) { break inf_leave; }
          have--;
          hold += input[next++] << bits;
          bits += 8;
        }
        //===//
        if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */
          state.check = 0/*crc32(0L, Z_NULL, 0)*/;
          //=== CRC2(state.check, hold);
          hbuf[0] = hold & 0xff;
          hbuf[1] = (hold >>> 8) & 0xff;
          state.check = crc32(state.check, hbuf, 2, 0);
          //===//

          //=== INITBITS();
          hold = 0;
          bits = 0;
          //===//
          state.mode = FLAGS;
          break;
        }
        state.flags = 0;           /* expect zlib header */
        if (state.head) {
          state.head.done = false;
        }
        if (!(state.wrap & 1) ||   /* check if zlib header allowed */
          (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
          strm.msg = 'incorrect header check';
          state.mode = BAD;
          break;
        }
        if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
          strm.msg = 'unknown compression method';
          state.mode = BAD;
          break;
        }
        //--- DROPBITS(4) ---//
        hold >>>= 4;
        bits -= 4;
        //---//
        len = (hold & 0x0f)/*BITS(4)*/ + 8;
        if (state.wbits === 0) {
          state.wbits = len;
        }
        else if (len > state.wbits) {
          strm.msg = 'invalid window size';
          state.mode = BAD;
          break;
        }
        state.dmax = 1 << len;
        //Tracev((stderr, "inflate:   zlib header ok\n"));
        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
        state.mode = hold & 0x200 ? DICTID : TYPE;
        //=== INITBITS();
        hold = 0;
        bits = 0;
        //===//
        break;
      case FLAGS:
        //=== NEEDBITS(16); */
        while (bits < 16) {
          if (have === 0) { break inf_leave; }
          have--;
          hold += input[next++] << bits;
          bits += 8;
        }
        //===//
        state.flags = hold;
        if ((state.flags & 0xff) !== Z_DEFLATED) {
          strm.msg = 'unknown compression method';
          state.mode = BAD;
          break;
        }
        if (state.flags & 0xe000) {
          strm.msg = 'unknown header flags set';
          state.mode = BAD;
          break;
        }
        if (state.head) {
          state.head.text = ((hold >> 8) & 1);
        }
        if (state.flags & 0x0200) {
          //=== CRC2(state.check, hold);
          hbuf[0] = hold & 0xff;
          hbuf[1] = (hold >>> 8) & 0xff;
          state.check = crc32(state.check, hbuf, 2, 0);
          //===//
        }
        //=== INITBITS();
        hold = 0;
        bits = 0;
        //===//
        state.mode = TIME;
        /* falls through */
      case TIME:
        //=== NEEDBITS(32); */
        while (bits < 32) {
          if (have === 0) { break inf_leave; }
          have--;
          hold += input[next++] << bits;
          bits += 8;
        }
        //===//
        if (state.head) {
          state.head.time = hold;
        }
        if (state.flags & 0x0200) {
          //=== CRC4(state.check, hold)
          hbuf[0] = hold & 0xff;
          hbuf[1] = (hold >>> 8) & 0xff;
          hbuf[2] = (hold >>> 16) & 0xff;
          hbuf[3] = (hold >>> 24) & 0xff;
          state.check = crc32(state.check, hbuf, 4, 0);
          //===
        }
        //=== INITBITS();
        hold = 0;
        bits = 0;
        //===//
        state.mode = OS;
        /* falls through */
      case OS:
        //=== NEEDBITS(16); */
        while (bits < 16) {
          if (have === 0) { break inf_leave; }
          have--;
          hold += input[next++] << bits;
          bits += 8;
        }
        //===//
        if (state.head) {
          state.head.xflags = (hold & 0xff);
          state.head.os = (hold >> 8);
        }
        if (state.flags & 0x0200) {
          //=== CRC2(state.check, hold);
          hbuf[0] = hold & 0xff;
          hbuf[1] = (hold >>> 8) & 0xff;
          state.check = crc32(state.check, hbuf, 2, 0);
          //===//
        }
        //=== INITBITS();
        hold = 0;
        bits = 0;
        //===//
        state.mode = EXLEN;
        /* falls through */
      case EXLEN:
        if (state.flags & 0x0400) {
          //=== NEEDBITS(16); */
          while (bits < 16) {
            if (have === 0) { break inf_leave; }
            have--;
            hold += input[next++] << bits;
            bits += 8;
          }
          //===//
          state.length = hold;
          if (state.head) {
            state.head.extra_len = hold;
          }
          if (state.flags & 0x0200) {
            //=== CRC2(state.check, hold);
            hbuf[0] = hold & 0xff;
            hbuf[1] = (hold >>> 8) & 0xff;
            state.check = crc32(state.check, hbuf, 2, 0);
            //===//
          }
          //=== INITBITS();
          hold = 0;
          bits = 0;
          //===//
        }
        else if (state.head) {
          state.head.extra = null/*Z_NULL*/;
        }
        state.mode = EXTRA;
        /* falls through */
      case EXTRA:
        if (state.flags & 0x0400) {
          copy = state.length;
          if (copy > have) { copy = have; }
          if (copy) {
            if (state.head) {
              len = state.head.extra_len - state.length;
              if (!state.head.extra) {
                // Use untyped array for more convenient processing later
                state.head.extra = new Array(state.head.extra_len);
              }
              utils.arraySet(
                state.head.extra,
                input,
                next,
                // extra field is limited to 65536 bytes
                // - no need for additional size check
                copy,
                /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
                len
              );
              //zmemcpy(state.head.extra + len, next,
              //        len + copy > state.head.extra_max ?
              //        state.head.extra_max - len : copy);
            }
            if (state.flags & 0x0200) {
              state.check = crc32(state.check, input, copy, next);
            }
            have -= copy;
            next += copy;
            state.length -= copy;
          }
          if (state.length) { break inf_leave; }
        }
        state.length = 0;
        state.mode = NAME;
        /* falls through */
      case NAME:
        if (state.flags & 0x0800) {
          if (have === 0) { break inf_leave; }
          copy = 0;
          do {
            // TODO: 2 or 1 bytes?
            len = input[next + copy++];
            /* use constant limit because in js we should not preallocate memory */
            if (state.head && len &&
                (state.length < 65536 /*state.head.name_max*/)) {
              state.head.name += String.fromCharCode(len);
            }
          } while (len && copy < have);

          if (state.flags & 0x0200) {
            state.check = crc32(state.check, input, copy, next);
          }
          have -= copy;
          next += copy;
          if (len) { break inf_leave; }
        }
        else if (state.head) {
          state.head.name = null;
        }
        state.length = 0;
        state.mode = COMMENT;
        /* falls through */
      case COMMENT:
        if (state.flags & 0x1000) {
          if (have === 0) { break inf_leave; }
          copy = 0;
          do {
            len = input[next + copy++];
            /* use constant limit because in js we should not preallocate memory */
            if (state.head && len &&
                (state.length < 65536 /*state.head.comm_max*/)) {
              state.head.comment += String.fromCharCode(len);
            }
          } while (len && copy < have);
          if (state.flags & 0x0200) {
            state.check = crc32(state.check, input, copy, next);
          }
          have -= copy;
          next += copy;
          if (len) { break inf_leave; }
        }
        else if (state.head) {
          state.head.comment = null;
        }
        state.mode = HCRC;
        /* falls through */
      case HCRC:
        if (state.flags & 0x0200) {
          //=== NEEDBITS(16); */
          while (bits < 16) {
            if (have === 0) { break inf_leave; }
            have--;
            hold += input[next++] << bits;
            bits += 8;
          }
          //===//
          if (hold !== (state.check & 0xffff)) {
            strm.msg = 'header crc mismatch';
            state.mode = BAD;
            break;
          }
          //=== INITBITS();
          hold = 0;
          bits = 0;
          //===//
        }
        if (state.head) {
          state.head.hcrc = ((state.flags >> 9) & 1);
          state.head.done = true;
        }
        strm.adler = state.check = 0;
        state.mode = TYPE;
        break;
      case DICTID:
        //=== NEEDBITS(32); */
        while (bits < 32) {
          if (have === 0) { break inf_leave; }
          have--;
          hold += input[next++] << bits;
          bits += 8;
        }
        //===//
        strm.adler = state.check = zswap32(hold);
        //=== INITBITS();
        hold = 0;
        bits = 0;
        //===//
        state.mode = DICT;
        /* falls through */
      case DICT:
        if (state.havedict === 0) {
          //--- RESTORE() ---
          strm.next_out = put;
          strm.avail_out = left;
          strm.next_in = next;
          strm.avail_in = have;
          state.hold = hold;
          state.bits = bits;
          //---
          return Z_NEED_DICT;
        }
        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
        state.mode = TYPE;
        /* falls through */
      case TYPE:
        if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
        /* falls through */
      case TYPEDO:
        if (state.last) {
          //--- BYTEBITS() ---//
          hold >>>= bits & 7;
          bits -= bits & 7;
          //---//
          state.mode = CHECK;
          break;
        }
        //=== NEEDBITS(3); */
        while (bits < 3) {
          if (have === 0) { break inf_leave; }
          have--;
          hold += input[next++] << bits;
          bits += 8;
        }
        //===//
        state.last = (hold & 0x01)/*BITS(1)*/;
        //--- DROPBITS(1) ---//
        hold >>>= 1;
        bits -= 1;
        //---//

        switch ((hold & 0x03)/*BITS(2)*/) {
          case 0:                             /* stored block */
            //Tracev((stderr, "inflate:     stored block%s\n",
            //        state.last ? " (last)" : ""));
            state.mode = STORED;
            break;
          case 1:                             /* fixed block */
            fixedtables(state);
            //Tracev((stderr, "inflate:     fixed codes block%s\n",
            //        state.last ? " (last)" : ""));
            state.mode = LEN_;             /* decode codes */
            if (flush === Z_TREES) {
              //--- DROPBITS(2) ---//
              hold >>>= 2;
              bits -= 2;
              //---//
              break inf_leave;
            }
            break;
          case 2:                             /* dynamic block */
            //Tracev((stderr, "inflate:     dynamic codes block%s\n",
            //        state.last ? " (last)" : ""));
            state.mode = TABLE;
            break;
          case 3:
            strm.msg = 'invalid block type';
            state.mode = BAD;
        }
        //--- DROPBITS(2) ---//
        hold >>>= 2;
        bits -= 2;
        //---//
        break;
      case STORED:
        //--- BYTEBITS() ---// /* go to byte boundary */
        hold >>>= bits & 7;
        bits -= bits & 7;
        //---//
        //=== NEEDBITS(32); */
        while (bits < 32) {
          if (have === 0) { break inf_leave; }
          have--;
          hold += input[next++] << bits;
          bits += 8;
        }
        //===//
        if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
          strm.msg = 'invalid stored block lengths';
          state.mode = BAD;
          break;
        }
        state.length = hold & 0xffff;
        //Tracev((stderr, "inflate:       stored length %u\n",
        //        state.length));
        //=== INITBITS();
        hold = 0;
        bits = 0;
        //===//
        state.mode = COPY_;
        if (flush === Z_TREES) { break inf_leave; }
        /* falls through */
      case COPY_:
        state.mode = COPY;
        /* falls through */
      case COPY:
        copy = state.length;
        if (copy) {
          if (copy > have) { copy = have; }
          if (copy > left) { copy = left; }
          if (copy === 0) { break inf_leave; }
          //--- zmemcpy(put, next, copy); ---
          utils.arraySet(output, input, next, copy, put);
          //---//
          have -= copy;
          next += copy;
          left -= copy;
          put += copy;
          state.length -= copy;
          break;
        }
        //Tracev((stderr, "inflate:       stored end\n"));
        state.mode = TYPE;
        break;
      case TABLE:
        //=== NEEDBITS(14); */
        while (bits < 14) {
          if (have === 0) { break inf_leave; }
          have--;
          hold += input[next++] << bits;
          bits += 8;
        }
        //===//
        state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
        //--- DROPBITS(5) ---//
        hold >>>= 5;
        bits -= 5;
        //---//
        state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
        //--- DROPBITS(5) ---//
        hold >>>= 5;
        bits -= 5;
        //---//
        state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
        //--- DROPBITS(4) ---//
        hold >>>= 4;
        bits -= 4;
        //---//
//#ifndef PKZIP_BUG_WORKAROUND
        if (state.nlen > 286 || state.ndist > 30) {
          strm.msg = 'too many length or distance symbols';
          state.mode = BAD;
          break;
        }
//#endif
        //Tracev((stderr, "inflate:       table sizes ok\n"));
        state.have = 0;
        state.mode = LENLENS;
        /* falls through */
      case LENLENS:
        while (state.have < state.ncode) {
          //=== NEEDBITS(3);
          while (bits < 3) {
            if (have === 0) { break inf_leave; }
            have--;
            hold += input[next++] << bits;
            bits += 8;
          }
          //===//
          state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
          //--- DROPBITS(3) ---//
          hold >>>= 3;
          bits -= 3;
          //---//
        }
        while (state.have < 19) {
          state.lens[order[state.have++]] = 0;
        }
        // We have separate tables & no pointers. 2 commented lines below not needed.
        //state.next = state.codes;
        //state.lencode = state.next;
        // Switch to use dynamic table
        state.lencode = state.lendyn;
        state.lenbits = 7;

        opts = { bits: state.lenbits };
        ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
        state.lenbits = opts.bits;

        if (ret) {
          strm.msg = 'invalid code lengths set';
          state.mode = BAD;
          break;
        }
        //Tracev((stderr, "inflate:       code lengths ok\n"));
        state.have = 0;
        state.mode = CODELENS;
        /* falls through */
      case CODELENS:
        while (state.have < state.nlen + state.ndist) {
          for (;;) {
            here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
            here_bits = here >>> 24;
            here_op = (here >>> 16) & 0xff;
            here_val = here & 0xffff;

            if ((here_bits) <= bits) { break; }
            //--- PULLBYTE() ---//
            if (have === 0) { break inf_leave; }
            have--;
            hold += input[next++] << bits;
            bits += 8;
            //---//
          }
          if (here_val < 16) {
            //--- DROPBITS(here.bits) ---//
            hold >>>= here_bits;
            bits -= here_bits;
            //---//
            state.lens[state.have++] = here_val;
          }
          else {
            if (here_val === 16) {
              //=== NEEDBITS(here.bits + 2);
              n = here_bits + 2;
              while (bits < n) {
                if (have === 0) { break inf_leave; }
                have--;
                hold += input[next++] << bits;
                bits += 8;
              }
              //===//
              //--- DROPBITS(here.bits) ---//
              hold >>>= here_bits;
              bits -= here_bits;
              //---//
              if (state.have === 0) {
                strm.msg = 'invalid bit length repeat';
                state.mode = BAD;
                break;
              }
              len = state.lens[state.have - 1];
              copy = 3 + (hold & 0x03);//BITS(2);
              //--- DROPBITS(2) ---//
              hold >>>= 2;
              bits -= 2;
              //---//
            }
            else if (here_val === 17) {
              //=== NEEDBITS(here.bits + 3);
              n = here_bits + 3;
              while (bits < n) {
                if (have === 0) { break inf_leave; }
                have--;
                hold += input[next++] << bits;
                bits += 8;
              }
              //===//
              //--- DROPBITS(here.bits) ---//
              hold >>>= here_bits;
              bits -= here_bits;
              //---//
              len = 0;
              copy = 3 + (hold & 0x07);//BITS(3);
              //--- DROPBITS(3) ---//
              hold >>>= 3;
              bits -= 3;
              //---//
            }
            else {
              //=== NEEDBITS(here.bits + 7);
              n = here_bits + 7;
              while (bits < n) {
                if (have === 0) { break inf_leave; }
                have--;
                hold += input[next++] << bits;
                bits += 8;
              }
              //===//
              //--- DROPBITS(here.bits) ---//
              hold >>>= here_bits;
              bits -= here_bits;
              //---//
              len = 0;
              copy = 11 + (hold & 0x7f);//BITS(7);
              //--- DROPBITS(7) ---//
              hold >>>= 7;
              bits -= 7;
              //---//
            }
            if (state.have + copy > state.nlen + state.ndist) {
              strm.msg = 'invalid bit length repeat';
              state.mode = BAD;
              break;
            }
            while (copy--) {
              state.lens[state.have++] = len;
            }
          }
        }

        /* handle error breaks in while */
        if (state.mode === BAD) { break; }

        /* check for end-of-block code (better have one) */
        if (state.lens[256] === 0) {
          strm.msg = 'invalid code -- missing end-of-block';
          state.mode = BAD;
          break;
        }

        /* build code tables -- note: do not change the lenbits or distbits
           values here (9 and 6) without reading the comments in inftrees.h
           concerning the ENOUGH constants, which depend on those values */
        state.lenbits = 9;

        opts = { bits: state.lenbits };
        ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
        // We have separate tables & no pointers. 2 commented lines below not needed.
        // state.next_index = opts.table_index;
        state.lenbits = opts.bits;
        // state.lencode = state.next;

        if (ret) {
          strm.msg = 'invalid literal/lengths set';
          state.mode = BAD;
          break;
        }

        state.distbits = 6;
        //state.distcode.copy(state.codes);
        // Switch to use dynamic table
        state.distcode = state.distdyn;
        opts = { bits: state.distbits };
        ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
        // We have separate tables & no pointers. 2 commented lines below not needed.
        // state.next_index = opts.table_index;
        state.distbits = opts.bits;
        // state.distcode = state.next;

        if (ret) {
          strm.msg = 'invalid distances set';
          state.mode = BAD;
          break;
        }
        //Tracev((stderr, 'inflate:       codes ok\n'));
        state.mode = LEN_;
        if (flush === Z_TREES) { break inf_leave; }
        /* falls through */
      case LEN_:
        state.mode = LEN;
        /* falls through */
      case LEN:
        if (have >= 6 && left >= 258) {
          //--- RESTORE() ---
          strm.next_out = put;
          strm.avail_out = left;
          strm.next_in = next;
          strm.avail_in = have;
          state.hold = hold;
          state.bits = bits;
          //---
          inflate_fast(strm, _out);
          //--- LOAD() ---
          put = strm.next_out;
          output = strm.output;
          left = strm.avail_out;
          next = strm.next_in;
          input = strm.input;
          have = strm.avail_in;
          hold = state.hold;
          bits = state.bits;
          //---

          if (state.mode === TYPE) {
            state.back = -1;
          }
          break;
        }
        state.back = 0;
        for (;;) {
          here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/
          here_bits = here >>> 24;
          here_op = (here >>> 16) & 0xff;
          here_val = here & 0xffff;

          if (here_bits <= bits) { break; }
          //--- PULLBYTE() ---//
          if (have === 0) { break inf_leave; }
          have--;
          hold += input[next++] << bits;
          bits += 8;
          //---//
        }
        if (here_op && (here_op & 0xf0) === 0) {
          last_bits = here_bits;
          last_op = here_op;
          last_val = here_val;
          for (;;) {
            here = state.lencode[last_val +
                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
            here_bits = here >>> 24;
            here_op = (here >>> 16) & 0xff;
            here_val = here & 0xffff;

            if ((last_bits + here_bits) <= bits) { break; }
            //--- PULLBYTE() ---//
            if (have === 0) { break inf_leave; }
            have--;
            hold += input[next++] << bits;
            bits += 8;
            //---//
          }
          //--- DROPBITS(last.bits) ---//
          hold >>>= last_bits;
          bits -= last_bits;
          //---//
          state.back += last_bits;
        }
        //--- DROPBITS(here.bits) ---//
        hold >>>= here_bits;
        bits -= here_bits;
        //---//
        state.back += here_bits;
        state.length = here_val;
        if (here_op === 0) {
          //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
          //        "inflate:         literal '%c'\n" :
          //        "inflate:         literal 0x%02x\n", here.val));
          state.mode = LIT;
          break;
        }
        if (here_op & 32) {
          //Tracevv((stderr, "inflate:         end of block\n"));
          state.back = -1;
          state.mode = TYPE;
          break;
        }
        if (here_op & 64) {
          strm.msg = 'invalid literal/length code';
          state.mode = BAD;
          break;
        }
        state.extra = here_op & 15;
        state.mode = LENEXT;
        /* falls through */
      case LENEXT:
        if (state.extra) {
          //=== NEEDBITS(state.extra);
          n = state.extra;
          while (bits < n) {
            if (have === 0) { break inf_leave; }
            have--;
            hold += input[next++] << bits;
            bits += 8;
          }
          //===//
          state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
          //--- DROPBITS(state.extra) ---//
          hold >>>= state.extra;
          bits -= state.extra;
          //---//
          state.back += state.extra;
        }
        //Tracevv((stderr, "inflate:         length %u\n", state.length));
        state.was = state.length;
        state.mode = DIST;
        /* falls through */
      case DIST:
        for (;;) {
          here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
          here_bits = here >>> 24;
          here_op = (here >>> 16) & 0xff;
          here_val = here & 0xffff;

          if ((here_bits) <= bits) { break; }
          //--- PULLBYTE() ---//
          if (have === 0) { break inf_leave; }
          have--;
          hold += input[next++] << bits;
          bits += 8;
          //---//
        }
        if ((here_op & 0xf0) === 0) {
          last_bits = here_bits;
          last_op = here_op;
          last_val = here_val;
          for (;;) {
            here = state.distcode[last_val +
                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
            here_bits = here >>> 24;
            here_op = (here >>> 16) & 0xff;
            here_val = here & 0xffff;

            if ((last_bits + here_bits) <= bits) { break; }
            //--- PULLBYTE() ---//
            if (have === 0) { break inf_leave; }
            have--;
            hold += input[next++] << bits;
            bits += 8;
            //---//
          }
          //--- DROPBITS(last.bits) ---//
          hold >>>= last_bits;
          bits -= last_bits;
          //---//
          state.back += last_bits;
        }
        //--- DROPBITS(here.bits) ---//
        hold >>>= here_bits;
        bits -= here_bits;
        //---//
        state.back += here_bits;
        if (here_op & 64) {
          strm.msg = 'invalid distance code';
          state.mode = BAD;
          break;
        }
        state.offset = here_val;
        state.extra = (here_op) & 15;
        state.mode = DISTEXT;
        /* falls through */
      case DISTEXT:
        if (state.extra) {
          //=== NEEDBITS(state.extra);
          n = state.extra;
          while (bits < n) {
            if (have === 0) { break inf_leave; }
            have--;
            hold += input[next++] << bits;
            bits += 8;
          }
          //===//
          state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
          //--- DROPBITS(state.extra) ---//
          hold >>>= state.extra;
          bits -= state.extra;
          //---//
          state.back += state.extra;
        }
//#ifdef INFLATE_STRICT
        if (state.offset > state.dmax) {
          strm.msg = 'invalid distance too far back';
          state.mode = BAD;
          break;
        }
//#endif
        //Tracevv((stderr, "inflate:         distance %u\n", state.offset));
        state.mode = MATCH;
        /* falls through */
      case MATCH:
        if (left === 0) { break inf_leave; }
        copy = _out - left;
        if (state.offset > copy) {         /* copy from window */
          copy = state.offset - copy;
          if (copy > state.whave) {
            if (state.sane) {
              strm.msg = 'invalid distance too far back';
              state.mode = BAD;
              break;
            }
// (!) This block is disabled in zlib defaults,
// don't enable it for binary compatibility
//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
//          Trace((stderr, "inflate.c too far\n"));
//          copy -= state.whave;
//          if (copy > state.length) { copy = state.length; }
//          if (copy > left) { copy = left; }
//          left -= copy;
//          state.length -= copy;
//          do {
//            output[put++] = 0;
//          } while (--copy);
//          if (state.length === 0) { state.mode = LEN; }
//          break;
//#endif
          }
          if (copy > state.wnext) {
            copy -= state.wnext;
            from = state.wsize - copy;
          }
          else {
            from = state.wnext - copy;
          }
          if (copy > state.length) { copy = state.length; }
          from_source = state.window;
        }
        else {                              /* copy from output */
          from_source = output;
          from = put - state.offset;
          copy = state.length;
        }
        if (copy > left) { copy = left; }
        left -= copy;
        state.length -= copy;
        do {
          output[put++] = from_source[from++];
        } while (--copy);
        if (state.length === 0) { state.mode = LEN; }
        break;
      case LIT:
        if (left === 0) { break inf_leave; }
        output[put++] = state.length;
        left--;
        state.mode = LEN;
        break;
      case CHECK:
        if (state.wrap) {
          //=== NEEDBITS(32);
          while (bits < 32) {
            if (have === 0) { break inf_leave; }
            have--;
            // Use '|' instead of '+' to make sure that result is signed
            hold |= input[next++] << bits;
            bits += 8;
          }
          //===//
          _out -= left;
          strm.total_out += _out;
          state.total += _out;
          if (_out) {
            strm.adler = state.check =
                /*UPDATE(state.check, put - _out, _out);*/
                (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));

          }
          _out = left;
          // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
          if ((state.flags ? hold : zswap32(hold)) !== state.check) {
            strm.msg = 'incorrect data check';
            state.mode = BAD;
            break;
          }
          //=== INITBITS();
          hold = 0;
          bits = 0;
          //===//
          //Tracev((stderr, "inflate:   check matches trailer\n"));
        }
        state.mode = LENGTH;
        /* falls through */
      case LENGTH:
        if (state.wrap && state.flags) {
          //=== NEEDBITS(32);
          while (bits < 32) {
            if (have === 0) { break inf_leave; }
            have--;
            hold += input[next++] << bits;
            bits += 8;
          }
          //===//
          if (hold !== (state.total & 0xffffffff)) {
            strm.msg = 'incorrect length check';
            state.mode = BAD;
            break;
          }
          //=== INITBITS();
          hold = 0;
          bits = 0;
          //===//
          //Tracev((stderr, "inflate:   length matches trailer\n"));
        }
        state.mode = DONE;
        /* falls through */
      case DONE:
        ret = Z_STREAM_END;
        break inf_leave;
      case BAD:
        ret = Z_DATA_ERROR;
        break inf_leave;
      case MEM:
        return Z_MEM_ERROR;
      case SYNC:
        /* falls through */
      default:
        return Z_STREAM_ERROR;
    }
  }

  // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"

  /*
     Return from inflate(), updating the total counts and the check value.
     If there was no progress during the inflate() call, return a buffer
     error.  Call updatewindow() to create and/or update the window state.
     Note: a memory error from inflate() is non-recoverable.
   */

  //--- RESTORE() ---
  strm.next_out = put;
  strm.avail_out = left;
  strm.next_in = next;
  strm.avail_in = have;
  state.hold = hold;
  state.bits = bits;
  //---

  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
                      (state.mode < CHECK || flush !== Z_FINISH))) {
    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
      state.mode = MEM;
      return Z_MEM_ERROR;
    }
  }
  _in -= strm.avail_in;
  _out -= strm.avail_out;
  strm.total_in += _in;
  strm.total_out += _out;
  state.total += _out;
  if (state.wrap && _out) {
    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
  }
  strm.data_type = state.bits + (state.last ? 64 : 0) +
                    (state.mode === TYPE ? 128 : 0) +
                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
    ret = Z_BUF_ERROR;
  }
  return ret;
}

function inflateEnd(strm) {

  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
    return Z_STREAM_ERROR;
  }

  var state = strm.state;
  if (state.window) {
    state.window = null;
  }
  strm.state = null;
  return Z_OK;
}

function inflateGetHeader(strm, head) {
  var state;

  /* check state */
  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  state = strm.state;
  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }

  /* save header structure */
  state.head = head;
  head.done = false;
  return Z_OK;
}

function inflateSetDictionary(strm, dictionary) {
  var dictLength = dictionary.length;

  var state;
  var dictid;
  var ret;

  /* check state */
  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }
  state = strm.state;

  if (state.wrap !== 0 && state.mode !== DICT) {
    return Z_STREAM_ERROR;
  }

  /* check for correct dictionary identifier */
  if (state.mode === DICT) {
    dictid = 1; /* adler32(0, null, 0)*/
    /* dictid = adler32(dictid, dictionary, dictLength); */
    dictid = adler32(dictid, dictionary, dictLength, 0);
    if (dictid !== state.check) {
      return Z_DATA_ERROR;
    }
  }
  /* copy dictionary to window using updatewindow(), which will amend the
   existing dictionary if appropriate */
  ret = updatewindow(strm, dictionary, dictLength, dictLength);
  if (ret) {
    state.mode = MEM;
    return Z_MEM_ERROR;
  }
  state.havedict = 1;
  // Tracev((stderr, "inflate:   dictionary set\n"));
  return Z_OK;
}

exports.inflateReset = inflateReset;
exports.inflateReset2 = inflateReset2;
exports.inflateResetKeep = inflateResetKeep;
exports.inflateInit = inflateInit;
exports.inflateInit2 = inflateInit2;
exports.inflate = inflate;
exports.inflateEnd = inflateEnd;
exports.inflateGetHeader = inflateGetHeader;
exports.inflateSetDictionary = inflateSetDictionary;
exports.inflateInfo = 'pako inflate (from Nodeca project)';

/* Not implemented
exports.inflateCopy = inflateCopy;
exports.inflateGetDictionary = inflateGetDictionary;
exports.inflateMark = inflateMark;
exports.inflatePrime = inflatePrime;
exports.inflateSync = inflateSync;
exports.inflateSyncPoint = inflateSyncPoint;
exports.inflateUndermine = inflateUndermine;
*/

},{"../utils/common":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/utils/common.js","./adler32":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/adler32.js","./crc32":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/crc32.js","./inffast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/inffast.js","./inftrees":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/inftrees.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/inftrees.js":[function(require,module,exports){
'use strict';

// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//   claim that you wrote the original software. If you use this software
//   in a product, an acknowledgment in the product documentation would be
//   appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
//   misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.

var utils = require('../utils/common');

var MAXBITS = 15;
var ENOUGH_LENS = 852;
var ENOUGH_DISTS = 592;
//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);

var CODES = 0;
var LENS = 1;
var DISTS = 2;

var lbase = [ /* Length codes 257..285 base */
  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
];

var lext = [ /* Length codes 257..285 extra */
  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
];

var dbase = [ /* Distance codes 0..29 base */
  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
  8193, 12289, 16385, 24577, 0, 0
];

var dext = [ /* Distance codes 0..29 extra */
  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
  28, 28, 29, 29, 64, 64
];

module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
{
  var bits = opts.bits;
      //here = opts.here; /* table entry for duplication */

  var len = 0;               /* a code's length in bits */
  var sym = 0;               /* index of code symbols */
  var min = 0, max = 0;          /* minimum and maximum code lengths */
  var root = 0;              /* number of index bits for root table */
  var curr = 0;              /* number of index bits for current table */
  var drop = 0;              /* code bits to drop for sub-table */
  var left = 0;                   /* number of prefix codes available */
  var used = 0;              /* code entries in table used */
  var huff = 0;              /* Huffman code */
  var incr;              /* for incrementing code, index */
  var fill;              /* index for replicating entries */
  var low;               /* low bits for current root entry */
  var mask;              /* mask for low root bits */
  var next;             /* next available space in table */
  var base = null;     /* base value table to use */
  var base_index = 0;
//  var shoextra;    /* extra bits table to use */
  var end;                    /* use base and extra for symbol > end */
  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */
  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */
  var extra = null;
  var extra_index = 0;

  var here_bits, here_op, here_val;

  /*
   Process a set of code lengths to create a canonical Huffman code.  The
   code lengths are lens[0..codes-1].  Each length corresponds to the
   symbols 0..codes-1.  The Huffman code is generated by first sorting the
   symbols by length from short to long, and retaining the symbol order
   for codes with equal lengths.  Then the code starts with all zero bits
   for the first code of the shortest length, and the codes are integer
   increments for the same length, and zeros are appended as the length
   increases.  For the deflate format, these bits are stored backwards
   from their more natural integer increment ordering, and so when the
   decoding tables are built in the large loop below, the integer codes
   are incremented backwards.

   This routine assumes, but does not check, that all of the entries in
   lens[] are in the range 0..MAXBITS.  The caller must assure this.
   1..MAXBITS is interpreted as that code length.  zero means that that
   symbol does not occur in this code.

   The codes are sorted by computing a count of codes for each length,
   creating from that a table of starting indices for each length in the
   sorted table, and then entering the symbols in order in the sorted
   table.  The sorted table is work[], with that space being provided by
   the caller.

   The length counts are used for other purposes as well, i.e. finding
   the minimum and maximum length codes, determining if there are any
   codes at all, checking for a valid set of lengths, and looking ahead
   at length counts to determine sub-table sizes when building the
   decoding tables.
   */

  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
  for (len = 0; len <= MAXBITS; len++) {
    count[len] = 0;
  }
  for (sym = 0; sym < codes; sym++) {
    count[lens[lens_index + sym]]++;
  }

  /* bound code lengths, force root to be within code lengths */
  root = bits;
  for (max = MAXBITS; max >= 1; max--) {
    if (count[max] !== 0) { break; }
  }
  if (root > max) {
    root = max;
  }
  if (max === 0) {                     /* no symbols to code at all */
    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */
    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;
    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;
    table[table_index++] = (1 << 24) | (64 << 16) | 0;


    //table.op[opts.table_index] = 64;
    //table.bits[opts.table_index] = 1;
    //table.val[opts.table_index++] = 0;
    table[table_index++] = (1 << 24) | (64 << 16) | 0;

    opts.bits = 1;
    return 0;     /* no symbols, but wait for decoding to report error */
  }
  for (min = 1; min < max; min++) {
    if (count[min] !== 0) { break; }
  }
  if (root < min) {
    root = min;
  }

  /* check for an over-subscribed or incomplete set of lengths */
  left = 1;
  for (len = 1; len <= MAXBITS; len++) {
    left <<= 1;
    left -= count[len];
    if (left < 0) {
      return -1;
    }        /* over-subscribed */
  }
  if (left > 0 && (type === CODES || max !== 1)) {
    return -1;                      /* incomplete set */
  }

  /* generate offsets into symbol table for each length for sorting */
  offs[1] = 0;
  for (len = 1; len < MAXBITS; len++) {
    offs[len + 1] = offs[len] + count[len];
  }

  /* sort symbols by length, by symbol order within each length */
  for (sym = 0; sym < codes; sym++) {
    if (lens[lens_index + sym] !== 0) {
      work[offs[lens[lens_index + sym]]++] = sym;
    }
  }

  /*
   Create and fill in decoding tables.  In this loop, the table being
   filled is at next and has curr index bits.  The code being used is huff
   with length len.  That code is converted to an index by dropping drop
   bits off of the bottom.  For codes where len is less than drop + curr,
   those top drop + curr - len bits are incremented through all values to
   fill the table with replicated entries.

   root is the number of index bits for the root table.  When len exceeds
   root, sub-tables are created pointed to by the root entry with an index
   of the low root bits of huff.  This is saved in low to check for when a
   new sub-table should be started.  drop is zero when the root table is
   being filled, and drop is root when sub-tables are being filled.

   When a new sub-table is needed, it is necessary to look ahead in the
   code lengths to determine what size sub-table is needed.  The length
   counts are used for this, and so count[] is decremented as codes are
   entered in the tables.

   used keeps track of how many table entries have been allocated from the
   provided *table space.  It is checked for LENS and DIST tables against
   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
   the initial root table size constants.  See the comments in inftrees.h
   for more information.

   sym increments through all symbols, and the loop terminates when
   all codes of length max, i.e. all codes, have been processed.  This
   routine permits incomplete codes, so another loop after this one fills
   in the rest of the decoding tables with invalid code markers.
   */

  /* set up for code type */
  // poor man optimization - use if-else instead of switch,
  // to avoid deopts in old v8
  if (type === CODES) {
    base = extra = work;    /* dummy value--not used */
    end = 19;

  } else if (type === LENS) {
    base = lbase;
    base_index -= 257;
    extra = lext;
    extra_index -= 257;
    end = 256;

  } else {                    /* DISTS */
    base = dbase;
    extra = dext;
    end = -1;
  }

  /* initialize opts for loop */
  huff = 0;                   /* starting code */
  sym = 0;                    /* starting code symbol */
  len = min;                  /* starting code length */
  next = table_index;              /* current table to fill in */
  curr = root;                /* current table index bits */
  drop = 0;                   /* current bits to drop from code for index */
  low = -1;                   /* trigger new sub-table when len > root */
  used = 1 << root;          /* use root table entries */
  mask = used - 1;            /* mask for comparing low */

  /* check available table space */
  if ((type === LENS && used > ENOUGH_LENS) ||
    (type === DISTS && used > ENOUGH_DISTS)) {
    return 1;
  }

  /* process all codes and make table entries */
  for (;;) {
    /* create table entry */
    here_bits = len - drop;
    if (work[sym] < end) {
      here_op = 0;
      here_val = work[sym];
    }
    else if (work[sym] > end) {
      here_op = extra[extra_index + work[sym]];
      here_val = base[base_index + work[sym]];
    }
    else {
      here_op = 32 + 64;         /* end of block */
      here_val = 0;
    }

    /* replicate for those indices with low len bits equal to huff */
    incr = 1 << (len - drop);
    fill = 1 << curr;
    min = fill;                 /* save offset to next table */
    do {
      fill -= incr;
      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
    } while (fill !== 0);

    /* backwards increment the len-bit code huff */
    incr = 1 << (len - 1);
    while (huff & incr) {
      incr >>= 1;
    }
    if (incr !== 0) {
      huff &= incr - 1;
      huff += incr;
    } else {
      huff = 0;
    }

    /* go to next symbol, update count, len */
    sym++;
    if (--count[len] === 0) {
      if (len === max) { break; }
      len = lens[lens_index + work[sym]];
    }

    /* create new sub-table if needed */
    if (len > root && (huff & mask) !== low) {
      /* if first time, transition to sub-tables */
      if (drop === 0) {
        drop = root;
      }

      /* increment past last table */
      next += min;            /* here min is 1 << curr */

      /* determine length of next table */
      curr = len - drop;
      left = 1 << curr;
      while (curr + drop < max) {
        left -= count[curr + drop];
        if (left <= 0) { break; }
        curr++;
        left <<= 1;
      }

      /* check for enough space */
      used += 1 << curr;
      if ((type === LENS && used > ENOUGH_LENS) ||
        (type === DISTS && used > ENOUGH_DISTS)) {
        return 1;
      }

      /* point entry in root table to sub-table */
      low = huff & mask;
      /*table.op[low] = curr;
      table.bits[low] = root;
      table.val[low] = next - opts.table_index;*/
      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
    }
  }

  /* fill in remaining table entry if code is incomplete (guaranteed to have
   at most one remaining entry, since if the code is incomplete, the
   maximum code length that was allowed to get this far is one bit) */
  if (huff !== 0) {
    //table.op[next + huff] = 64;            /* invalid code marker */
    //table.bits[next + huff] = len - drop;
    //table.val[next + huff] = 0;
    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
  }

  /* set return parameters */
  //opts.table_index += used;
  opts.bits = root;
  return 0;
};

},{"../utils/common":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/utils/common.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/messages.js":[function(require,module,exports){
'use strict';

// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//   claim that you wrote the original software. If you use this software
//   in a product, an acknowledgment in the product documentation would be
//   appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
//   misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.

module.exports = {
  2:      'need dictionary',     /* Z_NEED_DICT       2  */
  1:      'stream end',          /* Z_STREAM_END      1  */
  0:      '',                    /* Z_OK              0  */
  '-1':   'file error',          /* Z_ERRNO         (-1) */
  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */
  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */
  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */
  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */
  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/trees.js":[function(require,module,exports){
'use strict';

// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//   claim that you wrote the original software. If you use this software
//   in a product, an acknowledgment in the product documentation would be
//   appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
//   misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.

/* eslint-disable space-unary-ops */

var utils = require('../utils/common');

/* Public constants ==========================================================*/
/* ===========================================================================*/


//var Z_FILTERED          = 1;
//var Z_HUFFMAN_ONLY      = 2;
//var Z_RLE               = 3;
var Z_FIXED               = 4;
//var Z_DEFAULT_STRATEGY  = 0;

/* Possible values of the data_type field (though see inflate()) */
var Z_BINARY              = 0;
var Z_TEXT                = 1;
//var Z_ASCII             = 1; // = Z_TEXT
var Z_UNKNOWN             = 2;

/*============================================================================*/


function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }

// From zutil.h

var STORED_BLOCK = 0;
var STATIC_TREES = 1;
var DYN_TREES    = 2;
/* The three kinds of block type */

var MIN_MATCH    = 3;
var MAX_MATCH    = 258;
/* The minimum and maximum match lengths */

// From deflate.h
/* ===========================================================================
 * Internal compression state.
 */

var LENGTH_CODES  = 29;
/* number of length codes, not counting the special END_BLOCK code */

var LITERALS      = 256;
/* number of literal bytes 0..255 */

var L_CODES       = LITERALS + 1 + LENGTH_CODES;
/* number of Literal or Length codes, including the END_BLOCK code */

var D_CODES       = 30;
/* number of distance codes */

var BL_CODES      = 19;
/* number of codes used to transfer the bit lengths */

var HEAP_SIZE     = 2 * L_CODES + 1;
/* maximum heap size */

var MAX_BITS      = 15;
/* All codes must not exceed MAX_BITS bits */

var Buf_size      = 16;
/* size of bit buffer in bi_buf */


/* ===========================================================================
 * Constants
 */

var MAX_BL_BITS = 7;
/* Bit length codes must not exceed MAX_BL_BITS bits */

var END_BLOCK   = 256;
/* end of block literal code */

var REP_3_6     = 16;
/* repeat previous bit length 3-6 times (2 bits of repeat count) */

var REPZ_3_10   = 17;
/* repeat a zero length 3-10 times  (3 bits of repeat count) */

var REPZ_11_138 = 18;
/* repeat a zero length 11-138 times  (7 bits of repeat count) */

/* eslint-disable comma-spacing,array-bracket-spacing */
var extra_lbits =   /* extra bits for each length code */
  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];

var extra_dbits =   /* extra bits for each distance code */
  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];

var extra_blbits =  /* extra bits for each bit length code */
  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];

var bl_order =
  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
/* eslint-enable comma-spacing,array-bracket-spacing */

/* The lengths of the bit length codes are sent in order of decreasing
 * probability, to avoid transmitting the lengths for unused bit length codes.
 */

/* ===========================================================================
 * Local data. These are initialized only once.
 */

// We pre-fill arrays with 0 to avoid uninitialized gaps

var DIST_CODE_LEN = 512; /* see definition of array dist_code below */

// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1
var static_ltree  = new Array((L_CODES + 2) * 2);
zero(static_ltree);
/* The static literal tree. Since the bit lengths are imposed, there is no
 * need for the L_CODES extra codes used during heap construction. However
 * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
 * below).
 */

var static_dtree  = new Array(D_CODES * 2);
zero(static_dtree);
/* The static distance tree. (Actually a trivial tree since all codes use
 * 5 bits.)
 */

var _dist_code    = new Array(DIST_CODE_LEN);
zero(_dist_code);
/* Distance codes. The first 256 values correspond to the distances
 * 3 .. 258, the last 256 values correspond to the top 8 bits of
 * the 15 bit distances.
 */

var _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);
zero(_length_code);
/* length code for each normalized match length (0 == MIN_MATCH) */

var base_length   = new Array(LENGTH_CODES);
zero(base_length);
/* First normalized length for each code (0 = MIN_MATCH) */

var base_dist     = new Array(D_CODES);
zero(base_dist);
/* First normalized distance for each code (0 = distance of 1) */


function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {

  this.static_tree  = static_tree;  /* static tree or NULL */
  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */
  this.extra_base   = extra_base;   /* base index for extra_bits */
  this.elems        = elems;        /* max number of elements in the tree */
  this.max_length   = max_length;   /* max bit length for the codes */

  // show if `static_tree` has data or dummy - needed for monomorphic objects
  this.has_stree    = static_tree && static_tree.length;
}


var static_l_desc;
var static_d_desc;
var static_bl_desc;


function TreeDesc(dyn_tree, stat_desc) {
  this.dyn_tree = dyn_tree;     /* the dynamic tree */
  this.max_code = 0;            /* largest code with non zero frequency */
  this.stat_desc = stat_desc;   /* the corresponding static tree */
}



function d_code(dist) {
  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
}


/* ===========================================================================
 * Output a short LSB first on the stream.
 * IN assertion: there is enough room in pendingBuf.
 */
function put_short(s, w) {
//    put_byte(s, (uch)((w) & 0xff));
//    put_byte(s, (uch)((ush)(w) >> 8));
  s.pending_buf[s.pending++] = (w) & 0xff;
  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
}


/* ===========================================================================
 * Send a value on a given number of bits.
 * IN assertion: length <= 16 and value fits in length bits.
 */
function send_bits(s, value, length) {
  if (s.bi_valid > (Buf_size - length)) {
    s.bi_buf |= (value << s.bi_valid) & 0xffff;
    put_short(s, s.bi_buf);
    s.bi_buf = value >> (Buf_size - s.bi_valid);
    s.bi_valid += length - Buf_size;
  } else {
    s.bi_buf |= (value << s.bi_valid) & 0xffff;
    s.bi_valid += length;
  }
}


function send_code(s, c, tree) {
  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);
}


/* ===========================================================================
 * Reverse the first len bits of a code, using straightforward code (a faster
 * method would use a table)
 * IN assertion: 1 <= len <= 15
 */
function bi_reverse(code, len) {
  var res = 0;
  do {
    res |= code & 1;
    code >>>= 1;
    res <<= 1;
  } while (--len > 0);
  return res >>> 1;
}


/* ===========================================================================
 * Flush the bit buffer, keeping at most 7 bits in it.
 */
function bi_flush(s) {
  if (s.bi_valid === 16) {
    put_short(s, s.bi_buf);
    s.bi_buf = 0;
    s.bi_valid = 0;

  } else if (s.bi_valid >= 8) {
    s.pending_buf[s.pending++] = s.bi_buf & 0xff;
    s.bi_buf >>= 8;
    s.bi_valid -= 8;
  }
}


/* ===========================================================================
 * Compute the optimal bit lengths for a tree and update the total bit length
 * for the current block.
 * IN assertion: the fields freq and dad are set, heap[heap_max] and
 *    above are the tree nodes sorted by increasing frequency.
 * OUT assertions: the field len is set to the optimal bit length, the
 *     array bl_count contains the frequencies for each bit length.
 *     The length opt_len is updated; static_len is also updated if stree is
 *     not null.
 */
function gen_bitlen(s, desc)
//    deflate_state *s;
//    tree_desc *desc;    /* the tree descriptor */
{
  var tree            = desc.dyn_tree;
  var max_code        = desc.max_code;
  var stree           = desc.stat_desc.static_tree;
  var has_stree       = desc.stat_desc.has_stree;
  var extra           = desc.stat_desc.extra_bits;
  var base            = desc.stat_desc.extra_base;
  var max_length      = desc.stat_desc.max_length;
  var h;              /* heap index */
  var n, m;           /* iterate over the tree elements */
  var bits;           /* bit length */
  var xbits;          /* extra bits */
  var f;              /* frequency */
  var overflow = 0;   /* number of elements with bit length too large */

  for (bits = 0; bits <= MAX_BITS; bits++) {
    s.bl_count[bits] = 0;
  }

  /* In a first pass, compute the optimal bit lengths (which may
   * overflow in the case of the bit length tree).
   */
  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */

  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {
    n = s.heap[h];
    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
    if (bits > max_length) {
      bits = max_length;
      overflow++;
    }
    tree[n * 2 + 1]/*.Len*/ = bits;
    /* We overwrite tree[n].Dad which is no longer needed */

    if (n > max_code) { continue; } /* not a leaf node */

    s.bl_count[bits]++;
    xbits = 0;
    if (n >= base) {
      xbits = extra[n - base];
    }
    f = tree[n * 2]/*.Freq*/;
    s.opt_len += f * (bits + xbits);
    if (has_stree) {
      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);
    }
  }
  if (overflow === 0) { return; }

  // Trace((stderr,"\nbit length overflow\n"));
  /* This happens for example on obj2 and pic of the Calgary corpus */

  /* Find the first bit length which could increase: */
  do {
    bits = max_length - 1;
    while (s.bl_count[bits] === 0) { bits--; }
    s.bl_count[bits]--;      /* move one leaf down the tree */
    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */
    s.bl_count[max_length]--;
    /* The brother of the overflow item also moves one step up,
     * but this does not affect bl_count[max_length]
     */
    overflow -= 2;
  } while (overflow > 0);

  /* Now recompute all bit lengths, scanning in increasing frequency.
   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
   * lengths instead of fixing only the wrong ones. This idea is taken
   * from 'ar' written by Haruhiko Okumura.)
   */
  for (bits = max_length; bits !== 0; bits--) {
    n = s.bl_count[bits];
    while (n !== 0) {
      m = s.heap[--h];
      if (m > max_code) { continue; }
      if (tree[m * 2 + 1]/*.Len*/ !== bits) {
        // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;
        tree[m * 2 + 1]/*.Len*/ = bits;
      }
      n--;
    }
  }
}


/* ===========================================================================
 * Generate the codes for a given tree and bit counts (which need not be
 * optimal).
 * IN assertion: the array bl_count contains the bit length statistics for
 * the given tree and the field len is set for all tree elements.
 * OUT assertion: the field code is set for all tree elements of non
 *     zero code length.
 */
function gen_codes(tree, max_code, bl_count)
//    ct_data *tree;             /* the tree to decorate */
//    int max_code;              /* largest code with non zero frequency */
//    ushf *bl_count;            /* number of codes at each bit length */
{
  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */
  var code = 0;              /* running code value */
  var bits;                  /* bit index */
  var n;                     /* code index */

  /* The distribution counts are first used to generate the code values
   * without bit reversal.
   */
  for (bits = 1; bits <= MAX_BITS; bits++) {
    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;
  }
  /* Check that the bit counts in bl_count are consistent. The last code
   * must be all ones.
   */
  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
  //        "inconsistent bit counts");
  //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));

  for (n = 0;  n <= max_code; n++) {
    var len = tree[n * 2 + 1]/*.Len*/;
    if (len === 0) { continue; }
    /* Now reverse the bits */
    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);

    //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
  }
}


/* ===========================================================================
 * Initialize the various 'constant' tables.
 */
function tr_static_init() {
  var n;        /* iterates over tree elements */
  var bits;     /* bit counter */
  var length;   /* length value */
  var code;     /* code value */
  var dist;     /* distance index */
  var bl_count = new Array(MAX_BITS + 1);
  /* number of codes at each bit length for an optimal tree */

  // do check in _tr_init()
  //if (static_init_done) return;

  /* For some embedded targets, global variables are not initialized: */
/*#ifdef NO_INIT_GLOBAL_POINTERS
  static_l_desc.static_tree = static_ltree;
  static_l_desc.extra_bits = extra_lbits;
  static_d_desc.static_tree = static_dtree;
  static_d_desc.extra_bits = extra_dbits;
  static_bl_desc.extra_bits = extra_blbits;
#endif*/

  /* Initialize the mapping length (0..255) -> length code (0..28) */
  length = 0;
  for (code = 0; code < LENGTH_CODES - 1; code++) {
    base_length[code] = length;
    for (n = 0; n < (1 << extra_lbits[code]); n++) {
      _length_code[length++] = code;
    }
  }
  //Assert (length == 256, "tr_static_init: length != 256");
  /* Note that the length 255 (match length 258) can be represented
   * in two different ways: code 284 + 5 bits or code 285, so we
   * overwrite length_code[255] to use the best encoding:
   */
  _length_code[length - 1] = code;

  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
  dist = 0;
  for (code = 0; code < 16; code++) {
    base_dist[code] = dist;
    for (n = 0; n < (1 << extra_dbits[code]); n++) {
      _dist_code[dist++] = code;
    }
  }
  //Assert (dist == 256, "tr_static_init: dist != 256");
  dist >>= 7; /* from now on, all distances are divided by 128 */
  for (; code < D_CODES; code++) {
    base_dist[code] = dist << 7;
    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
      _dist_code[256 + dist++] = code;
    }
  }
  //Assert (dist == 256, "tr_static_init: 256+dist != 512");

  /* Construct the codes of the static literal tree */
  for (bits = 0; bits <= MAX_BITS; bits++) {
    bl_count[bits] = 0;
  }

  n = 0;
  while (n <= 143) {
    static_ltree[n * 2 + 1]/*.Len*/ = 8;
    n++;
    bl_count[8]++;
  }
  while (n <= 255) {
    static_ltree[n * 2 + 1]/*.Len*/ = 9;
    n++;
    bl_count[9]++;
  }
  while (n <= 279) {
    static_ltree[n * 2 + 1]/*.Len*/ = 7;
    n++;
    bl_count[7]++;
  }
  while (n <= 287) {
    static_ltree[n * 2 + 1]/*.Len*/ = 8;
    n++;
    bl_count[8]++;
  }
  /* Codes 286 and 287 do not exist, but we must include them in the
   * tree construction to get a canonical Huffman tree (longest code
   * all ones)
   */
  gen_codes(static_ltree, L_CODES + 1, bl_count);

  /* The static distance tree is trivial: */
  for (n = 0; n < D_CODES; n++) {
    static_dtree[n * 2 + 1]/*.Len*/ = 5;
    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);
  }

  // Now data ready and we can init static trees
  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);
  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);
  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);

  //static_init_done = true;
}


/* ===========================================================================
 * Initialize a new block.
 */
function init_block(s) {
  var n; /* iterates over tree elements */

  /* Initialize the trees. */
  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }
  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }
  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }

  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;
  s.opt_len = s.static_len = 0;
  s.last_lit = s.matches = 0;
}


/* ===========================================================================
 * Flush the bit buffer and align the output on a byte boundary
 */
function bi_windup(s)
{
  if (s.bi_valid > 8) {
    put_short(s, s.bi_buf);
  } else if (s.bi_valid > 0) {
    //put_byte(s, (Byte)s->bi_buf);
    s.pending_buf[s.pending++] = s.bi_buf;
  }
  s.bi_buf = 0;
  s.bi_valid = 0;
}

/* ===========================================================================
 * Copy a stored block, storing first the length and its
 * one's complement if requested.
 */
function copy_block(s, buf, len, header)
//DeflateState *s;
//charf    *buf;    /* the input data */
//unsigned len;     /* its length */
//int      header;  /* true if block header must be written */
{
  bi_windup(s);        /* align on byte boundary */

  if (header) {
    put_short(s, len);
    put_short(s, ~len);
  }
//  while (len--) {
//    put_byte(s, *buf++);
//  }
  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
  s.pending += len;
}

/* ===========================================================================
 * Compares to subtrees, using the tree depth as tie breaker when
 * the subtrees have equal frequency. This minimizes the worst case length.
 */
function smaller(tree, n, m, depth) {
  var _n2 = n * 2;
  var _m2 = m * 2;
  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
}

/* ===========================================================================
 * Restore the heap property by moving down the tree starting at node k,
 * exchanging a node with the smallest of its two sons if necessary, stopping
 * when the heap property is re-established (each father smaller than its
 * two sons).
 */
function pqdownheap(s, tree, k)
//    deflate_state *s;
//    ct_data *tree;  /* the tree to restore */
//    int k;               /* node to move down */
{
  var v = s.heap[k];
  var j = k << 1;  /* left son of k */
  while (j <= s.heap_len) {
    /* Set j to the smallest of the two sons: */
    if (j < s.heap_len &&
      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {
      j++;
    }
    /* Exit if v is smaller than both sons */
    if (smaller(tree, v, s.heap[j], s.depth)) { break; }

    /* Exchange v with the smallest son */
    s.heap[k] = s.heap[j];
    k = j;

    /* And continue down the tree, setting j to the left son of k */
    j <<= 1;
  }
  s.heap[k] = v;
}


// inlined manually
// var SMALLEST = 1;

/* ===========================================================================
 * Send the block data compressed using the given Huffman trees
 */
function compress_block(s, ltree, dtree)
//    deflate_state *s;
//    const ct_data *ltree; /* literal tree */
//    const ct_data *dtree; /* distance tree */
{
  var dist;           /* distance of matched string */
  var lc;             /* match length or unmatched char (if dist == 0) */
  var lx = 0;         /* running index in l_buf */
  var code;           /* the code to send */
  var extra;          /* number of extra bits to send */

  if (s.last_lit !== 0) {
    do {
      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);
      lc = s.pending_buf[s.l_buf + lx];
      lx++;

      if (dist === 0) {
        send_code(s, lc, ltree); /* send a literal byte */
        //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
      } else {
        /* Here, lc is the match length - MIN_MATCH */
        code = _length_code[lc];
        send_code(s, code + LITERALS + 1, ltree); /* send the length code */
        extra = extra_lbits[code];
        if (extra !== 0) {
          lc -= base_length[code];
          send_bits(s, lc, extra);       /* send the extra length bits */
        }
        dist--; /* dist is now the match distance - 1 */
        code = d_code(dist);
        //Assert (code < D_CODES, "bad d_code");

        send_code(s, code, dtree);       /* send the distance code */
        extra = extra_dbits[code];
        if (extra !== 0) {
          dist -= base_dist[code];
          send_bits(s, dist, extra);   /* send the extra distance bits */
        }
      } /* literal or match pair ? */

      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
      //       "pendingBuf overflow");

    } while (lx < s.last_lit);
  }

  send_code(s, END_BLOCK, ltree);
}


/* ===========================================================================
 * Construct one Huffman tree and assigns the code bit strings and lengths.
 * Update the total bit length for the current block.
 * IN assertion: the field freq is set for all tree elements.
 * OUT assertions: the fields len and code are set to the optimal bit length
 *     and corresponding code. The length opt_len is updated; static_len is
 *     also updated if stree is not null. The field max_code is set.
 */
function build_tree(s, desc)
//    deflate_state *s;
//    tree_desc *desc; /* the tree descriptor */
{
  var tree     = desc.dyn_tree;
  var stree    = desc.stat_desc.static_tree;
  var has_stree = desc.stat_desc.has_stree;
  var elems    = desc.stat_desc.elems;
  var n, m;          /* iterate over heap elements */
  var max_code = -1; /* largest code with non zero frequency */
  var node;          /* new node being created */

  /* Construct the initial heap, with least frequent element in
   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
   * heap[0] is not used.
   */
  s.heap_len = 0;
  s.heap_max = HEAP_SIZE;

  for (n = 0; n < elems; n++) {
    if (tree[n * 2]/*.Freq*/ !== 0) {
      s.heap[++s.heap_len] = max_code = n;
      s.depth[n] = 0;

    } else {
      tree[n * 2 + 1]/*.Len*/ = 0;
    }
  }

  /* The pkzip format requires that at least one distance code exists,
   * and that at least one bit should be sent even if there is only one
   * possible code. So to avoid special checks later on we force at least
   * two codes of non zero frequency.
   */
  while (s.heap_len < 2) {
    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
    tree[node * 2]/*.Freq*/ = 1;
    s.depth[node] = 0;
    s.opt_len--;

    if (has_stree) {
      s.static_len -= stree[node * 2 + 1]/*.Len*/;
    }
    /* node is 0 or 1 so it does not have extra bits */
  }
  desc.max_code = max_code;

  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
   * establish sub-heaps of increasing lengths:
   */
  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }

  /* Construct the Huffman tree by repeatedly combining the least two
   * frequent nodes.
   */
  node = elems;              /* next internal node of the tree */
  do {
    //pqremove(s, tree, n);  /* n = node of least frequency */
    /*** pqremove ***/
    n = s.heap[1/*SMALLEST*/];
    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
    pqdownheap(s, tree, 1/*SMALLEST*/);
    /***/

    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */

    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
    s.heap[--s.heap_max] = m;

    /* Create a new node father of n and m */
    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;

    /* and insert the new node in the heap */
    s.heap[1/*SMALLEST*/] = node++;
    pqdownheap(s, tree, 1/*SMALLEST*/);

  } while (s.heap_len >= 2);

  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];

  /* At this point, the fields freq and dad are set. We can now
   * generate the bit lengths.
   */
  gen_bitlen(s, desc);

  /* The field len is now set, we can generate the bit codes */
  gen_codes(tree, max_code, s.bl_count);
}


/* ===========================================================================
 * Scan a literal or distance tree to determine the frequencies of the codes
 * in the bit length tree.
 */
function scan_tree(s, tree, max_code)
//    deflate_state *s;
//    ct_data *tree;   /* the tree to be scanned */
//    int max_code;    /* and its largest code of non zero frequency */
{
  var n;                     /* iterates over all tree elements */
  var prevlen = -1;          /* last emitted length */
  var curlen;                /* length of current code */

  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */

  var count = 0;             /* repeat count of the current code */
  var max_count = 7;         /* max repeat count */
  var min_count = 4;         /* min repeat count */

  if (nextlen === 0) {
    max_count = 138;
    min_count = 3;
  }
  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */

  for (n = 0; n <= max_code; n++) {
    curlen = nextlen;
    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;

    if (++count < max_count && curlen === nextlen) {
      continue;

    } else if (count < min_count) {
      s.bl_tree[curlen * 2]/*.Freq*/ += count;

    } else if (curlen !== 0) {

      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;

    } else if (count <= 10) {
      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;

    } else {
      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;
    }

    count = 0;
    prevlen = curlen;

    if (nextlen === 0) {
      max_count = 138;
      min_count = 3;

    } else if (curlen === nextlen) {
      max_count = 6;
      min_count = 3;

    } else {
      max_count = 7;
      min_count = 4;
    }
  }
}


/* ===========================================================================
 * Send a literal or distance tree in compressed form, using the codes in
 * bl_tree.
 */
function send_tree(s, tree, max_code)
//    deflate_state *s;
//    ct_data *tree; /* the tree to be scanned */
//    int max_code;       /* and its largest code of non zero frequency */
{
  var n;                     /* iterates over all tree elements */
  var prevlen = -1;          /* last emitted length */
  var curlen;                /* length of current code */

  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */

  var count = 0;             /* repeat count of the current code */
  var max_count = 7;         /* max repeat count */
  var min_count = 4;         /* min repeat count */

  /* tree[max_code+1].Len = -1; */  /* guard already set */
  if (nextlen === 0) {
    max_count = 138;
    min_count = 3;
  }

  for (n = 0; n <= max_code; n++) {
    curlen = nextlen;
    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;

    if (++count < max_count && curlen === nextlen) {
      continue;

    } else if (count < min_count) {
      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);

    } else if (curlen !== 0) {
      if (curlen !== prevlen) {
        send_code(s, curlen, s.bl_tree);
        count--;
      }
      //Assert(count >= 3 && count <= 6, " 3_6?");
      send_code(s, REP_3_6, s.bl_tree);
      send_bits(s, count - 3, 2);

    } else if (count <= 10) {
      send_code(s, REPZ_3_10, s.bl_tree);
      send_bits(s, count - 3, 3);

    } else {
      send_code(s, REPZ_11_138, s.bl_tree);
      send_bits(s, count - 11, 7);
    }

    count = 0;
    prevlen = curlen;
    if (nextlen === 0) {
      max_count = 138;
      min_count = 3;

    } else if (curlen === nextlen) {
      max_count = 6;
      min_count = 3;

    } else {
      max_count = 7;
      min_count = 4;
    }
  }
}


/* ===========================================================================
 * Construct the Huffman tree for the bit lengths and return the index in
 * bl_order of the last bit length code to send.
 */
function build_bl_tree(s) {
  var max_blindex;  /* index of last bit length code of non zero freq */

  /* Determine the bit length frequencies for literal and distance trees */
  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);

  /* Build the bit length tree: */
  build_tree(s, s.bl_desc);
  /* opt_len now includes the length of the tree representations, except
   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
   */

  /* Determine the number of bit length codes to send. The pkzip format
   * requires that at least 4 bit length codes be sent. (appnote.txt says
   * 3 but the actual value used is 4.)
   */
  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {
      break;
    }
  }
  /* Update opt_len to include the bit length tree and counts */
  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
  //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
  //        s->opt_len, s->static_len));

  return max_blindex;
}


/* ===========================================================================
 * Send the header for a block using dynamic Huffman trees: the counts, the
 * lengths of the bit length codes, the literal tree and the distance tree.
 * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
 */
function send_all_trees(s, lcodes, dcodes, blcodes)
//    deflate_state *s;
//    int lcodes, dcodes, blcodes; /* number of codes for each tree */
{
  var rank;                    /* index in bl_order */

  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
  //        "too many codes");
  //Tracev((stderr, "\nbl counts: "));
  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */
  send_bits(s, dcodes - 1,   5);
  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */
  for (rank = 0; rank < blcodes; rank++) {
    //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);
  }
  //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));

  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */
  //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));

  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */
  //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
}


/* ===========================================================================
 * Check if the data type is TEXT or BINARY, using the following algorithm:
 * - TEXT if the two conditions below are satisfied:
 *    a) There are no non-portable control characters belonging to the
 *       "black list" (0..6, 14..25, 28..31).
 *    b) There is at least one printable character belonging to the
 *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
 * - BINARY otherwise.
 * - The following partially-portable control characters form a
 *   "gray list" that is ignored in this detection algorithm:
 *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
 * IN assertion: the fields Freq of dyn_ltree are set.
 */
function detect_data_type(s) {
  /* black_mask is the bit mask of black-listed bytes
   * set bits 0..6, 14..25, and 28..31
   * 0xf3ffc07f = binary 11110011111111111100000001111111
   */
  var black_mask = 0xf3ffc07f;
  var n;

  /* Check for non-textual ("black-listed") bytes. */
  for (n = 0; n <= 31; n++, black_mask >>>= 1) {
    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {
      return Z_BINARY;
    }
  }

  /* Check for textual ("white-listed") bytes. */
  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
    return Z_TEXT;
  }
  for (n = 32; n < LITERALS; n++) {
    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
      return Z_TEXT;
    }
  }

  /* There are no "black-listed" or "white-listed" bytes:
   * this stream either is empty or has tolerated ("gray-listed") bytes only.
   */
  return Z_BINARY;
}


var static_init_done = false;

/* ===========================================================================
 * Initialize the tree data structures for a new zlib stream.
 */
function _tr_init(s)
{

  if (!static_init_done) {
    tr_static_init();
    static_init_done = true;
  }

  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);
  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);
  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);

  s.bi_buf = 0;
  s.bi_valid = 0;

  /* Initialize the first block of the first file: */
  init_block(s);
}


/* ===========================================================================
 * Send a stored block
 */
function _tr_stored_block(s, buf, stored_len, last)
//DeflateState *s;
//charf *buf;       /* input block */
//ulg stored_len;   /* length of input block */
//int last;         /* one if this is the last block for a file */
{
  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */
  copy_block(s, buf, stored_len, true); /* with header */
}


/* ===========================================================================
 * Send one empty static block to give enough lookahead for inflate.
 * This takes 10 bits, of which 7 may remain in the bit buffer.
 */
function _tr_align(s) {
  send_bits(s, STATIC_TREES << 1, 3);
  send_code(s, END_BLOCK, static_ltree);
  bi_flush(s);
}


/* ===========================================================================
 * Determine the best encoding for the current block: dynamic trees, static
 * trees or store, and output the encoded block to the zip file.
 */
function _tr_flush_block(s, buf, stored_len, last)
//DeflateState *s;
//charf *buf;       /* input block, or NULL if too old */
//ulg stored_len;   /* length of input block */
//int last;         /* one if this is the last block for a file */
{
  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */
  var max_blindex = 0;        /* index of last bit length code of non zero freq */

  /* Build the Huffman trees unless a stored block is forced */
  if (s.level > 0) {

    /* Check if the file is binary or text */
    if (s.strm.data_type === Z_UNKNOWN) {
      s.strm.data_type = detect_data_type(s);
    }

    /* Construct the literal and distance trees */
    build_tree(s, s.l_desc);
    // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
    //        s->static_len));

    build_tree(s, s.d_desc);
    // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
    //        s->static_len));
    /* At this point, opt_len and static_len are the total bit lengths of
     * the compressed block data, excluding the tree representations.
     */

    /* Build the bit length tree for the above two trees, and get the index
     * in bl_order of the last bit length code to send.
     */
    max_blindex = build_bl_tree(s);

    /* Determine the best encoding. Compute the block lengths in bytes. */
    opt_lenb = (s.opt_len + 3 + 7) >>> 3;
    static_lenb = (s.static_len + 3 + 7) >>> 3;

    // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
    //        s->last_lit));

    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }

  } else {
    // Assert(buf != (char*)0, "lost buf");
    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
  }

  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {
    /* 4: two words for the lengths */

    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
     * Otherwise we can't have processed more than WSIZE input bytes since
     * the last block flush, because compression would have been
     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
     * transform a block into a stored block.
     */
    _tr_stored_block(s, buf, stored_len, last);

  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {

    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);
    compress_block(s, static_ltree, static_dtree);

  } else {
    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);
    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);
    compress_block(s, s.dyn_ltree, s.dyn_dtree);
  }
  // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
  /* The above check is made mod 2^32, for files larger than 512 MB
   * and uLong implemented on 32 bits.
   */
  init_block(s);

  if (last) {
    bi_windup(s);
  }
  // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
  //       s->compressed_len-7*last));
}

/* ===========================================================================
 * Save the match info and tally the frequency counts. Return true if
 * the current block must be flushed.
 */
function _tr_tally(s, dist, lc)
//    deflate_state *s;
//    unsigned dist;  /* distance of matched string */
//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
{
  //var out_length, in_length, dcode;

  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;
  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;

  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
  s.last_lit++;

  if (dist === 0) {
    /* lc is the unmatched char */
    s.dyn_ltree[lc * 2]/*.Freq*/++;
  } else {
    s.matches++;
    /* Here, lc is the match length - MIN_MATCH */
    dist--;             /* dist = match distance - 1 */
    //Assert((ush)dist < (ush)MAX_DIST(s) &&
    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
    //       (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");

    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;
    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
  }

// (!) This block is disabled in zlib defaults,
// don't enable it for binary compatibility

//#ifdef TRUNCATE_BLOCK
//  /* Try to guess if it is profitable to stop the current block here */
//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
//    /* Compute an upper bound for the compressed length */
//    out_length = s.last_lit*8;
//    in_length = s.strstart - s.block_start;
//
//    for (dcode = 0; dcode < D_CODES; dcode++) {
//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
//    }
//    out_length >>>= 3;
//    //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
//    //       s->last_lit, in_length, out_length,
//    //       100L - out_length*100L/in_length));
//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
//      return true;
//    }
//  }
//#endif

  return (s.last_lit === s.lit_bufsize - 1);
  /* We avoid equality with lit_bufsize because of wraparound at 64K
   * on 16 bit machines and because stored blocks are restricted to
   * 64K-1 bytes.
   */
}

exports._tr_init  = _tr_init;
exports._tr_stored_block = _tr_stored_block;
exports._tr_flush_block  = _tr_flush_block;
exports._tr_tally = _tr_tally;
exports._tr_align = _tr_align;

},{"../utils/common":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/utils/common.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/pako/lib/zlib/zstream.js":[function(require,module,exports){
'use strict';

// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//   claim that you wrote the original software. If you use this software
//   in a product, an acknowledgment in the product documentation would be
//   appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
//   misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.

function ZStream() {
  /* next input byte */
  this.input = null; // JS specific, because we have no pointers
  this.next_in = 0;
  /* number of bytes available at input */
  this.avail_in = 0;
  /* total number of input bytes read so far */
  this.total_in = 0;
  /* next output byte should be put there */
  this.output = null; // JS specific, because we have no pointers
  this.next_out = 0;
  /* remaining free space at output */
  this.avail_out = 0;
  /* total number of bytes output so far */
  this.total_out = 0;
  /* last error message, NULL if no error */
  this.msg = ''/*Z_NULL*/;
  /* not visible by applications */
  this.state = null;
  /* best guess about the data type: binary or text */
  this.data_type = 2/*Z_UNKNOWN*/;
  /* adler32 value of the uncompressed data */
  this.adler = 0;
}

module.exports = ZStream;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/path-browserify/index.js":[function(require,module,exports){
(function (process){(function (){
// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
// backported and transplited with Babel, with backwards-compat fixes

// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// resolves . and .. elements in a path array with directory names there
// must be no slashes, empty elements, or device names (c:\) in the array
// (so also no leading and trailing slashes - it does not distinguish
// relative and absolute paths)
function normalizeArray(parts, allowAboveRoot) {
  // if the path tries to go above the root, `up` ends up > 0
  var up = 0;
  for (var i = parts.length - 1; i >= 0; i--) {
    var last = parts[i];
    if (last === '.') {
      parts.splice(i, 1);
    } else if (last === '..') {
      parts.splice(i, 1);
      up++;
    } else if (up) {
      parts.splice(i, 1);
      up--;
    }
  }

  // if the path is allowed to go above the root, restore leading ..s
  if (allowAboveRoot) {
    for (; up--; up) {
      parts.unshift('..');
    }
  }

  return parts;
}

// path.resolve([from ...], to)
// posix version
exports.resolve = function() {
  var resolvedPath = '',
      resolvedAbsolute = false;

  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
    var path = (i >= 0) ? arguments[i] : process.cwd();

    // Skip empty and invalid entries
    if (typeof path !== 'string') {
      throw new TypeError('Arguments to path.resolve must be strings');
    } else if (!path) {
      continue;
    }

    resolvedPath = path + '/' + resolvedPath;
    resolvedAbsolute = path.charAt(0) === '/';
  }

  // At this point the path should be resolved to a full absolute path, but
  // handle relative paths to be safe (might happen when process.cwd() fails)

  // Normalize the path
  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
    return !!p;
  }), !resolvedAbsolute).join('/');

  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
};

// path.normalize(path)
// posix version
exports.normalize = function(path) {
  var isAbsolute = exports.isAbsolute(path),
      trailingSlash = substr(path, -1) === '/';

  // Normalize the path
  path = normalizeArray(filter(path.split('/'), function(p) {
    return !!p;
  }), !isAbsolute).join('/');

  if (!path && !isAbsolute) {
    path = '.';
  }
  if (path && trailingSlash) {
    path += '/';
  }

  return (isAbsolute ? '/' : '') + path;
};

// posix version
exports.isAbsolute = function(path) {
  return path.charAt(0) === '/';
};

// posix version
exports.join = function() {
  var paths = Array.prototype.slice.call(arguments, 0);
  return exports.normalize(filter(paths, function(p, index) {
    if (typeof p !== 'string') {
      throw new TypeError('Arguments to path.join must be strings');
    }
    return p;
  }).join('/'));
};


// path.relative(from, to)
// posix version
exports.relative = function(from, to) {
  from = exports.resolve(from).substr(1);
  to = exports.resolve(to).substr(1);

  function trim(arr) {
    var start = 0;
    for (; start < arr.length; start++) {
      if (arr[start] !== '') break;
    }

    var end = arr.length - 1;
    for (; end >= 0; end--) {
      if (arr[end] !== '') break;
    }

    if (start > end) return [];
    return arr.slice(start, end - start + 1);
  }

  var fromParts = trim(from.split('/'));
  var toParts = trim(to.split('/'));

  var length = Math.min(fromParts.length, toParts.length);
  var samePartsLength = length;
  for (var i = 0; i < length; i++) {
    if (fromParts[i] !== toParts[i]) {
      samePartsLength = i;
      break;
    }
  }

  var outputParts = [];
  for (var i = samePartsLength; i < fromParts.length; i++) {
    outputParts.push('..');
  }

  outputParts = outputParts.concat(toParts.slice(samePartsLength));

  return outputParts.join('/');
};

exports.sep = '/';
exports.delimiter = ':';

exports.dirname = function (path) {
  if (typeof path !== 'string') path = path + '';
  if (path.length === 0) return '.';
  var code = path.charCodeAt(0);
  var hasRoot = code === 47 /*/*/;
  var end = -1;
  var matchedSlash = true;
  for (var i = path.length - 1; i >= 1; --i) {
    code = path.charCodeAt(i);
    if (code === 47 /*/*/) {
        if (!matchedSlash) {
          end = i;
          break;
        }
      } else {
      // We saw the first non-path separator
      matchedSlash = false;
    }
  }

  if (end === -1) return hasRoot ? '/' : '.';
  if (hasRoot && end === 1) {
    // return '//';
    // Backwards-compat fix:
    return '/';
  }
  return path.slice(0, end);
};

function basename(path) {
  if (typeof path !== 'string') path = path + '';

  var start = 0;
  var end = -1;
  var matchedSlash = true;
  var i;

  for (i = path.length - 1; i >= 0; --i) {
    if (path.charCodeAt(i) === 47 /*/*/) {
        // If we reached a path separator that was not part of a set of path
        // separators at the end of the string, stop now
        if (!matchedSlash) {
          start = i + 1;
          break;
        }
      } else if (end === -1) {
      // We saw the first non-path separator, mark this as the end of our
      // path component
      matchedSlash = false;
      end = i + 1;
    }
  }

  if (end === -1) return '';
  return path.slice(start, end);
}

// Uses a mixed approach for backwards-compatibility, as ext behavior changed
// in new Node.js versions, so only basename() above is backported here
exports.basename = function (path, ext) {
  var f = basename(path);
  if (ext && f.substr(-1 * ext.length) === ext) {
    f = f.substr(0, f.length - ext.length);
  }
  return f;
};

exports.extname = function (path) {
  if (typeof path !== 'string') path = path + '';
  var startDot = -1;
  var startPart = 0;
  var end = -1;
  var matchedSlash = true;
  // Track the state of characters (if any) we see before our first dot and
  // after any path separator we find
  var preDotState = 0;
  for (var i = path.length - 1; i >= 0; --i) {
    var code = path.charCodeAt(i);
    if (code === 47 /*/*/) {
        // If we reached a path separator that was not part of a set of path
        // separators at the end of the string, stop now
        if (!matchedSlash) {
          startPart = i + 1;
          break;
        }
        continue;
      }
    if (end === -1) {
      // We saw the first non-path separator, mark this as the end of our
      // extension
      matchedSlash = false;
      end = i + 1;
    }
    if (code === 46 /*.*/) {
        // If this is our first dot, mark it as the start of our extension
        if (startDot === -1)
          startDot = i;
        else if (preDotState !== 1)
          preDotState = 1;
    } else if (startDot !== -1) {
      // We saw a non-dot and non-path separator before our dot, so we should
      // have a good chance at having a non-empty extension
      preDotState = -1;
    }
  }

  if (startDot === -1 || end === -1 ||
      // We saw a non-dot character immediately before the dot
      preDotState === 0 ||
      // The (right-most) trimmed path component is exactly '..'
      preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
    return '';
  }
  return path.slice(startDot, end);
};

function filter (xs, f) {
    if (xs.filter) return xs.filter(f);
    var res = [];
    for (var i = 0; i < xs.length; i++) {
        if (f(xs[i], i, xs)) res.push(xs[i]);
    }
    return res;
}

// String.prototype.substr - negative index don't work in IE8
var substr = 'ab'.substr(-1) === 'b'
    ? function (str, start, len) { return str.substr(start, len) }
    : function (str, start, len) {
        if (start < 0) start = str.length + start;
        return str.substr(start, len);
    }
;

}).call(this)}).call(this,require('_process'))
},{"_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process-nextick-args/index.js":[function(require,module,exports){
(function (process){(function (){
'use strict';

if (typeof process === 'undefined' ||
    !process.version ||
    process.version.indexOf('v0.') === 0 ||
    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
  module.exports = { nextTick: nextTick };
} else {
  module.exports = process
}

function nextTick(fn, arg1, arg2, arg3) {
  if (typeof fn !== 'function') {
    throw new TypeError('"callback" argument must be a function');
  }
  var len = arguments.length;
  var args, i;
  switch (len) {
  case 0:
  case 1:
    return process.nextTick(fn);
  case 2:
    return process.nextTick(function afterTickOne() {
      fn.call(null, arg1);
    });
  case 3:
    return process.nextTick(function afterTickTwo() {
      fn.call(null, arg1, arg2);
    });
  case 4:
    return process.nextTick(function afterTickThree() {
      fn.call(null, arg1, arg2, arg3);
    });
  default:
    args = new Array(len - 1);
    i = 0;
    while (i < args.length) {
      args[i++] = arguments[i];
    }
    return process.nextTick(function afterTick() {
      fn.apply(null, args);
    });
  }
}


}).call(this)}).call(this,require('_process'))
},{"_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js":[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }


}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }



}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) { return [] }

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/punycode/punycode.js":[function(require,module,exports){
(function (global){(function (){
/*! https://mths.be/punycode v1.4.1 by @mathias */
;(function(root) {

	/** Detect free variables */
	var freeExports = typeof exports == 'object' && exports &&
		!exports.nodeType && exports;
	var freeModule = typeof module == 'object' && module &&
		!module.nodeType && module;
	var freeGlobal = typeof global == 'object' && global;
	if (
		freeGlobal.global === freeGlobal ||
		freeGlobal.window === freeGlobal ||
		freeGlobal.self === freeGlobal
	) {
		root = freeGlobal;
	}

	/**
	 * The `punycode` object.
	 * @name punycode
	 * @type Object
	 */
	var punycode,

	/** Highest positive signed 32-bit float value */
	maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1

	/** Bootstring parameters */
	base = 36,
	tMin = 1,
	tMax = 26,
	skew = 38,
	damp = 700,
	initialBias = 72,
	initialN = 128, // 0x80
	delimiter = '-', // '\x2D'

	/** Regular expressions */
	regexPunycode = /^xn--/,
	regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
	regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators

	/** Error messages */
	errors = {
		'overflow': 'Overflow: input needs wider integers to process',
		'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
		'invalid-input': 'Invalid input'
	},

	/** Convenience shortcuts */
	baseMinusTMin = base - tMin,
	floor = Math.floor,
	stringFromCharCode = String.fromCharCode,

	/** Temporary variable */
	key;

	/*--------------------------------------------------------------------------*/

	/**
	 * A generic error utility function.
	 * @private
	 * @param {String} type The error type.
	 * @returns {Error} Throws a `RangeError` with the applicable error message.
	 */
	function error(type) {
		throw new RangeError(errors[type]);
	}

	/**
	 * A generic `Array#map` utility function.
	 * @private
	 * @param {Array} array The array to iterate over.
	 * @param {Function} callback The function that gets called for every array
	 * item.
	 * @returns {Array} A new array of values returned by the callback function.
	 */
	function map(array, fn) {
		var length = array.length;
		var result = [];
		while (length--) {
			result[length] = fn(array[length]);
		}
		return result;
	}

	/**
	 * A simple `Array#map`-like wrapper to work with domain name strings or email
	 * addresses.
	 * @private
	 * @param {String} domain The domain name or email address.
	 * @param {Function} callback The function that gets called for every
	 * character.
	 * @returns {Array} A new string of characters returned by the callback
	 * function.
	 */
	function mapDomain(string, fn) {
		var parts = string.split('@');
		var result = '';
		if (parts.length > 1) {
			// In email addresses, only the domain name should be punycoded. Leave
			// the local part (i.e. everything up to `@`) intact.
			result = parts[0] + '@';
			string = parts[1];
		}
		// Avoid `split(regex)` for IE8 compatibility. See #17.
		string = string.replace(regexSeparators, '\x2E');
		var labels = string.split('.');
		var encoded = map(labels, fn).join('.');
		return result + encoded;
	}

	/**
	 * Creates an array containing the numeric code points of each Unicode
	 * character in the string. While JavaScript uses UCS-2 internally,
	 * this function will convert a pair of surrogate halves (each of which
	 * UCS-2 exposes as separate characters) into a single code point,
	 * matching UTF-16.
	 * @see `punycode.ucs2.encode`
	 * @see <https://mathiasbynens.be/notes/javascript-encoding>
	 * @memberOf punycode.ucs2
	 * @name decode
	 * @param {String} string The Unicode input string (UCS-2).
	 * @returns {Array} The new array of code points.
	 */
	function ucs2decode(string) {
		var output = [],
		    counter = 0,
		    length = string.length,
		    value,
		    extra;
		while (counter < length) {
			value = string.charCodeAt(counter++);
			if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
				// high surrogate, and there is a next character
				extra = string.charCodeAt(counter++);
				if ((extra & 0xFC00) == 0xDC00) { // low surrogate
					output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
				} else {
					// unmatched surrogate; only append this code unit, in case the next
					// code unit is the high surrogate of a surrogate pair
					output.push(value);
					counter--;
				}
			} else {
				output.push(value);
			}
		}
		return output;
	}

	/**
	 * Creates a string based on an array of numeric code points.
	 * @see `punycode.ucs2.decode`
	 * @memberOf punycode.ucs2
	 * @name encode
	 * @param {Array} codePoints The array of numeric code points.
	 * @returns {String} The new Unicode string (UCS-2).
	 */
	function ucs2encode(array) {
		return map(array, function(value) {
			var output = '';
			if (value > 0xFFFF) {
				value -= 0x10000;
				output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
				value = 0xDC00 | value & 0x3FF;
			}
			output += stringFromCharCode(value);
			return output;
		}).join('');
	}

	/**
	 * Converts a basic code point into a digit/integer.
	 * @see `digitToBasic()`
	 * @private
	 * @param {Number} codePoint The basic numeric code point value.
	 * @returns {Number} The numeric value of a basic code point (for use in
	 * representing integers) in the range `0` to `base - 1`, or `base` if
	 * the code point does not represent a value.
	 */
	function basicToDigit(codePoint) {
		if (codePoint - 48 < 10) {
			return codePoint - 22;
		}
		if (codePoint - 65 < 26) {
			return codePoint - 65;
		}
		if (codePoint - 97 < 26) {
			return codePoint - 97;
		}
		return base;
	}

	/**
	 * Converts a digit/integer into a basic code point.
	 * @see `basicToDigit()`
	 * @private
	 * @param {Number} digit The numeric value of a basic code point.
	 * @returns {Number} The basic code point whose value (when used for
	 * representing integers) is `digit`, which needs to be in the range
	 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
	 * used; else, the lowercase form is used. The behavior is undefined
	 * if `flag` is non-zero and `digit` has no uppercase form.
	 */
	function digitToBasic(digit, flag) {
		//  0..25 map to ASCII a..z or A..Z
		// 26..35 map to ASCII 0..9
		return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
	}

	/**
	 * Bias adaptation function as per section 3.4 of RFC 3492.
	 * https://tools.ietf.org/html/rfc3492#section-3.4
	 * @private
	 */
	function adapt(delta, numPoints, firstTime) {
		var k = 0;
		delta = firstTime ? floor(delta / damp) : delta >> 1;
		delta += floor(delta / numPoints);
		for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
			delta = floor(delta / baseMinusTMin);
		}
		return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
	}

	/**
	 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
	 * symbols.
	 * @memberOf punycode
	 * @param {String} input The Punycode string of ASCII-only symbols.
	 * @returns {String} The resulting string of Unicode symbols.
	 */
	function decode(input) {
		// Don't use UCS-2
		var output = [],
		    inputLength = input.length,
		    out,
		    i = 0,
		    n = initialN,
		    bias = initialBias,
		    basic,
		    j,
		    index,
		    oldi,
		    w,
		    k,
		    digit,
		    t,
		    /** Cached calculation results */
		    baseMinusT;

		// Handle the basic code points: let `basic` be the number of input code
		// points before the last delimiter, or `0` if there is none, then copy
		// the first basic code points to the output.

		basic = input.lastIndexOf(delimiter);
		if (basic < 0) {
			basic = 0;
		}

		for (j = 0; j < basic; ++j) {
			// if it's not a basic code point
			if (input.charCodeAt(j) >= 0x80) {
				error('not-basic');
			}
			output.push(input.charCodeAt(j));
		}

		// Main decoding loop: start just after the last delimiter if any basic code
		// points were copied; start at the beginning otherwise.

		for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {

			// `index` is the index of the next character to be consumed.
			// Decode a generalized variable-length integer into `delta`,
			// which gets added to `i`. The overflow checking is easier
			// if we increase `i` as we go, then subtract off its starting
			// value at the end to obtain `delta`.
			for (oldi = i, w = 1, k = base; /* no condition */; k += base) {

				if (index >= inputLength) {
					error('invalid-input');
				}

				digit = basicToDigit(input.charCodeAt(index++));

				if (digit >= base || digit > floor((maxInt - i) / w)) {
					error('overflow');
				}

				i += digit * w;
				t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);

				if (digit < t) {
					break;
				}

				baseMinusT = base - t;
				if (w > floor(maxInt / baseMinusT)) {
					error('overflow');
				}

				w *= baseMinusT;

			}

			out = output.length + 1;
			bias = adapt(i - oldi, out, oldi == 0);

			// `i` was supposed to wrap around from `out` to `0`,
			// incrementing `n` each time, so we'll fix that now:
			if (floor(i / out) > maxInt - n) {
				error('overflow');
			}

			n += floor(i / out);
			i %= out;

			// Insert `n` at position `i` of the output
			output.splice(i++, 0, n);

		}

		return ucs2encode(output);
	}

	/**
	 * Converts a string of Unicode symbols (e.g. a domain name label) to a
	 * Punycode string of ASCII-only symbols.
	 * @memberOf punycode
	 * @param {String} input The string of Unicode symbols.
	 * @returns {String} The resulting Punycode string of ASCII-only symbols.
	 */
	function encode(input) {
		var n,
		    delta,
		    handledCPCount,
		    basicLength,
		    bias,
		    j,
		    m,
		    q,
		    k,
		    t,
		    currentValue,
		    output = [],
		    /** `inputLength` will hold the number of code points in `input`. */
		    inputLength,
		    /** Cached calculation results */
		    handledCPCountPlusOne,
		    baseMinusT,
		    qMinusT;

		// Convert the input in UCS-2 to Unicode
		input = ucs2decode(input);

		// Cache the length
		inputLength = input.length;

		// Initialize the state
		n = initialN;
		delta = 0;
		bias = initialBias;

		// Handle the basic code points
		for (j = 0; j < inputLength; ++j) {
			currentValue = input[j];
			if (currentValue < 0x80) {
				output.push(stringFromCharCode(currentValue));
			}
		}

		handledCPCount = basicLength = output.length;

		// `handledCPCount` is the number of code points that have been handled;
		// `basicLength` is the number of basic code points.

		// Finish the basic string - if it is not empty - with a delimiter
		if (basicLength) {
			output.push(delimiter);
		}

		// Main encoding loop:
		while (handledCPCount < inputLength) {

			// All non-basic code points < n have been handled already. Find the next
			// larger one:
			for (m = maxInt, j = 0; j < inputLength; ++j) {
				currentValue = input[j];
				if (currentValue >= n && currentValue < m) {
					m = currentValue;
				}
			}

			// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
			// but guard against overflow
			handledCPCountPlusOne = handledCPCount + 1;
			if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
				error('overflow');
			}

			delta += (m - n) * handledCPCountPlusOne;
			n = m;

			for (j = 0; j < inputLength; ++j) {
				currentValue = input[j];

				if (currentValue < n && ++delta > maxInt) {
					error('overflow');
				}

				if (currentValue == n) {
					// Represent delta as a generalized variable-length integer
					for (q = delta, k = base; /* no condition */; k += base) {
						t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
						if (q < t) {
							break;
						}
						qMinusT = q - t;
						baseMinusT = base - t;
						output.push(
							stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
						);
						q = floor(qMinusT / baseMinusT);
					}

					output.push(stringFromCharCode(digitToBasic(q, 0)));
					bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
					delta = 0;
					++handledCPCount;
				}
			}

			++delta;
			++n;

		}
		return output.join('');
	}

	/**
	 * Converts a Punycode string representing a domain name or an email address
	 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
	 * it doesn't matter if you call it on a string that has already been
	 * converted to Unicode.
	 * @memberOf punycode
	 * @param {String} input The Punycoded domain name or email address to
	 * convert to Unicode.
	 * @returns {String} The Unicode representation of the given Punycode
	 * string.
	 */
	function toUnicode(input) {
		return mapDomain(input, function(string) {
			return regexPunycode.test(string)
				? decode(string.slice(4).toLowerCase())
				: string;
		});
	}

	/**
	 * Converts a Unicode string representing a domain name or an email address to
	 * Punycode. Only the non-ASCII parts of the domain name will be converted,
	 * i.e. it doesn't matter if you call it with a domain that's already in
	 * ASCII.
	 * @memberOf punycode
	 * @param {String} input The domain name or email address to convert, as a
	 * Unicode string.
	 * @returns {String} The Punycode representation of the given domain name or
	 * email address.
	 */
	function toASCII(input) {
		return mapDomain(input, function(string) {
			return regexNonASCII.test(string)
				? 'xn--' + encode(string)
				: string;
		});
	}

	/*--------------------------------------------------------------------------*/

	/** Define the public API */
	punycode = {
		/**
		 * A string representing the current Punycode.js version number.
		 * @memberOf punycode
		 * @type String
		 */
		'version': '1.4.1',
		/**
		 * An object of methods to convert from JavaScript's internal character
		 * representation (UCS-2) to Unicode code points, and back.
		 * @see <https://mathiasbynens.be/notes/javascript-encoding>
		 * @memberOf punycode
		 * @type Object
		 */
		'ucs2': {
			'decode': ucs2decode,
			'encode': ucs2encode
		},
		'decode': decode,
		'encode': encode,
		'toASCII': toASCII,
		'toUnicode': toUnicode
	};

	/** Expose `punycode` */
	// Some AMD build optimizers, like r.js, check for specific condition patterns
	// like the following:
	if (
		typeof define == 'function' &&
		typeof define.amd == 'object' &&
		define.amd
	) {
		define('punycode', function() {
			return punycode;
		});
	} else if (freeExports && freeModule) {
		if (module.exports == freeExports) {
			// in Node.js, io.js, or RingoJS v0.8.0+
			freeModule.exports = punycode;
		} else {
			// in Narwhal or RingoJS v0.7.0-
			for (key in punycode) {
				punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
			}
		}
	} else {
		// in Rhino or a web browser
		root.punycode = punycode;
	}

}(this));

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/formats.js":[function(require,module,exports){
'use strict';

var replace = String.prototype.replace;
var percentTwenties = /%20/g;

var Format = {
    RFC1738: 'RFC1738',
    RFC3986: 'RFC3986'
};

module.exports = {
    'default': Format.RFC3986,
    formatters: {
        RFC1738: function (value) {
            return replace.call(value, percentTwenties, '+');
        },
        RFC3986: function (value) {
            return String(value);
        }
    },
    RFC1738: Format.RFC1738,
    RFC3986: Format.RFC3986
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/index.js":[function(require,module,exports){
'use strict';

var stringify = require('./stringify');
var parse = require('./parse');
var formats = require('./formats');

module.exports = {
    formats: formats,
    parse: parse,
    stringify: stringify
};

},{"./formats":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/formats.js","./parse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/parse.js","./stringify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/stringify.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/parse.js":[function(require,module,exports){
'use strict';

var utils = require('./utils');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var defaults = {
    allowDots: false,
    allowPrototypes: false,
    allowSparse: false,
    arrayLimit: 20,
    charset: 'utf-8',
    charsetSentinel: false,
    comma: false,
    decoder: utils.decode,
    delimiter: '&',
    depth: 5,
    ignoreQueryPrefix: false,
    interpretNumericEntities: false,
    parameterLimit: 1000,
    parseArrays: true,
    plainObjects: false,
    strictNullHandling: false
};

var interpretNumericEntities = function (str) {
    return str.replace(/&#(\d+);/g, function ($0, numberStr) {
        return String.fromCharCode(parseInt(numberStr, 10));
    });
};

var parseArrayValue = function (val, options) {
    if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {
        return val.split(',');
    }

    return val;
};

// This is what browsers will submit when the ✓ character occurs in an
// application/x-www-form-urlencoded body and the encoding of the page containing
// the form is iso-8859-1, or when the submitted form has an accept-charset
// attribute of iso-8859-1. Presumably also with other charsets that do not contain
// the ✓ character, such as us-ascii.
var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('&#10003;')

// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.
var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')

var parseValues = function parseQueryStringValues(str, options) {
    var obj = {};
    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
    var parts = cleanStr.split(options.delimiter, limit);
    var skipIndex = -1; // Keep track of where the utf8 sentinel was found
    var i;

    var charset = options.charset;
    if (options.charsetSentinel) {
        for (i = 0; i < parts.length; ++i) {
            if (parts[i].indexOf('utf8=') === 0) {
                if (parts[i] === charsetSentinel) {
                    charset = 'utf-8';
                } else if (parts[i] === isoSentinel) {
                    charset = 'iso-8859-1';
                }
                skipIndex = i;
                i = parts.length; // The eslint settings do not allow break;
            }
        }
    }

    for (i = 0; i < parts.length; ++i) {
        if (i === skipIndex) {
            continue;
        }
        var part = parts[i];

        var bracketEqualsPos = part.indexOf(']=');
        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;

        var key, val;
        if (pos === -1) {
            key = options.decoder(part, defaults.decoder, charset, 'key');
            val = options.strictNullHandling ? null : '';
        } else {
            key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');
            val = utils.maybeMap(
                parseArrayValue(part.slice(pos + 1), options),
                function (encodedVal) {
                    return options.decoder(encodedVal, defaults.decoder, charset, 'value');
                }
            );
        }

        if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {
            val = interpretNumericEntities(val);
        }

        if (part.indexOf('[]=') > -1) {
            val = isArray(val) ? [val] : val;
        }

        if (has.call(obj, key)) {
            obj[key] = utils.combine(obj[key], val);
        } else {
            obj[key] = val;
        }
    }

    return obj;
};

var parseObject = function (chain, val, options, valuesParsed) {
    var leaf = valuesParsed ? val : parseArrayValue(val, options);

    for (var i = chain.length - 1; i >= 0; --i) {
        var obj;
        var root = chain[i];

        if (root === '[]' && options.parseArrays) {
            obj = [].concat(leaf);
        } else {
            obj = options.plainObjects ? Object.create(null) : {};
            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
            var index = parseInt(cleanRoot, 10);
            if (!options.parseArrays && cleanRoot === '') {
                obj = { 0: leaf };
            } else if (
                !isNaN(index)
                && root !== cleanRoot
                && String(index) === cleanRoot
                && index >= 0
                && (options.parseArrays && index <= options.arrayLimit)
            ) {
                obj = [];
                obj[index] = leaf;
            } else if (cleanRoot !== '__proto__') {
                obj[cleanRoot] = leaf;
            }
        }

        leaf = obj;
    }

    return leaf;
};

var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
    if (!givenKey) {
        return;
    }

    // Transform dot notation to bracket notation
    var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;

    // The regex chunks

    var brackets = /(\[[^[\]]*])/;
    var child = /(\[[^[\]]*])/g;

    // Get the parent

    var segment = options.depth > 0 && brackets.exec(key);
    var parent = segment ? key.slice(0, segment.index) : key;

    // Stash the parent if it exists

    var keys = [];
    if (parent) {
        // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties
        if (!options.plainObjects && has.call(Object.prototype, parent)) {
            if (!options.allowPrototypes) {
                return;
            }
        }

        keys.push(parent);
    }

    // Loop through children appending to the array until we hit depth

    var i = 0;
    while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {
        i += 1;
        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
            if (!options.allowPrototypes) {
                return;
            }
        }
        keys.push(segment[1]);
    }

    // If there's a remainder, just add whatever is left

    if (segment) {
        keys.push('[' + key.slice(segment.index) + ']');
    }

    return parseObject(keys, val, options, valuesParsed);
};

var normalizeParseOptions = function normalizeParseOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {
        throw new TypeError('Decoder has to be a function.');
    }

    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }
    var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;

    return {
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,
        allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse,
        arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,
        decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,
        delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,
        // eslint-disable-next-line no-implicit-coercion, no-extra-parens
        depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,
        ignoreQueryPrefix: opts.ignoreQueryPrefix === true,
        interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,
        parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,
        parseArrays: opts.parseArrays !== false,
        plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (str, opts) {
    var options = normalizeParseOptions(opts);

    if (str === '' || str === null || typeof str === 'undefined') {
        return options.plainObjects ? Object.create(null) : {};
    }

    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
    var obj = options.plainObjects ? Object.create(null) : {};

    // Iterate over the keys and setup the new object

    var keys = Object.keys(tempObj);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');
        obj = utils.merge(obj, newObj, options);
    }

    if (options.allowSparse === true) {
        return obj;
    }

    return utils.compact(obj);
};

},{"./utils":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/utils.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/stringify.js":[function(require,module,exports){
'use strict';

var getSideChannel = require('side-channel');
var utils = require('./utils');
var formats = require('./formats');
var has = Object.prototype.hasOwnProperty;

var arrayPrefixGenerators = {
    brackets: function brackets(prefix) {
        return prefix + '[]';
    },
    comma: 'comma',
    indices: function indices(prefix, key) {
        return prefix + '[' + key + ']';
    },
    repeat: function repeat(prefix) {
        return prefix;
    }
};

var isArray = Array.isArray;
var split = String.prototype.split;
var push = Array.prototype.push;
var pushToArray = function (arr, valueOrArray) {
    push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
};

var toISO = Date.prototype.toISOString;

var defaultFormat = formats['default'];
var defaults = {
    addQueryPrefix: false,
    allowDots: false,
    charset: 'utf-8',
    charsetSentinel: false,
    delimiter: '&',
    encode: true,
    encoder: utils.encode,
    encodeValuesOnly: false,
    format: defaultFormat,
    formatter: formats.formatters[defaultFormat],
    // deprecated
    indices: false,
    serializeDate: function serializeDate(date) {
        return toISO.call(date);
    },
    skipNulls: false,
    strictNullHandling: false
};

var isNonNullishPrimitive = function isNonNullishPrimitive(v) {
    return typeof v === 'string'
        || typeof v === 'number'
        || typeof v === 'boolean'
        || typeof v === 'symbol'
        || typeof v === 'bigint';
};

var sentinel = {};

var stringify = function stringify(
    object,
    prefix,
    generateArrayPrefix,
    strictNullHandling,
    skipNulls,
    encoder,
    filter,
    sort,
    allowDots,
    serializeDate,
    format,
    formatter,
    encodeValuesOnly,
    charset,
    sideChannel
) {
    var obj = object;

    var tmpSc = sideChannel;
    var step = 0;
    var findFlag = false;
    while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {
        // Where object last appeared in the ref tree
        var pos = tmpSc.get(object);
        step += 1;
        if (typeof pos !== 'undefined') {
            if (pos === step) {
                throw new RangeError('Cyclic object value');
            } else {
                findFlag = true; // Break while
            }
        }
        if (typeof tmpSc.get(sentinel) === 'undefined') {
            step = 0;
        }
    }

    if (typeof filter === 'function') {
        obj = filter(prefix, obj);
    } else if (obj instanceof Date) {
        obj = serializeDate(obj);
    } else if (generateArrayPrefix === 'comma' && isArray(obj)) {
        obj = utils.maybeMap(obj, function (value) {
            if (value instanceof Date) {
                return serializeDate(value);
            }
            return value;
        });
    }

    if (obj === null) {
        if (strictNullHandling) {
            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
        }

        obj = '';
    }

    if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {
        if (encoder) {
            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);
            if (generateArrayPrefix === 'comma' && encodeValuesOnly) {
                var valuesArray = split.call(String(obj), ',');
                var valuesJoined = '';
                for (var i = 0; i < valuesArray.length; ++i) {
                    valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format));
                }
                return [formatter(keyValue) + '=' + valuesJoined];
            }
            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];
        }
        return [formatter(prefix) + '=' + formatter(String(obj))];
    }

    var values = [];

    if (typeof obj === 'undefined') {
        return values;
    }

    var objKeys;
    if (generateArrayPrefix === 'comma' && isArray(obj)) {
        // we need to join elements in
        objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
    } else if (isArray(filter)) {
        objKeys = filter;
    } else {
        var keys = Object.keys(obj);
        objKeys = sort ? keys.sort(sort) : keys;
    }

    for (var j = 0; j < objKeys.length; ++j) {
        var key = objKeys[j];
        var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];

        if (skipNulls && value === null) {
            continue;
        }

        var keyPrefix = isArray(obj)
            ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix
            : prefix + (allowDots ? '.' + key : '[' + key + ']');

        sideChannel.set(object, step);
        var valueSideChannel = getSideChannel();
        valueSideChannel.set(sentinel, sideChannel);
        pushToArray(values, stringify(
            value,
            keyPrefix,
            generateArrayPrefix,
            strictNullHandling,
            skipNulls,
            encoder,
            filter,
            sort,
            allowDots,
            serializeDate,
            format,
            formatter,
            encodeValuesOnly,
            charset,
            valueSideChannel
        ));
    }

    return values;
};

var normalizeStringifyOptions = function normalizeStringifyOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {
        throw new TypeError('Encoder has to be a function.');
    }

    var charset = opts.charset || defaults.charset;
    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }

    var format = formats['default'];
    if (typeof opts.format !== 'undefined') {
        if (!has.call(formats.formatters, opts.format)) {
            throw new TypeError('Unknown format option provided.');
        }
        format = opts.format;
    }
    var formatter = formats.formatters[format];

    var filter = defaults.filter;
    if (typeof opts.filter === 'function' || isArray(opts.filter)) {
        filter = opts.filter;
    }

    return {
        addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,
        encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,
        encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,
        encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,
        filter: filter,
        format: format,
        formatter: formatter,
        serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,
        skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,
        sort: typeof opts.sort === 'function' ? opts.sort : null,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (object, opts) {
    var obj = object;
    var options = normalizeStringifyOptions(opts);

    var objKeys;
    var filter;

    if (typeof options.filter === 'function') {
        filter = options.filter;
        obj = filter('', obj);
    } else if (isArray(options.filter)) {
        filter = options.filter;
        objKeys = filter;
    }

    var keys = [];

    if (typeof obj !== 'object' || obj === null) {
        return '';
    }

    var arrayFormat;
    if (opts && opts.arrayFormat in arrayPrefixGenerators) {
        arrayFormat = opts.arrayFormat;
    } else if (opts && 'indices' in opts) {
        arrayFormat = opts.indices ? 'indices' : 'repeat';
    } else {
        arrayFormat = 'indices';
    }

    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];

    if (!objKeys) {
        objKeys = Object.keys(obj);
    }

    if (options.sort) {
        objKeys.sort(options.sort);
    }

    var sideChannel = getSideChannel();
    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (options.skipNulls && obj[key] === null) {
            continue;
        }
        pushToArray(keys, stringify(
            obj[key],
            key,
            generateArrayPrefix,
            options.strictNullHandling,
            options.skipNulls,
            options.encode ? options.encoder : null,
            options.filter,
            options.sort,
            options.allowDots,
            options.serializeDate,
            options.format,
            options.formatter,
            options.encodeValuesOnly,
            options.charset,
            sideChannel
        ));
    }

    var joined = keys.join(options.delimiter);
    var prefix = options.addQueryPrefix === true ? '?' : '';

    if (options.charsetSentinel) {
        if (options.charset === 'iso-8859-1') {
            // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
            prefix += 'utf8=%26%2310003%3B&';
        } else {
            // encodeURIComponent('✓')
            prefix += 'utf8=%E2%9C%93&';
        }
    }

    return joined.length > 0 ? prefix + joined : '';
};

},{"./formats":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/formats.js","./utils":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/utils.js","side-channel":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/side-channel/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/utils.js":[function(require,module,exports){
'use strict';

var formats = require('./formats');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var hexTable = (function () {
    var array = [];
    for (var i = 0; i < 256; ++i) {
        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
    }

    return array;
}());

var compactQueue = function compactQueue(queue) {
    while (queue.length > 1) {
        var item = queue.pop();
        var obj = item.obj[item.prop];

        if (isArray(obj)) {
            var compacted = [];

            for (var j = 0; j < obj.length; ++j) {
                if (typeof obj[j] !== 'undefined') {
                    compacted.push(obj[j]);
                }
            }

            item.obj[item.prop] = compacted;
        }
    }
};

var arrayToObject = function arrayToObject(source, options) {
    var obj = options && options.plainObjects ? Object.create(null) : {};
    for (var i = 0; i < source.length; ++i) {
        if (typeof source[i] !== 'undefined') {
            obj[i] = source[i];
        }
    }

    return obj;
};

var merge = function merge(target, source, options) {
    /* eslint no-param-reassign: 0 */
    if (!source) {
        return target;
    }

    if (typeof source !== 'object') {
        if (isArray(target)) {
            target.push(source);
        } else if (target && typeof target === 'object') {
            if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {
                target[source] = true;
            }
        } else {
            return [target, source];
        }

        return target;
    }

    if (!target || typeof target !== 'object') {
        return [target].concat(source);
    }

    var mergeTarget = target;
    if (isArray(target) && !isArray(source)) {
        mergeTarget = arrayToObject(target, options);
    }

    if (isArray(target) && isArray(source)) {
        source.forEach(function (item, i) {
            if (has.call(target, i)) {
                var targetItem = target[i];
                if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
                    target[i] = merge(targetItem, item, options);
                } else {
                    target.push(item);
                }
            } else {
                target[i] = item;
            }
        });
        return target;
    }

    return Object.keys(source).reduce(function (acc, key) {
        var value = source[key];

        if (has.call(acc, key)) {
            acc[key] = merge(acc[key], value, options);
        } else {
            acc[key] = value;
        }
        return acc;
    }, mergeTarget);
};

var assign = function assignSingleSource(target, source) {
    return Object.keys(source).reduce(function (acc, key) {
        acc[key] = source[key];
        return acc;
    }, target);
};

var decode = function (str, decoder, charset) {
    var strWithoutPlus = str.replace(/\+/g, ' ');
    if (charset === 'iso-8859-1') {
        // unescape never throws, no try...catch needed:
        return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
    }
    // utf-8
    try {
        return decodeURIComponent(strWithoutPlus);
    } catch (e) {
        return strWithoutPlus;
    }
};

var encode = function encode(str, defaultEncoder, charset, kind, format) {
    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
    // It has been adapted here for stricter adherence to RFC 3986
    if (str.length === 0) {
        return str;
    }

    var string = str;
    if (typeof str === 'symbol') {
        string = Symbol.prototype.toString.call(str);
    } else if (typeof str !== 'string') {
        string = String(str);
    }

    if (charset === 'iso-8859-1') {
        return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
            return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
        });
    }

    var out = '';
    for (var i = 0; i < string.length; ++i) {
        var c = string.charCodeAt(i);

        if (
            c === 0x2D // -
            || c === 0x2E // .
            || c === 0x5F // _
            || c === 0x7E // ~
            || (c >= 0x30 && c <= 0x39) // 0-9
            || (c >= 0x41 && c <= 0x5A) // a-z
            || (c >= 0x61 && c <= 0x7A) // A-Z
            || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )
        ) {
            out += string.charAt(i);
            continue;
        }

        if (c < 0x80) {
            out = out + hexTable[c];
            continue;
        }

        if (c < 0x800) {
            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        if (c < 0xD800 || c >= 0xE000) {
            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        i += 1;
        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
        /* eslint operator-linebreak: [2, "before"] */
        out += hexTable[0xF0 | (c >> 18)]
            + hexTable[0x80 | ((c >> 12) & 0x3F)]
            + hexTable[0x80 | ((c >> 6) & 0x3F)]
            + hexTable[0x80 | (c & 0x3F)];
    }

    return out;
};

var compact = function compact(value) {
    var queue = [{ obj: { o: value }, prop: 'o' }];
    var refs = [];

    for (var i = 0; i < queue.length; ++i) {
        var item = queue[i];
        var obj = item.obj[item.prop];

        var keys = Object.keys(obj);
        for (var j = 0; j < keys.length; ++j) {
            var key = keys[j];
            var val = obj[key];
            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
                queue.push({ obj: obj, prop: key });
                refs.push(val);
            }
        }
    }

    compactQueue(queue);

    return value;
};

var isRegExp = function isRegExp(obj) {
    return Object.prototype.toString.call(obj) === '[object RegExp]';
};

var isBuffer = function isBuffer(obj) {
    if (!obj || typeof obj !== 'object') {
        return false;
    }

    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};

var combine = function combine(a, b) {
    return [].concat(a, b);
};

var maybeMap = function maybeMap(val, fn) {
    if (isArray(val)) {
        var mapped = [];
        for (var i = 0; i < val.length; i += 1) {
            mapped.push(fn(val[i]));
        }
        return mapped;
    }
    return fn(val);
};

module.exports = {
    arrayToObject: arrayToObject,
    assign: assign,
    combine: combine,
    compact: compact,
    decode: decode,
    encode: encode,
    isBuffer: isBuffer,
    isRegExp: isRegExp,
    maybeMap: maybeMap,
    merge: merge
};

},{"./formats":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/qs/lib/formats.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/querystring-es3/decode.js":[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

// If obj.hasOwnProperty has been overridden, then calling
// obj.hasOwnProperty(prop) will break.
// See: https://github.com/joyent/node/issues/1707
function hasOwnProperty(obj, prop) {
  return Object.prototype.hasOwnProperty.call(obj, prop);
}

module.exports = function(qs, sep, eq, options) {
  sep = sep || '&';
  eq = eq || '=';
  var obj = {};

  if (typeof qs !== 'string' || qs.length === 0) {
    return obj;
  }

  var regexp = /\+/g;
  qs = qs.split(sep);

  var maxKeys = 1000;
  if (options && typeof options.maxKeys === 'number') {
    maxKeys = options.maxKeys;
  }

  var len = qs.length;
  // maxKeys <= 0 means that we should not limit keys count
  if (maxKeys > 0 && len > maxKeys) {
    len = maxKeys;
  }

  for (var i = 0; i < len; ++i) {
    var x = qs[i].replace(regexp, '%20'),
        idx = x.indexOf(eq),
        kstr, vstr, k, v;

    if (idx >= 0) {
      kstr = x.substr(0, idx);
      vstr = x.substr(idx + 1);
    } else {
      kstr = x;
      vstr = '';
    }

    k = decodeURIComponent(kstr);
    v = decodeURIComponent(vstr);

    if (!hasOwnProperty(obj, k)) {
      obj[k] = v;
    } else if (isArray(obj[k])) {
      obj[k].push(v);
    } else {
      obj[k] = [obj[k], v];
    }
  }

  return obj;
};

var isArray = Array.isArray || function (xs) {
  return Object.prototype.toString.call(xs) === '[object Array]';
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/querystring-es3/encode.js":[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

var stringifyPrimitive = function(v) {
  switch (typeof v) {
    case 'string':
      return v;

    case 'boolean':
      return v ? 'true' : 'false';

    case 'number':
      return isFinite(v) ? v : '';

    default:
      return '';
  }
};

module.exports = function(obj, sep, eq, name) {
  sep = sep || '&';
  eq = eq || '=';
  if (obj === null) {
    obj = undefined;
  }

  if (typeof obj === 'object') {
    return map(objectKeys(obj), function(k) {
      var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
      if (isArray(obj[k])) {
        return map(obj[k], function(v) {
          return ks + encodeURIComponent(stringifyPrimitive(v));
        }).join(sep);
      } else {
        return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
      }
    }).join(sep);

  }

  if (!name) return '';
  return encodeURIComponent(stringifyPrimitive(name)) + eq +
         encodeURIComponent(stringifyPrimitive(obj));
};

var isArray = Array.isArray || function (xs) {
  return Object.prototype.toString.call(xs) === '[object Array]';
};

function map (xs, f) {
  if (xs.map) return xs.map(f);
  var res = [];
  for (var i = 0; i < xs.length; i++) {
    res.push(f(xs[i], i));
  }
  return res;
}

var objectKeys = Object.keys || function (obj) {
  var res = [];
  for (var key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
  }
  return res;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/querystring-es3/index.js":[function(require,module,exports){
'use strict';

exports.decode = exports.parse = require('./decode');
exports.encode = exports.stringify = require('./encode');

},{"./decode":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/querystring-es3/decode.js","./encode":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/querystring-es3/encode.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/Y.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Y-combinator
 *
 * The Y combinator is an interesting function which only works with functional languages,
 * showing how recursion can still be done even without any variable or function declarations,
 * only functions and parameters
 *
 * @func Y
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.3.0|v2.3.0}
 * @category Function
 * @sig (a, ... -> b -> b) -> (a, ... -> b)
 * @param {Function} le Recursive function maker
 * @return {Function}
 * @see {@link http://kestas.kuliukas.com/YCombinatorExplained/|Y combinator explained}
 * @example
 *
 * const makeFact = givenFact => (n) => {
 *   if (n < 2) { return 1 }
 *   return n * givenFact(n - 1);
 * };
 *
 * const factorial = RA.Y(makeFact);
 *
 * factorial(5); //=> 120
 */
var Y = (0, _ramda.curryN)(1, function (le) {
  return function (f) {
    return f(f);
  }(function (g) {
    return le(function (x) {
      return g(g)(x);
    });
  });
});
var _default = Y;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allEqual.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _lengthLte = _interopRequireDefault(require("./lengthLte"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

// Original idea for this function was conceived by https://github.com/jackmellis
// in https://github.com/char0n/ramda-adjunct/pull/513.

/**
 * Returns true if all items in the list are equivalent using `R.equals` for equality comparisons.
 *
 * @func allEqual
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.9.0|v2.9.0}
 * @category List
 * @sig [a] -> Boolean
 * @param {Array} list The list of values
 * @return {boolean}
 * @see {@link https://ramdajs.com/docs/#equals|equals}
 * @example
 *
 * RA.allEqual([ 1, 2, 3, 4 ]); //=> false
 * RA.allEqual([ 1, 1, 1, 1 ]); //=> true
 * RA.allEqual([]); //=> true
 *
 */
var allEqual = (0, _ramda.curryN)(1, (0, _ramda.pipe)(_ramda.uniq, (0, _lengthLte["default"])(1)));
var _default = allEqual;
exports["default"] = _default;
},{"./lengthLte":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthLte.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allEqualTo.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns true if all items in the list are equivalent to user provided value using `R.equals` for equality comparisons.
 *
 * @func allEqualTo
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.11.0|v2.11.0}
 * @category List
 * @sig a -> [b] -> Boolean
 * @param {*} val User provided value to check the `list` against
 * @param {Array} list The list of values
 * @return {boolean}
 * @see {@link RA.allEqual|allEqual}, {@link https://ramdajs.com/docs/#equals|equals}
 * @example
 *
 * RA.allEqualTo(1, [ 1, 2, 3, 4 ]); //=> false
 * RA.allEqualTo(1, [ 1, 1, 1, 1 ]); //=> true
 * RA.allEqualTo({}, [ {}, {} ]); //=> true
 * RA.allEqualTo(1, []); //=> true
 *
 */
var allEqualTo = (0, _ramda.curry)(function (val, list) {
  return (0, _ramda.all)((0, _ramda.equals)(val), list);
});
var _default = allEqualTo;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allIdentical.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _lengthLte = _interopRequireDefault(require("./lengthLte"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns true if all items in the list are equivalent using `R.identical` for equality comparisons.
 *
 * @func allIdentical
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.11.0|v2.11.0}
 * @category List
 * @sig [a] -> Boolean
 * @param {Array} list The list of values
 * @return {boolean}
 * @see {@link https://ramdajs.com/docs/#identical|identical}
 * @example
 *
 * RA.allIdentical([ 1, 2, 3, 4 ]); //=> false
 * RA.allIdentical([ 1, 1, 1, 1 ]); //=> true
 * RA.allIdentical([]); //=> true
 * RA.allIdentical([ {}, {} ]); //=> false
 * RA.allIdentical([ () => {}, () => {} ]); //=> false
 */
var allIdentical = (0, _ramda.curryN)(1, (0, _ramda.pipe)((0, _ramda.uniqWith)(_ramda.identical), (0, _lengthLte["default"])(1)));
var _default = allIdentical;
exports["default"] = _default;
},{"./lengthLte":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthLte.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allIdenticalTo.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns true if all items in the list are equivalent to user provided value using `R.identical` for equality comparisons.
 *
 * @func allIdenticalTo
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.11.0|v2.11.0}
 * @category List
 * @sig a -> [b] -> Boolean
 * @param {*} val User provided value to check the `list` against
 * @param {Array} list The list of values
 * @return {boolean}
 * @see {@link RA.allIdentical|allIdentical}, {@link http://ramdajs.com/docs/#identical|R.identical}
 * @example
 *
 * RA.allIdenticalTo(1, [ 1, 2, 3, 4 ]); //=> false
 * RA.allIdenticalTo(1, [ 1, 1, 1, 1 ]); //=> true
 * RA.allIdenticalTo(1, []); //=> true
 * RA.allIdenticalTo({}, [ {}, {} ]); //=> false
 *
 */
var allIdenticalTo = (0, _ramda.curry)(function (val, list) {
  return (0, _ramda.all)((0, _ramda.identical)(val), list);
});
var _default = allIdenticalTo;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Composable shortcut for `Promise.all`.
 *
 * The `allP` method returns a single Promise that resolves when all of the promises
 * in the iterable argument have resolved or when the iterable argument contains no promises.
 * It rejects with the reason of the first promise that rejects.
 *
 * @func allP
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.3.0|v2.3.0}
 * @category Function
 * @sig [Promise a] -> Promise [a]
 * @param {Iterable.<*>} iterable An iterable object such as an Array or String
 * @return {Promise} An already resolved Promise if the iterable passed is empty. An asynchronously resolved Promise if the iterable passed contains no promises. Note, Google Chrome 58 returns an already resolved promise in this case. A pending Promise in all other cases. This returned promise is then resolved/rejected asynchronously (as soon as the stack is empty) when all the promises in the given iterable have resolved, or if any of the promises reject. See the example about "Asynchronicity or synchronicity of allP" below.
 * @see {@link RA.resolveP|resolveP}, {@link RA.rejectP|rejectP}
 * @example
 *
 * RA.allP([1, 2]); //=> Promise([1, 2])
 * RA.allP([1, Promise.resolve(2)]); //=> Promise([1, 2])
 * RA.allP([Promise.resolve(1), Promise.resolve(2)]); //=> Promise([1, 2])
 * RA.allP([1, Promise.reject(2)]); //=> Promise(2)
 */
var allP = (0, _ramda.curryN)(1, (0, _ramda.bind)(Promise.all, Promise));
var _default = allP;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allSettledP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = exports.allSettledPPonyfill = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

var _Promise = _interopRequireDefault(require("./internal/ponyfills/Promise.allSettled"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var allSettledPPonyfill = (0, _ramda.curryN)(1, _Promise["default"]);
/**
 * Returns a promise that is fulfilled with an array of promise state snapshots,
 * but only after all the original promises have settled, i.e. become either fulfilled or rejected.
 * We say that a promise is settled if it is not pending, i.e. if it is either fulfilled or rejected.
 *
 * @func allSettledP
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.18.0|v2.18.0}
 * @category Function
 * @typedef Settlement = { status: String, value: * }
 * @sig [Promise a] -> Promise [Settlement a]
 * @param {Iterable.<*>} iterable An iterable object such as an Array or String
 * @return {Promise} Returns a promise that is fulfilled with an array of promise state snapshots
 * @see {@link RA.allP|allP}
 * @example
 *
 * RA.allSettledP([
 *   Promise.resolve(1),
 *   2,
 *   Promise.reject(3),
 * ]); //=> Promise([{ status: 'fulfilled', value: 1 }, { status: 'fulfilled', value: 2 }, { status: 'rejected', reason: 3 }])
 */

exports.allSettledPPonyfill = allSettledPPonyfill;
var allSettledP = (0, _isFunction["default"])(Promise.allSettled) ? (0, _ramda.curryN)(1, (0, _ramda.bind)(Promise.allSettled, Promise)) : allSettledPPonyfill;
var _default = allSettledP;
exports["default"] = _default;
},{"./internal/ponyfills/Promise.allSettled":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Promise.allSettled.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allUnique.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _lengthEq = _interopRequireDefault(require("./lengthEq"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns true if all items in the list are unique. `R.equals` is used to determine equality.
 *
 * @func allUnique
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category List
 * @sig [a] -> Boolean
 * @param {Array} list The list of values
 * @return {boolean}
 * @see {@link RA.notAllUnique|notAllUnique},  {@link https://ramdajs.com/docs/#equals|equals}
 * @example
 *
 * RA.allUnique([ 1, 2, 3, 4 ]); //=> true
 * RA.allUnique([ 1, 1, 2, 3 ]); //=> false
 * RA.allUnique([]); //=> true
 *
 */
var allUnique = (0, _ramda.converge)(_lengthEq["default"], [_ramda.length, _ramda.uniq]);
var _default = allUnique;
exports["default"] = _default;
},{"./lengthEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthEq.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/anyP.js":[function(require,module,exports){
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }

exports.__esModule = true;
exports["default"] = exports.anyPPonyfill = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

var _Promise = _interopRequireWildcard(require("./internal/ponyfills/Promise.any"));

exports.AggregatedError = _Promise.AggregatedError;

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var anyPPonyfill = (0, _ramda.curryN)(1, _Promise["default"]);
exports.anyPPonyfill = anyPPonyfill;

/**
 * Returns a promise that is fulfilled by the first given promise to be fulfilled,
 * or rejected with an array of rejection reasons if all of the given promises are rejected.
 *
 * @func anyP
 * @memberOf RA
 * @category Function
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @sig [Promise a] -> Promise a
 * @param {Iterable.<*>} iterable An iterable object such as an Array or String
 * @return {Promise} A promise that is fulfilled by the first given promise to be fulfilled, or rejected with an array of rejection reasons if all of the given promises are rejected
 * @see {@link RA.lastP|lastP}
 * @example
 *
 * RA.anyP([
 *   Promise.resolve(1),
 *   2,
 *   Promise.reject(3),
 * ]); //=> Promise(1)
 */
var anyP = (0, _isFunction["default"])(Promise.any) ? (0, _ramda.curryN)(1, (0, _ramda.bind)(Promise.any, Promise)) : anyPPonyfill;
var _default = anyP;
exports["default"] = _default;
},{"./internal/ponyfills/Promise.any":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Promise.any.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/appendFlipped.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns a new list containing the contents of the given list, followed by the given element.
 * Like {@link http://ramdajs.com/docs/#append|R.append} but with argument order reversed.
 *
 * @func appendFlipped
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.5.0|v2.5.0}
 * @category List
 * @sig [a] -> a -> [a]
 * @param {Array} list The list of elements to add a new item to
 * @param {*} el The element to add to the end of the new list
 * @return {Array} A new list containing the elements of the old list followed by `el`
 * @see {@link http://ramdajs.com/docs/#append|R.append}
 * @example
 *
 * RA.appendFlipped(['write', 'more'], 'tests'); //=> ['write', 'more', 'tests']
 * RA.appendFlipped([], 'tests'); //=> ['tests']
 * RA.appendFlipped(['write', 'more'], ['tests']); //=> ['write', 'more', ['tests']]
 */
var appendFlipped = (0, _ramda.flip)(_ramda.append);
var _default = appendFlipped;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/argsPass.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _list = _interopRequireDefault(require("./list"));

var _isTruthy = _interopRequireDefault(require("./isTruthy"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Takes a combining predicate and a list of functions and returns a function which will map the
 * arguments it receives to the list of functions and returns the result of passing the values
 * returned from each function to the combining predicate. A combining predicate is a function that
 * combines a list of Boolean values into a single Boolean value, such as `R.any` or `R.all`. It
 * will test each value using `RA.isTruthy`, meaning the functions don't necessarily have to be
 * predicates.
 *
 * The function returned is curried to the number of functions supplied, and if called with more
 * arguments than functions, any remaining arguments are passed in to the combining predicate
 * untouched.
 *
 * @func argsPass
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.7.0|v2.7.0}
 * @category Logic
 * @sig ((* -> Boolean) -> [*] -> Boolean) -> [(* -> Boolean), ...] -> (*...) -> Boolean
 * @param {Function} combiningPredicate The predicate used to combine the values returned from the
 * list of functions
 * @param {Array} functions List of functions
 * @return {boolean} Returns the combined result of mapping arguments to functions
 * @example
 *
 * RA.argsPass(R.all, [RA.isArray, RA.isBoolean, RA.isString])([], false, 'abc') //=> true
 * RA.argsPass(R.all, [RA.isArray, RA.isBoolean, RA.isString])([], false, 1) //=> false
 * RA.argsPass(R.any, [RA.isArray, RA.isBoolean, RA.isString])({}, 1, 'abc') //=> true
 * RA.argsPass(R.any, [RA.isArray, RA.isBoolean, RA.isString])({}, 1, false) //=> false
 * RA.argsPass(R.none, [RA.isArray, RA.isBoolean, RA.isString])({}, 1, false) //=> true
 * RA.argsPass(R.none, [RA.isArray, RA.isBoolean, RA.isString])({}, 1, 'abc') //=> false
 */
var argsPass = (0, _ramda.curry)(function (combiningPredicate, predicates) {
  return (0, _ramda.useWith)((0, _ramda.compose)(combiningPredicate(_isTruthy["default"]), _list["default"]), predicates);
});
var _default = argsPass;
exports["default"] = _default;
},{"./isTruthy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isTruthy.js","./list":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/list.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/async.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _resolveP = _interopRequireDefault(require("./resolveP"));

var _rejectP = _interopRequireDefault(require("./rejectP"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Takes a generator function and returns an async function.
 * The async function returned is a curried function whose arity matches that of the generator function.
 *
 * Note: This function is handy for environments that does support generators but doesn't support async/await.
 *
 * @func async
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.16.0|v2.16.0}
 * @category Function
 * @sig Promise c => (a, b, ...) -> a -> b -> ... -> c
 * @param {Function} generatorFn The generator function
 * @return {Function} Curried async function
 * @see {@link https://www.promisejs.org/generators/}
 * @example
 *
 * const asyncFn = RA.async(function* generator(val1, val2) {
 *   const a = yield Promise.resolve(val1);
 *   const b = yield Promise.resolve(val2);
 *
 *   return a + b;
 * });
 *
 * asyncFn(1, 2); //=> Promise(3)
 *
 */
var async = (0, _ramda.curryN)(1, function (generatorFn) {
  function asyncWrapper() {
    var iterator = (0, _ramda.bind)(generatorFn, this).apply(void 0, arguments);

    var handle = function handle(result) {
      var resolved = (0, _resolveP["default"])(result.value);
      return result.done ? resolved : resolved.then(function (value) {
        return handle(iterator.next(value));
      }, function (error) {
        return handle(iterator["throw"](error));
      });
    };

    try {
      return handle(iterator.next());
    } catch (error) {
      return (0, _rejectP["default"])(error);
    }
  }

  if (generatorFn.length > 0) {
    return (0, _ramda.curryN)(generatorFn.length, asyncWrapper);
  }

  return asyncWrapper;
});
var _default = async;
exports["default"] = _default;
},{"./rejectP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/rejectP.js","./resolveP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/resolveP.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/cata.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * The catamorphism is a way of folding a type into a value.
 *
 * **Either**
 *
 * If the either is right then the right function will be executed with
 * the `right` value and the value of the function returned. Otherwise the left function
 * will be called with the `left` value.
 *
 * **Maybe**
 *
 * If the maybe is Some than the right function will be executed with the `some` value and the value of the function
 * returned. Otherwise the left function with be called without an argument.
 *
 * **Result**
 *
 * If the result is Ok than the right function will be executed with the `Ok` value and the value of the function
 * returned. Otherwise the left function will be called with the `Error` value.
 *
 * **Validation**
 *
 * If the validation is Success than the right function will be executed with the `Success` value and the value of the function
 * returned. Otherwise the left function will be called with the `Failure` value.
 *
 * Supported monadic libraries: {@link https://monet.github.io/monet.js/|monet.js}, {@link https://folktale.origamitower.com/|folktale}, {@link https://github.com/ramda/ramda-fantasy|ramda-fantasy}
 *
 * @func cata
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.4.0|v1.4.0}
 * @category Function
 * @sig (a -> b) -> (a -> c) -> Cata a -> b | c
 * @param {Function} leftFn The left function that consumes the left value
 * @param {Function} rightFn The right function that consumes the right value
 * @param {Cata} catamorphicObj Either, Maybe or any other type with catamorphic capabilities (`cata` or `either` method)
 * @return {*}
 * @see {@link https://monet.github.io/monet.js/#cata|cata explained}
 * @example
 *
 * // Either
 * const eitherR = Either.Right(1);
 * const eitherL = Either.Left(2);
 *
 * RA.cata(identity, identity, eitherR); //=> 1
 * RA.cata(identity, identity, eitherL); //=> 2
 *
 * // Maybe
 * const maybeSome = Maybe.Some(1);
 * const maybeNothing = Maybe.Nothing();
 *
 * RA.cata(identity, identity, maybeSome); //=> 1
 * RA.cata(identity, identity, maybeNothing); //=> undefined
 */
var catamorphism = (0, _ramda.curry)(function (leftFn, rightFn, catamorphicObj) {
  // folktale support
  if ((0, _isFunction["default"])(catamorphicObj.matchWith)) {
    return catamorphicObj.matchWith({
      // Result type
      Ok: function Ok(_ref) {
        var value = _ref.value;
        return rightFn(value);
      },
      Error: function Error(_ref2) {
        var value = _ref2.value;
        return leftFn(value);
      },
      // Maybe type
      Just: function Just(_ref3) {
        var value = _ref3.value;
        return rightFn(value);
      },
      Nothing: function Nothing() {
        return leftFn(undefined);
      },
      // Validation type
      Success: function Success(_ref4) {
        var value = _ref4.value;
        return rightFn(value);
      },
      Failure: function Failure(_ref5) {
        var value = _ref5.value;
        return leftFn(value);
      }
    });
  }

  if ((0, _isFunction["default"])(catamorphicObj.cata)) {
    return catamorphicObj.cata(leftFn, rightFn);
  }

  if ((0, _isFunction["default"])(catamorphicObj.getOrElse)) {
    var elseValue = "RA.cata".concat(Math.random());
    var value = catamorphicObj.getOrElse(elseValue);
    return value === elseValue ? leftFn() : rightFn(value);
  }

  return catamorphicObj.either(leftFn, rightFn);
});
var _default = catamorphism;
exports["default"] = _default;
},{"./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/catchP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Composable shortcut for `Promise.catch`.
 * The catchP function returns a Promise. It takes two arguments: a callback function for the failure of the Promise
 * and the promise instance itself.
 *
 * @func catchP
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.29.0|v2.29.0}
 * @category Function
 * @sig (a -> Promise b | b) -> Promise b
 * @param {Function} onRejected A Function called if the Promise is rejected. This function has one argument, the rejection reason.
 * @param {Promise} promise Any Promise
 * @return {Promise} Returns a Promise with dealt rejected cases
 * @see {@link RA.thenP|thenP}, {@link RA.resolveP|resolveP}, {@link RA.rejectP|rejectP}, {@link RA.allP|allP}
 *
 * @example
 *
 * RA.catchP(() => 'b', Promise.resolve('a')); //=> Promise('a')
 * RA.catchP(() => 'b', Promise.reject('a')); //=> Promise('b')
 */
var catchP = (0, _ramda.invoker)(1, 'catch');
var _default = catchP;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/ceil.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns the smallest integer greater than or equal to a given number.
 *
 * Note: ceil(null) returns integer 0 and does not give a NaN error.
 *
 * @func ceil
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.15.0|v2.15.0}
 * @category Math
 * @sig Number -> Number
 * @param {number} number The number to ceil
 * @return {number} The smallest integer greater than or equal to the given number
 * @example
 *
 * RA.ceil(.95); //=> 1
 * RA.ceil(4); //=> 4
 * RA.ceil(7.004); //=> 8
 * RA.ceil(-0.95); //=> -0
 * RA.ceil(-4); //=> -4
 * RA.ceil(-7.004); //=> -7
 * RA.ceil(null); //=> 0
 */
var ceil = (0, _ramda.curryN)(1, (0, _ramda.bind)(Math.ceil, Math));
var _default = ceil;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/compact.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isFalsy = _interopRequireDefault(require("./isFalsy"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Creates an array with all falsy values removed.
 * The values false, null, 0, "", undefined, and NaN are falsy.
 *
 * @func compact
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.5.0|v2.5.0}
 * @category List
 * @sig Filterable f => f a -> f a
 * @param {Array} list The array to compact
 * @return {Array} Returns the new array of filtered values
 * @see {@link RA.isFalsy|isFalsy}
 * @example
 *
 * RA.compact([0, 1, false, 2, '', 3]); //=> [1, 2, 3]
 */
var compact = (0, _ramda.reject)(_isFalsy["default"]);
var _default = compact;
exports["default"] = _default;
},{"./isFalsy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFalsy.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/concatAll.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _stubUndefined = _interopRequireDefault(require("./stubUndefined"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var leftIdentitySemigroup = {
  concat: _ramda.identity
};
/**
 * Returns the result of concatenating the given lists or strings.
 * Note: RA.concatAll expects all elements to be of the same type. It will throw an error if you concat an Array with a non-Array value.
 * Dispatches to the concat method of the preceding element, if present. Can also concatenate multiple elements of a [fantasy-land compatible semigroup](https://github.com/fantasyland/fantasy-land#semigroup).
 * Returns undefined if empty array was passed.
 *
 * @func concatAll
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.6.0|v2.6.0}
 * @category List
 * @sig [[a]] -> [a] | Undefined
 * @sig [String] -> String | Undefined
 * @sig Semigroup s => Foldable s f => f -> s | Undefined
 * @param {Array.<Array|string>} list List containing elements that will be concatenated
 * @return {Array|string|undefined} Concatenated elements
 * @see {@link http://ramdajs.com/docs/#concat|R.concat}, {@link RA.concatRight|concatRight}, {@link http://ramdajs.com/docs/#unnest|R.unnest}, {@link http://ramdajs.com/docs/#join|R.join}
 * @example
 *
 * concatAll([[1], [2], [3]]); //=> [1, 2, 3]
 * concatAll(['1', '2', '3']); //=> '123'
 * concatAll([]); //=> undefined;
 */

var concatAll = (0, _ramda.pipe)((0, _ramda.reduce)(_ramda.concat, leftIdentitySemigroup), (0, _ramda.when)((0, _ramda.identical)(leftIdentitySemigroup), _stubUndefined["default"]));
var _default = concatAll;
exports["default"] = _default;
},{"./stubUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubUndefined.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/concatRight.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns the result of concatenating the given lists or strings.
 *
 * Note: R.concat expects both arguments to be of the same type, unlike
 * the native Array.prototype.concat method.
 * It will throw an error if you concat an Array with a non-Array value.
 * Dispatches to the concat method of the second argument, if present.
 *
 * @func concatRight
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.11.0|v1.11.0}
 * @category List
 * @sig [a] -> [a] -> [a]
 * @sig String -> String -> String
 * @param {Array|String} firstList The first list
 * @param {Array|String} secondList The second list
 * @return {Array|String} A list consisting of the elements of `secondList`
 * followed by the elements of `firstList`.
 * @see {@link http://ramdajs.com/docs/#concat|R.concat}
 * @example
 *
 * RA.concatRight('ABC', 'DEF'); //=> 'DEFABC'
 * RA.concatRight([4, 5, 6], [1, 2, 3]); //=> [1, 2, 3, 4, 5, 6]
 * RA.concatRight([], []); //=> []
 */
var concatRight = (0, _ramda.flip)(_ramda.concat);
var _default = concatRight;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/contained.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns true if the specified value is equal, in R.equals terms,
 * to at least one element of the given list or false otherwise.
 * Given list can be a string.
 *
 * Like {@link http://ramdajs.com/docs/#contains|R.contains} but with argument order reversed.
 *
 * @func contained
 * @aliases included
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.8.0|v2.8.0}
 * @deprecated since v2.12.0; please use RA.included alias
 * @category List
 * @sig [a] -> a -> Boolean
 * @param {Array|String} list The list to consider
 * @param {*} a The item to compare against
 * @return {boolean} Returns Boolean `true` if an equivalent item is in the list or `false` otherwise
 * @see {@link http://ramdajs.com/docs/#contains|R.contains}
 * @example
 *
 * RA.contained([1, 2, 3], 3); //=> true
 * RA.contained([1, 2, 3], 4); //=> false
 * RA.contained([{ name: 'Fred' }], { name: 'Fred' }); //=> true
 * RA.contained([[42]], [42]); //=> true
 */
var contained = (0, _ramda.flip)(_ramda.contains);
var _default = contained;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/copyKeys.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _renameKeys = _interopRequireDefault(require("./renameKeys"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

/**
 * Creates a new object with the own properties of the provided object, and the
 * keys copied according to the keysMap object as `{oldKey: newKey}`.
 * When no key from the keysMap is found, then a shallow clone of an object is returned.
 *
 * Keep in mind that in the case of keys conflict is behaviour undefined and
 * the result may vary between various JS engines!
 *
 * @func copyKeys
 * @memberOf RA
 * @category Object
 * @sig {a: b} -> {a: *} -> {b: *}
 * @param {!Object} keysMap
 * @param {!Object} obj
 * @return {!Object} New object with copied keys
 * @see {@link RA.renameKeys|renameKeys}
 * @example
 *
 * copyKeys({ a: 'b' }, { a: true }); //=> { a: true, b: true }
 * copyKeys({ a: 'b' }, { a: true, b: false }); //=> { a: true, b: true }
 */
var copyKeys = (0, _ramda.curryN)(2, function (keysMap, obj) {
  return _objectSpread(_objectSpread({}, obj), (0, _renameKeys["default"])(keysMap, obj));
});
var _default = copyKeys;
exports["default"] = _default;
},{"./renameKeys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/renameKeys.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/curryRight.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _curryRightN = _interopRequireDefault(require("./curryRightN"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns a curried equivalent of the provided function.
 * This function is like curry, except that the provided arguments order is reversed.
 *
 * @func curryRight
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.12.0|v1.12.0}
 * @category Function
 * @sig (* -> a) -> (* -> a)
 * @param {Function} fn The function to curry
 * @return {Function}  A new, curried function
 * @see {@link http://ramdajs.com/docs/#curry|R.curry}, {@link RA.curryRightN|curryRightN}
 * @example
 *
 * const concatStrings = (a, b, c) => a + b + c;
 * const concatStringsCurried = RA.curryRight(concatStrings);
 *
 * concatStringCurried('a')('b')('c'); // => 'cba'
 */
var curryRight = (0, _ramda.converge)(_curryRightN["default"], [_ramda.length, _ramda.identity]);
var _default = curryRight;
exports["default"] = _default;
},{"./curryRightN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/curryRightN.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/curryRightN.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns a curried equivalent of the provided function, with the specified arity.
 * This function is like curryN, except that the provided arguments order is reversed.
 *
 * @func curryRightN
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.12.0|v1.12.0}
 * @category Function
 * @sig Number -> (* -> a) -> (* -> a)
 * @param {number} length The arity for the returned function
 * @param {Function} fn The function to curry
 * @return {Function}  A new, curried function
 * @see {@link http://ramdajs.com/docs/#curryN|R.curryN}, {@link RA.curryRight|curryRight}
 * @example
 *
 * const concatStrings = (a, b, c) => a + b + c;
 * const concatStringsCurried = RA.curryRightN(3, concatStrings);
 *
 * concatStringCurried('a')('b')('c'); // => 'cba'
 */
var curryRightN = (0, _ramda.curryN)(2, function (arity, fn) {
  return (0, _ramda.curryN)(arity, function wrapper() {
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    return fn.apply(this, (0, _ramda.reverse)(args));
  });
});
var _default = curryRightN;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/defaultWhen.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns the second argument if predicate function returns `true`,
 * otherwise the third argument is returned.
 *
 * @func defaultWhen
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.2.0|v2.2.0}
 * @category Logic
 * @sig  (a -> Boolean) -> b -> a -> a | b
 * @param {!function} predicate The predicate function
 * @param {*} defaultVal The default value
 * @param {*} val `val` will be returned instead of `defaultVal` if predicate returns false
 * @return {*} The `val` if predicate returns `false`, otherwise the default value
 * @see {@link http://ramdajs.com/docs/#defaultTo|R.defaultTo}
 * @example
 *
 * RA.defaultWhen(RA.isNull, 1, null); // => 1
 * RA.defaultWhen(RA.isNull, 1, 2); // => 2
 */
var defaultWhen = (0, _ramda.curry)(function (predicate, defaultVal, val) {
  return predicate(val) ? defaultVal : val;
});
var _default = defaultWhen;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/delayP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNonNegative = _interopRequireDefault(require("./isNonNegative"));

var _isInteger = _interopRequireDefault(require("./isInteger"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Creates a promise which resolves/rejects after the specified milliseconds.
 *
 * @func delayP
 * @memberOf RA
 * @category Function
 * @sig Number -> Promise Undefined
 * @sig {timeout: Number, value: a} -> Promise a
 * @param {number|Object} milliseconds number of milliseconds or options object
 * @return {Promise} A Promise that is resolved/rejected with the given value (if provided) after the specified delay
 * @example
 *
 * RA.delayP(200); //=> Promise(undefined)
 * RA.delayP({ timeout: 1000, value: 'hello world' }); //=> Promise('hello world')
 * RA.delayP.reject(100); //=> Promise(undefined)
 * RA.delayP.reject({ timeout: 100, value: new Error('error') }); //=> Promise(Error('error'))
 */
var makeDelay = (0, _ramda.curry)(function (settleFnPicker, opts) {
  var timeout;
  var value;

  if ((0, _isInteger["default"])(opts) && (0, _isNonNegative["default"])(opts)) {
    timeout = opts;
  } else {
    timeout = (0, _ramda.propOr)(0, 'timeout', opts);
    value = (0, _ramda.propOr)(value, 'value', opts);
  }

  return new Promise(function () {
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    var settleFn = settleFnPicker(args);
    setTimeout((0, _ramda.partial)(settleFn, [value]), timeout);
  });
});
var delayP = makeDelay((0, _ramda.nth)(0));
delayP.reject = makeDelay((0, _ramda.nth)(1));
var _default = delayP;
exports["default"] = _default;
},{"./isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger.js","./isNonNegative":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNonNegative.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/dispatch.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNotNil = _interopRequireDefault(require("./isNotNil"));

var _isNonEmptyArray = _interopRequireDefault(require("./isNonEmptyArray"));

var _stubUndefined = _interopRequireDefault(require("./stubUndefined"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

var byArity = (0, _ramda.comparator)(function (a, b) {
  return a.length > b.length;
});
var getMaxArity = (0, _ramda.pipe)((0, _ramda.sort)(byArity), _ramda.head, (0, _ramda.prop)('length'));
var iteratorFn = (0, _ramda.curry)(function (args, accumulator, fn) {
  var result = fn.apply(void 0, _toConsumableArray(args));
  return (0, _isNotNil["default"])(result) ? (0, _ramda.reduced)(result) : accumulator;
});

var dispatchImpl = function dispatchImpl(functions) {
  var arity = getMaxArity(functions);
  return (0, _ramda.curryN)(arity, function () {
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    return (0, _ramda.reduce)(iteratorFn(args), undefined, functions);
  });
};

var dispatch = (0, _ramda.ifElse)(_isNonEmptyArray["default"], dispatchImpl, _stubUndefined["default"]);
var _default = dispatch;
exports["default"] = _default;
},{"./isNonEmptyArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNonEmptyArray.js","./isNotNil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNil.js","./stubUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubUndefined.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/divideNum.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Divides two numbers, where the second number is divided by the first number.
 *
 * @func divideNum
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category Math
 * @sig Number -> Number -> Number
 * @param {number} divisor the number to divide by
 * @param {number} dividend the number to divide
 * @return {number} A number representing the quotient of dividing the dividend by the divisor
 * @example
 *
 * RA.divideNum(2, 1); //=> 0.5
 */
var divideNum = (0, _ramda.flip)(_ramda.divide);
var _default = divideNum;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/dropArgs.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Accepts a function with any arity and returns a function with arity of zero.
 * The returned function ignores any arguments supplied to it.
 *
 * @func dropArgs
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.10.0|v2.10.0}
 * @category Logic
 * @sig (...a -> b)-> () -> b
 * @param {Function} fn The function with any arity
 * @return {Function} Returns function with arity of zero
 * @see {@link http://ramdajs.com/docs/#nAry|R.nAry}
 * @example
 *
 * const fn = (a = 1, b = 2) => a + b;
 *
 * RA.dropArgs(fn)('ignore1', 'ignore2'); //=> 3
 */
var dropArgs = (0, _ramda.nAry)(0);
var _default = dropArgs;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/ensureArray.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNotArray = _interopRequireDefault(require("./isNotArray"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns a singleton array containing the value provided.
 * If value is already an array, it is returned as is.
 *
 * @func ensureArray
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.6.0|v2.6.0}
 * @category List
 * @sig a | [a] -> [a]
 * @param {*|Array} val the value ensure as Array
 * @return {Array}
 * @see {@link http://ramdajs.com/docs/#of|R.of}
 * @example
 *
 * RA.ensureArray(42); //=> [42]
 * RA.ensureArray([42]); //=> [42]
 */
var ensureArray = (0, _ramda.when)(_isNotArray["default"], _ramda.of);
var _default = ensureArray;
exports["default"] = _default;
},{"./isNotArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotArray.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/escapeRegExp.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isString = _interopRequireDefault(require("./isString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Escapes the RegExp special characters.
 *
 * @func escapeRegExp
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.21.0|v2.21.0}
 * @category String
 * @sig String -> String
 * @param {string} val the value to escape
 * @return {string}
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping|MDN Regular Expressions Escaping}
 * @example
 *
 * RA.escapeRegExp('[ramda-adjunct](https://github.com/char0n/ramda-adjunct)'); //=> '\[ramda\-adjunct\]\(https://github\.com/char0n/ramda\-adjunct\)'
 */
var escapeRegExp = (0, _ramda.when)(_isString["default"], (0, _ramda.replace)(/[.*+?^${}()|[\]\\-]/g, '\\$&'));
var _default = escapeRegExp;
exports["default"] = _default;
},{"./isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isString.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fantasy-land/Identity.js":[function(require,module,exports){
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var fl = _interopRequireWildcard(require("./mapping"));

var _traits = require("./traits");

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }

/**
 * The simplest {@link https://github.com/fantasyland/fantasy-land|fantasy-land}
 * compatible monad which attaches no information to values.
 *
 * The Identity type is a very simple type that has no interesting side effects and
 * is effectively just a container of some value. So why does it exist ?
 * The Identity type is often used as the base monad of a monad
 * transformer when no other behaviour is required.
 *
 * @memberOf RA
 * @implements
 * {@link https://github.com/fantasyland/fantasy-land#apply|Apply},
 * {@link https://github.com/fantasyland/fantasy-land#applicative|Applicative},
 * {@link https://github.com/fantasyland/fantasy-land#functor|Functor},
 * {@link https://github.com/fantasyland/fantasy-land#setoid|Setoid},
 * {@link https://github.com/fantasyland/fantasy-land#semigroup|Semigroup},
 * {@link https://github.com/fantasyland/fantasy-land#chain|Chain},
 * {@link https://github.com/fantasyland/fantasy-land#monad|Monad},
 * {@link https://github.com/fantasyland/fantasy-land#ord|Ord},
 * {@link https://github.com/fantasyland/fantasy-land#monoid|Monoid*},
 * {@link https://github.com/fantasyland/fantasy-land#contravariant|Contravariant}
 * @since {@link https://char0n.github.io/ramda-adjunct/1.8.0|v1.8.0}
 */
var Identity = /*#__PURE__*/function (_fl$of, _fl$ap, _fl$map, _fl$equals, _fl$concat, _fl$chain, _fl$lte, _fl$empty, _fl$contramap) {
  /**
   * Private constructor. Use {@link RA.Identity.of|Identity.of} instead.
   *
   * @param {*} value
   * @return {RA.Identity}
   */
  function Identity(value) {
    _classCallCheck(this, Identity);

    this.value = value;
  }
  /**
   * Catamorphism for a value.
   * @returns {*}
   * @example
   *
   * const a = Identity.of(1);
   * a.get(); //=> 1
   */


  _createClass(Identity, [{
    key: "get",
    value: function get() {
      return this.value;
    }
    /**
     * Fantasy land {@link https://github.com/fantasyland/fantasy-land#apply|Apply} specification.
     *
     * @sig ap :: Apply f => f a ~> f (a -> b) -> f b
     * @param {RA.Identity} applyWithFn
     * @return {RA.Identity}
     * @example
     *
     * const a = Identity.of(1);
     * const b = Identity.of(1).map(a => b => a + b);
     *
     * a.ap(b); //=> Identity(2)
     */

  }, {
    key: _fl$ap,
    value: function value(applyWithFn) {
      return _traits.applyTrait[fl.ap].call(this, applyWithFn);
    }
  }, {
    key: "ap",
    value: function ap(applyWithFn) {
      return this[fl.ap](applyWithFn);
    }
    /**
     * Fantasy land {@link https://github.com/fantasyland/fantasy-land#functor|Functor} specification.
     *
     * @sig map :: Functor f => f a ~> (a -> b) -> f b
     * @param {Function} fn
     * @return {RA.Identity}
     * @example
     *
     * const a = Identity.of(1);
     * a.map(a => a + 1); //=> Identity(2)
     */

  }, {
    key: _fl$map,
    value: function value(fn) {
      return _traits.functorTrait[fl.map].call(this, fn);
    }
  }, {
    key: "map",
    value: function map(fn) {
      return this[fl.map](fn);
    }
    /**
     * Fantasy land {@link https://github.com/fantasyland/fantasy-land#setoid|Setoid} specification.
     *
     * @sig equals :: Setoid a => a ~> a -> Boolean
     * @param {RA.Identity} setoid
     * @return {boolean}
     * @example
     *
     * const a = Identity.of(1);
     * const b = Identity.of(1);
     * const c = Identity.of(2);
     *
     * a.equals(b); //=> true
     * a.equals(c); //=> false
     */

  }, {
    key: _fl$equals,
    value: function value(setoid) {
      return _traits.setoidTrait[fl.equals].call(this, setoid);
    }
  }, {
    key: "equals",
    value: function equals(setoid) {
      return this[fl.equals](setoid);
    }
    /**
     * Fantasy land {@link https://github.com/fantasyland/fantasy-land#semigroup|Semigroup} specification.
     *
     * @sig concat :: Semigroup a => a ~> a -> a
     * @param {RA.Identity} semigroup
     * @return {RA.Identity}
     * @example
     *
     * const a = Identity.of(1);
     * const b = Identity.of(1);
     * a.concat(b); //=> 2
     *
     * const c = Identity.of('c');
     * const d = Identity.of('d');
     * c.concat(d); //=> 'cd'
     *
     * const e = Identity.of(['e']);
     * const f = Identity.of(['f']);
     * e.concat(f); //=> ['e', 'f']
     */

  }, {
    key: _fl$concat,
    value: function value(semigroup) {
      return _traits.semigroupTrait[fl.concat].call(this, semigroup);
    }
  }, {
    key: "concat",
    value: function concat(semigroup) {
      return this[fl.concat](semigroup);
    }
    /**
     * Fantasy land {@link https://github.com/fantasyland/fantasy-land#chain|Chain} specification.
     *
     * @sig chain :: Chain m => m a ~> (a -> m b) -> m b
     * @param {Function} fn Function returning the value of the same {@link https://github.com/fantasyland/fantasy-land#semigroup|Chain}
     * @return {RA.Identity}
     * @example
     *
     * const a = Identity.of(1);
     * const fn = val => Identity.of(val + 1);
     *
     * a.chain(fn).chain(fn); //=> Identity(3)
     */

  }, {
    key: _fl$chain,
    value: function value(fn) {
      return _traits.chainTrait[fl.chain].call(this, fn);
    }
  }, {
    key: "chain",
    value: function chain(fn) {
      return this[fl.chain](fn);
    }
    /**
     * Fantasy land {@link https://github.com/fantasyland/fantasy-land#ord|Ord} specification.
     *
     * @sig lte :: Ord a => a ~> a -> Boolean
     * @param {RA.Identity} ord
     * @return {boolean}
     * @example
     *
     * const a = Identity.of(1);
     * const b = Identity.of(1);
     * const c = Identity.of(2);
     *
     * a.lte(b); //=> true
     * a.lte(c); //=> true
     * c.lte(a); //=> false
     */

  }, {
    key: _fl$lte,
    value: function value(ord) {
      return _traits.ordTrait[fl.lte].call(this, ord);
    }
  }, {
    key: "lte",
    value: function lte(ord) {
      return this[fl.lte](ord);
    }
    /**
     * Fantasy land {@link https://github.com/fantasyland/fantasy-land#monoid|Monoid*} specification.
     * Partial implementation of Monoid specification. `empty` method on instance only, returning
     * identity value of the wrapped type. Using `R.empty` under the hood.
     *
     *
     * @sig empty :: Monoid m => () -> m
     * @return {RA.Identity}
     * @example
     *
     * const a = Identity.of('test');
     * const i = a.empty();
     *
     * a.concat(i); //=> Identity('string');
     * i.concat(a); //=> Identity('string');
     */

  }, {
    key: _fl$empty,
    value: function value() {
      return this.constructor.of((0, _ramda.empty)(this.value));
    }
  }, {
    key: "empty",
    value: function empty() {
      return this[fl.empty]();
    }
    /**
     * Fantasy land {@link https://github.com/fantasyland/fantasy-land#contravariant|Contravariant} specification.
     *
     * @sig contramap :: Contravariant f => f a ~> (b -> a) -> f b
     * @param {Function} fn
     * @return {RA.Identity}
     * @example
     *
     * const identity = a => a;
     * const add1 = a => a + 1;
     * const divide2 = a => a / 2;
     *
     * Identity.of(divide2).contramap(add1).get()(3); //=> 2
     * Identity.of(identity).contramap(divide2).contramap(add1).get()(3); //=> 2
     * Identity.of(identity).contramap(a => divide2(add1(a))).get()(3); //=> 2
     */

  }, {
    key: _fl$contramap,
    value: function value(fn) {
      var _this = this;

      return this.constructor.of(function (value) {
        return _this.value(fn(value));
      });
    }
  }, {
    key: "contramap",
    value: function contramap(fn) {
      return this[fl.contramap](fn);
    }
  }], [{
    key: _fl$of,
    value:
    /**
     * Fantasy land {@link https://github.com/fantasyland/fantasy-land#applicative|Applicative} specification.
     *
     * @static
     * @sig of :: Applicative f => a -> f a
     * @param {*} value
     * @returns {RA.Identity}
     * @example
     *
     * const a = Identity.of(1); //=> Identity(1)
     */
    function value(_value) {
      return new Identity(_value);
    }
  }, {
    key: "of",
    value: function of(value) {
      return new Identity(value);
    }
    /**
     * @static
     */

  }, {
    key: '@@type',
    get: function get() {
      return 'RA/Identity';
    }
  }]);

  return Identity;
}(fl.of, fl.ap, fl.map, fl.equals, fl.concat, fl.chain, fl.lte, fl.empty, fl.contramap);

var _default = Identity;
exports["default"] = _default;
},{"./mapping":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fantasy-land/mapping.js","./traits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fantasy-land/traits.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fantasy-land/mapping.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.zero = exports.traverse = exports.reduce = exports.promap = exports.of = exports.map = exports.lte = exports.id = exports.extract = exports.extend = exports.equals = exports.empty = exports.contramap = exports.concat = exports.compose = exports.chainRec = exports.chain = exports.bimap = exports.ap = exports.alt = void 0;
var equals = 'fantasy-land/equals';
exports.equals = equals;
var lte = 'fantasy-land/lte';
exports.lte = lte;
var compose = 'fantasy-land/compose';
exports.compose = compose;
var id = 'fantasy-land/id';
exports.id = id;
var concat = 'fantasy-land/concat';
exports.concat = concat;
var empty = 'fantasy-land/empty';
exports.empty = empty;
var map = 'fantasy-land/map';
exports.map = map;
var contramap = 'fantasy-land/contramap';
exports.contramap = contramap;
var ap = 'fantasy-land/ap';
exports.ap = ap;
var of = 'fantasy-land/of';
exports.of = of;
var alt = 'fantasy-land/alt';
exports.alt = alt;
var zero = 'fantasy-land/zero';
exports.zero = zero;
var reduce = 'fantasy-land/reduce';
exports.reduce = reduce;
var traverse = 'fantasy-land/traverse';
exports.traverse = traverse;
var chain = 'fantasy-land/chain';
exports.chain = chain;
var chainRec = 'fantasy-land/chainRec';
exports.chainRec = chainRec;
var extend = 'fantasy-land/extend';
exports.extend = extend;
var extract = 'fantasy-land/extract';
exports.extract = extract;
var bimap = 'fantasy-land/bimap';
exports.bimap = bimap;
var promap = 'fantasy-land/promap';
exports.promap = promap;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fantasy-land/traits.js":[function(require,module,exports){
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }

exports.__esModule = true;
exports.setoidTrait = exports.semigroupTrait = exports.ordTrait = exports.functorTrait = exports.chainTrait = exports.applyTrait = void 0;

var _ramda = require("ramda");

var _isString = _interopRequireDefault(require("../isString"));

var _isNumber = _interopRequireDefault(require("../isNumber"));

var _isFunction = _interopRequireDefault(require("../isFunction"));

var _util = require("./util");

var fl = _interopRequireWildcard(require("./mapping"));

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var functorTrait = _defineProperty({}, fl.map, function (fn) {
  return this.constructor[fl.of](fn(this.value));
});

exports.functorTrait = functorTrait;

var applyTrait = _defineProperty({}, fl.ap, function (applyWithFn) {
  var _this = this;

  return applyWithFn.map(function (fn) {
    return fn(_this.value);
  });
});

exports.applyTrait = applyTrait;

var setoidTrait = _defineProperty({}, fl.equals, function (setoid) {
  return (0, _util.isSameType)(this, setoid) && (0, _ramda.equals)(this.value, setoid.value);
});

exports.setoidTrait = setoidTrait;

var semigroupTrait = _defineProperty({}, fl.concat, function (semigroup) {
  var concatenatedValue = this.value;

  if ((0, _isString["default"])(this.value) || (0, _isNumber["default"])(this.value)) {
    concatenatedValue = this.value + semigroup.value;
  } else if ((0, _ramda.pathSatisfies)(_isFunction["default"], ['value', fl.concat], this)) {
    concatenatedValue = this.value[fl.concat](semigroup.value);
  } else if ((0, _ramda.pathSatisfies)(_isFunction["default"], ['value', 'concat'], this)) {
    concatenatedValue = this.value.concat(semigroup.value);
  }

  return this.constructor[fl.of](concatenatedValue);
});

exports.semigroupTrait = semigroupTrait;

var chainTrait = _defineProperty({}, fl.chain, function (fn) {
  var newChain = fn(this.value);
  return (0, _util.isSameType)(this, newChain) ? newChain : this;
});

exports.chainTrait = chainTrait;

var ordTrait = _defineProperty({}, fl.lte, function (ord) {
  return (0, _util.isSameType)(this, ord) && (this.value < ord.value || this[fl.equals](ord));
});

exports.ordTrait = ordTrait;
},{"../isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","../isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNumber.js","../isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isString.js","./mapping":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fantasy-land/mapping.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fantasy-land/util.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fantasy-land/util.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.typeEquals = exports.type = exports.isSameType = exports.isNotSameType = void 0;

var _ramda = require("ramda");

// type :: Monad a => a -> String
var type = (0, _ramda.either)((0, _ramda.path)(['@@type']), (0, _ramda.path)(['constructor', '@@type'])); // typeEquals :: Monad a => String -> a -> Boolean

exports.type = type;
var typeEquals = (0, _ramda.curry)(function (typeIdent, monad) {
  return type(monad) === typeIdent;
}); // isSameType :: (Monad a, Monad b) => a -> b -> Boolean

exports.typeEquals = typeEquals;
var isSameType = (0, _ramda.curryN)(2, (0, _ramda.useWith)(_ramda.equals, [type, type])); // isNotSameType :: (Monad a, Monad b) => a -> b -> Boolean

exports.isSameType = isSameType;
var isNotSameType = (0, _ramda.complement)(isSameType);
exports.isNotSameType = isNotSameType;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/filterIndexed.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * {@link http://ramdajs.com/docs/#filter|R.filter} function that more closely resembles `Array.prototype.filter`.
 * It takes two new parameters to its callback function: the current index, and the entire list.
 *
 * `filterIndexed` implementation is simple: `
 *  const filterIndexed = R.addIndex(R.filter);
 * `
 *
 * @func filterIndexed
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.31.0|v2.31.0}
 * @category List
 * @typedef Idx = Number
 * @sig Filterable f => ((a, Idx, f a) -> Boolean) -> f a -> f a
 * @param {Function} pred The predicate function
 * @param {Array} list The collection to filter
 * @return {Array} Filterable
 * @see {@link http://ramdajs.com/docs/#addIndex|R.addIndex}, {@link http://ramdajs.com/docs/#filter|R.filter}
 * @example
 *
 * const isValueGtIndex = (val, idx) => val > idx;
 * RA.filterIndexed(isValueGtIndex, [5, 4, 3, 2, 1, 0]); //=> [5, 4, 3]
 */
var filterIndexed = (0, _ramda.addIndex)(_ramda.filter);
var _default = filterIndexed;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/findOr.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns the first element of the list which matches the predicate.
 * Returns default value if no element matches or matched element is `null`, `undefined` or `NaN`.
 * Dispatches to the find method of the second argument, if present.
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func findOr
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.32.0|v2.32.0}
 * @category List
 * @sig  a -> (b -> Boolean) -> [b] -> b | a
 * @param {*} defaultValue The default value
 * @param {Function} fn The predicate function used to determine if the element is the desired one.
 * @param {Array} list The array to consider.
 * @return {*} The element found, or the default value.
 * @see {@link http://ramdajs.com/docs/#defaultTo|R.defaultTo}, {@link http://ramdajs.com/docs/#find|R.find}
 * @example
 *
 * RA.findOr(1, isUndefined, [1, 2, undefined]); // => 1
 * RA.findOr(1, val => val === 2, [1, 2, undefined]); // => 2
 * RA.findOr(1, val => val === 3, [1, 2, undefined]); // => 1
 */
var findOr = (0, _ramda.curry)(function (defaultVal, fn, list) {
  return (0, _ramda.pipe)((0, _ramda.find)(fn), (0, _ramda.defaultTo)(defaultVal))(list);
});
var _default = findOr;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/flattenDepth.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _makeFlat2 = _interopRequireDefault(require("./internal/makeFlat"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

var flatten1 = (0, _makeFlat2["default"])(false);
/**
 * Flattens the list to the specified depth.
 *
 * @func flattenDepth
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.19.0|v2.19.0}
 * @category List
 * @sig Number -> [a] -> [b]
 * @param {!number} depth The maximum recursion depth
 * @param {!Array} list The array to flatten
 * @return {!Array} Returns the new flattened array
 * @see {@link http://ramdajs.com/docs/#flatten|R.flatten}, {@link http://ramdajs.com/docs/#unnest|R.unnest}
 * @example
 *
 * RA.flattenDepth(
 *   2,
 *   [1, [2], [3, [4, 5], 6, [[[7], 8]]], 9, 10]
 * ); //=> [1, 2, 3, 4, 5, 6, [[7], 8], 9, 10];
 */

var flattenDepth = (0, _ramda.curry)(function (depth, list) {
  var currentDept = depth;

  var flatList = _toConsumableArray(list);

  while (currentDept > 0) {
    flatList = flatten1(flatList);
    currentDept -= 1;
  }

  return flatList;
});
var _default = flattenDepth;
exports["default"] = _default;
},{"./internal/makeFlat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/makeFlat.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/flattenPath.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Flattens a property path so that its fields are spread out into the provided object.
 * It's like {@link RA.spreadPath|spreadPath}, but preserves object under the property path.
 *
 * @func flattenPath
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.19.0|v1.19.0}
 * @category Object
 * @typedef Idx = String | Int
 * @sig [Idx] -> {k: v} -> {k: v}
 * @param {!Array.<string|number>} path The property path to flatten
 * @param {!Object} obj The provided object
 * @return {!Object} The flattened object
 * @see {@link RA.flattenProp|flattenProp}, {@link RA.spreadPath|spreadPath}
 * @example
 *
 * RA.flattenPath(
 *   ['b1', 'b2'],
 *   { a: 1, b1: { b2: { c: 3, d: 4 } } }
 * ); // => { a: 1, c: 3, d: 4, b1: { b2: { c: 3, d: 4 } } };
 */
var flattenPath = (0, _ramda.curry)(function (path, obj) {
  return (0, _ramda.merge)(obj, (0, _ramda.pathOr)({}, path, obj));
});
var _default = flattenPath;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/flattenProp.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _flattenPath = _interopRequireDefault(require("./flattenPath"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Flattens a property so that its fields are spread out into the provided object.
 * It's like {@link RA.spreadProp|spreadProp}, but preserves object under the property path.
 *
 * @func flattenProp
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.19.0|v1.19.0}
 * @category Object
 * @typedef Idx = String | Int
 * @sig [Idx] -> {k: v} -> {k: v}
 * @param {!string|number} prop The property to flatten
 * @param {!Object} obj The provided object
 * @return {!Object} The flattened object
 * @see {@link RA.flattenPath|flattenPath}, {@link RA.spreadProp|spreadProp}
 * @example
 *
 * RA.flattenProp(
 *   'b',
 *   { a: 1, b: { c: 3, d: 4 } }
 * ); // => { a: 1, c: 3, d: 4, b: { c: 3, d: 4 } };
 */
var flattenProp = (0, _ramda.curry)(function (prop, obj) {
  return (0, _flattenPath["default"])((0, _ramda.of)(prop), obj);
});
var _default = flattenProp;
exports["default"] = _default;
},{"./flattenPath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/flattenPath.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/floor.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns the largest integer less than or equal to a given number.
 *
 * Note: floor(null) returns integer 0 and do not give a NaN error.
 *
 * @func floor
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.15.0|v2.15.0}
 * @category Math
 * @sig Number -> Number
 * @param {number} number The number to floor
 * @return {number} A number representing the largest integer less than or equal to the specified number
 * @example
 *
 * RA.floor(45.95); //=> 45
 * RA.floor(45.05); //=> 45
 * RA.floor(4); //=> 4
 * RA.floor(-45.05); //=> -46
 * RA.floor(-45.95); //=> -46
 * RA.floor(null); //=> 0
 */
var floor = (0, _ramda.curryN)(1, (0, _ramda.bind)(Math.floor, Math));
var _default = floor;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fnull.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _defaultWhen = _interopRequireDefault(require("./defaultWhen"));

var _mapIndexed = _interopRequireDefault(require("./mapIndexed"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns a function which is called with the given arguments. If any of the given arguments are null or undefined,
 * the corresponding default value for that argument is used instead.
 *
 * @func fnull
 * @memberOf RA
 * @category Function
 * @sig (a ... -> b) -> [c] -> a ... | c -> b
 * @param {Function} function to be executed
 * @param {Array} defaults default arguments
 * @return {Function} will apply provided arguments or default ones
 * @example
 *
 * const addDefaults = RA.fnull((a, b) => a + b, [4, 5])
 *
 * addDefaults(1, 2); // => 3
 * addDefaults(null, 2); // => 6
 * addDefaults(2, null); // => 7
 * addDefaults(undefined, undefined); // => 9
 */
var fnull = (0, _ramda.curry)(function (fn, defaults) {
  return (0, _ramda.curryN)(fn.length, function () {
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    var argsWithDefaults = (0, _mapIndexed["default"])(function (val, idx) {
      return (0, _defaultWhen["default"])(_ramda.isNil, defaults[idx], val);
    }, args);
    return (0, _ramda.apply)(fn, argsWithDefaults);
  });
});
var _default = fnull;
exports["default"] = _default;
},{"./defaultWhen":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/defaultWhen.js","./mapIndexed":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mapIndexed.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/hasPath.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isObj = _interopRequireDefault(require("./isObj"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns whether or not an object has an own property with the specified name at a given path.
 *
 * @func hasPath
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.14.0|v1.14.0}
 * @deprecated since v2.12.0; ramda@0.26.0 contains hasPath
 * @category Object
 * @typedef Idx = String | Int
 * @sig [Idx] -> {a} -> Boolean
 * @param {Array.<string|number>} path The path of the nested property
 * @param {Object} obj The object to test
 * @return {boolean}
 * @see {@link http://ramdajs.com/docs/#has|R.has}
 * @example
 *
 * RA.hasPath(['a', 'b'], { a: { b: 1 } }); //=> true
 * RA.hasPath(['a', 'b', 'c'], { a: { b: 1 } }); //=> false
 * RA.hasPath(['a', 'b'], { a: { } }); //=> false
 * RA.hasPath([0], [1, 2]); //=> true
 */
var hasPath = (0, _ramda.curryN)(2, function (objPath, obj) {
  var prop = (0, _ramda.head)(objPath); // termination conditions

  if ((0, _ramda.length)(objPath) === 0 || !(0, _isObj["default"])(obj)) {
    return false;
  }

  if ((0, _ramda.length)(objPath) === 1) {
    return (0, _ramda.has)(prop, obj);
  }

  return hasPath((0, _ramda.tail)(objPath), (0, _ramda.path)([prop], obj)); // base case
});
var _default = hasPath;
exports["default"] = _default;
},{"./isObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isObj.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/inRange.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var inRangeImp = (0, _ramda.ifElse)(_ramda.gte, function () {
  throw new Error('low must not be greater than high in inRange(low, high, value)');
}, (0, _ramda.useWith)(_ramda.both, [_ramda.lte, _ramda.gt]));
/**
 * Checks if `value` is between `low` and up to but not including `high`.
 *
 * @func inRange
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.7.0|v2.7.0}
 * @category Relation
 * @sig Number -> Number -> Number -> Boolean
 * @param {number} low Start of the range
 * @param {number} high The end of the range
 * @param {number} value The value to test
 * @return {boolean}
 * @throws {Error} When `low` is greater than or equal to `high`
 * @example
 *
 * RA.inRange(0, 5, 3); //=> true
 * RA.inRange(0, 5, 0); //=> true
 * RA.inRange(0, 5, 4); //=> true
 * RA.inRange(0, 5, 5); //=> false
 * RA.inRange(0, 5, -1); //=> false
 */

var _default = (0, _ramda.curry)(function (low, high, value) {
  return inRangeImp(low, high)(value);
});

exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/index.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.isNotPrimitive = exports.isNotPlainObject = exports.isNotPlainObj = exports.isNotPair = exports.isNotObjectLike = exports.isNotObject = exports.isNotObjLike = exports.isNotObj = exports.isNotNumber = exports.isNotNull = exports.isNotNilOrEmpty = exports.isNotNil = exports.isNotNaN = exports.isNotMap = exports.isNotInteger = exports.isNotGeneratorFunction = exports.isNotFunction = exports.isNotFloat = exports.isNotFinite = exports.isNotEmpty = exports.isNotDate = exports.isNotBoolean = exports.isNotAsyncFunction = exports.isNotArrayLike = exports.isNotArray = exports.isNonPositive = exports.isNonNegative = exports.isNonEmptyString = exports.isNonEmptyArray = exports.isNilOrEmpty = exports.isNegativeZero = exports.isNegative = exports.isNaturalNumber = exports.isNaN = exports.isMap = exports.isIterable = exports.isInvalidDate = exports.isInteger32 = exports.isInteger = exports.isInt32 = exports.isIndexed = exports.isGeneratorFunction = exports.isFunction = exports.isFloat = exports.isFinite = exports.isFalsy = exports.isFalse = exports.isEven = exports.isError = exports.isEmptyString = exports.isEmptyArray = exports.isDate = exports.isBoolean = exports.isBigInt = exports.isAsyncFunction = exports.isArrayLike = exports.isArray = exports.invokeArgs = exports.invoke = exports.included = exports.inRange = exports.hasPath = exports.fnull = exports.floor = exports.flattenProp = exports.flattenPath = exports.flattenDepth = exports.firstP = exports.findOr = exports.filterIndexed = exports.escapeRegExp = exports.ensureArray = exports.dropArgs = exports.divideNum = exports.dispatch = exports.delayP = exports.defaultWhen = exports.curryRightN = exports.curryRight = exports.copyKeys = exports.contained = exports.concatRight = exports.concatAll = exports.compact = exports.ceil = exports.catchP = exports.cata = exports.async = exports.argsPass = exports.appendFlipped = exports.anyP = exports.allUnique = exports.allSettledP = exports.allP = exports.allIdenticalTo = exports.allIdentical = exports.allEqualTo = exports.allEqual = exports.Y = exports.Identity = void 0;
exports.sortByProps = exports.sliceTo = exports.sliceFrom = exports.skipTake = exports.sign = exports.sequencing = exports.seq = exports.round = exports.resolveP = exports.resetToDefault = exports.replaceAll = exports.repeatStr = exports.renameKeysWith = exports.renameKeys = exports.renameKeyWith = exports.rejectP = exports.reduceRightP = exports.reduceP = exports.reduceIndexed = exports.rangeStep = exports.propNotEq = exports.pickIndexes = exports.paths = exports.pathOrLazy = exports.pathNotEq = exports.padStart = exports.padEnd = exports.padCharsStart = exports.padCharsEnd = exports.overlaps = exports.omitIndexes = exports.omitBy = exports.notEqual = exports.notBoth = exports.notAllUnique = exports.notAllPass = exports.nor = exports.noop = exports.nonePass = exports.noneP = exports.neither = exports.nand = exports.move = exports.mergeRight = exports.mergeProps = exports.mergeProp = exports.mergePaths = exports.mergePath = exports.mergeLeft = exports.mapIndexed = exports.list = exports.liftFN = exports.liftF = exports.lensTraverse = exports.lensSatisfies = exports.lensNotSatisfy = exports.lensNotEq = exports.lensIso = exports.lensEq = exports.lengthNotEq = exports.lengthLte = exports.lengthLt = exports.lengthGte = exports.lengthGt = exports.lengthEq = exports.lastP = exports.isValidNumber = exports.isValidDate = exports.isUndefined = exports.isTruthy = exports.isTrue = exports.isThenable = exports.isSymbol = exports.isString = exports.isSparseArray = exports.isSet = exports.isSentinelValue = exports.isSafeInteger = exports.isRegExp = exports.isPrototypeOf = exports.isPromise = exports.isPrimitive = exports.isPositiveZero = exports.isPositive = exports.isPlainObject = exports.isPlainObj = exports.isPair = exports.isOdd = exports.isObjectLike = exports.isObject = exports.isObjLike = exports.isObj = exports.isNumber = exports.isNull = exports.isNotValidNumber = exports.isNotValidDate = exports.isNotUndefined = exports.isNotString = exports.isNotSet = exports.isNotRegExp = exports.isNotPrimitive = exports.isNotPlainObject = exports.isNotPlainObj = exports.isNotPair = exports.isNotObjectLike = exports.isNotObject = exports.isNotObjLike = exports.isNotObj = exports.isNotNumber = exports.isNotNull = exports.isNotNilOrEmpty = exports.isNotNil = exports.isNotNaN = exports.isNotMap = exports.isNotInteger = exports.isNotGeneratorFunction = exports.isNotFunction = exports.isNotFloat = exports.isNotFinite = exports.isNotEmpty = exports.isNotDate = exports.isNotBoolean = exports.isNotAsyncFunction = exports.isNotArrayLike = exports.isNotArray = exports.isNonPositive = exports.isNonNegative = exports.isNonEmptyString = exports.isNonEmptyArray = exports.isNilOrEmpty = exports.isNegativeZero = exports.isNegative = exports.isNaturalNumber = exports.isNaN = exports.isMap = exports.isIterable = exports.isInvalidDate = exports.isInteger32 = exports.isInteger = exports.isInt32 = exports.isIndexed = exports.isGeneratorFunction = exports.isFunction = exports.isFloat = exports.isFinite = exports.isFalsy = exports.isFalse = exports.isEven = exports.isError = exports.isEmptyString = exports.isEmptyArray = exports.isDate = exports.isBoolean = exports.isBigInt = exports.isAsyncFunction = exports.isArrayLike = exports.isArray = exports.invokeArgs = exports.invoke = exports.included = exports.inRange = exports.hasPath = exports.fnull = exports.floor = exports.flattenProp = exports.flattenPath = exports.flattenDepth = exports.firstP = exports.findOr = exports.filterIndexed = exports.escapeRegExp = exports.ensureArray = exports.dropArgs = exports.divideNum = exports.dispatch = exports.delayP = exports.defaultWhen = exports.curryRightN = exports.curryRight = exports.copyKeys = exports.contained = exports.concatRight = exports.concatAll = exports.compact = exports.ceil = exports.catchP = exports.cata = exports.async = exports.argsPass = exports.appendFlipped = exports.anyP = exports.allUnique = exports.allSettledP = exports.allP = exports.allIdenticalTo = exports.allIdentical = exports.allEqualTo = exports.allEqual = exports.Y = exports.Identity = void 0;
exports.zipObjWith = exports.weaveLazy = exports.weave = exports.viewOr = exports.unzipObjWith = exports.trunc = exports.trimStart = exports.trimRight = exports.trimLeft = exports.trimEnd = exports.trimCharsStart = exports.trimCharsEnd = exports.toUinteger32 = exports.toUint32 = exports.toNumber = exports.toInteger32 = exports.toInt32 = exports.toArray = exports.thenP = exports.thenCatchP = exports.then = exports.subtractNum = exports.stubUndefined = exports.stubString = exports.stubObject = exports.stubObj = exports.stubNull = exports.stubArray = exports.spreadProp = exports.spreadPath = exports.sortByProps = exports.sliceTo = exports.sliceFrom = exports.skipTake = exports.sign = exports.sequencing = exports.seq = exports.round = exports.resolveP = exports.resetToDefault = exports.replaceAll = exports.repeatStr = exports.renameKeysWith = exports.renameKeys = exports.renameKeyWith = exports.rejectP = exports.reduceRightP = exports.reduceP = exports.reduceIndexed = exports.rangeStep = exports.propNotEq = exports.pickIndexes = exports.paths = exports.pathOrLazy = exports.pathNotEq = exports.padStart = exports.padEnd = exports.padCharsStart = exports.padCharsEnd = exports.overlaps = exports.omitIndexes = exports.omitBy = exports.notEqual = exports.notBoth = exports.notAllUnique = exports.notAllPass = exports.nor = exports.noop = exports.nonePass = exports.noneP = exports.neither = exports.nand = exports.move = exports.mergeRight = exports.mergeProps = exports.mergeProp = exports.mergePaths = exports.mergePath = exports.mergeLeft = exports.mapIndexed = exports.list = exports.liftFN = exports.liftF = exports.lensTraverse = exports.lensSatisfies = exports.lensNotSatisfy = exports.lensNotEq = exports.lensIso = exports.lensEq = exports.lengthNotEq = exports.lengthLte = exports.lengthLt = exports.lengthGte = exports.lengthGt = exports.lengthEq = exports.lastP = exports.isValidNumber = exports.isValidDate = exports.isUndefined = exports.isTruthy = exports.isTrue = exports.isThenable = exports.isSymbol = exports.isString = exports.isSparseArray = exports.isSet = exports.isSentinelValue = exports.isSafeInteger = exports.isRegExp = exports.isPrototypeOf = exports.isPromise = exports.isPrimitive = exports.isPositiveZero = exports.isPositive = exports.isPlainObject = exports.isPlainObj = exports.isPair = exports.isOdd = exports.isObjectLike = exports.isObject = exports.isObjLike = exports.isObj = exports.isNumber = exports.isNull = exports.isNotValidNumber = exports.isNotValidDate = exports.isNotUndefined = exports.isNotString = exports.isNotSet = exports.isNotRegExp = exports.isNotPrimitive = exports.isNotPlainObject = exports.isNotPlainObj = exports.isNotPair = exports.isNotObjectLike = exports.isNotObject = exports.isNotObjLike = exports.isNotObj = exports.isNotNumber = exports.isNotNull = exports.isNotNilOrEmpty = exports.isNotNil = exports.isNotNaN = exports.isNotMap = exports.isNotInteger = exports.isNotGeneratorFunction = exports.isNotFunction = exports.isNotFloat = exports.isNotFinite = exports.isNotEmpty = exports.isNotDate = exports.isNotBoolean = exports.isNotAsyncFunction = exports.isNotArrayLike = exports.isNotArray = exports.isNonPositive = exports.isNonNegative = exports.isNonEmptyString = exports.isNonEmptyArray = exports.isNilOrEmpty = exports.isNegativeZero = exports.isNegative = exports.isNaturalNumber = exports.isNaN = exports.isMap = exports.isIterable = exports.isInvalidDate = exports.isInteger32 = exports.isInteger = exports.isInt32 = exports.isIndexed = exports.isGeneratorFunction = exports.isFunction = exports.isFloat = exports.isFinite = exports.isFalsy = exports.isFalse = exports.isEven = exports.isError = exports.isEmptyString = exports.isEmptyArray = exports.isDate = exports.isBoolean = exports.isBigInt = exports.isAsyncFunction = exports.isArrayLike = exports.isArray = exports.invokeArgs = exports.invoke = exports.included = exports.inRange = exports.hasPath = exports.fnull = exports.floor = exports.flattenProp = exports.flattenPath = exports.flattenDepth = exports.firstP = exports.findOr = exports.filterIndexed = exports.escapeRegExp = exports.ensureArray = exports.dropArgs = exports.divideNum = exports.dispatch = exports.delayP = exports.defaultWhen = exports.curryRightN = exports.curryRight = exports.copyKeys = exports.contained = exports.concatRight = exports.concatAll = exports.compact = exports.ceil = exports.catchP = exports.cata = exports.async = exports.argsPass = exports.appendFlipped = exports.anyP = exports.allUnique = exports.allSettledP = exports.allP = exports.allIdenticalTo = exports.allIdentical = exports.allEqualTo = exports.allEqual = exports.Y = exports.Identity = void 0;

var _isNotUndefined = _interopRequireDefault(require("./isNotUndefined"));

exports.isNotUndefined = _isNotUndefined["default"];

var _isUndefined = _interopRequireDefault(require("./isUndefined"));

exports.isUndefined = _isUndefined["default"];

var _isNull = _interopRequireDefault(require("./isNull"));

exports.isNull = _isNull["default"];

var _isNotNull = _interopRequireDefault(require("./isNotNull"));

exports.isNotNull = _isNotNull["default"];

var _isNotNil = _interopRequireDefault(require("./isNotNil"));

exports.isNotNil = _isNotNil["default"];

var _isArray = _interopRequireDefault(require("./isArray"));

exports.isArray = _isArray["default"];

var _isIterable = _interopRequireDefault(require("./isIterable"));

exports.isIterable = _isIterable["default"];

var _isEmptyArray = _interopRequireDefault(require("./isEmptyArray"));

exports.isEmptyArray = _isEmptyArray["default"];

var _isNotArray = _interopRequireDefault(require("./isNotArray"));

exports.isNotArray = _isNotArray["default"];

var _isNonEmptyArray = _interopRequireDefault(require("./isNonEmptyArray"));

exports.isNonEmptyArray = _isNonEmptyArray["default"];

var _isBoolean = _interopRequireDefault(require("./isBoolean"));

exports.isBoolean = _isBoolean["default"];

var _isNotBoolean = _interopRequireDefault(require("./isNotBoolean"));

exports.isNotBoolean = _isNotBoolean["default"];

var _isNilOrEmpty = _interopRequireDefault(require("./isNilOrEmpty"));

exports.isNilOrEmpty = _isNilOrEmpty["default"];

var _isString = _interopRequireDefault(require("./isString"));

exports.isString = _isString["default"];

var _isEmptyString = _interopRequireDefault(require("./isEmptyString"));

exports.isEmptyString = _isEmptyString["default"];

var _isNotString = _interopRequireDefault(require("./isNotString"));

exports.isNotString = _isNotString["default"];

var _isNonEmptyString = _interopRequireDefault(require("./isNonEmptyString"));

exports.isNonEmptyString = _isNonEmptyString["default"];

var _isArrayLike = _interopRequireDefault(require("./isArrayLike"));

exports.isArrayLike = _isArrayLike["default"];

var _isNotArrayLike = _interopRequireDefault(require("./isNotArrayLike"));

exports.isNotArrayLike = _isNotArrayLike["default"];

var _isGeneratorFunction = _interopRequireDefault(require("./isGeneratorFunction"));

exports.isGeneratorFunction = _isGeneratorFunction["default"];

var _isNotGeneratorFunction = _interopRequireDefault(require("./isNotGeneratorFunction"));

exports.isNotGeneratorFunction = _isNotGeneratorFunction["default"];

var _isAsyncFunction = _interopRequireDefault(require("./isAsyncFunction"));

exports.isAsyncFunction = _isAsyncFunction["default"];

var _isNotAsyncFunction = _interopRequireDefault(require("./isNotAsyncFunction"));

exports.isNotAsyncFunction = _isNotAsyncFunction["default"];

var _isFunction = _interopRequireDefault(require("./isFunction"));

exports.isFunction = _isFunction["default"];

var _isNotFunction = _interopRequireDefault(require("./isNotFunction"));

exports.isNotFunction = _isNotFunction["default"];

var _isObj = _interopRequireDefault(require("./isObj"));

exports.isObj = _isObj["default"];
exports.isObject = _isObj["default"];

var _isNotObj = _interopRequireDefault(require("./isNotObj"));

exports.isNotObj = _isNotObj["default"];
exports.isNotObject = _isNotObj["default"];

var _isObjLike = _interopRequireDefault(require("./isObjLike"));

exports.isObjLike = _isObjLike["default"];
exports.isObjectLike = _isObjLike["default"];

var _isNotObjLike = _interopRequireDefault(require("./isNotObjLike"));

exports.isNotObjLike = _isNotObjLike["default"];
exports.isNotObjectLike = _isNotObjLike["default"];

var _isPlainObj = _interopRequireDefault(require("./isPlainObj"));

exports.isPlainObj = _isPlainObj["default"];
exports.isPlainObject = _isPlainObj["default"];

var _isNotPlainObj = _interopRequireDefault(require("./isNotPlainObj"));

exports.isNotPlainObj = _isNotPlainObj["default"];
exports.isNotPlainObject = _isNotPlainObj["default"];

var _isDate = _interopRequireDefault(require("./isDate"));

exports.isDate = _isDate["default"];

var _isNotDate = _interopRequireDefault(require("./isNotDate"));

exports.isNotDate = _isNotDate["default"];

var _isValidDate = _interopRequireDefault(require("./isValidDate"));

exports.isValidDate = _isValidDate["default"];

var _isNotValidDate = _interopRequireDefault(require("./isNotValidDate"));

exports.isNotValidDate = _isNotValidDate["default"];
exports.isInvalidDate = _isNotValidDate["default"];

var _isNumber = _interopRequireDefault(require("./isNumber"));

exports.isNumber = _isNumber["default"];

var _isNotNumber = _interopRequireDefault(require("./isNotNumber"));

exports.isNotNumber = _isNotNumber["default"];

var _isPositive = _interopRequireDefault(require("./isPositive"));

exports.isPositive = _isPositive["default"];

var _isNegative = _interopRequireDefault(require("./isNegative"));

exports.isNegative = _isNegative["default"];

var _isPositiveZero = _interopRequireDefault(require("./isPositiveZero"));

exports.isPositiveZero = _isPositiveZero["default"];

var _isNegativeZero = _interopRequireDefault(require("./isNegativeZero"));

exports.isNegativeZero = _isNegativeZero["default"];

var _isNotNilOrEmpty = _interopRequireDefault(require("./isNotNilOrEmpty"));

exports.isNotNilOrEmpty = _isNotNilOrEmpty["default"];

var _isNonPositive = _interopRequireDefault(require("./isNonPositive"));

exports.isNonPositive = _isNonPositive["default"];

var _isNonNegative = _interopRequireDefault(require("./isNonNegative"));

exports.isNonNegative = _isNonNegative["default"];

var _isMap = _interopRequireDefault(require("./isMap"));

exports.isMap = _isMap["default"];

var _isNotMap = _interopRequireDefault(require("./isNotMap"));

exports.isNotMap = _isNotMap["default"];

var _isNaN = _interopRequireDefault(require("./isNaN"));

exports.isNaN = _isNaN["default"];

var _isNotNaN = _interopRequireDefault(require("./isNotNaN"));

exports.isNotNaN = _isNotNaN["default"];

var _isFinite = _interopRequireDefault(require("./isFinite"));

exports.isFinite = _isFinite["default"];

var _isNotFinite = _interopRequireDefault(require("./isNotFinite"));

exports.isNotFinite = _isNotFinite["default"];

var _isInteger = _interopRequireDefault(require("./isInteger"));

exports.isInteger = _isInteger["default"];

var _isInteger2 = _interopRequireDefault(require("./isInteger32"));

exports.isInteger32 = _isInteger2["default"];
exports.isInt32 = _isInteger2["default"];

var _isNotInteger = _interopRequireDefault(require("./isNotInteger"));

exports.isNotInteger = _isNotInteger["default"];

var _isBigInt = _interopRequireDefault(require("./isBigInt"));

exports.isBigInt = _isBigInt["default"];

var _isFloat = _interopRequireDefault(require("./isFloat"));

exports.isFloat = _isFloat["default"];

var _isNotFloat = _interopRequireDefault(require("./isNotFloat"));

exports.isNotFloat = _isNotFloat["default"];

var _isValidNumber = _interopRequireDefault(require("./isValidNumber"));

exports.isValidNumber = _isValidNumber["default"];

var _isNotValidNumber = _interopRequireDefault(require("./isNotValidNumber"));

exports.isNotValidNumber = _isNotValidNumber["default"];

var _isOdd = _interopRequireDefault(require("./isOdd"));

exports.isOdd = _isOdd["default"];

var _isEven = _interopRequireDefault(require("./isEven"));

exports.isEven = _isEven["default"];

var _isPair = _interopRequireDefault(require("./isPair"));

exports.isPair = _isPair["default"];

var _isNotPair = _interopRequireDefault(require("./isNotPair"));

exports.isNotPair = _isNotPair["default"];

var _isThenable = _interopRequireDefault(require("./isThenable"));

exports.isThenable = _isThenable["default"];

var _isPromise = _interopRequireDefault(require("./isPromise"));

exports.isPromise = _isPromise["default"];

var _isTrue = _interopRequireDefault(require("./isTrue"));

exports.isTrue = _isTrue["default"];

var _isFalse = _interopRequireDefault(require("./isFalse"));

exports.isFalse = _isFalse["default"];

var _isTruthy = _interopRequireDefault(require("./isTruthy"));

exports.isTruthy = _isTruthy["default"];

var _isFalsy = _interopRequireDefault(require("./isFalsy"));

exports.isFalsy = _isFalsy["default"];

var _isRegExp = _interopRequireDefault(require("./isRegExp"));

exports.isRegExp = _isRegExp["default"];

var _isNotRegExp = _interopRequireDefault(require("./isNotRegExp"));

exports.isNotRegExp = _isNotRegExp["default"];

var _isSet = _interopRequireDefault(require("./isSet"));

exports.isSet = _isSet["default"];

var _isNotSet = _interopRequireDefault(require("./isNotSet"));

exports.isNotSet = _isNotSet["default"];

var _isSparseArray = _interopRequireDefault(require("./isSparseArray"));

exports.isSparseArray = _isSparseArray["default"];

var _isSymbol = _interopRequireDefault(require("./isSymbol"));

exports.isSymbol = _isSymbol["default"];

var _isSafeInteger = _interopRequireDefault(require("./isSafeInteger"));

exports.isSafeInteger = _isSafeInteger["default"];

var _isIndexed = _interopRequireDefault(require("./isIndexed"));

exports.isIndexed = _isIndexed["default"];

var _isError = _interopRequireDefault(require("./isError"));

exports.isError = _isError["default"];

var _isNaturalNumber = _interopRequireDefault(require("./isNaturalNumber"));

exports.isNaturalNumber = _isNaturalNumber["default"];

var _isPrimitive = _interopRequireDefault(require("./isPrimitive"));

exports.isPrimitive = _isPrimitive["default"];

var _isNotPrimitive = _interopRequireDefault(require("./isNotPrimitive"));

exports.isNotPrimitive = _isNotPrimitive["default"];

var _isSentinelValue = _interopRequireDefault(require("./isSentinelValue"));

exports.isSentinelValue = _isSentinelValue["default"];

var _stubUndefined = _interopRequireDefault(require("./stubUndefined"));

exports.stubUndefined = _stubUndefined["default"];

var _stubNull = _interopRequireDefault(require("./stubNull"));

exports.stubNull = _stubNull["default"];

var _stubObj = _interopRequireDefault(require("./stubObj"));

exports.stubObj = _stubObj["default"];
exports.stubObject = _stubObj["default"];

var _stubString = _interopRequireDefault(require("./stubString"));

exports.stubString = _stubString["default"];

var _stubArray = _interopRequireDefault(require("./stubArray"));

exports.stubArray = _stubArray["default"];

var _noop = _interopRequireDefault(require("./noop"));

exports.noop = _noop["default"];

var _liftFN = _interopRequireDefault(require("./liftFN"));

exports.liftFN = _liftFN["default"];

var _liftF = _interopRequireDefault(require("./liftF"));

exports.liftF = _liftF["default"];

var _cata = _interopRequireDefault(require("./cata"));

exports.cata = _cata["default"];

var _weave = _interopRequireDefault(require("./weave"));

exports.weave = _weave["default"];

var _weaveLazy = _interopRequireDefault(require("./weaveLazy"));

exports.weaveLazy = _weaveLazy["default"];

var _curryRightN = _interopRequireDefault(require("./curryRightN"));

exports.curryRightN = _curryRightN["default"];

var _curryRight = _interopRequireDefault(require("./curryRight"));

exports.curryRight = _curryRight["default"];

var _allP = _interopRequireDefault(require("./allP"));

exports.allP = _allP["default"];

var _catchP = _interopRequireDefault(require("./catchP"));

exports.catchP = _catchP["default"];

var _noneP = _interopRequireDefault(require("./noneP"));

exports.noneP = _noneP["default"];

var _resolveP = _interopRequireDefault(require("./resolveP"));

exports.resolveP = _resolveP["default"];

var _rejectP = _interopRequireDefault(require("./rejectP"));

exports.rejectP = _rejectP["default"];

var _delayP = _interopRequireDefault(require("./delayP"));

exports.delayP = _delayP["default"];

var _thenP = _interopRequireDefault(require("./thenP"));

exports.thenP = _thenP["default"];
exports.then = _thenP["default"];

var _thenCatchP = _interopRequireDefault(require("./thenCatchP"));

exports.thenCatchP = _thenCatchP["default"];

var _allSettledP = _interopRequireDefault(require("./allSettledP"));

exports.allSettledP = _allSettledP["default"];

var _Y = _interopRequireDefault(require("./Y"));

exports.Y = _Y["default"];

var _seq = _interopRequireDefault(require("./seq"));

exports.seq = _seq["default"];
exports.sequencing = _seq["default"];

var _dispatch = _interopRequireDefault(require("./dispatch"));

exports.dispatch = _dispatch["default"];

var _async = _interopRequireDefault(require("./async"));

exports.async = _async["default"];

var _anyP = _interopRequireDefault(require("./anyP"));

exports.anyP = _anyP["default"];
exports.firstP = _anyP["default"];

var _lastP = _interopRequireDefault(require("./lastP"));

exports.lastP = _lastP["default"];

var _fnull = _interopRequireDefault(require("./fnull"));

exports.fnull = _fnull["default"];

var _mapIndexed = _interopRequireDefault(require("./mapIndexed"));

exports.mapIndexed = _mapIndexed["default"];

var _reduceIndexed = _interopRequireDefault(require("./reduceIndexed"));

exports.reduceIndexed = _reduceIndexed["default"];

var _filterIndexed = _interopRequireDefault(require("./filterIndexed"));

exports.filterIndexed = _filterIndexed["default"];

var _pickIndexes = _interopRequireDefault(require("./pickIndexes"));

exports.pickIndexes = _pickIndexes["default"];

var _list = _interopRequireDefault(require("./list"));

exports.list = _list["default"];

var _ensureArray = _interopRequireDefault(require("./ensureArray"));

exports.ensureArray = _ensureArray["default"];

var _concatAll = _interopRequireDefault(require("./concatAll"));

exports.concatAll = _concatAll["default"];

var _concatRight = _interopRequireDefault(require("./concatRight"));

exports.concatRight = _concatRight["default"];

var _reduceP = _interopRequireDefault(require("./reduceP"));

exports.reduceP = _reduceP["default"];

var _reduceRightP = _interopRequireDefault(require("./reduceRightP"));

exports.reduceRightP = _reduceRightP["default"];

var _sliceFrom = _interopRequireDefault(require("./sliceFrom"));

exports.sliceFrom = _sliceFrom["default"];

var _sliceTo = _interopRequireDefault(require("./sliceTo"));

exports.sliceTo = _sliceTo["default"];

var _omitIndexes = _interopRequireDefault(require("./omitIndexes"));

exports.omitIndexes = _omitIndexes["default"];

var _compact = _interopRequireDefault(require("./compact"));

exports.compact = _compact["default"];

var _appendFlipped = _interopRequireDefault(require("./appendFlipped"));

exports.appendFlipped = _appendFlipped["default"];

var _contained = _interopRequireDefault(require("./contained"));

exports.contained = _contained["default"];
exports.included = _contained["default"];

var _move = _interopRequireDefault(require("./move"));

exports.move = _move["default"];

var _lengthGt = _interopRequireDefault(require("./lengthGt"));

exports.lengthGt = _lengthGt["default"];

var _lengthLt = _interopRequireDefault(require("./lengthLt"));

exports.lengthLt = _lengthLt["default"];

var _lengthGte = _interopRequireDefault(require("./lengthGte"));

exports.lengthGte = _lengthGte["default"];

var _lengthLte = _interopRequireDefault(require("./lengthLte"));

exports.lengthLte = _lengthLte["default"];

var _lengthEq = _interopRequireDefault(require("./lengthEq"));

exports.lengthEq = _lengthEq["default"];

var _lengthNotEq = _interopRequireDefault(require("./lengthNotEq"));

exports.lengthNotEq = _lengthNotEq["default"];

var _allEqual = _interopRequireDefault(require("./allEqual"));

exports.allEqual = _allEqual["default"];

var _repeatStr = _interopRequireDefault(require("./repeatStr"));

exports.repeatStr = _repeatStr["default"];

var _allIdentical = _interopRequireDefault(require("./allIdentical"));

exports.allIdentical = _allIdentical["default"];

var _allIdenticalTo = _interopRequireDefault(require("./allIdenticalTo"));

exports.allIdenticalTo = _allIdenticalTo["default"];

var _allEqualTo = _interopRequireDefault(require("./allEqualTo"));

exports.allEqualTo = _allEqualTo["default"];

var _flattenDepth = _interopRequireDefault(require("./flattenDepth"));

exports.flattenDepth = _flattenDepth["default"];

var _toArray = _interopRequireDefault(require("./toArray"));

exports.toArray = _toArray["default"];

var _allUnique = _interopRequireDefault(require("./allUnique"));

exports.allUnique = _allUnique["default"];

var _notAllUnique = _interopRequireDefault(require("./notAllUnique"));

exports.notAllUnique = _notAllUnique["default"];

var _sortByProps = _interopRequireDefault(require("./sortByProps"));

exports.sortByProps = _sortByProps["default"];

var _skipTake = _interopRequireDefault(require("./skipTake"));

exports.skipTake = _skipTake["default"];

var _rangeStep = _interopRequireDefault(require("./rangeStep"));

exports.rangeStep = _rangeStep["default"];

var _findOr = _interopRequireDefault(require("./findOr"));

exports.findOr = _findOr["default"];

var _invoke = _interopRequireDefault(require("./invoke"));

exports.invoke = _invoke["default"];

var _invokeArgs = _interopRequireDefault(require("./invokeArgs"));

exports.invokeArgs = _invokeArgs["default"];

var _paths = _interopRequireDefault(require("./paths"));

exports.paths = _paths["default"];

var _renameKeys = _interopRequireDefault(require("./renameKeys"));

exports.renameKeys = _renameKeys["default"];

var _renameKeysWith = _interopRequireDefault(require("./renameKeysWith"));

exports.renameKeysWith = _renameKeysWith["default"];

var _renameKeyWith = _interopRequireDefault(require("./renameKeyWith"));

exports.renameKeyWith = _renameKeyWith["default"];

var _copyKeys = _interopRequireDefault(require("./copyKeys"));

exports.copyKeys = _copyKeys["default"];

var _mergeRight = _interopRequireDefault(require("./mergeRight"));

exports.mergeRight = _mergeRight["default"];
exports.mergeLeft = _mergeRight["default"];
exports.resetToDefault = _mergeRight["default"];

var _mergeProps = _interopRequireDefault(require("./mergeProps"));

exports.mergeProps = _mergeProps["default"];

var _mergePaths = _interopRequireDefault(require("./mergePaths"));

exports.mergePaths = _mergePaths["default"];

var _mergeProp = _interopRequireDefault(require("./mergeProp"));

exports.mergeProp = _mergeProp["default"];

var _mergePath = _interopRequireDefault(require("./mergePath"));

exports.mergePath = _mergePath["default"];

var _omitBy = _interopRequireDefault(require("./omitBy"));

exports.omitBy = _omitBy["default"];

var _pathOrLazy = _interopRequireDefault(require("./pathOrLazy"));

exports.pathOrLazy = _pathOrLazy["default"];

var _viewOr = _interopRequireDefault(require("./viewOr"));

exports.viewOr = _viewOr["default"];

var _hasPath = _interopRequireDefault(require("./hasPath"));

exports.hasPath = _hasPath["default"];

var _spreadProp = _interopRequireDefault(require("./spreadProp"));

exports.spreadProp = _spreadProp["default"];

var _spreadPath = _interopRequireDefault(require("./spreadPath"));

exports.spreadPath = _spreadPath["default"];

var _flattenProp = _interopRequireDefault(require("./flattenProp"));

exports.flattenProp = _flattenProp["default"];

var _flattenPath = _interopRequireDefault(require("./flattenPath"));

exports.flattenPath = _flattenPath["default"];

var _unzipObjWith = _interopRequireDefault(require("./unzipObjWith"));

exports.unzipObjWith = _unzipObjWith["default"];

var _zipObjWith = _interopRequireDefault(require("./zipObjWith"));

exports.zipObjWith = _zipObjWith["default"];

var _isPrototypeOf = _interopRequireDefault(require("./isPrototypeOf"));

exports.isPrototypeOf = _isPrototypeOf["default"];

var _lensEq = _interopRequireDefault(require("./lensEq"));

exports.lensEq = _lensEq["default"];

var _lensNotEq = _interopRequireDefault(require("./lensNotEq"));

exports.lensNotEq = _lensNotEq["default"];

var _lensSatisfies = _interopRequireDefault(require("./lensSatisfies"));

exports.lensSatisfies = _lensSatisfies["default"];

var _lensNotSatisfy = _interopRequireDefault(require("./lensNotSatisfy"));

exports.lensNotSatisfy = _lensNotSatisfy["default"];

var _lensTraverse = _interopRequireDefault(require("./lensTraverse"));

exports.lensTraverse = _lensTraverse["default"];

var _lensIso = _interopRequireDefault(require("./lensIso"));

exports.lensIso = _lensIso["default"];

var _propNotEq = _interopRequireDefault(require("./propNotEq"));

exports.propNotEq = _propNotEq["default"];

var _pathNotEq = _interopRequireDefault(require("./pathNotEq"));

exports.pathNotEq = _pathNotEq["default"];

var _inRange = _interopRequireDefault(require("./inRange"));

exports.inRange = _inRange["default"];

var _notEqual = _interopRequireDefault(require("./notEqual"));

exports.notEqual = _notEqual["default"];

var _overlaps = _interopRequireDefault(require("./overlaps"));

exports.overlaps = _overlaps["default"];

var _isNotEmpty = _interopRequireDefault(require("./isNotEmpty"));

exports.isNotEmpty = _isNotEmpty["default"];

var _defaultWhen = _interopRequireDefault(require("./defaultWhen"));

exports.defaultWhen = _defaultWhen["default"];

var _notBoth = _interopRequireDefault(require("./notBoth"));

exports.notBoth = _notBoth["default"];

var _nand = _interopRequireDefault(require("./nand"));

exports.nand = _nand["default"];

var _neither = _interopRequireDefault(require("./neither"));

exports.neither = _neither["default"];

var _nor = _interopRequireDefault(require("./nor"));

exports.nor = _nor["default"];

var _notAllPass = _interopRequireDefault(require("./notAllPass"));

exports.notAllPass = _notAllPass["default"];

var _nonePass = _interopRequireDefault(require("./nonePass"));

exports.nonePass = _nonePass["default"];

var _argsPass = _interopRequireDefault(require("./argsPass"));

exports.argsPass = _argsPass["default"];

var _dropArgs = _interopRequireDefault(require("./dropArgs"));

exports.dropArgs = _dropArgs["default"];

var _round = _interopRequireDefault(require("./round"));

exports.round = _round["default"];

var _ceil = _interopRequireDefault(require("./ceil"));

exports.ceil = _ceil["default"];

var _divideNum = _interopRequireDefault(require("./divideNum"));

exports.divideNum = _divideNum["default"];

var _floor = _interopRequireDefault(require("./floor"));

exports.floor = _floor["default"];

var _trunc = _interopRequireDefault(require("./trunc"));

exports.trunc = _trunc["default"];

var _sign = _interopRequireDefault(require("./sign"));

exports.sign = _sign["default"];

var _subtractNum = _interopRequireDefault(require("./subtractNum"));

exports.subtractNum = _subtractNum["default"];

var _toInteger = _interopRequireDefault(require("./toInteger32"));

exports.toInteger32 = _toInteger["default"];
exports.toInt32 = _toInteger["default"];

var _toUinteger = _interopRequireDefault(require("./toUinteger32"));

exports.toUinteger32 = _toUinteger["default"];
exports.toUint32 = _toUinteger["default"];

var _toNumber = _interopRequireDefault(require("./toNumber"));

exports.toNumber = _toNumber["default"];

var _replaceAll = _interopRequireDefault(require("./replaceAll"));

exports.replaceAll = _replaceAll["default"];

var _escapeRegExp = _interopRequireDefault(require("./escapeRegExp"));

exports.escapeRegExp = _escapeRegExp["default"];

var _trimStart = _interopRequireDefault(require("./trimStart"));

exports.trimStart = _trimStart["default"];
exports.trimLeft = _trimStart["default"];

var _trimEnd = _interopRequireDefault(require("./trimEnd"));

exports.trimEnd = _trimEnd["default"];
exports.trimRight = _trimEnd["default"];

var _trimCharsEnd = _interopRequireDefault(require("./trimCharsEnd"));

exports.trimCharsEnd = _trimCharsEnd["default"];

var _trimCharsStart = _interopRequireDefault(require("./trimCharsStart"));

exports.trimCharsStart = _trimCharsStart["default"];

var _padCharsStart = _interopRequireDefault(require("./padCharsStart"));

exports.padCharsStart = _padCharsStart["default"];

var _padCharsEnd = _interopRequireDefault(require("./padCharsEnd"));

exports.padCharsEnd = _padCharsEnd["default"];

var _padEnd = _interopRequireDefault(require("./padEnd"));

exports.padEnd = _padEnd["default"];

var _padStart = _interopRequireDefault(require("./padStart"));

exports.padStart = _padStart["default"];

var _Identity = _interopRequireDefault(require("./fantasy-land/Identity"));

exports.Identity = _Identity["default"];

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
},{"./Y":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/Y.js","./allEqual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allEqual.js","./allEqualTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allEqualTo.js","./allIdentical":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allIdentical.js","./allIdenticalTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allIdenticalTo.js","./allP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allP.js","./allSettledP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allSettledP.js","./allUnique":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allUnique.js","./anyP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/anyP.js","./appendFlipped":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/appendFlipped.js","./argsPass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/argsPass.js","./async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/async.js","./cata":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/cata.js","./catchP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/catchP.js","./ceil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/ceil.js","./compact":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/compact.js","./concatAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/concatAll.js","./concatRight":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/concatRight.js","./contained":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/contained.js","./copyKeys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/copyKeys.js","./curryRight":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/curryRight.js","./curryRightN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/curryRightN.js","./defaultWhen":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/defaultWhen.js","./delayP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/delayP.js","./dispatch":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/dispatch.js","./divideNum":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/divideNum.js","./dropArgs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/dropArgs.js","./ensureArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/ensureArray.js","./escapeRegExp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/escapeRegExp.js","./fantasy-land/Identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fantasy-land/Identity.js","./filterIndexed":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/filterIndexed.js","./findOr":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/findOr.js","./flattenDepth":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/flattenDepth.js","./flattenPath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/flattenPath.js","./flattenProp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/flattenProp.js","./floor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/floor.js","./fnull":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fnull.js","./hasPath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/hasPath.js","./inRange":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/inRange.js","./invoke":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/invoke.js","./invokeArgs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/invokeArgs.js","./isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArray.js","./isArrayLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArrayLike.js","./isAsyncFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isAsyncFunction.js","./isBigInt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isBigInt.js","./isBoolean":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isBoolean.js","./isDate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isDate.js","./isEmptyArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isEmptyArray.js","./isEmptyString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isEmptyString.js","./isError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isError.js","./isEven":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isEven.js","./isFalse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFalse.js","./isFalsy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFalsy.js","./isFinite":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFinite.js","./isFloat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFloat.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","./isGeneratorFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isGeneratorFunction.js","./isIndexed":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isIndexed.js","./isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger.js","./isInteger32":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger32.js","./isIterable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isIterable.js","./isMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isMap.js","./isNaN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNaN.js","./isNaturalNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNaturalNumber.js","./isNegative":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNegative.js","./isNegativeZero":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNegativeZero.js","./isNilOrEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNilOrEmpty.js","./isNonEmptyArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNonEmptyArray.js","./isNonEmptyString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNonEmptyString.js","./isNonNegative":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNonNegative.js","./isNonPositive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNonPositive.js","./isNotArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotArray.js","./isNotArrayLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotArrayLike.js","./isNotAsyncFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotAsyncFunction.js","./isNotBoolean":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotBoolean.js","./isNotDate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotDate.js","./isNotEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotEmpty.js","./isNotFinite":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotFinite.js","./isNotFloat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotFloat.js","./isNotFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotFunction.js","./isNotGeneratorFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotGeneratorFunction.js","./isNotInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotInteger.js","./isNotMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotMap.js","./isNotNaN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNaN.js","./isNotNil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNil.js","./isNotNilOrEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNilOrEmpty.js","./isNotNull":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNull.js","./isNotNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNumber.js","./isNotObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotObj.js","./isNotObjLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotObjLike.js","./isNotPair":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotPair.js","./isNotPlainObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotPlainObj.js","./isNotPrimitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotPrimitive.js","./isNotRegExp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotRegExp.js","./isNotSet":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotSet.js","./isNotString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotString.js","./isNotUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotUndefined.js","./isNotValidDate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotValidDate.js","./isNotValidNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotValidNumber.js","./isNull":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNull.js","./isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNumber.js","./isObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isObj.js","./isObjLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isObjLike.js","./isOdd":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isOdd.js","./isPair":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPair.js","./isPlainObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPlainObj.js","./isPositive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPositive.js","./isPositiveZero":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPositiveZero.js","./isPrimitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPrimitive.js","./isPromise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPromise.js","./isPrototypeOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPrototypeOf.js","./isRegExp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isRegExp.js","./isSafeInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSafeInteger.js","./isSentinelValue":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSentinelValue.js","./isSet":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSet.js","./isSparseArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSparseArray.js","./isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isString.js","./isSymbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSymbol.js","./isThenable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isThenable.js","./isTrue":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isTrue.js","./isTruthy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isTruthy.js","./isUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isUndefined.js","./isValidDate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isValidDate.js","./isValidNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isValidNumber.js","./lastP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lastP.js","./lengthEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthEq.js","./lengthGt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthGt.js","./lengthGte":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthGte.js","./lengthLt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthLt.js","./lengthLte":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthLte.js","./lengthNotEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthNotEq.js","./lensEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensEq.js","./lensIso":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensIso.js","./lensNotEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensNotEq.js","./lensNotSatisfy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensNotSatisfy.js","./lensSatisfies":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensSatisfies.js","./lensTraverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensTraverse.js","./liftF":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/liftF.js","./liftFN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/liftFN.js","./list":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/list.js","./mapIndexed":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mapIndexed.js","./mergePath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergePath.js","./mergePaths":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergePaths.js","./mergeProp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergeProp.js","./mergeProps":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergeProps.js","./mergeRight":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergeRight.js","./move":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/move.js","./nand":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/nand.js","./neither":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/neither.js","./noneP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/noneP.js","./nonePass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/nonePass.js","./noop":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/noop.js","./nor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/nor.js","./notAllPass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/notAllPass.js","./notAllUnique":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/notAllUnique.js","./notBoth":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/notBoth.js","./notEqual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/notEqual.js","./omitBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/omitBy.js","./omitIndexes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/omitIndexes.js","./overlaps":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/overlaps.js","./padCharsEnd":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/padCharsEnd.js","./padCharsStart":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/padCharsStart.js","./padEnd":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/padEnd.js","./padStart":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/padStart.js","./pathNotEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/pathNotEq.js","./pathOrLazy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/pathOrLazy.js","./paths":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/paths.js","./pickIndexes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/pickIndexes.js","./propNotEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/propNotEq.js","./rangeStep":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/rangeStep.js","./reduceIndexed":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/reduceIndexed.js","./reduceP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/reduceP.js","./reduceRightP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/reduceRightP.js","./rejectP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/rejectP.js","./renameKeyWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/renameKeyWith.js","./renameKeys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/renameKeys.js","./renameKeysWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/renameKeysWith.js","./repeatStr":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/repeatStr.js","./replaceAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/replaceAll.js","./resolveP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/resolveP.js","./round":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/round.js","./seq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/seq.js","./sign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/sign.js","./skipTake":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/skipTake.js","./sliceFrom":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/sliceFrom.js","./sliceTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/sliceTo.js","./sortByProps":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/sortByProps.js","./spreadPath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/spreadPath.js","./spreadProp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/spreadProp.js","./stubArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubArray.js","./stubNull":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubNull.js","./stubObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubObj.js","./stubString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubString.js","./stubUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubUndefined.js","./subtractNum":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/subtractNum.js","./thenCatchP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/thenCatchP.js","./thenP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/thenP.js","./toArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/toArray.js","./toInteger32":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/toInteger32.js","./toNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/toNumber.js","./toUinteger32":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/toUinteger32.js","./trimCharsEnd":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/trimCharsEnd.js","./trimCharsStart":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/trimCharsStart.js","./trimEnd":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/trimEnd.js","./trimStart":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/trimStart.js","./trunc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/trunc.js","./unzipObjWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/unzipObjWith.js","./viewOr":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/viewOr.js","./weave":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/weave.js","./weaveLazy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/weaveLazy.js","./zipObjWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/zipObjWith.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ap.js":[function(require,module,exports){
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("../isFunction"));

var fl = _interopRequireWildcard(require("../fantasy-land/mapping"));

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var isFunctor = (0, _ramda.either)((0, _ramda.pathSatisfies)(_isFunction["default"], ['map']), (0, _ramda.pathSatisfies)(_isFunction["default"], [fl.map]));
var isApply = (0, _ramda.both)(isFunctor, (0, _ramda.either)((0, _ramda.pathSatisfies)(_isFunction["default"], ['ap']), (0, _ramda.pathSatisfies)(_isFunction["default"], [fl.ap])));
var ap = (0, _ramda.curryN)(2, function (applyF, applyX) {
  // return original ramda `ap` if not Apply spec
  if (!isApply(applyF) || !isApply(applyX)) {
    return (0, _ramda.ap)(applyF, applyX);
  }

  try {
    // new version of `ap` starting from ramda version > 0.23.0
    return applyF.ap(applyX);
  } catch (e) {
    // old version of `ap` till ramda version <= 0.23.0
    return applyX.ap(applyF);
  }
});
var _default = ap;
exports["default"] = _default;
},{"../fantasy-land/mapping":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fantasy-land/mapping.js","../isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/compareLength.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var compareLength = (0, _ramda.curry)(function (comparator, value, list) {
  return (0, _ramda.compose)(comparator(value), _ramda.length)(list);
});
var _default = compareLength;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/isCoercible.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isObj = _interopRequireDefault(require("../isObj"));

var _isSymbol = _interopRequireDefault(require("../isSymbol"));

var _neither = _interopRequireDefault(require("../neither"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var isCoercible = (0, _neither["default"])(_isSymbol["default"], (0, _ramda.both)(_isObj["default"], (0, _neither["default"])((0, _ramda.hasIn)('toString'), (0, _ramda.hasIn)('valueOf'))));
var _default = isCoercible;
exports["default"] = _default;
},{"../isObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isObj.js","../isSymbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSymbol.js","../neither":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/neither.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/isOfTypeObject.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }

var isOfTypeObject = function isOfTypeObject(val) {
  return _typeof(val) === 'object';
};

var _default = isOfTypeObject;
exports["default"] = _default;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/makeFlat.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _isArrayLike = _interopRequireDefault(require("../isArrayLike"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * `makeFlat` is a helper function that returns a one-level or fully recursive
 * function based on the flag passed in.
 *
 * @func makeFlat
 * @memberOf RA
 *
 * @category List
 * @param {!bool} = should recursively flatten
 * @param {!Array} = the nested list to be flattened
 * @return {!Array} = the flattened list
 * @sig Bool -> List -> List
 *
 */
var makeFlat = function makeFlat(recursive) {
  return function flatt(list) {
    var value;
    var jlen;
    var j;
    var result = [];
    var idx = 0;

    while (idx < list.length) {
      if ((0, _isArrayLike["default"])(list[idx])) {
        value = recursive ? flatt(list[idx]) : list[idx];
        j = 0;
        jlen = value.length;

        while (j < jlen) {
          result[result.length] = value[j];
          j += 1;
        }
      } else {
        result[result.length] = list[idx];
      }

      idx += 1;
    }

    return result;
  };
};

var _default = makeFlat;
exports["default"] = _default;
},{"../isArrayLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArrayLike.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Array.from.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isIterable = _interopRequireDefault(require("../../isIterable"));

var _isNotUndefined = _interopRequireDefault(require("../../isNotUndefined"));

var _isNotNil = _interopRequireDefault(require("../../isNotNil"));

var _isNotFunction = _interopRequireDefault(require("../../isNotFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

var copyArray = function copyArray(items, mapFn, thisArg) {
  var boundMapFn = (0, _isNotUndefined["default"])(thisArg) ? (0, _ramda.bind)(mapFn, thisArg) : mapFn;
  return (0, _isNotUndefined["default"])(mapFn) ? _toConsumableArray(items).map(boundMapFn) : _toConsumableArray(items);
};

var fromArray = function fromArray(items, mapFn, thisArg) {
  if (items == null) {
    throw new TypeError('Array.from requires an array-like object - not null or undefined');
  }

  if ((0, _isNotNil["default"])(mapFn) && (0, _isNotFunction["default"])(mapFn)) {
    throw new TypeError('Array.from: when provided, the second argument must be a function');
  }

  if ((0, _isIterable["default"])(items)) {
    return copyArray(items, mapFn, thisArg);
  }

  return [];
};

var _default = fromArray;
exports["default"] = _default;
},{"../../isIterable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isIterable.js","../../isNotFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotFunction.js","../../isNotNil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNil.js","../../isNotUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotUndefined.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Math.sign.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var signPonyfill = function signPonyfill(number) {
  return (number > 0) - (number < 0) || +number;
};

var _default = signPonyfill;
exports["default"] = _default;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Math.trunc.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _isFinite = _interopRequireDefault(require("../../isFinite"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var truncPonyfill = function truncPonyfill(v) {
  var numV = Number(v);

  if (!(0, _isFinite["default"])(numV)) {
    return numV;
  } // eslint-disable-next-line no-nested-ternary


  return numV - numV % 1 || (numV < 0 ? -0 : numV === 0 ? numV : 0);
};

var _default = truncPonyfill;
exports["default"] = _default;
},{"../../isFinite":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFinite.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Number.MAX_SAFE_INTEGER.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
var _default = MAX_SAFE_INTEGER;
exports["default"] = _default;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Number.isFinite.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNumber = _interopRequireDefault(require("../../isNumber"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

// eslint-disable-next-line no-restricted-globals
var isFinitePonyfill = (0, _ramda.both)(_isNumber["default"], isFinite);
var _default = isFinitePonyfill;
exports["default"] = _default;
},{"../../isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNumber.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Number.isInteger.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isFinite = _interopRequireDefault(require("../../isFinite"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var isIntegerPonyfill = (0, _ramda.both)(_isFinite["default"], (0, _ramda.converge)(_ramda.equals, [Math.floor, _ramda.identity]));
var _default = isIntegerPonyfill;
exports["default"] = _default;
},{"../../isFinite":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFinite.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Number.isNaN.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNumber = _interopRequireDefault(require("../../isNumber"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

// eslint-disable-next-line no-restricted-globals
var isNaNPonyfill = (0, _ramda.both)(_isNumber["default"], isNaN);
var _default = isNaNPonyfill;
exports["default"] = _default;
},{"../../isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNumber.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Number.isSafeInteger.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isInteger = _interopRequireDefault(require("../../isInteger"));

var _Number = _interopRequireDefault(require("./Number.MAX_SAFE_INTEGER"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var isSafeIntegerPonyfill = (0, _ramda.both)(_isInteger["default"], function (value) {
  return Math.abs(value) <= _Number["default"];
});
var _default = isSafeIntegerPonyfill;
exports["default"] = _default;
},{"../../isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger.js","./Number.MAX_SAFE_INTEGER":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Number.MAX_SAFE_INTEGER.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Promise.allSettled.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _allP = _interopRequireDefault(require("../../allP"));

var _resolveP = _interopRequireDefault(require("../../resolveP"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

var onFulfill = function onFulfill(value) {
  return {
    status: 'fulfilled',
    value: value
  };
};

var onReject = function onReject(reason) {
  return {
    status: 'rejected',
    reason: reason
  };
};

var allSettledPonyfill = function allSettledPonyfill(iterable) {
  var array = (0, _ramda.map)(function (p) {
    return (0, _resolveP["default"])(p).then(onFulfill)["catch"](onReject);
  }, _toConsumableArray(iterable));
  return (0, _allP["default"])(array);
};

var _default = allSettledPonyfill;
exports["default"] = _default;
},{"../../allP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allP.js","../../resolveP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/resolveP.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Promise.any.js":[function(require,module,exports){
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }

exports.__esModule = true;
exports["default"] = exports.AggregatedError = void 0;

var _ramda = require("ramda");

var _resolveP = _interopRequireDefault(require("../../resolveP"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }

function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

var AggregatedError = /*#__PURE__*/function (_Error) {
  _inherits(AggregatedError, _Error);

  var _super = _createSuper(AggregatedError);

  function AggregatedError() {
    var _this;

    var errors = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
    var message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';

    _classCallCheck(this, AggregatedError);

    _this = _super.call(this, message);
    _this.errors = errors;
    return _this;
  }

  return _createClass(AggregatedError);
}( /*#__PURE__*/_wrapNativeSuper(Error));

exports.AggregatedError = AggregatedError;

var anyPonyfill = function anyPonyfill(iterable) {
  var exceptions = [];
  return new Promise(function (resolve, reject) {
    var onReject = function onReject(e) {
      exceptions.push(e);

      if (exceptions.length === iterable.length) {
        reject(new AggregatedError(exceptions));
      }
    };

    (0, _ramda.map)(function (p) {
      return (0, _resolveP["default"])(p).then(resolve)["catch"](onReject);
    }, _toConsumableArray(iterable));
  });
};

var _default = anyPonyfill;
exports["default"] = _default;
},{"../../resolveP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/resolveP.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.padEnd.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _isFunction = _interopRequireDefault(require("../../isFunction"));

var _isNotUndefined = _interopRequireDefault(require("../../isNotUndefined"));

var _String = _interopRequireDefault(require("./String.repeat"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var padEndPonyfill = function padEndPonyfill(padString, targetLength, value) {
  // eslint-disable-next-line no-bitwise
  var finalLength = targetLength >> 0;
  var finalPadString = String((0, _isNotUndefined["default"])(padString) ? padString : ' ');

  if (value.length > finalLength) {
    return String(value);
  }

  finalLength -= value.length;

  if (finalLength > finalPadString.length) {
    var remainingLength = finalLength / finalPadString.length;
    finalPadString += (0, _isFunction["default"])(String.prototype.repeat) ? finalPadString.repeat(remainingLength) : (0, _String["default"])(finalPadString, remainingLength);
  }

  return String(value) + finalPadString.slice(0, finalLength);
};

var _default = padEndPonyfill;
exports["default"] = _default;
},{"../../isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","../../isNotUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotUndefined.js","./String.repeat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.repeat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.padStart.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _isFunction = _interopRequireDefault(require("../../isFunction"));

var _isNotUndefined = _interopRequireDefault(require("../../isNotUndefined"));

var _String = _interopRequireDefault(require("./String.repeat"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var padStartPonyfill = function padStartPonyfill(padString, targetLength, value) {
  // eslint-disable-next-line no-bitwise
  var finalLength = targetLength >> 0; // truncate if number, or convert non-number to 0;

  var finalPadString = String((0, _isNotUndefined["default"])(padString) ? padString : ' '); // return the original string, if targeted length is less than original strings length

  if (value.length >= finalLength) {
    return String(value);
  }

  finalLength -= value.length;

  if (finalLength > finalPadString.length) {
    var lenghtToPad = finalLength / finalPadString.length; // append to original to ensure we are longer than needed

    finalPadString += (0, _isFunction["default"])(String.prototype.repeat) ? finalPadString.repeat(lenghtToPad) : (0, _String["default"])(finalPadString, lenghtToPad);
  }

  return finalPadString.slice(0, finalLength) + String(value);
};

var _default = padStartPonyfill;
exports["default"] = _default;
},{"../../isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","../../isNotUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotUndefined.js","./String.repeat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.repeat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.repeat.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _isNotFinite = _interopRequireDefault(require("../../isNotFinite"));

var _isNegative = _interopRequireDefault(require("../../isNegative"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var repeat = function repeat(value, count) {
  var validCount = Number(count);

  if (validCount !== count) {
    validCount = 0;
  }

  if ((0, _isNegative["default"])(validCount)) {
    throw new RangeError('repeat count must be non-negative');
  }

  if ((0, _isNotFinite["default"])(validCount)) {
    throw new RangeError('repeat count must be less than infinity');
  }

  validCount = Math.floor(validCount);

  if (value.length === 0 || validCount === 0) {
    return '';
  } // Ensuring validCount is a 31-bit integer allows us to heavily optimize the
  // main part. But anyway, most current (August 2014) browsers can't handle
  // strings 1 << 28 chars or longer, so:
  // eslint-disable-next-line no-bitwise


  if (value.length * validCount >= 1 << 28) {
    throw new RangeError('repeat count must not overflow maximum string size');
  }

  var maxCount = value.length * validCount;
  validCount = Math.floor(Math.log(validCount) / Math.log(2));
  var result = value;

  while (validCount) {
    result += value;
    validCount -= 1;
  }

  result += result.substring(0, maxCount - result.length);
  return result;
};

var _default = repeat;
exports["default"] = _default;
},{"../../isNegative":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNegative.js","../../isNotFinite":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotFinite.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.replaceAll.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isRegExp = _interopRequireDefault(require("../../isRegExp"));

var _escapeRegExp = _interopRequireDefault(require("../../escapeRegExp"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var checkArguments = function checkArguments(searchValue, replaceValue, str) {
  if (str == null || searchValue == null || replaceValue == null) {
    throw TypeError('Input values must not be `null` or `undefined`');
  }
};

var checkValue = function checkValue(value, valueName) {
  if (typeof value !== 'string') {
    if (!(value instanceof String)) {
      throw TypeError("`".concat(valueName, "` must be a string"));
    }
  }
};

var checkSearchValue = function checkSearchValue(searchValue) {
  if (typeof searchValue !== 'string' && !(searchValue instanceof String) && !(searchValue instanceof RegExp)) {
    throw TypeError('`searchValue` must be a string or an regexp');
  }
};

var replaceAll = function replaceAll(searchValue, replaceValue, str) {
  checkArguments(searchValue, replaceValue, str);
  checkValue(str, 'str');
  checkValue(replaceValue, 'replaceValue');
  checkSearchValue(searchValue);
  var regexp = new RegExp((0, _isRegExp["default"])(searchValue) ? searchValue : (0, _escapeRegExp["default"])(searchValue), 'g');
  return (0, _ramda.replace)(regexp, replaceValue, str);
};

var _default = replaceAll;
exports["default"] = _default;
},{"../../escapeRegExp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/escapeRegExp.js","../../isRegExp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isRegExp.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.trimEnd.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var trimStart = (0, _ramda.replace)(/[\s\uFEFF\xA0]+$/, '');
var _default = trimStart;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.trimStart.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var trimStart = (0, _ramda.replace)(/^[\s\uFEFF\xA0]+/, '');
var _default = trimStart;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/invoke.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _invokeArgs = _interopRequireDefault(require("./invokeArgs"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Invokes the method at path of object.
 *
 * @func invoke
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.31.0|v2.31.0}
 * @category Object
 * @sig Array -> Object -> *
 * @param {Array.<string|number>} path The path of the method to invoke
 * @param {Object} obj The object to query
 * @return {*}
 * @example
 *
 * RA.invoke(['random'], Math); //=> 0.5113253820009047
 */
var invoke = (0, _invokeArgs["default"])(_ramda.__, [], _ramda.__);
var _default = invoke;
exports["default"] = _default;
},{"./invokeArgs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/invokeArgs.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/invokeArgs.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNotFunction = _interopRequireDefault(require("./isNotFunction"));

var _isEmptyArray = _interopRequireDefault(require("./isEmptyArray"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Invokes the method at path of object with given arguments.
 *
 * @func invokeArgs
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.27.0|v2.27.0}
 * @category Object
 * @sig Array -> Array -> Object -> *
 * @param {Array.<string|number>} path The path of the method to invoke
 * @param {Array} args The arguments to invoke the method with
 * @param {Object} obj The object to query
 * @return {*}
 * @example
 *
 * RA.invokeArgs(['abs'], [-1], Math); //=> 1
 * RA.invokeArgs(['path', 'to', 'non-existent', 'method'], [-1], Math); //=> undefined
 */
var invokeArgs = (0, _ramda.curryN)(3, function (mpath, args, obj) {
  var method = (0, _ramda.path)(mpath, obj);
  var context = (0, _ramda.path)((0, _ramda.init)(mpath), obj);
  if ((0, _isNotFunction["default"])(method)) return undefined;
  if ((0, _isEmptyArray["default"])(mpath)) return undefined;
  var boundMethod = (0, _ramda.bind)(method, context);
  return (0, _ramda.apply)(boundMethod, args);
});
var _default = invokeArgs;
exports["default"] = _default;
},{"./isEmptyArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isEmptyArray.js","./isNotFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArray.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is `Array`.
 *
 * @func isArray
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.3.0|v0.3.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotArray|isNotArray}
 * @example
 *
 * RA.isArray([]); //=> true
 * RA.isArray(null); //=> false
 * RA.isArray({}); //=> false
 */
var isArray = (0, _ramda.curryN)(1, (0, _isFunction["default"])(Array.isArray) ? Array.isArray : (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('Array')));
var _default = isArray;
exports["default"] = _default;
},{"./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArrayLike.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isArray = _interopRequireDefault(require("./isArray"));

var _isString = _interopRequireDefault(require("./isString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }

/* eslint-disable max-len */

/**
 * Tests whether or not an object is similar to an array.
 *
 * @func isArrayLike
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.9.0|v1.9.0}
 * @licence https://github.com/ramda/ramda/blob/master/LICENSE.txt
 * @category List
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @returns {boolean} `true` if `val` has a numeric length property and extreme indices defined; `false` otherwise.
 * @see {@link RA.isNotArrayLike|isNotArrayLike}

 * @example
 *
 * RA.isArrayLike([]); //=> true
 * RA.isArrayLike(true); //=> false
 * RA.isArrayLike({}); //=> false
 * RA.isArrayLike({length: 10}); //=> false
 * RA.isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true
 */

/* eslint-enable max-len */
var isArrayLike = (0, _ramda.curryN)(1, function (val) {
  if ((0, _isArray["default"])(val)) {
    return true;
  }

  if (!val) {
    return false;
  }

  if ((0, _isString["default"])(val)) {
    return false;
  }

  if (_typeof(val) !== 'object') {
    return false;
  }

  if (val.nodeType === 1) {
    return !!val.length;
  }

  if (val.length === 0) {
    return true;
  }

  if (val.length > 0) {
    return (0, _ramda.has)(0, val) && (0, _ramda.has)(val.length - 1, val);
  }

  return false;
});
var _default = isArrayLike;
/**
 The MIT License (MIT)

 Copyright (c) 2013-2016 Scott Sauyet and Michael Hurley

 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
*/

exports["default"] = _default;
},{"./isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArray.js","./isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isString.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isAsyncFunction.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if input value is `Async Function`.
 *
 * @func isAsyncFunction
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isFunction|isFunction}, {@link RA.isNotAsyncFunction|isNotAsyncFunction}, {@link RA.isGeneratorFunction|isGeneratorFunction}
 * @example
 *
 * RA.isAsyncFunction(async function test() { }); //=> true
 * RA.isAsyncFunction(null); //=> false
 * RA.isAsyncFunction(function test() { }); //=> false
 * RA.isAsyncFunction(() => {}); //=> false
 */
var isAsyncFunction = (0, _ramda.curryN)(1, (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('AsyncFunction')));
var _default = isAsyncFunction;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isBigInt.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if value is a BigInt.
 *
 * @func isBigInt
 * @memberOf RA
 * @category Type
 * @since {@link https://char0n.github.io/ramda-adjunct/2.27.0|v2.27.0}
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @example
 *
 * RA.isBigInt(5); // => false
 * RA.isBigInt(Number.MAX_VALUE); // => false
 * RA.isBigInt(-Infinity); // => false
 * RA.isBigInt(10); // => false
 * RA.isBigInt(10n); // => true
 * RA.isBigInt(BitInt(9007199254740991)); // => true
 */
var isBigInt = (0, _ramda.curryN)(1, (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('BigInt')));
var _default = isBigInt;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isBoolean.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if input value is `Boolean`.
 *
 * @func isBoolean
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.3.0|v0.3.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotBoolean|isNotBoolean}
 * @example
 *
 * RA.isBoolean(false); //=> true
 * RA.isBoolean(true); //=> true
 * RA.isBoolean(null); //=> false
 */
var isBoolean = (0, _ramda.curryN)(1, (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('Boolean')));
var _default = isBoolean;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isDate.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if value is `Date` object.
 *
 * @func isDate
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.6.0|v0.6.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotDate|isNotDate}, {@link RA.isValidDate|isValidDate}, {@link RA.isNotValidDate|isNotValidDate}
 * @example
 *
 * RA.isDate(new Date()); //=> true
 * RA.isDate('1997-07-16T19:20+01:00'); //=> false
 */
var isDate = (0, _ramda.curryN)(1, (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('Date')));
var _default = isDate;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isEmptyArray.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isArray = _interopRequireDefault(require("./isArray"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is an empty `Array`.
 *
 * @func isEmptyArray
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.4.0|v2.4.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotEmptyArray|isNotEmptyArray}
 * @example
 *
 * RA.isEmptyArray([]); // => true
 * RA.isEmptyArray([42]); // => false
 * RA.isEmptyArray({}); // => false
 * RA.isEmptyArray(null); // => false
 * RA.isEmptyArray(undefined); // => false
 * RA.isEmptyArray(42); // => false
 * RA.isEmptyArray('42'); // => false
 */
var isEmptyArray = (0, _ramda.both)(_isArray["default"], _ramda.isEmpty);
var _default = isEmptyArray;
exports["default"] = _default;
},{"./isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArray.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isEmptyString.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if input value is an empty `String`.
 *
 * @func isEmptyString
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.4.0|v2.4.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotEmptyString|isNotEmptyString}
 * @example
 *
 * RA.isEmptyString(''); // => true
 * RA.isEmptyString('42'); // => false
 * RA.isEmptyString(new String('42')); // => false
 * RA.isEmptyString(new String('')); // => false
 * RA.isEmptyString([42]); // => false
 * RA.isEmptyString({}); // => false
 * RA.isEmptyString(null); // => false
 * RA.isEmptyString(undefined); // => false
 * RA.isEmptyString(42); // => false
 */
var isEmptyString = (0, _ramda.equals)('');
var _default = isEmptyString;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isError.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, `SyntaxError`, `TypeError` or `URIError` object.
 *
 * @func isError
 * @category Type
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.30.0|v2.30.0}
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean} Returns `true` if value is an error object, `false` otherwise
 * @example
 *
 * RA.isError(new Error()); //=> true
 * RA.isError(Error); //=> false
 * RA.isError(1); // => false
 */
var isError = (0, _ramda.curryN)(1, (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('Error')));
var _default = isError;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isEven.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isInteger = _interopRequireDefault(require("./isInteger"));

var _isOdd = _interopRequireDefault(require("./isOdd"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is even integer number.
 * An even number is an integer which is "evenly divisible" by two.
 * Zero is an even number because zero divided by two equals zero,
 * which despite not being a natural number, is an integer.
 * Even numbers are either positive or negative.
 *
 * @func isEven
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.18.0|v1.18.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isOdd|isOdd}
 * @example
 *
 * RA.isEven(0); // => true
 * RA.isEven(1); // => false
 * RA.isEven(-Infinity); // => false
 * RA.isEven(4); // => true
 * RA.isEven(3); // => false
 */
var isEven = (0, _ramda.curryN)(1, (0, _ramda.both)(_isInteger["default"], (0, _ramda.complement)(_isOdd["default"])));
var _default = isEven;
exports["default"] = _default;
},{"./isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger.js","./isOdd":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isOdd.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFalse.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if input value is the Boolean primitive `false`. Will return false for all values created
 * using the `Boolean` function as a constructor.
 *
 * @func isFalse
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.6.0|v2.6.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isTrue|isTrue}, {@link RA.isTruthy|isTruthy}, {@link RA.isFalsy|isFalsy}
 * @example
 *
 * RA.isFalse(false); // => true
 * RA.isFalse(Boolean(false)); // => true
 * RA.isFalse(true); // => false
 * RA.isFalse(0); // => false
 * RA.isFalse(''); // => false
 * RA.isFalse(null); // => false
 * RA.isFalse(undefined); // => false
 * RA.isFalse(NaN); // => false
 * RA.isFalse([]); // => false
 * RA.isFalse(new Boolean(false)); // => false
 */
var isFalse = (0, _ramda.identical)(false);
var _default = isFalse;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFalsy.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isTruthy = _interopRequireDefault(require("./isTruthy"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * A falsy value is a value that translates to false when evaluated in a Boolean context.
 * Falsy values are `false`, `0`, `""`, `null`, `undefined`, and `NaN`.
 *
 * @func isFalsy
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.2.0|v2.2..0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link https://developer.mozilla.org/en-US/docs/Glossary/Falsy|falsy}, {@link RA.isTruthy|isTruthy}
 * @example
 *
 * RA.isFalsy(false); // => true
 * RA.isFalsy(0); // => true
 * RA.isFalsy(''); // => true
 * RA.isFalsy(null); // => true
 * RA.isFalsy(undefined); // => true
 * RA.isFalsy(NaN); // => true
 */
var isFalsy = (0, _ramda.complement)(_isTruthy["default"]);
var _default = isFalsy;
exports["default"] = _default;
},{"./isTruthy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isTruthy.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFinite.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.isFinitePonyfill = exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

var _Number = _interopRequireDefault(require("./internal/ponyfills/Number.isFinite"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var isFinitePonyfill = (0, _ramda.curryN)(1, _Number["default"]);
/**
 * Checks whether the passed value is a finite `Number`.
 *
 * @func isFinite
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.7.0|v0.7.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotFinite|isNotFinite}
 * @example
 *
 * RA.isFinite(Infinity); //=> false
 * RA.isFinite(NaN); //=> false
 * RA.isFinite(-Infinity); //=> false
 *
 * RA.isFinite(0); // true
 * RA.isFinite(2e64); // true
 *
 * RA.isFinite('0');  // => false
 *                    // would've been true with global isFinite('0')
 * RA.isFinite(null); // => false
 *                    // would've been true with global isFinite(null)
 */

exports.isFinitePonyfill = isFinitePonyfill;

var _isFinite = (0, _isFunction["default"])(Number.isFinite) ? (0, _ramda.curryN)(1, (0, _ramda.bind)(Number.isFinite, Number)) : isFinitePonyfill;

var _default = _isFinite;
exports["default"] = _default;
},{"./internal/ponyfills/Number.isFinite":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Number.isFinite.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFloat.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isInteger = _interopRequireDefault(require("./isInteger"));

var _isFinite = _interopRequireDefault(require("./isFinite"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks whether the passed value is a `float`.
 *
 * @func isFloat
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.14.0|v1.14.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotFloat|isNotFloat}
 * @example
 *
 * RA.isFloat(0); //=> false
 * RA.isFloat(1); //=> false
 * RA.isFloat(-100000); //=> false
 *
 * RA.isFloat(0.1);       //=> true
 * RA.isFloat(Math.PI);   //=> true
 *
 * RA.isFloat(NaN);       //=> false
 * RA.isFloat(Infinity);  //=> false
 * RA.isFloat(-Infinity); //=> false
 * RA.isFloat('10');      //=> false
 * RA.isFloat(true);      //=> false
 * RA.isFloat(false);     //=> false
 * RA.isFloat([1]);       //=> false
 */
var isFloat = (0, _ramda.both)(_isFinite["default"], (0, _ramda.complement)(_isInteger["default"]));
var _default = isFloat;
exports["default"] = _default;
},{"./isFinite":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFinite.js","./isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isGeneratorFunction = _interopRequireDefault(require("./isGeneratorFunction"));

var _isAsyncFunction = _interopRequireDefault(require("./isAsyncFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is `Function`.
 *
 * @func isFunction
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotFunction|isNotFunction}, {@link RA.isAsyncFunction|isNotAsyncFunction}, {@link RA.isGeneratorFunction|isGeneratorFunction}
 * @example
 *
 * RA.isFunction(function test() { }); //=> true
 * RA.isFunction(function* test() { }); //=> true
 * RA.isFunction(async function test() { }); //=> true
 * RA.isFunction(() => {}); //=> true
 * RA.isFunction(null); //=> false
 * RA.isFunction('abc'); //=> false
 */
var isFunction = (0, _ramda.anyPass)([(0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('Function')), _isGeneratorFunction["default"], _isAsyncFunction["default"]]);
var _default = isFunction;
exports["default"] = _default;
},{"./isAsyncFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isAsyncFunction.js","./isGeneratorFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isGeneratorFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isGeneratorFunction.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var GeneratorFunction = null;
var legacyCheck = null;

try {
  GeneratorFunction = new Function('return function* () {}')().constructor; // eslint-disable-line no-new-func

  legacyCheck = (0, _ramda.is)(GeneratorFunction);
} catch (e) {
  legacyCheck = _ramda.F;
}
/**
 * Checks if input value is `Generator Function`.
 *
 * @func isGeneratorFunction
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isFunction|isFunction}, {@link RA.isAsyncFunction|isAsyncFunction}, {@link RA.isNotGeneratorFunction|isNotGeneratorFunction}
 * @example
 *
 * RA.isGeneratorFunction(function* test() { }); //=> true
 * RA.isGeneratorFunction(null); //=> false
 * RA.isGeneratorFunction(function test() { }); //=> false
 * RA.isGeneratorFunction(() => {}); //=> false
 */


var isGeneratorFunction = (0, _ramda.curryN)(1, (0, _ramda.either)((0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('GeneratorFunction')), legacyCheck));
var _default = isGeneratorFunction;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isIndexed.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isArray = _interopRequireDefault(require("./isArray"));

var _isString = _interopRequireDefault(require("./isString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Determine if input value is an indexed data type.
 *
 * @func isIndexed
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.26.0|v2.26.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @example
 *
 * RA.isIndexed([1]) //=> true
 * RA.isIndexed('test') //=> true
 */
var isIndexed = (0, _ramda.curryN)(1, (0, _ramda.either)(_isString["default"], _isArray["default"]));
var _default = isIndexed;
exports["default"] = _default;
},{"./isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArray.js","./isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isString.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.isIntegerPonyfill = exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

var _Number = _interopRequireDefault(require("./internal/ponyfills/Number.isInteger"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var isIntegerPonyfill = (0, _ramda.curryN)(1, _Number["default"]);
/**
 * Checks whether the passed value is an `integer`.
 *
 * @func isInteger
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.7.0|v0.7.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotInteger|isNotInteger}
 * @example
 *
 * RA.isInteger(0); //=> true
 * RA.isInteger(1); //=> true
 * RA.isInteger(-100000); //=> true
 *
 * RA.isInteger(0.1);       //=> false
 * RA.isInteger(Math.PI);   //=> false
 *
 * RA.isInteger(NaN);       //=> false
 * RA.isInteger(Infinity);  //=> false
 * RA.isInteger(-Infinity); //=> false
 * RA.isInteger('10');      //=> false
 * RA.isInteger(true);      //=> false
 * RA.isInteger(false);     //=> false
 * RA.isInteger([1]);       //=> false
 */

exports.isIntegerPonyfill = isIntegerPonyfill;
var isInteger = (0, _isFunction["default"])(Number.isInteger) ? (0, _ramda.curryN)(1, (0, _ramda.bind)(Number.isInteger, Number)) : isIntegerPonyfill;
var _default = isInteger;
exports["default"] = _default;
},{"./internal/ponyfills/Number.isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Number.isInteger.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger32.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _toInteger = _interopRequireDefault(require("./toInteger32"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks whether the passed value is a signed 32 bit integer.
 *
 * @func isInteger32
 * @aliases isInt32
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.32.0|v2.32.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.toInteger32|toInteger32}
 * @example
 *
 * RA.isInteger32(0); //=> true
 * RA.isInteger32((-2) ** 31); //=> true
 *
 * RA.isInteger32(Infinity); //=> false
 * RA.isInteger32(NaN); //=> false
 * RA.isInteger32(2 ** 31); //=> false
 */
var isInteger32 = (0, _ramda.curryN)(1, function (val) {
  return (0, _toInteger["default"])(val) === val;
});
var _default = isInteger32;
exports["default"] = _default;
},{"./toInteger32":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/toInteger32.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isIterable.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks whether the passed value is iterable.
 *
 * @func isIterable
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.18.0|v2.18.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#The_iterable_protocol}
 * @return {boolean}
 * @example
 *
 * RA.isIterable(['arrays', 'are', 'iterable']); //=> true
 * RA.isIterable('strings are iterable, too'); //=> true
 * RA.isIterable((function* () {})()); //=> true (generator objects are both iterable and iterators)
 *
 * RA.isIterable({}); //=> false
 * RA.isIterable(-0); //=> false
 * RA.isIterable(null); //=> false
 * RA.isIterable(undefined); //=> false
 */
var isIterable = (0, _ramda.curryN)(1, function (val) {
  if (typeof Symbol === 'undefined') {
    return false;
  }

  return (0, _ramda.hasIn)(Symbol.iterator, Object(val)) && (0, _isFunction["default"])(val[Symbol.iterator]);
});
var _default = isIterable;
exports["default"] = _default;
},{"./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isMap.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Predicate for determining if a provided value is an instance of a Map.
 *
 * @func isMap
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isSet|isSet}}
 * @example
 *
 * RA.isMap(new Map()); //=> true
 * RA.isMap(new Map([[1, 2], [2, 1]])); //=> true
 * RA.isSet(new Set()); //=> false
 * RA.isSet(new Set([1,2]); //=> false
 * RA.isSet(new Object()); //=> false
 */
var isMap = (0, _ramda.curryN)(1, (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('Map')));
var _default = isMap;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNaN.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.isNaNPonyfill = exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

var _Number = _interopRequireDefault(require("./internal/ponyfills/Number.isNaN"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var isNaNPonyfill = (0, _ramda.curryN)(1, _Number["default"]);
/**
 * Checks whether the passed value is `NaN` and its type is `Number`.
 * It is a more robust version of the original, global isNaN().
 *
 *
 * @func isNaN
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.6.0|v0.6.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotNaN|isNotNaN}
 * @example
 *
 * RA.isNaN(NaN); // => true
 * RA.isNaN(Number.NaN); // => true
 * RA.isNaN(0 / 0); // => true
 *
 * // e.g. these would have been true with global isNaN().
 * RA.isNaN('NaN'); // => false
 * RA.isNaN(undefined); // => false
 * RA.isNaN({}); // => false
 * RA.isNaN('blabla'); // => false
 *
 * RA.isNaN(true); // => false
 * RA.isNaN(null); // => false
 * RA.isNaN(37); // => false
 * RA.isNaN('37'); // => false
 * RA.isNaN('37.37'); // => false
 * RA.isNaN(''); // => false
 * RA.isNaN(' '); // => false
 */

exports.isNaNPonyfill = isNaNPonyfill;

var _isNaN = (0, _isFunction["default"])(Number.isNaN) ? (0, _ramda.curryN)(1, Number.isNaN) : isNaNPonyfill;

var _default = _isNaN;
exports["default"] = _default;
},{"./internal/ponyfills/Number.isNaN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Number.isNaN.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNaturalNumber.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isInteger = _interopRequireDefault(require("./isInteger"));

var _isNegative = _interopRequireDefault(require("./isNegative"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is a natural number.
 * Natural numbers correspond to all non-negative integers and 0.
 *
 * @func isNaturalNumber
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.29.0|v2.29.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @example
 *
 * RA.isNaturalNumber(5); // => true
 * RA.isNaturalNumber(Number.MAX_VALUE); // => true
 * RA.isNaturalNumber(0); // => true
 * RA.isNaturalNumber(-1); // => false
 * RA.isNaturalNumber(0.9); // => false
 */
var isNaturalNumber = (0, _ramda.curryN)(1, (0, _ramda.both)(_isInteger["default"], (0, _ramda.complement)(_isNegative["default"])));
var _default = isNaturalNumber;
exports["default"] = _default;
},{"./isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger.js","./isNegative":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNegative.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNegative.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNumber = _interopRequireDefault(require("./isNumber"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is a negative `Number` primitive or object. Zero is not considered neither
 * positive or negative.
 *
 * @func isNegative
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.15.0|v1.15.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isPositive|isPositive}
 * @example
 *
 * RA.isNegative(-1); // => true
 * RA.isNegative(Number.MIN_VALUE); // => false
 * RA.isNegative(+Infinity); // => false
 * RA.isNegative(NaN); // => false
 * RA.isNegative('5'); // => false
 */
var isNegative = (0, _ramda.curryN)(1, (0, _ramda.both)(_isNumber["default"], (0, _ramda.gt)(0)));
var _default = isNegative;
exports["default"] = _default;
},{"./isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNumber.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNegativeZero.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if value is a negative zero (-0).
 *
 * @func isNegativeZero
 * @memberof RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see @see {@link RA.isPositiveZero|isPositiveZero}
 * @example
 *
 * RA.isNegativeZero(-0); //=> true
 * RA.isNegativeZero(+0); //=> false
 * RA.isNegativeZero(0); //=> false
 * RA.isNegativeZero(null); //=> false
 */
var isNegativeZero = (0, _ramda.identical)(-0);
var _default = isNegativeZero;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNilOrEmpty.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns `true` if the given value is its type's empty value, `null` or `undefined`.
 *
 * @func isNilOrEmpty
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.4.0|v0.4.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link http://ramdajs.com/docs/#isEmpty|R.isEmpty}, {@link http://ramdajs.com/docs/#isNil|R.isNil}
 * @example
 *
 * RA.isNilOrEmpty([1, 2, 3]); //=> false
 * RA.isNilOrEmpty([]); //=> true
 * RA.isNilOrEmpty(''); //=> true
 * RA.isNilOrEmpty(null); //=> true
 * RA.isNilOrEmpty(undefined): //=> true
 * RA.isNilOrEmpty({}); //=> true
 * RA.isNilOrEmpty({length: 0}); //=> false
 */
var isNilOrEmpty = (0, _ramda.curryN)(1, (0, _ramda.either)(_ramda.isNil, _ramda.isEmpty));
var _default = isNilOrEmpty;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNonEmptyArray.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNotEmpty = _interopRequireDefault(require("./isNotEmpty"));

var _isArray = _interopRequireDefault(require("./isArray"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is not an empty `Array`.
 *
 * @func isNonEmptyArray
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.4.0|v2.4.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isEmptyArray|isEmptyArray}
 * @example
 *
 * RA.isNonEmptyArray([42]); // => true
 * RA.isNonEmptyArray([]); // => false
 * RA.isNonEmptyArray({}); // => false
 * RA.isNonEmptyArray(null); // => false
 * RA.isNonEmptyArray(undefined); // => false
 * RA.isNonEmptyArray(42); // => false
 * RA.isNonEmptyArray('42'); // => false
 */
var isNonEmptyArray = (0, _ramda.both)(_isArray["default"], _isNotEmpty["default"]);
var _default = isNonEmptyArray;
exports["default"] = _default;
},{"./isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArray.js","./isNotEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotEmpty.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNonEmptyString.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isString = _interopRequireDefault(require("./isString"));

var _isNotObj = _interopRequireDefault(require("./isNotObj"));

var _isNotEmpty = _interopRequireDefault(require("./isNotEmpty"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is not an empty `String`.
 *
 * @func isNonEmptyString
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.4.0|v2.4.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isEmptyString|isEmptyString}
 * @example
 *
 * RA.isNonEmptyString('42'); // => true
 * RA.isNonEmptyString(''); // => false
 * RA.isNonEmptyString(new String('42')); // => false
 * RA.isNonEmptyString(new String('')); // => false
 * RA.isNonEmptyString([42]); // => false
 * RA.isNonEmptyString({}); // => false
 * RA.isNonEmptyString(null); // => false
 * RA.isNonEmptyString(undefined); // => false
 * RA.isNonEmptyString(42); // => false
 */
var isNonEmptyString = (0, _ramda.allPass)([_isString["default"], _isNotObj["default"], _isNotEmpty["default"]]);
var _default = isNonEmptyString;
exports["default"] = _default;
},{"./isNotEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotEmpty.js","./isNotObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotObj.js","./isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isString.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNonNegative.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNumber = _interopRequireDefault(require("./isNumber"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is a non-negative `Number` primitive or object. This includes all positive
 * numbers and zero.
 *
 * @func isNonNegative
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.6.0|v2.6.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isPositive|isPositive}, {@link RA.isNonPositive|isNonPositive}
 * @example
 *
 * RA.isNonNegative(0); // => true
 * RA.isNonNegative(1); // => true
 * RA.isNonNegative(Infinity); // => true
 * RA.isNonNegative(Number.MAX_VALUE); // => true
 *
 * RA.isNonNegative(-Infinity); // => false
 * RA.isNonNegative(Number.MIN_VALUE); // => false
 * RA.isNonNegative(NaN); // => false
 */
var isNonNegative = (0, _ramda.curryN)(1, (0, _ramda.both)(_isNumber["default"], (0, _ramda.flip)(_ramda.gte)(0)));
var _default = isNonNegative;
exports["default"] = _default;
},{"./isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNumber.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNonPositive.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNumber = _interopRequireDefault(require("./isNumber"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is a non-positive `Number` primitive or object. This includes all negative
 * numbers and zero.
 *
 * @func isNonPositive
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.6.0|v2.6.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNegative|isNegative}, {@link RA.isNonNegative|isNonNegative}
 * @example
 *
 * RA.isNonPositive(0); // => true
 * RA.isNonPositive(-1); // => true
 * RA.isNonPositive(-Infinity); // => true
 * RA.isNonPositive(Number.MIN_VALUE); // => true
 *
 * RA.isNonPositive(Infinity); // => false
 * RA.isNonPositive(Number.MAX_VALUE); // => false
 * RA.isNonPositive(NaN); // => false
 */
var isNonPositive = (0, _ramda.curryN)(1, (0, _ramda.both)(_isNumber["default"], (0, _ramda.flip)(_ramda.lte)(0)));
var _default = isNonPositive;
exports["default"] = _default;
},{"./isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNumber.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotArray.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isArray = _interopRequireDefault(require("./isArray"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is complement of `Array`
 *
 * @func isNotArray
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.3.0|v0.3.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isArray|isArray}
 * @example
 *
 * RA.isNotArray([]); //=> false
 * RA.isNotArray(null); //=> true
 * RA.isNotArray({}); //=> true
 */
var isNotArray = (0, _ramda.complement)(_isArray["default"]);
var _default = isNotArray;
exports["default"] = _default;
},{"./isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArray.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotArrayLike.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isArrayLike = _interopRequireDefault(require("./isArrayLike"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Tests whether or not an object is similar to an array.
 *
 * @func isNotArrayLike
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isArrayLike|isArrayLike}
 * @example
 *
 * RA.isNotArrayLike([]); //=> false
 * RA.isNotArrayLike(true); //=> true
 * RA.isNotArrayLike({}); //=> true
 * RA.isNotArrayLike({length: 10}); //=> true
 * RA.isNotArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> false
 */
var isNotArrayLike = (0, _ramda.complement)(_isArrayLike["default"]);
var _default = isNotArrayLike;
exports["default"] = _default;
},{"./isArrayLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArrayLike.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotAsyncFunction.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isAsyncFunction = _interopRequireDefault(require("./isAsyncFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/* eslint-disable max-len */

/**
 * Checks if input value is complement of `Async Function`
 *
 * @func isNotAsyncFunction
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isFunction|isFunction}, {@link RA.isAsyncFunction|isAsyncFunction}, {@link RA.isGeneratorFunction|isGeneratorFunction}
 * @example
 *
 * RA.isNotAsyncFunction(async function test() { }); //=> false
 * RA.isNotAsyncFunction(null); //=> true
 * RA.isNotAsyncFunction(function test() { }); //=> true
 * RA.isNotAsyncFunction(() => {}); //=> true
 */

/* eslint-enable max-len */
var isNotAsyncFunction = (0, _ramda.complement)(_isAsyncFunction["default"]);
var _default = isNotAsyncFunction;
exports["default"] = _default;
},{"./isAsyncFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isAsyncFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotBoolean.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isBoolean = _interopRequireDefault(require("./isBoolean"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is complement of `Boolean`.
 *
 * @func isNotBoolean
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.3.0|v0.3.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isBoolean|isBoolean}
 * @example
 *
 * RA.isNotBoolean(false); //=> false
 * RA.isNotBoolean(true); //=> false
 * RA.isNotBoolean(null); //=> true
 */
var isNotBoolean = (0, _ramda.complement)(_isBoolean["default"]);
var _default = isNotBoolean;
exports["default"] = _default;
},{"./isBoolean":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isBoolean.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotDate.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isDate = _interopRequireDefault(require("./isDate"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is complement of `Date` object.
 *
 * @func isNotDate
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.6.0|v0.6.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isDate|isDate}
 * @example
 *
 * RA.isNotDate(new Date()); //=> false
 * RA.isNotDate('1997-07-16T19:20+01:00'); //=> true
 */
var isNotDate = (0, _ramda.complement)(_isDate["default"]);
var _default = isNotDate;
exports["default"] = _default;
},{"./isDate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isDate.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotEmpty.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns true if the given value is not its type's empty value; `false` otherwise.
 *
 * @func isNotEmpty
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.4.0|v0.4.0}
 * @category Logic
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link http://ramdajs.com/docs/#isEmpty|R.isEmpty}
 * @example
 *
 * RA.isNotEmpty([1, 2, 3]); //=> true
 * RA.isNotEmpty([]); //=> false
 * RA.isNotEmpty(''); //=> false
 * RA.isNotEmpty(null); //=> true
 * RA.isNotEmpty(undefined): //=> true
 * RA.isNotEmpty({}); //=> false
 * RA.isNotEmpty({length: 0}); //=> true
 */
var isNotEmpty = (0, _ramda.complement)(_ramda.isEmpty);
var _default = isNotEmpty;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotFinite.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isFinite2 = _interopRequireDefault(require("./isFinite"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks whether the passed value is complement of finite `Number`.
 *
 *
 * @func isNotFinite
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.7.0|v0.7.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isFinite|isFinite}
 * @example
 *
 * RA.isNotFinite(Infinity); //=> true
 * RA.isNotFinite(NaN); //=> true
 * RA.isNotFinite(-Infinity); //=> true
 *
 * RA.isNotFinite(0); // false
 * RA.isNotFinite(2e64); // false
 *
 * RA.isNotFinite('0');  // => true
 * RA.isNotFinite(null); // => true
 */
var isNotFinite = (0, _ramda.complement)(_isFinite2["default"]);
var _default = isNotFinite;
exports["default"] = _default;
},{"./isFinite":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFinite.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotFloat.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isFloat = _interopRequireDefault(require("./isFloat"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks whether the passed value is complement of a `float`.
 *
 * @func isNotFloat
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.14.0|v1.14.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isFloat|isFloat}
 * @example
 *
 * RA.isNotFloat(0); //=> true
 * RA.isNotFloat(1); //=> true
 * RA.isNotFloat(-100000); //=> true
 *
 * RA.isNotFloat(0.1);       //=> false
 * RA.isNotFloat(Math.PI);   //=> false
 *
 * RA.isNotFloat(NaN);       //=> true
 * RA.isNotFloat(Infinity);  //=> true
 * RA.isNotFloat(-Infinity); //=> true
 * RA.isNotFloat('10');      //=> true
 * RA.isNotFloat(true);      //=> true
 * RA.isNotFloat(false);     //=> true
 * RA.isNotFloat([1]);       //=> true
 */
var isNotFloat = (0, _ramda.curryN)(1, (0, _ramda.complement)(_isFloat["default"]));
var _default = isNotFloat;
exports["default"] = _default;
},{"./isFloat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFloat.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotFunction.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/* eslint-disable max-len */

/**
 * Checks if input value is complement of `Function`.
 *
 * @func isNotFunction
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isFunction|isFunction}, {@link RA.isAsyncFunction|isNotAsyncFunction}, {@link RA.isGeneratorFunction|isGeneratorFunction}
 * @example
 *
 * RA.isNotFunction(function test() { }); //=> false
 * RA.isNotFunction(function* test() { }); //=> false
 * RA.isNotFunction(async function test() { }); //=> false
 * RA.isNotFunction(() => {}); //=> false
 * RA.isNotFunction(null); //=> true
 * RA.isNotFunction('abc'); //=> true
 */

/* eslint-enable max-len */
var isNotFunction = (0, _ramda.complement)(_isFunction["default"]);
var _default = isNotFunction;
exports["default"] = _default;
},{"./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotGeneratorFunction.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isGeneratorFunction = _interopRequireDefault(require("./isGeneratorFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/* eslint-disable max-len */

/**
 * Checks if input value is complement of `Generator Function`
 *
 * @func isNotGeneratorFunction
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isFunction|isFunction}, {@link RA.isAsyncFunction|isAsyncFunction}, {@link RA.isGeneratorFunction|isGeneratorFunction}
 * @example
 *
 * RA.isNotGeneratorFunction(function* test() { }); //=> false
 * RA.isNotGeneratorFunction(null); //=> true
 * RA.isNotGeneratorFunction(function test() { }); //=> true
 * RA.isNotGeneratorFunction(() => {}); //=> true
 */

/* eslint-enable max-len */
var isNotGeneratorFunction = (0, _ramda.complement)(_isGeneratorFunction["default"]);
var _default = isNotGeneratorFunction;
exports["default"] = _default;
},{"./isGeneratorFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isGeneratorFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotInteger.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isInteger = _interopRequireDefault(require("./isInteger"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks whether the passed value is complement of an `integer`.
 *
 *
 * @func isNotInteger
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.7.0|v0.7.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isInteger|isInteger}
 * @example
 *
 * RA.isNotInteger(0); //=> false
 * RA.isNotInteger(1); //=> false
 * RA.isNotInteger(-100000); //=> false
 *
 * RA.isNotInteger(0.1);       //=> true
 * RA.isNotInteger(Math.PI);   //=> true
 *
 * RA.isNotInteger(NaN);       //=> true
 * RA.isNotInteger(Infinity);  //=> true
 * RA.isNotInteger(-Infinity); //=> true
 * RA.isNotInteger('10');      //=> true
 * RA.isNotInteger(true);      //=> true
 * RA.isNotInteger(false);     //=> true
 * RA.isNotInteger([1]);       //=> true
 */
var isNotInteger = (0, _ramda.complement)(_isInteger["default"]);
var _default = isNotInteger;
exports["default"] = _default;
},{"./isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotMap.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isMap = _interopRequireDefault(require("./isMap"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is complement of `Map` object.
 *
 * @func isNotMap
 * @memberOf RA
 * @category Type
 * @since {@link https://char0n.github.io/ramda-adjunct/2.27.0|v2.27.0}
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isMap|isMap}
 * @example
 *
 * RA.isNotMap(new Map()); //=> false
 * RA.isNotMap(new Map([[1, 2], [2, 1]])); //=> false
 * RA.isNotMap(new Set()); //=> true
 * RA.isNotMap({}); //=> true
 * RA.isNotMap(12); //=> true
 */
var isNotMap = (0, _ramda.complement)(_isMap["default"]);
var _default = isNotMap;
exports["default"] = _default;
},{"./isMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isMap.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNaN.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNaN2 = _interopRequireDefault(require("./isNaN"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks whether the passed value is complement of `NaN` and its type is not `Number`.
 *
 * @func isNotNaN
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.6.0|v0.6.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNaN|isNaN}
 * @example
 *
 * RA.isNotNaN(NaN); // => false
 * RA.isNotNaN(Number.NaN); // => false
 * RA.isNotNaN(0 / 0); // => false
 *
 * RA.isNotNaN('NaN'); // => true
 * RA.isNotNaN(undefined); // => true
 * RA.isNotNaN({}); // => true
 * RA.isNotNaN('blabla'); // => true
 *
 * RA.isNotNaN(true); // => true
 * RA.isNotNaN(null); // => true
 * RA.isNotNaN(37); // => true
 * RA.isNotNaN('37'); // => true
 * RA.isNotNaN('37.37'); // => true
 * RA.isNotNaN(''); // => true
 * RA.isNotNaN(' '); // => true
 */
var isNotNaN = (0, _ramda.complement)(_isNaN2["default"]);
var _default = isNotNaN;
exports["default"] = _default;
},{"./isNaN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNaN.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNil.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if input value is complement of `null` or `undefined`.
 *
 * @func isNotNil
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.3.0|v0.3.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link http://ramdajs.com/docs/#isNil|R.isNil}
 * @example
 *
 * RA.isNotNil(null); //=> false
 * RA.isNotNil(undefined); //=> false
 * RA.isNotNil(0); //=> true
 * RA.isNotNil([]); //=> true
 */
var isNotNil = (0, _ramda.complement)(_ramda.isNil);
var _default = isNotNil;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNilOrEmpty.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNilOrEmpty = _interopRequireDefault(require("./isNilOrEmpty"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns `false` if the given value is its type's empty value, `null` or `undefined`.
 *
 * @func isNotNilOrEmpty
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.18.0|v2.18.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNilOrEmpty|isNilOrEmpty}
 * @example
 *
 * RA.isNotNilOrEmpty([1, 2, 3]); //=> true
 * RA.isNotNilOrEmpty([]); //=> false
 * RA.isNotNilOrEmpty(''); //=> false
 * RA.isNotNilOrEmpty(null); //=> false
 * RA.isNotNilOrEmpty(undefined): //=> false
 * RA.isNotNilOrEmpty({}); //=> false
 * RA.isNotNilOrEmpty({length: 0}); //=> true
 */
var isNotNilOrEmpty = (0, _ramda.complement)(_isNilOrEmpty["default"]);
var _default = isNotNilOrEmpty;
exports["default"] = _default;
},{"./isNilOrEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNilOrEmpty.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNull.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNull = _interopRequireDefault(require("./isNull"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is complement of `null`.
 *
 * @func isNotNull
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.1.0|v0.1.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNull|isNull}
 * @example
 *
 * RA.isNotNull(1); //=> true
 * RA.isNotNull(undefined); //=> true
 * RA.isNotNull(null); //=> false
 */
var isNotNull = (0, _ramda.complement)(_isNull["default"]);
var _default = isNotNull;
exports["default"] = _default;
},{"./isNull":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNull.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNumber.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNumber = _interopRequireDefault(require("./isNumber"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is a complement of `Number` primitive or object.
 *
 * @func isNotNumber
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.6.0|v0.6.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNumber|isNumber}
 * @example
 *
 * RA.isNotNumber(5); // => false
 * RA.isNotNumber(Number.MAX_VALUE); // => false
 * RA.isNotNumber(-Infinity); // => false
 * RA.isNotNumber('5'); // => true
 */
var isNotNumber = (0, _ramda.complement)(_isNumber["default"]);
var _default = isNotNumber;
exports["default"] = _default;
},{"./isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNumber.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotObj.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isObj = _interopRequireDefault(require("./isObj"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/* eslint-disable max-len */

/**
 * Checks if input value is complement of language type of `Object`.
 *
 * @func isNotObj
 * @aliases isNotObject
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isObj|isObj}, {@link RA.isObjLike|isObjLike}, {@link RA.isPlainObj|isPlainObj}
 * @example
 *
 * RA.isNotObj({}); //=> false
 * RA.isNotObj([]); //=> false
 * RA.isNotObj(() => {}); //=> false
 * RA.isNotObj(null); //=> true
 * RA.isNotObj(undefined); //=> true
 */

/* eslint-enable max-len */
var isNotObj = (0, _ramda.complement)(_isObj["default"]);
var _default = isNotObj;
exports["default"] = _default;
},{"./isObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isObj.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotObjLike.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isObjLike = _interopRequireDefault(require("./isObjLike"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/* eslint-disable max-len */

/**
 * Checks if value is not object-like. A value is object-like if it's not null and has a typeof result of "object".
 *
 * @func isNotObjLike
 * @aliases isNotObjectLike
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isObjLike|isObjLike}, {@link RA.isObj|isObj}, {@link RA.isPlainObj|isPlainObj}
 * @example
 *
 * RA.isNotObjLike({}); //=> false
 * RA.isNotObjLike([]); //=> false
 * RA.isNotObjLike(() => {}); //=> true
 * RA.isNotObjLike(null); //=> true
 * RA.isNotObjLike(undefined); //=> true
 */

/* eslint-enable max-len */
var isNotObjLike = (0, _ramda.complement)(_isObjLike["default"]);
var _default = isNotObjLike;
exports["default"] = _default;
},{"./isObjLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isObjLike.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotPair.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isPair = _interopRequireDefault(require("./isPair"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is complement of a pair.
 *
 * @func isNotPair
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.19.0|v1.19.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link http://ramdajs.com/docs/#pair|R.pair}, {@link RA.isPair|isPair}
 * @example
 *
 * RA.isNotPair([]); // => true
 * RA.isNotPair([0]); // => true
 * RA.isNotPair([0, 1]); // => false
 * RA.isNotPair([0, 1, 2]); // => true
 * RA.isNotPair({0: 0, 1: 1}); // => true
 * RA.isNotPair({foo: 0, bar: 0}); // => true
 */
var isNotPair = (0, _ramda.complement)(_isPair["default"]);
var _default = isNotPair;
exports["default"] = _default;
},{"./isPair":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPair.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotPlainObj.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isPlainObj = _interopRequireDefault(require("./isPlainObj"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/* eslint-disable max-len */

/**
 * Check to see if an object is a not plain object (created using `{}`, `new Object()` or `Object.create(null)`).
 *
 * @func isNotPlainObj
 * @aliases isNotPlainObject
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isPlainObj|isPlainObj}, {@link RA.isObjLike|isObjLike}, {@link RA.isObj|isObj}
 * @example
 *
 * class Bar {
 *   constructor() {
 *     this.prop = 'value';
 *   }
 * }
 *
 * RA.isNotPlainObj(new Bar()); //=> true
 * RA.isNotPlainObj({ prop: 'value' }); //=> false
 * RA.isNotPlainObj(['a', 'b', 'c']); //=> true
 * RA.isNotPlainObj(Object.create(null); //=> false
 * RA.isNotPlainObj(new Object()); //=> false
 */

/* eslint-enable max-len */
var isNotPlainObj = (0, _ramda.complement)(_isPlainObj["default"]);
var _default = isNotPlainObj;
exports["default"] = _default;
},{"./isPlainObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPlainObj.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotPrimitive.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isPrimitive = _interopRequireDefault(require("./isPrimitive"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is not a primitive data type. There are 6 primitive data types: `string`, `number`, `bigint`, `boolean`, `undefined`, `symbol` and a special case of `null`.
 *
 * @func isNotPrimitive
 * @category Type
 * @sig * -> Boolean
 * @since {@link https://char0n.github.io/ramda-adjunct/2.32.0|v2.32.0}
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isPrimitive|isPrimitive}, {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#primitive_values|MDN Primitive values}, {@link https://developer.mozilla.org/en-US/docs/Glossary/Primitive|MDN Primitive}
 * @example
 *
 * RA.isNotPrimitive(new String("string")); //=> true
 * RA.isNotPrimitive(new Number(1)); //=> true
 * RA.isNotPrimitive("string"); //=> false
 * RA.isNotPrimitive(1); //=> false
 */
var isNotPrimitive = (0, _ramda.curryN)(1, (0, _ramda.complement)(_isPrimitive["default"]));
var _default = isNotPrimitive;
exports["default"] = _default;
},{"./isPrimitive":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPrimitive.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotRegExp.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isRegExp = _interopRequireDefault(require("./isRegExp"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is complement of `RegExp` object.
 *
 * @func isNotRegExp
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.5.0|v2.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isRegExp|isRegExp}
 * @example
 *
 * RA.isNotRegExp(1); //=> true
 * RA.isNotRegExp(/(?:)/); //=> false
 * RA.isNotRegExp(new RegExp()); //=> false
 */
var isNotRegExp = (0, _ramda.complement)(_isRegExp["default"]);
var _default = isNotRegExp;
exports["default"] = _default;
},{"./isRegExp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isRegExp.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotSet.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isSet = _interopRequireDefault(require("./isSet"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is complement of `Set` object.
 *
 * @func isNotSet
 * @memberOf RA
 * @category Type
 * @since {@link https://char0n.github.io/ramda-adjunct/2.27.0|v2.27.0}
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isSet|isSet}
 * @example
 *
 * RA.isNotSet(new Map()); //=> true
 * RA.isNotSet(new Set()); //=> false
 * RA.isNotSet(new Set([1,2]); //=> false
 * RA.isNotSet(new Object()); //=> true
 */
var isNotSet = (0, _ramda.complement)(_isSet["default"]);
var _default = isNotSet;
exports["default"] = _default;
},{"./isSet":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSet.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotString.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isString = _interopRequireDefault(require("./isString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is complement of `String`.
 *
 * @func isNotString
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.4.0|v0.4.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isString|isString}
 * @example
 *
 * RA.isNotString('abc'); //=> false
 * RA.isNotString(1); //=> true
 */
var isNotString = (0, _ramda.complement)(_isString["default"]);
var _default = isNotString;
exports["default"] = _default;
},{"./isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isString.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotUndefined.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isUndefined = _interopRequireDefault(require("./isUndefined"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is complement `undefined`.
 *
 * @func isNotUndefined
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.0.1|v0.0.1}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isUndefined|isUndefined}
 * @example
 *
 * RA.isNotUndefined(1); //=> true
 * RA.isNotUndefined(undefined); //=> false
 * RA.isNotUndefined(null); //=> true
 */
var isNotUndefined = (0, _ramda.complement)(_isUndefined["default"]);
var _default = isNotUndefined;
exports["default"] = _default;
},{"./isUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isUndefined.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotValidDate.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isValidDate = _interopRequireDefault(require("./isValidDate"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is complement of valid `Date` object.
 *
 * @func isNotValidDate
 * @aliases isInvalidDate
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.8.0|v1.8.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isValidDate|isValidDate}, {@link RA.isDate|isDate}, {@link RA.isNotDate|isNotDate}
 * @example
 *
 * RA.isNotValidDate(new Date()); //=> false
 * RA.isNotValidDate(new Date('a')); //=> true
 */
var isNotValidDate = (0, _ramda.complement)(_isValidDate["default"]);
var _default = isNotValidDate;
exports["default"] = _default;
},{"./isValidDate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isValidDate.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotValidNumber.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isValidNumber = _interopRequireDefault(require("./isValidNumber"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is not a valid `Number`. A valid `Number` is a number that is not `NaN`,
 * `Infinity` or `-Infinity`.
 *
 * @func isNotValidNumber
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.2.0|v2.2.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isValidNumber|isValidNumber}
 * @example
 *
 * RA.isNotValidNumber(1); //=> false
 * RA.isNotValidNumber(''); //=> true
 * RA.isNotValidNumber(NaN); //=> true
 * RA.isNotValidNumber(Infinity); //=> true
 * RA.isNotValidNumber(-Infinity); //=> true
 */
var isNotValidNumber = (0, _ramda.complement)(_isValidNumber["default"]);
var _default = isNotValidNumber;
exports["default"] = _default;
},{"./isValidNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isValidNumber.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNull.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if input value is `null`.
 *
 * @func isNull
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.1.0|v0.1.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotNull|isNotNull}
 * @example
 *
 * RA.isNull(1); //=> false
 * RA.isNull(undefined); //=> false
 * RA.isNull(null); //=> true
 */
var isNull = (0, _ramda.equals)(null);
var _default = isNull;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNumber.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if value is a `Number` primitive or object.
 *
 * @func isNumber
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.6.0|v0.6.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotNumber|isNotNumber}
 * @example
 *
 * RA.isNumber(5); // => true
 * RA.isNumber(Number.MAX_VALUE); // => true
 * RA.isNumber(-Infinity); // => true
 * RA.isNumber(NaN); // => true
 * RA.isNumber('5'); // => false
 */
var isNumber = (0, _ramda.curryN)(1, (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('Number')));
var _default = isNumber;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isObj.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNotNull = _interopRequireDefault(require("./isNotNull"));

var _isFunction = _interopRequireDefault(require("./isFunction"));

var _isOfTypeObject = _interopRequireDefault(require("./internal/isOfTypeObject"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/* eslint-disable max-len */

/**
 * Checks if input value is language type of `Object`.
 *
 * @func isObj
 * @aliases isObject
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotObj|isNotObj}, {@link RA.isObjLike|isObjLike}, {@link RA.isPlainObj|isPlainObj}
 * @example
 *
 * RA.isObj({}); //=> true
 * RA.isObj([]); //=> true
 * RA.isObj(() => {}); //=> true
 * RA.isObj(null); //=> false
 * RA.isObj(undefined); //=> false
 */

/* eslint-enable max-len */
var isObj = (0, _ramda.curryN)(1, (0, _ramda.both)(_isNotNull["default"], (0, _ramda.either)(_isOfTypeObject["default"], _isFunction["default"])));
var _default = isObj;
exports["default"] = _default;
},{"./internal/isOfTypeObject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/isOfTypeObject.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","./isNotNull":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNull.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isObjLike.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNotNull = _interopRequireDefault(require("./isNotNull"));

var _isOfTypeObject = _interopRequireDefault(require("./internal/isOfTypeObject"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/* eslint-disable max-len */

/**
 * Checks if value is object-like. A value is object-like if it's not null and has a typeof result of "object".
 *
 * @func isObjLike
 * @aliases isObjectLike
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotObjLike|isNotObjLike}, {@link RA.isObj|isObj}, {@link RA.isPlainObj|isPlainObj}
 * @example
 *
 * RA.isObjLike({}); //=> true
 * RA.isObjLike([]); //=> true
 * RA.isObjLike(() => {}); //=> false
 * RA.isObjLike(null); //=> false
 * RA.isObjLike(undefined); //=> false
 */

/* eslint-enable max-len */
var isObjLike = (0, _ramda.curryN)(1, (0, _ramda.both)(_isNotNull["default"], _isOfTypeObject["default"]));
var _default = isObjLike;
exports["default"] = _default;
},{"./internal/isOfTypeObject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/isOfTypeObject.js","./isNotNull":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNull.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isOdd.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isInteger = _interopRequireDefault(require("./isInteger"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is odd integer number.
 * An odd number is an integer which is not a multiple DIVISIBLE of two.
 *
 * @func isOdd
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.18.0|v1.18.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isEven|isEven}
 * @example
 *
 * RA.isOdd(1); // => true
 * RA.isOdd(-Infinity); // => false
 * RA.isOdd(4); // => false
 * RA.isOdd(3); // => true
 */
var isOdd = (0, _ramda.curryN)(1, (0, _ramda.both)(_isInteger["default"], (0, _ramda.pipe)((0, _ramda.flip)(_ramda.modulo)(2), (0, _ramda.complement)(_ramda.equals)(0))));
var _default = isOdd;
exports["default"] = _default;
},{"./isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPair.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isArray = _interopRequireDefault(require("./isArray"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is a pair.
 *
 * @func isPair
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.19.0|v1.19.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link http://ramdajs.com/docs/#pair|R.pair}, {@link RA.isNotPair|isNotPair}
 * @example
 *
 * RA.isPair([]); // => false
 * RA.isPair([0]); // => false
 * RA.isPair([0, 1]); // => true
 * RA.isPair([0, 1, 2]); // => false
 * RA.isPair({ 0: 0, 1: 1 }); // => false
 * RA.isPair({ foo: 0, bar: 0 }); // => false
 */
var isPair = (0, _ramda.curryN)(1, (0, _ramda.both)(_isArray["default"], (0, _ramda.pipe)(_ramda.length, (0, _ramda.equals)(2))));
var _default = isPair;
exports["default"] = _default;
},{"./isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArray.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPlainObj.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNull = _interopRequireDefault(require("./isNull"));

var _isObjLike = _interopRequireDefault(require("./isObjLike"));

var _isFunction = _interopRequireDefault(require("./isFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var isObject = (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('Object'));
var isObjectConstructor = (0, _ramda.pipe)(_ramda.toString, (0, _ramda.equals)((0, _ramda.toString)(Object)));
var hasObjectConstructor = (0, _ramda.pathSatisfies)((0, _ramda.both)(_isFunction["default"], isObjectConstructor), ['constructor']);
/* eslint-disable max-len */

/**
 * Check to see if an object is a plain object (created using `{}`, `new Object()` or `Object.create(null)`).
 *
 * @func isPlainObj
 * @aliases isPlainObject
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.5.0|v0.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotPlainObj|isNotPlainObj}, {@link RA.isObjLike|isObjLike}, {@link RA.isObj|isObj}
 * @example
 *
 * class Bar {
 *   constructor() {
 *     this.prop = 'value';
 *   }
 * }
 *
 * RA.isPlainObj(new Bar()); //=> false
 * RA.isPlainObj({ prop: 'value' }); //=> true
 * RA.isPlainObj(['a', 'b', 'c']); //=> false
 * RA.isPlainObj(Object.create(null); //=> true
 * RA.isPlainObj(new Object()); //=> true
 */

/* eslint-enable max-len */

var isPlainObj = (0, _ramda.curryN)(1, function (val) {
  if (!(0, _isObjLike["default"])(val) || !isObject(val)) {
    return false;
  }

  var proto = Object.getPrototypeOf(val);

  if ((0, _isNull["default"])(proto)) {
    return true;
  }

  return hasObjectConstructor(proto);
});
var _default = isPlainObj;
exports["default"] = _default;
},{"./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","./isNull":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNull.js","./isObjLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isObjLike.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPositive.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNumber = _interopRequireDefault(require("./isNumber"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is a positive `Number` primitive or object. Zero is not considered positive.
 *
 * @func isPositive
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.15.0|v1.15.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNegative|isNegative}
 * @example
 *
 * RA.isPositive(1); // => true
 * RA.isPositive(Number.MAX_VALUE); // => true
 * RA.isPositive(-Infinity); // => false
 * RA.isPositive(NaN); // => false
 * RA.isPositive('5'); // => false
 */
var isPositive = (0, _ramda.both)(_isNumber["default"], (0, _ramda.lt)(0));
var _default = isPositive;
exports["default"] = _default;
},{"./isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNumber.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPositiveZero.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if value is a positive zero (+0).
 *
 * @func isPositiveZero
 * @memberof RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNegativeZero|isNegativeZero}
 * @example
 *
 * RA.isPositiveZero(+0); //=> true
 * RA.isPositiveZero(0); //=> true
 * RA.isPositiveZero(-0); //=> false
 * RA.isPositiveZero(null); //=> false
 */
var isPositiveZero = (0, _ramda.identical)(+0);
var _default = isPositiveZero;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPrimitive.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNotObj = _interopRequireDefault(require("./isNotObj"));

var _isString = _interopRequireDefault(require("./isString"));

var _isNumber = _interopRequireDefault(require("./isNumber"));

var _isBigInt = _interopRequireDefault(require("./isBigInt"));

var _isBoolean = _interopRequireDefault(require("./isBoolean"));

var _isUndefined = _interopRequireDefault(require("./isUndefined"));

var _isNull = _interopRequireDefault(require("./isNull"));

var _isSymbol = _interopRequireDefault(require("./isSymbol"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is a primitive data type. There are 6 primitive data types: `string`, `number`, `bigint`, `boolean`, `undefined`, `symbol` and a special case of `null`.
 * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Primitive_values
 * for definition of what sub-types comprise a primitive.
 *
 * @func isPrimitive
 * @category Type
 * @sig * -> Boolean
 * @since {@link https://char0n.github.io/ramda-adjunct/2.32.0|v2.32.0}
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotPrimitive|isNotPrimitive}, {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#primitive_values|MDN Primitive values}, {@link https://developer.mozilla.org/en-US/docs/Glossary/Primitive|MDN Primitive}
 * @example
 *
 * RA.isPrimitive("string"); //=> true
 * RA.isPrimitive(1); //=> true
 * RA.isPrimitive(new String("string")); //=> false
 * RA.isPrimitive(new Number(1)); //=> false
 */
var isPrimitive = (0, _ramda.both)(_isNotObj["default"], (0, _ramda.anyPass)([_isString["default"], _isNumber["default"], _isBigInt["default"], _isBoolean["default"], _isUndefined["default"], _isNull["default"], _isSymbol["default"]]));
var _default = isPrimitive;
exports["default"] = _default;
},{"./isBigInt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isBigInt.js","./isBoolean":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isBoolean.js","./isNotObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotObj.js","./isNull":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNull.js","./isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNumber.js","./isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isString.js","./isSymbol":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSymbol.js","./isUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isUndefined.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPromise.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isObj = _interopRequireDefault(require("./isObj"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is a native `Promise`.
 * The Promise object represents the eventual completion (or failure)
 * of an asynchronous operation, and its resulting value.
 *
 * @func isPromise
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.1.0|v2.1.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link https://promisesaplus.com/|Promises/A+}, {@link RA.isThenable|isThenable}
 * @example
 *
 * RA.isPromise(null); // => false
 * RA.isPromise(undefined); // => false
 * RA.isPromise([]); // => false
 * RA.isPromise(Promise.resolve()); // => true
 * RA.isPromise(Promise.reject()); // => true
 * RA.isPromise({ then: () => 1 }); // => false
 */
var isPromise = (0, _ramda.curryN)(1, (0, _ramda.both)(_isObj["default"], (0, _ramda.pipe)(_ramda.toString, (0, _ramda.equals)('[object Promise]'))));
var _default = isPromise;
exports["default"] = _default;
},{"./isObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isObj.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isPrototypeOf.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _invokeArgs = _interopRequireDefault(require("./invokeArgs"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if an object exists in another object's prototype chain.
 *
 * @func isPrototypeOf
 * @category Object
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.31.0|v2.31.0}
 * @sig * -> Boolean
 * @param {Object} type The prototype that we're searching for
 * @param {Object} object The object whose prototype chain will be searched
 * @return {boolean}
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf|Object.prorotype.isPrototypeOf}
 * @example
 * function Foo() {}
 * function Bar() {}
 * function Baz() {}
 *
 * Bar.prototype = Object.create(Foo.prototype);
 * Baz.prototype = Object.create(Bar.prototype);
 *
 * const baz = new Baz();
 *
 * RA.isPrototypeOf(Baz, baz); // => true
 * RA.isPrototypeOf(Bar, baz); // => true
 * RA.isPrototypeOf(Foo, baz); // => true
 * RA.isPrototypeOf(Object, baz); // => true
 */
var isPrototypeOf = (0, _ramda.curry)(function (type, object) {
  return Boolean((0, _invokeArgs["default"])(['prototype', 'isPrototypeOf'], [object], type));
});
var _default = isPrototypeOf;
exports["default"] = _default;
},{"./invokeArgs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/invokeArgs.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isRegExp.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if value is `RegExp` object.
 *
 * @func isRegExp
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.5.0|v2.5.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotRegExp|isNotRegExp}
 * @example
 *
 * RA.isRegExp(new RegExp()); //=> true
 * RA.isRegExp(/(?:)/); //=> true
 * RA.isRegExp(1); //=> false
 */
var isRegExp = (0, _ramda.curryN)(1, (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('RegExp')));
var _default = isRegExp;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSafeInteger.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.isSafeIntegerPonyfill = exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

var _Number = _interopRequireDefault(require("./internal/ponyfills/Number.isSafeInteger"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var isSafeIntegerPonyfill = (0, _ramda.curryN)(1, _Number["default"]);
/**
 * Checks whether the passed value is a safe `integer`.
 *
 * @func isSafeInteger
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @example
 *
 * RA.isSafeInteger(3); //=> true
 * RA.isSafeInteger(Math.pow(2, 53)) //=> false
 * RA.isSafeInteger(Math.pow(2, 53) - 1); //=> true
 * RA.isSafeInteger(NaN); //=> false
 * RA.isSafeInteger(Infinity); //=> false
 * RA.isSafeInteger('3') //=> false
 * RA.isSafeInteger(3.1); //=> false
 * RA.isSafeInteger(3.0); //=> true
 * RA.isSafeInteger('string'); //=> false
 * RA.isSafeInteger(null); //=> false
 * RA.isSafeInteger(undefined); //=> false
 * RA.isSafeInteger({}); //=> false
 * RA.isSafeInteger(() => { }); //=> false
 * RA.isSafeInteger(true); //=> false
 */

exports.isSafeIntegerPonyfill = isSafeIntegerPonyfill;
var isSafeInteger = (0, _isFunction["default"])(Number.isSafeInteger) ? (0, _ramda.curryN)(1, (0, _ramda.bind)(Number.isSafeInteger, Number)) : isSafeIntegerPonyfill;
var _default = isSafeInteger;
exports["default"] = _default;
},{"./internal/ponyfills/Number.isSafeInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Number.isSafeInteger.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSentinelValue.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isInteger = _interopRequireDefault(require("./isInteger32"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks whether the passed value is {@link https://github.com/getify/You-Dont-Know-JS/blob/9959fc904d584bbf0b02cf41c192f74ff4238581/types-grammar/ch4.md#the-curious-case-of-the-|a sentinel value}.
 *
 * @func isSentinelValue
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.33.0|v2.33.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @example
 *
 * RA.isSentinelValue(-1); //=> true
 *
 * RA.isSentinelValue('-1'); //=> false
 * RA.isSentinelValue(1); //=> false
 * RA.isSentinelValue([-1]); //=> false
 */
// eslint-disable-next-line no-bitwise
var isSentinelValue = (0, _ramda.curryN)(1, function (val) {
  return (0, _isInteger["default"])(val) && ~val === 0;
});
var _default = isSentinelValue;
exports["default"] = _default;
},{"./isInteger32":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger32.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSet.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Predicate for determining if a provided value is an instance of a Set.
 *
 * @func isSet
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isMap|isMap}}
 * @example
 *
 * RA.isSet(new Map()); //=> false
 * RA.isSet(new Set()); //=> true
 * RA.isSet(new Set([1,2]); //=> true
 * RA.isSet(new Object()); //=> false
 */
var isSet = (0, _ramda.curryN)(1, (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('Set')));
var _default = isSet;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSparseArray.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isArray = _interopRequireDefault(require("./isArray"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is a sparse Array.
 * An array with at least one "empty slot" in it is often called a "sparse array."
 * Empty slot doesn't mean that the slot contains `null` or `undefined` values,
 * but rather that the slots don't exist.
 *
 * @func isSparseArray
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.20.0|v2.20.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} list The list to test
 * @return {boolean}
 * @see {@link https://github.com/getify/You-Dont-Know-JS/blob/f0d591b6502c080b92e18fc470432af8144db610/types%20%26%20grammar/ch3.md#array|Sparse Arrays}, {@link RA.isArray|isArray}
 * @example
 *
 * RA.isSparseArray(new Array(3)); // => true
 * RA.isSparseArray([1,,3]); // => true
 *
 * const list = [1, 2, 3];
 * delete list[1];
 * RA.isSparseArray(list); // => true
 *
 * RA.isSparseArray([1, 2, 3]); // => false
 */
var isSparseArray = (0, _ramda.both)(_isArray["default"], (0, _ramda.converge)((0, _ramda.complement)(_ramda.identical), [(0, _ramda.pipe)(_ramda.values, _ramda.length), _ramda.length]));
var _default = isSparseArray;
exports["default"] = _default;
},{"./isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isArray.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isString.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if input value is `String`.
 *
 * @func isString
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.4.0|v0.4.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotString|isNotString}
 * @example
 *
 * RA.isString('abc'); //=> true
 * RA.isString(1); //=> false
 */
var isString = (0, _ramda.curryN)(1, (0, _ramda.pipe)(_ramda.type, (0, _ramda.identical)('String')));
var _default = isString;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isSymbol.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }

/**
 * Checks if input value is a Symbol.
 *
 * @func isSymbol
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol|MDN Symbol}
 * @example
 *
 * RA.isSymbol(Symbol('1')); //=> true
 * RA.isSymbol(Symbol(1)); //=> true
 * RA.isSymbol('string'); //=> false
 * RA.isSymbol(undefined); //=> false
 * RA.isSymbol(null); //=> false
 */
var isSymbol = (0, _ramda.curryN)(1, function (val) {
  return _typeof(val) === 'symbol' || _typeof(val) === 'object' && (0, _ramda.type)(val) === 'Symbol';
});
var _default = isSymbol;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isThenable.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is a `thenable`.
 * `thenable` is an object or function that defines a `then` method.
 *
 * @func isThenable
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.1.0|v2.1.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isPromise|isPromise}
 * @example
 *
 * RA.isThenable(null); // => false
 * RA.isThenable(undefined); // => false
 * RA.isThenable([]); // => false
 * RA.isThenable(Promise.resolve()); // => true
 * RA.isThenable(Promise.reject()); // => true
 * RA.isThenable({ then: () => 1 }); // => true
 */
var isThenable = (0, _ramda.pathSatisfies)(_isFunction["default"], ['then']);
var _default = isThenable;
exports["default"] = _default;
},{"./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isTrue.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Checks if input value is the Boolean primitive `true`. Will return false for Boolean objects
 * created using the `Boolean` function as a constructor.
 *
 * @func isTrue
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.6.0|v2.6.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isFalse|isFalse}, {@link RA.isTruthy|isTruthy}, {@link RA.isFalsy|isFalsy}
 * @example
 *
 * RA.isTrue(true); // => true
 * RA.isTrue(Boolean(true)); // => true
 * RA.isTrue(false); // => false
 * RA.isTrue(1); // => false
 * RA.isTrue('true'); // => false
 * RA.isTrue(new Boolean(true)); // => false
 */
var isTrue = (0, _ramda.identical)(true);
var _default = isTrue;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isTruthy.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * In JavaScript, a `truthy` value is a value that is considered true
 * when evaluated in a Boolean context. All values are truthy unless
 * they are defined as falsy (i.e., except for `false`, `0`, `""`, `null`, `undefined`, and `NaN`).
 *
 * @func isTruthy
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.2.0|v2.2.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link https://developer.mozilla.org/en-US/docs/Glossary/Truthy|truthy}, {@link RA.isFalsy|isFalsy}
 * @example
 *
 * RA.isTruthy({}); // => true
 * RA.isTruthy([]); // => true
 * RA.isTruthy(42); // => true
 * RA.isTruthy(3.14); // => true
 * RA.isTruthy('foo'); // => true
 * RA.isTruthy(new Date()); // => true
 * RA.isTruthy(Infinity); // => true
 */
var isTruthy = (0, _ramda.curryN)(1, Boolean);
var _default = isTruthy;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isUndefined.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _stubUndefined = _interopRequireDefault(require("./stubUndefined"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if input value is `undefined`.
 *
 * @func isUndefined
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/0.0.1|v0.0.1}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotUndefined|isNotUndefined}
 * @example
 *
 * RA.isUndefined(1); //=> false
 * RA.isUndefined(undefined); //=> true
 * RA.isUndefined(null); //=> false
 */
var isUndefined = (0, _ramda.equals)((0, _stubUndefined["default"])());
var _default = isUndefined;
exports["default"] = _default;
},{"./stubUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubUndefined.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isValidDate.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isDate = _interopRequireDefault(require("./isDate"));

var _isNotNaN = _interopRequireDefault(require("./isNotNaN"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/* eslint-disable max-len */

/**
 * Checks if value is valid `Date` object.
 *
 * @func isValidDate
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.8.0|v1.8.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isDate|isDate}, {@link RA.isNotDate|isNotDate}, {@link RA.isNotValidDate|isNotValidDate}
 * @example
 *
 * RA.isValidDate(new Date()); //=> true
 * RA.isValidDate(new Date('a')); //=> false
 */

/* eslint-enable max-len */
var isValidDate = (0, _ramda.curryN)(1, (0, _ramda.both)(_isDate["default"], (0, _ramda.pipe)((0, _ramda.invoker)(0, 'getTime'), _isNotNaN["default"])));
var _default = isValidDate;
exports["default"] = _default;
},{"./isDate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isDate.js","./isNotNaN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotNaN.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isValidNumber.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isFloat = _interopRequireDefault(require("./isFloat"));

var _isInteger = _interopRequireDefault(require("./isInteger"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Checks if value is a valid `Number`. A valid `Number` is a number that is not `NaN`, `Infinity`
 * or `-Infinity`.
 *
 * @func isValidNumber
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.2.0|v2.2.0}
 * @category Type
 * @sig * -> Boolean
 * @param {*} val The value to test
 * @return {boolean}
 * @see {@link RA.isNotValidNumber|isNotValidNumber}
 * @example
 *
 * RA.isValidNumber(1); //=> true
 * RA.isValidNumber(''); //=> false
 * RA.isValidNumber(NaN); //=> false
 * RA.isValidNumber(Infinity); //=> false
 * RA.isValidNumber(-Infinity); //=> false
 */
var isValidNumber = (0, _ramda.curryN)(1, (0, _ramda.either)(_isInteger["default"], _isFloat["default"]));
var _default = isValidNumber;
exports["default"] = _default;
},{"./isFloat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFloat.js","./isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isInteger.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lastP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _allP = _interopRequireDefault(require("./allP"));

var _lengthEq = _interopRequireDefault(require("./lengthEq"));

var _lengthGte = _interopRequireDefault(require("./lengthGte"));

var _rejectP = _interopRequireDefault(require("./rejectP"));

var _resolveP = _interopRequireDefault(require("./resolveP"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

/**
 * Returns a promise that is fulfilled by the last given promise to be fulfilled,
 * or rejected with an array of rejection reasons if all of the given promises are rejected.
 *
 * @func lastP
 * @memberOf RA
 * @category Function
 * @since {@link https://char0n.github.io/ramda-adjunct/2.23.0|v2.23.0}
 * @sig [Promise a] -> Promise a
 * @param {Iterable.<*>} iterable An iterable object such as an Array or String
 * @return {Promise} A promise that is fulfilled by the last given promise to be fulfilled, or rejected with an array of rejection reasons if all of the given promises are rejected.
 * @see {@link RA.anyP|anyP}
 * @example
 *
 * const delayP = timeout => new Promise(resolve => setTimeout(() => resolve(timeout), timeout));
 * delayP.reject = timeout => new Promise((resolve, reject) => setTimeout(() => reject(timeout), timeout));
 * RA.lastP([
 *   1,
 *   delayP(10),
 *   delayP(100),
 *   delayP.reject(1000),
 * ]); //=> Promise(100)
 */
var lastP = (0, _ramda.curryN)(1, function (iterable) {
  var fulfilled = [];
  var rejected = [];
  var onFulfill = (0, _ramda.bind)(fulfilled.push, fulfilled);
  var onReject = (0, _ramda.bind)(rejected.push, rejected);
  var listOfPromises = (0, _ramda.map)(function (p) {
    return (0, _resolveP["default"])(p).then(onFulfill)["catch"](onReject);
  }, _toConsumableArray(iterable));
  return (0, _allP["default"])(listOfPromises).then(function () {
    if ((0, _lengthEq["default"])(0, fulfilled) && (0, _lengthEq["default"])(0, rejected)) {
      return undefined;
    }

    if ((0, _lengthGte["default"])(1, fulfilled)) {
      return (0, _ramda.last)(fulfilled);
    }

    return (0, _rejectP["default"])(rejected);
  });
});
var _default = lastP;
exports["default"] = _default;
},{"./allP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allP.js","./lengthEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthEq.js","./lengthGte":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthGte.js","./rejectP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/rejectP.js","./resolveP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/resolveP.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthEq.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _compareLength = _interopRequireDefault(require("./internal/compareLength"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns `true` if the supplied list or string has a length equal to `valueLength`.
 *
 * @func lengthEq
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.8.0|v2.8.0}
 * @category List
 * @sig Number -> [*] -> Boolean
 * @param {number} valueLength The length of the list or string
 * @param {Array|string} value The list or string
 * @return {boolean}
 * @see {@link RA.lengthNotEq|lengthNotEq}, {@link RA.lengthLt|lengthLt}, {@link RA.lengthGt|lengthGt}, {@link RA.lengthLte|lengthLte}, {@link RA.lengthGte|lengthGte},, {@link http://ramdajs.com/docs/#equals|equals}, {@link http://ramdajs.com/docs/#length|length}
 * @example
 *
 * RA.lengthEq(3, [1,2,3]); //=> true
 * RA.lengthEq(3, [1,2,3,4]); //=> false
 */
var lengthEq = (0, _compareLength["default"])(_ramda.equals);
var _default = lengthEq;
exports["default"] = _default;
},{"./internal/compareLength":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/compareLength.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthGt.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _compareLength = _interopRequireDefault(require("./internal/compareLength"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns `true` if the supplied list or string has a length greater than `valueLength`.
 *
 * @func lengthGt
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.8.0|v2.8.0}
 * @category List
 * @sig Number -> [*] -> Boolean
 * @param {number} valueLength The length of the list or string
 * @param {Array|string} value The list or string
 * @return {boolean}
 * @see {@link RA.lengthEq|lengthEq}, {@link RA.lengthNotEq|lengthNotEq}, {@link RA.lengthLt|lengthLt}, {@link RA.lengthLte|lengthLte}, {@link RA.lengthGte|lengthGte}, {@link http://ramdajs.com/docs/#gt|gt},  {@link http://ramdajs.com/docs/#length|length}
 * @example
 *
 * RA.lengthGt(3, [1,2,3,4]); //=> true
 * RA.lengthGt(3, [1,2,3]); //=> false
 */
var lengthGt = (0, _compareLength["default"])((0, _ramda.flip)(_ramda.gt));
var _default = lengthGt;
exports["default"] = _default;
},{"./internal/compareLength":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/compareLength.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthGte.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _compareLength = _interopRequireDefault(require("./internal/compareLength"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns `true` if the supplied list or string has a length greater than or equal to
 * `valueLength`.
 *
 * @func lengthGte
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.8.0|v2.8.0}
 * @category List
 * @sig Number -> [*] -> Boolean
 * @param {number} valueLength The length of the list or string
 * @param {Array|string} value The list or string
 * @return {boolean}
 * @see {@link RA.lengthEq|lengthEq}, {@link RA.lengthNotEq|lengthNotEq}, {@link RA.lengthLt|lengthLt}, {@link RA.lengthGt|lengthGt}, {@link RA.lengthLte|lengthLte}, {@link http://ramdajs.com/docs/#gte|gte}, {@link http://ramdajs.com/docs/#length|length}
 * @example
 *
 * RA.lengthGte(3, [1,2,3,4]); //=> true
 * RA.lengthGte(3, [1,2,3]); //=> true
 * RA.lengthGte(3, [1,2]); //=> false
 */
var lengthGte = (0, _compareLength["default"])((0, _ramda.flip)(_ramda.gte));
var _default = lengthGte;
exports["default"] = _default;
},{"./internal/compareLength":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/compareLength.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthLt.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _compareLength = _interopRequireDefault(require("./internal/compareLength"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns `true` if the supplied list or string has a length less than `valueLength`.
 *
 * @func lengthLt
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.8.0|v2.8.0}
 * @category List
 * @sig Number -> [*] -> Boolean
 * @param {number} valueLength The length of the list or string
 * @param {Array|string} value The list or string
 * @return {boolean}
 * @see {@link RA.lengthEq|lengthEq}, {@link RA.lengthNotEq|lengthNotEq}, {@link RA.lengthGt|lengthGt}, {@link RA.lengthLte|lengthLte}, {@link RA.lengthGte|lengthGte}, {@link http://ramdajs.com/docs/#lt|lt}, {@link http://ramdajs.com/docs/#length|length}
 * @example
 *
 * RA.lengthLt(3, [1,2]); //=> true
 * RA.lengthLt(3, [1,2,3]); //=> false
 */
var lengthLt = (0, _compareLength["default"])((0, _ramda.flip)(_ramda.lt));
var _default = lengthLt;
exports["default"] = _default;
},{"./internal/compareLength":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/compareLength.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthLte.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _compareLength = _interopRequireDefault(require("./internal/compareLength"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns `true` if the supplied list or string has a length less than or equal to `valueLength`.
 *
 * @func lengthLte
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.8.0|v2.8.0}
 * @category List
 * @sig Number -> [*] -> Boolean
 * @param {number} valueLength The length of the list or string
 * @param {Array|string} value The list or string
 * @return {boolean}
 * @see {@link RA.lengthEq|lengthEq}, {@link RA.lengthNotEq|lengthNotEq}, {@link RA.lengthLt|lengthLt}, {@link RA.lengthGt|lengthGt}, {@link RA.lengthGte|lengthGte}, {@link http://ramdajs.com/docs/#lte|lte}, {@link http://ramdajs.com/docs/#length|length}
 * @example
 *
 * RA.lengthLte(3, [1,2]); //=> true
 * RA.lengthLte(3, [1,2,3]); //=> true
 * RA.lengthLte(3, [1,2,3,4]); //=> false
 */
var lengthLte = (0, _compareLength["default"])((0, _ramda.flip)(_ramda.lte));
var _default = lengthLte;
exports["default"] = _default;
},{"./internal/compareLength":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/compareLength.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthNotEq.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _compareLength = _interopRequireDefault(require("./internal/compareLength"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns `true` if the supplied list or string has a length not equal to `valueLength`.
 *
 * @func lengthNotEq
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.8.0|v2.8.0}
 * @category List
 * @sig Number -> [*] -> Boolean
 * @param {number} valueLength The length of the list or string
 * @param {Array|string} value The list or string
 * @return {boolean}
 * @see {@link RA.lengthEq|lengthEq}, {@link RA.lengthLt|lengthLt}, {@link RA.lengthGt|lengthGt}, {@link RA.lengthLte|lengthLte}, {@link RA.lengthGte|lengthGte}, {@link http://ramdajs.com/docs/#equals|equals}, {@link http://ramdajs.com/docs/#length|length}
 * @example
 *
 * RA.lengthNotEq(3, [1,2,3,4]); //=> true
 * RA.lengthNotEq(3, [1,2,3]); //=> false
 */
var lengthNotEq = (0, _compareLength["default"])((0, _ramda.complement)(_ramda.equals));
var _default = lengthNotEq;
exports["default"] = _default;
},{"./internal/compareLength":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/compareLength.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensEq.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns `true` if data structure focused by the given lens equals provided value.
 *
 * @func lensEq
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.13.0|1.13.0}
 * @category Relation
 * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig  Lens s a -> b -> s -> Boolean
 * @see {@link RA.lensNotEq|lensNotEq}
 * @param {function} lens Van Laarhoven lens
 * @param {*} value The value to compare the focused data structure with
 * @param {*} data The data structure
 * @return {boolean} `true` if the focused data structure equals value, `false` otherwise
 *
 * @example
 *
 * RA.lensEq(R.lensIndex(0), 1, [0, 1, 2]); // => false
 * RA.lensEq(R.lensIndex(1), 1, [0, 1, 2]); // => true
 * RA.lensEq(R.lensPath(['a', 'b']), 'foo', { a: { b: 'foo' } }) // => true
 */
var lensEq = (0, _ramda.curryN)(3, function (lens, val, data) {
  return (0, _ramda.pipe)((0, _ramda.view)(lens), (0, _ramda.equals)(val))(data);
});
var _default = lensEq;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensIso.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

// This implementation was highly inspired by the implementations
// in ramda-lens library.
//
// https://github.com/ramda/ramda-lens
// isomorphic :: ((a -> b), (b -> a)) -> Isomorphism
//     Isomorphism = x -> y
var isomorphic = function isomorphic(to, from) {
  var isomorphism = function isomorphism(x) {
    return to(x);
  };

  isomorphism.from = from;
  return isomorphism;
}; // isomorphisms :: ((a -> b), (b -> a)) -> (a -> b)


var isomorphisms = function isomorphisms(to, from) {
  return isomorphic((0, _ramda.curry)(function (toFunctorFn, target) {
    return (0, _ramda.map)(from, toFunctorFn(to(target)));
  }), (0, _ramda.curry)(function (toFunctorFn, target) {
    return (0, _ramda.map)(to, toFunctorFn(from(target)));
  }));
}; // from :: Isomorphism -> a -> b


var from = (0, _ramda.curry)(function (isomorphism, x) {
  return isomorphism.from(x);
});
/**
 * Defines an isomorphism that will work like a lens. It takes two functions.
 * The function that converts and the function that recovers.
 *
 * @func lensIso
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.19.0|1.19.0}
 * @category Relation
 * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig (s -> a) -> (a -> s) -> Lens s a
 * @param {!function} to The function that converts
 * @param {!function} from The function that recovers
 * @return {!function} The isomorphic lens
 * @see {@link http://ramdajs.com/docs/#lens|R.lens}
 *
 * @example
 *
 * const lensJSON = RA.lensIso(JSON.parse, JSON.stringify);
 *
 * R.over(lensJSON, assoc('b', 2), '{"a":1}'); //=> '{"a":1,"b":2}'
 * R.over(RA.lensIso.from(lensJSON), R.replace('}', ',"b":2}'), { a: 1 }); // => { a: 1, b: 2 }
 */

var lensIso = (0, _ramda.curry)(isomorphisms);
lensIso.from = from;
var _default = lensIso;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensNotEq.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _lensEq = _interopRequireDefault(require("./lensEq"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns `true` if data structure focused by the given lens doesn't equal provided value.
 *
 * @func lensNotEq
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.13.0|1.13.0}
 * @category Relation
 * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Lens s a -> b -> s -> Boolean
 * @see {@link RA.lensEq|lensEq}
 * @param {function} lens Van Laarhoven lens
 * @param {*} value The value to compare the focused data structure with
 * @param {*} data The data structure
 * @return {boolean} `false` if the focused data structure equals value, `true` otherwise
 *
 * @example
 *
 * RA.lensNotEq(R.lensIndex(0), 1, [0, 1, 2]); // => true
 * RA.lensNotEq(R.lensIndex(1), 1, [0, 1, 2]); // => false
 * RA.lensNotEq(R.lensPath(['a', 'b']), 'foo', { a: { b: 'foo' } }) // => false
 */
var lensNotEq = (0, _ramda.complement)(_lensEq["default"]);
var _default = lensNotEq;
exports["default"] = _default;
},{"./lensEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensEq.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensNotSatisfy.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _lensSatisfies = _interopRequireDefault(require("./lensSatisfies"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns `true` if data structure focused by the given lens doesn't satisfy the predicate.
 * Note that the predicate is expected to return boolean value.
 *
 * @func lensNotSatisfy
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.13.0|1.13.0}
 * @category Relation
 * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig  Boolean b => (a -> b) -> Lens s a -> s -> b
 * @see {@link RA.lensSatisfies|lensSatisfies}
 * @param {Function} predicate The predicate function
 * @param {Function} lens Van Laarhoven lens
 * @param {*} data The data structure
 * @return {boolean} `false` if the focused data structure satisfies the predicate, `true` otherwise
 *
 * @example
 *
 * RA.lensNotSatisfy(RA.isTrue, R.lensIndex(0), [false, true, 1]); // => true
 * RA.lensNotSatisfy(RA.isTrue, R.lensIndex(1), [false, true, 1]); // => false
 * RA.lensNotSatisfy(RA.isTrue, R.lensIndex(2), [false, true, 1]); // => true
 * RA.lensNotSatisfy(R.identity, R.lensProp('x'), { x: 1 }); // => true
 */
var lensNotSatisfy = (0, _ramda.complement)(_lensSatisfies["default"]);
var _default = lensNotSatisfy;
exports["default"] = _default;
},{"./lensSatisfies":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensSatisfies.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensSatisfies.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isTrue = _interopRequireDefault(require("./isTrue"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns `true` if data structure focused by the given lens satisfies the predicate.
 * Note that the predicate is expected to return boolean value and will be evaluated
 * as `false` unless the predicate returns `true`.
 *
 * @func lensSatisfies
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.13.0|1.13.0}
 * @category Relation
 * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig  Boolean b => (a -> b) -> Lens s a -> s -> b
 * @see {@link RA.lensNotSatisfy|lensNotSatisfy}
 * @param {Function} predicate The predicate function
 * @param {Function} lens Van Laarhoven lens
 * @param {*} data The data structure
 * @return {boolean} `true` if the focused data structure satisfies the predicate, `false` otherwise
 *
 * @example
 *
 * RA.lensSatisfies(RA.isTrue, R.lensIndex(0), [false, true, 1]); // => false
 * RA.lensSatisfies(RA.isTrue, R.lensIndex(1), [false, true, 1]); // => true
 * RA.lensSatisfies(RA.isTrue, R.lensIndex(2), [false, true, 1]); // => false
 * RA.lensSatisfies(R.identity, R.lensProp('x'), { x: 1 }); // => false
 */
var lensSatisfies = (0, _ramda.curryN)(3, function (predicate, lens, data) {
  return (0, _ramda.pipe)((0, _ramda.view)(lens), predicate, _isTrue["default"])(data);
});
var _default = lensSatisfies;
exports["default"] = _default;
},{"./isTrue":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isTrue.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lensTraverse.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _Identity = _interopRequireDefault(require("./fantasy-land/Identity"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Creates a [Traversable](https://github.com/fantasyland/fantasy-land#traversable) lens
 * from an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning function.
 *
 * When executed, it maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning
 * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable),
 * then uses [`sequence`](https://ramdajs.com/docs/#sequence) to transform the resulting Traversable of Applicative
 * into an Applicative of Traversable.
 *
 * Dispatches to the `traverse` method of the third argument, if present.
 *
 * @func lensTraverse
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.7.0|2.7.0}
 * @category Relation
 * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Applicative f => (a -> f a) -> Lens s a
 * @param {!function} of The Applicative-returning function
 * @return {!function} The Traversable lens
 * @see {@link http://ramdajs.com/docs/#lens|R.lens}, {@link http://ramdajs.com/docs/#traverse|R.traverse}
 *
 * @example
 *
 * const maybeLens = RA.lensTraverse(Maybe.of);
 * const safeDiv = n => d => d === 0 ? Maybe.Nothing() : Maybe.Just(n / d)
 *
 * R.over(maybeLens, safeDiv(10), [2, 4, 5]); // => Just([5, 2.5, 2])
 * R.over(maybeLens, safeDiv(10), [2, 0, 5]); // => Nothing
 *
 * R.view(maybeLens, [Maybe.Just(2), Maybe.Just(3)]); // => Maybe.Just([2, 3])
 *
 * R.set(maybeLens, Maybe.Just(1), [Maybe.just(2), Maybe.Just(3)]); // => Maybe.Just([1, 1])
 */
var lensTraverse = (0, _ramda.curryN)(1, function (of) {
  return (0, _ramda.curry)(function (toFunctorFn, target) {
    return _Identity["default"].of((0, _ramda.traverse)(of, (0, _ramda.pipe)(toFunctorFn, (0, _ramda.prop)('value')), target));
  });
});
var _default = lensTraverse;
exports["default"] = _default;
},{"./fantasy-land/Identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/fantasy-land/Identity.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/liftF.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _liftFN = _interopRequireDefault(require("./liftFN"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * "lifts" a function to be the specified arity, so that it may "map over" objects that satisfy
 * the fantasy land Apply spec of algebraic structures.
 *
 * Lifting is specific for {@link https://github.com/scalaz/scalaz|scalaz} and {@link http://functionaljava.org/|function Java} implementations.
 * Old version of fantasy land spec were not compatible with this approach,
 * but as of fantasy land 1.0.0 Apply spec also adopted this approach.
 *
 * This function acts as interop for ramda <= 0.23.0 and {@link https://monet.github.io/monet.js/|monet.js}.
 *
 * More info {@link https://github.com/fantasyland/fantasy-land/issues/50|here}.
 *
 * @func liftF
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.2.0|v1.2.0}
 * @category Function
 * @sig Apply a => (a... -> a) -> (a... -> a)
 * @param {Function} fn The function to lift into higher context
 * @return {Function} The lifted function
 * @see {@link RA.liftFN|liftFN}
 * @example
 *
 * const { Maybe } = require('monet');
 *
 * const add3 = (a, b, c) => a + b + c;
 * const madd3 = RA.liftF(add3);
 *
 * madd3(Maybe.Some(10), Maybe.Some(15), Maybe.Some(17)); //=> Maybe.Some(42)
 * madd3(Maybe.Some(10), Maybe.Nothing(), Maybe.Some(17)); //=> Maybe.Nothing()
 */
var liftF = (0, _ramda.curryN)(1, function (fn) {
  return (0, _liftFN["default"])(fn.length, fn);
});
var _default = liftF;
exports["default"] = _default;
},{"./liftFN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/liftFN.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/liftFN.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _ap = _interopRequireDefault(require("./internal/ap"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * "lifts" a function to be the specified arity, so that it may "map over" objects that satisfy
 * the fantasy land Apply spec of algebraic structures.
 *
 * Lifting is specific for {@link https://github.com/scalaz/scalaz|scalaz} and {@link http://www.functionaljava.org/|functional java} implementations.
 * Old version of fantasy land spec were not compatible with this approach,
 * but as of fantasy land 1.0.0 Apply spec also adopted this approach.
 *
 * This function acts as interop for ramda <= 0.23.0 and {@link https://monet.github.io/monet.js/|monet.js}.
 *
 * More info {@link https://github.com/fantasyland/fantasy-land/issues/50|here}.
 *
 * @func liftFN
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.2.0|v1.2.0}
 * @category Function
 * @sig Apply a => Number -> (a... -> a) -> (a... -> a)
 * @param {number} arity The arity of the lifter function
 * @param {Function} fn The function to lift into higher context
 * @return {Function} The lifted function
 * @see {@link http://ramdajs.com/docs/#lift|R.lift}, {@link http://ramdajs.com/docs/#ap|R.ap}
 * @example
 *
 * const { Maybe } = require('monet');
 *
 * const add3 = (a, b, c) => a + b + c;
 * const madd3 = RA.liftFN(3, add3);
 *
 * madd3(Maybe.Some(10), Maybe.Some(15), Maybe.Some(17)); //=> Maybe.Some(42)
 * madd3(Maybe.Some(10), Maybe.Nothing(), Maybe.Some(17)); //=> Maybe.Nothing()
 */
var liftFN = (0, _ramda.curry)(function (arity, fn) {
  var lifted = (0, _ramda.curryN)(arity, fn);
  return (0, _ramda.curryN)(arity, function () {
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    var accumulator = (0, _ramda.map)(lifted, (0, _ramda.head)(args));
    var apps = (0, _ramda.slice)(1, Infinity, args);
    return (0, _ramda.reduce)(_ap["default"], accumulator, apps);
  });
});
var _default = liftFN;
exports["default"] = _default;
},{"./internal/ap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ap.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/list.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Creates a list from arguments.
 *
 * @func list
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.1.0|v1.1.0}
 * @category List
 * @sig  a... -> [a...]
 * @param {...*} items The items of the feature list
 * @return {Array} New list created from items
 * @see {@link https://github.com/ramda/ramda/wiki/Cookbook#create-a-list-function|Ramda Cookbook}
 * @example
 *
 * RA.list('a', 'b', 'c'); //=> ['a', 'b', 'c']
 */
var list = (0, _ramda.unapply)(_ramda.identity);
var _default = list;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mapIndexed.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * {@link http://ramdajs.com/docs/#map|R.map} function that more closely resembles Array.prototype.map.
 * It takes two new parameters to its callback function: the current index, and the entire list.
 *
 * `mapIndexed` implementation is simple : `
 * const mapIndexed = R.addIndex(R.map);
 * `
 * @func mapIndexed
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.5.0|v2.5.0}
 * @category List
 * @typedef Idx = Number
 * @sig Functor f => ((a, Idx, f a) => b) => f a -> f b
 * @param {Function} fn The function to be called on every element of the input `list`
 * @param {Array} list The list to be iterated over
 * @return {Array} The new list
 * @see {@link http://ramdajs.com/docs/#addIndex|R.addIndex}, {@link http://ramdajs.com/docs/#map|R.map}
 * @example
 *
 * RA.mapIndexed((val, idx, list) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']);
 * //=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r']
 */
var mapIndexed = (0, _ramda.addIndex)(_ramda.map);
var _default = mapIndexed;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergePath.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _mergeRight = _interopRequireDefault(require("./mergeRight"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Create a new object with the own properties of the object under the `path`
 * merged with the own properties of the provided `source`.
 * If a key exists in both objects, the value from the `source` object will be used.
 *
 * @func mergePath
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.18.0|v1.18.0}
 * @category Object
 * @sig [k] -> {a} -> {k: {a}} -> {k: {a}}
 * @see {@link RA.mergeProp|mergeProp}
 * @param {!Array} path The property path of the destination object
 * @param {!Object} source The source object
 * @param {!Object} obj The object that has destination object under corresponding property path
 * @return {!Object} The new version of object
 * @example
 *
 * RA.mergePath(
 *  ['outer', 'inner'],
 *  { foo: 3, bar: 4 },
 *  { outer: { inner: { foo: 2 } } }
 * ); //=> { outer: { inner: { foo: 3, bar: 4 } }
 */
var mergePath = (0, _ramda.curry)(function (path, source, obj) {
  return (0, _ramda.over)((0, _ramda.lensPath)(path), (0, _mergeRight["default"])(source), obj);
});
var _default = mergePath;
exports["default"] = _default;
},{"./mergeRight":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergeRight.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergePaths.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _paths = _interopRequireDefault(require("./paths"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Merge objects under corresponding paths.
 *
 * @func mergePaths
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.17.0|v1.17.0}
 * @category Object
 * @sig [[k]] -> {k: {a}} -> {a}
 * @see {@link RA.mergeProps|mergeProps}
 * @param {!Array} paths The property paths to merge
 * @param {!Object} obj The object to query
 * @return {!Object} The object composed of merged property paths of obj
 * @example
 *
 * const obj = {
 *   foo: { fooInner: { fooInner2: 1 } },
 *   bar: { barInner: 2 }
 * };
 *
 * { ...obj.foo.fooInner, ...obj.bar }; //=>  { fooInner2: 1, barInner: 2 }
 * RA.mergePaths([['foo', 'fooInner'], ['bar']], obj); //=> { fooInner2: 1, barInner: 2 }
 */
var mergePaths = (0, _ramda.curryN)(2, (0, _ramda.pipe)(_paths["default"], _ramda.mergeAll));
var _default = mergePaths;
exports["default"] = _default;
},{"./paths":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/paths.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergeProp.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _mergePath = _interopRequireDefault(require("./mergePath"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Create a new object with the own properties of the object under the `p`
 * merged with the own properties of the provided `source`.
 * If a key exists in both objects, the value from the `source` object will be used.
 *
 * @func mergeProp
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.18.0|v1.18.0}
 * @category Object
 * @sig [k] -> {a} -> {k: {a}} -> {k: {a}}
 * @see {@link RA.mergePath|mergePath}
 * @param {!Array} p The property of the destination object
 * @param {!Object} source The source object
 * @param {!Object} obj The object that has destination object under corresponding property
 * @return {!Object} The new version of object
 * @example
 *
 * RA.mergeProp(
 *  'outer',
 *  { foo: 3, bar: 4 },
 *  { outer: { foo: 2 } }
 * ); //=> { outer: { foo: 3, bar: 4 } };
 */
var mergeProp = (0, _ramda.curry)(function (p, subj, obj) {
  return (0, _mergePath["default"])((0, _ramda.of)(p), subj, obj);
});
var _default = mergeProp;
exports["default"] = _default;
},{"./mergePath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergePath.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergeProps.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Functional equivalent of merging object properties with object spread operator.
 *
 * @func mergeProps
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.17.0|v1.17.0}
 * @category Object
 * @sig [k] -> {k: {a}} -> {a}
 * @see {@link RA.mergePaths|mergePaths}
 * @param {!Array} ps The property names to merge
 * @param {!Object} obj The object to query
 * @return {!Object} The object composed of merged properties of obj
 * @example
 *
 * const obj = {
 *   foo: { fooInner: 1 },
 *   bar: { barInner: 2 }
 * };
 *
 * { ...obj.foo, ...obj.bar }; //=> { fooInner: 1, barInner: 2 }
 * RA.mergeProps(['foo', 'bar'], obj); //=> { fooInner: 1, barInner: 2 }
 */
var mergeProps = (0, _ramda.curryN)(2, (0, _ramda.pipe)(_ramda.props, _ramda.mergeAll));
var _default = mergeProps;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/mergeRight.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Create a new object with the own properties of the second object merged with
 * the own properties of the first object. If a key exists in both objects,
 * the value from the first object will be used. *
 * Putting it simply: it sets properties only if they don't exist.
 *
 * @func mergeRight
 * @deprecated since v2.12.0; available in ramda@0.26.0 as R.mergeLeft
 * @aliases mergeLeft, resetToDefault
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.6.0|v1.6.0}
 * @category Object
 * @sig {k: v} -> {k: v} -> {k: v}
 * @param {Object} r Destination
 * @param {Object} l Source
 * @return {Object}
 * @see {@link http://ramdajs.com/docs/#merge|R.merge}, {@link https://github.com/ramda/ramda/wiki/Cookbook#set-properties-only-if-they-dont-exist|Ramda Cookbook}
 * @example
 *
 * RA.mergeRight({ 'age': 40 }, { 'name': 'fred', 'age': 10 });
 * //=> { 'name': 'fred', 'age': 40 }
 */
var mergeRight = (0, _ramda.flip)(_ramda.merge);
var _default = mergeRight;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/move.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns a new list with the item at the position `fromIdx` moved to the position `toIdx`. If the
 * `toIdx` is out of the `list` range, the item will be placed at the last position of the `list`.
 * When negative indices are provided, the behavior of the move is unspecified.
 *
 * @func move
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.8.0|v2.8.0}
 * @category List
 * @sig Number -> Number -> [a] -> [a]
 * @param {number} fromIdx The position of item to be moved
 * @param {number} toIdx The position of item after move
 * @param {Array} list The list containing the item to be moved
 * @return {Array}
 * @example
 *
 * const list = ['a', 'b', 'c', 'd', 'e'];
 * RA.move(1, 3, list) //=> ['a', 'c', 'd', 'b', 'e']
 */
var move = (0, _ramda.curry)(function (fromIdx, toIdx, list) {
  return (0, _ramda.compose)((0, _ramda.insert)(toIdx, (0, _ramda.nth)(fromIdx, list)), (0, _ramda.remove)(fromIdx, 1))(list);
});
var _default = move;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/nand.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns false if both arguments are truthy; true otherwise.
 *
 * @func nand
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.19.0|v2.19.0}
 * @category Logic
 * @sig a -> b -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean} false if both arguments are truesy
 * @example
 *
 * RA.nand(true, true); //=> false
 * RA.nand(false, true); //=> true
 * RA.nand(true, false); //=> true
 * RA.nand(false, false); //=> true
 * RA.nand(1.0, 1.0); //=> false
 * RA.nand(1.0, 0); //=> true
 * RA.nand(0, 1.0); //=> true
 * RA.nand(0, 0); //=> true
 */
var nand = (0, _ramda.complement)(_ramda.and); // eslint-disable-line ramda/complement-simplification

var _default = nand;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/neither.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/* eslint-disable max-len */

/**
 * A function which calls the two provided functions and returns the complement of `||`ing the
 * results.
 * It returns false if the first function is truth-y and the complement of the second function
 * otherwise. Note that this is short-circuited, meaning that the second function will not be
 * invoked if the first returns a truth-y value. In short it will return true if neither predicate
 * returns true.
 *
 * In addition to functions, `RA.neither` also accepts any fantasy-land compatible
 * applicative functor.
 *
 * @func neither
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.3.0|v2.3.0}
 * @category Logic
 * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
 * @param {Function} f A predicate
 * @param {Function} g Another predicate
 * @return {Function} Returns a function that applies its arguments to `f` and `g` and returns the complement of `||`ing their outputs together.
 * @see {@link http://ramdajs.com/docs/#either|R.either}, {@link http://ramdajs.com/docs/#or|R.or}
 * @example
 *
 * const gt10 = R.gt(R.__, 10)
 * const even = (x) => x % 2 === 0;
 * const f = RA.neither(gt10, even);
 *
 * f(12); //=> false
 * f(8); //=> false
 * f(11); //=> false
 * f(9); //=> true
 */

/* eslint-enable max-len */
var neither = (0, _ramda.curry)((0, _ramda.compose)(_ramda.complement, _ramda.either));
var _default = neither;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/noneP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _allP = _interopRequireDefault(require("./allP"));

var _rejectP = _interopRequireDefault(require("./rejectP"));

var _resolveP = _interopRequireDefault(require("./resolveP"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns a Promise that is resolved with an array of reasons when all of the provided Promises reject, or rejected when any Promise is resolved.
 * This pattern is like allP, but fulfillments and rejections are transposed - rejections become the fulfillment values and vice versa.
 *
 * @func noneP
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category Function
 * @sig [Promise a] -> Promise [a]
 * @param {Iterable.<*>} iterable An iterable object such as an Array or String
 * @return {Promise} A Promise that is resolved with a list of rejection reasons if all Promises are rejected, or a Promise that is rejected with the fulfillment value of the first Promise that resolves.
 * @see {@link RA.allP|allP}
 * @example
 *
 * RA.noneP([Promise.reject('hello'), Promise.reject('world')]); //=> Promise(['hello', 'world'])
 * RA.noneP([]); //=> Promise([])
 * RA.noneP([Promise.reject(), Promise.resolve('hello world')]); //=> Promise('hello world')
 * RA.noneP([Promise.reject(), 'hello world']); //=> Promise('hello world')
 */
var noneP = (0, _ramda.curryN)(1, (0, _ramda.pipe)((0, _ramda.map)(_resolveP["default"]), (0, _ramda.map)(function (p) {
  return p.then(_rejectP["default"], _resolveP["default"]);
}), _allP["default"]));
var _default = noneP;
exports["default"] = _default;
},{"./allP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allP.js","./rejectP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/rejectP.js","./resolveP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/resolveP.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/nonePass.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Takes a list of predicates and returns a predicate that returns true for a given list of
 * arguments if none of the provided predicates are satisfied by those arguments. It is the
 * complement of Ramda's anyPass.
 *
 * The function returned is a curried function whose arity matches that of the
 * highest-arity predicate.
 *
 * @func nonePass
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.5.0|v2.5.0}
 * @category Logic
 * @sig [(*... -> Boolean)] -> (*... -> Boolean)
 * @param {Array} predicates An array of predicates to check
 * @return {Function} The combined predicate
 * @see {@link http://ramdajs.com/docs/#anyPass|R.anyPass}
 * @example
 *
 * const gt10 = R.gt(R.__, 10)
 * const even = (x) => x % 2 === 0;
 * const f = RA.nonePass([gt10, even]);
 *
 * f(12); //=> false
 * f(8); //=> false
 * f(11); //=> false
 * f(9); //=> true
 */
var nonePass = (0, _ramda.curryN)(1, (0, _ramda.compose)(_ramda.complement, _ramda.anyPass));
var _default = nonePass;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/noop.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _stubUndefined = _interopRequireDefault(require("./stubUndefined"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * A function that performs no operations.
 *
 * @func noop
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.0.0|v1.0.0}
 * @category Function
 * @sig ... -> undefined
 * @return {undefined}
 * @example
 *
 * RA.noop(); //=> undefined
 * RA.noop(1, 2, 3); //=> undefined
 */
var noop = (0, _ramda.always)((0, _stubUndefined["default"])());
var _default = noop;
exports["default"] = _default;
},{"./stubUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubUndefined.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/nor.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns true if both arguments are falsy; false otherwise.
 *
 * @func nor
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.20.0|v2.20.0}
 * @category Logic
 * @sig a -> b -> a ⊽ b
 * @param {*} a
 * @param {*} b
 * @return {boolean} true if both arguments are falsy
 * @see {@link RA.neither|neither}
 * @example
 *
 * RA.nor(true, true); //=> false
 * RA.nor(false, true); //=> false
 * RA.nor(true, false); //=> false
 * RA.nor(false, false); //=> true
 * RA.nor(1, 1); //=> false
 * RA.nor(1, 0); //=> false
 * RA.nor(0, 1); //=> false
 * RA.nor(0, 0); //=> true
 */
var nor = (0, _ramda.complement)(_ramda.or); // eslint-disable-line ramda/complement-simplification

var _default = nor;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/notAllPass.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Takes a list of predicates and returns a predicate that returns true for a given list of
 * arguments if one or more of the provided predicates is not satisfied by those arguments. It is
 * the complement of Ramda's allPass.
 *
 * The function returned is a curried function whose arity matches that of the
 * highest-arity predicate.
 *
 * @func notAllPass
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.4.0|v2.4.0}
 * @category Logic
 * @sig [(*... -> Boolean)] -> (*... -> Boolean)
 * @param {Array} predicates An array of predicates to check
 * @return {Function} The combined predicate
 * @see {@link http://ramdajs.com/docs/#allPass|R.allPass}
 * @example
 *
 * const gt10 = R.gt(R.__, 10)
 * const even = (x) => x % 2 === 0;
 * const f = RA.notAllPass([gt10, even]);
 *
 * f(12); //=> false
 * f(8); //=> true
 * f(11); //=> true
 * f(9); //=> true
 */
var notAllPass = (0, _ramda.curry)((0, _ramda.compose)(_ramda.complement, _ramda.allPass));
var _default = notAllPass;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/notAllUnique.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _allUnique = _interopRequireDefault(require("./allUnique"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns true if at least one item of the list is repeated. `R.equals` is used to determine equality.
 *
 * @func notAllUnique
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category List
 * @sig [a] -> Boolean
 * @param {Array} list The list of values
 * @return {boolean}
 * @see {@link RA.allUnique|allUnique}, {@link https://ramdajs.com/docs/#equals|equals}
 * @example
 *
 * RA.notAllUnique([ 1, 1, 2, 3 ]); //=> true
 * RA.notAllUnique([ 1, 2, 3, 4 ]); //=> false
 * RA.notAllUnique([]); //=> false
 *
 */
var notAllUnique = (0, _ramda.complement)(_allUnique["default"]);
var _default = notAllUnique;
exports["default"] = _default;
},{"./allUnique":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allUnique.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/notBoth.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/* eslint-disable max-len */

/**
 * A function which calls the two provided functions and returns the complement of `&&`ing the
 * results.
 * It returns true if the first function is false-y and the complement of the second function
 * otherwise. Note that this is short-circuited, meaning that the second function will not be
 * invoked if the first returns a false-y value. In short it will return true unless both predicates
 * return true.
 *
 * In addition to functions, `RA.notBoth` also accepts any fantasy-land compatible
 * applicative functor.
 *
 * @func notBoth
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.3.0|v2.3.0}
 * @category Logic
 * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
 * @param {Function} f A predicate
 * @param {Function} g Another predicate
 * @return {Function} Returns a function that applies its arguments to `f` and `g` and returns the complement of `&&`ing their outputs together.
 * @see {@link http://ramdajs.com/docs/#both|R.both}
 * @example
 *
 * const gt10 = R.gt(R.__, 10)
 * const even = (x) => x % 2 === 0;
 * const f = RA.notBoth(gt10, even);
 *
 * f(12); //=> false
 * f(8); //=> true
 * f(11); //=> true
 * f(9); //=> true
 */

/* eslint-enable max-len */
var notBoth = (0, _ramda.curry)((0, _ramda.compose)(_ramda.complement, _ramda.both));
var _default = notBoth;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/notEqual.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns `true` if its arguments are not equivalent, `false` otherwise. Handles
 * cyclical data structures.
 *
 * Dispatches symmetrically to the `equals` methods of both arguments, if
 * present.
 *
 * @func notEqual
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.29.0|v2.29.0}
 * @category Relation
 * @sig a -> b -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @see {@link https://ramdajs.com/docs/#equals|equals}
 * @example
 *
 * RA.notEqual(1, 1); //=> false
 * RA.notEqual(1, '1'); //=> true
 * RA.notEqual([1, 2, 3], [1, 2, 3]); //=> false
 *
 * const a = {}; a.v = a;
 * const b = {}; b.v = b;
 * RA.notEqual(a, b); //=> false
 */
var notEqual = (0, _ramda.complement)(_ramda.equals);
var _default = notEqual;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/omitBy.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/* eslint-disable max-len */

/**
 * Returns a partial copy of an object containing only the keys
 * that don't satisfy the supplied predicate.
 *
 * @func omitBy
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.6.0|v2.6.0}
 * @category Object
 * @sig ((v, k) -> Boolean) -> {k: v} -> {k: v}
 * @param {!Function} pred A predicate to determine whether or not a key should be included on the output object
 * @param {!Object} obj The object to copy from
 * @return {!Object} A new object only with properties that don't satisfy `pred`
 *
 * @example
 *
 * const isLowerCase = (val, key) => key.toLowerCase() === key;
 * RA.omitBy(isLowerCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4}
 */

/* eslint-enable max-len */
var omitBy = (0, _ramda.useWith)(_ramda.pickBy, [_ramda.complement, _ramda.identity]);
var _default = omitBy;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/omitIndexes.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

// helpers
var rejectIndexed = (0, _ramda.addIndex)(_ramda.reject);
var containsIndex = (0, _ramda.curry)(function (indexes, val, index) {
  return (0, _ramda.contains)(index, indexes);
});
/**
 * Returns a partial copy of an array omitting the indexes specified.
 *
 * @func omitIndexes
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.19.0|v1.19.0}
 * @category List
 * @sig [Int] -> [a] -> [a]
 * @see {@link http://ramdajs.com/docs/#omit|R.omit}, {@link RA.pickIndexes|pickIndexes}
 * @param {!Array} indexes The array of indexes to omit from the new array
 * @param {!Array} list The array to copy from
 * @return {!Array} The new array with omitted indexes
 * @example
 *
 * RA.omitIndexes([-1, 1, 3], ['a', 'b', 'c', 'd']); //=> ['a', 'c']
 */

var omitIndexes = (0, _ramda.curry)(function (indexes, list) {
  return rejectIndexed(containsIndex(indexes), list);
});
var _default = omitIndexes;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/overlaps.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isNotEmpty = _interopRequireDefault(require("./isNotEmpty"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Returns true if two lists have at least one element common to both lists.
 *
 * @func overlaps
 * @memberOf RA
 * @category Relation
 * @since {@link https://char0n.github.io/ramda-adjunct/2.30.0|v2.30.0}
 * @sig [a] -> [a] -> Boolean
 * @param {Array} list1 The first list
 * @param {Array} list2 The second list
 * @return {boolean} True if two lists have at least one element common to both lists
 * @example
 *
 * RA.overlaps(['-v', '--verbose'], ['node', 'script.js', '-v']); //=> true
 * RA.overlaps(['-v', '--verbose'], []); //=> false
 * RA.overlaps([1, 2, 3], [3, 4, 5]); //=> true
 * RA.overlaps([1, 2, 3], [4, 5]); //=> false
 */
var overlaps = (0, _ramda.curryN)(2, function (list1, list2) {
  if ((0, _ramda.isEmpty)(list1)) {
    return true;
  }

  return (0, _ramda.pipe)(_ramda.intersection, _isNotEmpty["default"])(list1, list2);
});
var _default = overlaps;
exports["default"] = _default;
},{"./isNotEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isNotEmpty.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/padCharsEnd.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.padEndPonyfill = exports.padEndInvoker = exports["default"] = void 0;

var _ramda = require("ramda");

var _String = _interopRequireDefault(require("./internal/ponyfills/String.padEnd"));

var _isFunction = _interopRequireDefault(require("./isFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var padEndPonyfill = (0, _ramda.curry)(_String["default"]);
exports.padEndPonyfill = padEndPonyfill;
var padEndInvoker = (0, _ramda.flip)((0, _ramda.invoker)(2, 'padEnd'));
/**
 * The function pads the current string with a given string
 * (repeated, if needed) so that the resulting string reaches a given length.
 * The padding is applied from the end of the current string.
 *
 * @func padCharsEnd
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category String
 * @sig String -> Number -> String -> String
 * @param {string} padString The string to pad the current string with
 * @param {number} targetLength The length of the resulting string once
 * the current string has been padded
 * @param {string} value String value to be padded
 * @return {string} A new string of the specified length with the pad string
 * applied at the end of the current string
 * @see {@link RA.padEnd|padEnd}, {@link RA.padCharsStart|padCharsStart}, {@link RA.padStart|padStart}
 * @example
 *
 * RA.padCharsEnd('-', 3, 'a'); // => 'a--'
 * RA.padCharsEnd('foo', 10, 'abc'); // => 'abcfoofoof'
 * RA.padCharsEnd('123456', 6, 'abc'); // => 'abc123'
 */

exports.padEndInvoker = padEndInvoker;
var padCharsEnd = (0, _isFunction["default"])(String.prototype.padEnd) ? padEndInvoker : padEndPonyfill;
var _default = padCharsEnd;
exports["default"] = _default;
},{"./internal/ponyfills/String.padEnd":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.padEnd.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/padCharsStart.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.padStartPonyfill = exports.padStartInvoker = exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

var _String = _interopRequireDefault(require("./internal/ponyfills/String.padStart"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var padStartInvoker = (0, _ramda.flip)((0, _ramda.invoker)(2, 'padStart'));
exports.padStartInvoker = padStartInvoker;
var padStartPonyfill = (0, _ramda.curry)(_String["default"]);
/**
 * The function pads the current string with a given string
 * (repeated, if needed) so that the resulting string reaches a given length.
 * The padding is applied from the start of the current string.
 *
 * @func padCharsStart
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category String
 * @sig String -> Number -> String -> String
 * @param {string} padString The string to pad the current string with
 * @param {number} targetLength The length of the resulting string once the current string has been padded
 * @param {string} value String value to be padded
 * @return {string} A new string of the specified length with the pad string on the start of current string
 * @see {@link RA.padStart|padStart}, {@link RA.padEnd|padEnd}, {@link RA.padCharsEnd|padCharsEnd}
 * @example
 *
 * RA.padCharsStart('-', 3, 'a'); // => '--a'
 * RA.padCharsStart('foo', 10, 'abc'); // => 'foofoofabc'
 * RA.padCharsStart('123456', 6, 'abc'); // => '123abc'
 */

exports.padStartPonyfill = padStartPonyfill;
var padCharsStart = (0, _isFunction["default"])(String.prototype.padStart) ? padStartInvoker : padStartPonyfill;
var _default = padCharsStart;
exports["default"] = _default;
},{"./internal/ponyfills/String.padStart":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.padStart.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/padEnd.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _padCharsEnd = _interopRequireDefault(require("./padCharsEnd"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * The function pads the current string with an empty string
 * so that the resulting string reaches a given length.
 * The padding is applied from the end of the current string.
 *
 * @func padEnd
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category String
 * @sig Number -> String -> String
 * @param {number} targetLength The length of the resulting string once
 * the current string has been padded
 * @param {string} value String value to be padded
 * @return {string} A new string of the specified length with the pad string
 * applied at the end of the current string
 * @see {@link RA.padCharsEnd|padCharsEnd}, {@link RA.padCharsStart|padCharsStart}, {@link RA.padStart|padStart}
 * @example
 *
 * RA.padEnd(3, 'a'); // => 'a  '
 */
var padEnd = (0, _padCharsEnd["default"])(' ');
var _default = padEnd;
exports["default"] = _default;
},{"./padCharsEnd":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/padCharsEnd.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/padStart.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _padCharsStart = _interopRequireDefault(require("./padCharsStart"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Pads string on the left side if it's shorter than length.
 *
 * @func padStart
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.25.0|v2.25.0}
 * @category String
 * @sig Number -> String -> String
 * @param {number} targetLength The length of the resulting string once
 * the current string has been padded
 * @param {string} value String value to be padded
 * @return {string} A new string of the specified length with the empty string
 * applied to the beginning of the current string
 * @see {@link RA.padCharsEnd|padCharsEnd}, {@link RA.padCharsStart|padCharsStart}, {@link RA.padEnd|padEnd}
 * @example
 *
 * RA.padStart(3, 'a'); // => '  a'
 */
var padStart = (0, _padCharsStart["default"])(' ');
var _default = padStart;
exports["default"] = _default;
},{"./padCharsStart":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/padCharsStart.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/pathNotEq.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/* eslint-disable max-len */

/**
 * Determines whether a nested path on an object doesn't have a specific value,
 * in R.equals terms. Most likely used to filter a list.
 *
 * @func pathNotEq
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.4.0|v2.4.0}
 * @category Relation
 * @sig [Idx] => a => {a} => Boolean
 * @sig Idx = String | Int
 * @param {Array} path The path of the nested property to use
 * @param {a} val The value to compare the nested property with
 * @param {Object} object The object to check the nested property in
 * @return {boolean} Returns Boolean `false` if the value equals the nested object property, `true` otherwise
 * @see {@link http://ramdajs.com/docs/#pathEq|R.pathEq}
 * @example
 *
 * const user1 = { address: { zipCode: 90210 } };
 * const user2 = { address: { zipCode: 55555 } };
 * const user3 = { name: 'Bob' };
 * const users = [ user1, user2, user3 ];
 * const isFamous = R.pathNotEq(['address', 'zipCode'], 90210);
 * R.filter(isFamous, users); //=> [ user2, user3 ]
 */

/* eslint-enable max-len */
var pathNotEq = (0, _ramda.complement)(_ramda.pathEq);
var _default = pathNotEq;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/pathOrLazy.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * If the given, non-null object has a value at the given path, returns the value at that path.
 * Otherwise returns the result of invoking the provided function with the object.
 *
 * @func pathOrLazy
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category Object
 * @typedef Idx = String | Int
 * @sig ({a} -> a) -> [Idx] -> {a} -> a
 * @param {Function} defaultFn The function that will return the default value.
 * @param {Array} path The path to use.
 * @param {Object} obj The object to retrieve the nested property from.
 * @return {*} The data at `path` of the supplied object or the default value.
 * @example
 *
 * RA.pathOrLazy(() => 'N/A', ['a', 'b'], {a: {b: 2}}); //=> 2
 * RA.pathOrLazy(() => 'N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A"
 */
var pathOrLazy = (0, _ramda.curryN)(3, function (defaultFn, path, obj) {
  return (0, _ramda.when)((0, _ramda.identical)(defaultFn), (0, _ramda.partial)((0, _ramda.unary)(defaultFn), [obj]), (0, _ramda.pathOr)(defaultFn, path, obj));
});
var _default = pathOrLazy;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/paths.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Acts as multiple path: arrays of paths in, array of values out. Preserves order.
 *
 * @func paths
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.2.0|v1.2.0}
 * @category List
 * @sig  [[k]] -> {k: v} - [v]
 * @param {Array} ps The property paths to fetch
 * @param {Object} obj The object to query
 * @return {Array} The corresponding values or partially applied function
 * @see {@link https://github.com/ramda/ramda/wiki/Cookbook#derivative-of-rprops-for-deep-fields|Ramda Cookbook}, {@link http://ramdajs.com/docs/#props|R.props}
 * @example
 *
 * const obj = {
 *   a: { b: { c: 1 } },
 *   x: 2,
 * };
 *
 * RA.paths([['a', 'b', 'c'], ['x']], obj); //=> [1, 2]
 */
var paths = (0, _ramda.curry)(function (ps, obj) {
  return (0, _ramda.ap)([(0, _ramda.path)(_ramda.__, obj)], ps);
});
var _default = paths;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/pickIndexes.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

// helpers
var filterIndexed = (0, _ramda.addIndex)(_ramda.filter);
var containsIndex = (0, _ramda.curry)(function (indexes, val, index) {
  return (0, _ramda.contains)(index, indexes);
});
/**
 * Picks values from list by indexes.
 *
 * Note: pickIndexes will skip non existing indexes. If you want to include them
 * use ramda's `props` function.
 *
 * @func pickIndexes
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.1.0|v1.1.0}
 * @category List
 * @sig  [Number] -> [a] -> [a]
 * @param {Array} indexes The indexes to pick
 * @param {Array} list The list to pick values from
 * @return {Array} New array containing only values at `indexes`
 * @see {@link http://ramdajs.com/docs/#pick|R.pick}, {@link RA.omitIndexes|omitIndexes}
 * @example
 *
 * RA.pickIndexes([0, 2], ['a', 'b', 'c']); //=> ['a', 'c']
 */

var pickIndexes = (0, _ramda.curry)(function (indexes, list) {
  return filterIndexed(containsIndex(indexes), list);
});
var _default = pickIndexes;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/propNotEq.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns true if the specified object property is not equal,
 * in R.equals terms, to the given value; false otherwise.
 *
 * @func propNotEq
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.3.0|v2.3.0}
 * @category Relation
 * @sig  String -> a -> Object -> Boolean
 * @param {String} name The property to pick
 * @param {a} val The value to compare to
 * @param {Object} object The object, that presumably contains value under the property
 * @return {boolean} Comparison result
 * @see {@link http://ramdajs.com/docs/#propEq|R.propEq}
 * @example
 *
 * const abby = { name: 'Abby', age: 7, hair: 'blond' };
 * const fred = { name: 'Fred', age: 12, hair: 'brown' };
 * const rusty = { name: 'Rusty', age: 10, hair: 'brown' };
 * const alois = { name: 'Alois', age: 15, disposition: 'surly' };
 * const kids = [abby, fred, rusty, alois];
 * const hasNotBrownHair = RA.propNotEq('hair', 'brown');
 *
 * R.filter(hasNotBrownHair, kids); //=> [abby, alois]
 */
var propNotEq = (0, _ramda.complement)(_ramda.propEq);
var _default = propNotEq;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/rangeStep.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _floor = _interopRequireDefault(require("./floor"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Creates an array of numbers (positive and/or negative) progressing from start up to, but not including, end.
 *
 * `Note`: JavaScript follows the IEEE-754 standard for resolving floating-point values which can produce unexpected results.
 *
 * @func rangeStep
 * @memberOf RA
 * @category List
 * @since {@link https://char0n.github.io/ramda-adjunct/2.30.0|v2.30.0}
 * @sig Number -> Number -> Number -> [Number]
 * @param {number} step The value to increment or decrement by
 * @param {number} from The start of the range
 * @param {number} to The end of the range
 * @return {number[]} Returns the range of numbers
 * @see {@link http://ramdajs.com/docs/#range|R.range}
 * @example
 *
 * RA.rangeStep(1, 0, 4); // => [0, 1 ,2, 3]
 * RA.rangeStep(-1, 0, -4); // => [0, -1, -2, -3]
 * RA.rangeStep(1, 1, 5); // => [1, 2, 3, 4]
 * RA.rangeStep(5, 0, 20); // => [0, 5, 10, 15]
 * RA.rangeStep(-1, 0, -4); // => [0, -1, -2, -3]
 * RA.rangeStep(0, 1, 4); // => [1, 1, 1]
 * RA.rangeStep(1, 0, 0); // => []
 */
var rangeStep = (0, _ramda.curryN)(3, function (step, from, to) {
  var callback = step === 0 ? (0, _ramda.always)(from) : function (n) {
    return from + step * n;
  };
  var rangeEnd = step === 0 ? to - from : (0, _floor["default"])((to - from) / step);
  return (0, _ramda.map)(callback, (0, _ramda.range)(0, rangeEnd));
});
var _default = rangeStep;
exports["default"] = _default;
},{"./floor":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/floor.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/reduceIndexed.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * {@link http://ramdajs.com/docs/#reduce|R.reduce} function that more closely resembles Array.prototype.reduce.
 * It takes two new parameters to its callback function: the current index, and the entire list.
 *
 * `reduceIndexed` implementation is simple : `
 * const reduceIndexed = R.addIndex(R.reduce);
 * `
 * @func reduceIndexed
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.5.0|v2.5.0}
 * @category List
 * @typedef Idx = Number
 * @sig ((a, b, Idx, [b]) => a) -> a -> [b] -> a
 * @param {Function} fn The iterator function. Receives four values,
 * the accumulator, the current element from the array, index and the entire list
 * @param {*} acc The accumulator value
 * @param {Array} list The list to iterate over
 * @return {*} The final, accumulated value
 * @see {@link http://ramdajs.com/docs/#addIndex|R.addIndex}, {@link http://ramdajs.com/docs/#reduce|R.reduce}
 * @example
 *
 * const initialList = ['f', 'o', 'o', 'b', 'a', 'r'];
 *
 * reduceIndexed((acc, val, idx, list) => acc + '-' + val + idx, '', initialList);
 * //=> "-f0-o1-o2-b3-a4-r5"
 */
var reduceIndexed = (0, _ramda.addIndex)(_ramda.reduce);
var _default = reduceIndexed;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/reduceP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isUndefined = _interopRequireDefault(require("./isUndefined"));

var _resolveP = _interopRequireDefault(require("./resolveP"));

var _allP = _interopRequireDefault(require("./allP"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

/* eslint-disable max-len */

/**
 * Given an `Iterable`(arrays are `Iterable`), or a promise of an `Iterable`,
 * which produces promises (or a mix of promises and values),
 * iterate over all the values in the `Iterable` into an array and
 * reduce the array to a value using the given iterator function.
 *
 * If the iterator function returns a promise, then the result of the promise is awaited,
 * before continuing with next iteration. If any promise in the array is rejected or a promise
 * returned by the iterator function is rejected, the result is rejected as well.
 *
 * If `initialValue` is `undefined` (or a promise that resolves to `undefined`) and
 * the `Iterable` contains only 1 item, the callback will not be called and
 * the `Iterable's` single item is returned. If the `Iterable` is empty, the callback
 * will not be called and `initialValue` is returned (which may be undefined).
 *
 * This function is basically equivalent to {@link http://bluebirdjs.com/docs/api/promise.reduce.html|bluebird.reduce}.
 *
 * @func reduceP
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.13.0|v1.13.0}
 * @category List
 * @typedef MaybePromise = Promise.<*> | *
 * @sig ((Promise a, MaybePromise b) -> Promise a) -> MaybePromise a -> MaybePromise [MaybePromise b] -> Promise a
 * @param {Function} fn The iterator function. Receives two values, the accumulator and the current element from the list
 * @param {*|Promise.<*>} acc The accumulator value
 * @param {Array.<*>|Promise.<Array<*|Promise.<*>>>} list The list to iterate over
 * @return {Promise} The final, accumulated value
 * @see {@link http://ramdajs.com/docs/#reduce|R.reduce}, {@link RA.reduceRightP|reduceRightP}, {@link http://bluebirdjs.com/docs/api/promise.reduce.html|bluebird.reduce}
 * @example
 *
 * RA.reduceP(
 *   (total, fileName) => fs
 *     .readFileAsync(fileName, 'utf8')
 *     .then(contents => total + parseInt(contents, 10)),
 *   0,
 *   ['file1.txt', 'file2.txt', 'file3.txt']
 * ); // => Promise(10)
 *
 * RA.reduceP(
 *   (total, fileName) => fs
 *     .readFileAsync(fileName, 'utf8')
 *     .then(contents => total + parseInt(contents, 10)),
 *   Promise.resolve(0),
 *   ['file1.txt', 'file2.txt', 'file3.txt']
 * ); // => Promise(10)
 *
 * RA.reduceP(
 *   (total, fileName) => fs
 *     .readFileAsync(fileName, 'utf8')
 *     .then(contents => total + parseInt(contents, 10)),
 *   0,
 *   [Promise.resolve('file1.txt'), 'file2.txt', 'file3.txt']
 * ); // => Promise(10)
 *
 * RA.reduceP(
 *   (total, fileName) => fs
 *     .readFileAsync(fileName, 'utf8')
 *     .then(contents => total + parseInt(contents, 10)),
 *   0,
 *   Promise.resolve([Promise.resolve('file1.txt'), 'file2.txt', 'file3.txt'])
 * ); // => Promise(10)
 *
 */

/* esline-enable max-len */
var reduceP = (0, _ramda.curryN)(3, function (fn, acc, list) {
  return (0, _resolveP["default"])(list).then(function (iterable) {
    var listLength = (0, _ramda.length)(iterable);

    if (listLength === 0) {
      return acc;
    }

    var reducer = (0, _ramda.reduce)(function (accP, currentValueP) {
      return accP.then(function (previousValue) {
        return (0, _allP["default"])([previousValue, currentValueP]);
      }).then(function (_ref) {
        var _ref2 = _slicedToArray(_ref, 2),
            previousValue = _ref2[0],
            currentValue = _ref2[1];

        if ((0, _isUndefined["default"])(previousValue) && listLength === 1) {
          return currentValue;
        }

        return fn(previousValue, currentValue);
      });
    });
    return reducer((0, _resolveP["default"])(acc), iterable);
  });
});
var _default = reduceP;
exports["default"] = _default;
},{"./allP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allP.js","./isUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isUndefined.js","./resolveP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/resolveP.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/reduceRightP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isUndefined = _interopRequireDefault(require("./isUndefined"));

var _resolveP = _interopRequireDefault(require("./resolveP"));

var _allP = _interopRequireDefault(require("./allP"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

// in older ramda versions the order of the arguments is flipped
var flipArgs = (0, _ramda.pipe)((0, _ramda.reduceRight)(_ramda.concat, ''), (0, _ramda.equals)('ba'))(['a', 'b']);
/* eslint-disable max-len */

/**
 * Given an `Iterable`(arrays are `Iterable`), or a promise of an `Iterable`,
 * which produces promises (or a mix of promises and values),
 * iterate over all the values in the `Iterable` into an array and
 * reduce the array to a value using the given iterator function.
 *
 * Similar to {@link RA.reduceP|reduceP} except moves through the input list from the right to the left.
 * The iterator function receives two values: (value, acc),
 * while the arguments' order of reduceP's iterator function is (acc, value).
 *
 * @func reduceRightP
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.13.0|v1.13.0}
 * @category List
 * @typedef MaybePromise = Promise.<*> | *
 * @sig ((MaybePromise b, Promise a) -> Promise a) -> MaybePromise a -> MaybePromise [MaybePromise b] -> Promise a
 * @param {Function} fn The iterator function. Receives two values, the current element from the list and the accumulator
 * @param {*|Promise.<*>} acc The accumulator value
 * @param {Array.<*>|Promise.<Array<*|Promise.<*>>>} list The list to iterate over
 * @return {Promise} The final, accumulated value
 * @see {@link RA.reduceP|reduceP}, {@link http://bluebirdjs.com/docs/api/promise.reduce.html|bluebird.reduce}
 * @example
 *
 * RA.reduceRightP(
 *   (fileName, total) => fs
 *     .readFileAsync(fileName, 'utf8')
 *     .then(contents => total + parseInt(contents, 10)),
 *   0,
 *   ['file1.txt', 'file2.txt', 'file3.txt']
 * ); // => Promise(10)
 *
 * RA.reduceRightP(
 *   (fileName, total) => fs
 *     .readFileAsync(fileName, 'utf8')
 *     .then(contents => total + parseInt(contents, 10)),
 *   Promise.resolve(0),
 *   ['file1.txt', 'file2.txt', 'file3.txt']
 * ); // => Promise(10)
 *
 * RA.reduceRightP(
 *   (fileName, total) => fs
 *     .readFileAsync(fileName, 'utf8')
 *     .then(contents => total + parseInt(contents, 10)),
 *   0,
 *   [Promise.resolve('file1.txt'), 'file2.txt', 'file3.txt']
 * ); // => Promise(10)
 *
 * RA.reduceRightP(
 *   (fileName, total) => fs
 *     .readFileAsync(fileName, 'utf8')
 *     .then(contents => total + parseInt(contents, 10)),
 *   0,
 *   Promise.resolve([Promise.resolve('file1.txt'), 'file2.txt', 'file3.txt'])
 * ); // => Promise(10)
 *
 */

/* esline-enable max-len */

var reduceRightP = (0, _ramda.curryN)(3, function (fn, acc, list) {
  return (0, _resolveP["default"])(list).then(function (iterable) {
    var listLength = (0, _ramda.length)(iterable);

    if (listLength === 0) {
      return acc;
    }

    var reducer = (0, _ramda.reduceRight)(function (arg1, arg2) {
      var accP;
      var currentValueP;

      if (flipArgs) {
        accP = arg1;
        currentValueP = arg2;
      } else {
        accP = arg2;
        currentValueP = arg1;
      }

      return accP.then(function (previousValue) {
        return (0, _allP["default"])([previousValue, currentValueP]);
      }).then(function (_ref) {
        var _ref2 = _slicedToArray(_ref, 2),
            previousValue = _ref2[0],
            currentValue = _ref2[1];

        if ((0, _isUndefined["default"])(previousValue) && listLength === 1) {
          return currentValue;
        }

        return fn(currentValue, previousValue);
      });
    });
    return reducer((0, _resolveP["default"])(acc), iterable);
  });
});
var _default = reduceRightP;
exports["default"] = _default;
},{"./allP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/allP.js","./isUndefined":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isUndefined.js","./resolveP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/resolveP.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/rejectP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Composable shortcut for `Promise.reject`.
 *
 * Returns a Promise object that is rejected with the given reason.
 *
 * @func rejectP
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.16.0|v1.16.0}
 * @category Function
 * @sig a -> Promise a
 * @param {*} [reason=undefined] Reason why this Promise rejected
 * @return {Promise} A Promise that is rejected with the given reason
 * @see {@link RA.resolveP|resolveP}
 * @example
 *
 * RA.rejectP(); //=> Promise(undefined)
 * RA.rejectP('a'); //=> Promise('a')
 * RA.rejectP([1, 2, 3]); //=> Promise([1, 2, 3])
 */
var rejectP = (0, _ramda.bind)(Promise.reject, Promise);
var _default = rejectP;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/renameKeyWith.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _renameKeysWith = _interopRequireDefault(require("./renameKeysWith"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Creates a new object with the own properties of the provided object, but the
 * key `key` renamed according to logic of renaming function.
 *
 * Keep in mind that in case the new key name already existed on the object,
 * the behaviour is undefined and the result may vary between various JS engines!
 *
 * @func renameKeyWith
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.29.0|v2.29.0}
 * @category Object
 * @sig (k -> k) -> k -> {k: v} -> {k: v}
 * @param {Function} fn Function that renames the keys
 * @param {!string} key Key to rename
 * @param {!Object} obj Provided object
 * @return {!Object} New object with renamed key
 * @see {@link RA.renameKeysWith|renameKeysWith}
 * @example
 *
 * RA.renameKeyWith(R.concat('a'), 'A', { A: 1 }) //=> { aA: 1 }
 */
var renameKeyWith = (0, _ramda.curry)(function (fn, key, obj) {
  return (0, _renameKeysWith["default"])((0, _ramda.when)((0, _ramda.equals)(key), fn), obj);
});
var _default = renameKeyWith;
exports["default"] = _default;
},{"./renameKeysWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/renameKeysWith.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/renameKeys.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _renameKeysWith = _interopRequireDefault(require("./renameKeysWith"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var valueOrKey = function valueOrKey(keysMap) {
  return function (key) {
    if ((0, _ramda.has)(key, keysMap)) {
      return keysMap[key];
    }

    return key;
  };
};
/**
 * Creates a new object with the own properties of the provided object, but the
 * keys renamed according to the keysMap object as `{oldKey: newKey}`.
 * When some key is not found in the keysMap, then it's passed as-is.
 *
 * Keep in mind that in the case of keys conflict is behaviour undefined and
 * the result may vary between various JS engines!
 *
 * @func renameKeys
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.5.0|v1.5.0}
 * @category Object
 * @sig {a: b} -> {a: *} -> {b: *}
 * @param {!Object} keysMap
 * @param {!Object} obj
 * @return {!Object} New object with renamed keys
 * @see {@link https://github.com/ramda/ramda/wiki/Cookbook#rename-keys-of-an-object|Ramda Cookbook}, {@link RA.renameKeysWith|renameKeysWith}
 * @example
 *
 * const input = { firstName: 'Elisia', age: 22, type: 'human' };
 *
 * RA.renameKeys({ firstName: 'name', type: 'kind', foo: 'bar' })(input);
 * //=> { name: 'Elisia', age: 22, kind: 'human' }
 */


var renameKeys = (0, _ramda.curry)(function (keysMap, obj) {
  return (0, _renameKeysWith["default"])(valueOrKey(keysMap), obj);
});
var _default = renameKeys;
exports["default"] = _default;
},{"./renameKeysWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/renameKeysWith.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/renameKeysWith.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Creates a new object with the own properties of the provided object, but the
 * keys renamed according to logic of renaming function.
 *
 * Keep in mind that in the case of keys conflict is behaviour undefined and
 * the result may vary between various JS engines!
 *
 * @func renameKeysWith
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.5.0|v1.5.0}
 * @category Object
 * @sig (a -> b) -> {a: *} -> {b: *}
 * @param {Function} fn Function that renames the keys
 * @param {!Object} obj Provided object
 * @return {!Object} New object with renamed keys
 * @see {@link https://github.com/ramda/ramda/wiki/Cookbook#rename-keys-of-an-object-by-a-function|Ramda Cookbook}, {@link RA.renameKeys|renameKeys}
 * @example
 *
 * RA.renameKeysWith(R.concat('a'), { A: 1, B: 2, C: 3 }) //=> { aA: 1, aB: 2, aC: 3 }
 */
var renameKeysWith = (0, _ramda.curry)(function (fn, obj) {
  return (0, _ramda.pipe)(_ramda.toPairs, (0, _ramda.map)((0, _ramda.over)((0, _ramda.lensIndex)(0), fn)), _ramda.fromPairs)(obj);
});
var _default = renameKeysWith;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/repeatStr.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.repeatStrPonyfill = exports.repeatStrInvoker = exports["default"] = void 0;

var _ramda = require("ramda");

var _String = _interopRequireDefault(require("./internal/ponyfills/String.repeat"));

var _isFunction = _interopRequireDefault(require("./isFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var repeatStrPonyfill = (0, _ramda.curry)(_String["default"]);
exports.repeatStrPonyfill = repeatStrPonyfill;
var repeatStrInvoker = (0, _ramda.flip)((0, _ramda.invoker)(1, 'repeat'));
/**
 * Constructs and returns a new string which contains the specified
 * number of copies of the string on which it was called, concatenated together.
 *
 * @func repeatStr
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.11.0|v2.11.0}
 * @category List
 * @sig String -> Number -> String
 * @param {string} value String value to be repeated
 * @param {number} count An integer between 0 and +∞: [0, +∞), indicating the number of times to repeat the string in the newly-created string that is to be returned
 * @return {string} A new string containing the specified number of copies of the given string
 * @example
 *
 * RA.repeatStr('a', 3); //=> 'aaa'
 */

exports.repeatStrInvoker = repeatStrInvoker;
var repeatStr = (0, _isFunction["default"])(String.prototype.repeat) ? repeatStrInvoker : repeatStrPonyfill;
var _default = repeatStr;
exports["default"] = _default;
},{"./internal/ponyfills/String.repeat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.repeat.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/replaceAll.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.replaceAllPonyfill = exports.replaceAllInvoker = exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

var _String = _interopRequireDefault(require("./internal/ponyfills/String.replaceAll"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var replaceAllPonyfill = (0, _ramda.curryN)(3, _String["default"]);
exports.replaceAllPonyfill = replaceAllPonyfill;
var replaceAllInvoker = (0, _ramda.invoker)(2, 'replaceAll');
/**
 * Replaces all substring matches in a string with a replacement.
 *
 * @func replaceAll
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.17.0|v2.17.0}
 * @category String
 * @sig String -> String -> String -> String
 * @param {string} searchValue The substring or a global RegExp to match
 * @param {string} replaceValue The string to replace the matches with
 * @param {string} str The String to do the search and replacement in
 * @return {string} A new string containing all the `searchValue` replaced with the `replaceValue`
 * @throws {TypeError} When invalid arguments provided
 * @see {@link http://ramdajs.com/docs/#replace|R.replace}, {@link https://github.com/tc39/proposal-string-replaceall|TC39 proposal}
 * @example
 *
 * RA.replaceAll('ac', 'ef', 'ac ab ac ab'); //=> 'ef ab ef ab'
 * RA.replaceAll('', '_', 'xxx'); //=> '_x_x_x_'
 * RA.replaceAll(/x/g, 'v', 'xxx'); //=> 'vvv'
 * RA.replaceAll(/x/, 'v', 'xxx'); //=> TypeError
 */

exports.replaceAllInvoker = replaceAllInvoker;
var replaceAll = (0, _isFunction["default"])(String.prototype.replaceAll) ? replaceAllInvoker : replaceAllPonyfill;
var _default = replaceAll;
exports["default"] = _default;
},{"./internal/ponyfills/String.replaceAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.replaceAll.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/resolveP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/* eslint-disable max-len */

/**
 * Composable shortcut for `Promise.resolve`.
 *
 * Returns a Promise object that is resolved with the given value.
 * If the value is a thenable (i.e. has a "then" method), the returned promise will
 * "follow" that thenable, adopting its eventual state.
 *
 * @func resolveP
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.16.0|v1.16.0}
 * @category Function
 * @sig a -> Promise a
 * @param {*} [value=undefined] Argument to be resolved by this Promise. Can also be a Promise or a thenable to resolve
 * @return {Promise} A Promise that is resolved with the given value, or the promise passed as value, if the value was a promise object
 * @see {@link RA.rejectP|rejectP}
 * @example
 *
 * RA.resolveP(); //=> Promise(undefined)
 * RA.resolveP('a'); //=> Promise('a')
 * RA.resolveP([1, 2, 3]); //=> Promise([1, 2, 3])
 */

/* eslint-enable max-len */
var resolveP = (0, _ramda.bind)(Promise.resolve, Promise);
var _default = resolveP;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/round.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns the value of a number rounded to the nearest integer.
 *
 * @func round
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.15.0|v2.15.0}
 * @category Math
 * @sig Number -> Number
 * @param {number} number The number to round
 * @return {number} The value of the given number rounded to the nearest integer
 * @example
 *
 * RA.round(0.9); //=> 1
 * RA.round(5.95); //=> 6
 * RA.round(5.5); //=> 6
 * RA.round(5.05); //=> 5
 * RA.round(-5.05); //=> -5
 * RA.round(-5.5); //=> -5
 * RA.round(-5.95); //=> -6
 */
var round = (0, _ramda.curryN)(1, (0, _ramda.bind)(Math.round, Math));
var _default = round;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/seq.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/* eslint-disable max-len */

/**
 * Runs the given list of functions in order with the supplied object, then returns the object.
 * Also known as the normal order sequencing combinator.
 *
 * Acts as a transducer if a transformer is given as second parameter.
 *
 * @func seq
 * @aliases sequencing
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.3.0|v2.3.0}
 * @category Function
 * @sig [(a -> *), (a -> *), ...] -> a -> a
 * @param {Array} fns The list of functions to call in order with `x` whose return values will be thrown away
 * @param {*} x
 * @return {*} `x`
 * @see {@link http://ramdajs.com/docs/#tap|R.tap}, {@link http://www.cs.rpi.edu/academics/courses/spring11/proglang/handouts/lambda-calculus-chapter.pdf|sequencing combinator explained}
 * @example
 *
 * RA.seq([console.info, console.log])('foo'); //=> prints 'foo' via info then log
 *
 * // usage in composition
 * R.pipe(
 *   R.concat('prefix '),
 *   RA.seq([
 *     console.info, //=> prints 'prefix test'
 *     console.log //=> prints 'prefix test'
 *   ]),
 *   R.toUpper
 * )('test'); //=> 'PREFIX TEST'
 */

/* eslint-enable max-len */
var seq = (0, _ramda.curry)(function (fns, x) {
  return (0, _ramda.tap)(function (tx) {
    return (0, _ramda.map)(function (fn) {
      return fn(tx);
    })(fns);
  })(x);
});
var _default = seq;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/sign.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.signPonyfill = exports["default"] = void 0;

var _ramda = require("ramda");

var _isFunction = _interopRequireDefault(require("./isFunction"));

var _Math = _interopRequireDefault(require("./internal/ponyfills/Math.sign"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var signPonyfill = (0, _ramda.curryN)(1, _Math["default"]);
/**
 * Returns the sign of a number, indicating whether the number is positive, negative or zero.
 *
 * @func sign
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.15.0|v2.15.0}
 * @category Math
 * @sig Number | String -> Number
 * @param {number} number A number
 * @return {number} A number representing the sign of the given argument. If the argument is a positive number, negative number, positive zero or negative zero, the function will return 1, -1, 0 or -0 respectively. Otherwise, NaN is returned
 * @example
 *
 * RA.sign(3); //  1
 * RA.sign(-3); // -1
 * RA.sign('-3'); // -1
 * RA.sign(0); //  0
 * RA.sign(-0); // -0
 * RA.sign(NaN); // NaN
 * RA.sign('foo'); // NaN
 */

exports.signPonyfill = signPonyfill;
var sign = (0, _isFunction["default"])(Math.sign) ? (0, _ramda.curryN)(1, (0, _ramda.bind)(Math.sign, Math)) : signPonyfill;
var _default = sign;
exports["default"] = _default;
},{"./internal/ponyfills/Math.sign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Math.sign.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/skipTake.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * When given a number n and an array, returns an array containing every nth element.
 *
 * @func skipTake
 * @memberOf RA
 * @category List
 * @since {@link https://char0n.github.io/ramda-adjunct/2.26.0|v2.26.0}
 * @sig Number -> [a] -> [a]
 * @param {number} the nth element to extract
 * @param {Array} value the input array
 * @return {Array} An array containing every nth element
 * @example
 *
 * RA.skipTake(2, [1,2,3,4]) //=> [1, 3]
 * RA.skipTake(3, R.range(0, 20)); //=> [0, 3, 6, 9, 12, 15, 18]
 */
var skipTake = (0, _ramda.curry)(function (n, list) {
  return (0, _ramda.addIndex)(_ramda.filter)((0, _ramda.pipe)((0, _ramda.nthArg)(1), (0, _ramda.modulo)(_ramda.__, n), (0, _ramda.identical)(0)))(list);
});
var _default = skipTake;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/sliceFrom.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns the elements of the given list or string (or object with a slice method)
 * from fromIndex (inclusive).
 * Dispatches to the slice method of the second argument, if present.
 *
 * @func sliceFrom
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.16.0|v1.16.0}
 * @category List
 * @sig  Number -> [a] -> [a]
 * @param {number} fromIndex The start index (inclusive)
 * @param {Array|string} list The list or string to slice
 * @return {Array|string} The sliced list or string
 * @see {@link http://ramdajs.com/docs/#slice|R.slice}, {@link RA.sliceTo|sliceTo}
 * @example
 *
 * RA.sliceFrom(1, [1, 2, 3]); //=> [2, 3]
 */
var sliceFrom = (0, _ramda.slice)(_ramda.__, Infinity);
var _default = sliceFrom;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/sliceTo.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns the elements of the given list or string (or object with a slice method)
 * to toIndex (exclusive).
 * Dispatches to the slice method of the second argument, if present.
 *
 * @func sliceTo
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.16.0|v1.16.0}
 * @category List
 * @sig  Number -> [a] -> [a]
 * @param {number} toIndex The end index (exclusive)
 * @param {Array|string} list The list or string to slice
 * @return {Array|string} The sliced list or string
 * @see {@link http://ramdajs.com/docs/#slice|R.slice}, {@link RA.sliceFrom|sliceFrom}
 * @example
 *
 * RA.sliceTo(2, [1, 2, 3]); //=> [1, 2]
 */
var sliceTo = (0, _ramda.slice)(0);
var _default = sliceTo;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/sortByProps.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

/**
 * Sort a list of objects by a list of props (if first prop value is equivalent, sort by second, etc).
 *
 * @func sortByProps
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.26.0|v2.26.0}
 * @category List
 * @sig [k] -> [{k: v}] -> [{k: v}]
 * @param {Array.<string>} props A list of properties in the list param to sort by
 * @param {Array.<object>} list A list of objects to be sorted
 * @return {Array.<object>} A new list sorted by the properties in the props param
 * @example
 *
 * sortByProps(['num'], [{num: 3}, {num: 2}, {num: 1}])
 * //=> [{num: 1}, {num: 2} {num: 3}]
 * sortByProps(['letter', 'num'], [{num: 3, letter: 'a'}, {num: 2, letter: 'a'} {num: 1, letter: 'z'}])
 * //=> [ {num: 2, letter: 'a'}, {num: 3, letter: 'a'}, {num: 1, letter: 'z'}]
 * sortByProps(['name', 'num'], [{num: 3}, {num: 2}, {num: 1}])
 * //=> [{num: 1}, {num: 2}, {num: 3}]
 */
var sortByProps = (0, _ramda.curry)(function (props, list) {
  var firstTruthy = function firstTruthy(_ref) {
    var _ref2 = _toArray(_ref),
        head = _ref2[0],
        tail = _ref2.slice(1);

    return (0, _ramda.reduce)(_ramda.either, head, tail);
  };

  var makeComparator = function makeComparator(propName) {
    return (0, _ramda.comparator)(function (a, b) {
      return (0, _ramda.lt)((0, _ramda.prop)(propName, a), (0, _ramda.prop)(propName, b));
    });
  };

  return (0, _ramda.sort)(firstTruthy((0, _ramda.map)(makeComparator, props)), list);
});
var _default = sortByProps;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/spreadPath.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Spreads object under property path onto provided object.
 * It's like {@link RA.flattenPath|flattenPath}, but removes object under the property path.
 *
 * @func spreadPath
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.19.0|v1.19.0}
 * @category Object
 * @typedef Idx = String | Int
 * @sig [Idx] -> {k: v} -> {k: v}
 * @param {!Array.<string|number>} path The property path to spread
 * @param {!Object} obj The provided object
 * @return {!Object} The result of the spread
 * @see {@link RA.spreadProp|spreadProp}, {@link RA.flattenPath|flattenPath}
 * @example
 *
 * RA.spreadPath(
 *   ['b1', 'b2'],
 *   { a: 1, b1: { b2: { c: 3, d: 4 } } }
 * ); // => { a: 1, c: 3, d: 4, b1: {} };
 */
var spreadPath = (0, _ramda.curryN)(2, (0, _ramda.converge)(_ramda.merge, [_ramda.dissocPath, (0, _ramda.pathOr)({})]));
var _default = spreadPath;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/spreadProp.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _spreadPath = _interopRequireDefault(require("./spreadPath"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Spreads object under property onto provided object.
 * It's like {@link RA.flattenProp|flattenProp}, but removes object under the property.
 *
 * @func spreadProp
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.19.0|v1.19.0}
 * @category Object
 * @typedef Idx = String | Int
 * @sig Idx -> {k: v} -> {k: v}
 * @param {!string|number} prop The property to spread
 * @param {!Object} obj The provided object
 * @return {!Object} The result of the spread
 * @see {@link RA.spreadPath|spreadPath}, {@link RA.flattenProp|flattenProp}
 * @example
 *
 * RA.spreadProp('b', { a: 1, b: { c: 3, d: 4 } }); // => { a: 1, c: 3, d: 4 };
 */
var spreadProp = (0, _ramda.curry)(function (prop, obj) {
  return (0, _spreadPath["default"])((0, _ramda.of)(prop), obj);
});
var _default = spreadProp;
exports["default"] = _default;
},{"./spreadPath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/spreadPath.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubArray.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

/**
 * A function that returns new empty array on every call.
 *
 * @func stubArray
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.1.0|v2.1.0}
 * @category Function
 * @sig ... -> Array
 * @return {Array} New empty array
 * @example
 *
 * RA.stubArray(); //=> []
 * RA.stubArray(1, 2, 3); //=> []
 */
var stubArray = function stubArray() {
  return [];
};

var _default = stubArray;
exports["default"] = _default;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubNull.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * A function that returns `null`.
 *
 * @func stubNull
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.6.0|v1.6.0}
 * @category Function
 * @sig ... -> null
 * @return {null}
 * @example
 *
 * RA.stubNull(); //=> null
 * RA.stubNull(1, 2, 3); //=> null
 */
var stubNull = (0, _ramda.always)(null);
var _default = stubNull;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubObj.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

/**
 * This function returns a new empty object.
 *
 * @func stubObj
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.1.0|v2.1.0}
 * @category Function
 * @sig ... -> Object
 * @aliases stubObject
 * @return {Object} Returns the new empty object.
 * @example
 *
 * RA.stubObj(); //=> {}
 * RA.stubObj(1, 2, 3); //=> {}
 */
var stubObj = function stubObj() {
  return {};
};

var _default = stubObj;
exports["default"] = _default;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubString.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * A function that returns empty string.
 *
 * @func stubString
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.1.0|v2.1.0}
 * @category Function
 * @sig ... -> String
 * @return {string} The empty string
 * @example
 *
 * RA.stubString(); //=> ''
 * RA.stubString(1, 2, 3); //=> ''
 */
var stubString = (0, _ramda.always)('');
var _default = stubString;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/stubUndefined.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * A function that returns `undefined`.
 *
 * @func stubUndefined
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.0.0|v1.0.0}
 * @category Function
 * @sig ... -> undefined
 * @return {undefined}
 * @example
 *
 * RA.stubUndefined(); //=> undefined
 * RA.stubUndefined(1, 2, 3); //=> undefined
 */
var stubUndefined = (0, _ramda.always)(void 0); // eslint-disable-line no-void

var _default = stubUndefined;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/subtractNum.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Subtracts its first argument from its second argument.
 *
 * @func subtractNum
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category Math
 * @sig Number -> Number -> Number
 * @param {number} subtrahend the number to subtract
 * @param {number} minuend the number to subtract from
 * @return {number} A number representing the difference of subtracting the subtrahend from the minuend
 * @example
 *
 * RA.subtractNum(3, 5); //=> 2
 */
var subtractNum = (0, _ramda.flip)(_ramda.subtract);
var _default = subtractNum;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/thenCatchP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.thenCatchP = exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Composable shortcut for `Promise.then` that allows for success and failure callbacks.
 * The thenCatchP function returns a Promise. It takes three arguments: a callback function for the success of the Promise,
 * a callback function for the failure of the Promise, and the promise instance itself.
 *
 * @func thenCatchP
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.27.0|v2.27.0}
 * @category Function
 * @sig (a -> b) -> (c -> d) -> Promise a -> Promise b | d
 * @param {Function} onFulfilled A Function called if the Promise is fulfilled. This function has one argument, the fulfillment value
 * @param {Function} onRejected A Function called if the Promise is rejected. This function has one argument, the error
 * @param {Promise} promise Any Promise or Thenable object
 * @return {Promise}
 * @see {@link RA.resolveP|resolveP}, {@link RA.rejectP|rejectP}, {@link RA.allP|allP}
 * @example
 *
 * const promise = Promise.resolve(1);
 * const add1 = x => x + 1;
 *
 * RA.thenCatchP(add1, console.error, promise); // => Promise(2)
 */
var thenCatchP = (0, _ramda.invoker)(2, 'then');
exports.thenCatchP = thenCatchP;
var _default = thenCatchP;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/thenP.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Composable shortcut for `Promise.then`.
 * The thenP function returns a Promise. It takes two arguments: a callback function for the success of the Promise
 * and the promise instance itself.
 *
 * @func thenP
 * @memberOf RA
 * @aliases then
 * @since {@link https://char0n.github.io/ramda-adjunct/2.8.0|v2.8.0}
 * @deprecated since v2.12.0; available in ramda@0.26.0 as R.then
 * @category Function
 * @sig (a -> Promise b | b) -> Promise b
 * @param {Function} onFulfilled A Function called if the Promise is fulfilled. This function has one argument, the fulfillment value
 * @param {Promise} promise Any Promise or Thenable object
 * @return {Promise} A Promise in the pending status

 * @see {@link RA.resolveP|resolveP}, {@link RA.rejectP|rejectP}, {@link RA.allP|allP}
 * @example
 *
 * const promise = Promise.resolve(1);
 * const add1 = v => v + 1;
 *
 * RA.thenP(add1, promise); // => Promise(2)
 */
var thenP = (0, _ramda.invoker)(1, 'then');
var _default = thenP;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/toArray.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.fromPonyfill = exports["default"] = void 0;

var _ramda = require("ramda");

var _isIterable = _interopRequireDefault(require("./isIterable"));

var _isFunction = _interopRequireDefault(require("./isFunction"));

var _Array = _interopRequireDefault(require("./internal/ponyfills/Array.from"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var fromPonyfill = (0, _ramda.curryN)(1, _Array["default"]);
exports.fromPonyfill = fromPonyfill;
var fromArray = (0, _isFunction["default"])(Array.from) ? (0, _ramda.curryN)(1, Array.from) : fromPonyfill;
/**
 * Converts value to an array.
 *
 * @func toArray
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category List
 * @sig * -> [a]
 * @param {*} val The value to convert
 * @return {Array}
 * @example
 *
 * RA.toArray([1, 2]); //=> [1, 2]
 * RA.toArray({'foo': 1, 'bar': 2}); //=> [1, 2]
 * RA.toArray('abc'); //=> ['a', 'b', 'c']
 * RA.toArray(1); //=> []
 * RA.toArray(null); //=> []
 */

var toArray = (0, _ramda.ifElse)(_isIterable["default"], fromArray, _ramda.values);
var _default = toArray;
exports["default"] = _default;
},{"./internal/ponyfills/Array.from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Array.from.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","./isIterable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isIterable.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/toInteger32.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Converts double-precision 64-bit binary format IEEE 754 to signed 32 bit integer number.
 *
 * @func toInteger32
 * @aliases toInt32
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.28.0|v2.28.0}
 * @category Math
 * @sig Number -> Number
 * @param {number} number A number
 * @return {number} A signed 32-bit integer number
 * @see {@link RA.toUInteger32|toUInteger32}, {@link http://speakingjs.com/es5/ch11.html#integers_via_bitwise_operators}
 * @example
 *
 * RA.toInteger32(2 ** 35); // => 0
 * RA.toInteger32(2 ** 30); // => 1073741824
 */
// eslint-disable-next-line no-bitwise
var toInteger32 = (0, _ramda.curryN)(1, function (val) {
  return val >> 0;
});
var _default = toInteger32;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/toNumber.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _isCoercible = _interopRequireDefault(require("./internal/isCoercible"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Converts value to a number.
 *
 * @func toNumber
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.36.0|v2.36.0}
 * @category Type
 * @param {*} val The value to convert
 * @return {Number}
 * @example
 *
 * RA.toNumber(3.2); //=> 3.2
 * RA.toNumber(Number.MIN_VALUE); //=> 5e-324
 * RA.toNumber(Infinity); //=> Infinity
 * RA.toNumber('3.2'); //=> 3.2
 * RA.toNumber(Symbol('3.2')); //=> NaN
 */
var toNumber = (0, _ramda.ifElse)(_isCoercible["default"], Number, (0, _ramda.always)(NaN));
var _default = toNumber;
exports["default"] = _default;
},{"./internal/isCoercible":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/isCoercible.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/toUinteger32.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Converts double-precision 64-bit binary format IEEE 754 to unsigned 32 bit integer number.
 *
 * @func toUinteger32
 * @aliases toUint32
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.28.0|v2.28.0}
 * @category Math
 * @sig Number -> Number
 * @param {number} val Value to be converted.
 * @return {number}
 * @see {@link RA.toInteger32|toInteger32}, {@link http://speakingjs.com/es5/ch11.html#integers_via_bitwise_operators}
 * @example
 *
 * RA.toUinteger32(1.5); //=> 1
 * RA.toInteger32(2 ** 35); // => 0
 * RA.toInteger32(2 ** 31); // => 2147483648
 * RA.toInteger32(2 ** 30); // => 1073741824
 */
// eslint-disable-next-line no-bitwise
var toUinteger32 = (0, _ramda.curryN)(1, function (val) {
  return val >>> 0;
});
var _default = toUinteger32;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/trimCharsEnd.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _contained = _interopRequireDefault(require("./contained"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Removes specified characters from the end of a string.
 *
 * @func trimCharsEnd
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.25.0|v2.25.0}
 * @category String
 * @sig String -> String
 * @param {string} chars The characters to trim
 * @param {string} value The string to trim
 * @return {string} Returns the trimmed string.
 * @example
 *
 * RA.trimCharsEnd('_-', '-_-abc-_-'); //=> '-_-abc'
 */
var trimCharsEnd = (0, _ramda.curry)(function (chars, value) {
  return (0, _ramda.pipe)((0, _ramda.split)(''), (0, _ramda.dropLastWhile)((0, _contained["default"])(chars)), (0, _ramda.join)(''))(value);
});
var _default = trimCharsEnd;
exports["default"] = _default;
},{"./contained":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/contained.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/trimCharsStart.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _contained = _interopRequireDefault(require("./contained"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Removes specified characters from the beginning of a string.
 *
 * @func trimCharsStart
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.24.0|v2.24.0}
 * @category String
 * @sig String -> String
 * @param {string} chars The characters to trim
 * @param {string} value The string to trim
 * @return {string} Returns the trimmed string.
 * @example
 *
 * RA.trimCharsStart('_-', '-_-abc-_-'); //=> 'abc-_-'
 */
var trimCharsStart = (0, _ramda.curry)(function (chars, value) {
  return (0, _ramda.pipe)((0, _ramda.split)(''), (0, _ramda.dropWhile)((0, _contained["default"])(chars)), (0, _ramda.join)(''))(value);
});
var _default = trimCharsStart;
exports["default"] = _default;
},{"./contained":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/contained.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/trimEnd.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.trimEndPonyfill = exports.trimEndInvoker = exports["default"] = void 0;

var _ramda = require("ramda");

var _String = _interopRequireDefault(require("./internal/ponyfills/String.trimEnd"));

var _isFunction = _interopRequireDefault(require("./isFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var trimEndPonyfill = _String["default"];
exports.trimEndPonyfill = trimEndPonyfill;
var trimEndInvoker = (0, _ramda.invoker)(0, 'trimEnd');
/**
 * Removes whitespace from the end of a string.
 *
 * @func trimEnd
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category String
 * @sig String -> String
 * @param {string} value String value to have the whitespace removed from the end
 * @return {string} A new string representing the calling string stripped of whitespace from its end (right end).
 * @see {@link RA.trimEnd|trimEnd}
 * @example
 *
 * RA.trimEnd('abc   '); //=> 'abc'
 */

exports.trimEndInvoker = trimEndInvoker;
var trimEnd = (0, _isFunction["default"])(String.prototype.trimEnd) ? trimEndInvoker : trimEndPonyfill;
var _default = trimEnd;
exports["default"] = _default;
},{"./internal/ponyfills/String.trimEnd":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.trimEnd.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/trimStart.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.trimStartPonyfill = exports.trimStartInvoker = exports["default"] = void 0;

var _ramda = require("ramda");

var _String = _interopRequireDefault(require("./internal/ponyfills/String.trimStart"));

var _isFunction = _interopRequireDefault(require("./isFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var trimStartPonyfill = _String["default"];
exports.trimStartPonyfill = trimStartPonyfill;
var trimStartInvoker = (0, _ramda.invoker)(0, 'trimStart');
/**
 * Removes whitespace from the beginning of a string.
 *
 * @func trimStart
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @category String
 * @sig String -> String
 * @param {string} value String value to have the whitespace removed from the beginning
 * @return {string} A new string representing the calling string stripped of whitespace from its beginning (left end).
 * @example
 *
 * RA.trimStart('  abc'); //=> 'abc'
 */

exports.trimStartInvoker = trimStartInvoker;
var trimStart = (0, _isFunction["default"])(String.prototype.trimStart) ? trimStartInvoker : trimStartPonyfill;
var _default = trimStart;
exports["default"] = _default;
},{"./internal/ponyfills/String.trimStart":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/String.trimStart.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/trunc.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports.truncPonyfill = exports["default"] = void 0;

var _ramda = require("ramda");

var _Math = _interopRequireDefault(require("./internal/ponyfills/Math.trunc"));

var _isFunction = _interopRequireDefault(require("./isFunction"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

var truncPonyfill = (0, _ramda.curryN)(1, _Math["default"]);
/**
 * Returns the integer part of a number by removing any fractional digits.
 *
 * @func trunc
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/2.15.0|v2.15.0}
 * @category Math
 * @sig Number | String -> Number
 * @param {number|string} number The number to trunc
 * @return {number} The integer part of the given number
 * @example
 *
 * RA.trunc(13.37); //=> 13
 * RA.trunc(42.84); //=> 42
 * RA.trunc(0.123); //=>  0
 * RA.trunc(-0.123); //=> -0
 * RA.trunc('-1.123'); //=> -1
 * RA.trunc(NaN); //=> NaN
 * RA.trunc('foo'); //=> NaN
 */

exports.truncPonyfill = truncPonyfill;
var trunc = (0, _isFunction["default"])(Math.trunc) ? (0, _ramda.curryN)(1, (0, _ramda.bind)(Math.trunc, Math)) : truncPonyfill;
var _default = trunc;
exports["default"] = _default;
},{"./internal/ponyfills/Math.trunc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/internal/ponyfills/Math.trunc.js","./isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/isFunction.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/unzipObjWith.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

var _lengthEq = _interopRequireDefault(require("./lengthEq"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/**
 * Creates a new list out of the supplied object by applying the function to each key/value pairing.
 *
 * @func unzipObjWith
 * @memberOf RA
 * @category Object
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @sig  (v, k) => [k, v] -> { k: v } -> [[k], [v]]
 * @param {Function} fn The function to transform each value-key pair
 * @param {Object} obj Object to unzip
 * @return {Array} A pair of tw lists: a list of keys and a list of values
 * @see {@link https://ramdajs.com/docs/#zipObj|zipObj}, {@link RA.zipObjWith|zipObjWith}
 * @example
 *
 * RA.unzipObjWith((v, k) => [`new${k.toUpperCase()}`, 2 * v], { a: 1, b: 2, c: 3 });
 * //=> [['newA', 'newB', 'newC'], [2, 4, 6]]
 */
var unzipObjWith = (0, _ramda.curryN)(2, function (fn, obj) {
  return (0, _ramda.pipe)(_ramda.toPairs, (0, _ramda.map)((0, _ramda.pipe)(_ramda.flip, _ramda.apply)(fn)), _ramda.transpose, (0, _ramda.when)((0, _lengthEq["default"])(0), function () {
    return [[], []];
  }))(obj);
});
var _default = unzipObjWith;
exports["default"] = _default;
},{"./lengthEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/lengthEq.js","ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/viewOr.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Returns a "view" of the given data structure, determined by the given lens.
 * The lens's focus determines which portion of the data structure is visible.
 * Returns the defaultValue if "view" is null, undefined or NaN; otherwise the "view" is returned.
 *
 * @func viewOr
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.13.0|1.13.0}
 * @category Object
 * @typedef Lens s b = Functor f => (b -> f b) -> s -> f s
 * @sig a -> Lens s b -> s -> b | a
 * @see {@link http://ramdajs.com/docs/#view|R.view}
 * @param {*} defaultValue The default value
 * @param {Function} lens Van Laarhoven lens
 * @param {*} data The data structure
 * @returns {*} "view" or defaultValue
 *
 * @example
 *
 * RA.viewOr('N/A', R.lensProp('x'), {}); // => 'N/A'
 * RA.viewOr('N/A', R.lensProp('x'), { x: 1 }); // => 1
 * RA.viewOr('some', R.lensProp('y'), { y: null }); // => 'some'
 * RA.viewOr('some', R.lensProp('y'), { y: false }); // => false
 */
var viewOr = (0, _ramda.curryN)(3, function (defaultValue, lens, data) {
  return (0, _ramda.defaultTo)(defaultValue, (0, _ramda.view)(lens, data));
});
var _default = viewOr;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/weave.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Weaves a configuration into function returning the runnable monad like `Reader` or `Free`.
 * This allows us to pre-bind the configuration in advance and use the weaved function
 * without need to explicitly pass the configuration on every call.
 *
 * @func weave
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.7.0|v1.7.0}
 * @category Function
 * @sig (*... -> *) -> * -> (*... -> *)
 * @param {Function} fn The function to weave
 * @param {*} config The configuration to weave into fn
 * @return {Function} Auto-curried weaved function
 * @example
 *
 * const { Reader: reader } = require('monet');
 *
 * const log = value => reader(
 *   config => config.log(value)
 * );
 *
 * // no weaving
 * log('test').run(console); //=> prints 'test'
 *
 * // weaving
 * const wlog = RA.weave(log, console);
 * wlog('test'); //=> prints 'test'
 */
var weave = (0, _ramda.curryN)(2, function (fn, config) {
  return (0, _ramda.curryN)(fn.length, function () {
    return fn.apply(void 0, arguments).run(config);
  });
});
var _default = weave;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/weaveLazy.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Weaves a configuration into function returning the runnable monad like `Reader` or `Free`.
 * This allows us to pre-bind the configuration in advance and use the weaved function
 * without need to explicitly pass the configuration on every call.
 *
 * @func weaveLazy
 * @memberOf RA
 * @since {@link https://char0n.github.io/ramda-adjunct/1.10.0|v1.10.0}
 * @category Function
 * @sig (*... -> *) -> (* -> *) -> (*... -> *)
 * @param {Function} fn The function to weave
 * @param {Function} configAccessor The function that returns the configuration object
 * @return {Function} Auto-curried weaved function
 * @example
 *
 * const { Reader: reader } = require('monet');
 *
 * const log = value => reader(
 *   config => config.log(value)
 * );
 *
 * const consoleAccessor = R.always(console);
 *
 * // no weaving
 * log('test').run(console); //=> prints 'test'
 *
 * // weaving
 * const wlog = RA.weaveLazy(log, consoleAccessor);
 * wlog('test'); //=> prints 'test'
 */
var weaveLazy = (0, _ramda.curryN)(2, function (fn, configAccessor) {
  return (0, _ramda.curryN)(fn.length, function () {
    return fn.apply(void 0, arguments).run(configAccessor());
  });
});
var _default = weaveLazy;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda-adjunct/lib/zipObjWith.js":[function(require,module,exports){
"use strict";

exports.__esModule = true;
exports["default"] = void 0;

var _ramda = require("ramda");

/**
 * Creates a new object out of a list of keys and a list of values by applying the function
 * to each equally-positioned pair in the lists.
 * Key/value pairing is truncated to the length of the shorter of the two lists.
 *
 * @func zipObjWith
 * @memberOf RA
 * @category Object
 * @since {@link https://char0n.github.io/ramda-adjunct/2.22.0|v2.22.0}
 * @sig (b, a) -> [k, v] -> [a] -> [b] -> { k: v }
 * @param {Function} fn The function to transform each value-key pair
 * @param {Array} keys Array to transform into the properties on the output object
 * @param {Array} values Array to transform into the values on the output object
 * @return {Object}  The object made by pairing up and transforming same-indexed elements of `keys` and `values`.
 * @see {@link https://ramdajs.com/docs/#zipObj|zipObj}, {@link RA.unzipObjWith|unzipObjWith}
 * @example
 *
 * RA.zipObjWith((value, key) => [key, `${key}${value + 1}`]), ['a', 'b', 'c'], [1, 2, 3]);
 *  // => { a: 'a2', b: 'b3', c: 'c4' }
 */
var zipObjWith = (0, _ramda.curryN)(3, function (fn, keys, values) {
  return (0, _ramda.pipe)(_ramda.zip, (0, _ramda.map)((0, _ramda.apply)(fn)), _ramda.fromPairs)(values, keys);
});
var _default = zipObjWith;
exports["default"] = _default;
},{"ramda":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/F.js":[function(require,module,exports){


/**
 * A function that always returns `false`. Any passed in parameters are ignored.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig * -> Boolean
 * @param {*}
 * @return {Boolean}
 * @see R.T
 * @example
 *
 *      R.F(); //=> false
 */
var F = function () {
  return false;
};
module.exports = F;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/T.js":[function(require,module,exports){


/**
 * A function that always returns `true`. Any passed in parameters are ignored.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig * -> Boolean
 * @param {*}
 * @return {Boolean}
 * @see R.F
 * @example
 *
 *      R.T(); //=> true
 */
var T = function () {
  return true;
};
module.exports = T;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/__.js":[function(require,module,exports){
/**
 * A special placeholder value used to specify "gaps" within curried functions,
 * allowing partial application of any combination of arguments, regardless of
 * their positions.
 *
 * If `g` is a curried ternary function and `_` is `R.__`, the following are
 * equivalent:
 *
 *   - `g(1, 2, 3)`
 *   - `g(_, 2, 3)(1)`
 *   - `g(_, _, 3)(1)(2)`
 *   - `g(_, _, 3)(1, 2)`
 *   - `g(_, 2, _)(1, 3)`
 *   - `g(_, 2)(1)(3)`
 *   - `g(_, 2)(1, 3)`
 *   - `g(_, 2)(_, 3)(1)`
 *
 * @name __
 * @constant
 * @memberOf R
 * @since v0.6.0
 * @category Function
 * @example
 *
 *      const greet = R.replace('{name}', R.__, 'Hello, {name}!');
 *      greet('Alice'); //=> 'Hello, Alice!'
 */
module.exports = { '@@functional/placeholder': true };
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/add.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Adds two values.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a
 * @param {Number} b
 * @return {Number}
 * @see R.subtract
 * @example
 *
 *      R.add(2, 3);       //=>  5
 *      R.add(7)(10);      //=> 17
 */


var add = /*#__PURE__*/_curry2(function add(a, b) {
  return Number(a) + Number(b);
});
module.exports = add;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/addIndex.js":[function(require,module,exports){
var _concat = /*#__PURE__*/require('./internal/_concat');

var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var curryN = /*#__PURE__*/require('./curryN');

/**
 * Creates a new list iteration function from an existing one by adding two new
 * parameters to its callback function: the current index, and the entire list.
 *
 * This would turn, for instance, [`R.map`](#map) function into one that
 * more closely resembles `Array.prototype.map`. Note that this will only work
 * for functions in which the iteration callback function is the first
 * parameter, and where the list is the last parameter. (This latter might be
 * unimportant if the list parameter is not used.)
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category Function
 * @category List
 * @sig ((a ... -> b) ... -> [a] -> *) -> ((a ..., Int, [a] -> b) ... -> [a] -> *)
 * @param {Function} fn A list iteration function that does not pass index or list to its callback
 * @return {Function} An altered list iteration function that passes (item, index, list) to its callback
 * @example
 *
 *      const mapIndexed = R.addIndex(R.map);
 *      mapIndexed((val, idx) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']);
 *      //=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r']
 */


var addIndex = /*#__PURE__*/_curry1(function addIndex(fn) {
  return curryN(fn.length, function () {
    var idx = 0;
    var origFn = arguments[0];
    var list = arguments[arguments.length - 1];
    var args = Array.prototype.slice.call(arguments, 0);
    args[0] = function () {
      var result = origFn.apply(this, _concat(arguments, [idx, list]));
      idx += 1;
      return result;
    };
    return fn.apply(this, args);
  });
});
module.exports = addIndex;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/adjust.js":[function(require,module,exports){
var _concat = /*#__PURE__*/require('./internal/_concat');

var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Applies a function to the value at the given index of an array, returning a
 * new copy of the array with the element at the given index replaced with the
 * result of the function application.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig Number -> (a -> a) -> [a] -> [a]
 * @param {Number} idx The index.
 * @param {Function} fn The function to apply.
 * @param {Array|Arguments} list An array-like object whose value
 *        at the supplied index will be replaced.
 * @return {Array} A copy of the supplied array-like object with
 *         the element at index `idx` replaced with the value
 *         returned by applying `fn` to the existing element.
 * @see R.update
 * @example
 *
 *      R.adjust(1, R.toUpper, ['a', 'b', 'c', 'd']);      //=> ['a', 'B', 'c', 'd']
 *      R.adjust(-1, R.toUpper, ['a', 'b', 'c', 'd']);     //=> ['a', 'b', 'c', 'D']
 * @symb R.adjust(-1, f, [a, b]) = [a, f(b)]
 * @symb R.adjust(0, f, [a, b]) = [f(a), b]
 */


var adjust = /*#__PURE__*/_curry3(function adjust(idx, fn, list) {
  if (idx >= list.length || idx < -list.length) {
    return list;
  }
  var start = idx < 0 ? list.length : 0;
  var _idx = start + idx;
  var _list = _concat(list);
  _list[_idx] = fn(list[_idx]);
  return _list;
});
module.exports = adjust;
},{"./internal/_concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/all.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xall = /*#__PURE__*/require('./internal/_xall');

/**
 * Returns `true` if all elements of the list match the predicate, `false` if
 * there are any that don't.
 *
 * Dispatches to the `all` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> Boolean
 * @param {Function} fn The predicate function.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if the predicate is satisfied by every element, `false`
 *         otherwise.
 * @see R.any, R.none, R.transduce
 * @example
 *
 *      const equals3 = R.equals(3);
 *      R.all(equals3)([3, 3, 3, 3]); //=> true
 *      R.all(equals3)([3, 3, 1, 3]); //=> false
 */


var all = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['all'], _xall, function all(fn, list) {
  var idx = 0;
  while (idx < list.length) {
    if (!fn(list[idx])) {
      return false;
    }
    idx += 1;
  }
  return true;
}));
module.exports = all;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xall":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xall.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/allPass.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var curryN = /*#__PURE__*/require('./curryN');

var max = /*#__PURE__*/require('./max');

var pluck = /*#__PURE__*/require('./pluck');

var reduce = /*#__PURE__*/require('./reduce');

/**
 * Takes a list of predicates and returns a predicate that returns true for a
 * given list of arguments if every one of the provided predicates is satisfied
 * by those arguments.
 *
 * The function returned is a curried function whose arity matches that of the
 * highest-arity predicate.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Logic
 * @sig [(*... -> Boolean)] -> (*... -> Boolean)
 * @param {Array} predicates An array of predicates to check
 * @return {Function} The combined predicate
 * @see R.anyPass
 * @example
 *
 *      const isQueen = R.propEq('rank', 'Q');
 *      const isSpade = R.propEq('suit', '♠︎');
 *      const isQueenOfSpades = R.allPass([isQueen, isSpade]);
 *
 *      isQueenOfSpades({rank: 'Q', suit: '♣︎'}); //=> false
 *      isQueenOfSpades({rank: 'Q', suit: '♠︎'}); //=> true
 */


var allPass = /*#__PURE__*/_curry1(function allPass(preds) {
  return curryN(reduce(max, 0, pluck('length', preds)), function () {
    var idx = 0;
    var len = preds.length;
    while (idx < len) {
      if (!preds[idx].apply(this, arguments)) {
        return false;
      }
      idx += 1;
    }
    return true;
  });
});
module.exports = allPass;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./max":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/max.js","./pluck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pluck.js","./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/always.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Returns a function that always returns the given value. Note that for
 * non-primitives the value returned is a reference to the original value.
 *
 * This function is known as `const`, `constant`, or `K` (for K combinator) in
 * other languages and libraries.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig a -> (* -> a)
 * @param {*} val The value to wrap in a function
 * @return {Function} A Function :: * -> val.
 * @example
 *
 *      const t = R.always('Tee');
 *      t(); //=> 'Tee'
 */


var always = /*#__PURE__*/_curry1(function always(val) {
  return function () {
    return val;
  };
});
module.exports = always;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/and.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns `true` if both arguments are `true`; `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig a -> b -> a | b
 * @param {Any} a
 * @param {Any} b
 * @return {Any} the first argument if it is falsy, otherwise the second argument.
 * @see R.both
 * @example
 *
 *      R.and(true, true); //=> true
 *      R.and(true, false); //=> false
 *      R.and(false, true); //=> false
 *      R.and(false, false); //=> false
 */


var and = /*#__PURE__*/_curry2(function and(a, b) {
  return a && b;
});
module.exports = and;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/any.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xany = /*#__PURE__*/require('./internal/_xany');

/**
 * Returns `true` if at least one of the elements of the list match the predicate,
 * `false` otherwise.
 *
 * Dispatches to the `any` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> Boolean
 * @param {Function} fn The predicate function.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false`
 *         otherwise.
 * @see R.all, R.none, R.transduce
 * @example
 *
 *      const lessThan0 = R.flip(R.lt)(0);
 *      const lessThan2 = R.flip(R.lt)(2);
 *      R.any(lessThan0)([1, 2]); //=> false
 *      R.any(lessThan2)([1, 2]); //=> true
 */


var any = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['any'], _xany, function any(fn, list) {
  var idx = 0;
  while (idx < list.length) {
    if (fn(list[idx])) {
      return true;
    }
    idx += 1;
  }
  return false;
}));
module.exports = any;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xany":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xany.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/anyPass.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var curryN = /*#__PURE__*/require('./curryN');

var max = /*#__PURE__*/require('./max');

var pluck = /*#__PURE__*/require('./pluck');

var reduce = /*#__PURE__*/require('./reduce');

/**
 * Takes a list of predicates and returns a predicate that returns true for a
 * given list of arguments if at least one of the provided predicates is
 * satisfied by those arguments.
 *
 * The function returned is a curried function whose arity matches that of the
 * highest-arity predicate.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Logic
 * @sig [(*... -> Boolean)] -> (*... -> Boolean)
 * @param {Array} predicates An array of predicates to check
 * @return {Function} The combined predicate
 * @see R.allPass
 * @example
 *
 *      const isClub = R.propEq('suit', '♣');
 *      const isSpade = R.propEq('suit', '♠');
 *      const isBlackCard = R.anyPass([isClub, isSpade]);
 *
 *      isBlackCard({rank: '10', suit: '♣'}); //=> true
 *      isBlackCard({rank: 'Q', suit: '♠'}); //=> true
 *      isBlackCard({rank: 'Q', suit: '♦'}); //=> false
 */


var anyPass = /*#__PURE__*/_curry1(function anyPass(preds) {
  return curryN(reduce(max, 0, pluck('length', preds)), function () {
    var idx = 0;
    var len = preds.length;
    while (idx < len) {
      if (preds[idx].apply(this, arguments)) {
        return true;
      }
      idx += 1;
    }
    return false;
  });
});
module.exports = anyPass;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./max":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/max.js","./pluck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pluck.js","./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/ap.js":[function(require,module,exports){
var _concat = /*#__PURE__*/require('./internal/_concat');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _reduce = /*#__PURE__*/require('./internal/_reduce');

var map = /*#__PURE__*/require('./map');

/**
 * ap applies a list of functions to a list of values.
 *
 * Dispatches to the `ap` method of the second argument, if present. Also
 * treats curried functions as applicatives.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Function
 * @sig [a -> b] -> [a] -> [b]
 * @sig Apply f => f (a -> b) -> f a -> f b
 * @sig (r -> a -> b) -> (r -> a) -> (r -> b)
 * @param {*} applyF
 * @param {*} applyX
 * @return {*}
 * @example
 *
 *      R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6]
 *      R.ap([R.concat('tasty '), R.toUpper], ['pizza', 'salad']); //=> ["tasty pizza", "tasty salad", "PIZZA", "SALAD"]
 *
 *      // R.ap can also be used as S combinator
 *      // when only two functions are passed
 *      R.ap(R.concat, R.toUpper)('Ramda') //=> 'RamdaRAMDA'
 * @symb R.ap([f, g], [a, b]) = [f(a), f(b), g(a), g(b)]
 */


var ap = /*#__PURE__*/_curry2(function ap(applyF, applyX) {
  return typeof applyX['fantasy-land/ap'] === 'function' ? applyX['fantasy-land/ap'](applyF) : typeof applyF.ap === 'function' ? applyF.ap(applyX) : typeof applyF === 'function' ? function (x) {
    return applyF(x)(applyX(x));
  } : _reduce(function (acc, f) {
    return _concat(acc, map(f, applyX));
  }, [], applyF);
});
module.exports = ap;
},{"./internal/_concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/aperture.js":[function(require,module,exports){
var _aperture = /*#__PURE__*/require('./internal/_aperture');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xaperture = /*#__PURE__*/require('./internal/_xaperture');

/**
 * Returns a new list, composed of n-tuples of consecutive elements. If `n` is
 * greater than the length of the list, an empty list is returned.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig Number -> [a] -> [[a]]
 * @param {Number} n The size of the tuples to create
 * @param {Array} list The list to split into `n`-length tuples
 * @return {Array} The resulting list of `n`-length tuples
 * @see R.transduce
 * @example
 *
 *      R.aperture(2, [1, 2, 3, 4, 5]); //=> [[1, 2], [2, 3], [3, 4], [4, 5]]
 *      R.aperture(3, [1, 2, 3, 4, 5]); //=> [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
 *      R.aperture(7, [1, 2, 3, 4, 5]); //=> []
 */


var aperture = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable([], _xaperture, _aperture));
module.exports = aperture;
},{"./internal/_aperture":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_aperture.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xaperture":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xaperture.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/append.js":[function(require,module,exports){
var _concat = /*#__PURE__*/require('./internal/_concat');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns a new list containing the contents of the given list, followed by
 * the given element.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> [a]
 * @param {*} el The element to add to the end of the new list.
 * @param {Array} list The list of elements to add a new item to.
 *        list.
 * @return {Array} A new list containing the elements of the old list followed by `el`.
 * @see R.prepend
 * @example
 *
 *      R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests']
 *      R.append('tests', []); //=> ['tests']
 *      R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']]
 */


var append = /*#__PURE__*/_curry2(function append(el, list) {
  return _concat(list, [el]);
});
module.exports = append;
},{"./internal/_concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/apply.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Applies function `fn` to the argument list `args`. This is useful for
 * creating a fixed-arity function from a variadic function. `fn` should be a
 * bound function if context is significant.
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Function
 * @sig (*... -> a) -> [*] -> a
 * @param {Function} fn The function which will be called with `args`
 * @param {Array} args The arguments to call `fn` with
 * @return {*} result The result, equivalent to `fn(...args)`
 * @see R.call, R.unapply
 * @example
 *
 *      const nums = [1, 2, 3, -99, 42, 6, 7];
 *      R.apply(Math.max, nums); //=> 42
 * @symb R.apply(f, [a, b, c]) = f(a, b, c)
 */


var apply = /*#__PURE__*/_curry2(function apply(fn, args) {
  return fn.apply(this, args);
});
module.exports = apply;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/applySpec.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var apply = /*#__PURE__*/require('./apply');

var curryN = /*#__PURE__*/require('./curryN');

var max = /*#__PURE__*/require('./max');

var pluck = /*#__PURE__*/require('./pluck');

var reduce = /*#__PURE__*/require('./reduce');

var keys = /*#__PURE__*/require('./keys');

var values = /*#__PURE__*/require('./values');

// Use custom mapValues function to avoid issues with specs that include a "map" key and R.map
// delegating calls to .map


function mapValues(fn, obj) {
  return keys(obj).reduce(function (acc, key) {
    acc[key] = fn(obj[key]);
    return acc;
  }, {});
}

/**
 * Given a spec object recursively mapping properties to functions, creates a
 * function producing an object of the same structure, by mapping each property
 * to the result of calling its associated function with the supplied arguments.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Function
 * @sig {k: ((a, b, ..., m) -> v)} -> ((a, b, ..., m) -> {k: v})
 * @param {Object} spec an object recursively mapping properties to functions for
 *        producing the values for these properties.
 * @return {Function} A function that returns an object of the same structure
 * as `spec', with each property set to the value returned by calling its
 * associated function with the supplied arguments.
 * @see R.converge, R.juxt
 * @example
 *
 *      const getMetrics = R.applySpec({
 *        sum: R.add,
 *        nested: { mul: R.multiply }
 *      });
 *      getMetrics(2, 4); // => { sum: 6, nested: { mul: 8 } }
 * @symb R.applySpec({ x: f, y: { z: g } })(a, b) = { x: f(a, b), y: { z: g(a, b) } }
 */
var applySpec = /*#__PURE__*/_curry1(function applySpec(spec) {
  spec = mapValues(function (v) {
    return typeof v == 'function' ? v : applySpec(v);
  }, spec);

  return curryN(reduce(max, 0, pluck('length', values(spec))), function () {
    var args = arguments;
    return mapValues(function (f) {
      return apply(f, args);
    }, spec);
  });
});
module.exports = applySpec;
},{"./apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/apply.js","./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js","./max":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/max.js","./pluck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pluck.js","./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduce.js","./values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/values.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/applyTo.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Takes a value and applies a function to it.
 *
 * This function is also known as the `thrush` combinator.
 *
 * @func
 * @memberOf R
 * @since v0.25.0
 * @category Function
 * @sig a -> (a -> b) -> b
 * @param {*} x The value
 * @param {Function} f The function to apply
 * @return {*} The result of applying `f` to `x`
 * @example
 *
 *      const t42 = R.applyTo(42);
 *      t42(R.identity); //=> 42
 *      t42(R.add(1)); //=> 43
 */


var applyTo = /*#__PURE__*/_curry2(function applyTo(x, f) {
  return f(x);
});
module.exports = applyTo;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/ascend.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Makes an ascending comparator function out of a function that returns a value
 * that can be compared with `<` and `>`.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Function
 * @sig Ord b => (a -> b) -> a -> a -> Number
 * @param {Function} fn A function of arity one that returns a value that can be compared
 * @param {*} a The first item to be compared.
 * @param {*} b The second item to be compared.
 * @return {Number} `-1` if fn(a) < fn(b), `1` if fn(b) < fn(a), otherwise `0`
 * @see R.descend
 * @example
 *
 *      const byAge = R.ascend(R.prop('age'));
 *      const people = [
 *        { name: 'Emma', age: 70 },
 *        { name: 'Peter', age: 78 },
 *        { name: 'Mikhail', age: 62 },
 *      ];
 *      const peopleByYoungestFirst = R.sort(byAge, people);
 *        //=> [{ name: 'Mikhail', age: 62 },{ name: 'Emma', age: 70 }, { name: 'Peter', age: 78 }]
 */


var ascend = /*#__PURE__*/_curry3(function ascend(fn, a, b) {
  var aa = fn(a);
  var bb = fn(b);
  return aa < bb ? -1 : aa > bb ? 1 : 0;
});
module.exports = ascend;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/assoc.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Makes a shallow clone of an object, setting or overriding the specified
 * property with the given value. Note that this copies and flattens prototype
 * properties onto the new object as well. All non-primitive properties are
 * copied by reference.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @sig String -> a -> {k: v} -> {k: v}
 * @param {String} prop The property name to set
 * @param {*} val The new value
 * @param {Object} obj The object to clone
 * @return {Object} A new object equivalent to the original except for the changed property.
 * @see R.dissoc, R.pick
 * @example
 *
 *      R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3}
 */


var assoc = /*#__PURE__*/_curry3(function assoc(prop, val, obj) {
  var result = {};
  for (var p in obj) {
    result[p] = obj[p];
  }
  result[prop] = val;
  return result;
});
module.exports = assoc;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/assocPath.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var _has = /*#__PURE__*/require('./internal/_has');

var _isArray = /*#__PURE__*/require('./internal/_isArray');

var _isInteger = /*#__PURE__*/require('./internal/_isInteger');

var assoc = /*#__PURE__*/require('./assoc');

var isNil = /*#__PURE__*/require('./isNil');

/**
 * Makes a shallow clone of an object, setting or overriding the nodes required
 * to create the given path, and placing the specific value at the tail end of
 * that path. Note that this copies and flattens prototype properties onto the
 * new object as well. All non-primitive properties are copied by reference.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @typedefn Idx = String | Int
 * @sig [Idx] -> a -> {a} -> {a}
 * @param {Array} path the path to set
 * @param {*} val The new value
 * @param {Object} obj The object to clone
 * @return {Object} A new object equivalent to the original except along the specified path.
 * @see R.dissocPath
 * @example
 *
 *      R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}}
 *
 *      // Any missing or non-object keys in path will be overridden
 *      R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}}
 */


var assocPath = /*#__PURE__*/_curry3(function assocPath(path, val, obj) {
  if (path.length === 0) {
    return val;
  }
  var idx = path[0];
  if (path.length > 1) {
    var nextObj = !isNil(obj) && _has(idx, obj) ? obj[idx] : _isInteger(path[1]) ? [] : {};
    val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj);
  }
  if (_isInteger(idx) && _isArray(obj)) {
    var arr = [].concat(obj);
    arr[idx] = val;
    return arr;
  } else {
    return assoc(idx, val, obj);
  }
});
module.exports = assocPath;
},{"./assoc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/assoc.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./internal/_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js","./internal/_isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArray.js","./internal/_isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isInteger.js","./isNil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isNil.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/binary.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var nAry = /*#__PURE__*/require('./nAry');

/**
 * Wraps a function of any arity (including nullary) in a function that accepts
 * exactly 2 parameters. Any extraneous parameters will not be passed to the
 * supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Function
 * @sig (* -> c) -> (a, b -> c)
 * @param {Function} fn The function to wrap.
 * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
 *         arity 2.
 * @see R.nAry, R.unary
 * @example
 *
 *      const takesThreeArgs = function(a, b, c) {
 *        return [a, b, c];
 *      };
 *      takesThreeArgs.length; //=> 3
 *      takesThreeArgs(1, 2, 3); //=> [1, 2, 3]
 *
 *      const takesTwoArgs = R.binary(takesThreeArgs);
 *      takesTwoArgs.length; //=> 2
 *      // Only 2 arguments are passed to the wrapped function
 *      takesTwoArgs(1, 2, 3); //=> [1, 2, undefined]
 * @symb R.binary(f)(a, b, c) = f(a, b)
 */


var binary = /*#__PURE__*/_curry1(function binary(fn) {
  return nAry(2, fn);
});
module.exports = binary;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./nAry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nAry.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/bind.js":[function(require,module,exports){
var _arity = /*#__PURE__*/require('./internal/_arity');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Creates a function that is bound to a context.
 * Note: `R.bind` does not provide the additional argument-binding capabilities of
 * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category Function
 * @category Object
 * @sig (* -> *) -> {*} -> (* -> *)
 * @param {Function} fn The function to bind to context
 * @param {Object} thisObj The context to bind `fn` to
 * @return {Function} A function that will execute in the context of `thisObj`.
 * @see R.partial
 * @example
 *
 *      const log = R.bind(console.log, console);
 *      R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}
 *      // logs {a: 2}
 * @symb R.bind(f, o)(a, b) = f.call(o, a, b)
 */


var bind = /*#__PURE__*/_curry2(function bind(fn, thisObj) {
  return _arity(fn.length, function () {
    return fn.apply(thisObj, arguments);
  });
});
module.exports = bind;
},{"./internal/_arity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/both.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _isFunction = /*#__PURE__*/require('./internal/_isFunction');

var and = /*#__PURE__*/require('./and');

var lift = /*#__PURE__*/require('./lift');

/**
 * A function which calls the two provided functions and returns the `&&`
 * of the results.
 * It returns the result of the first function if it is false-y and the result
 * of the second function otherwise. Note that this is short-circuited,
 * meaning that the second function will not be invoked if the first returns a
 * false-y value.
 *
 * In addition to functions, `R.both` also accepts any fantasy-land compatible
 * applicative functor.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category Logic
 * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
 * @param {Function} f A predicate
 * @param {Function} g Another predicate
 * @return {Function} a function that applies its arguments to `f` and `g` and `&&`s their outputs together.
 * @see R.and
 * @example
 *
 *      const gt10 = R.gt(R.__, 10)
 *      const lt20 = R.lt(R.__, 20)
 *      const f = R.both(gt10, lt20);
 *      f(15); //=> true
 *      f(30); //=> false
 *
 *      R.both(Maybe.Just(false), Maybe.Just(55)); // => Maybe.Just(false)
 *      R.both([false, false, 'a'], [11]); //=> [false, false, 11]
 */


var both = /*#__PURE__*/_curry2(function both(f, g) {
  return _isFunction(f) ? function _both() {
    return f.apply(this, arguments) && g.apply(this, arguments);
  } : lift(and)(f, g);
});
module.exports = both;
},{"./and":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/and.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isFunction.js","./lift":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lift.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/call.js":[function(require,module,exports){
var curry = /*#__PURE__*/require('./curry');

/**
 * Returns the result of calling its first argument with the remaining
 * arguments. This is occasionally useful as a converging function for
 * [`R.converge`](#converge): the first branch can produce a function while the
 * remaining branches produce values to be passed to that function as its
 * arguments.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig (*... -> a),*... -> a
 * @param {Function} fn The function to apply to the remaining arguments.
 * @param {...*} args Any number of positional arguments.
 * @return {*}
 * @see R.apply
 * @example
 *
 *      R.call(R.add, 1, 2); //=> 3
 *
 *      const indentN = R.pipe(R.repeat(' '),
 *                           R.join(''),
 *                           R.replace(/^(?!$)/gm));
 *
 *      const format = R.converge(R.call, [
 *                                  R.pipe(R.prop('indent'), indentN),
 *                                  R.prop('value')
 *                              ]);
 *
 *      format({indent: 2, value: 'foo\nbar\nbaz\n'}); //=> '  foo\n  bar\n  baz\n'
 * @symb R.call(f, a, b) = f(a, b)
 */


var call = /*#__PURE__*/curry(function call(fn) {
  return fn.apply(this, Array.prototype.slice.call(arguments, 1));
});
module.exports = call;
},{"./curry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curry.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/chain.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _makeFlat = /*#__PURE__*/require('./internal/_makeFlat');

var _xchain = /*#__PURE__*/require('./internal/_xchain');

var map = /*#__PURE__*/require('./map');

/**
 * `chain` maps a function over a list and concatenates the results. `chain`
 * is also known as `flatMap` in some libraries.
 *
 * Dispatches to the `chain` method of the second argument, if present,
 * according to the [FantasyLand Chain spec](https://github.com/fantasyland/fantasy-land#chain).
 *
 * If second argument is a function, `chain(f, g)(x)` is equivalent to `f(g(x), x)`.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig Chain m => (a -> m b) -> m a -> m b
 * @param {Function} fn The function to map with
 * @param {Array} list The list to map over
 * @return {Array} The result of flat-mapping `list` with `fn`
 * @example
 *
 *      const duplicate = n => [n, n];
 *      R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3]
 *
 *      R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]
 */


var chain = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['fantasy-land/chain', 'chain'], _xchain, function chain(fn, monad) {
  if (typeof monad === 'function') {
    return function (x) {
      return fn(monad(x))(x);
    };
  }
  return _makeFlat(false)(map(fn, monad));
}));
module.exports = chain;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_makeFlat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_makeFlat.js","./internal/_xchain":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xchain.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/clamp.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Restricts a number to be within a range.
 *
 * Also works for other ordered types such as Strings and Dates.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Relation
 * @sig Ord a => a -> a -> a -> a
 * @param {Number} minimum The lower limit of the clamp (inclusive)
 * @param {Number} maximum The upper limit of the clamp (inclusive)
 * @param {Number} value Value to be clamped
 * @return {Number} Returns `minimum` when `val < minimum`, `maximum` when `val > maximum`, returns `val` otherwise
 * @example
 *
 *      R.clamp(1, 10, -5) // => 1
 *      R.clamp(1, 10, 15) // => 10
 *      R.clamp(1, 10, 4)  // => 4
 */


var clamp = /*#__PURE__*/_curry3(function clamp(min, max, value) {
  if (min > max) {
    throw new Error('min must not be greater than max in clamp(min, max, value)');
  }
  return value < min ? min : value > max ? max : value;
});
module.exports = clamp;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/clone.js":[function(require,module,exports){
var _clone = /*#__PURE__*/require('./internal/_clone');

var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Creates a deep copy of the value which may contain (nested) `Array`s and
 * `Object`s, `Number`s, `String`s, `Boolean`s and `Date`s. `Function`s are
 * assigned by reference rather than copied
 *
 * Dispatches to a `clone` method if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig {*} -> {*}
 * @param {*} value The object or array to clone
 * @return {*} A deeply cloned copy of `val`
 * @example
 *
 *      const objects = [{}, {}, {}];
 *      const objectsClone = R.clone(objects);
 *      objects === objectsClone; //=> false
 *      objects[0] === objectsClone[0]; //=> false
 */


var clone = /*#__PURE__*/_curry1(function clone(value) {
  return value != null && typeof value.clone === 'function' ? value.clone() : _clone(value, [], [], true);
});
module.exports = clone;
},{"./internal/_clone":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_clone.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/comparator.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Makes a comparator function out of a function that reports whether the first
 * element is less than the second.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((a, b) -> Boolean) -> ((a, b) -> Number)
 * @param {Function} pred A predicate function of arity two which will return `true` if the first argument
 * is less than the second, `false` otherwise
 * @return {Function} A Function :: a -> b -> Int that returns `-1` if a < b, `1` if b < a, otherwise `0`
 * @example
 *
 *      const byAge = R.comparator((a, b) => a.age < b.age);
 *      const people = [
 *        { name: 'Emma', age: 70 },
 *        { name: 'Peter', age: 78 },
 *        { name: 'Mikhail', age: 62 },
 *      ];
 *      const peopleByIncreasingAge = R.sort(byAge, people);
 *        //=> [{ name: 'Mikhail', age: 62 },{ name: 'Emma', age: 70 }, { name: 'Peter', age: 78 }]
 */


var comparator = /*#__PURE__*/_curry1(function comparator(pred) {
  return function (a, b) {
    return pred(a, b) ? -1 : pred(b, a) ? 1 : 0;
  };
});
module.exports = comparator;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/complement.js":[function(require,module,exports){
var lift = /*#__PURE__*/require('./lift');

var not = /*#__PURE__*/require('./not');

/**
 * Takes a function `f` and returns a function `g` such that if called with the same arguments
 * when `f` returns a "truthy" value, `g` returns `false` and when `f` returns a "falsy" value `g` returns `true`.
 *
 * `R.complement` may be applied to any functor
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category Logic
 * @sig (*... -> *) -> (*... -> Boolean)
 * @param {Function} f
 * @return {Function}
 * @see R.not
 * @example
 *
 *      const isNotNil = R.complement(R.isNil);
 *      isNil(null); //=> true
 *      isNotNil(null); //=> false
 *      isNil(7); //=> false
 *      isNotNil(7); //=> true
 */


var complement = /*#__PURE__*/lift(not);
module.exports = complement;
},{"./lift":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lift.js","./not":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/not.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/compose.js":[function(require,module,exports){
var pipe = /*#__PURE__*/require('./pipe');

var reverse = /*#__PURE__*/require('./reverse');

/**
 * Performs right-to-left function composition. The rightmost function may have
 * any arity; the remaining functions must be unary.
 *
 * **Note:** The result of compose is not automatically curried.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)) -> ((a, b, ..., n) -> z)
 * @param {...Function} ...functions The functions to compose
 * @return {Function}
 * @see R.pipe
 * @example
 *
 *      const classyGreeting = (firstName, lastName) => "The name's " + lastName + ", " + firstName + " " + lastName
 *      const yellGreeting = R.compose(R.toUpper, classyGreeting);
 *      yellGreeting('James', 'Bond'); //=> "THE NAME'S BOND, JAMES BOND"
 *
 *      R.compose(Math.abs, R.add(1), R.multiply(2))(-4) //=> 7
 *
 * @symb R.compose(f, g, h)(a, b) = f(g(h(a, b)))
 */


function compose() {
  if (arguments.length === 0) {
    throw new Error('compose requires at least one argument');
  }
  return pipe.apply(this, reverse(arguments));
}
module.exports = compose;
},{"./pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipe.js","./reverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reverse.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/composeK.js":[function(require,module,exports){
var chain = /*#__PURE__*/require('./chain');

var compose = /*#__PURE__*/require('./compose');

var map = /*#__PURE__*/require('./map');

/**
 * Returns the right-to-left Kleisli composition of the provided functions,
 * each of which must return a value of a type supported by [`chain`](#chain).
 *
 * `R.composeK(h, g, f)` is equivalent to `R.compose(R.chain(h), R.chain(g), f)`.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Function
 * @sig Chain m => ((y -> m z), (x -> m y), ..., (a -> m b)) -> (a -> m z)
 * @param {...Function} ...functions The functions to compose
 * @return {Function}
 * @see R.pipeK
 * @deprecated since v0.26.0
 * @example
 *
 *       //  get :: String -> Object -> Maybe *
 *       const get = R.curry((propName, obj) => Maybe(obj[propName]))
 *
 *       //  getStateCode :: Maybe String -> Maybe String
 *       const getStateCode = R.composeK(
 *         R.compose(Maybe.of, R.toUpper),
 *         get('state'),
 *         get('address'),
 *         get('user'),
 *       );
 *       getStateCode({"user":{"address":{"state":"ny"}}}); //=> Maybe.Just("NY")
 *       getStateCode({}); //=> Maybe.Nothing()
 * @symb R.composeK(f, g, h)(a) = R.chain(f, R.chain(g, h(a)))
 */


function composeK() {
  if (arguments.length === 0) {
    throw new Error('composeK requires at least one argument');
  }
  var init = Array.prototype.slice.call(arguments);
  var last = init.pop();
  return compose(compose.apply(this, map(chain, init)), last);
}
module.exports = composeK;
},{"./chain":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/chain.js","./compose":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/compose.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/composeP.js":[function(require,module,exports){
var pipeP = /*#__PURE__*/require('./pipeP');

var reverse = /*#__PURE__*/require('./reverse');

/**
 * Performs right-to-left composition of one or more Promise-returning
 * functions. The rightmost function may have any arity; the remaining
 * functions must be unary.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Function
 * @sig ((y -> Promise z), (x -> Promise y), ..., (a -> Promise b)) -> (a -> Promise z)
 * @param {...Function} functions The functions to compose
 * @return {Function}
 * @see R.pipeP
 * @deprecated since v0.26.0
 * @example
 *
 *      const db = {
 *        users: {
 *          JOE: {
 *            name: 'Joe',
 *            followers: ['STEVE', 'SUZY']
 *          }
 *        }
 *      }
 *
 *      // We'll pretend to do a db lookup which returns a promise
 *      const lookupUser = (userId) => Promise.resolve(db.users[userId])
 *      const lookupFollowers = (user) => Promise.resolve(user.followers)
 *      lookupUser('JOE').then(lookupFollowers)
 *
 *      //  followersForUser :: String -> Promise [UserId]
 *      const followersForUser = R.composeP(lookupFollowers, lookupUser);
 *      followersForUser('JOE').then(followers => console.log('Followers:', followers))
 *      // Followers: ["STEVE","SUZY"]
 */


function composeP() {
  if (arguments.length === 0) {
    throw new Error('composeP requires at least one argument');
  }
  return pipeP.apply(this, reverse(arguments));
}
module.exports = composeP;
},{"./pipeP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipeP.js","./reverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reverse.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/composeWith.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var pipeWith = /*#__PURE__*/require('./pipeWith');

var reverse = /*#__PURE__*/require('./reverse');

/**
 * Performs right-to-left function composition using transforming function. The rightmost function may have
 * any arity; the remaining functions must be unary.
 *
 * **Note:** The result of compose is not automatically curried.
 *
 * @func
 * @memberOf R
 * @category Function
 * @sig ((* -> *), [(y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)]) -> ((a, b, ..., n) -> z)
 * @param {...Function} ...functions The functions to compose
 * @return {Function}
 * @see R.compose, R.pipeWith
 * @example
 *
 *      const composeWhileNotNil = R.composeWith((f, res) => R.isNil(res) ? res : f(res));
 *
 *      composeWhileNotNil([R.inc, R.prop('age')])({age: 1}) //=> 2
 *      composeWhileNotNil([R.inc, R.prop('age')])({}) //=> undefined
 *
 * @symb R.composeWith(f)([g, h, i])(...args) = f(g, f(h, f(i, ...args)))
 */


var composeWith = /*#__PURE__*/_curry2(function composeWith(xf, list) {
  return pipeWith.apply(this, [xf, reverse(list)]);
});
module.exports = composeWith;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./pipeWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipeWith.js","./reverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reverse.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/concat.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _isArray = /*#__PURE__*/require('./internal/_isArray');

var _isFunction = /*#__PURE__*/require('./internal/_isFunction');

var _isString = /*#__PURE__*/require('./internal/_isString');

var toString = /*#__PURE__*/require('./toString');

/**
 * Returns the result of concatenating the given lists or strings.
 *
 * Note: `R.concat` expects both arguments to be of the same type,
 * unlike the native `Array.prototype.concat` method. It will throw
 * an error if you `concat` an Array with a non-Array value.
 *
 * Dispatches to the `concat` method of the first argument, if present.
 * Can also concatenate two members of a [fantasy-land
 * compatible semigroup](https://github.com/fantasyland/fantasy-land#semigroup).
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a] -> [a]
 * @sig String -> String -> String
 * @param {Array|String} firstList The first list
 * @param {Array|String} secondList The second list
 * @return {Array|String} A list consisting of the elements of `firstList` followed by the elements of
 * `secondList`.
 *
 * @example
 *
 *      R.concat('ABC', 'DEF'); // 'ABCDEF'
 *      R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]
 *      R.concat([], []); //=> []
 */


var concat = /*#__PURE__*/_curry2(function concat(a, b) {
  if (_isArray(a)) {
    if (_isArray(b)) {
      return a.concat(b);
    }
    throw new TypeError(toString(b) + ' is not an array');
  }
  if (_isString(a)) {
    if (_isString(b)) {
      return a + b;
    }
    throw new TypeError(toString(b) + ' is not a string');
  }
  if (a != null && _isFunction(a['fantasy-land/concat'])) {
    return a['fantasy-land/concat'](b);
  }
  if (a != null && _isFunction(a.concat)) {
    return a.concat(b);
  }
  throw new TypeError(toString(a) + ' does not have a method named "concat" or "fantasy-land/concat"');
});
module.exports = concat;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArray.js","./internal/_isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isFunction.js","./internal/_isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isString.js","./toString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toString.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/cond.js":[function(require,module,exports){
var _arity = /*#__PURE__*/require('./internal/_arity');

var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var map = /*#__PURE__*/require('./map');

var max = /*#__PURE__*/require('./max');

var reduce = /*#__PURE__*/require('./reduce');

/**
 * Returns a function, `fn`, which encapsulates `if/else, if/else, ...` logic.
 * `R.cond` takes a list of [predicate, transformer] pairs. All of the arguments
 * to `fn` are applied to each of the predicates in turn until one returns a
 * "truthy" value, at which point `fn` returns the result of applying its
 * arguments to the corresponding transformer. If none of the predicates
 * matches, `fn` returns undefined.
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category Logic
 * @sig [[(*... -> Boolean),(*... -> *)]] -> (*... -> *)
 * @param {Array} pairs A list of [predicate, transformer]
 * @return {Function}
 * @see R.ifElse, R.unless, R.when
 * @example
 *
 *      const fn = R.cond([
 *        [R.equals(0),   R.always('water freezes at 0°C')],
 *        [R.equals(100), R.always('water boils at 100°C')],
 *        [R.T,           temp => 'nothing special happens at ' + temp + '°C']
 *      ]);
 *      fn(0); //=> 'water freezes at 0°C'
 *      fn(50); //=> 'nothing special happens at 50°C'
 *      fn(100); //=> 'water boils at 100°C'
 */


var cond = /*#__PURE__*/_curry1(function cond(pairs) {
  var arity = reduce(max, 0, map(function (pair) {
    return pair[0].length;
  }, pairs));
  return _arity(arity, function () {
    var idx = 0;
    while (idx < pairs.length) {
      if (pairs[idx][0].apply(this, arguments)) {
        return pairs[idx][1].apply(this, arguments);
      }
      idx += 1;
    }
  });
});
module.exports = cond;
},{"./internal/_arity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js","./max":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/max.js","./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/construct.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var constructN = /*#__PURE__*/require('./constructN');

/**
 * Wraps a constructor function inside a curried function that can be called
 * with the same arguments and returns the same type.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (* -> {*}) -> (* -> {*})
 * @param {Function} fn The constructor function to wrap.
 * @return {Function} A wrapped, curried constructor function.
 * @see R.invoker
 * @example
 *
 *      // Constructor function
 *      function Animal(kind) {
 *        this.kind = kind;
 *      };
 *      Animal.prototype.sighting = function() {
 *        return "It's a " + this.kind + "!";
 *      }
 *
 *      const AnimalConstructor = R.construct(Animal)
 *
 *      // Notice we no longer need the 'new' keyword:
 *      AnimalConstructor('Pig'); //=> {"kind": "Pig", "sighting": function (){...}};
 *
 *      const animalTypes = ["Lion", "Tiger", "Bear"];
 *      const animalSighting = R.invoker(0, 'sighting');
 *      const sightNewAnimal = R.compose(animalSighting, AnimalConstructor);
 *      R.map(sightNewAnimal, animalTypes); //=> ["It's a Lion!", "It's a Tiger!", "It's a Bear!"]
 */


var construct = /*#__PURE__*/_curry1(function construct(Fn) {
  return constructN(Fn.length, Fn);
});
module.exports = construct;
},{"./constructN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/constructN.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/constructN.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var curry = /*#__PURE__*/require('./curry');

var nAry = /*#__PURE__*/require('./nAry');

/**
 * Wraps a constructor function inside a curried function that can be called
 * with the same arguments and returns the same type. The arity of the function
 * returned is specified to allow using variadic constructor functions.
 *
 * @func
 * @memberOf R
 * @since v0.4.0
 * @category Function
 * @sig Number -> (* -> {*}) -> (* -> {*})
 * @param {Number} n The arity of the constructor function.
 * @param {Function} Fn The constructor function to wrap.
 * @return {Function} A wrapped, curried constructor function.
 * @example
 *
 *      // Variadic Constructor function
 *      function Salad() {
 *        this.ingredients = arguments;
 *      }
 *
 *      Salad.prototype.recipe = function() {
 *        const instructions = R.map(ingredient => 'Add a dollop of ' + ingredient, this.ingredients);
 *        return R.join('\n', instructions);
 *      };
 *
 *      const ThreeLayerSalad = R.constructN(3, Salad);
 *
 *      // Notice we no longer need the 'new' keyword, and the constructor is curried for 3 arguments.
 *      const salad = ThreeLayerSalad('Mayonnaise')('Potato Chips')('Ketchup');
 *
 *      console.log(salad.recipe());
 *      // Add a dollop of Mayonnaise
 *      // Add a dollop of Potato Chips
 *      // Add a dollop of Ketchup
 */


var constructN = /*#__PURE__*/_curry2(function constructN(n, Fn) {
  if (n > 10) {
    throw new Error('Constructor with greater than ten arguments');
  }
  if (n === 0) {
    return function () {
      return new Fn();
    };
  }
  return curry(nAry(n, function ($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) {
    switch (arguments.length) {
      case 1:
        return new Fn($0);
      case 2:
        return new Fn($0, $1);
      case 3:
        return new Fn($0, $1, $2);
      case 4:
        return new Fn($0, $1, $2, $3);
      case 5:
        return new Fn($0, $1, $2, $3, $4);
      case 6:
        return new Fn($0, $1, $2, $3, $4, $5);
      case 7:
        return new Fn($0, $1, $2, $3, $4, $5, $6);
      case 8:
        return new Fn($0, $1, $2, $3, $4, $5, $6, $7);
      case 9:
        return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8);
      case 10:
        return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8, $9);
    }
  }));
});
module.exports = constructN;
},{"./curry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curry.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./nAry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nAry.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/contains.js":[function(require,module,exports){
var _includes = /*#__PURE__*/require('./internal/_includes');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns `true` if the specified value is equal, in [`R.equals`](#equals)
 * terms, to at least one element of the given list; `false` otherwise.
 * Works also with strings.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> Boolean
 * @param {Object} a The item to compare against.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if an equivalent item is in the list, `false` otherwise.
 * @see R.includes
 * @deprecated since v0.26.0
 * @example
 *
 *      R.contains(3, [1, 2, 3]); //=> true
 *      R.contains(4, [1, 2, 3]); //=> false
 *      R.contains({ name: 'Fred' }, [{ name: 'Fred' }]); //=> true
 *      R.contains([42], [[42]]); //=> true
 *      R.contains('ba', 'banana'); //=>true
 */


var contains = /*#__PURE__*/_curry2(_includes);
module.exports = contains;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includes.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/converge.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _map = /*#__PURE__*/require('./internal/_map');

var curryN = /*#__PURE__*/require('./curryN');

var max = /*#__PURE__*/require('./max');

var pluck = /*#__PURE__*/require('./pluck');

var reduce = /*#__PURE__*/require('./reduce');

/**
 * Accepts a converging function and a list of branching functions and returns
 * a new function. The arity of the new function is the same as the arity of
 * the longest branching function. When invoked, this new function is applied
 * to some arguments, and each branching function is applied to those same
 * arguments. The results of each branching function are passed as arguments
 * to the converging function to produce the return value.
 *
 * @func
 * @memberOf R
 * @since v0.4.2
 * @category Function
 * @sig ((x1, x2, ...) -> z) -> [((a, b, ...) -> x1), ((a, b, ...) -> x2), ...] -> (a -> b -> ... -> z)
 * @param {Function} after A function. `after` will be invoked with the return values of
 *        `fn1` and `fn2` as its arguments.
 * @param {Array} functions A list of functions.
 * @return {Function} A new function.
 * @see R.useWith
 * @example
 *
 *      const average = R.converge(R.divide, [R.sum, R.length])
 *      average([1, 2, 3, 4, 5, 6, 7]) //=> 4
 *
 *      const strangeConcat = R.converge(R.concat, [R.toUpper, R.toLower])
 *      strangeConcat("Yodel") //=> "YODELyodel"
 *
 * @symb R.converge(f, [g, h])(a, b) = f(g(a, b), h(a, b))
 */


var converge = /*#__PURE__*/_curry2(function converge(after, fns) {
  return curryN(reduce(max, 0, pluck('length', fns)), function () {
    var args = arguments;
    var context = this;
    return after.apply(context, _map(function (fn) {
      return fn.apply(context, args);
    }, fns));
  });
});
module.exports = converge;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_map.js","./max":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/max.js","./pluck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pluck.js","./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/countBy.js":[function(require,module,exports){
var reduceBy = /*#__PURE__*/require('./reduceBy');

/**
 * Counts the elements of a list according to how many match each value of a
 * key generated by the supplied function. Returns an object mapping the keys
 * produced by `fn` to the number of occurrences in the list. Note that all
 * keys are coerced to strings because of how JavaScript objects work.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig (a -> String) -> [a] -> {*}
 * @param {Function} fn The function used to map values to keys.
 * @param {Array} list The list to count elements from.
 * @return {Object} An object mapping keys to number of occurrences in the list.
 * @example
 *
 *      const numbers = [1.0, 1.1, 1.2, 2.0, 3.0, 2.2];
 *      R.countBy(Math.floor)(numbers);    //=> {'1': 3, '2': 2, '3': 1}
 *
 *      const letters = ['a', 'b', 'A', 'a', 'B', 'c'];
 *      R.countBy(R.toLower)(letters);   //=> {'a': 3, 'b': 2, 'c': 1}
 */


var countBy = /*#__PURE__*/reduceBy(function (acc, elem) {
  return acc + 1;
}, 0);
module.exports = countBy;
},{"./reduceBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduceBy.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curry.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var curryN = /*#__PURE__*/require('./curryN');

/**
 * Returns a curried equivalent of the provided function. The curried function
 * has two unusual capabilities. First, its arguments needn't be provided one
 * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the
 * following are equivalent:
 *
 *   - `g(1)(2)(3)`
 *   - `g(1)(2, 3)`
 *   - `g(1, 2)(3)`
 *   - `g(1, 2, 3)`
 *
 * Secondly, the special placeholder value [`R.__`](#__) may be used to specify
 * "gaps", allowing partial application of any combination of arguments,
 * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),
 * the following are equivalent:
 *
 *   - `g(1, 2, 3)`
 *   - `g(_, 2, 3)(1)`
 *   - `g(_, _, 3)(1)(2)`
 *   - `g(_, _, 3)(1, 2)`
 *   - `g(_, 2)(1)(3)`
 *   - `g(_, 2)(1, 3)`
 *   - `g(_, 2)(_, 3)(1)`
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (* -> a) -> (* -> a)
 * @param {Function} fn The function to curry.
 * @return {Function} A new, curried function.
 * @see R.curryN, R.partial
 * @example
 *
 *      const addFourNumbers = (a, b, c, d) => a + b + c + d;
 *
 *      const curriedAddFourNumbers = R.curry(addFourNumbers);
 *      const f = curriedAddFourNumbers(1, 2);
 *      const g = f(3);
 *      g(4); //=> 10
 */


var curry = /*#__PURE__*/_curry1(function curry(fn) {
  return curryN(fn.length, fn);
});
module.exports = curry;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js":[function(require,module,exports){
var _arity = /*#__PURE__*/require('./internal/_arity');

var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _curryN = /*#__PURE__*/require('./internal/_curryN');

/**
 * Returns a curried equivalent of the provided function, with the specified
 * arity. The curried function has two unusual capabilities. First, its
 * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the
 * following are equivalent:
 *
 *   - `g(1)(2)(3)`
 *   - `g(1)(2, 3)`
 *   - `g(1, 2)(3)`
 *   - `g(1, 2, 3)`
 *
 * Secondly, the special placeholder value [`R.__`](#__) may be used to specify
 * "gaps", allowing partial application of any combination of arguments,
 * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),
 * the following are equivalent:
 *
 *   - `g(1, 2, 3)`
 *   - `g(_, 2, 3)(1)`
 *   - `g(_, _, 3)(1)(2)`
 *   - `g(_, _, 3)(1, 2)`
 *   - `g(_, 2)(1)(3)`
 *   - `g(_, 2)(1, 3)`
 *   - `g(_, 2)(_, 3)(1)`
 *
 * @func
 * @memberOf R
 * @since v0.5.0
 * @category Function
 * @sig Number -> (* -> a) -> (* -> a)
 * @param {Number} length The arity for the returned function.
 * @param {Function} fn The function to curry.
 * @return {Function} A new, curried function.
 * @see R.curry
 * @example
 *
 *      const sumArgs = (...args) => R.sum(args);
 *
 *      const curriedAddFourNumbers = R.curryN(4, sumArgs);
 *      const f = curriedAddFourNumbers(1, 2);
 *      const g = f(3);
 *      g(4); //=> 10
 */


var curryN = /*#__PURE__*/_curry2(function curryN(length, fn) {
  if (length === 1) {
    return _curry1(fn);
  }
  return _arity(length, _curryN(length, [], fn));
});
module.exports = curryN;
},{"./internal/_arity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curryN.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dec.js":[function(require,module,exports){
var add = /*#__PURE__*/require('./add');

/**
 * Decrements its argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Math
 * @sig Number -> Number
 * @param {Number} n
 * @return {Number} n - 1
 * @see R.inc
 * @example
 *
 *      R.dec(42); //=> 41
 */


var dec = /*#__PURE__*/add(-1);
module.exports = dec;
},{"./add":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/add.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/defaultTo.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns the second argument if it is not `null`, `undefined` or `NaN`;
 * otherwise the first argument is returned.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Logic
 * @sig a -> b -> a | b
 * @param {a} default The default value.
 * @param {b} val `val` will be returned instead of `default` unless `val` is `null`, `undefined` or `NaN`.
 * @return {*} The second value if it is not `null`, `undefined` or `NaN`, otherwise the default value
 * @example
 *
 *      const defaultTo42 = R.defaultTo(42);
 *
 *      defaultTo42(null);  //=> 42
 *      defaultTo42(undefined);  //=> 42
 *      defaultTo42(false);  //=> false
 *      defaultTo42('Ramda');  //=> 'Ramda'
 *      // parseInt('string') results in NaN
 *      defaultTo42(parseInt('string')); //=> 42
 */


var defaultTo = /*#__PURE__*/_curry2(function defaultTo(d, v) {
  return v == null || v !== v ? d : v;
});
module.exports = defaultTo;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/descend.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Makes a descending comparator function out of a function that returns a value
 * that can be compared with `<` and `>`.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Function
 * @sig Ord b => (a -> b) -> a -> a -> Number
 * @param {Function} fn A function of arity one that returns a value that can be compared
 * @param {*} a The first item to be compared.
 * @param {*} b The second item to be compared.
 * @return {Number} `-1` if fn(a) > fn(b), `1` if fn(b) > fn(a), otherwise `0`
 * @see R.ascend
 * @example
 *
 *      const byAge = R.descend(R.prop('age'));
 *      const people = [
 *        { name: 'Emma', age: 70 },
 *        { name: 'Peter', age: 78 },
 *        { name: 'Mikhail', age: 62 },
 *      ];
 *      const peopleByOldestFirst = R.sort(byAge, people);
 *        //=> [{ name: 'Peter', age: 78 }, { name: 'Emma', age: 70 }, { name: 'Mikhail', age: 62 }]
 */


var descend = /*#__PURE__*/_curry3(function descend(fn, a, b) {
  var aa = fn(a);
  var bb = fn(b);
  return aa > bb ? -1 : aa < bb ? 1 : 0;
});
module.exports = descend;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/difference.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _Set = /*#__PURE__*/require('./internal/_Set');

/**
 * Finds the set (i.e. no duplicates) of all elements in the first list not
 * contained in the second list. Objects and Arrays are compared in terms of
 * value equality, not reference equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` that are not in `list2`.
 * @see R.differenceWith, R.symmetricDifference, R.symmetricDifferenceWith, R.without
 * @example
 *
 *      R.difference([1,2,3,4], [7,6,5,4,3]); //=> [1,2]
 *      R.difference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5]
 *      R.difference([{a: 1}, {b: 2}], [{a: 1}, {c: 3}]) //=> [{b: 2}]
 */


var difference = /*#__PURE__*/_curry2(function difference(first, second) {
  var out = [];
  var idx = 0;
  var firstLen = first.length;
  var secondLen = second.length;
  var toFilterOut = new _Set();

  for (var i = 0; i < secondLen; i += 1) {
    toFilterOut.add(second[i]);
  }

  while (idx < firstLen) {
    if (toFilterOut.add(first[idx])) {
      out[out.length] = first[idx];
    }
    idx += 1;
  }
  return out;
});
module.exports = difference;
},{"./internal/_Set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_Set.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/differenceWith.js":[function(require,module,exports){
var _includesWith = /*#__PURE__*/require('./internal/_includesWith');

var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Finds the set (i.e. no duplicates) of all elements in the first list not
 * contained in the second list. Duplication is determined according to the
 * value returned by applying the supplied predicate to two list elements.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` that are not in `list2`.
 * @see R.difference, R.symmetricDifference, R.symmetricDifferenceWith
 * @example
 *
 *      const cmp = (x, y) => x.a === y.a;
 *      const l1 = [{a: 1}, {a: 2}, {a: 3}];
 *      const l2 = [{a: 3}, {a: 4}];
 *      R.differenceWith(cmp, l1, l2); //=> [{a: 1}, {a: 2}]
 */


var differenceWith = /*#__PURE__*/_curry3(function differenceWith(pred, first, second) {
  var out = [];
  var idx = 0;
  var firstLen = first.length;
  while (idx < firstLen) {
    if (!_includesWith(pred, first[idx], second) && !_includesWith(pred, first[idx], out)) {
      out.push(first[idx]);
    }
    idx += 1;
  }
  return out;
});
module.exports = differenceWith;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./internal/_includesWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includesWith.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dissoc.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns a new object that does not contain a `prop` property.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Object
 * @sig String -> {k: v} -> {k: v}
 * @param {String} prop The name of the property to dissociate
 * @param {Object} obj The object to clone
 * @return {Object} A new object equivalent to the original but without the specified property
 * @see R.assoc, R.omit
 * @example
 *
 *      R.dissoc('b', {a: 1, b: 2, c: 3}); //=> {a: 1, c: 3}
 */


var dissoc = /*#__PURE__*/_curry2(function dissoc(prop, obj) {
  var result = {};
  for (var p in obj) {
    result[p] = obj[p];
  }
  delete result[prop];
  return result;
});
module.exports = dissoc;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dissocPath.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _isInteger = /*#__PURE__*/require('./internal/_isInteger');

var _isArray = /*#__PURE__*/require('./internal/_isArray');

var assoc = /*#__PURE__*/require('./assoc');

var dissoc = /*#__PURE__*/require('./dissoc');

var remove = /*#__PURE__*/require('./remove');

var update = /*#__PURE__*/require('./update');

/**
 * Makes a shallow clone of an object, omitting the property at the given path.
 * Note that this copies and flattens prototype properties onto the new object
 * as well. All non-primitive properties are copied by reference.
 *
 * @func
 * @memberOf R
 * @since v0.11.0
 * @category Object
 * @typedefn Idx = String | Int
 * @sig [Idx] -> {k: v} -> {k: v}
 * @param {Array} path The path to the value to omit
 * @param {Object} obj The object to clone
 * @return {Object} A new object without the property at path
 * @see R.assocPath
 * @example
 *
 *      R.dissocPath(['a', 'b', 'c'], {a: {b: {c: 42}}}); //=> {a: {b: {}}}
 */


var dissocPath = /*#__PURE__*/_curry2(function dissocPath(path, obj) {
  switch (path.length) {
    case 0:
      return obj;
    case 1:
      return _isInteger(path[0]) && _isArray(obj) ? remove(path[0], 1, obj) : dissoc(path[0], obj);
    default:
      var head = path[0];
      var tail = Array.prototype.slice.call(path, 1);
      if (obj[head] == null) {
        return obj;
      } else if (_isInteger(head) && _isArray(obj)) {
        return update(head, dissocPath(tail, obj[head]), obj);
      } else {
        return assoc(head, dissocPath(tail, obj[head]), obj);
      }
  }
});
module.exports = dissocPath;
},{"./assoc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/assoc.js","./dissoc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dissoc.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArray.js","./internal/_isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isInteger.js","./remove":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/remove.js","./update":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/update.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/divide.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Divides two numbers. Equivalent to `a / b`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The first value.
 * @param {Number} b The second value.
 * @return {Number} The result of `a / b`.
 * @see R.multiply
 * @example
 *
 *      R.divide(71, 100); //=> 0.71
 *
 *      const half = R.divide(R.__, 2);
 *      half(42); //=> 21
 *
 *      const reciprocal = R.divide(1);
 *      reciprocal(4);   //=> 0.25
 */


var divide = /*#__PURE__*/_curry2(function divide(a, b) {
  return a / b;
});
module.exports = divide;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/drop.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xdrop = /*#__PURE__*/require('./internal/_xdrop');

var slice = /*#__PURE__*/require('./slice');

/**
 * Returns all but the first `n` elements of the given list, string, or
 * transducer/transformer (or object with a `drop` method).
 *
 * Dispatches to the `drop` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n
 * @param {*} list
 * @return {*} A copy of list without the first `n` elements
 * @see R.take, R.transduce, R.dropLast, R.dropWhile
 * @example
 *
 *      R.drop(1, ['foo', 'bar', 'baz']); //=> ['bar', 'baz']
 *      R.drop(2, ['foo', 'bar', 'baz']); //=> ['baz']
 *      R.drop(3, ['foo', 'bar', 'baz']); //=> []
 *      R.drop(4, ['foo', 'bar', 'baz']); //=> []
 *      R.drop(3, 'ramda');               //=> 'da'
 */


var drop = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['drop'], _xdrop, function drop(n, xs) {
  return slice(Math.max(0, n), Infinity, xs);
}));
module.exports = drop;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xdrop":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xdrop.js","./slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dropLast.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _dropLast = /*#__PURE__*/require('./internal/_dropLast');

var _xdropLast = /*#__PURE__*/require('./internal/_xdropLast');

/**
 * Returns a list containing all but the last `n` elements of the given `list`.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n The number of elements of `list` to skip.
 * @param {Array} list The list of elements to consider.
 * @return {Array} A copy of the list with only the first `list.length - n` elements
 * @see R.takeLast, R.drop, R.dropWhile, R.dropLastWhile
 * @example
 *
 *      R.dropLast(1, ['foo', 'bar', 'baz']); //=> ['foo', 'bar']
 *      R.dropLast(2, ['foo', 'bar', 'baz']); //=> ['foo']
 *      R.dropLast(3, ['foo', 'bar', 'baz']); //=> []
 *      R.dropLast(4, ['foo', 'bar', 'baz']); //=> []
 *      R.dropLast(3, 'ramda');               //=> 'ra'
 */


var dropLast = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable([], _xdropLast, _dropLast));
module.exports = dropLast;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_dropLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dropLast.js","./internal/_xdropLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xdropLast.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dropLastWhile.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _dropLastWhile = /*#__PURE__*/require('./internal/_dropLastWhile');

var _xdropLastWhile = /*#__PURE__*/require('./internal/_xdropLastWhile');

/**
 * Returns a new list excluding all the tailing elements of a given list which
 * satisfy the supplied predicate function. It passes each value from the right
 * to the supplied predicate function, skipping elements until the predicate
 * function returns a `falsy` value. The predicate function is applied to one argument:
 * *(value)*.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} predicate The function to be called on each element
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array without any trailing elements that return `falsy` values from the `predicate`.
 * @see R.takeLastWhile, R.addIndex, R.drop, R.dropWhile
 * @example
 *
 *      const lteThree = x => x <= 3;
 *
 *      R.dropLastWhile(lteThree, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3, 4]
 *
 *      R.dropLastWhile(x => x !== 'd' , 'Ramda'); //=> 'Ramd'
 */


var dropLastWhile = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable([], _xdropLastWhile, _dropLastWhile));
module.exports = dropLastWhile;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_dropLastWhile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dropLastWhile.js","./internal/_xdropLastWhile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xdropLastWhile.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dropRepeats.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xdropRepeatsWith = /*#__PURE__*/require('./internal/_xdropRepeatsWith');

var dropRepeatsWith = /*#__PURE__*/require('./dropRepeatsWith');

var equals = /*#__PURE__*/require('./equals');

/**
 * Returns a new list without any consecutively repeating elements.
 * [`R.equals`](#equals) is used to determine equality.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig [a] -> [a]
 * @param {Array} list The array to consider.
 * @return {Array} `list` without repeating elements.
 * @see R.transduce
 * @example
 *
 *     R.dropRepeats([1, 1, 1, 2, 3, 4, 4, 2, 2]); //=> [1, 2, 3, 4, 2]
 */


var dropRepeats = /*#__PURE__*/_curry1( /*#__PURE__*/_dispatchable([], /*#__PURE__*/_xdropRepeatsWith(equals), /*#__PURE__*/dropRepeatsWith(equals)));
module.exports = dropRepeats;
},{"./dropRepeatsWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dropRepeatsWith.js","./equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xdropRepeatsWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xdropRepeatsWith.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dropRepeatsWith.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xdropRepeatsWith = /*#__PURE__*/require('./internal/_xdropRepeatsWith');

var last = /*#__PURE__*/require('./last');

/**
 * Returns a new list without any consecutively repeating elements. Equality is
 * determined by applying the supplied predicate to each pair of consecutive elements. The
 * first element in a series of equal elements will be preserved.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig ((a, a) -> Boolean) -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list The array to consider.
 * @return {Array} `list` without repeating elements.
 * @see R.transduce
 * @example
 *
 *      const l = [1, -1, 1, 3, 4, -4, -4, -5, 5, 3, 3];
 *      R.dropRepeatsWith(R.eqBy(Math.abs), l); //=> [1, 3, 4, -5, 3]
 */


var dropRepeatsWith = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable([], _xdropRepeatsWith, function dropRepeatsWith(pred, list) {
  var result = [];
  var idx = 1;
  var len = list.length;
  if (len !== 0) {
    result[0] = list[0];
    while (idx < len) {
      if (!pred(last(result), list[idx])) {
        result[result.length] = list[idx];
      }
      idx += 1;
    }
  }
  return result;
}));
module.exports = dropRepeatsWith;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xdropRepeatsWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xdropRepeatsWith.js","./last":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/last.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dropWhile.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xdropWhile = /*#__PURE__*/require('./internal/_xdropWhile');

var slice = /*#__PURE__*/require('./slice');

/**
 * Returns a new list excluding the leading elements of a given list which
 * satisfy the supplied predicate function. It passes each value to the supplied
 * predicate function, skipping elements while the predicate function returns
 * `true`. The predicate function is applied to one argument: *(value)*.
 *
 * Dispatches to the `dropWhile` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} fn The function called per iteration.
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array.
 * @see R.takeWhile, R.transduce, R.addIndex
 * @example
 *
 *      const lteTwo = x => x <= 2;
 *
 *      R.dropWhile(lteTwo, [1, 2, 3, 4, 3, 2, 1]); //=> [3, 4, 3, 2, 1]
 *
 *      R.dropWhile(x => x !== 'd' , 'Ramda'); //=> 'da'
 */


var dropWhile = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['dropWhile'], _xdropWhile, function dropWhile(pred, xs) {
  var idx = 0;
  var len = xs.length;
  while (idx < len && pred(xs[idx])) {
    idx += 1;
  }
  return slice(idx, Infinity, xs);
}));
module.exports = dropWhile;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xdropWhile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xdropWhile.js","./slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/either.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _isFunction = /*#__PURE__*/require('./internal/_isFunction');

var lift = /*#__PURE__*/require('./lift');

var or = /*#__PURE__*/require('./or');

/**
 * A function wrapping calls to the two functions in an `||` operation,
 * returning the result of the first function if it is truth-y and the result
 * of the second function otherwise. Note that this is short-circuited,
 * meaning that the second function will not be invoked if the first returns a
 * truth-y value.
 *
 * In addition to functions, `R.either` also accepts any fantasy-land compatible
 * applicative functor.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category Logic
 * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
 * @param {Function} f a predicate
 * @param {Function} g another predicate
 * @return {Function} a function that applies its arguments to `f` and `g` and `||`s their outputs together.
 * @see R.or
 * @example
 *
 *      const gt10 = x => x > 10;
 *      const even = x => x % 2 === 0;
 *      const f = R.either(gt10, even);
 *      f(101); //=> true
 *      f(8); //=> true
 *
 *      R.either(Maybe.Just(false), Maybe.Just(55)); // => Maybe.Just(55)
 *      R.either([false, false, 'a'], [11]) // => [11, 11, "a"]
 */


var either = /*#__PURE__*/_curry2(function either(f, g) {
  return _isFunction(f) ? function _either() {
    return f.apply(this, arguments) || g.apply(this, arguments);
  } : lift(or)(f, g);
});
module.exports = either;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isFunction.js","./lift":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lift.js","./or":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/or.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/empty.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _isArguments = /*#__PURE__*/require('./internal/_isArguments');

var _isArray = /*#__PURE__*/require('./internal/_isArray');

var _isObject = /*#__PURE__*/require('./internal/_isObject');

var _isString = /*#__PURE__*/require('./internal/_isString');

/**
 * Returns the empty value of its argument's type. Ramda defines the empty
 * value of Array (`[]`), Object (`{}`), String (`''`), and Arguments. Other
 * types are supported if they define `<Type>.empty`,
 * `<Type>.prototype.empty` or implement the
 * [FantasyLand Monoid spec](https://github.com/fantasyland/fantasy-land#monoid).
 *
 * Dispatches to the `empty` method of the first argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Function
 * @sig a -> a
 * @param {*} x
 * @return {*}
 * @example
 *
 *      R.empty(Just(42));      //=> Nothing()
 *      R.empty([1, 2, 3]);     //=> []
 *      R.empty('unicorns');    //=> ''
 *      R.empty({x: 1, y: 2});  //=> {}
 */


var empty = /*#__PURE__*/_curry1(function empty(x) {
  return x != null && typeof x['fantasy-land/empty'] === 'function' ? x['fantasy-land/empty']() : x != null && x.constructor != null && typeof x.constructor['fantasy-land/empty'] === 'function' ? x.constructor['fantasy-land/empty']() : x != null && typeof x.empty === 'function' ? x.empty() : x != null && x.constructor != null && typeof x.constructor.empty === 'function' ? x.constructor.empty() : _isArray(x) ? [] : _isString(x) ? '' : _isObject(x) ? {} : _isArguments(x) ? function () {
    return arguments;
  }() : void 0 // else
  ;
});
module.exports = empty;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_isArguments":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArguments.js","./internal/_isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArray.js","./internal/_isObject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isObject.js","./internal/_isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isString.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/endsWith.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var equals = /*#__PURE__*/require('./equals');

var takeLast = /*#__PURE__*/require('./takeLast');

/**
 * Checks if a list ends with the provided sublist.
 *
 * Similarly, checks if a string ends with the provided substring.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category List
 * @sig [a] -> [a] -> Boolean
 * @sig String -> String -> Boolean
 * @param {*} suffix
 * @param {*} list
 * @return {Boolean}
 * @see R.startsWith
 * @example
 *
 *      R.endsWith('c', 'abc')                //=> true
 *      R.endsWith('b', 'abc')                //=> false
 *      R.endsWith(['c'], ['a', 'b', 'c'])    //=> true
 *      R.endsWith(['b'], ['a', 'b', 'c'])    //=> false
 */


var endsWith = /*#__PURE__*/_curry2(function (suffix, list) {
  return equals(takeLast(suffix.length, list), suffix);
});
module.exports = endsWith;
},{"./equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./takeLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/takeLast.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/eqBy.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var equals = /*#__PURE__*/require('./equals');

/**
 * Takes a function and two values in its domain and returns `true` if the
 * values map to the same value in the codomain; `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Relation
 * @sig (a -> b) -> a -> a -> Boolean
 * @param {Function} f
 * @param {*} x
 * @param {*} y
 * @return {Boolean}
 * @example
 *
 *      R.eqBy(Math.abs, 5, -5); //=> true
 */


var eqBy = /*#__PURE__*/_curry3(function eqBy(f, x, y) {
  return equals(f(x), f(y));
});
module.exports = eqBy;
},{"./equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/eqProps.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var equals = /*#__PURE__*/require('./equals');

/**
 * Reports whether two objects have the same value, in [`R.equals`](#equals)
 * terms, for the specified property. Useful as a curried predicate.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig k -> {k: v} -> {k: v} -> Boolean
 * @param {String} prop The name of the property to compare
 * @param {Object} obj1
 * @param {Object} obj2
 * @return {Boolean}
 *
 * @example
 *
 *      const o1 = { a: 1, b: 2, c: 3, d: 4 };
 *      const o2 = { a: 10, b: 20, c: 3, d: 40 };
 *      R.eqProps('a', o1, o2); //=> false
 *      R.eqProps('c', o1, o2); //=> true
 */


var eqProps = /*#__PURE__*/_curry3(function eqProps(prop, obj1, obj2) {
  return equals(obj1[prop], obj2[prop]);
});
module.exports = eqProps;
},{"./equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _equals = /*#__PURE__*/require('./internal/_equals');

/**
 * Returns `true` if its arguments are equivalent, `false` otherwise. Handles
 * cyclical data structures.
 *
 * Dispatches symmetrically to the `equals` methods of both arguments, if
 * present.
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category Relation
 * @sig a -> b -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @example
 *
 *      R.equals(1, 1); //=> true
 *      R.equals(1, '1'); //=> false
 *      R.equals([1, 2, 3], [1, 2, 3]); //=> true
 *
 *      const a = {}; a.v = a;
 *      const b = {}; b.v = b;
 *      R.equals(a, b); //=> true
 */


var equals = /*#__PURE__*/_curry2(function equals(a, b) {
  return _equals(a, b, [], []);
});
module.exports = equals;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_equals.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/evolve.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Creates a new object by recursively evolving a shallow copy of `object`,
 * according to the `transformation` functions. All non-primitive properties
 * are copied by reference.
 *
 * A `transformation` function will not be invoked if its corresponding key
 * does not exist in the evolved object.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig {k: (v -> v)} -> {k: v} -> {k: v}
 * @param {Object} transformations The object specifying transformation functions to apply
 *        to the object.
 * @param {Object} object The object to be transformed.
 * @return {Object} The transformed object.
 * @example
 *
 *      const tomato = {firstName: '  Tomato ', data: {elapsed: 100, remaining: 1400}, id:123};
 *      const transformations = {
 *        firstName: R.trim,
 *        lastName: R.trim, // Will not get invoked.
 *        data: {elapsed: R.add(1), remaining: R.add(-1)}
 *      };
 *      R.evolve(transformations, tomato); //=> {firstName: 'Tomato', data: {elapsed: 101, remaining: 1399}, id:123}
 */


var evolve = /*#__PURE__*/_curry2(function evolve(transformations, object) {
  var result = object instanceof Array ? [] : {};
  var transformation, key, type;
  for (key in object) {
    transformation = transformations[key];
    type = typeof transformation;
    result[key] = type === 'function' ? transformation(object[key]) : transformation && type === 'object' ? evolve(transformation, object[key]) : object[key];
  }
  return result;
});
module.exports = evolve;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/filter.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _filter = /*#__PURE__*/require('./internal/_filter');

var _isObject = /*#__PURE__*/require('./internal/_isObject');

var _reduce = /*#__PURE__*/require('./internal/_reduce');

var _xfilter = /*#__PURE__*/require('./internal/_xfilter');

var keys = /*#__PURE__*/require('./keys');

/**
 * Takes a predicate and a `Filterable`, and returns a new filterable of the
 * same type containing the members of the given filterable which satisfy the
 * given predicate. Filterable objects include plain objects or any object
 * that has a filter method such as `Array`.
 *
 * Dispatches to the `filter` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Filterable f => (a -> Boolean) -> f a -> f a
 * @param {Function} pred
 * @param {Array} filterable
 * @return {Array} Filterable
 * @see R.reject, R.transduce, R.addIndex
 * @example
 *
 *      const isEven = n => n % 2 === 0;
 *
 *      R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]
 *
 *      R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
 */


var filter = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['filter'], _xfilter, function (pred, filterable) {
  return _isObject(filterable) ? _reduce(function (acc, key) {
    if (pred(filterable[key])) {
      acc[key] = filterable[key];
    }
    return acc;
  }, {}, keys(filterable)) :
  // else
  _filter(pred, filterable);
}));
module.exports = filter;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_filter.js","./internal/_isObject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isObject.js","./internal/_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./internal/_xfilter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfilter.js","./keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/find.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xfind = /*#__PURE__*/require('./internal/_xfind');

/**
 * Returns the first element of the list which matches the predicate, or
 * `undefined` if no element matches.
 *
 * Dispatches to the `find` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> a | undefined
 * @param {Function} fn The predicate function used to determine if the element is the
 *        desired one.
 * @param {Array} list The array to consider.
 * @return {Object} The element found, or `undefined`.
 * @see R.transduce
 * @example
 *
 *      const xs = [{a: 1}, {a: 2}, {a: 3}];
 *      R.find(R.propEq('a', 2))(xs); //=> {a: 2}
 *      R.find(R.propEq('a', 4))(xs); //=> undefined
 */


var find = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['find'], _xfind, function find(fn, list) {
  var idx = 0;
  var len = list.length;
  while (idx < len) {
    if (fn(list[idx])) {
      return list[idx];
    }
    idx += 1;
  }
}));
module.exports = find;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xfind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfind.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/findIndex.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xfindIndex = /*#__PURE__*/require('./internal/_xfindIndex');

/**
 * Returns the index of the first element of the list which matches the
 * predicate, or `-1` if no element matches.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> Boolean) -> [a] -> Number
 * @param {Function} fn The predicate function used to determine if the element is the
 * desired one.
 * @param {Array} list The array to consider.
 * @return {Number} The index of the element found, or `-1`.
 * @see R.transduce
 * @example
 *
 *      const xs = [{a: 1}, {a: 2}, {a: 3}];
 *      R.findIndex(R.propEq('a', 2))(xs); //=> 1
 *      R.findIndex(R.propEq('a', 4))(xs); //=> -1
 */


var findIndex = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable([], _xfindIndex, function findIndex(fn, list) {
  var idx = 0;
  var len = list.length;
  while (idx < len) {
    if (fn(list[idx])) {
      return idx;
    }
    idx += 1;
  }
  return -1;
}));
module.exports = findIndex;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xfindIndex":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfindIndex.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/findLast.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xfindLast = /*#__PURE__*/require('./internal/_xfindLast');

/**
 * Returns the last element of the list which matches the predicate, or
 * `undefined` if no element matches.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> Boolean) -> [a] -> a | undefined
 * @param {Function} fn The predicate function used to determine if the element is the
 * desired one.
 * @param {Array} list The array to consider.
 * @return {Object} The element found, or `undefined`.
 * @see R.transduce
 * @example
 *
 *      const xs = [{a: 1, b: 0}, {a:1, b: 1}];
 *      R.findLast(R.propEq('a', 1))(xs); //=> {a: 1, b: 1}
 *      R.findLast(R.propEq('a', 4))(xs); //=> undefined
 */


var findLast = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable([], _xfindLast, function findLast(fn, list) {
  var idx = list.length - 1;
  while (idx >= 0) {
    if (fn(list[idx])) {
      return list[idx];
    }
    idx -= 1;
  }
}));
module.exports = findLast;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xfindLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfindLast.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/findLastIndex.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xfindLastIndex = /*#__PURE__*/require('./internal/_xfindLastIndex');

/**
 * Returns the index of the last element of the list which matches the
 * predicate, or `-1` if no element matches.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> Boolean) -> [a] -> Number
 * @param {Function} fn The predicate function used to determine if the element is the
 * desired one.
 * @param {Array} list The array to consider.
 * @return {Number} The index of the element found, or `-1`.
 * @see R.transduce
 * @example
 *
 *      const xs = [{a: 1, b: 0}, {a:1, b: 1}];
 *      R.findLastIndex(R.propEq('a', 1))(xs); //=> 1
 *      R.findLastIndex(R.propEq('a', 4))(xs); //=> -1
 */


var findLastIndex = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable([], _xfindLastIndex, function findLastIndex(fn, list) {
  var idx = list.length - 1;
  while (idx >= 0) {
    if (fn(list[idx])) {
      return idx;
    }
    idx -= 1;
  }
  return -1;
}));
module.exports = findLastIndex;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xfindLastIndex":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfindLastIndex.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/flatten.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _makeFlat = /*#__PURE__*/require('./internal/_makeFlat');

/**
 * Returns a new list by pulling every item out of it (and all its sub-arrays)
 * and putting them in a new array, depth-first.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [b]
 * @param {Array} list The array to consider.
 * @return {Array} The flattened list.
 * @see R.unnest
 * @example
 *
 *      R.flatten([1, 2, [3, 4], 5, [6, [7, 8, [9, [10, 11], 12]]]]);
 *      //=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
 */


var flatten = /*#__PURE__*/_curry1( /*#__PURE__*/_makeFlat(true));
module.exports = flatten;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_makeFlat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_makeFlat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/flip.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var curryN = /*#__PURE__*/require('./curryN');

/**
 * Returns a new function much like the supplied one, except that the first two
 * arguments' order is reversed.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((a, b, c, ...) -> z) -> (b -> a -> c -> ... -> z)
 * @param {Function} fn The function to invoke with its first two parameters reversed.
 * @return {*} The result of invoking `fn` with its first two parameters' order reversed.
 * @example
 *
 *      const mergeThree = (a, b, c) => [].concat(a, b, c);
 *
 *      mergeThree(1, 2, 3); //=> [1, 2, 3]
 *
 *      R.flip(mergeThree)(1, 2, 3); //=> [2, 1, 3]
 * @symb R.flip(f)(a, b, c) = f(b, a, c)
 */


var flip = /*#__PURE__*/_curry1(function flip(fn) {
  return curryN(fn.length, function (a, b) {
    var args = Array.prototype.slice.call(arguments, 0);
    args[0] = b;
    args[1] = a;
    return fn.apply(this, args);
  });
});
module.exports = flip;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/forEach.js":[function(require,module,exports){
var _checkForMethod = /*#__PURE__*/require('./internal/_checkForMethod');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Iterate over an input `list`, calling a provided function `fn` for each
 * element in the list.
 *
 * `fn` receives one argument: *(value)*.
 *
 * Note: `R.forEach` does not skip deleted or unassigned indices (sparse
 * arrays), unlike the native `Array.prototype.forEach` method. For more
 * details on this behavior, see:
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description
 *
 * Also note that, unlike `Array.prototype.forEach`, Ramda's `forEach` returns
 * the original array. In some libraries this function is named `each`.
 *
 * Dispatches to the `forEach` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> *) -> [a] -> [a]
 * @param {Function} fn The function to invoke. Receives one argument, `value`.
 * @param {Array} list The list to iterate over.
 * @return {Array} The original list.
 * @see R.addIndex
 * @example
 *
 *      const printXPlusFive = x => console.log(x + 5);
 *      R.forEach(printXPlusFive, [1, 2, 3]); //=> [1, 2, 3]
 *      // logs 6
 *      // logs 7
 *      // logs 8
 * @symb R.forEach(f, [a, b, c]) = [a, b, c]
 */


var forEach = /*#__PURE__*/_curry2( /*#__PURE__*/_checkForMethod('forEach', function forEach(fn, list) {
  var len = list.length;
  var idx = 0;
  while (idx < len) {
    fn(list[idx]);
    idx += 1;
  }
  return list;
}));
module.exports = forEach;
},{"./internal/_checkForMethod":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_checkForMethod.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/forEachObjIndexed.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var keys = /*#__PURE__*/require('./keys');

/**
 * Iterate over an input `object`, calling a provided function `fn` for each
 * key and value in the object.
 *
 * `fn` receives three argument: *(value, key, obj)*.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Object
 * @sig ((a, String, StrMap a) -> Any) -> StrMap a -> StrMap a
 * @param {Function} fn The function to invoke. Receives three argument, `value`, `key`, `obj`.
 * @param {Object} obj The object to iterate over.
 * @return {Object} The original object.
 * @example
 *
 *      const printKeyConcatValue = (value, key) => console.log(key + ':' + value);
 *      R.forEachObjIndexed(printKeyConcatValue, {x: 1, y: 2}); //=> {x: 1, y: 2}
 *      // logs x:1
 *      // logs y:2
 * @symb R.forEachObjIndexed(f, {x: a, y: b}) = {x: a, y: b}
 */


var forEachObjIndexed = /*#__PURE__*/_curry2(function forEachObjIndexed(fn, obj) {
  var keyList = keys(obj);
  var idx = 0;
  while (idx < keyList.length) {
    var key = keyList[idx];
    fn(obj[key], key, obj);
    idx += 1;
  }
  return obj;
});
module.exports = forEachObjIndexed;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/fromPairs.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Creates a new object from a list key-value pairs. If a key appears in
 * multiple pairs, the rightmost pair is included in the object.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig [[k,v]] -> {k: v}
 * @param {Array} pairs An array of two-element arrays that will be the keys and values of the output object.
 * @return {Object} The object made by pairing up `keys` and `values`.
 * @see R.toPairs, R.pair
 * @example
 *
 *      R.fromPairs([['a', 1], ['b', 2], ['c', 3]]); //=> {a: 1, b: 2, c: 3}
 */


var fromPairs = /*#__PURE__*/_curry1(function fromPairs(pairs) {
  var result = {};
  var idx = 0;
  while (idx < pairs.length) {
    result[pairs[idx][0]] = pairs[idx][1];
    idx += 1;
  }
  return result;
});
module.exports = fromPairs;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/groupBy.js":[function(require,module,exports){
var _checkForMethod = /*#__PURE__*/require('./internal/_checkForMethod');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var reduceBy = /*#__PURE__*/require('./reduceBy');

/**
 * Splits a list into sub-lists stored in an object, based on the result of
 * calling a String-returning function on each element, and grouping the
 * results according to values returned.
 *
 * Dispatches to the `groupBy` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> String) -> [a] -> {String: [a]}
 * @param {Function} fn Function :: a -> String
 * @param {Array} list The array to group
 * @return {Object} An object with the output of `fn` for keys, mapped to arrays of elements
 *         that produced that key when passed to `fn`.
 * @see R.reduceBy, R.transduce
 * @example
 *
 *      const byGrade = R.groupBy(function(student) {
 *        const score = student.score;
 *        return score < 65 ? 'F' :
 *               score < 70 ? 'D' :
 *               score < 80 ? 'C' :
 *               score < 90 ? 'B' : 'A';
 *      });
 *      const students = [{name: 'Abby', score: 84},
 *                      {name: 'Eddy', score: 58},
 *                      // ...
 *                      {name: 'Jack', score: 69}];
 *      byGrade(students);
 *      // {
 *      //   'A': [{name: 'Dianne', score: 99}],
 *      //   'B': [{name: 'Abby', score: 84}]
 *      //   // ...,
 *      //   'F': [{name: 'Eddy', score: 58}]
 *      // }
 */


var groupBy = /*#__PURE__*/_curry2( /*#__PURE__*/_checkForMethod('groupBy', /*#__PURE__*/reduceBy(function (acc, item) {
  if (acc == null) {
    acc = [];
  }
  acc.push(item);
  return acc;
}, null)));
module.exports = groupBy;
},{"./internal/_checkForMethod":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_checkForMethod.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./reduceBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduceBy.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/groupWith.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Takes a list and returns a list of lists where each sublist's elements are
 * all satisfied pairwise comparison according to the provided function.
 * Only adjacent elements are passed to the comparison function.
 *
 * @func
 * @memberOf R
 * @since v0.21.0
 * @category List
 * @sig ((a, a) → Boolean) → [a] → [[a]]
 * @param {Function} fn Function for determining whether two given (adjacent)
 *        elements should be in the same group
 * @param {Array} list The array to group. Also accepts a string, which will be
 *        treated as a list of characters.
 * @return {List} A list that contains sublists of elements,
 *         whose concatenations are equal to the original list.
 * @example
 *
 * R.groupWith(R.equals, [0, 1, 1, 2, 3, 5, 8, 13, 21])
 * //=> [[0], [1, 1], [2], [3], [5], [8], [13], [21]]
 *
 * R.groupWith((a, b) => a + 1 === b, [0, 1, 1, 2, 3, 5, 8, 13, 21])
 * //=> [[0, 1], [1, 2, 3], [5], [8], [13], [21]]
 *
 * R.groupWith((a, b) => a % 2 === b % 2, [0, 1, 1, 2, 3, 5, 8, 13, 21])
 * //=> [[0], [1, 1], [2], [3, 5], [8], [13, 21]]
 *
 * R.groupWith(R.eqBy(isVowel), 'aestiou')
 * //=> ['ae', 'st', 'iou']
 */


var groupWith = /*#__PURE__*/_curry2(function (fn, list) {
  var res = [];
  var idx = 0;
  var len = list.length;
  while (idx < len) {
    var nextidx = idx + 1;
    while (nextidx < len && fn(list[nextidx - 1], list[nextidx])) {
      nextidx += 1;
    }
    res.push(list.slice(idx, nextidx));
    idx = nextidx;
  }
  return res;
});
module.exports = groupWith;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/gt.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns `true` if the first argument is greater than the second; `false`
 * otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @see R.lt
 * @example
 *
 *      R.gt(2, 1); //=> true
 *      R.gt(2, 2); //=> false
 *      R.gt(2, 3); //=> false
 *      R.gt('a', 'z'); //=> false
 *      R.gt('z', 'a'); //=> true
 */


var gt = /*#__PURE__*/_curry2(function gt(a, b) {
  return a > b;
});
module.exports = gt;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/gte.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns `true` if the first argument is greater than or equal to the second;
 * `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {Number} a
 * @param {Number} b
 * @return {Boolean}
 * @see R.lte
 * @example
 *
 *      R.gte(2, 1); //=> true
 *      R.gte(2, 2); //=> true
 *      R.gte(2, 3); //=> false
 *      R.gte('a', 'z'); //=> false
 *      R.gte('z', 'a'); //=> true
 */


var gte = /*#__PURE__*/_curry2(function gte(a, b) {
  return a >= b;
});
module.exports = gte;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/has.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var hasPath = /*#__PURE__*/require('./hasPath');

/**
 * Returns whether or not an object has an own property with the specified name
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Object
 * @sig s -> {s: x} -> Boolean
 * @param {String} prop The name of the property to check for.
 * @param {Object} obj The object to query.
 * @return {Boolean} Whether the property exists.
 * @example
 *
 *      const hasName = R.has('name');
 *      hasName({name: 'alice'});   //=> true
 *      hasName({name: 'bob'});     //=> true
 *      hasName({});                //=> false
 *
 *      const point = {x: 0, y: 0};
 *      const pointHas = R.has(R.__, point);
 *      pointHas('x');  //=> true
 *      pointHas('y');  //=> true
 *      pointHas('z');  //=> false
 */


var has = /*#__PURE__*/_curry2(function has(prop, obj) {
  return hasPath([prop], obj);
});
module.exports = has;
},{"./hasPath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/hasPath.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/hasIn.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns whether or not an object or its prototype chain has a property with
 * the specified name
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Object
 * @sig s -> {s: x} -> Boolean
 * @param {String} prop The name of the property to check for.
 * @param {Object} obj The object to query.
 * @return {Boolean} Whether the property exists.
 * @example
 *
 *      function Rectangle(width, height) {
 *        this.width = width;
 *        this.height = height;
 *      }
 *      Rectangle.prototype.area = function() {
 *        return this.width * this.height;
 *      };
 *
 *      const square = new Rectangle(2, 2);
 *      R.hasIn('width', square);  //=> true
 *      R.hasIn('area', square);  //=> true
 */


var hasIn = /*#__PURE__*/_curry2(function hasIn(prop, obj) {
  return prop in obj;
});
module.exports = hasIn;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/hasPath.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _has = /*#__PURE__*/require('./internal/_has');

/**
 * Returns whether or not a path exists in an object. Only the object's
 * own properties are checked.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Object
 * @typedefn Idx = String | Int
 * @sig [Idx] -> {a} -> Boolean
 * @param {Array} path The path to use.
 * @param {Object} obj The object to check the path in.
 * @return {Boolean} Whether the path exists.
 * @see R.has
 * @example
 *
 *      R.hasPath(['a', 'b'], {a: {b: 2}});         // => true
 *      R.hasPath(['a', 'b'], {a: {b: undefined}}); // => true
 *      R.hasPath(['a', 'b'], {a: {c: 2}});         // => false
 *      R.hasPath(['a', 'b'], {});                  // => false
 */


var hasPath = /*#__PURE__*/_curry2(function hasPath(_path, obj) {
  if (_path.length === 0) {
    return false;
  }
  var val = obj;
  var idx = 0;
  while (idx < _path.length) {
    if (_has(_path[idx], val)) {
      val = val[_path[idx]];
      idx += 1;
    } else {
      return false;
    }
  }
  return true;
});
module.exports = hasPath;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/head.js":[function(require,module,exports){
var nth = /*#__PURE__*/require('./nth');

/**
 * Returns the first element of the given list or string. In some libraries
 * this function is named `first`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> a | Undefined
 * @sig String -> String
 * @param {Array|String} list
 * @return {*}
 * @see R.tail, R.init, R.last
 * @example
 *
 *      R.head(['fi', 'fo', 'fum']); //=> 'fi'
 *      R.head([]); //=> undefined
 *
 *      R.head('abc'); //=> 'a'
 *      R.head(''); //=> ''
 */


var head = /*#__PURE__*/nth(0);
module.exports = head;
},{"./nth":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nth.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/identical.js":[function(require,module,exports){
var _objectIs = /*#__PURE__*/require('./internal/_objectIs');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns true if its arguments are identical, false otherwise. Values are
 * identical if they reference the same memory. `NaN` is identical to `NaN`;
 * `0` and `-0` are not identical.
 *
 * Note this is merely a curried version of ES6 `Object.is`.
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category Relation
 * @sig a -> a -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @example
 *
 *      const o = {};
 *      R.identical(o, o); //=> true
 *      R.identical(1, 1); //=> true
 *      R.identical(1, '1'); //=> false
 *      R.identical([], []); //=> false
 *      R.identical(0, -0); //=> false
 *      R.identical(NaN, NaN); //=> true
 */


var identical = /*#__PURE__*/_curry2(_objectIs);
module.exports = identical;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_objectIs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_objectIs.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/identity.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _identity = /*#__PURE__*/require('./internal/_identity');

/**
 * A function that does nothing but return the parameter supplied to it. Good
 * as a default or placeholder function.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig a -> a
 * @param {*} x The value to return.
 * @return {*} The input value, `x`.
 * @example
 *
 *      R.identity(1); //=> 1
 *
 *      const obj = {};
 *      R.identity(obj) === obj; //=> true
 * @symb R.identity(a) = a
 */


var identity = /*#__PURE__*/_curry1(_identity);
module.exports = identity;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_identity.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/ifElse.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var curryN = /*#__PURE__*/require('./curryN');

/**
 * Creates a function that will process either the `onTrue` or the `onFalse`
 * function depending upon the result of the `condition` predicate.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Logic
 * @sig (*... -> Boolean) -> (*... -> *) -> (*... -> *) -> (*... -> *)
 * @param {Function} condition A predicate function
 * @param {Function} onTrue A function to invoke when the `condition` evaluates to a truthy value.
 * @param {Function} onFalse A function to invoke when the `condition` evaluates to a falsy value.
 * @return {Function} A new function that will process either the `onTrue` or the `onFalse`
 *                    function depending upon the result of the `condition` predicate.
 * @see R.unless, R.when, R.cond
 * @example
 *
 *      const incCount = R.ifElse(
 *        R.has('count'),
 *        R.over(R.lensProp('count'), R.inc),
 *        R.assoc('count', 1)
 *      );
 *      incCount({});           //=> { count: 1 }
 *      incCount({ count: 1 }); //=> { count: 2 }
 */


var ifElse = /*#__PURE__*/_curry3(function ifElse(condition, onTrue, onFalse) {
  return curryN(Math.max(condition.length, onTrue.length, onFalse.length), function _ifElse() {
    return condition.apply(this, arguments) ? onTrue.apply(this, arguments) : onFalse.apply(this, arguments);
  });
});
module.exports = ifElse;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/inc.js":[function(require,module,exports){
var add = /*#__PURE__*/require('./add');

/**
 * Increments its argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Math
 * @sig Number -> Number
 * @param {Number} n
 * @return {Number} n + 1
 * @see R.dec
 * @example
 *
 *      R.inc(42); //=> 43
 */


var inc = /*#__PURE__*/add(1);
module.exports = inc;
},{"./add":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/add.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/includes.js":[function(require,module,exports){
var _includes = /*#__PURE__*/require('./internal/_includes');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns `true` if the specified value is equal, in [`R.equals`](#equals)
 * terms, to at least one element of the given list; `false` otherwise.
 * Works also with strings.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> Boolean
 * @param {Object} a The item to compare against.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if an equivalent item is in the list, `false` otherwise.
 * @see R.any
 * @example
 *
 *      R.includes(3, [1, 2, 3]); //=> true
 *      R.includes(4, [1, 2, 3]); //=> false
 *      R.includes({ name: 'Fred' }, [{ name: 'Fred' }]); //=> true
 *      R.includes([42], [[42]]); //=> true
 *      R.includes('ba', 'banana'); //=>true
 */


var includes = /*#__PURE__*/_curry2(_includes);
module.exports = includes;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includes.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/index.js":[function(require,module,exports){
module.exports = {};
module.exports.F = /*#__PURE__*/require('./F');
module.exports.T = /*#__PURE__*/require('./T');
module.exports.__ = /*#__PURE__*/require('./__');
module.exports.add = /*#__PURE__*/require('./add');
module.exports.addIndex = /*#__PURE__*/require('./addIndex');
module.exports.adjust = /*#__PURE__*/require('./adjust');
module.exports.all = /*#__PURE__*/require('./all');
module.exports.allPass = /*#__PURE__*/require('./allPass');
module.exports.always = /*#__PURE__*/require('./always');
module.exports.and = /*#__PURE__*/require('./and');
module.exports.any = /*#__PURE__*/require('./any');
module.exports.anyPass = /*#__PURE__*/require('./anyPass');
module.exports.ap = /*#__PURE__*/require('./ap');
module.exports.aperture = /*#__PURE__*/require('./aperture');
module.exports.append = /*#__PURE__*/require('./append');
module.exports.apply = /*#__PURE__*/require('./apply');
module.exports.applySpec = /*#__PURE__*/require('./applySpec');
module.exports.applyTo = /*#__PURE__*/require('./applyTo');
module.exports.ascend = /*#__PURE__*/require('./ascend');
module.exports.assoc = /*#__PURE__*/require('./assoc');
module.exports.assocPath = /*#__PURE__*/require('./assocPath');
module.exports.binary = /*#__PURE__*/require('./binary');
module.exports.bind = /*#__PURE__*/require('./bind');
module.exports.both = /*#__PURE__*/require('./both');
module.exports.call = /*#__PURE__*/require('./call');
module.exports.chain = /*#__PURE__*/require('./chain');
module.exports.clamp = /*#__PURE__*/require('./clamp');
module.exports.clone = /*#__PURE__*/require('./clone');
module.exports.comparator = /*#__PURE__*/require('./comparator');
module.exports.complement = /*#__PURE__*/require('./complement');
module.exports.compose = /*#__PURE__*/require('./compose');
module.exports.composeK = /*#__PURE__*/require('./composeK');
module.exports.composeP = /*#__PURE__*/require('./composeP');
module.exports.composeWith = /*#__PURE__*/require('./composeWith');
module.exports.concat = /*#__PURE__*/require('./concat');
module.exports.cond = /*#__PURE__*/require('./cond');
module.exports.construct = /*#__PURE__*/require('./construct');
module.exports.constructN = /*#__PURE__*/require('./constructN');
module.exports.contains = /*#__PURE__*/require('./contains');
module.exports.converge = /*#__PURE__*/require('./converge');
module.exports.countBy = /*#__PURE__*/require('./countBy');
module.exports.curry = /*#__PURE__*/require('./curry');
module.exports.curryN = /*#__PURE__*/require('./curryN');
module.exports.dec = /*#__PURE__*/require('./dec');
module.exports.defaultTo = /*#__PURE__*/require('./defaultTo');
module.exports.descend = /*#__PURE__*/require('./descend');
module.exports.difference = /*#__PURE__*/require('./difference');
module.exports.differenceWith = /*#__PURE__*/require('./differenceWith');
module.exports.dissoc = /*#__PURE__*/require('./dissoc');
module.exports.dissocPath = /*#__PURE__*/require('./dissocPath');
module.exports.divide = /*#__PURE__*/require('./divide');
module.exports.drop = /*#__PURE__*/require('./drop');
module.exports.dropLast = /*#__PURE__*/require('./dropLast');
module.exports.dropLastWhile = /*#__PURE__*/require('./dropLastWhile');
module.exports.dropRepeats = /*#__PURE__*/require('./dropRepeats');
module.exports.dropRepeatsWith = /*#__PURE__*/require('./dropRepeatsWith');
module.exports.dropWhile = /*#__PURE__*/require('./dropWhile');
module.exports.either = /*#__PURE__*/require('./either');
module.exports.empty = /*#__PURE__*/require('./empty');
module.exports.endsWith = /*#__PURE__*/require('./endsWith');
module.exports.eqBy = /*#__PURE__*/require('./eqBy');
module.exports.eqProps = /*#__PURE__*/require('./eqProps');
module.exports.equals = /*#__PURE__*/require('./equals');
module.exports.evolve = /*#__PURE__*/require('./evolve');
module.exports.filter = /*#__PURE__*/require('./filter');
module.exports.find = /*#__PURE__*/require('./find');
module.exports.findIndex = /*#__PURE__*/require('./findIndex');
module.exports.findLast = /*#__PURE__*/require('./findLast');
module.exports.findLastIndex = /*#__PURE__*/require('./findLastIndex');
module.exports.flatten = /*#__PURE__*/require('./flatten');
module.exports.flip = /*#__PURE__*/require('./flip');
module.exports.forEach = /*#__PURE__*/require('./forEach');
module.exports.forEachObjIndexed = /*#__PURE__*/require('./forEachObjIndexed');
module.exports.fromPairs = /*#__PURE__*/require('./fromPairs');
module.exports.groupBy = /*#__PURE__*/require('./groupBy');
module.exports.groupWith = /*#__PURE__*/require('./groupWith');
module.exports.gt = /*#__PURE__*/require('./gt');
module.exports.gte = /*#__PURE__*/require('./gte');
module.exports.has = /*#__PURE__*/require('./has');
module.exports.hasIn = /*#__PURE__*/require('./hasIn');
module.exports.hasPath = /*#__PURE__*/require('./hasPath');
module.exports.head = /*#__PURE__*/require('./head');
module.exports.identical = /*#__PURE__*/require('./identical');
module.exports.identity = /*#__PURE__*/require('./identity');
module.exports.ifElse = /*#__PURE__*/require('./ifElse');
module.exports.inc = /*#__PURE__*/require('./inc');
module.exports.includes = /*#__PURE__*/require('./includes');
module.exports.indexBy = /*#__PURE__*/require('./indexBy');
module.exports.indexOf = /*#__PURE__*/require('./indexOf');
module.exports.init = /*#__PURE__*/require('./init');
module.exports.innerJoin = /*#__PURE__*/require('./innerJoin');
module.exports.insert = /*#__PURE__*/require('./insert');
module.exports.insertAll = /*#__PURE__*/require('./insertAll');
module.exports.intersection = /*#__PURE__*/require('./intersection');
module.exports.intersperse = /*#__PURE__*/require('./intersperse');
module.exports.into = /*#__PURE__*/require('./into');
module.exports.invert = /*#__PURE__*/require('./invert');
module.exports.invertObj = /*#__PURE__*/require('./invertObj');
module.exports.invoker = /*#__PURE__*/require('./invoker');
module.exports.is = /*#__PURE__*/require('./is');
module.exports.isEmpty = /*#__PURE__*/require('./isEmpty');
module.exports.isNil = /*#__PURE__*/require('./isNil');
module.exports.join = /*#__PURE__*/require('./join');
module.exports.juxt = /*#__PURE__*/require('./juxt');
module.exports.keys = /*#__PURE__*/require('./keys');
module.exports.keysIn = /*#__PURE__*/require('./keysIn');
module.exports.last = /*#__PURE__*/require('./last');
module.exports.lastIndexOf = /*#__PURE__*/require('./lastIndexOf');
module.exports.length = /*#__PURE__*/require('./length');
module.exports.lens = /*#__PURE__*/require('./lens');
module.exports.lensIndex = /*#__PURE__*/require('./lensIndex');
module.exports.lensPath = /*#__PURE__*/require('./lensPath');
module.exports.lensProp = /*#__PURE__*/require('./lensProp');
module.exports.lift = /*#__PURE__*/require('./lift');
module.exports.liftN = /*#__PURE__*/require('./liftN');
module.exports.lt = /*#__PURE__*/require('./lt');
module.exports.lte = /*#__PURE__*/require('./lte');
module.exports.map = /*#__PURE__*/require('./map');
module.exports.mapAccum = /*#__PURE__*/require('./mapAccum');
module.exports.mapAccumRight = /*#__PURE__*/require('./mapAccumRight');
module.exports.mapObjIndexed = /*#__PURE__*/require('./mapObjIndexed');
module.exports.match = /*#__PURE__*/require('./match');
module.exports.mathMod = /*#__PURE__*/require('./mathMod');
module.exports.max = /*#__PURE__*/require('./max');
module.exports.maxBy = /*#__PURE__*/require('./maxBy');
module.exports.mean = /*#__PURE__*/require('./mean');
module.exports.median = /*#__PURE__*/require('./median');
module.exports.memoizeWith = /*#__PURE__*/require('./memoizeWith');
module.exports.merge = /*#__PURE__*/require('./merge');
module.exports.mergeAll = /*#__PURE__*/require('./mergeAll');
module.exports.mergeDeepLeft = /*#__PURE__*/require('./mergeDeepLeft');
module.exports.mergeDeepRight = /*#__PURE__*/require('./mergeDeepRight');
module.exports.mergeDeepWith = /*#__PURE__*/require('./mergeDeepWith');
module.exports.mergeDeepWithKey = /*#__PURE__*/require('./mergeDeepWithKey');
module.exports.mergeLeft = /*#__PURE__*/require('./mergeLeft');
module.exports.mergeRight = /*#__PURE__*/require('./mergeRight');
module.exports.mergeWith = /*#__PURE__*/require('./mergeWith');
module.exports.mergeWithKey = /*#__PURE__*/require('./mergeWithKey');
module.exports.min = /*#__PURE__*/require('./min');
module.exports.minBy = /*#__PURE__*/require('./minBy');
module.exports.modulo = /*#__PURE__*/require('./modulo');
module.exports.move = /*#__PURE__*/require('./move');
module.exports.multiply = /*#__PURE__*/require('./multiply');
module.exports.nAry = /*#__PURE__*/require('./nAry');
module.exports.negate = /*#__PURE__*/require('./negate');
module.exports.none = /*#__PURE__*/require('./none');
module.exports.not = /*#__PURE__*/require('./not');
module.exports.nth = /*#__PURE__*/require('./nth');
module.exports.nthArg = /*#__PURE__*/require('./nthArg');
module.exports.o = /*#__PURE__*/require('./o');
module.exports.objOf = /*#__PURE__*/require('./objOf');
module.exports.of = /*#__PURE__*/require('./of');
module.exports.omit = /*#__PURE__*/require('./omit');
module.exports.once = /*#__PURE__*/require('./once');
module.exports.or = /*#__PURE__*/require('./or');
module.exports.otherwise = /*#__PURE__*/require('./otherwise');
module.exports.over = /*#__PURE__*/require('./over');
module.exports.pair = /*#__PURE__*/require('./pair');
module.exports.partial = /*#__PURE__*/require('./partial');
module.exports.partialRight = /*#__PURE__*/require('./partialRight');
module.exports.partition = /*#__PURE__*/require('./partition');
module.exports.path = /*#__PURE__*/require('./path');
module.exports.pathEq = /*#__PURE__*/require('./pathEq');
module.exports.pathOr = /*#__PURE__*/require('./pathOr');
module.exports.pathSatisfies = /*#__PURE__*/require('./pathSatisfies');
module.exports.pick = /*#__PURE__*/require('./pick');
module.exports.pickAll = /*#__PURE__*/require('./pickAll');
module.exports.pickBy = /*#__PURE__*/require('./pickBy');
module.exports.pipe = /*#__PURE__*/require('./pipe');
module.exports.pipeK = /*#__PURE__*/require('./pipeK');
module.exports.pipeP = /*#__PURE__*/require('./pipeP');
module.exports.pipeWith = /*#__PURE__*/require('./pipeWith');
module.exports.pluck = /*#__PURE__*/require('./pluck');
module.exports.prepend = /*#__PURE__*/require('./prepend');
module.exports.product = /*#__PURE__*/require('./product');
module.exports.project = /*#__PURE__*/require('./project');
module.exports.prop = /*#__PURE__*/require('./prop');
module.exports.propEq = /*#__PURE__*/require('./propEq');
module.exports.propIs = /*#__PURE__*/require('./propIs');
module.exports.propOr = /*#__PURE__*/require('./propOr');
module.exports.propSatisfies = /*#__PURE__*/require('./propSatisfies');
module.exports.props = /*#__PURE__*/require('./props');
module.exports.range = /*#__PURE__*/require('./range');
module.exports.reduce = /*#__PURE__*/require('./reduce');
module.exports.reduceBy = /*#__PURE__*/require('./reduceBy');
module.exports.reduceRight = /*#__PURE__*/require('./reduceRight');
module.exports.reduceWhile = /*#__PURE__*/require('./reduceWhile');
module.exports.reduced = /*#__PURE__*/require('./reduced');
module.exports.reject = /*#__PURE__*/require('./reject');
module.exports.remove = /*#__PURE__*/require('./remove');
module.exports.repeat = /*#__PURE__*/require('./repeat');
module.exports.replace = /*#__PURE__*/require('./replace');
module.exports.reverse = /*#__PURE__*/require('./reverse');
module.exports.scan = /*#__PURE__*/require('./scan');
module.exports.sequence = /*#__PURE__*/require('./sequence');
module.exports.set = /*#__PURE__*/require('./set');
module.exports.slice = /*#__PURE__*/require('./slice');
module.exports.sort = /*#__PURE__*/require('./sort');
module.exports.sortBy = /*#__PURE__*/require('./sortBy');
module.exports.sortWith = /*#__PURE__*/require('./sortWith');
module.exports.split = /*#__PURE__*/require('./split');
module.exports.splitAt = /*#__PURE__*/require('./splitAt');
module.exports.splitEvery = /*#__PURE__*/require('./splitEvery');
module.exports.splitWhen = /*#__PURE__*/require('./splitWhen');
module.exports.startsWith = /*#__PURE__*/require('./startsWith');
module.exports.subtract = /*#__PURE__*/require('./subtract');
module.exports.sum = /*#__PURE__*/require('./sum');
module.exports.symmetricDifference = /*#__PURE__*/require('./symmetricDifference');
module.exports.symmetricDifferenceWith = /*#__PURE__*/require('./symmetricDifferenceWith');
module.exports.tail = /*#__PURE__*/require('./tail');
module.exports.take = /*#__PURE__*/require('./take');
module.exports.takeLast = /*#__PURE__*/require('./takeLast');
module.exports.takeLastWhile = /*#__PURE__*/require('./takeLastWhile');
module.exports.takeWhile = /*#__PURE__*/require('./takeWhile');
module.exports.tap = /*#__PURE__*/require('./tap');
module.exports.test = /*#__PURE__*/require('./test');
module.exports.then = /*#__PURE__*/require('./then');
module.exports.times = /*#__PURE__*/require('./times');
module.exports.toLower = /*#__PURE__*/require('./toLower');
module.exports.toPairs = /*#__PURE__*/require('./toPairs');
module.exports.toPairsIn = /*#__PURE__*/require('./toPairsIn');
module.exports.toString = /*#__PURE__*/require('./toString');
module.exports.toUpper = /*#__PURE__*/require('./toUpper');
module.exports.transduce = /*#__PURE__*/require('./transduce');
module.exports.transpose = /*#__PURE__*/require('./transpose');
module.exports.traverse = /*#__PURE__*/require('./traverse');
module.exports.trim = /*#__PURE__*/require('./trim');
module.exports.tryCatch = /*#__PURE__*/require('./tryCatch');
module.exports.type = /*#__PURE__*/require('./type');
module.exports.unapply = /*#__PURE__*/require('./unapply');
module.exports.unary = /*#__PURE__*/require('./unary');
module.exports.uncurryN = /*#__PURE__*/require('./uncurryN');
module.exports.unfold = /*#__PURE__*/require('./unfold');
module.exports.union = /*#__PURE__*/require('./union');
module.exports.unionWith = /*#__PURE__*/require('./unionWith');
module.exports.uniq = /*#__PURE__*/require('./uniq');
module.exports.uniqBy = /*#__PURE__*/require('./uniqBy');
module.exports.uniqWith = /*#__PURE__*/require('./uniqWith');
module.exports.unless = /*#__PURE__*/require('./unless');
module.exports.unnest = /*#__PURE__*/require('./unnest');
module.exports.until = /*#__PURE__*/require('./until');
module.exports.update = /*#__PURE__*/require('./update');
module.exports.useWith = /*#__PURE__*/require('./useWith');
module.exports.values = /*#__PURE__*/require('./values');
module.exports.valuesIn = /*#__PURE__*/require('./valuesIn');
module.exports.view = /*#__PURE__*/require('./view');
module.exports.when = /*#__PURE__*/require('./when');
module.exports.where = /*#__PURE__*/require('./where');
module.exports.whereEq = /*#__PURE__*/require('./whereEq');
module.exports.without = /*#__PURE__*/require('./without');
module.exports.xprod = /*#__PURE__*/require('./xprod');
module.exports.zip = /*#__PURE__*/require('./zip');
module.exports.zipObj = /*#__PURE__*/require('./zipObj');
module.exports.zipWith = /*#__PURE__*/require('./zipWith');
module.exports.thunkify = /*#__PURE__*/require('./thunkify');
},{"./F":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/F.js","./T":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/T.js","./__":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/__.js","./add":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/add.js","./addIndex":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/addIndex.js","./adjust":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/adjust.js","./all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/all.js","./allPass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/allPass.js","./always":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/always.js","./and":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/and.js","./any":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/any.js","./anyPass":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/anyPass.js","./ap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/ap.js","./aperture":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/aperture.js","./append":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/append.js","./apply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/apply.js","./applySpec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/applySpec.js","./applyTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/applyTo.js","./ascend":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/ascend.js","./assoc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/assoc.js","./assocPath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/assocPath.js","./binary":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/binary.js","./bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/bind.js","./both":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/both.js","./call":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/call.js","./chain":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/chain.js","./clamp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/clamp.js","./clone":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/clone.js","./comparator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/comparator.js","./complement":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/complement.js","./compose":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/compose.js","./composeK":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/composeK.js","./composeP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/composeP.js","./composeWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/composeWith.js","./concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/concat.js","./cond":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/cond.js","./construct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/construct.js","./constructN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/constructN.js","./contains":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/contains.js","./converge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/converge.js","./countBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/countBy.js","./curry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curry.js","./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./dec":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dec.js","./defaultTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/defaultTo.js","./descend":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/descend.js","./difference":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/difference.js","./differenceWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/differenceWith.js","./dissoc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dissoc.js","./dissocPath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dissocPath.js","./divide":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/divide.js","./drop":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/drop.js","./dropLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dropLast.js","./dropLastWhile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dropLastWhile.js","./dropRepeats":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dropRepeats.js","./dropRepeatsWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dropRepeatsWith.js","./dropWhile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/dropWhile.js","./either":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/either.js","./empty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/empty.js","./endsWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/endsWith.js","./eqBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/eqBy.js","./eqProps":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/eqProps.js","./equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","./evolve":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/evolve.js","./filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/filter.js","./find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/find.js","./findIndex":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/findIndex.js","./findLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/findLast.js","./findLastIndex":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/findLastIndex.js","./flatten":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/flatten.js","./flip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/flip.js","./forEach":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/forEach.js","./forEachObjIndexed":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/forEachObjIndexed.js","./fromPairs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/fromPairs.js","./groupBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/groupBy.js","./groupWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/groupWith.js","./gt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/gt.js","./gte":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/gte.js","./has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/has.js","./hasIn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/hasIn.js","./hasPath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/hasPath.js","./head":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/head.js","./identical":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/identical.js","./identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/identity.js","./ifElse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/ifElse.js","./inc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/inc.js","./includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/includes.js","./indexBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/indexBy.js","./indexOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/indexOf.js","./init":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/init.js","./innerJoin":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/innerJoin.js","./insert":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/insert.js","./insertAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/insertAll.js","./intersection":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/intersection.js","./intersperse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/intersperse.js","./into":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/into.js","./invert":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/invert.js","./invertObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/invertObj.js","./invoker":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/invoker.js","./is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/is.js","./isEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isEmpty.js","./isNil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isNil.js","./join":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/join.js","./juxt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/juxt.js","./keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js","./keysIn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keysIn.js","./last":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/last.js","./lastIndexOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lastIndexOf.js","./length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/length.js","./lens":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lens.js","./lensIndex":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lensIndex.js","./lensPath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lensPath.js","./lensProp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lensProp.js","./lift":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lift.js","./liftN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/liftN.js","./lt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lt.js","./lte":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lte.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js","./mapAccum":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mapAccum.js","./mapAccumRight":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mapAccumRight.js","./mapObjIndexed":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mapObjIndexed.js","./match":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/match.js","./mathMod":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mathMod.js","./max":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/max.js","./maxBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/maxBy.js","./mean":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mean.js","./median":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/median.js","./memoizeWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/memoizeWith.js","./merge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/merge.js","./mergeAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeAll.js","./mergeDeepLeft":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeDeepLeft.js","./mergeDeepRight":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeDeepRight.js","./mergeDeepWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeDeepWith.js","./mergeDeepWithKey":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeDeepWithKey.js","./mergeLeft":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeLeft.js","./mergeRight":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeRight.js","./mergeWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeWith.js","./mergeWithKey":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeWithKey.js","./min":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/min.js","./minBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/minBy.js","./modulo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/modulo.js","./move":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/move.js","./multiply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/multiply.js","./nAry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nAry.js","./negate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/negate.js","./none":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/none.js","./not":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/not.js","./nth":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nth.js","./nthArg":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nthArg.js","./o":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/o.js","./objOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/objOf.js","./of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/of.js","./omit":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/omit.js","./once":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/once.js","./or":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/or.js","./otherwise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/otherwise.js","./over":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/over.js","./pair":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pair.js","./partial":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/partial.js","./partialRight":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/partialRight.js","./partition":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/partition.js","./path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/path.js","./pathEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pathEq.js","./pathOr":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pathOr.js","./pathSatisfies":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pathSatisfies.js","./pick":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pick.js","./pickAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pickAll.js","./pickBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pickBy.js","./pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipe.js","./pipeK":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipeK.js","./pipeP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipeP.js","./pipeWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipeWith.js","./pluck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pluck.js","./prepend":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/prepend.js","./product":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/product.js","./project":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/project.js","./prop":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/prop.js","./propEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/propEq.js","./propIs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/propIs.js","./propOr":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/propOr.js","./propSatisfies":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/propSatisfies.js","./props":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/props.js","./range":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/range.js","./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduce.js","./reduceBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduceBy.js","./reduceRight":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduceRight.js","./reduceWhile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduceWhile.js","./reduced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduced.js","./reject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reject.js","./remove":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/remove.js","./repeat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/repeat.js","./replace":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/replace.js","./reverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reverse.js","./scan":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/scan.js","./sequence":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sequence.js","./set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/set.js","./slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js","./sort":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sort.js","./sortBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sortBy.js","./sortWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sortWith.js","./split":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/split.js","./splitAt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/splitAt.js","./splitEvery":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/splitEvery.js","./splitWhen":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/splitWhen.js","./startsWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/startsWith.js","./subtract":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/subtract.js","./sum":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sum.js","./symmetricDifference":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/symmetricDifference.js","./symmetricDifferenceWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/symmetricDifferenceWith.js","./tail":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/tail.js","./take":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/take.js","./takeLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/takeLast.js","./takeLastWhile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/takeLastWhile.js","./takeWhile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/takeWhile.js","./tap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/tap.js","./test":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/test.js","./then":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/then.js","./thunkify":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/thunkify.js","./times":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/times.js","./toLower":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toLower.js","./toPairs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toPairs.js","./toPairsIn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toPairsIn.js","./toString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toString.js","./toUpper":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toUpper.js","./transduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/transduce.js","./transpose":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/transpose.js","./traverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/traverse.js","./trim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/trim.js","./tryCatch":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/tryCatch.js","./type":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/type.js","./unapply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unapply.js","./unary":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unary.js","./uncurryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uncurryN.js","./unfold":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unfold.js","./union":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/union.js","./unionWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unionWith.js","./uniq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uniq.js","./uniqBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uniqBy.js","./uniqWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uniqWith.js","./unless":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unless.js","./unnest":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unnest.js","./until":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/until.js","./update":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/update.js","./useWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/useWith.js","./values":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/values.js","./valuesIn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/valuesIn.js","./view":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/view.js","./when":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/when.js","./where":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/where.js","./whereEq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/whereEq.js","./without":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/without.js","./xprod":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/xprod.js","./zip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/zip.js","./zipObj":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/zipObj.js","./zipWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/zipWith.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/indexBy.js":[function(require,module,exports){
var reduceBy = /*#__PURE__*/require('./reduceBy');

/**
 * Given a function that generates a key, turns a list of objects into an
 * object indexing the objects by the given key. Note that if multiple
 * objects generate the same value for the indexing key only the last value
 * will be included in the generated object.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig (a -> String) -> [{k: v}] -> {k: {k: v}}
 * @param {Function} fn Function :: a -> String
 * @param {Array} array The array of objects to index
 * @return {Object} An object indexing each array element by the given property.
 * @example
 *
 *      const list = [{id: 'xyz', title: 'A'}, {id: 'abc', title: 'B'}];
 *      R.indexBy(R.prop('id'), list);
 *      //=> {abc: {id: 'abc', title: 'B'}, xyz: {id: 'xyz', title: 'A'}}
 */


var indexBy = /*#__PURE__*/reduceBy(function (acc, elem) {
  return elem;
}, null);
module.exports = indexBy;
},{"./reduceBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduceBy.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/indexOf.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _indexOf = /*#__PURE__*/require('./internal/_indexOf');

var _isArray = /*#__PURE__*/require('./internal/_isArray');

/**
 * Returns the position of the first occurrence of an item in an array, or -1
 * if the item is not included in the array. [`R.equals`](#equals) is used to
 * determine equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> Number
 * @param {*} target The item to find.
 * @param {Array} xs The array to search in.
 * @return {Number} the index of the target, or -1 if the target is not found.
 * @see R.lastIndexOf
 * @example
 *
 *      R.indexOf(3, [1,2,3,4]); //=> 2
 *      R.indexOf(10, [1,2,3,4]); //=> -1
 */


var indexOf = /*#__PURE__*/_curry2(function indexOf(target, xs) {
  return typeof xs.indexOf === 'function' && !_isArray(xs) ? xs.indexOf(target) : _indexOf(xs, target, 0);
});
module.exports = indexOf;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_indexOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_indexOf.js","./internal/_isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/init.js":[function(require,module,exports){
var slice = /*#__PURE__*/require('./slice');

/**
 * Returns all but the last element of the given list or string.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category List
 * @sig [a] -> [a]
 * @sig String -> String
 * @param {*} list
 * @return {*}
 * @see R.last, R.head, R.tail
 * @example
 *
 *      R.init([1, 2, 3]);  //=> [1, 2]
 *      R.init([1, 2]);     //=> [1]
 *      R.init([1]);        //=> []
 *      R.init([]);         //=> []
 *
 *      R.init('abc');  //=> 'ab'
 *      R.init('ab');   //=> 'a'
 *      R.init('a');    //=> ''
 *      R.init('');     //=> ''
 */


var init = /*#__PURE__*/slice(0, -1);
module.exports = init;
},{"./slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/innerJoin.js":[function(require,module,exports){
var _includesWith = /*#__PURE__*/require('./internal/_includesWith');

var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var _filter = /*#__PURE__*/require('./internal/_filter');

/**
 * Takes a predicate `pred`, a list `xs`, and a list `ys`, and returns a list
 * `xs'` comprising each of the elements of `xs` which is equal to one or more
 * elements of `ys` according to `pred`.
 *
 * `pred` must be a binary function expecting an element from each list.
 *
 * `xs`, `ys`, and `xs'` are treated as sets, semantically, so ordering should
 * not be significant, but since `xs'` is ordered the implementation guarantees
 * that its values are in the same order as they appear in `xs`. Duplicates are
 * not removed, so `xs'` may contain duplicates if `xs` contains duplicates.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Relation
 * @sig ((a, b) -> Boolean) -> [a] -> [b] -> [a]
 * @param {Function} pred
 * @param {Array} xs
 * @param {Array} ys
 * @return {Array}
 * @see R.intersection
 * @example
 *
 *      R.innerJoin(
 *        (record, id) => record.id === id,
 *        [{id: 824, name: 'Richie Furay'},
 *         {id: 956, name: 'Dewey Martin'},
 *         {id: 313, name: 'Bruce Palmer'},
 *         {id: 456, name: 'Stephen Stills'},
 *         {id: 177, name: 'Neil Young'}],
 *        [177, 456, 999]
 *      );
 *      //=> [{id: 456, name: 'Stephen Stills'}, {id: 177, name: 'Neil Young'}]
 */


var innerJoin = /*#__PURE__*/_curry3(function innerJoin(pred, xs, ys) {
  return _filter(function (x) {
    return _includesWith(pred, x, ys);
  }, xs);
});
module.exports = innerJoin;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./internal/_filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_filter.js","./internal/_includesWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includesWith.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/insert.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Inserts the supplied element into the list, at the specified `index`. _Note that

 * this is not destructive_: it returns a copy of the list with the changes.
 * <small>No lists have been harmed in the application of this function.</small>
 *
 * @func
 * @memberOf R
 * @since v0.2.2
 * @category List
 * @sig Number -> a -> [a] -> [a]
 * @param {Number} index The position to insert the element
 * @param {*} elt The element to insert into the Array
 * @param {Array} list The list to insert into
 * @return {Array} A new Array with `elt` inserted at `index`.
 * @example
 *
 *      R.insert(2, 'x', [1,2,3,4]); //=> [1,2,'x',3,4]
 */


var insert = /*#__PURE__*/_curry3(function insert(idx, elt, list) {
  idx = idx < list.length && idx >= 0 ? idx : list.length;
  var result = Array.prototype.slice.call(list, 0);
  result.splice(idx, 0, elt);
  return result;
});
module.exports = insert;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/insertAll.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Inserts the sub-list into the list, at the specified `index`. _Note that this is not
 * destructive_: it returns a copy of the list with the changes.
 * <small>No lists have been harmed in the application of this function.</small>
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category List
 * @sig Number -> [a] -> [a] -> [a]
 * @param {Number} index The position to insert the sub-list
 * @param {Array} elts The sub-list to insert into the Array
 * @param {Array} list The list to insert the sub-list into
 * @return {Array} A new Array with `elts` inserted starting at `index`.
 * @example
 *
 *      R.insertAll(2, ['x','y','z'], [1,2,3,4]); //=> [1,2,'x','y','z',3,4]
 */


var insertAll = /*#__PURE__*/_curry3(function insertAll(idx, elts, list) {
  idx = idx < list.length && idx >= 0 ? idx : list.length;
  return [].concat(Array.prototype.slice.call(list, 0, idx), elts, Array.prototype.slice.call(list, idx));
});
module.exports = insertAll;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_Set.js":[function(require,module,exports){
var _includes = /*#__PURE__*/require('./_includes');

var _Set = /*#__PURE__*/function () {

  function _Set() {
    /* globals Set */
    this._nativeSet = typeof Set === 'function' ? new Set() : null;
    this._items = {};
  }

  // until we figure out why jsdoc chokes on this
  // @param item The item to add to the Set
  // @returns {boolean} true if the item did not exist prior, otherwise false
  //
  _Set.prototype.add = function (item) {
    return !hasOrAdd(item, true, this);
  };

  //
  // @param item The item to check for existence in the Set
  // @returns {boolean} true if the item exists in the Set, otherwise false
  //
  _Set.prototype.has = function (item) {
    return hasOrAdd(item, false, this);
  };

  //
  // Combines the logic for checking whether an item is a member of the set and
  // for adding a new item to the set.
  //
  // @param item       The item to check or add to the Set instance.
  // @param shouldAdd  If true, the item will be added to the set if it doesn't
  //                   already exist.
  // @param set        The set instance to check or add to.
  // @return {boolean} true if the item already existed, otherwise false.
  //
  return _Set;
}();

function hasOrAdd(item, shouldAdd, set) {
  var type = typeof item;
  var prevSize, newSize;
  switch (type) {
    case 'string':
    case 'number':
      // distinguish between +0 and -0
      if (item === 0 && 1 / item === -Infinity) {
        if (set._items['-0']) {
          return true;
        } else {
          if (shouldAdd) {
            set._items['-0'] = true;
          }
          return false;
        }
      }
      // these types can all utilise the native Set
      if (set._nativeSet !== null) {
        if (shouldAdd) {
          prevSize = set._nativeSet.size;
          set._nativeSet.add(item);
          newSize = set._nativeSet.size;
          return newSize === prevSize;
        } else {
          return set._nativeSet.has(item);
        }
      } else {
        if (!(type in set._items)) {
          if (shouldAdd) {
            set._items[type] = {};
            set._items[type][item] = true;
          }
          return false;
        } else if (item in set._items[type]) {
          return true;
        } else {
          if (shouldAdd) {
            set._items[type][item] = true;
          }
          return false;
        }
      }

    case 'boolean':
      // set._items['boolean'] holds a two element array
      // representing [ falseExists, trueExists ]
      if (type in set._items) {
        var bIdx = item ? 1 : 0;
        if (set._items[type][bIdx]) {
          return true;
        } else {
          if (shouldAdd) {
            set._items[type][bIdx] = true;
          }
          return false;
        }
      } else {
        if (shouldAdd) {
          set._items[type] = item ? [false, true] : [true, false];
        }
        return false;
      }

    case 'function':
      // compare functions for reference equality
      if (set._nativeSet !== null) {
        if (shouldAdd) {
          prevSize = set._nativeSet.size;
          set._nativeSet.add(item);
          newSize = set._nativeSet.size;
          return newSize === prevSize;
        } else {
          return set._nativeSet.has(item);
        }
      } else {
        if (!(type in set._items)) {
          if (shouldAdd) {
            set._items[type] = [item];
          }
          return false;
        }
        if (!_includes(item, set._items[type])) {
          if (shouldAdd) {
            set._items[type].push(item);
          }
          return false;
        }
        return true;
      }

    case 'undefined':
      if (set._items[type]) {
        return true;
      } else {
        if (shouldAdd) {
          set._items[type] = true;
        }
        return false;
      }

    case 'object':
      if (item === null) {
        if (!set._items['null']) {
          if (shouldAdd) {
            set._items['null'] = true;
          }
          return false;
        }
        return true;
      }
    /* falls through */
    default:
      // reduce the search size of heterogeneous sets by creating buckets
      // for each type.
      type = Object.prototype.toString.call(item);
      if (!(type in set._items)) {
        if (shouldAdd) {
          set._items[type] = [item];
        }
        return false;
      }
      // scan through all previously applied items
      if (!_includes(item, set._items[type])) {
        if (shouldAdd) {
          set._items[type].push(item);
        }
        return false;
      }
      return true;
  }
}

// A simple Set type that honours R.equals semantics
module.exports = _Set;
},{"./_includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includes.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_aperture.js":[function(require,module,exports){
function _aperture(n, list) {
  var idx = 0;
  var limit = list.length - (n - 1);
  var acc = new Array(limit >= 0 ? limit : 0);
  while (idx < limit) {
    acc[idx] = Array.prototype.slice.call(list, idx, idx + n);
    idx += 1;
  }
  return acc;
}
module.exports = _aperture;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js":[function(require,module,exports){
function _arity(n, fn) {
  /* eslint-disable no-unused-vars */
  switch (n) {
    case 0:
      return function () {
        return fn.apply(this, arguments);
      };
    case 1:
      return function (a0) {
        return fn.apply(this, arguments);
      };
    case 2:
      return function (a0, a1) {
        return fn.apply(this, arguments);
      };
    case 3:
      return function (a0, a1, a2) {
        return fn.apply(this, arguments);
      };
    case 4:
      return function (a0, a1, a2, a3) {
        return fn.apply(this, arguments);
      };
    case 5:
      return function (a0, a1, a2, a3, a4) {
        return fn.apply(this, arguments);
      };
    case 6:
      return function (a0, a1, a2, a3, a4, a5) {
        return fn.apply(this, arguments);
      };
    case 7:
      return function (a0, a1, a2, a3, a4, a5, a6) {
        return fn.apply(this, arguments);
      };
    case 8:
      return function (a0, a1, a2, a3, a4, a5, a6, a7) {
        return fn.apply(this, arguments);
      };
    case 9:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {
        return fn.apply(this, arguments);
      };
    case 10:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
        return fn.apply(this, arguments);
      };
    default:
      throw new Error('First argument to _arity must be a non-negative integer no greater than ten');
  }
}
module.exports = _arity;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arrayFromIterator.js":[function(require,module,exports){
function _arrayFromIterator(iter) {
  var list = [];
  var next;
  while (!(next = iter.next()).done) {
    list.push(next.value);
  }
  return list;
}
module.exports = _arrayFromIterator;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_assertPromise.js":[function(require,module,exports){
var _isFunction = /*#__PURE__*/require('./_isFunction');

var _toString = /*#__PURE__*/require('./_toString');

function _assertPromise(name, p) {
  if (p == null || !_isFunction(p.then)) {
    throw new TypeError('`' + name + '` expected a Promise, received ' + _toString(p, []));
  }
}
module.exports = _assertPromise;
},{"./_isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isFunction.js","./_toString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_toString.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_checkForMethod.js":[function(require,module,exports){
var _isArray = /*#__PURE__*/require('./_isArray');

/**
 * This checks whether a function has a [methodname] function. If it isn't an
 * array it will execute that function otherwise it will default to the ramda
 * implementation.
 *
 * @private
 * @param {Function} fn ramda implemtation
 * @param {String} methodname property to check for a custom implementation
 * @return {Object} Whatever the return value of the method is.
 */


function _checkForMethod(methodname, fn) {
  return function () {
    var length = arguments.length;
    if (length === 0) {
      return fn();
    }
    var obj = arguments[length - 1];
    return _isArray(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, Array.prototype.slice.call(arguments, 0, length - 1));
  };
}
module.exports = _checkForMethod;
},{"./_isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_clone.js":[function(require,module,exports){
var _cloneRegExp = /*#__PURE__*/require('./_cloneRegExp');

var type = /*#__PURE__*/require('../type');

/**
 * Copies an object.
 *
 * @private
 * @param {*} value The value to be copied
 * @param {Array} refFrom Array containing the source references
 * @param {Array} refTo Array containing the copied source references
 * @param {Boolean} deep Whether or not to perform deep cloning.
 * @return {*} The copied value.
 */


function _clone(value, refFrom, refTo, deep) {
  var copy = function copy(copiedValue) {
    var len = refFrom.length;
    var idx = 0;
    while (idx < len) {
      if (value === refFrom[idx]) {
        return refTo[idx];
      }
      idx += 1;
    }
    refFrom[idx + 1] = value;
    refTo[idx + 1] = copiedValue;
    for (var key in value) {
      copiedValue[key] = deep ? _clone(value[key], refFrom, refTo, true) : value[key];
    }
    return copiedValue;
  };
  switch (type(value)) {
    case 'Object':
      return copy({});
    case 'Array':
      return copy([]);
    case 'Date':
      return new Date(value.valueOf());
    case 'RegExp':
      return _cloneRegExp(value);
    default:
      return value;
  }
}
module.exports = _clone;
},{"../type":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/type.js","./_cloneRegExp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_cloneRegExp.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_cloneRegExp.js":[function(require,module,exports){
function _cloneRegExp(pattern) {
                                  return new RegExp(pattern.source, (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : ''));
}
module.exports = _cloneRegExp;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_complement.js":[function(require,module,exports){
function _complement(f) {
  return function () {
    return !f.apply(this, arguments);
  };
}
module.exports = _complement;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js":[function(require,module,exports){
/**
 * Private `concat` function to merge two array-like objects.
 *
 * @private
 * @param {Array|Arguments} [set1=[]] An array-like object.
 * @param {Array|Arguments} [set2=[]] An array-like object.
 * @return {Array} A new, merged array.
 * @example
 *
 *      _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]
 */
function _concat(set1, set2) {
  set1 = set1 || [];
  set2 = set2 || [];
  var idx;
  var len1 = set1.length;
  var len2 = set2.length;
  var result = [];

  idx = 0;
  while (idx < len1) {
    result[result.length] = set1[idx];
    idx += 1;
  }
  idx = 0;
  while (idx < len2) {
    result[result.length] = set2[idx];
    idx += 1;
  }
  return result;
}
module.exports = _concat;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_createPartialApplicator.js":[function(require,module,exports){
var _arity = /*#__PURE__*/require('./_arity');

var _curry2 = /*#__PURE__*/require('./_curry2');

function _createPartialApplicator(concat) {
  return _curry2(function (fn, args) {
    return _arity(Math.max(0, fn.length - args.length), function () {
      return fn.apply(this, concat(args, arguments));
    });
  });
}
module.exports = _createPartialApplicator;
},{"./_arity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js","./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js":[function(require,module,exports){
var _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');

/**
 * Optimized internal one-arity curry function.
 *
 * @private
 * @category Function
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */


function _curry1(fn) {
  return function f1(a) {
    if (arguments.length === 0 || _isPlaceholder(a)) {
      return f1;
    } else {
      return fn.apply(this, arguments);
    }
  };
}
module.exports = _curry1;
},{"./_isPlaceholder":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isPlaceholder.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./_curry1');

var _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');

/**
 * Optimized internal two-arity curry function.
 *
 * @private
 * @category Function
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */


function _curry2(fn) {
  return function f2(a, b) {
    switch (arguments.length) {
      case 0:
        return f2;
      case 1:
        return _isPlaceholder(a) ? f2 : _curry1(function (_b) {
          return fn(a, _b);
        });
      default:
        return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {
          return fn(_a, b);
        }) : _isPlaceholder(b) ? _curry1(function (_b) {
          return fn(a, _b);
        }) : fn(a, b);
    }
  };
}
module.exports = _curry2;
},{"./_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./_isPlaceholder":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isPlaceholder.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./_curry1');

var _curry2 = /*#__PURE__*/require('./_curry2');

var _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');

/**
 * Optimized internal three-arity curry function.
 *
 * @private
 * @category Function
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */


function _curry3(fn) {
  return function f3(a, b, c) {
    switch (arguments.length) {
      case 0:
        return f3;
      case 1:
        return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) {
          return fn(a, _b, _c);
        });
      case 2:
        return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) {
          return fn(_a, b, _c);
        }) : _isPlaceholder(b) ? _curry2(function (_b, _c) {
          return fn(a, _b, _c);
        }) : _curry1(function (_c) {
          return fn(a, b, _c);
        });
      default:
        return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) {
          return fn(_a, _b, c);
        }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) {
          return fn(_a, b, _c);
        }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) {
          return fn(a, _b, _c);
        }) : _isPlaceholder(a) ? _curry1(function (_a) {
          return fn(_a, b, c);
        }) : _isPlaceholder(b) ? _curry1(function (_b) {
          return fn(a, _b, c);
        }) : _isPlaceholder(c) ? _curry1(function (_c) {
          return fn(a, b, _c);
        }) : fn(a, b, c);
    }
  };
}
module.exports = _curry3;
},{"./_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_isPlaceholder":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isPlaceholder.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curryN.js":[function(require,module,exports){
var _arity = /*#__PURE__*/require('./_arity');

var _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');

/**
 * Internal curryN function.
 *
 * @private
 * @category Function
 * @param {Number} length The arity of the curried function.
 * @param {Array} received An array of arguments received thus far.
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */


function _curryN(length, received, fn) {
  return function () {
    var combined = [];
    var argsIdx = 0;
    var left = length;
    var combinedIdx = 0;
    while (combinedIdx < received.length || argsIdx < arguments.length) {
      var result;
      if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) {
        result = received[combinedIdx];
      } else {
        result = arguments[argsIdx];
        argsIdx += 1;
      }
      combined[combinedIdx] = result;
      if (!_isPlaceholder(result)) {
        left -= 1;
      }
      combinedIdx += 1;
    }
    return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn));
  };
}
module.exports = _curryN;
},{"./_arity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js","./_isPlaceholder":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isPlaceholder.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js":[function(require,module,exports){
var _isArray = /*#__PURE__*/require('./_isArray');

var _isTransformer = /*#__PURE__*/require('./_isTransformer');

/**
 * Returns a function that dispatches with different strategies based on the
 * object in list position (last argument). If it is an array, executes [fn].
 * Otherwise, if it has a function with one of the given method names, it will
 * execute that function (functor case). Otherwise, if it is a transformer,
 * uses transducer [xf] to return a new transformer (transducer case).
 * Otherwise, it will default to executing [fn].
 *
 * @private
 * @param {Array} methodNames properties to check for a custom implementation
 * @param {Function} xf transducer to initialize if object is transformer
 * @param {Function} fn default ramda implementation
 * @return {Function} A function that dispatches on object in list position
 */


function _dispatchable(methodNames, xf, fn) {
  return function () {
    if (arguments.length === 0) {
      return fn();
    }
    var args = Array.prototype.slice.call(arguments, 0);
    var obj = args.pop();
    if (!_isArray(obj)) {
      var idx = 0;
      while (idx < methodNames.length) {
        if (typeof obj[methodNames[idx]] === 'function') {
          return obj[methodNames[idx]].apply(obj, args);
        }
        idx += 1;
      }
      if (_isTransformer(obj)) {
        var transducer = xf.apply(null, args);
        return transducer(obj);
      }
    }
    return fn.apply(this, arguments);
  };
}
module.exports = _dispatchable;
},{"./_isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArray.js","./_isTransformer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isTransformer.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dropLast.js":[function(require,module,exports){
var take = /*#__PURE__*/require('../take');

function dropLast(n, xs) {
  return take(n < xs.length ? xs.length - n : 0, xs);
}
module.exports = dropLast;
},{"../take":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/take.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dropLastWhile.js":[function(require,module,exports){
var slice = /*#__PURE__*/require('../slice');

function dropLastWhile(pred, xs) {
  var idx = xs.length - 1;
  while (idx >= 0 && pred(xs[idx])) {
    idx -= 1;
  }
  return slice(0, idx + 1, xs);
}
module.exports = dropLastWhile;
},{"../slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_equals.js":[function(require,module,exports){
var _arrayFromIterator = /*#__PURE__*/require('./_arrayFromIterator');

var _includesWith = /*#__PURE__*/require('./_includesWith');

var _functionName = /*#__PURE__*/require('./_functionName');

var _has = /*#__PURE__*/require('./_has');

var _objectIs = /*#__PURE__*/require('./_objectIs');

var keys = /*#__PURE__*/require('../keys');

var type = /*#__PURE__*/require('../type');

/**
 * private _uniqContentEquals function.
 * That function is checking equality of 2 iterator contents with 2 assumptions
 * - iterators lengths are the same
 * - iterators values are unique
 *
 * false-positive result will be returned for comparision of, e.g.
 * - [1,2,3] and [1,2,3,4]
 * - [1,1,1] and [1,2,3]
 * */

function _uniqContentEquals(aIterator, bIterator, stackA, stackB) {
  var a = _arrayFromIterator(aIterator);
  var b = _arrayFromIterator(bIterator);

  function eq(_a, _b) {
    return _equals(_a, _b, stackA.slice(), stackB.slice());
  }

  // if *a* array contains any element that is not included in *b*
  return !_includesWith(function (b, aItem) {
    return !_includesWith(eq, aItem, b);
  }, b, a);
}

function _equals(a, b, stackA, stackB) {
  if (_objectIs(a, b)) {
    return true;
  }

  var typeA = type(a);

  if (typeA !== type(b)) {
    return false;
  }

  if (a == null || b == null) {
    return false;
  }

  if (typeof a['fantasy-land/equals'] === 'function' || typeof b['fantasy-land/equals'] === 'function') {
    return typeof a['fantasy-land/equals'] === 'function' && a['fantasy-land/equals'](b) && typeof b['fantasy-land/equals'] === 'function' && b['fantasy-land/equals'](a);
  }

  if (typeof a.equals === 'function' || typeof b.equals === 'function') {
    return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a);
  }

  switch (typeA) {
    case 'Arguments':
    case 'Array':
    case 'Object':
      if (typeof a.constructor === 'function' && _functionName(a.constructor) === 'Promise') {
        return a === b;
      }
      break;
    case 'Boolean':
    case 'Number':
    case 'String':
      if (!(typeof a === typeof b && _objectIs(a.valueOf(), b.valueOf()))) {
        return false;
      }
      break;
    case 'Date':
      if (!_objectIs(a.valueOf(), b.valueOf())) {
        return false;
      }
      break;
    case 'Error':
      return a.name === b.name && a.message === b.message;
    case 'RegExp':
      if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) {
        return false;
      }
      break;
  }

  var idx = stackA.length - 1;
  while (idx >= 0) {
    if (stackA[idx] === a) {
      return stackB[idx] === b;
    }
    idx -= 1;
  }

  switch (typeA) {
    case 'Map':
      if (a.size !== b.size) {
        return false;
      }

      return _uniqContentEquals(a.entries(), b.entries(), stackA.concat([a]), stackB.concat([b]));
    case 'Set':
      if (a.size !== b.size) {
        return false;
      }

      return _uniqContentEquals(a.values(), b.values(), stackA.concat([a]), stackB.concat([b]));
    case 'Arguments':
    case 'Array':
    case 'Object':
    case 'Boolean':
    case 'Number':
    case 'String':
    case 'Date':
    case 'Error':
    case 'RegExp':
    case 'Int8Array':
    case 'Uint8Array':
    case 'Uint8ClampedArray':
    case 'Int16Array':
    case 'Uint16Array':
    case 'Int32Array':
    case 'Uint32Array':
    case 'Float32Array':
    case 'Float64Array':
    case 'ArrayBuffer':
      break;
    default:
      // Values of other types are only equal if identical.
      return false;
  }

  var keysA = keys(a);
  if (keysA.length !== keys(b).length) {
    return false;
  }

  var extendedStackA = stackA.concat([a]);
  var extendedStackB = stackB.concat([b]);

  idx = keysA.length - 1;
  while (idx >= 0) {
    var key = keysA[idx];
    if (!(_has(key, b) && _equals(b[key], a[key], extendedStackA, extendedStackB))) {
      return false;
    }
    idx -= 1;
  }
  return true;
}
module.exports = _equals;
},{"../keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js","../type":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/type.js","./_arrayFromIterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arrayFromIterator.js","./_functionName":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_functionName.js","./_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js","./_includesWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includesWith.js","./_objectIs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_objectIs.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_filter.js":[function(require,module,exports){
function _filter(fn, list) {
  var idx = 0;
  var len = list.length;
  var result = [];

  while (idx < len) {
    if (fn(list[idx])) {
      result[result.length] = list[idx];
    }
    idx += 1;
  }
  return result;
}
module.exports = _filter;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_flatCat.js":[function(require,module,exports){
var _forceReduced = /*#__PURE__*/require('./_forceReduced');

var _isArrayLike = /*#__PURE__*/require('./_isArrayLike');

var _reduce = /*#__PURE__*/require('./_reduce');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var preservingReduced = function (xf) {
  return {
    '@@transducer/init': _xfBase.init,
    '@@transducer/result': function (result) {
      return xf['@@transducer/result'](result);
    },
    '@@transducer/step': function (result, input) {
      var ret = xf['@@transducer/step'](result, input);
      return ret['@@transducer/reduced'] ? _forceReduced(ret) : ret;
    }
  };
};

var _flatCat = function _xcat(xf) {
  var rxf = preservingReduced(xf);
  return {
    '@@transducer/init': _xfBase.init,
    '@@transducer/result': function (result) {
      return rxf['@@transducer/result'](result);
    },
    '@@transducer/step': function (result, input) {
      return !_isArrayLike(input) ? _reduce(rxf, result, [input]) : _reduce(rxf, result, input);
    }
  };
};

module.exports = _flatCat;
},{"./_forceReduced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_forceReduced.js","./_isArrayLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArrayLike.js","./_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_forceReduced.js":[function(require,module,exports){
function _forceReduced(x) {
  return {
    '@@transducer/value': x,
    '@@transducer/reduced': true
  };
}
module.exports = _forceReduced;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_functionName.js":[function(require,module,exports){
function _functionName(f) {
  // String(x => x) evaluates to "x => x", so the pattern may not match.
  var match = String(f).match(/^function (\w*)/);
  return match == null ? '' : match[1];
}
module.exports = _functionName;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js":[function(require,module,exports){
function _has(prop, obj) {
  return Object.prototype.hasOwnProperty.call(obj, prop);
}
module.exports = _has;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_identity.js":[function(require,module,exports){
function _identity(x) {
  return x;
}
module.exports = _identity;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includes.js":[function(require,module,exports){
var _indexOf = /*#__PURE__*/require('./_indexOf');

function _includes(a, list) {
  return _indexOf(list, a, 0) >= 0;
}
module.exports = _includes;
},{"./_indexOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_indexOf.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includesWith.js":[function(require,module,exports){
function _includesWith(pred, x, list) {
  var idx = 0;
  var len = list.length;

  while (idx < len) {
    if (pred(x, list[idx])) {
      return true;
    }
    idx += 1;
  }
  return false;
}
module.exports = _includesWith;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_indexOf.js":[function(require,module,exports){
var equals = /*#__PURE__*/require('../equals');

function _indexOf(list, a, idx) {
  var inf, item;
  // Array.prototype.indexOf doesn't exist below IE9
  if (typeof list.indexOf === 'function') {
    switch (typeof a) {
      case 'number':
        if (a === 0) {
          // manually crawl the list to distinguish between +0 and -0
          inf = 1 / a;
          while (idx < list.length) {
            item = list[idx];
            if (item === 0 && 1 / item === inf) {
              return idx;
            }
            idx += 1;
          }
          return -1;
        } else if (a !== a) {
          // NaN
          while (idx < list.length) {
            item = list[idx];
            if (typeof item === 'number' && item !== item) {
              return idx;
            }
            idx += 1;
          }
          return -1;
        }
        // non-zero numbers can utilise Set
        return list.indexOf(a, idx);

      // all these types can utilise Set
      case 'string':
      case 'boolean':
      case 'function':
      case 'undefined':
        return list.indexOf(a, idx);

      case 'object':
        if (a === null) {
          // null can utilise Set
          return list.indexOf(a, idx);
        }
    }
  }
  // anything else not covered above, defer to R.equals
  while (idx < list.length) {
    if (equals(list[idx], a)) {
      return idx;
    }
    idx += 1;
  }
  return -1;
}
module.exports = _indexOf;
},{"../equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArguments.js":[function(require,module,exports){
var _has = /*#__PURE__*/require('./_has');

var toString = Object.prototype.toString;
var _isArguments = /*#__PURE__*/function () {
  return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) {
    return toString.call(x) === '[object Arguments]';
  } : function _isArguments(x) {
    return _has('callee', x);
  };
}();

module.exports = _isArguments;
},{"./_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArray.js":[function(require,module,exports){
/**
 * Tests whether or not an object is an array.
 *
 * @private
 * @param {*} val The object to test.
 * @return {Boolean} `true` if `val` is an array, `false` otherwise.
 * @example
 *
 *      _isArray([]); //=> true
 *      _isArray(null); //=> false
 *      _isArray({}); //=> false
 */
module.exports = Array.isArray || function _isArray(val) {
  return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';
};
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArrayLike.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./_curry1');

var _isArray = /*#__PURE__*/require('./_isArray');

var _isString = /*#__PURE__*/require('./_isString');

/**
 * Tests whether or not an object is similar to an array.
 *
 * @private
 * @category Type
 * @category List
 * @sig * -> Boolean
 * @param {*} x The object to test.
 * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.
 * @example
 *
 *      _isArrayLike([]); //=> true
 *      _isArrayLike(true); //=> false
 *      _isArrayLike({}); //=> false
 *      _isArrayLike({length: 10}); //=> false
 *      _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true
 */


var _isArrayLike = /*#__PURE__*/_curry1(function isArrayLike(x) {
  if (_isArray(x)) {
    return true;
  }
  if (!x) {
    return false;
  }
  if (typeof x !== 'object') {
    return false;
  }
  if (_isString(x)) {
    return false;
  }
  if (x.nodeType === 1) {
    return !!x.length;
  }
  if (x.length === 0) {
    return true;
  }
  if (x.length > 0) {
    return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);
  }
  return false;
});
module.exports = _isArrayLike;
},{"./_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./_isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArray.js","./_isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isString.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isFunction.js":[function(require,module,exports){
function _isFunction(x) {
  return Object.prototype.toString.call(x) === '[object Function]';
}
module.exports = _isFunction;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isInteger.js":[function(require,module,exports){
/**
 * Determine if the passed argument is an integer.
 *
 * @private
 * @param {*} n
 * @category Type
 * @return {Boolean}
 */
module.exports = Number.isInteger || function _isInteger(n) {
  return n << 0 === n;
};
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isNumber.js":[function(require,module,exports){
function _isNumber(x) {
  return Object.prototype.toString.call(x) === '[object Number]';
}
module.exports = _isNumber;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isObject.js":[function(require,module,exports){
function _isObject(x) {
  return Object.prototype.toString.call(x) === '[object Object]';
}
module.exports = _isObject;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isPlaceholder.js":[function(require,module,exports){
function _isPlaceholder(a) {
       return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;
}
module.exports = _isPlaceholder;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isRegExp.js":[function(require,module,exports){
function _isRegExp(x) {
  return Object.prototype.toString.call(x) === '[object RegExp]';
}
module.exports = _isRegExp;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isString.js":[function(require,module,exports){
function _isString(x) {
  return Object.prototype.toString.call(x) === '[object String]';
}
module.exports = _isString;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isTransformer.js":[function(require,module,exports){
function _isTransformer(obj) {
  return obj != null && typeof obj['@@transducer/step'] === 'function';
}
module.exports = _isTransformer;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_makeFlat.js":[function(require,module,exports){
var _isArrayLike = /*#__PURE__*/require('./_isArrayLike');

/**
 * `_makeFlat` is a helper function that returns a one-level or fully recursive
 * function based on the flag passed in.
 *
 * @private
 */


function _makeFlat(recursive) {
  return function flatt(list) {
    var value, jlen, j;
    var result = [];
    var idx = 0;
    var ilen = list.length;

    while (idx < ilen) {
      if (_isArrayLike(list[idx])) {
        value = recursive ? flatt(list[idx]) : list[idx];
        j = 0;
        jlen = value.length;
        while (j < jlen) {
          result[result.length] = value[j];
          j += 1;
        }
      } else {
        result[result.length] = list[idx];
      }
      idx += 1;
    }
    return result;
  };
}
module.exports = _makeFlat;
},{"./_isArrayLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArrayLike.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_map.js":[function(require,module,exports){
function _map(fn, functor) {
  var idx = 0;
  var len = functor.length;
  var result = Array(len);
  while (idx < len) {
    result[idx] = fn(functor[idx]);
    idx += 1;
  }
  return result;
}
module.exports = _map;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_objectAssign.js":[function(require,module,exports){
var _has = /*#__PURE__*/require('./_has');

// Based on https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign


function _objectAssign(target) {
  if (target == null) {
    throw new TypeError('Cannot convert undefined or null to object');
  }

  var output = Object(target);
  var idx = 1;
  var length = arguments.length;
  while (idx < length) {
    var source = arguments[idx];
    if (source != null) {
      for (var nextKey in source) {
        if (_has(nextKey, source)) {
          output[nextKey] = source[nextKey];
        }
      }
    }
    idx += 1;
  }
  return output;
}

module.exports = typeof Object.assign === 'function' ? Object.assign : _objectAssign;
},{"./_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_objectIs.js":[function(require,module,exports){
// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
function _objectIs(a, b) {
  // SameValue algorithm
  if (a === b) {
    // Steps 1-5, 7-10
    // Steps 6.b-6.e: +0 != -0
    return a !== 0 || 1 / a === 1 / b;
  } else {
    // Step 6.a: NaN == NaN
    return a !== a && b !== b;
  }
}

module.exports = typeof Object.is === 'function' ? Object.is : _objectIs;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_of.js":[function(require,module,exports){
function _of(x) {
  return [x];
}
module.exports = _of;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_pipe.js":[function(require,module,exports){
function _pipe(f, g) {
  return function () {
    return g.call(this, f.apply(this, arguments));
  };
}
module.exports = _pipe;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_pipeP.js":[function(require,module,exports){
function _pipeP(f, g) {
  return function () {
    var ctx = this;
    return f.apply(ctx, arguments).then(function (x) {
      return g.call(ctx, x);
    });
  };
}
module.exports = _pipeP;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_quote.js":[function(require,module,exports){
function _quote(s) {
  var escaped = s.replace(/\\/g, '\\\\').replace(/[\b]/g, '\\b') // \b matches word boundary; [\b] matches backspace
  .replace(/\f/g, '\\f').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t').replace(/\v/g, '\\v').replace(/\0/g, '\\0');

  return '"' + escaped.replace(/"/g, '\\"') + '"';
}
module.exports = _quote;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js":[function(require,module,exports){
var _isArrayLike = /*#__PURE__*/require('./_isArrayLike');

var _xwrap = /*#__PURE__*/require('./_xwrap');

var bind = /*#__PURE__*/require('../bind');

function _arrayReduce(xf, acc, list) {
  var idx = 0;
  var len = list.length;
  while (idx < len) {
    acc = xf['@@transducer/step'](acc, list[idx]);
    if (acc && acc['@@transducer/reduced']) {
      acc = acc['@@transducer/value'];
      break;
    }
    idx += 1;
  }
  return xf['@@transducer/result'](acc);
}

function _iterableReduce(xf, acc, iter) {
  var step = iter.next();
  while (!step.done) {
    acc = xf['@@transducer/step'](acc, step.value);
    if (acc && acc['@@transducer/reduced']) {
      acc = acc['@@transducer/value'];
      break;
    }
    step = iter.next();
  }
  return xf['@@transducer/result'](acc);
}

function _methodReduce(xf, acc, obj, methodName) {
  return xf['@@transducer/result'](obj[methodName](bind(xf['@@transducer/step'], xf), acc));
}

var symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator';

function _reduce(fn, acc, list) {
  if (typeof fn === 'function') {
    fn = _xwrap(fn);
  }
  if (_isArrayLike(list)) {
    return _arrayReduce(fn, acc, list);
  }
  if (typeof list['fantasy-land/reduce'] === 'function') {
    return _methodReduce(fn, acc, list, 'fantasy-land/reduce');
  }
  if (list[symIterator] != null) {
    return _iterableReduce(fn, acc, list[symIterator]());
  }
  if (typeof list.next === 'function') {
    return _iterableReduce(fn, acc, list);
  }
  if (typeof list.reduce === 'function') {
    return _methodReduce(fn, acc, list, 'reduce');
  }

  throw new TypeError('reduce: list must be array or iterable');
}
module.exports = _reduce;
},{"../bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/bind.js","./_isArrayLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArrayLike.js","./_xwrap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xwrap.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduced.js":[function(require,module,exports){
function _reduced(x) {
  return x && x['@@transducer/reduced'] ? x : {
    '@@transducer/value': x,
    '@@transducer/reduced': true
  };
}
module.exports = _reduced;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_stepCat.js":[function(require,module,exports){
var _objectAssign = /*#__PURE__*/require('./_objectAssign');

var _identity = /*#__PURE__*/require('./_identity');

var _isArrayLike = /*#__PURE__*/require('./_isArrayLike');

var _isTransformer = /*#__PURE__*/require('./_isTransformer');

var objOf = /*#__PURE__*/require('../objOf');

var _stepCatArray = {
  '@@transducer/init': Array,
  '@@transducer/step': function (xs, x) {
    xs.push(x);
    return xs;
  },
  '@@transducer/result': _identity
};
var _stepCatString = {
  '@@transducer/init': String,
  '@@transducer/step': function (a, b) {
    return a + b;
  },
  '@@transducer/result': _identity
};
var _stepCatObject = {
  '@@transducer/init': Object,
  '@@transducer/step': function (result, input) {
    return _objectAssign(result, _isArrayLike(input) ? objOf(input[0], input[1]) : input);
  },
  '@@transducer/result': _identity
};

function _stepCat(obj) {
  if (_isTransformer(obj)) {
    return obj;
  }
  if (_isArrayLike(obj)) {
    return _stepCatArray;
  }
  if (typeof obj === 'string') {
    return _stepCatString;
  }
  if (typeof obj === 'object') {
    return _stepCatObject;
  }
  throw new Error('Cannot create transformer for ' + obj);
}
module.exports = _stepCat;
},{"../objOf":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/objOf.js","./_identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_identity.js","./_isArrayLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArrayLike.js","./_isTransformer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isTransformer.js","./_objectAssign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_objectAssign.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_toISOString.js":[function(require,module,exports){
/**
 * Polyfill from <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString>.
 */
var pad = function pad(n) {
  return (n < 10 ? '0' : '') + n;
};

var _toISOString = typeof Date.prototype.toISOString === 'function' ? function _toISOString(d) {
  return d.toISOString();
} : function _toISOString(d) {
  return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z';
};

module.exports = _toISOString;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_toString.js":[function(require,module,exports){
var _includes = /*#__PURE__*/require('./_includes');

var _map = /*#__PURE__*/require('./_map');

var _quote = /*#__PURE__*/require('./_quote');

var _toISOString = /*#__PURE__*/require('./_toISOString');

var keys = /*#__PURE__*/require('../keys');

var reject = /*#__PURE__*/require('../reject');

function _toString(x, seen) {
  var recur = function recur(y) {
    var xs = seen.concat([x]);
    return _includes(y, xs) ? '<Circular>' : _toString(y, xs);
  };

  //  mapPairs :: (Object, [String]) -> [String]
  var mapPairs = function (obj, keys) {
    return _map(function (k) {
      return _quote(k) + ': ' + recur(obj[k]);
    }, keys.slice().sort());
  };

  switch (Object.prototype.toString.call(x)) {
    case '[object Arguments]':
      return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))';
    case '[object Array]':
      return '[' + _map(recur, x).concat(mapPairs(x, reject(function (k) {
        return (/^\d+$/.test(k)
        );
      }, keys(x)))).join(', ') + ']';
    case '[object Boolean]':
      return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString();
    case '[object Date]':
      return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : _quote(_toISOString(x))) + ')';
    case '[object Null]':
      return 'null';
    case '[object Number]':
      return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10);
    case '[object String]':
      return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : _quote(x);
    case '[object Undefined]':
      return 'undefined';
    default:
      if (typeof x.toString === 'function') {
        var repr = x.toString();
        if (repr !== '[object Object]') {
          return repr;
        }
      }
      return '{' + mapPairs(x, keys(x)).join(', ') + '}';
  }
}
module.exports = _toString;
},{"../keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js","../reject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reject.js","./_includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includes.js","./_map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_map.js","./_quote":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_quote.js","./_toISOString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_toISOString.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xall.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _reduced = /*#__PURE__*/require('./_reduced');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XAll = /*#__PURE__*/function () {

  function XAll(f, xf) {
    this.xf = xf;
    this.f = f;
    this.all = true;
  }
  XAll.prototype['@@transducer/init'] = _xfBase.init;
  XAll.prototype['@@transducer/result'] = function (result) {
    if (this.all) {
      result = this.xf['@@transducer/step'](result, true);
    }
    return this.xf['@@transducer/result'](result);
  };
  XAll.prototype['@@transducer/step'] = function (result, input) {
    if (!this.f(input)) {
      this.all = false;
      result = _reduced(this.xf['@@transducer/step'](result, false));
    }
    return result;
  };

  return XAll;
}();

var _xall = /*#__PURE__*/_curry2(function _xall(f, xf) {
  return new XAll(f, xf);
});
module.exports = _xall;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_reduced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduced.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xany.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _reduced = /*#__PURE__*/require('./_reduced');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XAny = /*#__PURE__*/function () {

  function XAny(f, xf) {
    this.xf = xf;
    this.f = f;
    this.any = false;
  }
  XAny.prototype['@@transducer/init'] = _xfBase.init;
  XAny.prototype['@@transducer/result'] = function (result) {
    if (!this.any) {
      result = this.xf['@@transducer/step'](result, false);
    }
    return this.xf['@@transducer/result'](result);
  };
  XAny.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.any = true;
      result = _reduced(this.xf['@@transducer/step'](result, true));
    }
    return result;
  };

  return XAny;
}();

var _xany = /*#__PURE__*/_curry2(function _xany(f, xf) {
  return new XAny(f, xf);
});
module.exports = _xany;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_reduced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduced.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xaperture.js":[function(require,module,exports){
var _concat = /*#__PURE__*/require('./_concat');

var _curry2 = /*#__PURE__*/require('./_curry2');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XAperture = /*#__PURE__*/function () {

  function XAperture(n, xf) {
    this.xf = xf;
    this.pos = 0;
    this.full = false;
    this.acc = new Array(n);
  }
  XAperture.prototype['@@transducer/init'] = _xfBase.init;
  XAperture.prototype['@@transducer/result'] = function (result) {
    this.acc = null;
    return this.xf['@@transducer/result'](result);
  };
  XAperture.prototype['@@transducer/step'] = function (result, input) {
    this.store(input);
    return this.full ? this.xf['@@transducer/step'](result, this.getCopy()) : result;
  };
  XAperture.prototype.store = function (input) {
    this.acc[this.pos] = input;
    this.pos += 1;
    if (this.pos === this.acc.length) {
      this.pos = 0;
      this.full = true;
    }
  };
  XAperture.prototype.getCopy = function () {
    return _concat(Array.prototype.slice.call(this.acc, this.pos), Array.prototype.slice.call(this.acc, 0, this.pos));
  };

  return XAperture;
}();

var _xaperture = /*#__PURE__*/_curry2(function _xaperture(n, xf) {
  return new XAperture(n, xf);
});
module.exports = _xaperture;
},{"./_concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js","./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xchain.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _flatCat = /*#__PURE__*/require('./_flatCat');

var map = /*#__PURE__*/require('../map');

var _xchain = /*#__PURE__*/_curry2(function _xchain(f, xf) {
  return map(f, _flatCat(xf));
});
module.exports = _xchain;
},{"../map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js","./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_flatCat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_flatCat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xdrop.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XDrop = /*#__PURE__*/function () {

  function XDrop(n, xf) {
    this.xf = xf;
    this.n = n;
  }
  XDrop.prototype['@@transducer/init'] = _xfBase.init;
  XDrop.prototype['@@transducer/result'] = _xfBase.result;
  XDrop.prototype['@@transducer/step'] = function (result, input) {
    if (this.n > 0) {
      this.n -= 1;
      return result;
    }
    return this.xf['@@transducer/step'](result, input);
  };

  return XDrop;
}();

var _xdrop = /*#__PURE__*/_curry2(function _xdrop(n, xf) {
  return new XDrop(n, xf);
});
module.exports = _xdrop;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xdropLast.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XDropLast = /*#__PURE__*/function () {

  function XDropLast(n, xf) {
    this.xf = xf;
    this.pos = 0;
    this.full = false;
    this.acc = new Array(n);
  }
  XDropLast.prototype['@@transducer/init'] = _xfBase.init;
  XDropLast.prototype['@@transducer/result'] = function (result) {
    this.acc = null;
    return this.xf['@@transducer/result'](result);
  };
  XDropLast.prototype['@@transducer/step'] = function (result, input) {
    if (this.full) {
      result = this.xf['@@transducer/step'](result, this.acc[this.pos]);
    }
    this.store(input);
    return result;
  };
  XDropLast.prototype.store = function (input) {
    this.acc[this.pos] = input;
    this.pos += 1;
    if (this.pos === this.acc.length) {
      this.pos = 0;
      this.full = true;
    }
  };

  return XDropLast;
}();

var _xdropLast = /*#__PURE__*/_curry2(function _xdropLast(n, xf) {
  return new XDropLast(n, xf);
});
module.exports = _xdropLast;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xdropLastWhile.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _reduce = /*#__PURE__*/require('./_reduce');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XDropLastWhile = /*#__PURE__*/function () {

  function XDropLastWhile(fn, xf) {
    this.f = fn;
    this.retained = [];
    this.xf = xf;
  }
  XDropLastWhile.prototype['@@transducer/init'] = _xfBase.init;
  XDropLastWhile.prototype['@@transducer/result'] = function (result) {
    this.retained = null;
    return this.xf['@@transducer/result'](result);
  };
  XDropLastWhile.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.retain(result, input) : this.flush(result, input);
  };
  XDropLastWhile.prototype.flush = function (result, input) {
    result = _reduce(this.xf['@@transducer/step'], result, this.retained);
    this.retained = [];
    return this.xf['@@transducer/step'](result, input);
  };
  XDropLastWhile.prototype.retain = function (result, input) {
    this.retained.push(input);
    return result;
  };

  return XDropLastWhile;
}();

var _xdropLastWhile = /*#__PURE__*/_curry2(function _xdropLastWhile(fn, xf) {
  return new XDropLastWhile(fn, xf);
});
module.exports = _xdropLastWhile;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xdropRepeatsWith.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XDropRepeatsWith = /*#__PURE__*/function () {

  function XDropRepeatsWith(pred, xf) {
    this.xf = xf;
    this.pred = pred;
    this.lastValue = undefined;
    this.seenFirstValue = false;
  }

  XDropRepeatsWith.prototype['@@transducer/init'] = _xfBase.init;
  XDropRepeatsWith.prototype['@@transducer/result'] = _xfBase.result;
  XDropRepeatsWith.prototype['@@transducer/step'] = function (result, input) {
    var sameAsLast = false;
    if (!this.seenFirstValue) {
      this.seenFirstValue = true;
    } else if (this.pred(this.lastValue, input)) {
      sameAsLast = true;
    }
    this.lastValue = input;
    return sameAsLast ? result : this.xf['@@transducer/step'](result, input);
  };

  return XDropRepeatsWith;
}();

var _xdropRepeatsWith = /*#__PURE__*/_curry2(function _xdropRepeatsWith(pred, xf) {
  return new XDropRepeatsWith(pred, xf);
});
module.exports = _xdropRepeatsWith;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xdropWhile.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XDropWhile = /*#__PURE__*/function () {

  function XDropWhile(f, xf) {
    this.xf = xf;
    this.f = f;
  }
  XDropWhile.prototype['@@transducer/init'] = _xfBase.init;
  XDropWhile.prototype['@@transducer/result'] = _xfBase.result;
  XDropWhile.prototype['@@transducer/step'] = function (result, input) {
    if (this.f) {
      if (this.f(input)) {
        return result;
      }
      this.f = null;
    }
    return this.xf['@@transducer/step'](result, input);
  };

  return XDropWhile;
}();

var _xdropWhile = /*#__PURE__*/_curry2(function _xdropWhile(f, xf) {
  return new XDropWhile(f, xf);
});
module.exports = _xdropWhile;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js":[function(require,module,exports){
module.exports = {
  init: function () {
    return this.xf['@@transducer/init']();
  },
  result: function (result) {
    return this.xf['@@transducer/result'](result);
  }
};
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfilter.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XFilter = /*#__PURE__*/function () {

  function XFilter(f, xf) {
    this.xf = xf;
    this.f = f;
  }
  XFilter.prototype['@@transducer/init'] = _xfBase.init;
  XFilter.prototype['@@transducer/result'] = _xfBase.result;
  XFilter.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;
  };

  return XFilter;
}();

var _xfilter = /*#__PURE__*/_curry2(function _xfilter(f, xf) {
  return new XFilter(f, xf);
});
module.exports = _xfilter;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfind.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _reduced = /*#__PURE__*/require('./_reduced');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XFind = /*#__PURE__*/function () {

  function XFind(f, xf) {
    this.xf = xf;
    this.f = f;
    this.found = false;
  }
  XFind.prototype['@@transducer/init'] = _xfBase.init;
  XFind.prototype['@@transducer/result'] = function (result) {
    if (!this.found) {
      result = this.xf['@@transducer/step'](result, void 0);
    }
    return this.xf['@@transducer/result'](result);
  };
  XFind.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.found = true;
      result = _reduced(this.xf['@@transducer/step'](result, input));
    }
    return result;
  };

  return XFind;
}();

var _xfind = /*#__PURE__*/_curry2(function _xfind(f, xf) {
  return new XFind(f, xf);
});
module.exports = _xfind;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_reduced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduced.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfindIndex.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _reduced = /*#__PURE__*/require('./_reduced');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XFindIndex = /*#__PURE__*/function () {

  function XFindIndex(f, xf) {
    this.xf = xf;
    this.f = f;
    this.idx = -1;
    this.found = false;
  }
  XFindIndex.prototype['@@transducer/init'] = _xfBase.init;
  XFindIndex.prototype['@@transducer/result'] = function (result) {
    if (!this.found) {
      result = this.xf['@@transducer/step'](result, -1);
    }
    return this.xf['@@transducer/result'](result);
  };
  XFindIndex.prototype['@@transducer/step'] = function (result, input) {
    this.idx += 1;
    if (this.f(input)) {
      this.found = true;
      result = _reduced(this.xf['@@transducer/step'](result, this.idx));
    }
    return result;
  };

  return XFindIndex;
}();

var _xfindIndex = /*#__PURE__*/_curry2(function _xfindIndex(f, xf) {
  return new XFindIndex(f, xf);
});
module.exports = _xfindIndex;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_reduced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduced.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfindLast.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XFindLast = /*#__PURE__*/function () {

  function XFindLast(f, xf) {
    this.xf = xf;
    this.f = f;
  }
  XFindLast.prototype['@@transducer/init'] = _xfBase.init;
  XFindLast.prototype['@@transducer/result'] = function (result) {
    return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.last));
  };
  XFindLast.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.last = input;
    }
    return result;
  };

  return XFindLast;
}();

var _xfindLast = /*#__PURE__*/_curry2(function _xfindLast(f, xf) {
  return new XFindLast(f, xf);
});
module.exports = _xfindLast;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfindLastIndex.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XFindLastIndex = /*#__PURE__*/function () {

  function XFindLastIndex(f, xf) {
    this.xf = xf;
    this.f = f;
    this.idx = -1;
    this.lastIdx = -1;
  }
  XFindLastIndex.prototype['@@transducer/init'] = _xfBase.init;
  XFindLastIndex.prototype['@@transducer/result'] = function (result) {
    return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.lastIdx));
  };
  XFindLastIndex.prototype['@@transducer/step'] = function (result, input) {
    this.idx += 1;
    if (this.f(input)) {
      this.lastIdx = this.idx;
    }
    return result;
  };

  return XFindLastIndex;
}();

var _xfindLastIndex = /*#__PURE__*/_curry2(function _xfindLastIndex(f, xf) {
  return new XFindLastIndex(f, xf);
});
module.exports = _xfindLastIndex;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xmap.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XMap = /*#__PURE__*/function () {

  function XMap(f, xf) {
    this.xf = xf;
    this.f = f;
  }
  XMap.prototype['@@transducer/init'] = _xfBase.init;
  XMap.prototype['@@transducer/result'] = _xfBase.result;
  XMap.prototype['@@transducer/step'] = function (result, input) {
    return this.xf['@@transducer/step'](result, this.f(input));
  };

  return XMap;
}();

var _xmap = /*#__PURE__*/_curry2(function _xmap(f, xf) {
  return new XMap(f, xf);
});
module.exports = _xmap;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xreduceBy.js":[function(require,module,exports){
var _curryN = /*#__PURE__*/require('./_curryN');

var _has = /*#__PURE__*/require('./_has');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XReduceBy = /*#__PURE__*/function () {

  function XReduceBy(valueFn, valueAcc, keyFn, xf) {
    this.valueFn = valueFn;
    this.valueAcc = valueAcc;
    this.keyFn = keyFn;
    this.xf = xf;
    this.inputs = {};
  }
  XReduceBy.prototype['@@transducer/init'] = _xfBase.init;
  XReduceBy.prototype['@@transducer/result'] = function (result) {
    var key;
    for (key in this.inputs) {
      if (_has(key, this.inputs)) {
        result = this.xf['@@transducer/step'](result, this.inputs[key]);
        if (result['@@transducer/reduced']) {
          result = result['@@transducer/value'];
          break;
        }
      }
    }
    this.inputs = null;
    return this.xf['@@transducer/result'](result);
  };
  XReduceBy.prototype['@@transducer/step'] = function (result, input) {
    var key = this.keyFn(input);
    this.inputs[key] = this.inputs[key] || [key, this.valueAcc];
    this.inputs[key][1] = this.valueFn(this.inputs[key][1], input);
    return result;
  };

  return XReduceBy;
}();

var _xreduceBy = /*#__PURE__*/_curryN(4, [], function _xreduceBy(valueFn, valueAcc, keyFn, xf) {
  return new XReduceBy(valueFn, valueAcc, keyFn, xf);
});
module.exports = _xreduceBy;
},{"./_curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curryN.js","./_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xtake.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _reduced = /*#__PURE__*/require('./_reduced');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XTake = /*#__PURE__*/function () {

  function XTake(n, xf) {
    this.xf = xf;
    this.n = n;
    this.i = 0;
  }
  XTake.prototype['@@transducer/init'] = _xfBase.init;
  XTake.prototype['@@transducer/result'] = _xfBase.result;
  XTake.prototype['@@transducer/step'] = function (result, input) {
    this.i += 1;
    var ret = this.n === 0 ? result : this.xf['@@transducer/step'](result, input);
    return this.n >= 0 && this.i >= this.n ? _reduced(ret) : ret;
  };

  return XTake;
}();

var _xtake = /*#__PURE__*/_curry2(function _xtake(n, xf) {
  return new XTake(n, xf);
});
module.exports = _xtake;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_reduced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduced.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xtakeWhile.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _reduced = /*#__PURE__*/require('./_reduced');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XTakeWhile = /*#__PURE__*/function () {

  function XTakeWhile(f, xf) {
    this.xf = xf;
    this.f = f;
  }
  XTakeWhile.prototype['@@transducer/init'] = _xfBase.init;
  XTakeWhile.prototype['@@transducer/result'] = _xfBase.result;
  XTakeWhile.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.xf['@@transducer/step'](result, input) : _reduced(result);
  };

  return XTakeWhile;
}();

var _xtakeWhile = /*#__PURE__*/_curry2(function _xtakeWhile(f, xf) {
  return new XTakeWhile(f, xf);
});
module.exports = _xtakeWhile;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_reduced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduced.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xtap.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./_curry2');

var _xfBase = /*#__PURE__*/require('./_xfBase');

var XTap = /*#__PURE__*/function () {

  function XTap(f, xf) {
    this.xf = xf;
    this.f = f;
  }
  XTap.prototype['@@transducer/init'] = _xfBase.init;
  XTap.prototype['@@transducer/result'] = _xfBase.result;
  XTap.prototype['@@transducer/step'] = function (result, input) {
    this.f(input);
    return this.xf['@@transducer/step'](result, input);
  };

  return XTap;
}();

var _xtap = /*#__PURE__*/_curry2(function _xtap(f, xf) {
  return new XTap(f, xf);
});
module.exports = _xtap;
},{"./_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./_xfBase":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xfBase.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xwrap.js":[function(require,module,exports){
var XWrap = /*#__PURE__*/function () {
  function XWrap(fn) {
    this.f = fn;
  }
  XWrap.prototype['@@transducer/init'] = function () {
    throw new Error('init not implemented on XWrap');
  };
  XWrap.prototype['@@transducer/result'] = function (acc) {
    return acc;
  };
  XWrap.prototype['@@transducer/step'] = function (acc, x) {
    return this.f(acc, x);
  };

  return XWrap;
}();

function _xwrap(fn) {
  return new XWrap(fn);
}
module.exports = _xwrap;
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/intersection.js":[function(require,module,exports){
var _includes = /*#__PURE__*/require('./internal/_includes');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _filter = /*#__PURE__*/require('./internal/_filter');

var flip = /*#__PURE__*/require('./flip');

var uniq = /*#__PURE__*/require('./uniq');

/**
 * Combines two lists into a set (i.e. no duplicates) composed of those
 * elements common to both lists.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The list of elements found in both `list1` and `list2`.
 * @see R.innerJoin
 * @example
 *
 *      R.intersection([1,2,3,4], [7,6,5,4,3]); //=> [4, 3]
 */


var intersection = /*#__PURE__*/_curry2(function intersection(list1, list2) {
  var lookupList, filteredList;
  if (list1.length > list2.length) {
    lookupList = list1;
    filteredList = list2;
  } else {
    lookupList = list2;
    filteredList = list1;
  }
  return uniq(_filter(flip(_includes)(lookupList), filteredList));
});
module.exports = intersection;
},{"./flip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/flip.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_filter.js","./internal/_includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includes.js","./uniq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uniq.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/intersperse.js":[function(require,module,exports){
var _checkForMethod = /*#__PURE__*/require('./internal/_checkForMethod');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Creates a new list with the separator interposed between elements.
 *
 * Dispatches to the `intersperse` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig a -> [a] -> [a]
 * @param {*} separator The element to add to the list.
 * @param {Array} list The list to be interposed.
 * @return {Array} The new list.
 * @example
 *
 *      R.intersperse('a', ['b', 'n', 'n', 's']); //=> ['b', 'a', 'n', 'a', 'n', 'a', 's']
 */


var intersperse = /*#__PURE__*/_curry2( /*#__PURE__*/_checkForMethod('intersperse', function intersperse(separator, list) {
  var out = [];
  var idx = 0;
  var length = list.length;
  while (idx < length) {
    if (idx === length - 1) {
      out.push(list[idx]);
    } else {
      out.push(list[idx], separator);
    }
    idx += 1;
  }
  return out;
}));
module.exports = intersperse;
},{"./internal/_checkForMethod":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_checkForMethod.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/into.js":[function(require,module,exports){
var _clone = /*#__PURE__*/require('./internal/_clone');

var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var _isTransformer = /*#__PURE__*/require('./internal/_isTransformer');

var _reduce = /*#__PURE__*/require('./internal/_reduce');

var _stepCat = /*#__PURE__*/require('./internal/_stepCat');

/**
 * Transforms the items of the list with the transducer and appends the
 * transformed items to the accumulator using an appropriate iterator function
 * based on the accumulator type.
 *
 * The accumulator can be an array, string, object or a transformer. Iterated
 * items will be appended to arrays and concatenated to strings. Objects will
 * be merged directly or 2-item arrays will be merged as key, value pairs.
 *
 * The accumulator can also be a transformer object that provides a 2-arity
 * reducing iterator function, step, 0-arity initial value function, init, and
 * 1-arity result extraction function result. The step function is used as the
 * iterator function in reduce. The result function is used to convert the
 * final accumulator into the return type and in most cases is R.identity. The
 * init function is used to provide the initial accumulator.
 *
 * The iteration is performed with [`R.reduce`](#reduce) after initializing the
 * transducer.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig a -> (b -> b) -> [c] -> a
 * @param {*} acc The initial accumulator value.
 * @param {Function} xf The transducer function. Receives a transformer and returns a transformer.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.transduce
 * @example
 *
 *      const numbers = [1, 2, 3, 4];
 *      const transducer = R.compose(R.map(R.add(1)), R.take(2));
 *
 *      R.into([], transducer, numbers); //=> [2, 3]
 *
 *      const intoArray = R.into([]);
 *      intoArray(transducer, numbers); //=> [2, 3]
 */


var into = /*#__PURE__*/_curry3(function into(acc, xf, list) {
  return _isTransformer(acc) ? _reduce(xf(acc), acc['@@transducer/init'](), list) : _reduce(xf(_stepCat(acc)), _clone(acc, [], [], false), list);
});
module.exports = into;
},{"./internal/_clone":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_clone.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./internal/_isTransformer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isTransformer.js","./internal/_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./internal/_stepCat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_stepCat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/invert.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _has = /*#__PURE__*/require('./internal/_has');

var keys = /*#__PURE__*/require('./keys');

/**
 * Same as [`R.invertObj`](#invertObj), however this accounts for objects with
 * duplicate values by putting the values into an array.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig {s: x} -> {x: [ s, ... ]}
 * @param {Object} obj The object or array to invert
 * @return {Object} out A new object with keys in an array.
 * @see R.invertObj
 * @example
 *
 *      const raceResultsByFirstName = {
 *        first: 'alice',
 *        second: 'jake',
 *        third: 'alice',
 *      };
 *      R.invert(raceResultsByFirstName);
 *      //=> { 'alice': ['first', 'third'], 'jake':['second'] }
 */


var invert = /*#__PURE__*/_curry1(function invert(obj) {
  var props = keys(obj);
  var len = props.length;
  var idx = 0;
  var out = {};

  while (idx < len) {
    var key = props[idx];
    var val = obj[key];
    var list = _has(val, out) ? out[val] : out[val] = [];
    list[list.length] = key;
    idx += 1;
  }
  return out;
});
module.exports = invert;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js","./keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/invertObj.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var keys = /*#__PURE__*/require('./keys');

/**
 * Returns a new object with the keys of the given object as values, and the
 * values of the given object, which are coerced to strings, as keys. Note
 * that the last key found is preferred when handling the same value.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig {s: x} -> {x: s}
 * @param {Object} obj The object or array to invert
 * @return {Object} out A new object
 * @see R.invert
 * @example
 *
 *      const raceResults = {
 *        first: 'alice',
 *        second: 'jake'
 *      };
 *      R.invertObj(raceResults);
 *      //=> { 'alice': 'first', 'jake':'second' }
 *
 *      // Alternatively:
 *      const raceResults = ['alice', 'jake'];
 *      R.invertObj(raceResults);
 *      //=> { 'alice': '0', 'jake':'1' }
 */


var invertObj = /*#__PURE__*/_curry1(function invertObj(obj) {
  var props = keys(obj);
  var len = props.length;
  var idx = 0;
  var out = {};

  while (idx < len) {
    var key = props[idx];
    out[obj[key]] = key;
    idx += 1;
  }
  return out;
});
module.exports = invertObj;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/invoker.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _isFunction = /*#__PURE__*/require('./internal/_isFunction');

var curryN = /*#__PURE__*/require('./curryN');

var toString = /*#__PURE__*/require('./toString');

/**
 * Turns a named method with a specified arity into a function that can be
 * called directly supplied with arguments and a target object.
 *
 * The returned function is curried and accepts `arity + 1` parameters where
 * the final parameter is the target object.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig Number -> String -> (a -> b -> ... -> n -> Object -> *)
 * @param {Number} arity Number of arguments the returned function should take
 *        before the target object.
 * @param {String} method Name of the method to call.
 * @return {Function} A new curried function.
 * @see R.construct
 * @example
 *
 *      const sliceFrom = R.invoker(1, 'slice');
 *      sliceFrom(6, 'abcdefghijklm'); //=> 'ghijklm'
 *      const sliceFrom6 = R.invoker(2, 'slice')(6);
 *      sliceFrom6(8, 'abcdefghijklm'); //=> 'gh'
 * @symb R.invoker(0, 'method')(o) = o['method']()
 * @symb R.invoker(1, 'method')(a, o) = o['method'](a)
 * @symb R.invoker(2, 'method')(a, b, o) = o['method'](a, b)
 */


var invoker = /*#__PURE__*/_curry2(function invoker(arity, method) {
  return curryN(arity + 1, function () {
    var target = arguments[arity];
    if (target != null && _isFunction(target[method])) {
      return target[method].apply(target, Array.prototype.slice.call(arguments, 0, arity));
    }
    throw new TypeError(toString(target) + ' does not have a method named "' + method + '"');
  });
});
module.exports = invoker;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isFunction.js","./toString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toString.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/is.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * See if an object (`val`) is an instance of the supplied constructor. This
 * function will check up the inheritance chain, if any.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Type
 * @sig (* -> {*}) -> a -> Boolean
 * @param {Object} ctor A constructor
 * @param {*} val The value to test
 * @return {Boolean}
 * @example
 *
 *      R.is(Object, {}); //=> true
 *      R.is(Number, 1); //=> true
 *      R.is(Object, 1); //=> false
 *      R.is(String, 's'); //=> true
 *      R.is(String, new String('')); //=> true
 *      R.is(Object, new String('')); //=> true
 *      R.is(Object, 's'); //=> false
 *      R.is(Number, {}); //=> false
 */


var is = /*#__PURE__*/_curry2(function is(Ctor, val) {
  return val != null && val.constructor === Ctor || val instanceof Ctor;
});
module.exports = is;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isEmpty.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var empty = /*#__PURE__*/require('./empty');

var equals = /*#__PURE__*/require('./equals');

/**
 * Returns `true` if the given value is its type's empty value; `false`
 * otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig a -> Boolean
 * @param {*} x
 * @return {Boolean}
 * @see R.empty
 * @example
 *
 *      R.isEmpty([1, 2, 3]);   //=> false
 *      R.isEmpty([]);          //=> true
 *      R.isEmpty('');          //=> true
 *      R.isEmpty(null);        //=> false
 *      R.isEmpty({});          //=> true
 *      R.isEmpty({length: 0}); //=> false
 */


var isEmpty = /*#__PURE__*/_curry1(function isEmpty(x) {
  return x != null && equals(x, empty(x));
});
module.exports = isEmpty;
},{"./empty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/empty.js","./equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/isNil.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Checks if the input value is `null` or `undefined`.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Type
 * @sig * -> Boolean
 * @param {*} x The value to test.
 * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`.
 * @example
 *
 *      R.isNil(null); //=> true
 *      R.isNil(undefined); //=> true
 *      R.isNil(0); //=> false
 *      R.isNil([]); //=> false
 */


var isNil = /*#__PURE__*/_curry1(function isNil(x) {
  return x == null;
});
module.exports = isNil;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/join.js":[function(require,module,exports){
var invoker = /*#__PURE__*/require('./invoker');

/**
 * Returns a string made by inserting the `separator` between each element and
 * concatenating all the elements into a single string.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig String -> [a] -> String
 * @param {Number|String} separator The string used to separate the elements.
 * @param {Array} xs The elements to join into a string.
 * @return {String} str The string made by concatenating `xs` with `separator`.
 * @see R.split
 * @example
 *
 *      const spacer = R.join(' ');
 *      spacer(['a', 2, 3.4]);   //=> 'a 2 3.4'
 *      R.join('|', [1, 2, 3]);    //=> '1|2|3'
 */


var join = /*#__PURE__*/invoker(1, 'join');
module.exports = join;
},{"./invoker":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/invoker.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/juxt.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var converge = /*#__PURE__*/require('./converge');

/**
 * juxt applies a list of functions to a list of values.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Function
 * @sig [(a, b, ..., m) -> n] -> ((a, b, ..., m) -> [n])
 * @param {Array} fns An array of functions
 * @return {Function} A function that returns a list of values after applying each of the original `fns` to its parameters.
 * @see R.applySpec
 * @example
 *
 *      const getRange = R.juxt([Math.min, Math.max]);
 *      getRange(3, 4, 9, -3); //=> [-3, 9]
 * @symb R.juxt([f, g, h])(a, b) = [f(a, b), g(a, b), h(a, b)]
 */


var juxt = /*#__PURE__*/_curry1(function juxt(fns) {
  return converge(function () {
    return Array.prototype.slice.call(arguments, 0);
  }, fns);
});
module.exports = juxt;
},{"./converge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/converge.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _has = /*#__PURE__*/require('./internal/_has');

var _isArguments = /*#__PURE__*/require('./internal/_isArguments');

// cover IE < 9 keys issues


var hasEnumBug = ! /*#__PURE__*/{ toString: null }.propertyIsEnumerable('toString');
var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
// Safari bug
var hasArgsEnumBug = /*#__PURE__*/function () {
  'use strict';

  return arguments.propertyIsEnumerable('length');
}();

var contains = function contains(list, item) {
  var idx = 0;
  while (idx < list.length) {
    if (list[idx] === item) {
      return true;
    }
    idx += 1;
  }
  return false;
};

/**
 * Returns a list containing the names of all the enumerable own properties of
 * the supplied object.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig {k: v} -> [k]
 * @param {Object} obj The object to extract properties from
 * @return {Array} An array of the object's own properties.
 * @see R.keysIn, R.values
 * @example
 *
 *      R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']
 */
var keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? /*#__PURE__*/_curry1(function keys(obj) {
  return Object(obj) !== obj ? [] : Object.keys(obj);
}) : /*#__PURE__*/_curry1(function keys(obj) {
  if (Object(obj) !== obj) {
    return [];
  }
  var prop, nIdx;
  var ks = [];
  var checkArgsLength = hasArgsEnumBug && _isArguments(obj);
  for (prop in obj) {
    if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {
      ks[ks.length] = prop;
    }
  }
  if (hasEnumBug) {
    nIdx = nonEnumerableProps.length - 1;
    while (nIdx >= 0) {
      prop = nonEnumerableProps[nIdx];
      if (_has(prop, obj) && !contains(ks, prop)) {
        ks[ks.length] = prop;
      }
      nIdx -= 1;
    }
  }
  return ks;
});
module.exports = keys;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js","./internal/_isArguments":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArguments.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keysIn.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Returns a list containing the names of all the properties of the supplied
 * object, including prototype properties.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Object
 * @sig {k: v} -> [k]
 * @param {Object} obj The object to extract properties from
 * @return {Array} An array of the object's own and prototype properties.
 * @see R.keys, R.valuesIn
 * @example
 *
 *      const F = function() { this.x = 'X'; };
 *      F.prototype.y = 'Y';
 *      const f = new F();
 *      R.keysIn(f); //=> ['x', 'y']
 */


var keysIn = /*#__PURE__*/_curry1(function keysIn(obj) {
  var prop;
  var ks = [];
  for (prop in obj) {
    ks[ks.length] = prop;
  }
  return ks;
});
module.exports = keysIn;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/last.js":[function(require,module,exports){
var nth = /*#__PURE__*/require('./nth');

/**
 * Returns the last element of the given list or string.
 *
 * @func
 * @memberOf R
 * @since v0.1.4
 * @category List
 * @sig [a] -> a | Undefined
 * @sig String -> String
 * @param {*} list
 * @return {*}
 * @see R.init, R.head, R.tail
 * @example
 *
 *      R.last(['fi', 'fo', 'fum']); //=> 'fum'
 *      R.last([]); //=> undefined
 *
 *      R.last('abc'); //=> 'c'
 *      R.last(''); //=> ''
 */


var last = /*#__PURE__*/nth(-1);
module.exports = last;
},{"./nth":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nth.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lastIndexOf.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _isArray = /*#__PURE__*/require('./internal/_isArray');

var equals = /*#__PURE__*/require('./equals');

/**
 * Returns the position of the last occurrence of an item in an array, or -1 if
 * the item is not included in the array. [`R.equals`](#equals) is used to
 * determine equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> Number
 * @param {*} target The item to find.
 * @param {Array} xs The array to search in.
 * @return {Number} the index of the target, or -1 if the target is not found.
 * @see R.indexOf
 * @example
 *
 *      R.lastIndexOf(3, [-1,3,3,0,1,2,3,4]); //=> 6
 *      R.lastIndexOf(10, [1,2,3,4]); //=> -1
 */


var lastIndexOf = /*#__PURE__*/_curry2(function lastIndexOf(target, xs) {
  if (typeof xs.lastIndexOf === 'function' && !_isArray(xs)) {
    return xs.lastIndexOf(target);
  } else {
    var idx = xs.length - 1;
    while (idx >= 0) {
      if (equals(xs[idx], target)) {
        return idx;
      }
      idx -= 1;
    }
    return -1;
  }
});
module.exports = lastIndexOf;
},{"./equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/length.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _isNumber = /*#__PURE__*/require('./internal/_isNumber');

/**
 * Returns the number of elements in the array by returning `list.length`.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig [a] -> Number
 * @param {Array} list The array to inspect.
 * @return {Number} The length of the array.
 * @example
 *
 *      R.length([]); //=> 0
 *      R.length([1, 2, 3]); //=> 3
 */


var length = /*#__PURE__*/_curry1(function length(list) {
  return list != null && _isNumber(list.length) ? list.length : NaN;
});
module.exports = length;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isNumber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lens.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var map = /*#__PURE__*/require('./map');

/**
 * Returns a lens for the given getter and setter functions. The getter "gets"
 * the value of the focus; the setter "sets" the value of the focus. The setter
 * should not mutate the data structure.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig (s -> a) -> ((a, s) -> s) -> Lens s a
 * @param {Function} getter
 * @param {Function} setter
 * @return {Lens}
 * @see R.view, R.set, R.over, R.lensIndex, R.lensProp
 * @example
 *
 *      const xLens = R.lens(R.prop('x'), R.assoc('x'));
 *
 *      R.view(xLens, {x: 1, y: 2});            //=> 1
 *      R.set(xLens, 4, {x: 1, y: 2});          //=> {x: 4, y: 2}
 *      R.over(xLens, R.negate, {x: 1, y: 2});  //=> {x: -1, y: 2}
 */


var lens = /*#__PURE__*/_curry2(function lens(getter, setter) {
  return function (toFunctorFn) {
    return function (target) {
      return map(function (focus) {
        return setter(focus, target);
      }, toFunctorFn(getter(target)));
    };
  };
});
module.exports = lens;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lensIndex.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var lens = /*#__PURE__*/require('./lens');

var nth = /*#__PURE__*/require('./nth');

var update = /*#__PURE__*/require('./update');

/**
 * Returns a lens whose focus is the specified index.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Number -> Lens s a
 * @param {Number} n
 * @return {Lens}
 * @see R.view, R.set, R.over
 * @example
 *
 *      const headLens = R.lensIndex(0);
 *
 *      R.view(headLens, ['a', 'b', 'c']);            //=> 'a'
 *      R.set(headLens, 'x', ['a', 'b', 'c']);        //=> ['x', 'b', 'c']
 *      R.over(headLens, R.toUpper, ['a', 'b', 'c']); //=> ['A', 'b', 'c']
 */


var lensIndex = /*#__PURE__*/_curry1(function lensIndex(n) {
  return lens(nth(n), update(n));
});
module.exports = lensIndex;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./lens":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lens.js","./nth":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nth.js","./update":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/update.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lensPath.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var assocPath = /*#__PURE__*/require('./assocPath');

var lens = /*#__PURE__*/require('./lens');

var path = /*#__PURE__*/require('./path');

/**
 * Returns a lens whose focus is the specified path.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Object
 * @typedefn Idx = String | Int
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig [Idx] -> Lens s a
 * @param {Array} path The path to use.
 * @return {Lens}
 * @see R.view, R.set, R.over
 * @example
 *
 *      const xHeadYLens = R.lensPath(['x', 0, 'y']);
 *
 *      R.view(xHeadYLens, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
 *      //=> 2
 *      R.set(xHeadYLens, 1, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
 *      //=> {x: [{y: 1, z: 3}, {y: 4, z: 5}]}
 *      R.over(xHeadYLens, R.negate, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
 *      //=> {x: [{y: -2, z: 3}, {y: 4, z: 5}]}
 */


var lensPath = /*#__PURE__*/_curry1(function lensPath(p) {
  return lens(path(p), assocPath(p));
});
module.exports = lensPath;
},{"./assocPath":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/assocPath.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./lens":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lens.js","./path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/path.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lensProp.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var assoc = /*#__PURE__*/require('./assoc');

var lens = /*#__PURE__*/require('./lens');

var prop = /*#__PURE__*/require('./prop');

/**
 * Returns a lens whose focus is the specified property.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig String -> Lens s a
 * @param {String} k
 * @return {Lens}
 * @see R.view, R.set, R.over
 * @example
 *
 *      const xLens = R.lensProp('x');
 *
 *      R.view(xLens, {x: 1, y: 2});            //=> 1
 *      R.set(xLens, 4, {x: 1, y: 2});          //=> {x: 4, y: 2}
 *      R.over(xLens, R.negate, {x: 1, y: 2});  //=> {x: -1, y: 2}
 */


var lensProp = /*#__PURE__*/_curry1(function lensProp(k) {
  return lens(prop(k), assoc(k));
});
module.exports = lensProp;
},{"./assoc":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/assoc.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./lens":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lens.js","./prop":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/prop.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lift.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var liftN = /*#__PURE__*/require('./liftN');

/**
 * "lifts" a function of arity > 1 so that it may "map over" a list, Function or other
 * object that satisfies the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply).
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Function
 * @sig (*... -> *) -> ([*]... -> [*])
 * @param {Function} fn The function to lift into higher context
 * @return {Function} The lifted function.
 * @see R.liftN
 * @example
 *
 *      const madd3 = R.lift((a, b, c) => a + b + c);
 *
 *      madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7]
 *
 *      const madd5 = R.lift((a, b, c, d, e) => a + b + c + d + e);
 *
 *      madd5([1,2], [3], [4, 5], [6], [7, 8]); //=> [21, 22, 22, 23, 22, 23, 23, 24]
 */


var lift = /*#__PURE__*/_curry1(function lift(fn) {
  return liftN(fn.length, fn);
});
module.exports = lift;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./liftN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/liftN.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/liftN.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _reduce = /*#__PURE__*/require('./internal/_reduce');

var ap = /*#__PURE__*/require('./ap');

var curryN = /*#__PURE__*/require('./curryN');

var map = /*#__PURE__*/require('./map');

/**
 * "lifts" a function to be the specified arity, so that it may "map over" that
 * many lists, Functions or other objects that satisfy the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply).
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Function
 * @sig Number -> (*... -> *) -> ([*]... -> [*])
 * @param {Function} fn The function to lift into higher context
 * @return {Function} The lifted function.
 * @see R.lift, R.ap
 * @example
 *
 *      const madd3 = R.liftN(3, (...args) => R.sum(args));
 *      madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7]
 */


var liftN = /*#__PURE__*/_curry2(function liftN(arity, fn) {
  var lifted = curryN(arity, fn);
  return curryN(arity, function () {
    return _reduce(ap, map(lifted, arguments[0]), Array.prototype.slice.call(arguments, 1));
  });
});
module.exports = liftN;
},{"./ap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/ap.js","./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lt.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns `true` if the first argument is less than the second; `false`
 * otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @see R.gt
 * @example
 *
 *      R.lt(2, 1); //=> false
 *      R.lt(2, 2); //=> false
 *      R.lt(2, 3); //=> true
 *      R.lt('a', 'z'); //=> true
 *      R.lt('z', 'a'); //=> false
 */


var lt = /*#__PURE__*/_curry2(function lt(a, b) {
  return a < b;
});
module.exports = lt;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/lte.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns `true` if the first argument is less than or equal to the second;
 * `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {Number} a
 * @param {Number} b
 * @return {Boolean}
 * @see R.gte
 * @example
 *
 *      R.lte(2, 1); //=> false
 *      R.lte(2, 2); //=> true
 *      R.lte(2, 3); //=> true
 *      R.lte('a', 'z'); //=> true
 *      R.lte('z', 'a'); //=> false
 */


var lte = /*#__PURE__*/_curry2(function lte(a, b) {
  return a <= b;
});
module.exports = lte;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _map = /*#__PURE__*/require('./internal/_map');

var _reduce = /*#__PURE__*/require('./internal/_reduce');

var _xmap = /*#__PURE__*/require('./internal/_xmap');

var curryN = /*#__PURE__*/require('./curryN');

var keys = /*#__PURE__*/require('./keys');

/**
 * Takes a function and
 * a [functor](https://github.com/fantasyland/fantasy-land#functor),
 * applies the function to each of the functor's values, and returns
 * a functor of the same shape.
 *
 * Ramda provides suitable `map` implementations for `Array` and `Object`,
 * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`.
 *
 * Dispatches to the `map` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * Also treats functions as functors and will compose them together.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Functor f => (a -> b) -> f a -> f b
 * @param {Function} fn The function to be called on every element of the input `list`.
 * @param {Array} list The list to be iterated over.
 * @return {Array} The new list.
 * @see R.transduce, R.addIndex
 * @example
 *
 *      const double = x => x * 2;
 *
 *      R.map(double, [1, 2, 3]); //=> [2, 4, 6]
 *
 *      R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}
 * @symb R.map(f, [a, b]) = [f(a), f(b)]
 * @symb R.map(f, { x: a, y: b }) = { x: f(a), y: f(b) }
 * @symb R.map(f, functor_o) = functor_o.map(f)
 */


var map = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['fantasy-land/map', 'map'], _xmap, function map(fn, functor) {
  switch (Object.prototype.toString.call(functor)) {
    case '[object Function]':
      return curryN(functor.length, function () {
        return fn.call(this, functor.apply(this, arguments));
      });
    case '[object Object]':
      return _reduce(function (acc, key) {
        acc[key] = fn(functor[key]);
        return acc;
      }, {}, keys(functor));
    default:
      return _map(fn, functor);
  }
}));
module.exports = map;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_map.js","./internal/_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./internal/_xmap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xmap.js","./keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mapAccum.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * The `mapAccum` function behaves like a combination of map and reduce; it
 * applies a function to each element of a list, passing an accumulating
 * parameter from left to right, and returning a final value of this
 * accumulator together with the new list.
 *
 * The iterator function receives two arguments, *acc* and *value*, and should
 * return a tuple *[acc, value]*.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig ((acc, x) -> (acc, y)) -> acc -> [x] -> (acc, [y])
 * @param {Function} fn The function to be called on every element of the input `list`.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.scan, R.addIndex, R.mapAccumRight
 * @example
 *
 *      const digits = ['1', '2', '3', '4'];
 *      const appender = (a, b) => [a + b, a + b];
 *
 *      R.mapAccum(appender, 0, digits); //=> ['01234', ['01', '012', '0123', '01234']]
 * @symb R.mapAccum(f, a, [b, c, d]) = [
 *   f(f(f(a, b)[0], c)[0], d)[0],
 *   [
 *     f(a, b)[1],
 *     f(f(a, b)[0], c)[1],
 *     f(f(f(a, b)[0], c)[0], d)[1]
 *   ]
 * ]
 */


var mapAccum = /*#__PURE__*/_curry3(function mapAccum(fn, acc, list) {
  var idx = 0;
  var len = list.length;
  var result = [];
  var tuple = [acc];
  while (idx < len) {
    tuple = fn(tuple[0], list[idx]);
    result[idx] = tuple[1];
    idx += 1;
  }
  return [tuple[0], result];
});
module.exports = mapAccum;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mapAccumRight.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * The `mapAccumRight` function behaves like a combination of map and reduce; it
 * applies a function to each element of a list, passing an accumulating
 * parameter from right to left, and returning a final value of this
 * accumulator together with the new list.
 *
 * Similar to [`mapAccum`](#mapAccum), except moves through the input list from
 * the right to the left.
 *
 * The iterator function receives two arguments, *acc* and *value*, and should
 * return a tuple *[acc, value]*.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig ((acc, x) -> (acc, y)) -> acc -> [x] -> (acc, [y])
 * @param {Function} fn The function to be called on every element of the input `list`.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.addIndex, R.mapAccum
 * @example
 *
 *      const digits = ['1', '2', '3', '4'];
 *      const appender = (a, b) => [b + a, b + a];
 *
 *      R.mapAccumRight(appender, 5, digits); //=> ['12345', ['12345', '2345', '345', '45']]
 * @symb R.mapAccumRight(f, a, [b, c, d]) = [
 *   f(f(f(a, d)[0], c)[0], b)[0],
 *   [
 *     f(a, d)[1],
 *     f(f(a, d)[0], c)[1],
 *     f(f(f(a, d)[0], c)[0], b)[1]
 *   ]
 * ]
 */


var mapAccumRight = /*#__PURE__*/_curry3(function mapAccumRight(fn, acc, list) {
  var idx = list.length - 1;
  var result = [];
  var tuple = [acc];
  while (idx >= 0) {
    tuple = fn(tuple[0], list[idx]);
    result[idx] = tuple[1];
    idx -= 1;
  }
  return [tuple[0], result];
});
module.exports = mapAccumRight;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mapObjIndexed.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _reduce = /*#__PURE__*/require('./internal/_reduce');

var keys = /*#__PURE__*/require('./keys');

/**
 * An Object-specific version of [`map`](#map). The function is applied to three
 * arguments: *(value, key, obj)*. If only the value is significant, use
 * [`map`](#map) instead.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig ((*, String, Object) -> *) -> Object -> Object
 * @param {Function} fn
 * @param {Object} obj
 * @return {Object}
 * @see R.map
 * @example
 *
 *      const xyz = { x: 1, y: 2, z: 3 };
 *      const prependKeyAndDouble = (num, key, obj) => key + (num * 2);
 *
 *      R.mapObjIndexed(prependKeyAndDouble, xyz); //=> { x: 'x2', y: 'y4', z: 'z6' }
 */


var mapObjIndexed = /*#__PURE__*/_curry2(function mapObjIndexed(fn, obj) {
  return _reduce(function (acc, key) {
    acc[key] = fn(obj[key], key, obj);
    return acc;
  }, {}, keys(obj));
});
module.exports = mapObjIndexed;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/match.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Tests a regular expression against a String. Note that this function will
 * return an empty array when there are no matches. This differs from
 * [`String.prototype.match`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match)
 * which returns `null` when there are no matches.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category String
 * @sig RegExp -> String -> [String | Undefined]
 * @param {RegExp} rx A regular expression.
 * @param {String} str The string to match against
 * @return {Array} The list of matches or empty array.
 * @see R.test
 * @example
 *
 *      R.match(/([a-z]a)/g, 'bananas'); //=> ['ba', 'na', 'na']
 *      R.match(/a/, 'b'); //=> []
 *      R.match(/a/, null); //=> TypeError: null does not have a method named "match"
 */


var match = /*#__PURE__*/_curry2(function match(rx, str) {
  return str.match(rx) || [];
});
module.exports = match;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mathMod.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _isInteger = /*#__PURE__*/require('./internal/_isInteger');

/**
 * `mathMod` behaves like the modulo operator should mathematically, unlike the
 * `%` operator (and by extension, [`R.modulo`](#modulo)). So while
 * `-17 % 5` is `-2`, `mathMod(-17, 5)` is `3`. `mathMod` requires Integer
 * arguments, and returns NaN when the modulus is zero or negative.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} m The dividend.
 * @param {Number} p the modulus.
 * @return {Number} The result of `b mod a`.
 * @see R.modulo
 * @example
 *
 *      R.mathMod(-17, 5);  //=> 3
 *      R.mathMod(17, 5);   //=> 2
 *      R.mathMod(17, -5);  //=> NaN
 *      R.mathMod(17, 0);   //=> NaN
 *      R.mathMod(17.2, 5); //=> NaN
 *      R.mathMod(17, 5.3); //=> NaN
 *
 *      const clock = R.mathMod(R.__, 12);
 *      clock(15); //=> 3
 *      clock(24); //=> 0
 *
 *      const seventeenMod = R.mathMod(17);
 *      seventeenMod(3);  //=> 2
 *      seventeenMod(4);  //=> 1
 *      seventeenMod(10); //=> 7
 */


var mathMod = /*#__PURE__*/_curry2(function mathMod(m, p) {
  if (!_isInteger(m)) {
    return NaN;
  }
  if (!_isInteger(p) || p < 1) {
    return NaN;
  }
  return (m % p + p) % p;
});
module.exports = mathMod;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_isInteger":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isInteger.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/max.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns the larger of its two arguments.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> a
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.maxBy, R.min
 * @example
 *
 *      R.max(789, 123); //=> 789
 *      R.max('a', 'b'); //=> 'b'
 */


var max = /*#__PURE__*/_curry2(function max(a, b) {
  return b > a ? b : a;
});
module.exports = max;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/maxBy.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Takes a function and two values, and returns whichever value produces the
 * larger result when passed to the provided function.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Relation
 * @sig Ord b => (a -> b) -> a -> a -> a
 * @param {Function} f
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.max, R.minBy
 * @example
 *
 *      //  square :: Number -> Number
 *      const square = n => n * n;
 *
 *      R.maxBy(square, -3, 2); //=> -3
 *
 *      R.reduce(R.maxBy(square), 0, [3, -5, 4, 1, -2]); //=> -5
 *      R.reduce(R.maxBy(square), 0, []); //=> 0
 */


var maxBy = /*#__PURE__*/_curry3(function maxBy(f, a, b) {
  return f(b) > f(a) ? b : a;
});
module.exports = maxBy;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mean.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var sum = /*#__PURE__*/require('./sum');

/**
 * Returns the mean of the given list of numbers.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list
 * @return {Number}
 * @see R.median
 * @example
 *
 *      R.mean([2, 7, 9]); //=> 6
 *      R.mean([]); //=> NaN
 */


var mean = /*#__PURE__*/_curry1(function mean(list) {
  return sum(list) / list.length;
});
module.exports = mean;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./sum":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sum.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/median.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var mean = /*#__PURE__*/require('./mean');

/**
 * Returns the median of the given list of numbers.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list
 * @return {Number}
 * @see R.mean
 * @example
 *
 *      R.median([2, 9, 7]); //=> 7
 *      R.median([7, 2, 10, 9]); //=> 8
 *      R.median([]); //=> NaN
 */


var median = /*#__PURE__*/_curry1(function median(list) {
  var len = list.length;
  if (len === 0) {
    return NaN;
  }
  var width = 2 - len % 2;
  var idx = (len - width) / 2;
  return mean(Array.prototype.slice.call(list, 0).sort(function (a, b) {
    return a < b ? -1 : a > b ? 1 : 0;
  }).slice(idx, idx + width));
});
module.exports = median;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./mean":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mean.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/memoizeWith.js":[function(require,module,exports){
var _arity = /*#__PURE__*/require('./internal/_arity');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _has = /*#__PURE__*/require('./internal/_has');

/**
 * Creates a new function that, when invoked, caches the result of calling `fn`
 * for a given argument set and returns the result. Subsequent calls to the
 * memoized `fn` with the same argument set will not result in an additional
 * call to `fn`; instead, the cached result for that set of arguments will be
 * returned.
 *
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Function
 * @sig (*... -> String) -> (*... -> a) -> (*... -> a)
 * @param {Function} fn The function to generate the cache key.
 * @param {Function} fn The function to memoize.
 * @return {Function} Memoized version of `fn`.
 * @example
 *
 *      let count = 0;
 *      const factorial = R.memoizeWith(R.identity, n => {
 *        count += 1;
 *        return R.product(R.range(1, n + 1));
 *      });
 *      factorial(5); //=> 120
 *      factorial(5); //=> 120
 *      factorial(5); //=> 120
 *      count; //=> 1
 */


var memoizeWith = /*#__PURE__*/_curry2(function memoizeWith(mFn, fn) {
  var cache = {};
  return _arity(fn.length, function () {
    var key = mFn.apply(this, arguments);
    if (!_has(key, cache)) {
      cache[key] = fn.apply(this, arguments);
    }
    return cache[key];
  });
});
module.exports = memoizeWith;
},{"./internal/_arity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/merge.js":[function(require,module,exports){
var _objectAssign = /*#__PURE__*/require('./internal/_objectAssign');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Create a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects,
 * the value from the second object will be used.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig {k: v} -> {k: v} -> {k: v}
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeRight, R.mergeDeepRight, R.mergeWith, R.mergeWithKey
 * @deprecated
 * @example
 *
 *      R.merge({ 'name': 'fred', 'age': 10 }, { 'age': 40 });
 *      //=> { 'name': 'fred', 'age': 40 }
 *
 *      const withDefaults = R.merge({x: 0, y: 0});
 *      withDefaults({y: 2}); //=> {x: 0, y: 2}
 * @symb R.merge(a, b) = {...a, ...b}
 */


var merge = /*#__PURE__*/_curry2(function merge(l, r) {
  return _objectAssign({}, l, r);
});
module.exports = merge;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_objectAssign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_objectAssign.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeAll.js":[function(require,module,exports){
var _objectAssign = /*#__PURE__*/require('./internal/_objectAssign');

var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Merges a list of objects together into one object.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig [{k: v}] -> {k: v}
 * @param {Array} list An array of objects
 * @return {Object} A merged object.
 * @see R.reduce
 * @example
 *
 *      R.mergeAll([{foo:1},{bar:2},{baz:3}]); //=> {foo:1,bar:2,baz:3}
 *      R.mergeAll([{foo:1},{foo:2},{bar:2}]); //=> {foo:2,bar:2}
 * @symb R.mergeAll([{ x: 1 }, { y: 2 }, { z: 3 }]) = { x: 1, y: 2, z: 3 }
 */


var mergeAll = /*#__PURE__*/_curry1(function mergeAll(list) {
  return _objectAssign.apply(null, [{}].concat(list));
});
module.exports = mergeAll;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_objectAssign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_objectAssign.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeDeepLeft.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var mergeDeepWithKey = /*#__PURE__*/require('./mergeDeepWithKey');

/**
 * Creates a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects:
 * - and both values are objects, the two values will be recursively merged
 * - otherwise the value from the first object will be used.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig {a} -> {a} -> {a}
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.merge, R.mergeDeepRight, R.mergeDeepWith, R.mergeDeepWithKey
 * @example
 *
 *      R.mergeDeepLeft({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},
 *                      { age: 40, contact: { email: 'baa@example.com' }});
 *      //=> { name: 'fred', age: 10, contact: { email: 'moo@example.com' }}
 */


var mergeDeepLeft = /*#__PURE__*/_curry2(function mergeDeepLeft(lObj, rObj) {
  return mergeDeepWithKey(function (k, lVal, rVal) {
    return lVal;
  }, lObj, rObj);
});
module.exports = mergeDeepLeft;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./mergeDeepWithKey":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeDeepWithKey.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeDeepRight.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var mergeDeepWithKey = /*#__PURE__*/require('./mergeDeepWithKey');

/**
 * Creates a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects:
 * - and both values are objects, the two values will be recursively merged
 * - otherwise the value from the second object will be used.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig {a} -> {a} -> {a}
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.merge, R.mergeDeepLeft, R.mergeDeepWith, R.mergeDeepWithKey
 * @example
 *
 *      R.mergeDeepRight({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},
 *                       { age: 40, contact: { email: 'baa@example.com' }});
 *      //=> { name: 'fred', age: 40, contact: { email: 'baa@example.com' }}
 */


var mergeDeepRight = /*#__PURE__*/_curry2(function mergeDeepRight(lObj, rObj) {
  return mergeDeepWithKey(function (k, lVal, rVal) {
    return rVal;
  }, lObj, rObj);
});
module.exports = mergeDeepRight;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./mergeDeepWithKey":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeDeepWithKey.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeDeepWith.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var mergeDeepWithKey = /*#__PURE__*/require('./mergeDeepWithKey');

/**
 * Creates a new object with the own properties of the two provided objects.
 * If a key exists in both objects:
 * - and both associated values are also objects then the values will be
 *   recursively merged.
 * - otherwise the provided function is applied to associated values using the
 *   resulting value as the new value associated with the key.
 * If a key only exists in one object, the value will be associated with the key
 * of the resulting object.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig ((a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.mergeWith, R.mergeDeepWithKey
 * @example
 *
 *      R.mergeDeepWith(R.concat,
 *                      { a: true, c: { values: [10, 20] }},
 *                      { b: true, c: { values: [15, 35] }});
 *      //=> { a: true, b: true, c: { values: [10, 20, 15, 35] }}
 */


var mergeDeepWith = /*#__PURE__*/_curry3(function mergeDeepWith(fn, lObj, rObj) {
  return mergeDeepWithKey(function (k, lVal, rVal) {
    return fn(lVal, rVal);
  }, lObj, rObj);
});
module.exports = mergeDeepWith;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./mergeDeepWithKey":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeDeepWithKey.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeDeepWithKey.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var _isObject = /*#__PURE__*/require('./internal/_isObject');

var mergeWithKey = /*#__PURE__*/require('./mergeWithKey');

/**
 * Creates a new object with the own properties of the two provided objects.
 * If a key exists in both objects:
 * - and both associated values are also objects then the values will be
 *   recursively merged.
 * - otherwise the provided function is applied to the key and associated values
 *   using the resulting value as the new value associated with the key.
 * If a key only exists in one object, the value will be associated with the key
 * of the resulting object.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.mergeWithKey, R.mergeDeepWith
 * @example
 *
 *      let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r
 *      R.mergeDeepWithKey(concatValues,
 *                         { a: true, c: { thing: 'foo', values: [10, 20] }},
 *                         { b: true, c: { thing: 'bar', values: [15, 35] }});
 *      //=> { a: true, b: true, c: { thing: 'bar', values: [10, 20, 15, 35] }}
 */


var mergeDeepWithKey = /*#__PURE__*/_curry3(function mergeDeepWithKey(fn, lObj, rObj) {
  return mergeWithKey(function (k, lVal, rVal) {
    if (_isObject(lVal) && _isObject(rVal)) {
      return mergeDeepWithKey(fn, lVal, rVal);
    } else {
      return fn(k, lVal, rVal);
    }
  }, lObj, rObj);
});
module.exports = mergeDeepWithKey;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./internal/_isObject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isObject.js","./mergeWithKey":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeWithKey.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeLeft.js":[function(require,module,exports){
var _objectAssign = /*#__PURE__*/require('./internal/_objectAssign');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Create a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects,
 * the value from the first object will be used.
 *
 * @func
 * @memberOf R
 * @category Object
 * @sig {k: v} -> {k: v} -> {k: v}
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeRight, R.mergeDeepLeft, R.mergeWith, R.mergeWithKey
 * @example
 *
 *      R.mergeLeft({ 'age': 40 }, { 'name': 'fred', 'age': 10 });
 *      //=> { 'name': 'fred', 'age': 40 }
 *
 *      const resetToDefault = R.mergeLeft({x: 0});
 *      resetToDefault({x: 5, y: 2}); //=> {x: 0, y: 2}
 * @symb R.mergeLeft(a, b) = {...b, ...a}
 */


var mergeLeft = /*#__PURE__*/_curry2(function mergeLeft(l, r) {
  return _objectAssign({}, r, l);
});
module.exports = mergeLeft;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_objectAssign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_objectAssign.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeRight.js":[function(require,module,exports){
var _objectAssign = /*#__PURE__*/require('./internal/_objectAssign');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Create a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects,
 * the value from the second object will be used.
 *
 * @func
 * @memberOf R
 * @category Object
 * @sig {k: v} -> {k: v} -> {k: v}
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeLeft, R.mergeDeepRight, R.mergeWith, R.mergeWithKey
 * @example
 *
 *      R.mergeRight({ 'name': 'fred', 'age': 10 }, { 'age': 40 });
 *      //=> { 'name': 'fred', 'age': 40 }
 *
 *      const withDefaults = R.mergeRight({x: 0, y: 0});
 *      withDefaults({y: 2}); //=> {x: 0, y: 2}
 * @symb R.mergeRight(a, b) = {...a, ...b}
 */


var mergeRight = /*#__PURE__*/_curry2(function mergeRight(l, r) {
  return _objectAssign({}, l, r);
});
module.exports = mergeRight;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_objectAssign":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_objectAssign.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeWith.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var mergeWithKey = /*#__PURE__*/require('./mergeWithKey');

/**
 * Creates a new object with the own properties of the two provided objects. If
 * a key exists in both objects, the provided function is applied to the values
 * associated with the key in each object, with the result being used as the
 * value associated with the key in the returned object.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Object
 * @sig ((a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeDeepWith, R.merge, R.mergeWithKey
 * @example
 *
 *      R.mergeWith(R.concat,
 *                  { a: true, values: [10, 20] },
 *                  { b: true, values: [15, 35] });
 *      //=> { a: true, b: true, values: [10, 20, 15, 35] }
 */


var mergeWith = /*#__PURE__*/_curry3(function mergeWith(fn, l, r) {
  return mergeWithKey(function (_, _l, _r) {
    return fn(_l, _r);
  }, l, r);
});
module.exports = mergeWith;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./mergeWithKey":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeWithKey.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/mergeWithKey.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var _has = /*#__PURE__*/require('./internal/_has');

/**
 * Creates a new object with the own properties of the two provided objects. If
 * a key exists in both objects, the provided function is applied to the key
 * and the values associated with the key in each object, with the result being
 * used as the value associated with the key in the returned object.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Object
 * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeDeepWithKey, R.merge, R.mergeWith
 * @example
 *
 *      let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r
 *      R.mergeWithKey(concatValues,
 *                     { a: true, thing: 'foo', values: [10, 20] },
 *                     { b: true, thing: 'bar', values: [15, 35] });
 *      //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] }
 * @symb R.mergeWithKey(f, { x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: f('y', 2, 5), z: 3 }
 */


var mergeWithKey = /*#__PURE__*/_curry3(function mergeWithKey(fn, l, r) {
  var result = {};
  var k;

  for (k in l) {
    if (_has(k, l)) {
      result[k] = _has(k, r) ? fn(k, l[k], r[k]) : l[k];
    }
  }

  for (k in r) {
    if (_has(k, r) && !_has(k, result)) {
      result[k] = r[k];
    }
  }

  return result;
});
module.exports = mergeWithKey;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./internal/_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/min.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns the smaller of its two arguments.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> a
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.minBy, R.max
 * @example
 *
 *      R.min(789, 123); //=> 123
 *      R.min('a', 'b'); //=> 'a'
 */


var min = /*#__PURE__*/_curry2(function min(a, b) {
  return b < a ? b : a;
});
module.exports = min;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/minBy.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Takes a function and two values, and returns whichever value produces the
 * smaller result when passed to the provided function.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Relation
 * @sig Ord b => (a -> b) -> a -> a -> a
 * @param {Function} f
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.min, R.maxBy
 * @example
 *
 *      //  square :: Number -> Number
 *      const square = n => n * n;
 *
 *      R.minBy(square, -3, 2); //=> 2
 *
 *      R.reduce(R.minBy(square), Infinity, [3, -5, 4, 1, -2]); //=> 1
 *      R.reduce(R.minBy(square), Infinity, []); //=> Infinity
 */


var minBy = /*#__PURE__*/_curry3(function minBy(f, a, b) {
  return f(b) < f(a) ? b : a;
});
module.exports = minBy;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/modulo.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Divides the first parameter by the second and returns the remainder. Note
 * that this function preserves the JavaScript-style behavior for modulo. For
 * mathematical modulo see [`mathMod`](#mathMod).
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The value to the divide.
 * @param {Number} b The pseudo-modulus
 * @return {Number} The result of `b % a`.
 * @see R.mathMod
 * @example
 *
 *      R.modulo(17, 3); //=> 2
 *      // JS behavior:
 *      R.modulo(-17, 3); //=> -2
 *      R.modulo(17, -3); //=> 2
 *
 *      const isOdd = R.modulo(R.__, 2);
 *      isOdd(42); //=> 0
 *      isOdd(21); //=> 1
 */


var modulo = /*#__PURE__*/_curry2(function modulo(a, b) {
  return a % b;
});
module.exports = modulo;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/move.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Move an item, at index `from`, to index `to`, in a list of elements.
 * A new list will be created containing the new elements order.
 *
 * @func
 * @memberOf R
 * @category List
 * @sig Number -> Number -> [a] -> [a]
 * @param {Number} from The source index
 * @param {Number} to The destination index
 * @param {Array} list The list which will serve to realise the move
 * @return {Array} The new list reordered
 * @example
 *
 *      R.move(0, 2, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['b', 'c', 'a', 'd', 'e', 'f']
 *      R.move(-1, 0, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['f', 'a', 'b', 'c', 'd', 'e'] list rotation
 */


var move = /*#__PURE__*/_curry3(function (from, to, list) {
  var length = list.length;
  var result = list.slice();
  var positiveFrom = from < 0 ? length + from : from;
  var positiveTo = to < 0 ? length + to : to;
  var item = result.splice(positiveFrom, 1);

  return positiveFrom < 0 || positiveFrom >= list.length || positiveTo < 0 || positiveTo >= list.length ? list : [].concat(result.slice(0, positiveTo)).concat(item).concat(result.slice(positiveTo, list.length));
});

module.exports = move;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/multiply.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Multiplies two numbers. Equivalent to `a * b` but curried.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The first value.
 * @param {Number} b The second value.
 * @return {Number} The result of `a * b`.
 * @see R.divide
 * @example
 *
 *      const double = R.multiply(2);
 *      const triple = R.multiply(3);
 *      double(3);       //=>  6
 *      triple(4);       //=> 12
 *      R.multiply(2, 5);  //=> 10
 */


var multiply = /*#__PURE__*/_curry2(function multiply(a, b) {
  return a * b;
});
module.exports = multiply;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nAry.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Wraps a function of any arity (including nullary) in a function that accepts
 * exactly `n` parameters. Any extraneous parameters will not be passed to the
 * supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig Number -> (* -> a) -> (* -> a)
 * @param {Number} n The desired arity of the new function.
 * @param {Function} fn The function to wrap.
 * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
 *         arity `n`.
 * @see R.binary, R.unary
 * @example
 *
 *      const takesTwoArgs = (a, b) => [a, b];
 *
 *      takesTwoArgs.length; //=> 2
 *      takesTwoArgs(1, 2); //=> [1, 2]
 *
 *      const takesOneArg = R.nAry(1, takesTwoArgs);
 *      takesOneArg.length; //=> 1
 *      // Only `n` arguments are passed to the wrapped function
 *      takesOneArg(1, 2); //=> [1, undefined]
 * @symb R.nAry(0, f)(a, b) = f()
 * @symb R.nAry(1, f)(a, b) = f(a)
 * @symb R.nAry(2, f)(a, b) = f(a, b)
 */


var nAry = /*#__PURE__*/_curry2(function nAry(n, fn) {
  switch (n) {
    case 0:
      return function () {
        return fn.call(this);
      };
    case 1:
      return function (a0) {
        return fn.call(this, a0);
      };
    case 2:
      return function (a0, a1) {
        return fn.call(this, a0, a1);
      };
    case 3:
      return function (a0, a1, a2) {
        return fn.call(this, a0, a1, a2);
      };
    case 4:
      return function (a0, a1, a2, a3) {
        return fn.call(this, a0, a1, a2, a3);
      };
    case 5:
      return function (a0, a1, a2, a3, a4) {
        return fn.call(this, a0, a1, a2, a3, a4);
      };
    case 6:
      return function (a0, a1, a2, a3, a4, a5) {
        return fn.call(this, a0, a1, a2, a3, a4, a5);
      };
    case 7:
      return function (a0, a1, a2, a3, a4, a5, a6) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6);
      };
    case 8:
      return function (a0, a1, a2, a3, a4, a5, a6, a7) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7);
      };
    case 9:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8);
      };
    case 10:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
      };
    default:
      throw new Error('First argument to nAry must be a non-negative integer no greater than ten');
  }
});
module.exports = nAry;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/negate.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Negates its argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Math
 * @sig Number -> Number
 * @param {Number} n
 * @return {Number}
 * @example
 *
 *      R.negate(42); //=> -42
 */


var negate = /*#__PURE__*/_curry1(function negate(n) {
  return -n;
});
module.exports = negate;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/none.js":[function(require,module,exports){
var _complement = /*#__PURE__*/require('./internal/_complement');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var all = /*#__PURE__*/require('./all');

/**
 * Returns `true` if no elements of the list match the predicate, `false`
 * otherwise.
 *
 * Dispatches to the `all` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> Boolean
 * @param {Function} fn The predicate function.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if the predicate is not satisfied by every element, `false` otherwise.
 * @see R.all, R.any
 * @example
 *
 *      const isEven = n => n % 2 === 0;
 *      const isOdd = n => n % 2 === 1;
 *
 *      R.none(isEven, [1, 3, 5, 7, 9, 11]); //=> true
 *      R.none(isOdd, [1, 3, 5, 7, 8, 11]); //=> false
 */


var none = /*#__PURE__*/_curry2(function none(fn, input) {
  return all(_complement(fn), input);
});
module.exports = none;
},{"./all":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/all.js","./internal/_complement":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_complement.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/not.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * A function that returns the `!` of its argument. It will return `true` when
 * passed false-y value, and `false` when passed a truth-y one.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig * -> Boolean
 * @param {*} a any value
 * @return {Boolean} the logical inverse of passed argument.
 * @see R.complement
 * @example
 *
 *      R.not(true); //=> false
 *      R.not(false); //=> true
 *      R.not(0); //=> true
 *      R.not(1); //=> false
 */


var not = /*#__PURE__*/_curry1(function not(a) {
  return !a;
});
module.exports = not;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nth.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _isString = /*#__PURE__*/require('./internal/_isString');

/**
 * Returns the nth element of the given list or string. If n is negative the
 * element at index length + n is returned.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> [a] -> a | Undefined
 * @sig Number -> String -> String
 * @param {Number} offset
 * @param {*} list
 * @return {*}
 * @example
 *
 *      const list = ['foo', 'bar', 'baz', 'quux'];
 *      R.nth(1, list); //=> 'bar'
 *      R.nth(-1, list); //=> 'quux'
 *      R.nth(-99, list); //=> undefined
 *
 *      R.nth(2, 'abc'); //=> 'c'
 *      R.nth(3, 'abc'); //=> ''
 * @symb R.nth(-1, [a, b, c]) = c
 * @symb R.nth(0, [a, b, c]) = a
 * @symb R.nth(1, [a, b, c]) = b
 */


var nth = /*#__PURE__*/_curry2(function nth(offset, list) {
  var idx = offset < 0 ? list.length + offset : offset;
  return _isString(list) ? list.charAt(idx) : list[idx];
});
module.exports = nth;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isString.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nthArg.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var curryN = /*#__PURE__*/require('./curryN');

var nth = /*#__PURE__*/require('./nth');

/**
 * Returns a function which returns its nth argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig Number -> *... -> *
 * @param {Number} n
 * @return {Function}
 * @example
 *
 *      R.nthArg(1)('a', 'b', 'c'); //=> 'b'
 *      R.nthArg(-1)('a', 'b', 'c'); //=> 'c'
 * @symb R.nthArg(-1)(a, b, c) = c
 * @symb R.nthArg(0)(a, b, c) = a
 * @symb R.nthArg(1)(a, b, c) = b
 */


var nthArg = /*#__PURE__*/_curry1(function nthArg(n) {
  var arity = n < 0 ? 1 : n + 1;
  return curryN(arity, function () {
    return nth(n, arguments);
  });
});
module.exports = nthArg;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./nth":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nth.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/o.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * `o` is a curried composition function that returns a unary function.
 * Like [`compose`](#compose), `o` performs right-to-left function composition.
 * Unlike [`compose`](#compose), the rightmost function passed to `o` will be
 * invoked with only one argument. Also, unlike [`compose`](#compose), `o` is
 * limited to accepting only 2 unary functions. The name o was chosen because
 * of its similarity to the mathematical composition operator ∘.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Function
 * @sig (b -> c) -> (a -> b) -> a -> c
 * @param {Function} f
 * @param {Function} g
 * @return {Function}
 * @see R.compose, R.pipe
 * @example
 *
 *      const classyGreeting = name => "The name's " + name.last + ", " + name.first + " " + name.last
 *      const yellGreeting = R.o(R.toUpper, classyGreeting);
 *      yellGreeting({first: 'James', last: 'Bond'}); //=> "THE NAME'S BOND, JAMES BOND"
 *
 *      R.o(R.multiply(10), R.add(10))(-4) //=> 60
 *
 * @symb R.o(f, g, x) = f(g(x))
 */


var o = /*#__PURE__*/_curry3(function o(f, g, x) {
  return f(g(x));
});
module.exports = o;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/objOf.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Creates an object containing a single key:value pair.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Object
 * @sig String -> a -> {String:a}
 * @param {String} key
 * @param {*} val
 * @return {Object}
 * @see R.pair
 * @example
 *
 *      const matchPhrases = R.compose(
 *        R.objOf('must'),
 *        R.map(R.objOf('match_phrase'))
 *      );
 *      matchPhrases(['foo', 'bar', 'baz']); //=> {must: [{match_phrase: 'foo'}, {match_phrase: 'bar'}, {match_phrase: 'baz'}]}
 */


var objOf = /*#__PURE__*/_curry2(function objOf(key, val) {
  var obj = {};
  obj[key] = val;
  return obj;
});
module.exports = objOf;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/of.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _of = /*#__PURE__*/require('./internal/_of');

/**
 * Returns a singleton array containing the value provided.
 *
 * Note this `of` is different from the ES6 `of`; See
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Function
 * @sig a -> [a]
 * @param {*} x any value
 * @return {Array} An array wrapping `x`.
 * @example
 *
 *      R.of(null); //=> [null]
 *      R.of([42]); //=> [[42]]
 */


var of = /*#__PURE__*/_curry1(_of);
module.exports = of;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/omit.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns a partial copy of an object omitting the keys specified.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [String] -> {String: *} -> {String: *}
 * @param {Array} names an array of String property names to omit from the new object
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with properties from `names` not on it.
 * @see R.pick
 * @example
 *
 *      R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3}
 */


var omit = /*#__PURE__*/_curry2(function omit(names, obj) {
  var result = {};
  var index = {};
  var idx = 0;
  var len = names.length;

  while (idx < len) {
    index[names[idx]] = 1;
    idx += 1;
  }

  for (var prop in obj) {
    if (!index.hasOwnProperty(prop)) {
      result[prop] = obj[prop];
    }
  }
  return result;
});
module.exports = omit;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/once.js":[function(require,module,exports){
var _arity = /*#__PURE__*/require('./internal/_arity');

var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Accepts a function `fn` and returns a function that guards invocation of
 * `fn` such that `fn` can only ever be called once, no matter how many times
 * the returned function is invoked. The first value calculated is returned in
 * subsequent invocations.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (a... -> b) -> (a... -> b)
 * @param {Function} fn The function to wrap in a call-only-once wrapper.
 * @return {Function} The wrapped function.
 * @example
 *
 *      const addOneOnce = R.once(x => x + 1);
 *      addOneOnce(10); //=> 11
 *      addOneOnce(addOneOnce(50)); //=> 11
 */


var once = /*#__PURE__*/_curry1(function once(fn) {
  var called = false;
  var result;
  return _arity(fn.length, function () {
    if (called) {
      return result;
    }
    called = true;
    result = fn.apply(this, arguments);
    return result;
  });
});
module.exports = once;
},{"./internal/_arity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/or.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns `true` if one or both of its arguments are `true`. Returns `false`
 * if both arguments are `false`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig a -> b -> a | b
 * @param {Any} a
 * @param {Any} b
 * @return {Any} the first argument if truthy, otherwise the second argument.
 * @see R.either
 * @example
 *
 *      R.or(true, true); //=> true
 *      R.or(true, false); //=> true
 *      R.or(false, true); //=> true
 *      R.or(false, false); //=> false
 */


var or = /*#__PURE__*/_curry2(function or(a, b) {
  return a || b;
});
module.exports = or;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/otherwise.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _assertPromise = /*#__PURE__*/require('./internal/_assertPromise');

/**
 * Returns the result of applying the onFailure function to the value inside
 * a failed promise. This is useful for handling rejected promises
 * inside function compositions.
 *
 * @func
 * @memberOf R
 * @category Function
 * @sig (e -> b) -> (Promise e a) -> (Promise e b)
 * @sig (e -> (Promise f b)) -> (Promise e a) -> (Promise f b)
 * @param {Function} onFailure The function to apply. Can return a value or a promise of a value.
 * @param {Promise} p
 * @return {Promise} The result of calling `p.then(null, onFailure)`
 * @see R.then
 * @example
 *
 *      var failedFetch = (id) => Promise.reject('bad ID');
 *      var useDefault = () => ({ firstName: 'Bob', lastName: 'Loblaw' })
 *
 *      //recoverFromFailure :: String -> Promise ({firstName, lastName})
 *      var recoverFromFailure = R.pipe(
 *        failedFetch,
 *        R.otherwise(useDefault),
 *        R.then(R.pick(['firstName', 'lastName'])),
 *      );
 *      recoverFromFailure(12345).then(console.log)
 */


var otherwise = /*#__PURE__*/_curry2(function otherwise(f, p) {
  _assertPromise('otherwise', p);

  return p.then(null, f);
});
module.exports = otherwise;
},{"./internal/_assertPromise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_assertPromise.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/over.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

// `Identity` is a functor that holds a single value, where `map` simply
// transforms the held value with the provided function.


var Identity = function (x) {
  return { value: x, map: function (f) {
      return Identity(f(x));
    } };
};

/**
 * Returns the result of "setting" the portion of the given data structure
 * focused by the given lens to the result of applying the given function to
 * the focused value.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Lens s a -> (a -> a) -> s -> s
 * @param {Lens} lens
 * @param {*} v
 * @param {*} x
 * @return {*}
 * @see R.prop, R.lensIndex, R.lensProp
 * @example
 *
 *      const headLens = R.lensIndex(0);
 *
 *      R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz']
 */
var over = /*#__PURE__*/_curry3(function over(lens, f, x) {
  // The value returned by the getter function is first transformed with `f`,
  // then set as the value of an `Identity`. This is then mapped over with the
  // setter function of the lens.
  return lens(function (y) {
    return Identity(f(y));
  })(x).value;
});
module.exports = over;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pair.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Takes two arguments, `fst` and `snd`, and returns `[fst, snd]`.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category List
 * @sig a -> b -> (a,b)
 * @param {*} fst
 * @param {*} snd
 * @return {Array}
 * @see R.objOf, R.of
 * @example
 *
 *      R.pair('foo', 'bar'); //=> ['foo', 'bar']
 */


var pair = /*#__PURE__*/_curry2(function pair(fst, snd) {
  return [fst, snd];
});
module.exports = pair;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/partial.js":[function(require,module,exports){
var _concat = /*#__PURE__*/require('./internal/_concat');

var _createPartialApplicator = /*#__PURE__*/require('./internal/_createPartialApplicator');

/**
 * Takes a function `f` and a list of arguments, and returns a function `g`.
 * When applied, `g` returns the result of applying `f` to the arguments
 * provided initially followed by the arguments provided to `g`.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Function
 * @sig ((a, b, c, ..., n) -> x) -> [a, b, c, ...] -> ((d, e, f, ..., n) -> x)
 * @param {Function} f
 * @param {Array} args
 * @return {Function}
 * @see R.partialRight, R.curry
 * @example
 *
 *      const multiply2 = (a, b) => a * b;
 *      const double = R.partial(multiply2, [2]);
 *      double(2); //=> 4
 *
 *      const greet = (salutation, title, firstName, lastName) =>
 *        salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
 *
 *      const sayHello = R.partial(greet, ['Hello']);
 *      const sayHelloToMs = R.partial(sayHello, ['Ms.']);
 *      sayHelloToMs('Jane', 'Jones'); //=> 'Hello, Ms. Jane Jones!'
 * @symb R.partial(f, [a, b])(c, d) = f(a, b, c, d)
 */


var partial = /*#__PURE__*/_createPartialApplicator(_concat);
module.exports = partial;
},{"./internal/_concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js","./internal/_createPartialApplicator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_createPartialApplicator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/partialRight.js":[function(require,module,exports){
var _concat = /*#__PURE__*/require('./internal/_concat');

var _createPartialApplicator = /*#__PURE__*/require('./internal/_createPartialApplicator');

var flip = /*#__PURE__*/require('./flip');

/**
 * Takes a function `f` and a list of arguments, and returns a function `g`.
 * When applied, `g` returns the result of applying `f` to the arguments
 * provided to `g` followed by the arguments provided initially.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Function
 * @sig ((a, b, c, ..., n) -> x) -> [d, e, f, ..., n] -> ((a, b, c, ...) -> x)
 * @param {Function} f
 * @param {Array} args
 * @return {Function}
 * @see R.partial
 * @example
 *
 *      const greet = (salutation, title, firstName, lastName) =>
 *        salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
 *
 *      const greetMsJaneJones = R.partialRight(greet, ['Ms.', 'Jane', 'Jones']);
 *
 *      greetMsJaneJones('Hello'); //=> 'Hello, Ms. Jane Jones!'
 * @symb R.partialRight(f, [a, b])(c, d) = f(c, d, a, b)
 */


var partialRight = /*#__PURE__*/_createPartialApplicator( /*#__PURE__*/flip(_concat));
module.exports = partialRight;
},{"./flip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/flip.js","./internal/_concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js","./internal/_createPartialApplicator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_createPartialApplicator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/partition.js":[function(require,module,exports){
var filter = /*#__PURE__*/require('./filter');

var juxt = /*#__PURE__*/require('./juxt');

var reject = /*#__PURE__*/require('./reject');

/**
 * Takes a predicate and a list or other `Filterable` object and returns the
 * pair of filterable objects of the same type of elements which do and do not
 * satisfy, the predicate, respectively. Filterable objects include plain objects or any object
 * that has a filter method such as `Array`.
 *
 * @func
 * @memberOf R
 * @since v0.1.4
 * @category List
 * @sig Filterable f => (a -> Boolean) -> f a -> [f a, f a]
 * @param {Function} pred A predicate to determine which side the element belongs to.
 * @param {Array} filterable the list (or other filterable) to partition.
 * @return {Array} An array, containing first the subset of elements that satisfy the
 *         predicate, and second the subset of elements that do not satisfy.
 * @see R.filter, R.reject
 * @example
 *
 *      R.partition(R.includes('s'), ['sss', 'ttt', 'foo', 'bars']);
 *      // => [ [ 'sss', 'bars' ],  [ 'ttt', 'foo' ] ]
 *
 *      R.partition(R.includes('s'), { a: 'sss', b: 'ttt', foo: 'bars' });
 *      // => [ { a: 'sss', foo: 'bars' }, { b: 'ttt' }  ]
 */


var partition = /*#__PURE__*/juxt([filter, reject]);
module.exports = partition;
},{"./filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/filter.js","./juxt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/juxt.js","./reject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reject.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/path.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Retrieve the value at a given path.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Object
 * @typedefn Idx = String | Int
 * @sig [Idx] -> {a} -> a | Undefined
 * @param {Array} path The path to use.
 * @param {Object} obj The object to retrieve the nested property from.
 * @return {*} The data at `path`.
 * @see R.prop
 * @example
 *
 *      R.path(['a', 'b'], {a: {b: 2}}); //=> 2
 *      R.path(['a', 'b'], {c: {b: 2}}); //=> undefined
 */


var path = /*#__PURE__*/_curry2(function path(paths, obj) {
  var val = obj;
  var idx = 0;
  while (idx < paths.length) {
    if (val == null) {
      return;
    }
    val = val[paths[idx]];
    idx += 1;
  }
  return val;
});
module.exports = path;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pathEq.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var equals = /*#__PURE__*/require('./equals');

var path = /*#__PURE__*/require('./path');

/**
 * Determines whether a nested path on an object has a specific value, in
 * [`R.equals`](#equals) terms. Most likely used to filter a list.
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Relation
 * @typedefn Idx = String | Int
 * @sig [Idx] -> a -> {a} -> Boolean
 * @param {Array} path The path of the nested property to use
 * @param {*} val The value to compare the nested property with
 * @param {Object} obj The object to check the nested property in
 * @return {Boolean} `true` if the value equals the nested object property,
 *         `false` otherwise.
 * @example
 *
 *      const user1 = { address: { zipCode: 90210 } };
 *      const user2 = { address: { zipCode: 55555 } };
 *      const user3 = { name: 'Bob' };
 *      const users = [ user1, user2, user3 ];
 *      const isFamous = R.pathEq(['address', 'zipCode'], 90210);
 *      R.filter(isFamous, users); //=> [ user1 ]
 */


var pathEq = /*#__PURE__*/_curry3(function pathEq(_path, val, obj) {
  return equals(path(_path, obj), val);
});
module.exports = pathEq;
},{"./equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/path.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pathOr.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var defaultTo = /*#__PURE__*/require('./defaultTo');

var path = /*#__PURE__*/require('./path');

/**
 * If the given, non-null object has a value at the given path, returns the
 * value at that path. Otherwise returns the provided default value.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Object
 * @typedefn Idx = String | Int
 * @sig a -> [Idx] -> {a} -> a
 * @param {*} d The default value.
 * @param {Array} p The path to use.
 * @param {Object} obj The object to retrieve the nested property from.
 * @return {*} The data at `path` of the supplied object or the default value.
 * @example
 *
 *      R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2
 *      R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A"
 */


var pathOr = /*#__PURE__*/_curry3(function pathOr(d, p, obj) {
  return defaultTo(d, path(p, obj));
});
module.exports = pathOr;
},{"./defaultTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/defaultTo.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/path.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pathSatisfies.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var path = /*#__PURE__*/require('./path');

/**
 * Returns `true` if the specified object property at given path satisfies the
 * given predicate; `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Logic
 * @typedefn Idx = String | Int
 * @sig (a -> Boolean) -> [Idx] -> {a} -> Boolean
 * @param {Function} pred
 * @param {Array} propPath
 * @param {*} obj
 * @return {Boolean}
 * @see R.propSatisfies, R.path
 * @example
 *
 *      R.pathSatisfies(y => y > 0, ['x', 'y'], {x: {y: 2}}); //=> true
 */


var pathSatisfies = /*#__PURE__*/_curry3(function pathSatisfies(pred, propPath, obj) {
  return propPath.length > 0 && pred(path(propPath, obj));
});
module.exports = pathSatisfies;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/path.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pick.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns a partial copy of an object containing only the keys specified. If
 * the key does not exist, the property is ignored.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [k] -> {k: v} -> {k: v}
 * @param {Array} names an array of String property names to copy onto a new object
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with only properties from `names` on it.
 * @see R.omit, R.props
 * @example
 *
 *      R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}
 *      R.pick(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1}
 */


var pick = /*#__PURE__*/_curry2(function pick(names, obj) {
  var result = {};
  var idx = 0;
  while (idx < names.length) {
    if (names[idx] in obj) {
      result[names[idx]] = obj[names[idx]];
    }
    idx += 1;
  }
  return result;
});
module.exports = pick;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pickAll.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Similar to `pick` except that this one includes a `key: undefined` pair for
 * properties that don't exist.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [k] -> {k: v} -> {k: v}
 * @param {Array} names an array of String property names to copy onto a new object
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with only properties from `names` on it.
 * @see R.pick
 * @example
 *
 *      R.pickAll(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}
 *      R.pickAll(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, e: undefined, f: undefined}
 */


var pickAll = /*#__PURE__*/_curry2(function pickAll(names, obj) {
  var result = {};
  var idx = 0;
  var len = names.length;
  while (idx < len) {
    var name = names[idx];
    result[name] = obj[name];
    idx += 1;
  }
  return result;
});
module.exports = pickAll;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pickBy.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns a partial copy of an object containing only the keys that satisfy
 * the supplied predicate.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @sig ((v, k) -> Boolean) -> {k: v} -> {k: v}
 * @param {Function} pred A predicate to determine whether or not a key
 *        should be included on the output object.
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with only properties that satisfy `pred`
 *         on it.
 * @see R.pick, R.filter
 * @example
 *
 *      const isUpperCase = (val, key) => key.toUpperCase() === key;
 *      R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4}
 */


var pickBy = /*#__PURE__*/_curry2(function pickBy(test, obj) {
  var result = {};
  for (var prop in obj) {
    if (test(obj[prop], prop, obj)) {
      result[prop] = obj[prop];
    }
  }
  return result;
});
module.exports = pickBy;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipe.js":[function(require,module,exports){
var _arity = /*#__PURE__*/require('./internal/_arity');

var _pipe = /*#__PURE__*/require('./internal/_pipe');

var reduce = /*#__PURE__*/require('./reduce');

var tail = /*#__PURE__*/require('./tail');

/**
 * Performs left-to-right function composition. The leftmost function may have
 * any arity; the remaining functions must be unary.
 *
 * In some libraries this function is named `sequence`.
 *
 * **Note:** The result of pipe is not automatically curried.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z)
 * @param {...Function} functions
 * @return {Function}
 * @see R.compose
 * @example
 *
 *      const f = R.pipe(Math.pow, R.negate, R.inc);
 *
 *      f(3, 4); // -(3^4) + 1
 * @symb R.pipe(f, g, h)(a, b) = h(g(f(a, b)))
 */


function pipe() {
  if (arguments.length === 0) {
    throw new Error('pipe requires at least one argument');
  }
  return _arity(arguments[0].length, reduce(_pipe, arguments[0], tail(arguments)));
}
module.exports = pipe;
},{"./internal/_arity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js","./internal/_pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_pipe.js","./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduce.js","./tail":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/tail.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipeK.js":[function(require,module,exports){
var composeK = /*#__PURE__*/require('./composeK');

var reverse = /*#__PURE__*/require('./reverse');

/**
 * Returns the left-to-right Kleisli composition of the provided functions,
 * each of which must return a value of a type supported by [`chain`](#chain).
 *
 * `R.pipeK(f, g, h)` is equivalent to `R.pipe(f, R.chain(g), R.chain(h))`.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Function
 * @sig Chain m => ((a -> m b), (b -> m c), ..., (y -> m z)) -> (a -> m z)
 * @param {...Function}
 * @return {Function}
 * @see R.composeK
 * @deprecated since v0.26.0
 * @example
 *
 *      //  parseJson :: String -> Maybe *
 *      //  get :: String -> Object -> Maybe *
 *
 *      //  getStateCode :: Maybe String -> Maybe String
 *      const getStateCode = R.pipeK(
 *        parseJson,
 *        get('user'),
 *        get('address'),
 *        get('state'),
 *        R.compose(Maybe.of, R.toUpper)
 *      );
 *
 *      getStateCode('{"user":{"address":{"state":"ny"}}}');
 *      //=> Just('NY')
 *      getStateCode('[Invalid JSON]');
 *      //=> Nothing()
 * @symb R.pipeK(f, g, h)(a) = R.chain(h, R.chain(g, f(a)))
 */


function pipeK() {
  if (arguments.length === 0) {
    throw new Error('pipeK requires at least one argument');
  }
  return composeK.apply(this, reverse(arguments));
}
module.exports = pipeK;
},{"./composeK":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/composeK.js","./reverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reverse.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipeP.js":[function(require,module,exports){
var _arity = /*#__PURE__*/require('./internal/_arity');

var _pipeP = /*#__PURE__*/require('./internal/_pipeP');

var reduce = /*#__PURE__*/require('./reduce');

var tail = /*#__PURE__*/require('./tail');

/**
 * Performs left-to-right composition of one or more Promise-returning
 * functions. The leftmost function may have any arity; the remaining functions
 * must be unary.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Function
 * @sig ((a -> Promise b), (b -> Promise c), ..., (y -> Promise z)) -> (a -> Promise z)
 * @param {...Function} functions
 * @return {Function}
 * @see R.composeP
 * @deprecated since v0.26.0
 * @example
 *
 *      //  followersForUser :: String -> Promise [User]
 *      const followersForUser = R.pipeP(db.getUserById, db.getFollowers);
 */


function pipeP() {
  if (arguments.length === 0) {
    throw new Error('pipeP requires at least one argument');
  }
  return _arity(arguments[0].length, reduce(_pipeP, arguments[0], tail(arguments)));
}
module.exports = pipeP;
},{"./internal/_arity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js","./internal/_pipeP":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_pipeP.js","./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduce.js","./tail":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/tail.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pipeWith.js":[function(require,module,exports){
var _arity = /*#__PURE__*/require('./internal/_arity');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var head = /*#__PURE__*/require('./head');

var _reduce = /*#__PURE__*/require('./internal/_reduce');

var tail = /*#__PURE__*/require('./tail');

var identity = /*#__PURE__*/require('./identity');

/**
 * Performs left-to-right function composition using transforming function. The leftmost function may have
 * any arity; the remaining functions must be unary.
 *
 * **Note:** The result of pipeWith is not automatically curried.
 *
 * @func
 * @memberOf R
 * @category Function
 * @sig ((* -> *), [((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)]) -> ((a, b, ..., n) -> z)
 * @param {...Function} functions
 * @return {Function}
 * @see R.composeWith, R.pipe
 * @example
 *
 *      const pipeWhileNotNil = R.pipeWith((f, res) => R.isNil(res) ? res : f(res));
 *      const f = pipeWhileNotNil([Math.pow, R.negate, R.inc])
 *
 *      f(3, 4); // -(3^4) + 1
 * @symb R.pipeWith(f)([g, h, i])(...args) = f(i, f(h, f(g, ...args)))
 */


var pipeWith = /*#__PURE__*/_curry2(function pipeWith(xf, list) {
  if (list.length <= 0) {
    return identity;
  }

  var headList = head(list);
  var tailList = tail(list);

  return _arity(headList.length, function () {
    return _reduce(function (result, f) {
      return xf.call(this, f, result);
    }, headList.apply(this, arguments), tailList);
  });
});
module.exports = pipeWith;
},{"./head":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/head.js","./identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/identity.js","./internal/_arity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./tail":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/tail.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pluck.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var map = /*#__PURE__*/require('./map');

var prop = /*#__PURE__*/require('./prop');

/**
 * Returns a new list by plucking the same named property off all objects in
 * the list supplied.
 *
 * `pluck` will work on
 * any [functor](https://github.com/fantasyland/fantasy-land#functor) in
 * addition to arrays, as it is equivalent to `R.map(R.prop(k), f)`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Functor f => k -> f {k: v} -> f v
 * @param {Number|String} key The key name to pluck off of each object.
 * @param {Array} f The array or functor to consider.
 * @return {Array} The list of values for the given key.
 * @see R.props
 * @example
 *
 *      var getAges = R.pluck('age');
 *      getAges([{name: 'fred', age: 29}, {name: 'wilma', age: 27}]); //=> [29, 27]
 *
 *      R.pluck(0, [[1, 2], [3, 4]]);               //=> [1, 3]
 *      R.pluck('val', {a: {val: 3}, b: {val: 5}}); //=> {a: 3, b: 5}
 * @symb R.pluck('x', [{x: 1, y: 2}, {x: 3, y: 4}, {x: 5, y: 6}]) = [1, 3, 5]
 * @symb R.pluck(0, [[1, 2], [3, 4], [5, 6]]) = [1, 3, 5]
 */


var pluck = /*#__PURE__*/_curry2(function pluck(p, list) {
  return map(prop(p), list);
});
module.exports = pluck;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js","./prop":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/prop.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/prepend.js":[function(require,module,exports){
var _concat = /*#__PURE__*/require('./internal/_concat');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns a new list with the given element at the front, followed by the
 * contents of the list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> [a]
 * @param {*} el The item to add to the head of the output list.
 * @param {Array} list The array to add to the tail of the output list.
 * @return {Array} A new array.
 * @see R.append
 * @example
 *
 *      R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum']
 */


var prepend = /*#__PURE__*/_curry2(function prepend(el, list) {
  return _concat([el], list);
});
module.exports = prepend;
},{"./internal/_concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/product.js":[function(require,module,exports){
var multiply = /*#__PURE__*/require('./multiply');

var reduce = /*#__PURE__*/require('./reduce');

/**
 * Multiplies together all the elements of a list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list An array of numbers
 * @return {Number} The product of all the numbers in the list.
 * @see R.reduce
 * @example
 *
 *      R.product([2,4,6,8,100,1]); //=> 38400
 */


var product = /*#__PURE__*/reduce(multiply, 1);
module.exports = product;
},{"./multiply":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/multiply.js","./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/project.js":[function(require,module,exports){
var _map = /*#__PURE__*/require('./internal/_map');

var identity = /*#__PURE__*/require('./identity');

var pickAll = /*#__PURE__*/require('./pickAll');

var useWith = /*#__PURE__*/require('./useWith');

/**
 * Reasonable analog to SQL `select` statement.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @category Relation
 * @sig [k] -> [{k: v}] -> [{k: v}]
 * @param {Array} props The property names to project
 * @param {Array} objs The objects to query
 * @return {Array} An array of objects with just the `props` properties.
 * @example
 *
 *      const abby = {name: 'Abby', age: 7, hair: 'blond', grade: 2};
 *      const fred = {name: 'Fred', age: 12, hair: 'brown', grade: 7};
 *      const kids = [abby, fred];
 *      R.project(['name', 'grade'], kids); //=> [{name: 'Abby', grade: 2}, {name: 'Fred', grade: 7}]
 */


var project = /*#__PURE__*/useWith(_map, [pickAll, identity]); // passing `identity` gives correct arity
module.exports = project;
},{"./identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/identity.js","./internal/_map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_map.js","./pickAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pickAll.js","./useWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/useWith.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/prop.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var path = /*#__PURE__*/require('./path');

/**
 * Returns a function that when supplied an object returns the indicated
 * property of that object, if it exists.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig s -> {s: a} -> a | Undefined
 * @param {String} p The property name
 * @param {Object} obj The object to query
 * @return {*} The value at `obj.p`.
 * @see R.path
 * @example
 *
 *      R.prop('x', {x: 100}); //=> 100
 *      R.prop('x', {}); //=> undefined
 *      R.compose(R.inc, R.prop('x'))({ x: 3 }) //=> 4
 */

var prop = /*#__PURE__*/_curry2(function prop(p, obj) {
  return path([p], obj);
});
module.exports = prop;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./path":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/path.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/propEq.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var equals = /*#__PURE__*/require('./equals');

/**
 * Returns `true` if the specified object property is equal, in
 * [`R.equals`](#equals) terms, to the given value; `false` otherwise.
 * You can test multiple properties with [`R.whereEq`](#whereEq).
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig String -> a -> Object -> Boolean
 * @param {String} name
 * @param {*} val
 * @param {*} obj
 * @return {Boolean}
 * @see R.whereEq, R.propSatisfies, R.equals
 * @example
 *
 *      const abby = {name: 'Abby', age: 7, hair: 'blond'};
 *      const fred = {name: 'Fred', age: 12, hair: 'brown'};
 *      const rusty = {name: 'Rusty', age: 10, hair: 'brown'};
 *      const alois = {name: 'Alois', age: 15, disposition: 'surly'};
 *      const kids = [abby, fred, rusty, alois];
 *      const hasBrownHair = R.propEq('hair', 'brown');
 *      R.filter(hasBrownHair, kids); //=> [fred, rusty]
 */


var propEq = /*#__PURE__*/_curry3(function propEq(name, val, obj) {
  return equals(val, obj[name]);
});
module.exports = propEq;
},{"./equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/propIs.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var is = /*#__PURE__*/require('./is');

/**
 * Returns `true` if the specified object property is of the given type;
 * `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Type
 * @sig Type -> String -> Object -> Boolean
 * @param {Function} type
 * @param {String} name
 * @param {*} obj
 * @return {Boolean}
 * @see R.is, R.propSatisfies
 * @example
 *
 *      R.propIs(Number, 'x', {x: 1, y: 2});  //=> true
 *      R.propIs(Number, 'x', {x: 'foo'});    //=> false
 *      R.propIs(Number, 'x', {});            //=> false
 */


var propIs = /*#__PURE__*/_curry3(function propIs(type, name, obj) {
  return is(type, obj[name]);
});
module.exports = propIs;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/is.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/propOr.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var pathOr = /*#__PURE__*/require('./pathOr');

/**
 * If the given, non-null object has an own property with the specified name,
 * returns the value of that property. Otherwise returns the provided default
 * value.
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category Object
 * @sig a -> String -> Object -> a
 * @param {*} val The default value.
 * @param {String} p The name of the property to return.
 * @param {Object} obj The object to query.
 * @return {*} The value of given property of the supplied object or the default value.
 * @example
 *
 *      const alice = {
 *        name: 'ALICE',
 *        age: 101
 *      };
 *      const favorite = R.prop('favoriteLibrary');
 *      const favoriteWithDefault = R.propOr('Ramda', 'favoriteLibrary');
 *
 *      favorite(alice);  //=> undefined
 *      favoriteWithDefault(alice);  //=> 'Ramda'
 */


var propOr = /*#__PURE__*/_curry3(function propOr(val, p, obj) {
  return pathOr(val, [p], obj);
});
module.exports = propOr;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./pathOr":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/pathOr.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/propSatisfies.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Returns `true` if the specified object property satisfies the given
 * predicate; `false` otherwise. You can test multiple properties with
 * [`R.where`](#where).
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Logic
 * @sig (a -> Boolean) -> String -> {String: a} -> Boolean
 * @param {Function} pred
 * @param {String} name
 * @param {*} obj
 * @return {Boolean}
 * @see R.where, R.propEq, R.propIs
 * @example
 *
 *      R.propSatisfies(x => x > 0, 'x', {x: 1, y: 2}); //=> true
 */


var propSatisfies = /*#__PURE__*/_curry3(function propSatisfies(pred, name, obj) {
  return pred(obj[name]);
});
module.exports = propSatisfies;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/props.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Acts as multiple `prop`: array of keys in, array of values out. Preserves
 * order.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [k] -> {k: v} -> [v]
 * @param {Array} ps The property names to fetch
 * @param {Object} obj The object to query
 * @return {Array} The corresponding values or partially applied function.
 * @example
 *
 *      R.props(['x', 'y'], {x: 1, y: 2}); //=> [1, 2]
 *      R.props(['c', 'a', 'b'], {b: 2, a: 1}); //=> [undefined, 1, 2]
 *
 *      const fullName = R.compose(R.join(' '), R.props(['first', 'last']));
 *      fullName({last: 'Bullet-Tooth', age: 33, first: 'Tony'}); //=> 'Tony Bullet-Tooth'
 */


var props = /*#__PURE__*/_curry2(function props(ps, obj) {
  var len = ps.length;
  var out = [];
  var idx = 0;

  while (idx < len) {
    out[idx] = obj[ps[idx]];
    idx += 1;
  }

  return out;
});
module.exports = props;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/range.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _isNumber = /*#__PURE__*/require('./internal/_isNumber');

/**
 * Returns a list of numbers from `from` (inclusive) to `to` (exclusive).
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> Number -> [Number]
 * @param {Number} from The first number in the list.
 * @param {Number} to One more than the last number in the list.
 * @return {Array} The list of numbers in the set `[a, b)`.
 * @example
 *
 *      R.range(1, 5);    //=> [1, 2, 3, 4]
 *      R.range(50, 53);  //=> [50, 51, 52]
 */


var range = /*#__PURE__*/_curry2(function range(from, to) {
  if (!(_isNumber(from) && _isNumber(to))) {
    throw new TypeError('Both arguments to range must be numbers');
  }
  var result = [];
  var n = from;
  while (n < to) {
    result.push(n);
    n += 1;
  }
  return result;
});
module.exports = range;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_isNumber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isNumber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduce.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var _reduce = /*#__PURE__*/require('./internal/_reduce');

/**
 * Returns a single item by iterating through the list, successively calling
 * the iterator function and passing it an accumulator value and the current
 * value from the array, and then passing the result to the next call.
 *
 * The iterator function receives two values: *(acc, value)*. It may use
 * [`R.reduced`](#reduced) to shortcut the iteration.
 *
 * The arguments' order of [`reduceRight`](#reduceRight)'s iterator function
 * is *(value, acc)*.
 *
 * Note: `R.reduce` does not skip deleted or unassigned indices (sparse
 * arrays), unlike the native `Array.prototype.reduce` method. For more details
 * on this behavior, see:
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description
 *
 * Dispatches to the `reduce` method of the third argument, if present. When
 * doing so, it is up to the user to handle the [`R.reduced`](#reduced)
 * shortcuting, as this is not implemented by `reduce`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, b) -> a) -> a -> [b] -> a
 * @param {Function} fn The iterator function. Receives two values, the accumulator and the
 *        current element from the array.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduced, R.addIndex, R.reduceRight
 * @example
 *
 *      R.reduce(R.subtract, 0, [1, 2, 3, 4]) // => ((((0 - 1) - 2) - 3) - 4) = -10
 *      //          -               -10
 *      //         / \              / \
 *      //        -   4           -6   4
 *      //       / \              / \
 *      //      -   3   ==>     -3   3
 *      //     / \              / \
 *      //    -   2           -1   2
 *      //   / \              / \
 *      //  0   1            0   1
 *
 * @symb R.reduce(f, a, [b, c, d]) = f(f(f(a, b), c), d)
 */


var reduce = /*#__PURE__*/_curry3(_reduce);
module.exports = reduce;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./internal/_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduceBy.js":[function(require,module,exports){
var _curryN = /*#__PURE__*/require('./internal/_curryN');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _has = /*#__PURE__*/require('./internal/_has');

var _reduce = /*#__PURE__*/require('./internal/_reduce');

var _xreduceBy = /*#__PURE__*/require('./internal/_xreduceBy');

/**
 * Groups the elements of the list according to the result of calling
 * the String-returning function `keyFn` on each element and reduces the elements
 * of each group to a single value via the reducer function `valueFn`.
 *
 * This function is basically a more general [`groupBy`](#groupBy) function.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category List
 * @sig ((a, b) -> a) -> a -> (b -> String) -> [b] -> {String: a}
 * @param {Function} valueFn The function that reduces the elements of each group to a single
 *        value. Receives two values, accumulator for a particular group and the current element.
 * @param {*} acc The (initial) accumulator value for each group.
 * @param {Function} keyFn The function that maps the list's element into a key.
 * @param {Array} list The array to group.
 * @return {Object} An object with the output of `keyFn` for keys, mapped to the output of
 *         `valueFn` for elements which produced that key when passed to `keyFn`.
 * @see R.groupBy, R.reduce
 * @example
 *
 *      const groupNames = (acc, {name}) => acc.concat(name)
 *      const toGrade = ({score}) =>
 *        score < 65 ? 'F' :
 *        score < 70 ? 'D' :
 *        score < 80 ? 'C' :
 *        score < 90 ? 'B' : 'A'
 *
 *      var students = [
 *        {name: 'Abby', score: 83},
 *        {name: 'Bart', score: 62},
 *        {name: 'Curt', score: 88},
 *        {name: 'Dora', score: 92},
 *      ]
 *
 *      reduceBy(groupNames, [], toGrade, students)
 *      //=> {"A": ["Dora"], "B": ["Abby", "Curt"], "F": ["Bart"]}
 */


var reduceBy = /*#__PURE__*/_curryN(4, [], /*#__PURE__*/_dispatchable([], _xreduceBy, function reduceBy(valueFn, valueAcc, keyFn, list) {
  return _reduce(function (acc, elt) {
    var key = keyFn(elt);
    acc[key] = valueFn(_has(key, acc) ? acc[key] : valueAcc, elt);
    return acc;
  }, {}, list);
}));
module.exports = reduceBy;
},{"./internal/_curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curryN.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js","./internal/_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./internal/_xreduceBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xreduceBy.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduceRight.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Returns a single item by iterating through the list, successively calling
 * the iterator function and passing it an accumulator value and the current
 * value from the array, and then passing the result to the next call.
 *
 * Similar to [`reduce`](#reduce), except moves through the input list from the
 * right to the left.
 *
 * The iterator function receives two values: *(value, acc)*, while the arguments'
 * order of `reduce`'s iterator function is *(acc, value)*.
 *
 * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse
 * arrays), unlike the native `Array.prototype.reduceRight` method. For more details
 * on this behavior, see:
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, b) -> b) -> b -> [a] -> b
 * @param {Function} fn The iterator function. Receives two values, the current element from the array
 *        and the accumulator.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduce, R.addIndex
 * @example
 *
 *      R.reduceRight(R.subtract, 0, [1, 2, 3, 4]) // => (1 - (2 - (3 - (4 - 0)))) = -2
 *      //    -               -2
 *      //   / \              / \
 *      //  1   -            1   3
 *      //     / \              / \
 *      //    2   -     ==>    2  -1
 *      //       / \              / \
 *      //      3   -            3   4
 *      //         / \              / \
 *      //        4   0            4   0
 *
 * @symb R.reduceRight(f, a, [b, c, d]) = f(b, f(c, f(d, a)))
 */


var reduceRight = /*#__PURE__*/_curry3(function reduceRight(fn, acc, list) {
  var idx = list.length - 1;
  while (idx >= 0) {
    acc = fn(list[idx], acc);
    idx -= 1;
  }
  return acc;
});
module.exports = reduceRight;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduceWhile.js":[function(require,module,exports){
var _curryN = /*#__PURE__*/require('./internal/_curryN');

var _reduce = /*#__PURE__*/require('./internal/_reduce');

var _reduced = /*#__PURE__*/require('./internal/_reduced');

/**
 * Like [`reduce`](#reduce), `reduceWhile` returns a single item by iterating
 * through the list, successively calling the iterator function. `reduceWhile`
 * also takes a predicate that is evaluated before each step. If the predicate
 * returns `false`, it "short-circuits" the iteration and returns the current
 * value of the accumulator.
 *
 * @func
 * @memberOf R
 * @since v0.22.0
 * @category List
 * @sig ((a, b) -> Boolean) -> ((a, b) -> a) -> a -> [b] -> a
 * @param {Function} pred The predicate. It is passed the accumulator and the
 *        current element.
 * @param {Function} fn The iterator function. Receives two values, the
 *        accumulator and the current element.
 * @param {*} a The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduce, R.reduced
 * @example
 *
 *      const isOdd = (acc, x) => x % 2 === 1;
 *      const xs = [1, 3, 5, 60, 777, 800];
 *      R.reduceWhile(isOdd, R.add, 0, xs); //=> 9
 *
 *      const ys = [2, 4, 6]
 *      R.reduceWhile(isOdd, R.add, 111, ys); //=> 111
 */


var reduceWhile = /*#__PURE__*/_curryN(4, [], function _reduceWhile(pred, fn, a, list) {
  return _reduce(function (acc, x) {
    return pred(acc, x) ? fn(acc, x) : _reduced(acc);
  }, a, list);
});
module.exports = reduceWhile;
},{"./internal/_curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curryN.js","./internal/_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./internal/_reduced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduced.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduced.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _reduced = /*#__PURE__*/require('./internal/_reduced');

/**
 * Returns a value wrapped to indicate that it is the final value of the reduce
 * and transduce functions. The returned value should be considered a black
 * box: the internal structure is not guaranteed to be stable.
 *
 * Note: this optimization is only available to the below functions:
 * - [`reduce`](#reduce)
 * - [`reduceWhile`](#reduceWhile)
 * - [`transduce`](#transduce)
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category List
 * @sig a -> *
 * @param {*} x The final value of the reduce.
 * @return {*} The wrapped value.
 * @see R.reduce, R.reduceWhile, R.transduce
 * @example
 *
 *     R.reduce(
 *       (acc, item) => item > 3 ? R.reduced(acc) : acc.concat(item),
 *       [],
 *       [1, 2, 3, 4, 5]) // [1, 2, 3]
 */


var reduced = /*#__PURE__*/_curry1(_reduced);
module.exports = reduced;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_reduced":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduced.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reject.js":[function(require,module,exports){
var _complement = /*#__PURE__*/require('./internal/_complement');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var filter = /*#__PURE__*/require('./filter');

/**
 * The complement of [`filter`](#filter).
 *
 * Acts as a transducer if a transformer is given in list position. Filterable
 * objects include plain objects or any object that has a filter method such
 * as `Array`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Filterable f => (a -> Boolean) -> f a -> f a
 * @param {Function} pred
 * @param {Array} filterable
 * @return {Array}
 * @see R.filter, R.transduce, R.addIndex
 * @example
 *
 *      const isOdd = (n) => n % 2 === 1;
 *
 *      R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4]
 *
 *      R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
 */


var reject = /*#__PURE__*/_curry2(function reject(pred, filterable) {
  return filter(_complement(pred), filterable);
});
module.exports = reject;
},{"./filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/filter.js","./internal/_complement":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_complement.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/remove.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Removes the sub-list of `list` starting at index `start` and containing
 * `count` elements. _Note that this is not destructive_: it returns a copy of
 * the list with the changes.
 * <small>No lists have been harmed in the application of this function.</small>
 *
 * @func
 * @memberOf R
 * @since v0.2.2
 * @category List
 * @sig Number -> Number -> [a] -> [a]
 * @param {Number} start The position to start removing elements
 * @param {Number} count The number of elements to remove
 * @param {Array} list The list to remove from
 * @return {Array} A new Array with `count` elements from `start` removed.
 * @see R.without
 * @example
 *
 *      R.remove(2, 3, [1,2,3,4,5,6,7,8]); //=> [1,2,6,7,8]
 */


var remove = /*#__PURE__*/_curry3(function remove(start, count, list) {
  var result = Array.prototype.slice.call(list, 0);
  result.splice(start, count);
  return result;
});
module.exports = remove;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/repeat.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var always = /*#__PURE__*/require('./always');

var times = /*#__PURE__*/require('./times');

/**
 * Returns a fixed list of size `n` containing a specified identical value.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig a -> n -> [a]
 * @param {*} value The value to repeat.
 * @param {Number} n The desired size of the output list.
 * @return {Array} A new array containing `n` `value`s.
 * @see R.times
 * @example
 *
 *      R.repeat('hi', 5); //=> ['hi', 'hi', 'hi', 'hi', 'hi']
 *
 *      const obj = {};
 *      const repeatedObjs = R.repeat(obj, 5); //=> [{}, {}, {}, {}, {}]
 *      repeatedObjs[0] === repeatedObjs[1]; //=> true
 * @symb R.repeat(a, 0) = []
 * @symb R.repeat(a, 1) = [a]
 * @symb R.repeat(a, 2) = [a, a]
 */


var repeat = /*#__PURE__*/_curry2(function repeat(value, n) {
  return times(always(value), n);
});
module.exports = repeat;
},{"./always":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/always.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./times":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/times.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/replace.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Replace a substring or regex match in a string with a replacement.
 *
 * The first two parameters correspond to the parameters of the
 * `String.prototype.replace()` function, so the second parameter can also be a
 * function.
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category String
 * @sig RegExp|String -> String -> String -> String
 * @param {RegExp|String} pattern A regular expression or a substring to match.
 * @param {String} replacement The string to replace the matches with.
 * @param {String} str The String to do the search and replacement in.
 * @return {String} The result.
 * @example
 *
 *      R.replace('foo', 'bar', 'foo foo foo'); //=> 'bar foo foo'
 *      R.replace(/foo/, 'bar', 'foo foo foo'); //=> 'bar foo foo'
 *
 *      // Use the "g" (global) flag to replace all occurrences:
 *      R.replace(/foo/g, 'bar', 'foo foo foo'); //=> 'bar bar bar'
 */


var replace = /*#__PURE__*/_curry3(function replace(regex, replacement, str) {
  return str.replace(regex, replacement);
});
module.exports = replace;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reverse.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _isString = /*#__PURE__*/require('./internal/_isString');

/**
 * Returns a new list or string with the elements or characters in reverse
 * order.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a]
 * @sig String -> String
 * @param {Array|String} list
 * @return {Array|String}
 * @example
 *
 *      R.reverse([1, 2, 3]);  //=> [3, 2, 1]
 *      R.reverse([1, 2]);     //=> [2, 1]
 *      R.reverse([1]);        //=> [1]
 *      R.reverse([]);         //=> []
 *
 *      R.reverse('abc');      //=> 'cba'
 *      R.reverse('ab');       //=> 'ba'
 *      R.reverse('a');        //=> 'a'
 *      R.reverse('');         //=> ''
 */


var reverse = /*#__PURE__*/_curry1(function reverse(list) {
  return _isString(list) ? list.split('').reverse().join('') : Array.prototype.slice.call(list, 0).reverse();
});
module.exports = reverse;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_isString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isString.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/scan.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Scan is similar to [`reduce`](#reduce), but returns a list of successively
 * reduced values from the left
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig ((a, b) -> a) -> a -> [b] -> [a]
 * @param {Function} fn The iterator function. Receives two values, the accumulator and the
 *        current element from the array
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {Array} A list of all intermediately reduced values.
 * @see R.reduce, R.mapAccum
 * @example
 *
 *      const numbers = [1, 2, 3, 4];
 *      const factorials = R.scan(R.multiply, 1, numbers); //=> [1, 1, 2, 6, 24]
 * @symb R.scan(f, a, [b, c]) = [a, f(a, b), f(f(a, b), c)]
 */


var scan = /*#__PURE__*/_curry3(function scan(fn, acc, list) {
  var idx = 0;
  var len = list.length;
  var result = [acc];
  while (idx < len) {
    acc = fn(acc, list[idx]);
    result[idx + 1] = acc;
    idx += 1;
  }
  return result;
});
module.exports = scan;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sequence.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var ap = /*#__PURE__*/require('./ap');

var map = /*#__PURE__*/require('./map');

var prepend = /*#__PURE__*/require('./prepend');

var reduceRight = /*#__PURE__*/require('./reduceRight');

/**
 * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable)
 * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an
 * Applicative of Traversable.
 *
 * Dispatches to the `sequence` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a)
 * @param {Function} of
 * @param {*} traversable
 * @return {*}
 * @see R.traverse
 * @example
 *
 *      R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]);   //=> Just([1, 2, 3])
 *      R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing()
 *
 *      R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)]
 *      R.sequence(R.of, Nothing());       //=> [Nothing()]
 */


var sequence = /*#__PURE__*/_curry2(function sequence(of, traversable) {
  return typeof traversable.sequence === 'function' ? traversable.sequence(of) : reduceRight(function (x, acc) {
    return ap(map(prepend, x), acc);
  }, of([]), traversable);
});
module.exports = sequence;
},{"./ap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/ap.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js","./prepend":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/prepend.js","./reduceRight":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduceRight.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/set.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var always = /*#__PURE__*/require('./always');

var over = /*#__PURE__*/require('./over');

/**
 * Returns the result of "setting" the portion of the given data structure
 * focused by the given lens to the given value.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Lens s a -> a -> s -> s
 * @param {Lens} lens
 * @param {*} v
 * @param {*} x
 * @return {*}
 * @see R.prop, R.lensIndex, R.lensProp
 * @example
 *
 *      const xLens = R.lensProp('x');
 *
 *      R.set(xLens, 4, {x: 1, y: 2});  //=> {x: 4, y: 2}
 *      R.set(xLens, 8, {x: 1, y: 2});  //=> {x: 8, y: 2}
 */


var set = /*#__PURE__*/_curry3(function set(lens, v, x) {
  return over(lens, always(v), x);
});
module.exports = set;
},{"./always":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/always.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./over":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/over.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js":[function(require,module,exports){
var _checkForMethod = /*#__PURE__*/require('./internal/_checkForMethod');

var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Returns the elements of the given list or string (or object with a `slice`
 * method) from `fromIndex` (inclusive) to `toIndex` (exclusive).
 *
 * Dispatches to the `slice` method of the third argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.4
 * @category List
 * @sig Number -> Number -> [a] -> [a]
 * @sig Number -> Number -> String -> String
 * @param {Number} fromIndex The start index (inclusive).
 * @param {Number} toIndex The end index (exclusive).
 * @param {*} list
 * @return {*}
 * @example
 *
 *      R.slice(1, 3, ['a', 'b', 'c', 'd']);        //=> ['b', 'c']
 *      R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd']
 *      R.slice(0, -1, ['a', 'b', 'c', 'd']);       //=> ['a', 'b', 'c']
 *      R.slice(-3, -1, ['a', 'b', 'c', 'd']);      //=> ['b', 'c']
 *      R.slice(0, 3, 'ramda');                     //=> 'ram'
 */


var slice = /*#__PURE__*/_curry3( /*#__PURE__*/_checkForMethod('slice', function slice(fromIndex, toIndex, list) {
  return Array.prototype.slice.call(list, fromIndex, toIndex);
}));
module.exports = slice;
},{"./internal/_checkForMethod":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_checkForMethod.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sort.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns a copy of the list, sorted according to the comparator function,
 * which should accept two values at a time and return a negative number if the
 * first value is smaller, a positive number if it's larger, and zero if they
 * are equal. Please note that this is a **copy** of the list. It does not
 * modify the original.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, a) -> Number) -> [a] -> [a]
 * @param {Function} comparator A sorting function :: a -> b -> Int
 * @param {Array} list The list to sort
 * @return {Array} a new array with its elements sorted by the comparator function.
 * @example
 *
 *      const diff = function(a, b) { return a - b; };
 *      R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7]
 */


var sort = /*#__PURE__*/_curry2(function sort(comparator, list) {
  return Array.prototype.slice.call(list, 0).sort(comparator);
});
module.exports = sort;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sortBy.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Sorts the list according to the supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord b => (a -> b) -> [a] -> [a]
 * @param {Function} fn
 * @param {Array} list The list to sort.
 * @return {Array} A new list sorted by the keys generated by `fn`.
 * @example
 *
 *      const sortByFirstItem = R.sortBy(R.prop(0));
 *      const pairs = [[-1, 1], [-2, 2], [-3, 3]];
 *      sortByFirstItem(pairs); //=> [[-3, 3], [-2, 2], [-1, 1]]
 *
 *      const sortByNameCaseInsensitive = R.sortBy(R.compose(R.toLower, R.prop('name')));
 *      const alice = {
 *        name: 'ALICE',
 *        age: 101
 *      };
 *      const bob = {
 *        name: 'Bob',
 *        age: -10
 *      };
 *      const clara = {
 *        name: 'clara',
 *        age: 314.159
 *      };
 *      const people = [clara, bob, alice];
 *      sortByNameCaseInsensitive(people); //=> [alice, bob, clara]
 */


var sortBy = /*#__PURE__*/_curry2(function sortBy(fn, list) {
  return Array.prototype.slice.call(list, 0).sort(function (a, b) {
    var aa = fn(a);
    var bb = fn(b);
    return aa < bb ? -1 : aa > bb ? 1 : 0;
  });
});
module.exports = sortBy;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sortWith.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Sorts a list according to a list of comparators.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Relation
 * @sig [(a, a) -> Number] -> [a] -> [a]
 * @param {Array} functions A list of comparator functions.
 * @param {Array} list The list to sort.
 * @return {Array} A new list sorted according to the comarator functions.
 * @example
 *
 *      const alice = {
 *        name: 'alice',
 *        age: 40
 *      };
 *      const bob = {
 *        name: 'bob',
 *        age: 30
 *      };
 *      const clara = {
 *        name: 'clara',
 *        age: 40
 *      };
 *      const people = [clara, bob, alice];
 *      const ageNameSort = R.sortWith([
 *        R.descend(R.prop('age')),
 *        R.ascend(R.prop('name'))
 *      ]);
 *      ageNameSort(people); //=> [alice, clara, bob]
 */


var sortWith = /*#__PURE__*/_curry2(function sortWith(fns, list) {
  return Array.prototype.slice.call(list, 0).sort(function (a, b) {
    var result = 0;
    var i = 0;
    while (result === 0 && i < fns.length) {
      result = fns[i](a, b);
      i += 1;
    }
    return result;
  });
});
module.exports = sortWith;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/split.js":[function(require,module,exports){
var invoker = /*#__PURE__*/require('./invoker');

/**
 * Splits a string into an array of strings based on the given
 * separator.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category String
 * @sig (String | RegExp) -> String -> [String]
 * @param {String|RegExp} sep The pattern.
 * @param {String} str The string to separate into an array.
 * @return {Array} The array of strings from `str` separated by `str`.
 * @see R.join
 * @example
 *
 *      const pathComponents = R.split('/');
 *      R.tail(pathComponents('/usr/local/bin/node')); //=> ['usr', 'local', 'bin', 'node']
 *
 *      R.split('.', 'a.b.c.xyz.d'); //=> ['a', 'b', 'c', 'xyz', 'd']
 */


var split = /*#__PURE__*/invoker(1, 'split');
module.exports = split;
},{"./invoker":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/invoker.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/splitAt.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var length = /*#__PURE__*/require('./length');

var slice = /*#__PURE__*/require('./slice');

/**
 * Splits a given list or string at a given index.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig Number -> [a] -> [[a], [a]]
 * @sig Number -> String -> [String, String]
 * @param {Number} index The index where the array/string is split.
 * @param {Array|String} array The array/string to be split.
 * @return {Array}
 * @example
 *
 *      R.splitAt(1, [1, 2, 3]);          //=> [[1], [2, 3]]
 *      R.splitAt(5, 'hello world');      //=> ['hello', ' world']
 *      R.splitAt(-1, 'foobar');          //=> ['fooba', 'r']
 */


var splitAt = /*#__PURE__*/_curry2(function splitAt(index, array) {
  return [slice(0, index, array), slice(index, length(array), array)];
});
module.exports = splitAt;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./length":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/length.js","./slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/splitEvery.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var slice = /*#__PURE__*/require('./slice');

/**
 * Splits a collection into slices of the specified length.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig Number -> [a] -> [[a]]
 * @sig Number -> String -> [String]
 * @param {Number} n
 * @param {Array} list
 * @return {Array}
 * @example
 *
 *      R.splitEvery(3, [1, 2, 3, 4, 5, 6, 7]); //=> [[1, 2, 3], [4, 5, 6], [7]]
 *      R.splitEvery(3, 'foobarbaz'); //=> ['foo', 'bar', 'baz']
 */


var splitEvery = /*#__PURE__*/_curry2(function splitEvery(n, list) {
  if (n <= 0) {
    throw new Error('First argument to splitEvery must be a positive integer');
  }
  var result = [];
  var idx = 0;
  while (idx < list.length) {
    result.push(slice(idx, idx += n, list));
  }
  return result;
});
module.exports = splitEvery;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/splitWhen.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Takes a list and a predicate and returns a pair of lists with the following properties:
 *
 *  - the result of concatenating the two output lists is equivalent to the input list;
 *  - none of the elements of the first output list satisfies the predicate; and
 *  - if the second output list is non-empty, its first element satisfies the predicate.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [[a], [a]]
 * @param {Function} pred The predicate that determines where the array is split.
 * @param {Array} list The array to be split.
 * @return {Array}
 * @example
 *
 *      R.splitWhen(R.equals(2), [1, 2, 3, 1, 2, 3]);   //=> [[1], [2, 3, 1, 2, 3]]
 */


var splitWhen = /*#__PURE__*/_curry2(function splitWhen(pred, list) {
  var idx = 0;
  var len = list.length;
  var prefix = [];

  while (idx < len && !pred(list[idx])) {
    prefix.push(list[idx]);
    idx += 1;
  }

  return [prefix, Array.prototype.slice.call(list, idx)];
});
module.exports = splitWhen;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/startsWith.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var equals = /*#__PURE__*/require('./equals');

var take = /*#__PURE__*/require('./take');

/**
 * Checks if a list starts with the provided sublist.
 *
 * Similarly, checks if a string starts with the provided substring.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category List
 * @sig [a] -> [a] -> Boolean
 * @sig String -> String -> Boolean
 * @param {*} prefix
 * @param {*} list
 * @return {Boolean}
 * @see R.endsWith
 * @example
 *
 *      R.startsWith('a', 'abc')                //=> true
 *      R.startsWith('b', 'abc')                //=> false
 *      R.startsWith(['a'], ['a', 'b', 'c'])    //=> true
 *      R.startsWith(['b'], ['a', 'b', 'c'])    //=> false
 */


var startsWith = /*#__PURE__*/_curry2(function (prefix, list) {
  return equals(take(prefix.length, list), prefix);
});
module.exports = startsWith;
},{"./equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./take":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/take.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/subtract.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Subtracts its second argument from its first argument.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The first value.
 * @param {Number} b The second value.
 * @return {Number} The result of `a - b`.
 * @see R.add
 * @example
 *
 *      R.subtract(10, 8); //=> 2
 *
 *      const minus5 = R.subtract(R.__, 5);
 *      minus5(17); //=> 12
 *
 *      const complementaryAngle = R.subtract(90);
 *      complementaryAngle(30); //=> 60
 *      complementaryAngle(72); //=> 18
 */


var subtract = /*#__PURE__*/_curry2(function subtract(a, b) {
  return Number(a) - Number(b);
});
module.exports = subtract;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sum.js":[function(require,module,exports){
var add = /*#__PURE__*/require('./add');

var reduce = /*#__PURE__*/require('./reduce');

/**
 * Adds together all the elements of a list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list An array of numbers
 * @return {Number} The sum of all the numbers in the list.
 * @see R.reduce
 * @example
 *
 *      R.sum([2,4,6,8,100,1]); //=> 121
 */


var sum = /*#__PURE__*/reduce(add, 0);
module.exports = sum;
},{"./add":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/add.js","./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/symmetricDifference.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var concat = /*#__PURE__*/require('./concat');

var difference = /*#__PURE__*/require('./difference');

/**
 * Finds the set (i.e. no duplicates) of all elements contained in the first or
 * second list, but not both.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` or `list2`, but not both.
 * @see R.symmetricDifferenceWith, R.difference, R.differenceWith
 * @example
 *
 *      R.symmetricDifference([1,2,3,4], [7,6,5,4,3]); //=> [1,2,7,6,5]
 *      R.symmetricDifference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5,1,2]
 */


var symmetricDifference = /*#__PURE__*/_curry2(function symmetricDifference(list1, list2) {
  return concat(difference(list1, list2), difference(list2, list1));
});
module.exports = symmetricDifference;
},{"./concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/concat.js","./difference":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/difference.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/symmetricDifferenceWith.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var concat = /*#__PURE__*/require('./concat');

var differenceWith = /*#__PURE__*/require('./differenceWith');

/**
 * Finds the set (i.e. no duplicates) of all elements contained in the first or
 * second list, but not both. Duplication is determined according to the value
 * returned by applying the supplied predicate to two list elements.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Relation
 * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` or `list2`, but not both.
 * @see R.symmetricDifference, R.difference, R.differenceWith
 * @example
 *
 *      const eqA = R.eqBy(R.prop('a'));
 *      const l1 = [{a: 1}, {a: 2}, {a: 3}, {a: 4}];
 *      const l2 = [{a: 3}, {a: 4}, {a: 5}, {a: 6}];
 *      R.symmetricDifferenceWith(eqA, l1, l2); //=> [{a: 1}, {a: 2}, {a: 5}, {a: 6}]
 */


var symmetricDifferenceWith = /*#__PURE__*/_curry3(function symmetricDifferenceWith(pred, list1, list2) {
  return concat(differenceWith(pred, list1, list2), differenceWith(pred, list2, list1));
});
module.exports = symmetricDifferenceWith;
},{"./concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/concat.js","./differenceWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/differenceWith.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/tail.js":[function(require,module,exports){
var _checkForMethod = /*#__PURE__*/require('./internal/_checkForMethod');

var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var slice = /*#__PURE__*/require('./slice');

/**
 * Returns all but the first element of the given list or string (or object
 * with a `tail` method).
 *
 * Dispatches to the `slice` method of the first argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a]
 * @sig String -> String
 * @param {*} list
 * @return {*}
 * @see R.head, R.init, R.last
 * @example
 *
 *      R.tail([1, 2, 3]);  //=> [2, 3]
 *      R.tail([1, 2]);     //=> [2]
 *      R.tail([1]);        //=> []
 *      R.tail([]);         //=> []
 *
 *      R.tail('abc');  //=> 'bc'
 *      R.tail('ab');   //=> 'b'
 *      R.tail('a');    //=> ''
 *      R.tail('');     //=> ''
 */


var tail = /*#__PURE__*/_curry1( /*#__PURE__*/_checkForMethod('tail', /*#__PURE__*/slice(1, Infinity)));
module.exports = tail;
},{"./internal/_checkForMethod":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_checkForMethod.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/take.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xtake = /*#__PURE__*/require('./internal/_xtake');

var slice = /*#__PURE__*/require('./slice');

/**
 * Returns the first `n` elements of the given list, string, or
 * transducer/transformer (or object with a `take` method).
 *
 * Dispatches to the `take` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n
 * @param {*} list
 * @return {*}
 * @see R.drop
 * @example
 *
 *      R.take(1, ['foo', 'bar', 'baz']); //=> ['foo']
 *      R.take(2, ['foo', 'bar', 'baz']); //=> ['foo', 'bar']
 *      R.take(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.take(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.take(3, 'ramda');               //=> 'ram'
 *
 *      const personnel = [
 *        'Dave Brubeck',
 *        'Paul Desmond',
 *        'Eugene Wright',
 *        'Joe Morello',
 *        'Gerry Mulligan',
 *        'Bob Bates',
 *        'Joe Dodge',
 *        'Ron Crotty'
 *      ];
 *
 *      const takeFive = R.take(5);
 *      takeFive(personnel);
 *      //=> ['Dave Brubeck', 'Paul Desmond', 'Eugene Wright', 'Joe Morello', 'Gerry Mulligan']
 * @symb R.take(-1, [a, b]) = [a, b]
 * @symb R.take(0, [a, b]) = []
 * @symb R.take(1, [a, b]) = [a]
 * @symb R.take(2, [a, b]) = [a, b]
 */


var take = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['take'], _xtake, function take(n, xs) {
  return slice(0, n < 0 ? Infinity : n, xs);
}));
module.exports = take;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xtake":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xtake.js","./slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/takeLast.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var drop = /*#__PURE__*/require('./drop');

/**
 * Returns a new list containing the last `n` elements of the given list.
 * If `n > list.length`, returns a list of `list.length` elements.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n The number of elements to return.
 * @param {Array} xs The collection to consider.
 * @return {Array}
 * @see R.dropLast
 * @example
 *
 *      R.takeLast(1, ['foo', 'bar', 'baz']); //=> ['baz']
 *      R.takeLast(2, ['foo', 'bar', 'baz']); //=> ['bar', 'baz']
 *      R.takeLast(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.takeLast(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.takeLast(3, 'ramda');               //=> 'mda'
 */


var takeLast = /*#__PURE__*/_curry2(function takeLast(n, xs) {
  return drop(n >= 0 ? xs.length - n : 0, xs);
});
module.exports = takeLast;
},{"./drop":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/drop.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/takeLastWhile.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var slice = /*#__PURE__*/require('./slice');

/**
 * Returns a new list containing the last `n` elements of a given list, passing
 * each value to the supplied predicate function, and terminating when the
 * predicate function returns `false`. Excludes the element that caused the
 * predicate function to fail. The predicate function is passed one argument:
 * *(value)*.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} fn The function called per iteration.
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array.
 * @see R.dropLastWhile, R.addIndex
 * @example
 *
 *      const isNotOne = x => x !== 1;
 *
 *      R.takeLastWhile(isNotOne, [1, 2, 3, 4]); //=> [2, 3, 4]
 *
 *      R.takeLastWhile(x => x !== 'R' , 'Ramda'); //=> 'amda'
 */


var takeLastWhile = /*#__PURE__*/_curry2(function takeLastWhile(fn, xs) {
  var idx = xs.length - 1;
  while (idx >= 0 && fn(xs[idx])) {
    idx -= 1;
  }
  return slice(idx + 1, Infinity, xs);
});
module.exports = takeLastWhile;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/takeWhile.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xtakeWhile = /*#__PURE__*/require('./internal/_xtakeWhile');

var slice = /*#__PURE__*/require('./slice');

/**
 * Returns a new list containing the first `n` elements of a given list,
 * passing each value to the supplied predicate function, and terminating when
 * the predicate function returns `false`. Excludes the element that caused the
 * predicate function to fail. The predicate function is passed one argument:
 * *(value)*.
 *
 * Dispatches to the `takeWhile` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} fn The function called per iteration.
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array.
 * @see R.dropWhile, R.transduce, R.addIndex
 * @example
 *
 *      const isNotFour = x => x !== 4;
 *
 *      R.takeWhile(isNotFour, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3]
 *
 *      R.takeWhile(x => x !== 'd' , 'Ramda'); //=> 'Ram'
 */


var takeWhile = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['takeWhile'], _xtakeWhile, function takeWhile(fn, xs) {
  var idx = 0;
  var len = xs.length;
  while (idx < len && fn(xs[idx])) {
    idx += 1;
  }
  return slice(0, idx, xs);
}));
module.exports = takeWhile;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xtakeWhile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xtakeWhile.js","./slice":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/slice.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/tap.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _dispatchable = /*#__PURE__*/require('./internal/_dispatchable');

var _xtap = /*#__PURE__*/require('./internal/_xtap');

/**
 * Runs the given function with the supplied object, then returns the object.
 *
 * Acts as a transducer if a transformer is given as second parameter.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (a -> *) -> a -> a
 * @param {Function} fn The function to call with `x`. The return value of `fn` will be thrown away.
 * @param {*} x
 * @return {*} `x`.
 * @example
 *
 *      const sayX = x => console.log('x is ' + x);
 *      R.tap(sayX, 100); //=> 100
 *      // logs 'x is 100'
 * @symb R.tap(f, a) = a
 */


var tap = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable([], _xtap, function tap(fn, x) {
  fn(x);
  return x;
}));
module.exports = tap;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_dispatchable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_dispatchable.js","./internal/_xtap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xtap.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/test.js":[function(require,module,exports){
var _cloneRegExp = /*#__PURE__*/require('./internal/_cloneRegExp');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _isRegExp = /*#__PURE__*/require('./internal/_isRegExp');

var toString = /*#__PURE__*/require('./toString');

/**
 * Determines whether a given string matches a given regular expression.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category String
 * @sig RegExp -> String -> Boolean
 * @param {RegExp} pattern
 * @param {String} str
 * @return {Boolean}
 * @see R.match
 * @example
 *
 *      R.test(/^x/, 'xyz'); //=> true
 *      R.test(/^y/, 'xyz'); //=> false
 */


var test = /*#__PURE__*/_curry2(function test(pattern, str) {
  if (!_isRegExp(pattern)) {
    throw new TypeError('‘test’ requires a value of type RegExp as its first argument; received ' + toString(pattern));
  }
  return _cloneRegExp(pattern).test(str);
});
module.exports = test;
},{"./internal/_cloneRegExp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_cloneRegExp.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_isRegExp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_isRegExp.js","./toString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toString.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/then.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _assertPromise = /*#__PURE__*/require('./internal/_assertPromise');

/**
 * Returns the result of applying the onSuccess function to the value inside
 * a successfully resolved promise. This is useful for working with promises
 * inside function compositions.
 *
 * @func
 * @memberOf R
 * @category Function
 * @sig (a -> b) -> (Promise e a) -> (Promise e b)
 * @sig (a -> (Promise e b)) -> (Promise e a) -> (Promise e b)
 * @param {Function} onSuccess The function to apply. Can return a value or a promise of a value.
 * @param {Promise} p
 * @return {Promise} The result of calling `p.then(onSuccess)`
 * @see R.otherwise
 * @example
 *
 *      var makeQuery = (email) => ({ query: { email }});
 *
 *      //getMemberName :: String -> Promise ({firstName, lastName})
 *      var getMemberName = R.pipe(
 *        makeQuery,
 *        fetchMember,
 *        R.then(R.pick(['firstName', 'lastName']))
 *      );
 */


var then = /*#__PURE__*/_curry2(function then(f, p) {
  _assertPromise('then', p);

  return p.then(f);
});
module.exports = then;
},{"./internal/_assertPromise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_assertPromise.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/thunkify.js":[function(require,module,exports){
var curryN = /*#__PURE__*/require('./curryN');

var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Creates a thunk out of a function. A thunk delays a calculation until
 * its result is needed, providing lazy evaluation of arguments.
 *
 * @func
 * @memberOf R
 * @category Function
 * @sig ((a, b, ..., j) -> k) -> (a, b, ..., j) -> (() -> k)
 * @param {Function} fn A function to wrap in a thunk
 * @return {Function} Expects arguments for `fn` and returns a new function
 *  that, when called, applies those arguments to `fn`.
 * @see R.partial, R.partialRight
 * @example
 *
 *      R.thunkify(R.identity)(42)(); //=> 42
 *      R.thunkify((a, b) => a + b)(25, 17)(); //=> 42
 */


var thunkify = /*#__PURE__*/_curry1(function thunkify(fn) {
  return curryN(fn.length, function createThunk() {
    var fnArgs = arguments;
    return function invokeThunk() {
      return fn.apply(this, fnArgs);
    };
  });
});

module.exports = thunkify;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/times.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Calls an input function `n` times, returning an array containing the results
 * of those function calls.
 *
 * `fn` is passed one argument: The current value of `n`, which begins at `0`
 * and is gradually incremented to `n - 1`.
 *
 * @func
 * @memberOf R
 * @since v0.2.3
 * @category List
 * @sig (Number -> a) -> Number -> [a]
 * @param {Function} fn The function to invoke. Passed one argument, the current value of `n`.
 * @param {Number} n A value between `0` and `n - 1`. Increments after each function call.
 * @return {Array} An array containing the return values of all calls to `fn`.
 * @see R.repeat
 * @example
 *
 *      R.times(R.identity, 5); //=> [0, 1, 2, 3, 4]
 * @symb R.times(f, 0) = []
 * @symb R.times(f, 1) = [f(0)]
 * @symb R.times(f, 2) = [f(0), f(1)]
 */


var times = /*#__PURE__*/_curry2(function times(fn, n) {
  var len = Number(n);
  var idx = 0;
  var list;

  if (len < 0 || isNaN(len)) {
    throw new RangeError('n must be a non-negative number');
  }
  list = new Array(len);
  while (idx < len) {
    list[idx] = fn(idx);
    idx += 1;
  }
  return list;
});
module.exports = times;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toLower.js":[function(require,module,exports){
var invoker = /*#__PURE__*/require('./invoker');

/**
 * The lower case version of a string.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category String
 * @sig String -> String
 * @param {String} str The string to lower case.
 * @return {String} The lower case version of `str`.
 * @see R.toUpper
 * @example
 *
 *      R.toLower('XYZ'); //=> 'xyz'
 */


var toLower = /*#__PURE__*/invoker(0, 'toLowerCase');
module.exports = toLower;
},{"./invoker":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/invoker.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toPairs.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _has = /*#__PURE__*/require('./internal/_has');

/**
 * Converts an object into an array of key, value arrays. Only the object's
 * own properties are used.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.4.0
 * @category Object
 * @sig {String: *} -> [[String,*]]
 * @param {Object} obj The object to extract from
 * @return {Array} An array of key, value arrays from the object's own properties.
 * @see R.fromPairs
 * @example
 *
 *      R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]]
 */


var toPairs = /*#__PURE__*/_curry1(function toPairs(obj) {
  var pairs = [];
  for (var prop in obj) {
    if (_has(prop, obj)) {
      pairs[pairs.length] = [prop, obj[prop]];
    }
  }
  return pairs;
});
module.exports = toPairs;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toPairsIn.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Converts an object into an array of key, value arrays. The object's own
 * properties and prototype properties are used. Note that the order of the
 * output array is not guaranteed to be consistent across different JS
 * platforms.
 *
 * @func
 * @memberOf R
 * @since v0.4.0
 * @category Object
 * @sig {String: *} -> [[String,*]]
 * @param {Object} obj The object to extract from
 * @return {Array} An array of key, value arrays from the object's own
 *         and prototype properties.
 * @example
 *
 *      const F = function() { this.x = 'X'; };
 *      F.prototype.y = 'Y';
 *      const f = new F();
 *      R.toPairsIn(f); //=> [['x','X'], ['y','Y']]
 */


var toPairsIn = /*#__PURE__*/_curry1(function toPairsIn(obj) {
  var pairs = [];
  for (var prop in obj) {
    pairs[pairs.length] = [prop, obj[prop]];
  }
  return pairs;
});
module.exports = toPairsIn;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toString.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var _toString = /*#__PURE__*/require('./internal/_toString');

/**
 * Returns the string representation of the given value. `eval`'ing the output
 * should result in a value equivalent to the input value. Many of the built-in
 * `toString` methods do not satisfy this requirement.
 *
 * If the given value is an `[object Object]` with a `toString` method other
 * than `Object.prototype.toString`, this method is invoked with no arguments
 * to produce the return value. This means user-defined constructor functions
 * can provide a suitable `toString` method. For example:
 *
 *     function Point(x, y) {
 *       this.x = x;
 *       this.y = y;
 *     }
 *
 *     Point.prototype.toString = function() {
 *       return 'new Point(' + this.x + ', ' + this.y + ')';
 *     };
 *
 *     R.toString(new Point(1, 2)); //=> 'new Point(1, 2)'
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category String
 * @sig * -> String
 * @param {*} val
 * @return {String}
 * @example
 *
 *      R.toString(42); //=> '42'
 *      R.toString('abc'); //=> '"abc"'
 *      R.toString([1, 2, 3]); //=> '[1, 2, 3]'
 *      R.toString({foo: 1, bar: 2, baz: 3}); //=> '{"bar": 2, "baz": 3, "foo": 1}'
 *      R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date("2001-02-03T04:05:06.000Z")'
 */


var toString = /*#__PURE__*/_curry1(function toString(val) {
  return _toString(val, []);
});
module.exports = toString;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./internal/_toString":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_toString.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/toUpper.js":[function(require,module,exports){
var invoker = /*#__PURE__*/require('./invoker');

/**
 * The upper case version of a string.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category String
 * @sig String -> String
 * @param {String} str The string to upper case.
 * @return {String} The upper case version of `str`.
 * @see R.toLower
 * @example
 *
 *      R.toUpper('abc'); //=> 'ABC'
 */


var toUpper = /*#__PURE__*/invoker(0, 'toUpperCase');
module.exports = toUpper;
},{"./invoker":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/invoker.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/transduce.js":[function(require,module,exports){
var _reduce = /*#__PURE__*/require('./internal/_reduce');

var _xwrap = /*#__PURE__*/require('./internal/_xwrap');

var curryN = /*#__PURE__*/require('./curryN');

/**
 * Initializes a transducer using supplied iterator function. Returns a single
 * item by iterating through the list, successively calling the transformed
 * iterator function and passing it an accumulator value and the current value
 * from the array, and then passing the result to the next call.
 *
 * The iterator function receives two values: *(acc, value)*. It will be
 * wrapped as a transformer to initialize the transducer. A transformer can be
 * passed directly in place of an iterator function. In both cases, iteration
 * may be stopped early with the [`R.reduced`](#reduced) function.
 *
 * A transducer is a function that accepts a transformer and returns a
 * transformer and can be composed directly.
 *
 * A transformer is an an object that provides a 2-arity reducing iterator
 * function, step, 0-arity initial value function, init, and 1-arity result
 * extraction function, result. The step function is used as the iterator
 * function in reduce. The result function is used to convert the final
 * accumulator into the return type and in most cases is
 * [`R.identity`](#identity). The init function can be used to provide an
 * initial accumulator, but is ignored by transduce.
 *
 * The iteration is performed with [`R.reduce`](#reduce) after initializing the transducer.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig (c -> c) -> ((a, b) -> a) -> a -> [b] -> a
 * @param {Function} xf The transducer function. Receives a transformer and returns a transformer.
 * @param {Function} fn The iterator function. Receives two values, the accumulator and the
 *        current element from the array. Wrapped as transformer, if necessary, and used to
 *        initialize the transducer
 * @param {*} acc The initial accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduce, R.reduced, R.into
 * @example
 *
 *      const numbers = [1, 2, 3, 4];
 *      const transducer = R.compose(R.map(R.add(1)), R.take(2));
 *      R.transduce(transducer, R.flip(R.append), [], numbers); //=> [2, 3]
 *
 *      const isOdd = (x) => x % 2 === 1;
 *      const firstOddTransducer = R.compose(R.filter(isOdd), R.take(1));
 *      R.transduce(firstOddTransducer, R.flip(R.append), [], R.range(0, 100)); //=> [1]
 */


var transduce = /*#__PURE__*/curryN(4, function transduce(xf, fn, acc, list) {
  return _reduce(xf(typeof fn === 'function' ? _xwrap(fn) : fn), acc, list);
});
module.exports = transduce;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_reduce.js","./internal/_xwrap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_xwrap.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/transpose.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Transposes the rows and columns of a 2D list.
 * When passed a list of `n` lists of length `x`,
 * returns a list of `x` lists of length `n`.
 *
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig [[a]] -> [[a]]
 * @param {Array} list A 2D list
 * @return {Array} A 2D list
 * @example
 *
 *      R.transpose([[1, 'a'], [2, 'b'], [3, 'c']]) //=> [[1, 2, 3], ['a', 'b', 'c']]
 *      R.transpose([[1, 2, 3], ['a', 'b', 'c']]) //=> [[1, 'a'], [2, 'b'], [3, 'c']]
 *
 *      // If some of the rows are shorter than the following rows, their elements are skipped:
 *      R.transpose([[10, 11], [20], [], [30, 31, 32]]) //=> [[10, 20, 30], [11, 31], [32]]
 * @symb R.transpose([[a], [b], [c]]) = [a, b, c]
 * @symb R.transpose([[a, b], [c, d]]) = [[a, c], [b, d]]
 * @symb R.transpose([[a, b], [c]]) = [[a, c], [b]]
 */


var transpose = /*#__PURE__*/_curry1(function transpose(outerlist) {
  var i = 0;
  var result = [];
  while (i < outerlist.length) {
    var innerlist = outerlist[i];
    var j = 0;
    while (j < innerlist.length) {
      if (typeof result[j] === 'undefined') {
        result[j] = [];
      }
      result[j].push(innerlist[j]);
      j += 1;
    }
    i += 1;
  }
  return result;
});
module.exports = transpose;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/traverse.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var map = /*#__PURE__*/require('./map');

var sequence = /*#__PURE__*/require('./sequence');

/**
 * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning
 * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable),
 * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative
 * into an Applicative of Traversable.
 *
 * Dispatches to the `traverse` method of the third argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig (Applicative f, Traversable t) => (a -> f a) -> (a -> f b) -> t a -> f (t b)
 * @param {Function} of
 * @param {Function} f
 * @param {*} traversable
 * @return {*}
 * @see R.sequence
 * @example
 *
 *      // Returns `Maybe.Nothing` if the given divisor is `0`
 *      const safeDiv = n => d => d === 0 ? Maybe.Nothing() : Maybe.Just(n / d)
 *
 *      R.traverse(Maybe.of, safeDiv(10), [2, 4, 5]); //=> Maybe.Just([5, 2.5, 2])
 *      R.traverse(Maybe.of, safeDiv(10), [2, 0, 5]); //=> Maybe.Nothing
 */


var traverse = /*#__PURE__*/_curry3(function traverse(of, f, traversable) {
  return typeof traversable['fantasy-land/traverse'] === 'function' ? traversable['fantasy-land/traverse'](f, of) : sequence(of, map(f, traversable));
});
module.exports = traverse;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js","./sequence":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/sequence.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/trim.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' + '\u2029\uFEFF';
var zeroWidth = '\u200b';
var hasProtoTrim = typeof String.prototype.trim === 'function';
/**
 * Removes (strips) whitespace from both ends of the string.
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category String
 * @sig String -> String
 * @param {String} str The string to trim.
 * @return {String} Trimmed version of `str`.
 * @example
 *
 *      R.trim('   xyz  '); //=> 'xyz'
 *      R.map(R.trim, R.split(',', 'x, y, z')); //=> ['x', 'y', 'z']
 */
var trim = !hasProtoTrim || /*#__PURE__*/ws.trim() || ! /*#__PURE__*/zeroWidth.trim() ? /*#__PURE__*/_curry1(function trim(str) {
  var beginRx = new RegExp('^[' + ws + '][' + ws + ']*');
  var endRx = new RegExp('[' + ws + '][' + ws + ']*$');
  return str.replace(beginRx, '').replace(endRx, '');
}) : /*#__PURE__*/_curry1(function trim(str) {
  return str.trim();
});
module.exports = trim;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/tryCatch.js":[function(require,module,exports){
var _arity = /*#__PURE__*/require('./internal/_arity');

var _concat = /*#__PURE__*/require('./internal/_concat');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * `tryCatch` takes two functions, a `tryer` and a `catcher`. The returned
 * function evaluates the `tryer`; if it does not throw, it simply returns the
 * result. If the `tryer` *does* throw, the returned function evaluates the
 * `catcher` function and returns its result. Note that for effective
 * composition with this function, both the `tryer` and `catcher` functions
 * must return the same type of results.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Function
 * @sig (...x -> a) -> ((e, ...x) -> a) -> (...x -> a)
 * @param {Function} tryer The function that may throw.
 * @param {Function} catcher The function that will be evaluated if `tryer` throws.
 * @return {Function} A new function that will catch exceptions and send then to the catcher.
 * @example
 *
 *      R.tryCatch(R.prop('x'), R.F)({x: true}); //=> true
 *      R.tryCatch(() => { throw 'foo'}, R.always('catched'))('bar') // => 'catched'
 *      R.tryCatch(R.times(R.identity), R.always([]))('s') // => []
 `` */


var tryCatch = /*#__PURE__*/_curry2(function _tryCatch(tryer, catcher) {
  return _arity(tryer.length, function () {
    try {
      return tryer.apply(this, arguments);
    } catch (e) {
      return catcher.apply(this, _concat([e], arguments));
    }
  });
});
module.exports = tryCatch;
},{"./internal/_arity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_arity.js","./internal/_concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/type.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Gives a single-word string description of the (native) type of a value,
 * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not
 * attempt to distinguish user Object types any further, reporting them all as
 * 'Object'.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Type
 * @sig (* -> {*}) -> String
 * @param {*} val The value to test
 * @return {String}
 * @example
 *
 *      R.type({}); //=> "Object"
 *      R.type(1); //=> "Number"
 *      R.type(false); //=> "Boolean"
 *      R.type('s'); //=> "String"
 *      R.type(null); //=> "Null"
 *      R.type([]); //=> "Array"
 *      R.type(/[A-z]/); //=> "RegExp"
 *      R.type(() => {}); //=> "Function"
 *      R.type(undefined); //=> "Undefined"
 */


var type = /*#__PURE__*/_curry1(function type(val) {
  return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1);
});
module.exports = type;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unapply.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Takes a function `fn`, which takes a single array argument, and returns a
 * function which:
 *
 *   - takes any number of positional arguments;
 *   - passes these arguments to `fn` as an array; and
 *   - returns the result.
 *
 * In other words, `R.unapply` derives a variadic function from a function which
 * takes an array. `R.unapply` is the inverse of [`R.apply`](#apply).
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Function
 * @sig ([*...] -> a) -> (*... -> a)
 * @param {Function} fn
 * @return {Function}
 * @see R.apply
 * @example
 *
 *      R.unapply(JSON.stringify)(1, 2, 3); //=> '[1,2,3]'
 * @symb R.unapply(f)(a, b) = f([a, b])
 */


var unapply = /*#__PURE__*/_curry1(function unapply(fn) {
  return function () {
    return fn(Array.prototype.slice.call(arguments, 0));
  };
});
module.exports = unapply;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unary.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var nAry = /*#__PURE__*/require('./nAry');

/**
 * Wraps a function of any arity (including nullary) in a function that accepts
 * exactly 1 parameter. Any extraneous parameters will not be passed to the
 * supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Function
 * @sig (* -> b) -> (a -> b)
 * @param {Function} fn The function to wrap.
 * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
 *         arity 1.
 * @see R.binary, R.nAry
 * @example
 *
 *      const takesTwoArgs = function(a, b) {
 *        return [a, b];
 *      };
 *      takesTwoArgs.length; //=> 2
 *      takesTwoArgs(1, 2); //=> [1, 2]
 *
 *      const takesOneArg = R.unary(takesTwoArgs);
 *      takesOneArg.length; //=> 1
 *      // Only 1 argument is passed to the wrapped function
 *      takesOneArg(1, 2); //=> [1, undefined]
 * @symb R.unary(f)(a, b, c) = f(a)
 */


var unary = /*#__PURE__*/_curry1(function unary(fn) {
  return nAry(1, fn);
});
module.exports = unary;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./nAry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/nAry.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uncurryN.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var curryN = /*#__PURE__*/require('./curryN');

/**
 * Returns a function of arity `n` from a (manually) curried function.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Function
 * @sig Number -> (a -> b) -> (a -> c)
 * @param {Number} length The arity for the returned function.
 * @param {Function} fn The function to uncurry.
 * @return {Function} A new function.
 * @see R.curry
 * @example
 *
 *      const addFour = a => b => c => d => a + b + c + d;
 *
 *      const uncurriedAddFour = R.uncurryN(4, addFour);
 *      uncurriedAddFour(1, 2, 3, 4); //=> 10
 */


var uncurryN = /*#__PURE__*/_curry2(function uncurryN(depth, fn) {
  return curryN(depth, function () {
    var currentDepth = 1;
    var value = fn;
    var idx = 0;
    var endIdx;
    while (currentDepth <= depth && typeof value === 'function') {
      endIdx = currentDepth === depth ? arguments.length : idx + value.length;
      value = value.apply(this, Array.prototype.slice.call(arguments, idx, endIdx));
      currentDepth += 1;
      idx = endIdx;
    }
    return value;
  });
});
module.exports = uncurryN;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unfold.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Builds a list from a seed value. Accepts an iterator function, which returns
 * either false to stop iteration or an array of length 2 containing the value
 * to add to the resulting list and the seed to be used in the next call to the
 * iterator function.
 *
 * The iterator function receives one argument: *(seed)*.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig (a -> [b]) -> * -> [b]
 * @param {Function} fn The iterator function. receives one argument, `seed`, and returns
 *        either false to quit iteration or an array of length two to proceed. The element
 *        at index 0 of this array will be added to the resulting array, and the element
 *        at index 1 will be passed to the next call to `fn`.
 * @param {*} seed The seed value.
 * @return {Array} The final list.
 * @example
 *
 *      const f = n => n > 50 ? false : [-n, n + 10];
 *      R.unfold(f, 10); //=> [-10, -20, -30, -40, -50]
 * @symb R.unfold(f, x) = [f(x)[0], f(f(x)[1])[0], f(f(f(x)[1])[1])[0], ...]
 */


var unfold = /*#__PURE__*/_curry2(function unfold(fn, seed) {
  var pair = fn(seed);
  var result = [];
  while (pair && pair.length) {
    result[result.length] = pair[0];
    pair = fn(pair[1]);
  }
  return result;
});
module.exports = unfold;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/union.js":[function(require,module,exports){
var _concat = /*#__PURE__*/require('./internal/_concat');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var compose = /*#__PURE__*/require('./compose');

var uniq = /*#__PURE__*/require('./uniq');

/**
 * Combines two lists into a set (i.e. no duplicates) composed of the elements
 * of each list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} as The first list.
 * @param {Array} bs The second list.
 * @return {Array} The first and second lists concatenated, with
 *         duplicates removed.
 * @example
 *
 *      R.union([1, 2, 3], [2, 3, 4]); //=> [1, 2, 3, 4]
 */


var union = /*#__PURE__*/_curry2( /*#__PURE__*/compose(uniq, _concat));
module.exports = union;
},{"./compose":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/compose.js","./internal/_concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./uniq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uniq.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unionWith.js":[function(require,module,exports){
var _concat = /*#__PURE__*/require('./internal/_concat');

var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var uniqWith = /*#__PURE__*/require('./uniqWith');

/**
 * Combines two lists into a set (i.e. no duplicates) composed of the elements
 * of each list. Duplication is determined according to the value returned by
 * applying the supplied predicate to two list elements.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig ((a, a) -> Boolean) -> [*] -> [*] -> [*]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The first and second lists concatenated, with
 *         duplicates removed.
 * @see R.union
 * @example
 *
 *      const l1 = [{a: 1}, {a: 2}];
 *      const l2 = [{a: 1}, {a: 4}];
 *      R.unionWith(R.eqBy(R.prop('a')), l1, l2); //=> [{a: 1}, {a: 2}, {a: 4}]
 */


var unionWith = /*#__PURE__*/_curry3(function unionWith(pred, list1, list2) {
  return uniqWith(pred, _concat(list1, list2));
});
module.exports = unionWith;
},{"./internal/_concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_concat.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js","./uniqWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uniqWith.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uniq.js":[function(require,module,exports){
var identity = /*#__PURE__*/require('./identity');

var uniqBy = /*#__PURE__*/require('./uniqBy');

/**
 * Returns a new list containing only one copy of each element in the original
 * list. [`R.equals`](#equals) is used to determine equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a]
 * @param {Array} list The array to consider.
 * @return {Array} The list of unique items.
 * @example
 *
 *      R.uniq([1, 1, 2, 1]); //=> [1, 2]
 *      R.uniq([1, '1']);     //=> [1, '1']
 *      R.uniq([[42], [42]]); //=> [[42]]
 */


var uniq = /*#__PURE__*/uniqBy(identity);
module.exports = uniq;
},{"./identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/identity.js","./uniqBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uniqBy.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uniqBy.js":[function(require,module,exports){
var _Set = /*#__PURE__*/require('./internal/_Set');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns a new list containing only one copy of each element in the original
 * list, based upon the value returned by applying the supplied function to
 * each list element. Prefers the first item if the supplied function produces
 * the same value on two items. [`R.equals`](#equals) is used for comparison.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig (a -> b) -> [a] -> [a]
 * @param {Function} fn A function used to produce a value to use during comparisons.
 * @param {Array} list The array to consider.
 * @return {Array} The list of unique items.
 * @example
 *
 *      R.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10]
 */


var uniqBy = /*#__PURE__*/_curry2(function uniqBy(fn, list) {
  var set = new _Set();
  var result = [];
  var idx = 0;
  var appliedItem, item;

  while (idx < list.length) {
    item = list[idx];
    appliedItem = fn(item);
    if (set.add(appliedItem)) {
      result.push(item);
    }
    idx += 1;
  }
  return result;
});
module.exports = uniqBy;
},{"./internal/_Set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_Set.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/uniqWith.js":[function(require,module,exports){
var _includesWith = /*#__PURE__*/require('./internal/_includesWith');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Returns a new list containing only one copy of each element in the original
 * list, based upon the value returned by applying the supplied predicate to
 * two list elements. Prefers the first item if two items compare equal based
 * on the predicate.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category List
 * @sig ((a, a) -> Boolean) -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list The array to consider.
 * @return {Array} The list of unique items.
 * @example
 *
 *      const strEq = R.eqBy(String);
 *      R.uniqWith(strEq)([1, '1', 2, 1]); //=> [1, 2]
 *      R.uniqWith(strEq)([{}, {}]);       //=> [{}]
 *      R.uniqWith(strEq)([1, '1', 1]);    //=> [1]
 *      R.uniqWith(strEq)(['1', 1, 1]);    //=> ['1']
 */


var uniqWith = /*#__PURE__*/_curry2(function uniqWith(pred, list) {
  var idx = 0;
  var len = list.length;
  var result = [];
  var item;
  while (idx < len) {
    item = list[idx];
    if (!_includesWith(pred, item, result)) {
      result[result.length] = item;
    }
    idx += 1;
  }
  return result;
});
module.exports = uniqWith;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_includesWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includesWith.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unless.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Tests the final argument by passing it to the given predicate function. If
 * the predicate is not satisfied, the function will return the result of
 * calling the `whenFalseFn` function with the same argument. If the predicate
 * is satisfied, the argument is returned as is.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Logic
 * @sig (a -> Boolean) -> (a -> a) -> a -> a
 * @param {Function} pred        A predicate function
 * @param {Function} whenFalseFn A function to invoke when the `pred` evaluates
 *                               to a falsy value.
 * @param {*}        x           An object to test with the `pred` function and
 *                               pass to `whenFalseFn` if necessary.
 * @return {*} Either `x` or the result of applying `x` to `whenFalseFn`.
 * @see R.ifElse, R.when, R.cond
 * @example
 *
 *      let safeInc = R.unless(R.isNil, R.inc);
 *      safeInc(null); //=> null
 *      safeInc(1); //=> 2
 */


var unless = /*#__PURE__*/_curry3(function unless(pred, whenFalseFn, x) {
  return pred(x) ? x : whenFalseFn(x);
});
module.exports = unless;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/unnest.js":[function(require,module,exports){
var _identity = /*#__PURE__*/require('./internal/_identity');

var chain = /*#__PURE__*/require('./chain');

/**
 * Shorthand for `R.chain(R.identity)`, which removes one level of nesting from
 * any [Chain](https://github.com/fantasyland/fantasy-land#chain).
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig Chain c => c (c a) -> c a
 * @param {*} list
 * @return {*}
 * @see R.flatten, R.chain
 * @example
 *
 *      R.unnest([1, [2], [[3]]]); //=> [1, 2, [3]]
 *      R.unnest([[1, 2], [3, 4], [5, 6]]); //=> [1, 2, 3, 4, 5, 6]
 */


var unnest = /*#__PURE__*/chain(_identity);
module.exports = unnest;
},{"./chain":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/chain.js","./internal/_identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_identity.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/until.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Takes a predicate, a transformation function, and an initial value,
 * and returns a value of the same type as the initial value.
 * It does so by applying the transformation until the predicate is satisfied,
 * at which point it returns the satisfactory value.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Logic
 * @sig (a -> Boolean) -> (a -> a) -> a -> a
 * @param {Function} pred A predicate function
 * @param {Function} fn The iterator function
 * @param {*} init Initial value
 * @return {*} Final value that satisfies predicate
 * @example
 *
 *      R.until(R.gt(R.__, 100), R.multiply(2))(1) // => 128
 */


var until = /*#__PURE__*/_curry3(function until(pred, fn, init) {
  var val = init;
  while (!pred(val)) {
    val = fn(val);
  }
  return val;
});
module.exports = until;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/update.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

var adjust = /*#__PURE__*/require('./adjust');

var always = /*#__PURE__*/require('./always');

/**
 * Returns a new copy of the array with the element at the provided index
 * replaced with the given value.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig Number -> a -> [a] -> [a]
 * @param {Number} idx The index to update.
 * @param {*} x The value to exist at the given index of the returned array.
 * @param {Array|Arguments} list The source array-like object to be updated.
 * @return {Array} A copy of `list` with the value at index `idx` replaced with `x`.
 * @see R.adjust
 * @example
 *
 *      R.update(1, '_', ['a', 'b', 'c']);      //=> ['a', '_', 'c']
 *      R.update(-1, '_', ['a', 'b', 'c']);     //=> ['a', 'b', '_']
 * @symb R.update(-1, a, [b, c]) = [b, a]
 * @symb R.update(0, a, [b, c]) = [a, c]
 * @symb R.update(1, a, [b, c]) = [b, a]
 */


var update = /*#__PURE__*/_curry3(function update(idx, x, list) {
  return adjust(idx, always(x), list);
});
module.exports = update;
},{"./adjust":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/adjust.js","./always":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/always.js","./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/useWith.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var curryN = /*#__PURE__*/require('./curryN');

/**
 * Accepts a function `fn` and a list of transformer functions and returns a
 * new curried function. When the new function is invoked, it calls the
 * function `fn` with parameters consisting of the result of calling each
 * supplied handler on successive arguments to the new function.
 *
 * If more arguments are passed to the returned function than transformer
 * functions, those arguments are passed directly to `fn` as additional
 * parameters. If you expect additional arguments that don't need to be
 * transformed, although you can ignore them, it's best to pass an identity
 * function so that the new function reports the correct arity.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((x1, x2, ...) -> z) -> [(a -> x1), (b -> x2), ...] -> (a -> b -> ... -> z)
 * @param {Function} fn The function to wrap.
 * @param {Array} transformers A list of transformer functions
 * @return {Function} The wrapped function.
 * @see R.converge
 * @example
 *
 *      R.useWith(Math.pow, [R.identity, R.identity])(3, 4); //=> 81
 *      R.useWith(Math.pow, [R.identity, R.identity])(3)(4); //=> 81
 *      R.useWith(Math.pow, [R.dec, R.inc])(3, 4); //=> 32
 *      R.useWith(Math.pow, [R.dec, R.inc])(3)(4); //=> 32
 * @symb R.useWith(f, [g, h])(a, b) = f(g(a), h(b))
 */


var useWith = /*#__PURE__*/_curry2(function useWith(fn, transformers) {
  return curryN(transformers.length, function () {
    var args = [];
    var idx = 0;
    while (idx < transformers.length) {
      args.push(transformers[idx].call(this, arguments[idx]));
      idx += 1;
    }
    return fn.apply(this, args.concat(Array.prototype.slice.call(arguments, transformers.length)));
  });
});
module.exports = useWith;
},{"./curryN":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/curryN.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/values.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

var keys = /*#__PURE__*/require('./keys');

/**
 * Returns a list of all the enumerable own properties of the supplied object.
 * Note that the order of the output array is not guaranteed across different
 * JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig {k: v} -> [v]
 * @param {Object} obj The object to extract values from
 * @return {Array} An array of the values of the object's own properties.
 * @see R.valuesIn, R.keys
 * @example
 *
 *      R.values({a: 1, b: 2, c: 3}); //=> [1, 2, 3]
 */


var values = /*#__PURE__*/_curry1(function values(obj) {
  var props = keys(obj);
  var len = props.length;
  var vals = [];
  var idx = 0;
  while (idx < len) {
    vals[idx] = obj[props[idx]];
    idx += 1;
  }
  return vals;
});
module.exports = values;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js","./keys":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/keys.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/valuesIn.js":[function(require,module,exports){
var _curry1 = /*#__PURE__*/require('./internal/_curry1');

/**
 * Returns a list of all the properties, including prototype properties, of the
 * supplied object.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Object
 * @sig {k: v} -> [v]
 * @param {Object} obj The object to extract values from
 * @return {Array} An array of the values of the object's own and prototype properties.
 * @see R.values, R.keysIn
 * @example
 *
 *      const F = function() { this.x = 'X'; };
 *      F.prototype.y = 'Y';
 *      const f = new F();
 *      R.valuesIn(f); //=> ['X', 'Y']
 */


var valuesIn = /*#__PURE__*/_curry1(function valuesIn(obj) {
  var prop;
  var vs = [];
  for (prop in obj) {
    vs[vs.length] = obj[prop];
  }
  return vs;
});
module.exports = valuesIn;
},{"./internal/_curry1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry1.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/view.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

// `Const` is a functor that effectively ignores the function given to `map`.


var Const = function (x) {
  return { value: x, 'fantasy-land/map': function () {
      return this;
    } };
};

/**
 * Returns a "view" of the given data structure, determined by the given lens.
 * The lens's focus determines which portion of the data structure is visible.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Lens s a -> s -> a
 * @param {Lens} lens
 * @param {*} x
 * @return {*}
 * @see R.prop, R.lensIndex, R.lensProp
 * @example
 *
 *      const xLens = R.lensProp('x');
 *
 *      R.view(xLens, {x: 1, y: 2});  //=> 1
 *      R.view(xLens, {x: 4, y: 2});  //=> 4
 */
var view = /*#__PURE__*/_curry2(function view(lens, x) {
  // Using `Const` effectively ignores the setter function of the `lens`,
  // leaving the value returned by the getter function unmodified.
  return lens(Const)(x).value;
});
module.exports = view;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/when.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Tests the final argument by passing it to the given predicate function. If
 * the predicate is satisfied, the function will return the result of calling
 * the `whenTrueFn` function with the same argument. If the predicate is not
 * satisfied, the argument is returned as is.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Logic
 * @sig (a -> Boolean) -> (a -> a) -> a -> a
 * @param {Function} pred       A predicate function
 * @param {Function} whenTrueFn A function to invoke when the `condition`
 *                              evaluates to a truthy value.
 * @param {*}        x          An object to test with the `pred` function and
 *                              pass to `whenTrueFn` if necessary.
 * @return {*} Either `x` or the result of applying `x` to `whenTrueFn`.
 * @see R.ifElse, R.unless, R.cond
 * @example
 *
 *      // truncate :: String -> String
 *      const truncate = R.when(
 *        R.propSatisfies(R.gt(R.__, 10), 'length'),
 *        R.pipe(R.take(10), R.append('…'), R.join(''))
 *      );
 *      truncate('12345');         //=> '12345'
 *      truncate('0123456789ABC'); //=> '0123456789…'
 */


var when = /*#__PURE__*/_curry3(function when(pred, whenTrueFn, x) {
  return pred(x) ? whenTrueFn(x) : x;
});
module.exports = when;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/where.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var _has = /*#__PURE__*/require('./internal/_has');

/**
 * Takes a spec object and a test object; returns true if the test satisfies
 * the spec. Each of the spec's own properties must be a predicate function.
 * Each predicate is applied to the value of the corresponding property of the
 * test object. `where` returns true if all the predicates return true, false
 * otherwise.
 *
 * `where` is well suited to declaratively expressing constraints for other
 * functions such as [`filter`](#filter) and [`find`](#find).
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category Object
 * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean
 * @param {Object} spec
 * @param {Object} testObj
 * @return {Boolean}
 * @see R.propSatisfies, R.whereEq
 * @example
 *
 *      // pred :: Object -> Boolean
 *      const pred = R.where({
 *        a: R.equals('foo'),
 *        b: R.complement(R.equals('bar')),
 *        x: R.gt(R.__, 10),
 *        y: R.lt(R.__, 20)
 *      });
 *
 *      pred({a: 'foo', b: 'xxx', x: 11, y: 19}); //=> true
 *      pred({a: 'xxx', b: 'xxx', x: 11, y: 19}); //=> false
 *      pred({a: 'foo', b: 'bar', x: 11, y: 19}); //=> false
 *      pred({a: 'foo', b: 'xxx', x: 10, y: 19}); //=> false
 *      pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> false
 */


var where = /*#__PURE__*/_curry2(function where(spec, testObj) {
  for (var prop in spec) {
    if (_has(prop, spec) && !spec[prop](testObj[prop])) {
      return false;
    }
  }
  return true;
});
module.exports = where;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_has":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_has.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/whereEq.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var equals = /*#__PURE__*/require('./equals');

var map = /*#__PURE__*/require('./map');

var where = /*#__PURE__*/require('./where');

/**
 * Takes a spec object and a test object; returns true if the test satisfies
 * the spec, false otherwise. An object satisfies the spec if, for each of the
 * spec's own properties, accessing that property of the object gives the same
 * value (in [`R.equals`](#equals) terms) as accessing that property of the
 * spec.
 *
 * `whereEq` is a specialization of [`where`](#where).
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Object
 * @sig {String: *} -> {String: *} -> Boolean
 * @param {Object} spec
 * @param {Object} testObj
 * @return {Boolean}
 * @see R.propEq, R.where
 * @example
 *
 *      // pred :: Object -> Boolean
 *      const pred = R.whereEq({a: 1, b: 2});
 *
 *      pred({a: 1});              //=> false
 *      pred({a: 1, b: 2});        //=> true
 *      pred({a: 1, b: 2, c: 3});  //=> true
 *      pred({a: 1, b: 1});        //=> false
 */


var whereEq = /*#__PURE__*/_curry2(function whereEq(spec, testObj) {
  return where(map(equals, spec), testObj);
});
module.exports = whereEq;
},{"./equals":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/equals.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/map.js","./where":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/where.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/without.js":[function(require,module,exports){
var _includes = /*#__PURE__*/require('./internal/_includes');

var _curry2 = /*#__PURE__*/require('./internal/_curry2');

var flip = /*#__PURE__*/require('./flip');

var reject = /*#__PURE__*/require('./reject');

/**
 * Returns a new list without values in the first argument.
 * [`R.equals`](#equals) is used to determine equality.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig [a] -> [a] -> [a]
 * @param {Array} list1 The values to be removed from `list2`.
 * @param {Array} list2 The array to remove values from.
 * @return {Array} The new array without values in `list1`.
 * @see R.transduce, R.difference, R.remove
 * @example
 *
 *      R.without([1, 2], [1, 2, 1, 3, 4]); //=> [3, 4]
 */


var without = /*#__PURE__*/_curry2(function (xs, list) {
  return reject(flip(_includes)(xs), list);
});
module.exports = without;
},{"./flip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/flip.js","./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js","./internal/_includes":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_includes.js","./reject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/reject.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/xprod.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Creates a new list out of the two supplied by creating each possible pair
 * from the lists.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [b] -> [[a,b]]
 * @param {Array} as The first list.
 * @param {Array} bs The second list.
 * @return {Array} The list made by combining each possible pair from
 *         `as` and `bs` into pairs (`[a, b]`).
 * @example
 *
 *      R.xprod([1, 2], ['a', 'b']); //=> [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']]
 * @symb R.xprod([a, b], [c, d]) = [[a, c], [a, d], [b, c], [b, d]]
 */


var xprod = /*#__PURE__*/_curry2(function xprod(a, b) {
  // = xprodWith(prepend); (takes about 3 times as long...)
  var idx = 0;
  var ilen = a.length;
  var j;
  var jlen = b.length;
  var result = [];
  while (idx < ilen) {
    j = 0;
    while (j < jlen) {
      result[result.length] = [a[idx], b[j]];
      j += 1;
    }
    idx += 1;
  }
  return result;
});
module.exports = xprod;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/zip.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Creates a new list out of the two supplied by pairing up equally-positioned
 * items from both lists. The returned list is truncated to the length of the
 * shorter of the two input lists.
 * Note: `zip` is equivalent to `zipWith(function(a, b) { return [a, b] })`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [b] -> [[a,b]]
 * @param {Array} list1 The first array to consider.
 * @param {Array} list2 The second array to consider.
 * @return {Array} The list made by pairing up same-indexed elements of `list1` and `list2`.
 * @example
 *
 *      R.zip([1, 2, 3], ['a', 'b', 'c']); //=> [[1, 'a'], [2, 'b'], [3, 'c']]
 * @symb R.zip([a, b, c], [d, e, f]) = [[a, d], [b, e], [c, f]]
 */


var zip = /*#__PURE__*/_curry2(function zip(a, b) {
  var rv = [];
  var idx = 0;
  var len = Math.min(a.length, b.length);
  while (idx < len) {
    rv[idx] = [a[idx], b[idx]];
    idx += 1;
  }
  return rv;
});
module.exports = zip;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/zipObj.js":[function(require,module,exports){
var _curry2 = /*#__PURE__*/require('./internal/_curry2');

/**
 * Creates a new object out of a list of keys and a list of values.
 * Key/value pairing is truncated to the length of the shorter of the two lists.
 * Note: `zipObj` is equivalent to `pipe(zip, fromPairs)`.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig [String] -> [*] -> {String: *}
 * @param {Array} keys The array that will be properties on the output object.
 * @param {Array} values The list of values on the output object.
 * @return {Object} The object made by pairing up same-indexed elements of `keys` and `values`.
 * @example
 *
 *      R.zipObj(['a', 'b', 'c'], [1, 2, 3]); //=> {a: 1, b: 2, c: 3}
 */


var zipObj = /*#__PURE__*/_curry2(function zipObj(keys, values) {
  var idx = 0;
  var len = Math.min(keys.length, values.length);
  var out = {};
  while (idx < len) {
    out[keys[idx]] = values[idx];
    idx += 1;
  }
  return out;
});
module.exports = zipObj;
},{"./internal/_curry2":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry2.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/zipWith.js":[function(require,module,exports){
var _curry3 = /*#__PURE__*/require('./internal/_curry3');

/**
 * Creates a new list out of the two supplied by applying the function to each
 * equally-positioned pair in the lists. The returned list is truncated to the
 * length of the shorter of the two input lists.
 *
 * @function
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, b) -> c) -> [a] -> [b] -> [c]
 * @param {Function} fn The function used to combine the two elements into one value.
 * @param {Array} list1 The first array to consider.
 * @param {Array} list2 The second array to consider.
 * @return {Array} The list made by combining same-indexed elements of `list1` and `list2`
 *         using `fn`.
 * @example
 *
 *      const f = (x, y) => {
 *        // ...
 *      };
 *      R.zipWith(f, [1, 2, 3], ['a', 'b', 'c']);
 *      //=> [f(1, 'a'), f(2, 'b'), f(3, 'c')]
 * @symb R.zipWith(fn, [a, b, c], [d, e, f]) = [fn(a, d), fn(b, e), fn(c, f)]
 */


var zipWith = /*#__PURE__*/_curry3(function zipWith(fn, a, b) {
  var rv = [];
  var idx = 0;
  var len = Math.min(a.length, b.length);
  while (idx < len) {
    rv[idx] = fn(a[idx], b[idx]);
    idx += 1;
  }
  return rv;
});
module.exports = zipWith;
},{"./internal/_curry3":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/ramda/src/internal/_curry3.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/duplex-browser.js":[function(require,module,exports){
module.exports = require('./lib/_stream_duplex.js');

},{"./lib/_stream_duplex.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_duplex.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_duplex.js":[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a duplex stream is just a stream that is both readable and writable.
// Since JS doesn't have multiple prototypal inheritance, this class
// prototypally inherits from Readable, and then parasitically from
// Writable.

'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

/*<replacement>*/
var objectKeys = Object.keys || function (obj) {
  var keys = [];
  for (var key in obj) {
    keys.push(key);
  }return keys;
};
/*</replacement>*/

module.exports = Duplex;

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

var Readable = require('./_stream_readable');
var Writable = require('./_stream_writable');

util.inherits(Duplex, Readable);

{
  // avoid scope creep, the keys array can then be collected
  var keys = objectKeys(Writable.prototype);
  for (var v = 0; v < keys.length; v++) {
    var method = keys[v];
    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
  }
}

function Duplex(options) {
  if (!(this instanceof Duplex)) return new Duplex(options);

  Readable.call(this, options);
  Writable.call(this, options);

  if (options && options.readable === false) this.readable = false;

  if (options && options.writable === false) this.writable = false;

  this.allowHalfOpen = true;
  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;

  this.once('end', onend);
}

Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function () {
    return this._writableState.highWaterMark;
  }
});

// the no-half-open enforcer
function onend() {
  // if we allow half-open state, or if the writable side ended,
  // then we're ok.
  if (this.allowHalfOpen || this._writableState.ended) return;

  // no more data can be written.
  // But allow more writes to happen in this tick.
  pna.nextTick(onEndNT, this);
}

function onEndNT(self) {
  self.end();
}

Object.defineProperty(Duplex.prototype, 'destroyed', {
  get: function () {
    if (this._readableState === undefined || this._writableState === undefined) {
      return false;
    }
    return this._readableState.destroyed && this._writableState.destroyed;
  },
  set: function (value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (this._readableState === undefined || this._writableState === undefined) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._readableState.destroyed = value;
    this._writableState.destroyed = value;
  }
});

Duplex.prototype._destroy = function (err, cb) {
  this.push(null);
  this.end();

  pna.nextTick(cb, err);
};
},{"./_stream_readable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_readable.js","./_stream_writable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_writable.js","core-util-is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-util-is/lib/util.js","inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/inherits/inherits_browser.js","process-nextick-args":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process-nextick-args/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_passthrough.js":[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a passthrough stream.
// basically just the most minimal sort of Transform stream.
// Every written chunk gets output as-is.

'use strict';

module.exports = PassThrough;

var Transform = require('./_stream_transform');

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

util.inherits(PassThrough, Transform);

function PassThrough(options) {
  if (!(this instanceof PassThrough)) return new PassThrough(options);

  Transform.call(this, options);
}

PassThrough.prototype._transform = function (chunk, encoding, cb) {
  cb(null, chunk);
};
},{"./_stream_transform":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_transform.js","core-util-is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-util-is/lib/util.js","inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/inherits/inherits_browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_readable.js":[function(require,module,exports){
(function (process,global){(function (){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

module.exports = Readable;

/*<replacement>*/
var isArray = require('isarray');
/*</replacement>*/

/*<replacement>*/
var Duplex;
/*</replacement>*/

Readable.ReadableState = ReadableState;

/*<replacement>*/
var EE = require('events').EventEmitter;

var EElistenerCount = function (emitter, type) {
  return emitter.listeners(type).length;
};
/*</replacement>*/

/*<replacement>*/
var Stream = require('./internal/streams/stream');
/*</replacement>*/

/*<replacement>*/

var Buffer = require('safe-buffer').Buffer;
var OurUint8Array = global.Uint8Array || function () {};
function _uint8ArrayToBuffer(chunk) {
  return Buffer.from(chunk);
}
function _isUint8Array(obj) {
  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}

/*</replacement>*/

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

/*<replacement>*/
var debugUtil = require('util');
var debug = void 0;
if (debugUtil && debugUtil.debuglog) {
  debug = debugUtil.debuglog('stream');
} else {
  debug = function () {};
}
/*</replacement>*/

var BufferList = require('./internal/streams/BufferList');
var destroyImpl = require('./internal/streams/destroy');
var StringDecoder;

util.inherits(Readable, Stream);

var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];

function prependListener(emitter, event, fn) {
  // Sadly this is not cacheable as some libraries bundle their own
  // event emitter implementation with them.
  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);

  // This is a hack to make sure that our error handler is attached before any
  // userland ones.  NEVER DO THIS. This is here only because this code needs
  // to continue to work with older versions of Node.js that do not include
  // the prependListener() method. The goal is to eventually remove this hack.
  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
}

function ReadableState(options, stream) {
  Duplex = Duplex || require('./_stream_duplex');

  options = options || {};

  // Duplex streams are both readable and writable, but share
  // the same options object.
  // However, some cases require setting options to different
  // values for the readable and the writable sides of the duplex stream.
  // These options can be provided separately as readableXXX and writableXXX.
  var isDuplex = stream instanceof Duplex;

  // object stream flag. Used to make read(n) ignore n and to
  // make all the buffer merging and length checks go away
  this.objectMode = !!options.objectMode;

  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;

  // the point at which it stops calling _read() to fill the buffer
  // Note: 0 is a valid value, means "don't call _read preemptively ever"
  var hwm = options.highWaterMark;
  var readableHwm = options.readableHighWaterMark;
  var defaultHwm = this.objectMode ? 16 : 16 * 1024;

  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;

  // cast to ints.
  this.highWaterMark = Math.floor(this.highWaterMark);

  // A linked list is used to store data chunks instead of an array because the
  // linked list can remove elements from the beginning faster than
  // array.shift()
  this.buffer = new BufferList();
  this.length = 0;
  this.pipes = null;
  this.pipesCount = 0;
  this.flowing = null;
  this.ended = false;
  this.endEmitted = false;
  this.reading = false;

  // a flag to be able to tell if the event 'readable'/'data' is emitted
  // immediately, or on a later tick.  We set this to true at first, because
  // any actions that shouldn't happen until "later" should generally also
  // not happen before the first read call.
  this.sync = true;

  // whenever we return null, then we set a flag to say
  // that we're awaiting a 'readable' event emission.
  this.needReadable = false;
  this.emittedReadable = false;
  this.readableListening = false;
  this.resumeScheduled = false;

  // has it been destroyed
  this.destroyed = false;

  // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.
  this.defaultEncoding = options.defaultEncoding || 'utf8';

  // the number of writers that are awaiting a drain event in .pipe()s
  this.awaitDrain = 0;

  // if true, a maybeReadMore has been scheduled
  this.readingMore = false;

  this.decoder = null;
  this.encoding = null;
  if (options.encoding) {
    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
    this.decoder = new StringDecoder(options.encoding);
    this.encoding = options.encoding;
  }
}

function Readable(options) {
  Duplex = Duplex || require('./_stream_duplex');

  if (!(this instanceof Readable)) return new Readable(options);

  this._readableState = new ReadableState(options, this);

  // legacy
  this.readable = true;

  if (options) {
    if (typeof options.read === 'function') this._read = options.read;

    if (typeof options.destroy === 'function') this._destroy = options.destroy;
  }

  Stream.call(this);
}

Object.defineProperty(Readable.prototype, 'destroyed', {
  get: function () {
    if (this._readableState === undefined) {
      return false;
    }
    return this._readableState.destroyed;
  },
  set: function (value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (!this._readableState) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._readableState.destroyed = value;
  }
});

Readable.prototype.destroy = destroyImpl.destroy;
Readable.prototype._undestroy = destroyImpl.undestroy;
Readable.prototype._destroy = function (err, cb) {
  this.push(null);
  cb(err);
};

// Manually shove something into the read() buffer.
// This returns true if the highWaterMark has not been hit yet,
// similar to how Writable.write() returns true if you should
// write() some more.
Readable.prototype.push = function (chunk, encoding) {
  var state = this._readableState;
  var skipChunkCheck;

  if (!state.objectMode) {
    if (typeof chunk === 'string') {
      encoding = encoding || state.defaultEncoding;
      if (encoding !== state.encoding) {
        chunk = Buffer.from(chunk, encoding);
        encoding = '';
      }
      skipChunkCheck = true;
    }
  } else {
    skipChunkCheck = true;
  }

  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
};

// Unshift should *always* be something directly out of read()
Readable.prototype.unshift = function (chunk) {
  return readableAddChunk(this, chunk, null, true, false);
};

function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
  var state = stream._readableState;
  if (chunk === null) {
    state.reading = false;
    onEofChunk(stream, state);
  } else {
    var er;
    if (!skipChunkCheck) er = chunkInvalid(state, chunk);
    if (er) {
      stream.emit('error', er);
    } else if (state.objectMode || chunk && chunk.length > 0) {
      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
        chunk = _uint8ArrayToBuffer(chunk);
      }

      if (addToFront) {
        if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
      } else if (state.ended) {
        stream.emit('error', new Error('stream.push() after EOF'));
      } else {
        state.reading = false;
        if (state.decoder && !encoding) {
          chunk = state.decoder.write(chunk);
          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
        } else {
          addChunk(stream, state, chunk, false);
        }
      }
    } else if (!addToFront) {
      state.reading = false;
    }
  }

  return needMoreData(state);
}

function addChunk(stream, state, chunk, addToFront) {
  if (state.flowing && state.length === 0 && !state.sync) {
    stream.emit('data', chunk);
    stream.read(0);
  } else {
    // update the buffer info.
    state.length += state.objectMode ? 1 : chunk.length;
    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);

    if (state.needReadable) emitReadable(stream);
  }
  maybeReadMore(stream, state);
}

function chunkInvalid(state, chunk) {
  var er;
  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
    er = new TypeError('Invalid non-string/buffer chunk');
  }
  return er;
}

// if it's past the high water mark, we can push in some more.
// Also, if we have no data yet, we can stand some
// more bytes.  This is to work around cases where hwm=0,
// such as the repl.  Also, if the push() triggered a
// readable event, and the user called read(largeNumber) such that
// needReadable was set, then we ought to push more, so that another
// 'readable' event will be triggered.
function needMoreData(state) {
  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
}

Readable.prototype.isPaused = function () {
  return this._readableState.flowing === false;
};

// backwards compatibility.
Readable.prototype.setEncoding = function (enc) {
  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
  this._readableState.decoder = new StringDecoder(enc);
  this._readableState.encoding = enc;
  return this;
};

// Don't raise the hwm > 8MB
var MAX_HWM = 0x800000;
function computeNewHighWaterMark(n) {
  if (n >= MAX_HWM) {
    n = MAX_HWM;
  } else {
    // Get the next highest power of 2 to prevent increasing hwm excessively in
    // tiny amounts
    n--;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    n++;
  }
  return n;
}

// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function howMuchToRead(n, state) {
  if (n <= 0 || state.length === 0 && state.ended) return 0;
  if (state.objectMode) return 1;
  if (n !== n) {
    // Only flow one buffer at a time
    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
  }
  // If we're asking for more than the current hwm, then raise the hwm.
  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
  if (n <= state.length) return n;
  // Don't have enough
  if (!state.ended) {
    state.needReadable = true;
    return 0;
  }
  return state.length;
}

// you can override either this method, or the async _read(n) below.
Readable.prototype.read = function (n) {
  debug('read', n);
  n = parseInt(n, 10);
  var state = this._readableState;
  var nOrig = n;

  if (n !== 0) state.emittedReadable = false;

  // if we're doing read(0) to trigger a readable event, but we
  // already have a bunch of data in the buffer, then just trigger
  // the 'readable' event and move on.
  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
    debug('read: emitReadable', state.length, state.ended);
    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
    return null;
  }

  n = howMuchToRead(n, state);

  // if we've ended, and we're now clear, then finish it up.
  if (n === 0 && state.ended) {
    if (state.length === 0) endReadable(this);
    return null;
  }

  // All the actual chunk generation logic needs to be
  // *below* the call to _read.  The reason is that in certain
  // synthetic stream cases, such as passthrough streams, _read
  // may be a completely synchronous operation which may change
  // the state of the read buffer, providing enough data when
  // before there was *not* enough.
  //
  // So, the steps are:
  // 1. Figure out what the state of things will be after we do
  // a read from the buffer.
  //
  // 2. If that resulting state will trigger a _read, then call _read.
  // Note that this may be asynchronous, or synchronous.  Yes, it is
  // deeply ugly to write APIs this way, but that still doesn't mean
  // that the Readable class should behave improperly, as streams are
  // designed to be sync/async agnostic.
  // Take note if the _read call is sync or async (ie, if the read call
  // has returned yet), so that we know whether or not it's safe to emit
  // 'readable' etc.
  //
  // 3. Actually pull the requested chunks out of the buffer and return.

  // if we need a readable event, then we need to do some reading.
  var doRead = state.needReadable;
  debug('need readable', doRead);

  // if we currently have less than the highWaterMark, then also read some
  if (state.length === 0 || state.length - n < state.highWaterMark) {
    doRead = true;
    debug('length less than watermark', doRead);
  }

  // however, if we've ended, then there's no point, and if we're already
  // reading, then it's unnecessary.
  if (state.ended || state.reading) {
    doRead = false;
    debug('reading or ended', doRead);
  } else if (doRead) {
    debug('do read');
    state.reading = true;
    state.sync = true;
    // if the length is currently zero, then we *need* a readable event.
    if (state.length === 0) state.needReadable = true;
    // call internal read method
    this._read(state.highWaterMark);
    state.sync = false;
    // If _read pushed data synchronously, then `reading` will be false,
    // and we need to re-evaluate how much data we can return to the user.
    if (!state.reading) n = howMuchToRead(nOrig, state);
  }

  var ret;
  if (n > 0) ret = fromList(n, state);else ret = null;

  if (ret === null) {
    state.needReadable = true;
    n = 0;
  } else {
    state.length -= n;
  }

  if (state.length === 0) {
    // If we have nothing in the buffer, then we want to know
    // as soon as we *do* get something into the buffer.
    if (!state.ended) state.needReadable = true;

    // If we tried to read() past the EOF, then emit end on the next tick.
    if (nOrig !== n && state.ended) endReadable(this);
  }

  if (ret !== null) this.emit('data', ret);

  return ret;
};

function onEofChunk(stream, state) {
  if (state.ended) return;
  if (state.decoder) {
    var chunk = state.decoder.end();
    if (chunk && chunk.length) {
      state.buffer.push(chunk);
      state.length += state.objectMode ? 1 : chunk.length;
    }
  }
  state.ended = true;

  // emit 'readable' now to make sure it gets picked up.
  emitReadable(stream);
}

// Don't emit readable right away in sync mode, because this can trigger
// another read() call => stack overflow.  This way, it might trigger
// a nextTick recursion warning, but that's not so bad.
function emitReadable(stream) {
  var state = stream._readableState;
  state.needReadable = false;
  if (!state.emittedReadable) {
    debug('emitReadable', state.flowing);
    state.emittedReadable = true;
    if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
  }
}

function emitReadable_(stream) {
  debug('emit readable');
  stream.emit('readable');
  flow(stream);
}

// at this point, the user has presumably seen the 'readable' event,
// and called read() to consume some data.  that may have triggered
// in turn another _read(n) call, in which case reading = true if
// it's in progress.
// However, if we're not ended, or reading, and the length < hwm,
// then go ahead and try to read some more preemptively.
function maybeReadMore(stream, state) {
  if (!state.readingMore) {
    state.readingMore = true;
    pna.nextTick(maybeReadMore_, stream, state);
  }
}

function maybeReadMore_(stream, state) {
  var len = state.length;
  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
    debug('maybeReadMore read 0');
    stream.read(0);
    if (len === state.length)
      // didn't get any data, stop spinning.
      break;else len = state.length;
  }
  state.readingMore = false;
}

// abstract method.  to be overridden in specific implementation classes.
// call cb(er, data) where data is <= n in length.
// for virtual (non-string, non-buffer) streams, "length" is somewhat
// arbitrary, and perhaps not very meaningful.
Readable.prototype._read = function (n) {
  this.emit('error', new Error('_read() is not implemented'));
};

Readable.prototype.pipe = function (dest, pipeOpts) {
  var src = this;
  var state = this._readableState;

  switch (state.pipesCount) {
    case 0:
      state.pipes = dest;
      break;
    case 1:
      state.pipes = [state.pipes, dest];
      break;
    default:
      state.pipes.push(dest);
      break;
  }
  state.pipesCount += 1;
  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);

  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;

  var endFn = doEnd ? onend : unpipe;
  if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);

  dest.on('unpipe', onunpipe);
  function onunpipe(readable, unpipeInfo) {
    debug('onunpipe');
    if (readable === src) {
      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
        unpipeInfo.hasUnpiped = true;
        cleanup();
      }
    }
  }

  function onend() {
    debug('onend');
    dest.end();
  }

  // when the dest drains, it reduces the awaitDrain counter
  // on the source.  This would be more elegant with a .once()
  // handler in flow(), but adding and removing repeatedly is
  // too slow.
  var ondrain = pipeOnDrain(src);
  dest.on('drain', ondrain);

  var cleanedUp = false;
  function cleanup() {
    debug('cleanup');
    // cleanup event handlers once the pipe is broken
    dest.removeListener('close', onclose);
    dest.removeListener('finish', onfinish);
    dest.removeListener('drain', ondrain);
    dest.removeListener('error', onerror);
    dest.removeListener('unpipe', onunpipe);
    src.removeListener('end', onend);
    src.removeListener('end', unpipe);
    src.removeListener('data', ondata);

    cleanedUp = true;

    // if the reader is waiting for a drain event from this
    // specific writer, then it would cause it to never start
    // flowing again.
    // So, if this is awaiting a drain, then we just call it now.
    // If we don't know, then assume that we are waiting for one.
    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
  }

  // If the user pushes more data while we're writing to dest then we'll end up
  // in ondata again. However, we only want to increase awaitDrain once because
  // dest will only emit one 'drain' event for the multiple writes.
  // => Introduce a guard on increasing awaitDrain.
  var increasedAwaitDrain = false;
  src.on('data', ondata);
  function ondata(chunk) {
    debug('ondata');
    increasedAwaitDrain = false;
    var ret = dest.write(chunk);
    if (false === ret && !increasedAwaitDrain) {
      // If the user unpiped during `dest.write()`, it is possible
      // to get stuck in a permanently paused state if that write
      // also returned false.
      // => Check whether `dest` is still a piping destination.
      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
        debug('false write response, pause', src._readableState.awaitDrain);
        src._readableState.awaitDrain++;
        increasedAwaitDrain = true;
      }
      src.pause();
    }
  }

  // if the dest has an error, then stop piping into it.
  // however, don't suppress the throwing behavior for this.
  function onerror(er) {
    debug('onerror', er);
    unpipe();
    dest.removeListener('error', onerror);
    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
  }

  // Make sure our error handler is attached before userland ones.
  prependListener(dest, 'error', onerror);

  // Both close and finish should trigger unpipe, but only once.
  function onclose() {
    dest.removeListener('finish', onfinish);
    unpipe();
  }
  dest.once('close', onclose);
  function onfinish() {
    debug('onfinish');
    dest.removeListener('close', onclose);
    unpipe();
  }
  dest.once('finish', onfinish);

  function unpipe() {
    debug('unpipe');
    src.unpipe(dest);
  }

  // tell the dest that it's being piped to
  dest.emit('pipe', src);

  // start the flow if it hasn't been started already.
  if (!state.flowing) {
    debug('pipe resume');
    src.resume();
  }

  return dest;
};

function pipeOnDrain(src) {
  return function () {
    var state = src._readableState;
    debug('pipeOnDrain', state.awaitDrain);
    if (state.awaitDrain) state.awaitDrain--;
    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
      state.flowing = true;
      flow(src);
    }
  };
}

Readable.prototype.unpipe = function (dest) {
  var state = this._readableState;
  var unpipeInfo = { hasUnpiped: false };

  // if we're not piping anywhere, then do nothing.
  if (state.pipesCount === 0) return this;

  // just one destination.  most common case.
  if (state.pipesCount === 1) {
    // passed in one, but it's not the right one.
    if (dest && dest !== state.pipes) return this;

    if (!dest) dest = state.pipes;

    // got a match.
    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;
    if (dest) dest.emit('unpipe', this, unpipeInfo);
    return this;
  }

  // slow case. multiple pipe destinations.

  if (!dest) {
    // remove all.
    var dests = state.pipes;
    var len = state.pipesCount;
    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;

    for (var i = 0; i < len; i++) {
      dests[i].emit('unpipe', this, unpipeInfo);
    }return this;
  }

  // try to find the right one.
  var index = indexOf(state.pipes, dest);
  if (index === -1) return this;

  state.pipes.splice(index, 1);
  state.pipesCount -= 1;
  if (state.pipesCount === 1) state.pipes = state.pipes[0];

  dest.emit('unpipe', this, unpipeInfo);

  return this;
};

// set up data events if they are asked for
// Ensure readable listeners eventually get something
Readable.prototype.on = function (ev, fn) {
  var res = Stream.prototype.on.call(this, ev, fn);

  if (ev === 'data') {
    // Start flowing on next tick if stream isn't explicitly paused
    if (this._readableState.flowing !== false) this.resume();
  } else if (ev === 'readable') {
    var state = this._readableState;
    if (!state.endEmitted && !state.readableListening) {
      state.readableListening = state.needReadable = true;
      state.emittedReadable = false;
      if (!state.reading) {
        pna.nextTick(nReadingNextTick, this);
      } else if (state.length) {
        emitReadable(this);
      }
    }
  }

  return res;
};
Readable.prototype.addListener = Readable.prototype.on;

function nReadingNextTick(self) {
  debug('readable nexttick read 0');
  self.read(0);
}

// pause() and resume() are remnants of the legacy readable stream API
// If the user uses them, then switch into old mode.
Readable.prototype.resume = function () {
  var state = this._readableState;
  if (!state.flowing) {
    debug('resume');
    state.flowing = true;
    resume(this, state);
  }
  return this;
};

function resume(stream, state) {
  if (!state.resumeScheduled) {
    state.resumeScheduled = true;
    pna.nextTick(resume_, stream, state);
  }
}

function resume_(stream, state) {
  if (!state.reading) {
    debug('resume read 0');
    stream.read(0);
  }

  state.resumeScheduled = false;
  state.awaitDrain = 0;
  stream.emit('resume');
  flow(stream);
  if (state.flowing && !state.reading) stream.read(0);
}

Readable.prototype.pause = function () {
  debug('call pause flowing=%j', this._readableState.flowing);
  if (false !== this._readableState.flowing) {
    debug('pause');
    this._readableState.flowing = false;
    this.emit('pause');
  }
  return this;
};

function flow(stream) {
  var state = stream._readableState;
  debug('flow', state.flowing);
  while (state.flowing && stream.read() !== null) {}
}

// wrap an old-style stream as the async data source.
// This is *not* part of the readable stream interface.
// It is an ugly unfortunate mess of history.
Readable.prototype.wrap = function (stream) {
  var _this = this;

  var state = this._readableState;
  var paused = false;

  stream.on('end', function () {
    debug('wrapped end');
    if (state.decoder && !state.ended) {
      var chunk = state.decoder.end();
      if (chunk && chunk.length) _this.push(chunk);
    }

    _this.push(null);
  });

  stream.on('data', function (chunk) {
    debug('wrapped data');
    if (state.decoder) chunk = state.decoder.write(chunk);

    // don't skip over falsy values in objectMode
    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;

    var ret = _this.push(chunk);
    if (!ret) {
      paused = true;
      stream.pause();
    }
  });

  // proxy all the other methods.
  // important when wrapping filters and duplexes.
  for (var i in stream) {
    if (this[i] === undefined && typeof stream[i] === 'function') {
      this[i] = function (method) {
        return function () {
          return stream[method].apply(stream, arguments);
        };
      }(i);
    }
  }

  // proxy certain important events.
  for (var n = 0; n < kProxyEvents.length; n++) {
    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
  }

  // when we try to consume some more bytes, simply unpause the
  // underlying stream.
  this._read = function (n) {
    debug('wrapped _read', n);
    if (paused) {
      paused = false;
      stream.resume();
    }
  };

  return this;
};

Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function () {
    return this._readableState.highWaterMark;
  }
});

// exposed for testing purposes only.
Readable._fromList = fromList;

// Pluck off n bytes from an array of buffers.
// Length is the combined lengths of all the buffers in the list.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function fromList(n, state) {
  // nothing buffered
  if (state.length === 0) return null;

  var ret;
  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
    // read it all, truncate the list
    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
    state.buffer.clear();
  } else {
    // read part of list
    ret = fromListPartial(n, state.buffer, state.decoder);
  }

  return ret;
}

// Extracts only enough buffered data to satisfy the amount requested.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function fromListPartial(n, list, hasStrings) {
  var ret;
  if (n < list.head.data.length) {
    // slice is the same for buffers and strings
    ret = list.head.data.slice(0, n);
    list.head.data = list.head.data.slice(n);
  } else if (n === list.head.data.length) {
    // first chunk is a perfect match
    ret = list.shift();
  } else {
    // result spans more than one buffer
    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
  }
  return ret;
}

// Copies a specified amount of characters from the list of buffered data
// chunks.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function copyFromBufferString(n, list) {
  var p = list.head;
  var c = 1;
  var ret = p.data;
  n -= ret.length;
  while (p = p.next) {
    var str = p.data;
    var nb = n > str.length ? str.length : n;
    if (nb === str.length) ret += str;else ret += str.slice(0, n);
    n -= nb;
    if (n === 0) {
      if (nb === str.length) {
        ++c;
        if (p.next) list.head = p.next;else list.head = list.tail = null;
      } else {
        list.head = p;
        p.data = str.slice(nb);
      }
      break;
    }
    ++c;
  }
  list.length -= c;
  return ret;
}

// Copies a specified amount of bytes from the list of buffered data chunks.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function copyFromBuffer(n, list) {
  var ret = Buffer.allocUnsafe(n);
  var p = list.head;
  var c = 1;
  p.data.copy(ret);
  n -= p.data.length;
  while (p = p.next) {
    var buf = p.data;
    var nb = n > buf.length ? buf.length : n;
    buf.copy(ret, ret.length - n, 0, nb);
    n -= nb;
    if (n === 0) {
      if (nb === buf.length) {
        ++c;
        if (p.next) list.head = p.next;else list.head = list.tail = null;
      } else {
        list.head = p;
        p.data = buf.slice(nb);
      }
      break;
    }
    ++c;
  }
  list.length -= c;
  return ret;
}

function endReadable(stream) {
  var state = stream._readableState;

  // If we get here before consuming all the bytes, then that is a
  // bug in node.  Should never happen.
  if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');

  if (!state.endEmitted) {
    state.ended = true;
    pna.nextTick(endReadableNT, state, stream);
  }
}

function endReadableNT(state, stream) {
  // Check that we didn't get one last unshift.
  if (!state.endEmitted && state.length === 0) {
    state.endEmitted = true;
    stream.readable = false;
    stream.emit('end');
  }
}

function indexOf(xs, x) {
  for (var i = 0, l = xs.length; i < l; i++) {
    if (xs[i] === x) return i;
  }
  return -1;
}
}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./_stream_duplex":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_duplex.js","./internal/streams/BufferList":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/internal/streams/BufferList.js","./internal/streams/destroy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/internal/streams/destroy.js","./internal/streams/stream":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/internal/streams/stream-browser.js","_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","core-util-is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-util-is/lib/util.js","events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/inherits/inherits_browser.js","isarray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/isarray/index.js","process-nextick-args":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process-nextick-args/index.js","safe-buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/safe-buffer/index.js","string_decoder/":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/string_decoder/lib/string_decoder.js","util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browser-resolve/empty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_transform.js":[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a transform stream is a readable/writable stream where you do
// something with the data.  Sometimes it's called a "filter",
// but that's not a great name for it, since that implies a thing where
// some bits pass through, and others are simply ignored.  (That would
// be a valid example of a transform, of course.)
//
// While the output is causally related to the input, it's not a
// necessarily symmetric or synchronous transformation.  For example,
// a zlib stream might take multiple plain-text writes(), and then
// emit a single compressed chunk some time in the future.
//
// Here's how this works:
//
// The Transform stream has all the aspects of the readable and writable
// stream classes.  When you write(chunk), that calls _write(chunk,cb)
// internally, and returns false if there's a lot of pending writes
// buffered up.  When you call read(), that calls _read(n) until
// there's enough pending readable data buffered up.
//
// In a transform stream, the written data is placed in a buffer.  When
// _read(n) is called, it transforms the queued up data, calling the
// buffered _write cb's as it consumes chunks.  If consuming a single
// written chunk would result in multiple output chunks, then the first
// outputted bit calls the readcb, and subsequent chunks just go into
// the read buffer, and will cause it to emit 'readable' if necessary.
//
// This way, back-pressure is actually determined by the reading side,
// since _read has to be called to start processing a new chunk.  However,
// a pathological inflate type of transform can cause excessive buffering
// here.  For example, imagine a stream where every byte of input is
// interpreted as an integer from 0-255, and then results in that many
// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
// 1kb of data being output.  In this case, you could write a very small
// amount of input, and end up with a very large amount of output.  In
// such a pathological inflating mechanism, there'd be no way to tell
// the system to stop doing the transform.  A single 4MB write could
// cause the system to run out of memory.
//
// However, even in such a pathological case, only a single written chunk
// would be consumed, and then the rest would wait (un-transformed) until
// the results of the previous transformed chunk were consumed.

'use strict';

module.exports = Transform;

var Duplex = require('./_stream_duplex');

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

util.inherits(Transform, Duplex);

function afterTransform(er, data) {
  var ts = this._transformState;
  ts.transforming = false;

  var cb = ts.writecb;

  if (!cb) {
    return this.emit('error', new Error('write callback called multiple times'));
  }

  ts.writechunk = null;
  ts.writecb = null;

  if (data != null) // single equals check for both `null` and `undefined`
    this.push(data);

  cb(er);

  var rs = this._readableState;
  rs.reading = false;
  if (rs.needReadable || rs.length < rs.highWaterMark) {
    this._read(rs.highWaterMark);
  }
}

function Transform(options) {
  if (!(this instanceof Transform)) return new Transform(options);

  Duplex.call(this, options);

  this._transformState = {
    afterTransform: afterTransform.bind(this),
    needTransform: false,
    transforming: false,
    writecb: null,
    writechunk: null,
    writeencoding: null
  };

  // start out asking for a readable event once data is transformed.
  this._readableState.needReadable = true;

  // we have implemented the _read method, and done the other things
  // that Readable wants before the first _read call, so unset the
  // sync guard flag.
  this._readableState.sync = false;

  if (options) {
    if (typeof options.transform === 'function') this._transform = options.transform;

    if (typeof options.flush === 'function') this._flush = options.flush;
  }

  // When the writable side finishes, then flush out anything remaining.
  this.on('prefinish', prefinish);
}

function prefinish() {
  var _this = this;

  if (typeof this._flush === 'function') {
    this._flush(function (er, data) {
      done(_this, er, data);
    });
  } else {
    done(this, null, null);
  }
}

Transform.prototype.push = function (chunk, encoding) {
  this._transformState.needTransform = false;
  return Duplex.prototype.push.call(this, chunk, encoding);
};

// This is the part where you do stuff!
// override this function in implementation classes.
// 'chunk' is an input chunk.
//
// Call `push(newChunk)` to pass along transformed output
// to the readable side.  You may call 'push' zero or more times.
//
// Call `cb(err)` when you are done with this chunk.  If you pass
// an error, then that'll put the hurt on the whole operation.  If you
// never call cb(), then you'll never get another chunk.
Transform.prototype._transform = function (chunk, encoding, cb) {
  throw new Error('_transform() is not implemented');
};

Transform.prototype._write = function (chunk, encoding, cb) {
  var ts = this._transformState;
  ts.writecb = cb;
  ts.writechunk = chunk;
  ts.writeencoding = encoding;
  if (!ts.transforming) {
    var rs = this._readableState;
    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
  }
};

// Doesn't matter what the args are here.
// _transform does all the work.
// That we got here means that the readable side wants more data.
Transform.prototype._read = function (n) {
  var ts = this._transformState;

  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
    ts.transforming = true;
    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
  } else {
    // mark that we need a transform, so that any data that comes in
    // will get processed, now that we've asked for it.
    ts.needTransform = true;
  }
};

Transform.prototype._destroy = function (err, cb) {
  var _this2 = this;

  Duplex.prototype._destroy.call(this, err, function (err2) {
    cb(err2);
    _this2.emit('close');
  });
};

function done(stream, er, data) {
  if (er) return stream.emit('error', er);

  if (data != null) // single equals check for both `null` and `undefined`
    stream.push(data);

  // if there's nothing in the write buffer, then that means
  // that nothing more will ever be provided
  if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');

  if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');

  return stream.push(null);
}
},{"./_stream_duplex":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_duplex.js","core-util-is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-util-is/lib/util.js","inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/inherits/inherits_browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_writable.js":[function(require,module,exports){
(function (process,global,setImmediate){(function (){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// A bit simpler than readable streams.
// Implement an async ._write(chunk, encoding, cb), and it'll handle all
// the drain event emission and buffering.

'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

module.exports = Writable;

/* <replacement> */
function WriteReq(chunk, encoding, cb) {
  this.chunk = chunk;
  this.encoding = encoding;
  this.callback = cb;
  this.next = null;
}

// It seems a linked list but it is not
// there will be only 2 of these for each stream
function CorkedRequest(state) {
  var _this = this;

  this.next = null;
  this.entry = null;
  this.finish = function () {
    onCorkedFinish(_this, state);
  };
}
/* </replacement> */

/*<replacement>*/
var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;
/*</replacement>*/

/*<replacement>*/
var Duplex;
/*</replacement>*/

Writable.WritableState = WritableState;

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

/*<replacement>*/
var internalUtil = {
  deprecate: require('util-deprecate')
};
/*</replacement>*/

/*<replacement>*/
var Stream = require('./internal/streams/stream');
/*</replacement>*/

/*<replacement>*/

var Buffer = require('safe-buffer').Buffer;
var OurUint8Array = global.Uint8Array || function () {};
function _uint8ArrayToBuffer(chunk) {
  return Buffer.from(chunk);
}
function _isUint8Array(obj) {
  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}

/*</replacement>*/

var destroyImpl = require('./internal/streams/destroy');

util.inherits(Writable, Stream);

function nop() {}

function WritableState(options, stream) {
  Duplex = Duplex || require('./_stream_duplex');

  options = options || {};

  // Duplex streams are both readable and writable, but share
  // the same options object.
  // However, some cases require setting options to different
  // values for the readable and the writable sides of the duplex stream.
  // These options can be provided separately as readableXXX and writableXXX.
  var isDuplex = stream instanceof Duplex;

  // object stream flag to indicate whether or not this stream
  // contains buffers or objects.
  this.objectMode = !!options.objectMode;

  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;

  // the point at which write() starts returning false
  // Note: 0 is a valid value, means that we always return false if
  // the entire buffer is not flushed immediately on write()
  var hwm = options.highWaterMark;
  var writableHwm = options.writableHighWaterMark;
  var defaultHwm = this.objectMode ? 16 : 16 * 1024;

  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;

  // cast to ints.
  this.highWaterMark = Math.floor(this.highWaterMark);

  // if _final has been called
  this.finalCalled = false;

  // drain event flag.
  this.needDrain = false;
  // at the start of calling end()
  this.ending = false;
  // when end() has been called, and returned
  this.ended = false;
  // when 'finish' is emitted
  this.finished = false;

  // has it been destroyed
  this.destroyed = false;

  // should we decode strings into buffers before passing to _write?
  // this is here so that some node-core streams can optimize string
  // handling at a lower level.
  var noDecode = options.decodeStrings === false;
  this.decodeStrings = !noDecode;

  // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.
  this.defaultEncoding = options.defaultEncoding || 'utf8';

  // not an actual buffer we keep track of, but a measurement
  // of how much we're waiting to get pushed to some underlying
  // socket or file.
  this.length = 0;

  // a flag to see when we're in the middle of a write.
  this.writing = false;

  // when true all writes will be buffered until .uncork() call
  this.corked = 0;

  // a flag to be able to tell if the onwrite cb is called immediately,
  // or on a later tick.  We set this to true at first, because any
  // actions that shouldn't happen until "later" should generally also
  // not happen before the first write call.
  this.sync = true;

  // a flag to know if we're processing previously buffered items, which
  // may call the _write() callback in the same tick, so that we don't
  // end up in an overlapped onwrite situation.
  this.bufferProcessing = false;

  // the callback that's passed to _write(chunk,cb)
  this.onwrite = function (er) {
    onwrite(stream, er);
  };

  // the callback that the user supplies to write(chunk,encoding,cb)
  this.writecb = null;

  // the amount that is being written when _write is called.
  this.writelen = 0;

  this.bufferedRequest = null;
  this.lastBufferedRequest = null;

  // number of pending user-supplied write callbacks
  // this must be 0 before 'finish' can be emitted
  this.pendingcb = 0;

  // emit prefinish if the only thing we're waiting for is _write cbs
  // This is relevant for synchronous Transform streams
  this.prefinished = false;

  // True if the error was already emitted and should not be thrown again
  this.errorEmitted = false;

  // count buffered requests
  this.bufferedRequestCount = 0;

  // allocate the first CorkedRequest, there is always
  // one allocated and free to use, and we maintain at most two
  this.corkedRequestsFree = new CorkedRequest(this);
}

WritableState.prototype.getBuffer = function getBuffer() {
  var current = this.bufferedRequest;
  var out = [];
  while (current) {
    out.push(current);
    current = current.next;
  }
  return out;
};

(function () {
  try {
    Object.defineProperty(WritableState.prototype, 'buffer', {
      get: internalUtil.deprecate(function () {
        return this.getBuffer();
      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
    });
  } catch (_) {}
})();

// Test _writableState for inheritance to account for Duplex streams,
// whose prototype chain only points to Readable.
var realHasInstance;
if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
  realHasInstance = Function.prototype[Symbol.hasInstance];
  Object.defineProperty(Writable, Symbol.hasInstance, {
    value: function (object) {
      if (realHasInstance.call(this, object)) return true;
      if (this !== Writable) return false;

      return object && object._writableState instanceof WritableState;
    }
  });
} else {
  realHasInstance = function (object) {
    return object instanceof this;
  };
}

function Writable(options) {
  Duplex = Duplex || require('./_stream_duplex');

  // Writable ctor is applied to Duplexes, too.
  // `realHasInstance` is necessary because using plain `instanceof`
  // would return false, as no `_writableState` property is attached.

  // Trying to use the custom `instanceof` for Writable here will also break the
  // Node.js LazyTransform implementation, which has a non-trivial getter for
  // `_writableState` that would lead to infinite recursion.
  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
    return new Writable(options);
  }

  this._writableState = new WritableState(options, this);

  // legacy.
  this.writable = true;

  if (options) {
    if (typeof options.write === 'function') this._write = options.write;

    if (typeof options.writev === 'function') this._writev = options.writev;

    if (typeof options.destroy === 'function') this._destroy = options.destroy;

    if (typeof options.final === 'function') this._final = options.final;
  }

  Stream.call(this);
}

// Otherwise people can pipe Writable streams, which is just wrong.
Writable.prototype.pipe = function () {
  this.emit('error', new Error('Cannot pipe, not readable'));
};

function writeAfterEnd(stream, cb) {
  var er = new Error('write after end');
  // TODO: defer error events consistently everywhere, not just the cb
  stream.emit('error', er);
  pna.nextTick(cb, er);
}

// Checks that a user-supplied chunk is valid, especially for the particular
// mode the stream is in. Currently this means that `null` is never accepted
// and undefined/non-string values are only allowed in object mode.
function validChunk(stream, state, chunk, cb) {
  var valid = true;
  var er = false;

  if (chunk === null) {
    er = new TypeError('May not write null values to stream');
  } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
    er = new TypeError('Invalid non-string/buffer chunk');
  }
  if (er) {
    stream.emit('error', er);
    pna.nextTick(cb, er);
    valid = false;
  }
  return valid;
}

Writable.prototype.write = function (chunk, encoding, cb) {
  var state = this._writableState;
  var ret = false;
  var isBuf = !state.objectMode && _isUint8Array(chunk);

  if (isBuf && !Buffer.isBuffer(chunk)) {
    chunk = _uint8ArrayToBuffer(chunk);
  }

  if (typeof encoding === 'function') {
    cb = encoding;
    encoding = null;
  }

  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;

  if (typeof cb !== 'function') cb = nop;

  if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
    state.pendingcb++;
    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
  }

  return ret;
};

Writable.prototype.cork = function () {
  var state = this._writableState;

  state.corked++;
};

Writable.prototype.uncork = function () {
  var state = this._writableState;

  if (state.corked) {
    state.corked--;

    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
  }
};

Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
  // node::ParseEncoding() requires lower case.
  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
  this._writableState.defaultEncoding = encoding;
  return this;
};

function decodeChunk(state, chunk, encoding) {
  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
    chunk = Buffer.from(chunk, encoding);
  }
  return chunk;
}

Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function () {
    return this._writableState.highWaterMark;
  }
});

// if we're already writing something, then just put this
// in the queue, and wait our turn.  Otherwise, call _write
// If we return false, then we need a drain event, so set that flag.
function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
  if (!isBuf) {
    var newChunk = decodeChunk(state, chunk, encoding);
    if (chunk !== newChunk) {
      isBuf = true;
      encoding = 'buffer';
      chunk = newChunk;
    }
  }
  var len = state.objectMode ? 1 : chunk.length;

  state.length += len;

  var ret = state.length < state.highWaterMark;
  // we must ensure that previous needDrain will not be reset to false.
  if (!ret) state.needDrain = true;

  if (state.writing || state.corked) {
    var last = state.lastBufferedRequest;
    state.lastBufferedRequest = {
      chunk: chunk,
      encoding: encoding,
      isBuf: isBuf,
      callback: cb,
      next: null
    };
    if (last) {
      last.next = state.lastBufferedRequest;
    } else {
      state.bufferedRequest = state.lastBufferedRequest;
    }
    state.bufferedRequestCount += 1;
  } else {
    doWrite(stream, state, false, len, chunk, encoding, cb);
  }

  return ret;
}

function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  state.writelen = len;
  state.writecb = cb;
  state.writing = true;
  state.sync = true;
  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
  state.sync = false;
}

function onwriteError(stream, state, sync, er, cb) {
  --state.pendingcb;

  if (sync) {
    // defer the callback if we are being called synchronously
    // to avoid piling up things on the stack
    pna.nextTick(cb, er);
    // this can emit finish, and it will always happen
    // after error
    pna.nextTick(finishMaybe, stream, state);
    stream._writableState.errorEmitted = true;
    stream.emit('error', er);
  } else {
    // the caller expect this to happen before if
    // it is async
    cb(er);
    stream._writableState.errorEmitted = true;
    stream.emit('error', er);
    // this can emit finish, but finish must
    // always follow error
    finishMaybe(stream, state);
  }
}

function onwriteStateUpdate(state) {
  state.writing = false;
  state.writecb = null;
  state.length -= state.writelen;
  state.writelen = 0;
}

function onwrite(stream, er) {
  var state = stream._writableState;
  var sync = state.sync;
  var cb = state.writecb;

  onwriteStateUpdate(state);

  if (er) onwriteError(stream, state, sync, er, cb);else {
    // Check if we're actually ready to finish, but don't emit yet
    var finished = needFinish(state);

    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
      clearBuffer(stream, state);
    }

    if (sync) {
      /*<replacement>*/
      asyncWrite(afterWrite, stream, state, finished, cb);
      /*</replacement>*/
    } else {
      afterWrite(stream, state, finished, cb);
    }
  }
}

function afterWrite(stream, state, finished, cb) {
  if (!finished) onwriteDrain(stream, state);
  state.pendingcb--;
  cb();
  finishMaybe(stream, state);
}

// Must force callback to be called on nextTick, so that we don't
// emit 'drain' before the write() consumer gets the 'false' return
// value, and has a chance to attach a 'drain' listener.
function onwriteDrain(stream, state) {
  if (state.length === 0 && state.needDrain) {
    state.needDrain = false;
    stream.emit('drain');
  }
}

// if there's something in the buffer waiting, then process it
function clearBuffer(stream, state) {
  state.bufferProcessing = true;
  var entry = state.bufferedRequest;

  if (stream._writev && entry && entry.next) {
    // Fast case, write everything using _writev()
    var l = state.bufferedRequestCount;
    var buffer = new Array(l);
    var holder = state.corkedRequestsFree;
    holder.entry = entry;

    var count = 0;
    var allBuffers = true;
    while (entry) {
      buffer[count] = entry;
      if (!entry.isBuf) allBuffers = false;
      entry = entry.next;
      count += 1;
    }
    buffer.allBuffers = allBuffers;

    doWrite(stream, state, true, state.length, buffer, '', holder.finish);

    // doWrite is almost always async, defer these to save a bit of time
    // as the hot path ends with doWrite
    state.pendingcb++;
    state.lastBufferedRequest = null;
    if (holder.next) {
      state.corkedRequestsFree = holder.next;
      holder.next = null;
    } else {
      state.corkedRequestsFree = new CorkedRequest(state);
    }
    state.bufferedRequestCount = 0;
  } else {
    // Slow case, write chunks one-by-one
    while (entry) {
      var chunk = entry.chunk;
      var encoding = entry.encoding;
      var cb = entry.callback;
      var len = state.objectMode ? 1 : chunk.length;

      doWrite(stream, state, false, len, chunk, encoding, cb);
      entry = entry.next;
      state.bufferedRequestCount--;
      // if we didn't call the onwrite immediately, then
      // it means that we need to wait until it does.
      // also, that means that the chunk and cb are currently
      // being processed, so move the buffer counter past them.
      if (state.writing) {
        break;
      }
    }

    if (entry === null) state.lastBufferedRequest = null;
  }

  state.bufferedRequest = entry;
  state.bufferProcessing = false;
}

Writable.prototype._write = function (chunk, encoding, cb) {
  cb(new Error('_write() is not implemented'));
};

Writable.prototype._writev = null;

Writable.prototype.end = function (chunk, encoding, cb) {
  var state = this._writableState;

  if (typeof chunk === 'function') {
    cb = chunk;
    chunk = null;
    encoding = null;
  } else if (typeof encoding === 'function') {
    cb = encoding;
    encoding = null;
  }

  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);

  // .end() fully uncorks
  if (state.corked) {
    state.corked = 1;
    this.uncork();
  }

  // ignore unnecessary end() calls.
  if (!state.ending && !state.finished) endWritable(this, state, cb);
};

function needFinish(state) {
  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
}
function callFinal(stream, state) {
  stream._final(function (err) {
    state.pendingcb--;
    if (err) {
      stream.emit('error', err);
    }
    state.prefinished = true;
    stream.emit('prefinish');
    finishMaybe(stream, state);
  });
}
function prefinish(stream, state) {
  if (!state.prefinished && !state.finalCalled) {
    if (typeof stream._final === 'function') {
      state.pendingcb++;
      state.finalCalled = true;
      pna.nextTick(callFinal, stream, state);
    } else {
      state.prefinished = true;
      stream.emit('prefinish');
    }
  }
}

function finishMaybe(stream, state) {
  var need = needFinish(state);
  if (need) {
    prefinish(stream, state);
    if (state.pendingcb === 0) {
      state.finished = true;
      stream.emit('finish');
    }
  }
  return need;
}

function endWritable(stream, state, cb) {
  state.ending = true;
  finishMaybe(stream, state);
  if (cb) {
    if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);
  }
  state.ended = true;
  stream.writable = false;
}

function onCorkedFinish(corkReq, state, err) {
  var entry = corkReq.entry;
  corkReq.entry = null;
  while (entry) {
    var cb = entry.callback;
    state.pendingcb--;
    cb(err);
    entry = entry.next;
  }
  if (state.corkedRequestsFree) {
    state.corkedRequestsFree.next = corkReq;
  } else {
    state.corkedRequestsFree = corkReq;
  }
}

Object.defineProperty(Writable.prototype, 'destroyed', {
  get: function () {
    if (this._writableState === undefined) {
      return false;
    }
    return this._writableState.destroyed;
  },
  set: function (value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (!this._writableState) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._writableState.destroyed = value;
  }
});

Writable.prototype.destroy = destroyImpl.destroy;
Writable.prototype._undestroy = destroyImpl.undestroy;
Writable.prototype._destroy = function (err, cb) {
  this.end();
  cb(err);
};
}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate)
},{"./_stream_duplex":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_duplex.js","./internal/streams/destroy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/internal/streams/destroy.js","./internal/streams/stream":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/internal/streams/stream-browser.js","_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","core-util-is":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/core-util-is/lib/util.js","inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/inherits/inherits_browser.js","process-nextick-args":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process-nextick-args/index.js","safe-buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/safe-buffer/index.js","timers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/timers-browserify/main.js","util-deprecate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/util-deprecate/browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/internal/streams/BufferList.js":[function(require,module,exports){
'use strict';

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Buffer = require('safe-buffer').Buffer;
var util = require('util');

function copyBuffer(src, target, offset) {
  src.copy(target, offset);
}

module.exports = function () {
  function BufferList() {
    _classCallCheck(this, BufferList);

    this.head = null;
    this.tail = null;
    this.length = 0;
  }

  BufferList.prototype.push = function push(v) {
    var entry = { data: v, next: null };
    if (this.length > 0) this.tail.next = entry;else this.head = entry;
    this.tail = entry;
    ++this.length;
  };

  BufferList.prototype.unshift = function unshift(v) {
    var entry = { data: v, next: this.head };
    if (this.length === 0) this.tail = entry;
    this.head = entry;
    ++this.length;
  };

  BufferList.prototype.shift = function shift() {
    if (this.length === 0) return;
    var ret = this.head.data;
    if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
    --this.length;
    return ret;
  };

  BufferList.prototype.clear = function clear() {
    this.head = this.tail = null;
    this.length = 0;
  };

  BufferList.prototype.join = function join(s) {
    if (this.length === 0) return '';
    var p = this.head;
    var ret = '' + p.data;
    while (p = p.next) {
      ret += s + p.data;
    }return ret;
  };

  BufferList.prototype.concat = function concat(n) {
    if (this.length === 0) return Buffer.alloc(0);
    if (this.length === 1) return this.head.data;
    var ret = Buffer.allocUnsafe(n >>> 0);
    var p = this.head;
    var i = 0;
    while (p) {
      copyBuffer(p.data, ret, i);
      i += p.data.length;
      p = p.next;
    }
    return ret;
  };

  return BufferList;
}();

if (util && util.inspect && util.inspect.custom) {
  module.exports.prototype[util.inspect.custom] = function () {
    var obj = util.inspect({ length: this.length });
    return this.constructor.name + ' ' + obj;
  };
}
},{"safe-buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/safe-buffer/index.js","util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browser-resolve/empty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/internal/streams/destroy.js":[function(require,module,exports){
'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

// undocumented cb() API, needed for core, not for public API
function destroy(err, cb) {
  var _this = this;

  var readableDestroyed = this._readableState && this._readableState.destroyed;
  var writableDestroyed = this._writableState && this._writableState.destroyed;

  if (readableDestroyed || writableDestroyed) {
    if (cb) {
      cb(err);
    } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
      pna.nextTick(emitErrorNT, this, err);
    }
    return this;
  }

  // we set destroyed to true before firing error callbacks in order
  // to make it re-entrance safe in case destroy() is called within callbacks

  if (this._readableState) {
    this._readableState.destroyed = true;
  }

  // if this is a duplex stream mark the writable part as destroyed as well
  if (this._writableState) {
    this._writableState.destroyed = true;
  }

  this._destroy(err || null, function (err) {
    if (!cb && err) {
      pna.nextTick(emitErrorNT, _this, err);
      if (_this._writableState) {
        _this._writableState.errorEmitted = true;
      }
    } else if (cb) {
      cb(err);
    }
  });

  return this;
}

function undestroy() {
  if (this._readableState) {
    this._readableState.destroyed = false;
    this._readableState.reading = false;
    this._readableState.ended = false;
    this._readableState.endEmitted = false;
  }

  if (this._writableState) {
    this._writableState.destroyed = false;
    this._writableState.ended = false;
    this._writableState.ending = false;
    this._writableState.finished = false;
    this._writableState.errorEmitted = false;
  }
}

function emitErrorNT(self, err) {
  self.emit('error', err);
}

module.exports = {
  destroy: destroy,
  undestroy: undestroy
};
},{"process-nextick-args":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process-nextick-args/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/internal/streams/stream-browser.js":[function(require,module,exports){
module.exports = require('events').EventEmitter;

},{"events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/passthrough.js":[function(require,module,exports){
module.exports = require('./readable').PassThrough

},{"./readable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/readable-browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/readable-browser.js":[function(require,module,exports){
exports = module.exports = require('./lib/_stream_readable.js');
exports.Stream = exports;
exports.Readable = exports;
exports.Writable = require('./lib/_stream_writable.js');
exports.Duplex = require('./lib/_stream_duplex.js');
exports.Transform = require('./lib/_stream_transform.js');
exports.PassThrough = require('./lib/_stream_passthrough.js');

},{"./lib/_stream_duplex.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_duplex.js","./lib/_stream_passthrough.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_passthrough.js","./lib/_stream_readable.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_readable.js","./lib/_stream_transform.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_transform.js","./lib/_stream_writable.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_writable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/transform.js":[function(require,module,exports){
module.exports = require('./readable').Transform

},{"./readable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/readable-browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/writable-browser.js":[function(require,module,exports){
module.exports = require('./lib/_stream_writable.js');

},{"./lib/_stream_writable.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/lib/_stream_writable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regenerator-runtime/runtime.js":[function(require,module,exports){
/**
 * Copyright (c) 2014-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

var runtime = (function (exports) {
  "use strict";

  var Op = Object.prototype;
  var hasOwn = Op.hasOwnProperty;
  var undefined; // More compressible than void 0.
  var $Symbol = typeof Symbol === "function" ? Symbol : {};
  var iteratorSymbol = $Symbol.iterator || "@@iterator";
  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";

  function define(obj, key, value) {
    Object.defineProperty(obj, key, {
      value: value,
      enumerable: true,
      configurable: true,
      writable: true
    });
    return obj[key];
  }
  try {
    // IE 8 has a broken Object.defineProperty that only works on DOM objects.
    define({}, "");
  } catch (err) {
    define = function(obj, key, value) {
      return obj[key] = value;
    };
  }

  function wrap(innerFn, outerFn, self, tryLocsList) {
    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
    var generator = Object.create(protoGenerator.prototype);
    var context = new Context(tryLocsList || []);

    // The ._invoke method unifies the implementations of the .next,
    // .throw, and .return methods.
    generator._invoke = makeInvokeMethod(innerFn, self, context);

    return generator;
  }
  exports.wrap = wrap;

  // Try/catch helper to minimize deoptimizations. Returns a completion
  // record like context.tryEntries[i].completion. This interface could
  // have been (and was previously) designed to take a closure to be
  // invoked without arguments, but in all the cases we care about we
  // already have an existing method we want to call, so there's no need
  // to create a new function object. We can even get away with assuming
  // the method takes exactly one argument, since that happens to be true
  // in every case, so we don't have to touch the arguments object. The
  // only additional allocation required is the completion record, which
  // has a stable shape and so hopefully should be cheap to allocate.
  function tryCatch(fn, obj, arg) {
    try {
      return { type: "normal", arg: fn.call(obj, arg) };
    } catch (err) {
      return { type: "throw", arg: err };
    }
  }

  var GenStateSuspendedStart = "suspendedStart";
  var GenStateSuspendedYield = "suspendedYield";
  var GenStateExecuting = "executing";
  var GenStateCompleted = "completed";

  // Returning this object from the innerFn has the same effect as
  // breaking out of the dispatch switch statement.
  var ContinueSentinel = {};

  // Dummy constructor functions that we use as the .constructor and
  // .constructor.prototype properties for functions that return Generator
  // objects. For full spec compliance, you may wish to configure your
  // minifier not to mangle the names of these two functions.
  function Generator() {}
  function GeneratorFunction() {}
  function GeneratorFunctionPrototype() {}

  // This is a polyfill for %IteratorPrototype% for environments that
  // don't natively support it.
  var IteratorPrototype = {};
  define(IteratorPrototype, iteratorSymbol, function () {
    return this;
  });

  var getProto = Object.getPrototypeOf;
  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  if (NativeIteratorPrototype &&
      NativeIteratorPrototype !== Op &&
      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
    // This environment has a native %IteratorPrototype%; use it instead
    // of the polyfill.
    IteratorPrototype = NativeIteratorPrototype;
  }

  var Gp = GeneratorFunctionPrototype.prototype =
    Generator.prototype = Object.create(IteratorPrototype);
  GeneratorFunction.prototype = GeneratorFunctionPrototype;
  define(Gp, "constructor", GeneratorFunctionPrototype);
  define(GeneratorFunctionPrototype, "constructor", GeneratorFunction);
  GeneratorFunction.displayName = define(
    GeneratorFunctionPrototype,
    toStringTagSymbol,
    "GeneratorFunction"
  );

  // Helper for defining the .next, .throw, and .return methods of the
  // Iterator interface in terms of a single ._invoke method.
  function defineIteratorMethods(prototype) {
    ["next", "throw", "return"].forEach(function(method) {
      define(prototype, method, function(arg) {
        return this._invoke(method, arg);
      });
    });
  }

  exports.isGeneratorFunction = function(genFun) {
    var ctor = typeof genFun === "function" && genFun.constructor;
    return ctor
      ? ctor === GeneratorFunction ||
        // For the native GeneratorFunction constructor, the best we can
        // do is to check its .name property.
        (ctor.displayName || ctor.name) === "GeneratorFunction"
      : false;
  };

  exports.mark = function(genFun) {
    if (Object.setPrototypeOf) {
      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
    } else {
      genFun.__proto__ = GeneratorFunctionPrototype;
      define(genFun, toStringTagSymbol, "GeneratorFunction");
    }
    genFun.prototype = Object.create(Gp);
    return genFun;
  };

  // Within the body of any async function, `await x` is transformed to
  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  // `hasOwn.call(value, "__await")` to determine if the yielded value is
  // meant to be awaited.
  exports.awrap = function(arg) {
    return { __await: arg };
  };

  function AsyncIterator(generator, PromiseImpl) {
    function invoke(method, arg, resolve, reject) {
      var record = tryCatch(generator[method], generator, arg);
      if (record.type === "throw") {
        reject(record.arg);
      } else {
        var result = record.arg;
        var value = result.value;
        if (value &&
            typeof value === "object" &&
            hasOwn.call(value, "__await")) {
          return PromiseImpl.resolve(value.__await).then(function(value) {
            invoke("next", value, resolve, reject);
          }, function(err) {
            invoke("throw", err, resolve, reject);
          });
        }

        return PromiseImpl.resolve(value).then(function(unwrapped) {
          // When a yielded Promise is resolved, its final value becomes
          // the .value of the Promise<{value,done}> result for the
          // current iteration.
          result.value = unwrapped;
          resolve(result);
        }, function(error) {
          // If a rejected Promise was yielded, throw the rejection back
          // into the async generator function so it can be handled there.
          return invoke("throw", error, resolve, reject);
        });
      }
    }

    var previousPromise;

    function enqueue(method, arg) {
      function callInvokeWithMethodAndArg() {
        return new PromiseImpl(function(resolve, reject) {
          invoke(method, arg, resolve, reject);
        });
      }

      return previousPromise =
        // If enqueue has been called before, then we want to wait until
        // all previous Promises have been resolved before calling invoke,
        // so that results are always delivered in the correct order. If
        // enqueue has not been called before, then it is important to
        // call invoke immediately, without waiting on a callback to fire,
        // so that the async generator function has the opportunity to do
        // any necessary setup in a predictable way. This predictability
        // is why the Promise constructor synchronously invokes its
        // executor callback, and why async functions synchronously
        // execute code before the first await. Since we implement simple
        // async functions in terms of async generators, it is especially
        // important to get this right, even though it requires care.
        previousPromise ? previousPromise.then(
          callInvokeWithMethodAndArg,
          // Avoid propagating failures to Promises returned by later
          // invocations of the iterator.
          callInvokeWithMethodAndArg
        ) : callInvokeWithMethodAndArg();
    }

    // Define the unified helper method that is used to implement .next,
    // .throw, and .return (see defineIteratorMethods).
    this._invoke = enqueue;
  }

  defineIteratorMethods(AsyncIterator.prototype);
  define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
    return this;
  });
  exports.AsyncIterator = AsyncIterator;

  // Note that simple async functions are implemented on top of
  // AsyncIterator objects; they just return a Promise for the value of
  // the final result produced by the iterator.
  exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {
    if (PromiseImpl === void 0) PromiseImpl = Promise;

    var iter = new AsyncIterator(
      wrap(innerFn, outerFn, self, tryLocsList),
      PromiseImpl
    );

    return exports.isGeneratorFunction(outerFn)
      ? iter // If outerFn is a generator, return the full iterator.
      : iter.next().then(function(result) {
          return result.done ? result.value : iter.next();
        });
  };

  function makeInvokeMethod(innerFn, self, context) {
    var state = GenStateSuspendedStart;

    return function invoke(method, arg) {
      if (state === GenStateExecuting) {
        throw new Error("Generator is already running");
      }

      if (state === GenStateCompleted) {
        if (method === "throw") {
          throw arg;
        }

        // Be forgiving, per 25.3.3.3.3 of the spec:
        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
        return doneResult();
      }

      context.method = method;
      context.arg = arg;

      while (true) {
        var delegate = context.delegate;
        if (delegate) {
          var delegateResult = maybeInvokeDelegate(delegate, context);
          if (delegateResult) {
            if (delegateResult === ContinueSentinel) continue;
            return delegateResult;
          }
        }

        if (context.method === "next") {
          // Setting context._sent for legacy support of Babel's
          // function.sent implementation.
          context.sent = context._sent = context.arg;

        } else if (context.method === "throw") {
          if (state === GenStateSuspendedStart) {
            state = GenStateCompleted;
            throw context.arg;
          }

          context.dispatchException(context.arg);

        } else if (context.method === "return") {
          context.abrupt("return", context.arg);
        }

        state = GenStateExecuting;

        var record = tryCatch(innerFn, self, context);
        if (record.type === "normal") {
          // If an exception is thrown from innerFn, we leave state ===
          // GenStateExecuting and loop back for another invocation.
          state = context.done
            ? GenStateCompleted
            : GenStateSuspendedYield;

          if (record.arg === ContinueSentinel) {
            continue;
          }

          return {
            value: record.arg,
            done: context.done
          };

        } else if (record.type === "throw") {
          state = GenStateCompleted;
          // Dispatch the exception by looping back around to the
          // context.dispatchException(context.arg) call above.
          context.method = "throw";
          context.arg = record.arg;
        }
      }
    };
  }

  // Call delegate.iterator[context.method](context.arg) and handle the
  // result, either by returning a { value, done } result from the
  // delegate iterator, or by modifying context.method and context.arg,
  // setting context.delegate to null, and returning the ContinueSentinel.
  function maybeInvokeDelegate(delegate, context) {
    var method = delegate.iterator[context.method];
    if (method === undefined) {
      // A .throw or .return when the delegate iterator has no .throw
      // method always terminates the yield* loop.
      context.delegate = null;

      if (context.method === "throw") {
        // Note: ["return"] must be used for ES3 parsing compatibility.
        if (delegate.iterator["return"]) {
          // If the delegate iterator has a return method, give it a
          // chance to clean up.
          context.method = "return";
          context.arg = undefined;
          maybeInvokeDelegate(delegate, context);

          if (context.method === "throw") {
            // If maybeInvokeDelegate(context) changed context.method from
            // "return" to "throw", let that override the TypeError below.
            return ContinueSentinel;
          }
        }

        context.method = "throw";
        context.arg = new TypeError(
          "The iterator does not provide a 'throw' method");
      }

      return ContinueSentinel;
    }

    var record = tryCatch(method, delegate.iterator, context.arg);

    if (record.type === "throw") {
      context.method = "throw";
      context.arg = record.arg;
      context.delegate = null;
      return ContinueSentinel;
    }

    var info = record.arg;

    if (! info) {
      context.method = "throw";
      context.arg = new TypeError("iterator result is not an object");
      context.delegate = null;
      return ContinueSentinel;
    }

    if (info.done) {
      // Assign the result of the finished delegate to the temporary
      // variable specified by delegate.resultName (see delegateYield).
      context[delegate.resultName] = info.value;

      // Resume execution at the desired location (see delegateYield).
      context.next = delegate.nextLoc;

      // If context.method was "throw" but the delegate handled the
      // exception, let the outer generator proceed normally. If
      // context.method was "next", forget context.arg since it has been
      // "consumed" by the delegate iterator. If context.method was
      // "return", allow the original .return call to continue in the
      // outer generator.
      if (context.method !== "return") {
        context.method = "next";
        context.arg = undefined;
      }

    } else {
      // Re-yield the result returned by the delegate method.
      return info;
    }

    // The delegate iterator is finished, so forget it and continue with
    // the outer generator.
    context.delegate = null;
    return ContinueSentinel;
  }

  // Define Generator.prototype.{next,throw,return} in terms of the
  // unified ._invoke helper method.
  defineIteratorMethods(Gp);

  define(Gp, toStringTagSymbol, "Generator");

  // A Generator should always return itself as the iterator object when the
  // @@iterator function is called on it. Some browsers' implementations of the
  // iterator prototype chain incorrectly implement this, causing the Generator
  // object to not be returned from this call. This ensures that doesn't happen.
  // See https://github.com/facebook/regenerator/issues/274 for more details.
  define(Gp, iteratorSymbol, function() {
    return this;
  });

  define(Gp, "toString", function() {
    return "[object Generator]";
  });

  function pushTryEntry(locs) {
    var entry = { tryLoc: locs[0] };

    if (1 in locs) {
      entry.catchLoc = locs[1];
    }

    if (2 in locs) {
      entry.finallyLoc = locs[2];
      entry.afterLoc = locs[3];
    }

    this.tryEntries.push(entry);
  }

  function resetTryEntry(entry) {
    var record = entry.completion || {};
    record.type = "normal";
    delete record.arg;
    entry.completion = record;
  }

  function Context(tryLocsList) {
    // The root entry object (effectively a try statement without a catch
    // or a finally block) gives us a place to store values thrown from
    // locations where there is no enclosing try statement.
    this.tryEntries = [{ tryLoc: "root" }];
    tryLocsList.forEach(pushTryEntry, this);
    this.reset(true);
  }

  exports.keys = function(object) {
    var keys = [];
    for (var key in object) {
      keys.push(key);
    }
    keys.reverse();

    // Rather than returning an object with a next method, we keep
    // things simple and return the next function itself.
    return function next() {
      while (keys.length) {
        var key = keys.pop();
        if (key in object) {
          next.value = key;
          next.done = false;
          return next;
        }
      }

      // To avoid creating an additional object, we just hang the .value
      // and .done properties off the next function object itself. This
      // also ensures that the minifier will not anonymize the function.
      next.done = true;
      return next;
    };
  };

  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];
      if (iteratorMethod) {
        return iteratorMethod.call(iterable);
      }

      if (typeof iterable.next === "function") {
        return iterable;
      }

      if (!isNaN(iterable.length)) {
        var i = -1, next = function next() {
          while (++i < iterable.length) {
            if (hasOwn.call(iterable, i)) {
              next.value = iterable[i];
              next.done = false;
              return next;
            }
          }

          next.value = undefined;
          next.done = true;

          return next;
        };

        return next.next = next;
      }
    }

    // Return an iterator with no values.
    return { next: doneResult };
  }
  exports.values = values;

  function doneResult() {
    return { value: undefined, done: true };
  }

  Context.prototype = {
    constructor: Context,

    reset: function(skipTempReset) {
      this.prev = 0;
      this.next = 0;
      // Resetting context._sent for legacy support of Babel's
      // function.sent implementation.
      this.sent = this._sent = undefined;
      this.done = false;
      this.delegate = null;

      this.method = "next";
      this.arg = undefined;

      this.tryEntries.forEach(resetTryEntry);

      if (!skipTempReset) {
        for (var name in this) {
          // Not sure about the optimal order of these conditions:
          if (name.charAt(0) === "t" &&
              hasOwn.call(this, name) &&
              !isNaN(+name.slice(1))) {
            this[name] = undefined;
          }
        }
      }
    },

    stop: function() {
      this.done = true;

      var rootEntry = this.tryEntries[0];
      var rootRecord = rootEntry.completion;
      if (rootRecord.type === "throw") {
        throw rootRecord.arg;
      }

      return this.rval;
    },

    dispatchException: function(exception) {
      if (this.done) {
        throw exception;
      }

      var context = this;
      function handle(loc, caught) {
        record.type = "throw";
        record.arg = exception;
        context.next = loc;

        if (caught) {
          // If the dispatched exception was caught by a catch block,
          // then let that catch block handle the exception normally.
          context.method = "next";
          context.arg = undefined;
        }

        return !! caught;
      }

      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        var record = entry.completion;

        if (entry.tryLoc === "root") {
          // Exception thrown outside of any try block that could handle
          // it, so set the completion value of the entire function to
          // throw the exception.
          return handle("end");
        }

        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc");
          var hasFinally = hasOwn.call(entry, "finallyLoc");

          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            } else if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }

          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            }

          } else if (hasFinally) {
            if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }

          } else {
            throw new Error("try statement without catch or finally");
          }
        }
      }
    },

    abrupt: function(type, arg) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc <= this.prev &&
            hasOwn.call(entry, "finallyLoc") &&
            this.prev < entry.finallyLoc) {
          var finallyEntry = entry;
          break;
        }
      }

      if (finallyEntry &&
          (type === "break" ||
           type === "continue") &&
          finallyEntry.tryLoc <= arg &&
          arg <= finallyEntry.finallyLoc) {
        // Ignore the finally entry if control is not jumping to a
        // location outside the try/catch block.
        finallyEntry = null;
      }

      var record = finallyEntry ? finallyEntry.completion : {};
      record.type = type;
      record.arg = arg;

      if (finallyEntry) {
        this.method = "next";
        this.next = finallyEntry.finallyLoc;
        return ContinueSentinel;
      }

      return this.complete(record);
    },

    complete: function(record, afterLoc) {
      if (record.type === "throw") {
        throw record.arg;
      }

      if (record.type === "break" ||
          record.type === "continue") {
        this.next = record.arg;
      } else if (record.type === "return") {
        this.rval = this.arg = record.arg;
        this.method = "return";
        this.next = "end";
      } else if (record.type === "normal" && afterLoc) {
        this.next = afterLoc;
      }

      return ContinueSentinel;
    },

    finish: function(finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.finallyLoc === finallyLoc) {
          this.complete(entry.completion, entry.afterLoc);
          resetTryEntry(entry);
          return ContinueSentinel;
        }
      }
    },

    "catch": function(tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;
          if (record.type === "throw") {
            var thrown = record.arg;
            resetTryEntry(entry);
          }
          return thrown;
        }
      }

      // The context.catch method must only be called with a location
      // argument that corresponds to a known catch block.
      throw new Error("illegal catch attempt");
    },

    delegateYield: function(iterable, resultName, nextLoc) {
      this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      };

      if (this.method === "next") {
        // Deliberately forget the last sent value so that we don't
        // accidentally pass it on to the delegate.
        this.arg = undefined;
      }

      return ContinueSentinel;
    }
  };

  // Regardless of whether this script is executing as a CommonJS module
  // or not, return the runtime object so that we can declare the variable
  // regeneratorRuntime in the outer scope, which allows this module to be
  // injected easily by `bin/regenerator --include-runtime script.js`.
  return exports;

}(
  // If this script is executing as a CommonJS module, use module.exports
  // as the regeneratorRuntime namespace. Otherwise create a new empty
  // object. Either way, the resulting object will be used to initialize
  // the regeneratorRuntime variable at the top of this file.
  typeof module === "object" ? module.exports : {}
));

try {
  regeneratorRuntime = runtime;
} catch (accidentalStrictMode) {
  // This module should not be running in strict mode, so the above
  // assignment should always work unless something is misconfigured. Just
  // in case runtime.js accidentally runs in strict mode, in modern engines
  // we can explicitly access globalThis. In older engines we can escape
  // strict mode using a global Function call. This could conceivably fail
  // if a Content Security Policy forbids using Function, but in that case
  // the proper solution is to fix the accidental strict mode problem. If
  // you've misconfigured your bundler to force strict mode and applied a
  // CSP to forbid Function, and you're not willing to fix either of those
  // problems, please detail your unique predicament in a GitHub issue.
  if (typeof globalThis === "object") {
    globalThis.regeneratorRuntime = runtime;
  } else {
    Function("r", "regeneratorRuntime = r")(runtime);
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regexp.prototype.flags/implementation.js":[function(require,module,exports){
'use strict';

var functionsHaveConfigurableNames = require('functions-have-names').functionsHaveConfigurableNames();

var $Object = Object;
var $TypeError = TypeError;

module.exports = function flags() {
	if (this != null && this !== $Object(this)) {
		throw new $TypeError('RegExp.prototype.flags getter called on non-object');
	}
	var result = '';
	if (this.hasIndices) {
		result += 'd';
	}
	if (this.global) {
		result += 'g';
	}
	if (this.ignoreCase) {
		result += 'i';
	}
	if (this.multiline) {
		result += 'm';
	}
	if (this.dotAll) {
		result += 's';
	}
	if (this.unicode) {
		result += 'u';
	}
	if (this.sticky) {
		result += 'y';
	}
	return result;
};

if (functionsHaveConfigurableNames && Object.defineProperty) {
	Object.defineProperty(module.exports, 'name', { value: 'get flags' });
}

},{"functions-have-names":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/functions-have-names/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regexp.prototype.flags/index.js":[function(require,module,exports){
'use strict';

var define = require('define-properties');
var callBind = require('call-bind');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var flagsBound = callBind(getPolyfill());

define(flagsBound, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = flagsBound;

},{"./implementation":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regexp.prototype.flags/implementation.js","./polyfill":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regexp.prototype.flags/polyfill.js","./shim":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regexp.prototype.flags/shim.js","call-bind":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/call-bind/index.js","define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/define-properties/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regexp.prototype.flags/polyfill.js":[function(require,module,exports){
'use strict';

var implementation = require('./implementation');

var supportsDescriptors = require('define-properties').supportsDescriptors;
var $gOPD = Object.getOwnPropertyDescriptor;

module.exports = function getPolyfill() {
	if (supportsDescriptors && (/a/mig).flags === 'gim') {
		var descriptor = $gOPD(RegExp.prototype, 'flags');
		if (
			descriptor
			&& typeof descriptor.get === 'function'
			&& typeof RegExp.prototype.dotAll === 'boolean'
			&& typeof RegExp.prototype.hasIndices === 'boolean'
		) {
			/* eslint getter-return: 0 */
			var calls = '';
			var o = {};
			Object.defineProperty(o, 'hasIndices', {
				get: function () {
					calls += 'd';
				}
			});
			Object.defineProperty(o, 'sticky', {
				get: function () {
					calls += 'y';
				}
			});
			if (calls === 'dy') {
				return descriptor.get;
			}
		}
	}
	return implementation;
};

},{"./implementation":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regexp.prototype.flags/implementation.js","define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/define-properties/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regexp.prototype.flags/shim.js":[function(require,module,exports){
'use strict';

var supportsDescriptors = require('define-properties').supportsDescriptors;
var getPolyfill = require('./polyfill');
var gOPD = Object.getOwnPropertyDescriptor;
var defineProperty = Object.defineProperty;
var TypeErr = TypeError;
var getProto = Object.getPrototypeOf;
var regex = /a/;

module.exports = function shimFlags() {
	if (!supportsDescriptors || !getProto) {
		throw new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');
	}
	var polyfill = getPolyfill();
	var proto = getProto(regex);
	var descriptor = gOPD(proto, 'flags');
	if (!descriptor || descriptor.get !== polyfill) {
		defineProperty(proto, 'flags', {
			configurable: true,
			enumerable: false,
			get: polyfill
		});
	}
	return polyfill;
};

},{"./polyfill":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/regexp.prototype.flags/polyfill.js","define-properties":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/define-properties/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/retail-page-tracker/build/index.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _Tracker = require('./src/Tracker');

Object.defineProperty(exports, 'Tracker', {
  enumerable: true,
  get: function get() {
    return _interopRequireDefault(_Tracker).default;
  }
});

var _Page = require('./src/Page');

Object.defineProperty(exports, 'pageId', {
  enumerable: true,
  get: function get() {
    return _Page.pageId;
  }
});
Object.defineProperty(exports, 'Page', {
  enumerable: true,
  get: function get() {
    return _Page.Page;
  }
});
Object.defineProperty(exports, 'pages', {
  enumerable: true,
  get: function get() {
    return _Page.pages;
  }
});
Object.defineProperty(exports, 'action', {
  enumerable: true,
  get: function get() {
    return _Page.action;
  }
});

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
},{"./src/Page":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/retail-page-tracker/build/src/Page.js","./src/Tracker":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/retail-page-tracker/build/src/Tracker.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/retail-page-tracker/build/src/Page.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var pageId = exports.pageId = {
  transaction: 'Transaction',
  emv: 'EMV',
  swipe: 'Swipe',
  cashOrCheck: 'CashOrCheck',
  keyIn: 'KeyIn',
  payment: 'Payment',
  refund: 'Refund',
  cancelled: 'Cancelled',
  noThanks: 'NoThanks',
  custom: 'Custom',
  failed: 'Failed',
  complete: 'Completed',
  decline: 'Decline',
  receipt: 'Receipt',
  required: 'Required',
  sms: 'SMS',
  email: 'Email',
  signature: 'Signature',
  settings: 'Settings',
  swUpdate: 'SwUpdate',
  downloading: 'Downloading',
  rki: 'RKI',
  config: 'Config',
  os: 'OS',
  mpi: 'MPI',
  reboot: 'Reboot',
  retry: 'Retry'
};

/**
 * Class to represent a Page object intended for page tracking observers
 * @class
 * @property {string} name Full name for the page in delimited format @readonly
 * @property {string} action Most recent user action that was performed @readonly
 * @property {Page} parent Parent to the current page @readonly
 */

var Page = exports.Page = function () {
  /**
   * Build the page object
   * @param {string} id Id of the page
   * @param {Page} parent Parent to current page
   * @private
   */
  function Page(id, parent) {
    _classCallCheck(this, Page);

    this._id = id;
    this._parent = parent;
  }

  Page.prototype.withAction = function withAction(action) {
    this._action = action;
    return this;
  };

  _createClass(Page, [{
    key: 'name',
    get: function get() {
      var parentName = '';
      if (this._parent) {
        parentName = this._parent.name + ':';
      }
      return '' + parentName + this._id;
    }
  }, {
    key: 'parent',
    get: function get() {
      return this._parent;
    }
  }, {
    key: 'action',
    get: function get() {
      return this._action;
    },
    set: function set(value) {
      this._action = value;
    }
  }]);

  return Page;
}();

var transaction = new Page(pageId.transaction, null);
var emv = new Page(pageId.emv, transaction);
var swipe = new Page(pageId.swipe, transaction);
var payment = new Page(pageId.payment, null);
var keyIn = new Page(pageId.keyIn, payment);
var cashOrCheck = new Page(pageId.cashOrCheck, payment);
var paymentComplete = new Page(pageId.complete, payment);
var paymentCancelled = new Page(pageId.cancelled, payment);
var paymentDecline = new Page(pageId.decline, payment);
var refund = new Page(pageId.refund, null);
var refundComplete = new Page(pageId.complete, refund);
var refundCancelled = new Page(pageId.cancelled, refund);
var refundDecline = new Page(pageId.decline, refund);
var paymentReceipt = new Page(pageId.receipt, payment);
var refundReceipt = new Page(pageId.receipt, refund);
var paymentReceiptSms = new Page(pageId.sms, paymentReceipt);
var paymentReceiptEmail = new Page(pageId.email, paymentReceipt);
var paymentReceiptNoThanks = new Page(pageId.noThanks, paymentReceipt);
var paymentReceiptCustom = new Page(pageId.custom, paymentReceipt);
var refundReceiptSms = new Page(pageId.sms, refundReceipt);
var refundReceiptEmail = new Page(pageId.email, refundReceipt);
var refundReceiptNoThanks = new Page(pageId.noThanks, refundReceipt);
var refundReceiptCustom = new Page(pageId.custom, refundReceipt);
var signature = new Page(pageId.signature, null);
var settings = new Page(pageId.settings, null);
var swUpdate = new Page(pageId.swUpdate, settings);
var swUpdateRetry = new Page(pageId.retry, swUpdate);
var swUpdateReboot = new Page(pageId.reboot, swUpdate);
var swUpdateComplete = new Page(pageId.complete, swUpdate);
var swUpdateFailed = new Page(pageId.failed, swUpdate);
var rki = new Page(pageId.rki, swUpdate);
var rkiRequired = new Page(pageId.required, rki);
var rkiCompleted = new Page(pageId.complete, rki);
var rkiFailed = new Page(pageId.failed, rki);
var os = new Page(pageId.os, swUpdate);
var osRequired = new Page(pageId.required, os);
var osCompleted = new Page(pageId.complete, os);
var osFailed = new Page(pageId.failed, os);
var mpi = new Page(pageId.mpi, swUpdate);
var mpiRequired = new Page(pageId.required, mpi);
var mpiCompleted = new Page(pageId.complete, mpi);
var mpiFailed = new Page(pageId.failed, mpi);
var config = new Page(pageId.config, swUpdate);
var configRequired = new Page(pageId.required, config);
var configCompleted = new Page(pageId.complete, config);
var configFailed = new Page(pageId.failed, config);

var pages = exports.pages = {
  transaction: transaction,
  emv: emv,
  swipe: swipe,
  keyIn: keyIn,
  cashOrCheck: cashOrCheck,
  payment: payment,
  paymentComplete: paymentComplete,
  paymentCancelled: paymentCancelled,
  paymentDecline: paymentDecline,
  refund: refund,
  refundComplete: refundComplete,
  refundCancelled: refundCancelled,
  refundDecline: refundDecline,
  paymentReceipt: paymentReceipt,
  refundReceipt: refundReceipt,
  paymentReceiptSms: paymentReceiptSms,
  paymentReceiptEmail: paymentReceiptEmail,
  paymentReceiptNoThanks: paymentReceiptNoThanks,
  paymentReceiptCustom: paymentReceiptCustom,
  refundReceiptSms: refundReceiptSms,
  refundReceiptEmail: refundReceiptEmail,
  refundReceiptNoThanks: refundReceiptNoThanks,
  refundReceiptCustom: refundReceiptCustom,
  signature: signature,
  settings: settings,
  swUpdate: swUpdate,
  swUpdateRetry: swUpdateRetry,
  swUpdateReboot: swUpdateReboot,
  swUpdateComplete: swUpdateComplete,
  swUpdateFailed: swUpdateFailed,
  rkiRequired: rkiRequired,
  rkiCompleted: rkiCompleted,
  rkiFailed: rkiFailed,
  osRequired: osRequired,
  osCompleted: osCompleted,
  osFailed: osFailed,
  mpiRequired: mpiRequired,
  mpiCompleted: mpiCompleted,
  mpiFailed: mpiFailed,
  configRequired: configRequired,
  configCompleted: configCompleted,
  configFailed: configFailed
};

var action = exports.action = {
  cancel: 'cancel',
  acquire: 'acquire',
  dismiss: 'dismiss'
};
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/retail-page-tracker/build/src/Tracker.js":[function(require,module,exports){
'use strict';

exports.__esModule = true;

var _events = require('events');

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Tracker = function () {
  function Tracker() {
    _classCallCheck(this, Tracker);
  }

  /**
   * @param {Error} err Error (if any)
   * @param {Page} page Page that is viewed
   */
  Tracker.publishPageView = function publishPageView(err, page) {
    Tracker.events.emit('pageViewed', err, page);
  };

  return Tracker;
}();

exports.default = Tracker;


Tracker.events = new _events.EventEmitter();
},{"events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/index.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("./internal/Observable");
exports.Observable = Observable_1.Observable;
var ConnectableObservable_1 = require("./internal/observable/ConnectableObservable");
exports.ConnectableObservable = ConnectableObservable_1.ConnectableObservable;
var groupBy_1 = require("./internal/operators/groupBy");
exports.GroupedObservable = groupBy_1.GroupedObservable;
var observable_1 = require("./internal/symbol/observable");
exports.observable = observable_1.observable;
var Subject_1 = require("./internal/Subject");
exports.Subject = Subject_1.Subject;
var BehaviorSubject_1 = require("./internal/BehaviorSubject");
exports.BehaviorSubject = BehaviorSubject_1.BehaviorSubject;
var ReplaySubject_1 = require("./internal/ReplaySubject");
exports.ReplaySubject = ReplaySubject_1.ReplaySubject;
var AsyncSubject_1 = require("./internal/AsyncSubject");
exports.AsyncSubject = AsyncSubject_1.AsyncSubject;
var asap_1 = require("./internal/scheduler/asap");
exports.asap = asap_1.asap;
exports.asapScheduler = asap_1.asapScheduler;
var async_1 = require("./internal/scheduler/async");
exports.async = async_1.async;
exports.asyncScheduler = async_1.asyncScheduler;
var queue_1 = require("./internal/scheduler/queue");
exports.queue = queue_1.queue;
exports.queueScheduler = queue_1.queueScheduler;
var animationFrame_1 = require("./internal/scheduler/animationFrame");
exports.animationFrame = animationFrame_1.animationFrame;
exports.animationFrameScheduler = animationFrame_1.animationFrameScheduler;
var VirtualTimeScheduler_1 = require("./internal/scheduler/VirtualTimeScheduler");
exports.VirtualTimeScheduler = VirtualTimeScheduler_1.VirtualTimeScheduler;
exports.VirtualAction = VirtualTimeScheduler_1.VirtualAction;
var Scheduler_1 = require("./internal/Scheduler");
exports.Scheduler = Scheduler_1.Scheduler;
var Subscription_1 = require("./internal/Subscription");
exports.Subscription = Subscription_1.Subscription;
var Subscriber_1 = require("./internal/Subscriber");
exports.Subscriber = Subscriber_1.Subscriber;
var Notification_1 = require("./internal/Notification");
exports.Notification = Notification_1.Notification;
exports.NotificationKind = Notification_1.NotificationKind;
var pipe_1 = require("./internal/util/pipe");
exports.pipe = pipe_1.pipe;
var noop_1 = require("./internal/util/noop");
exports.noop = noop_1.noop;
var identity_1 = require("./internal/util/identity");
exports.identity = identity_1.identity;
var isObservable_1 = require("./internal/util/isObservable");
exports.isObservable = isObservable_1.isObservable;
var ArgumentOutOfRangeError_1 = require("./internal/util/ArgumentOutOfRangeError");
exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
var EmptyError_1 = require("./internal/util/EmptyError");
exports.EmptyError = EmptyError_1.EmptyError;
var ObjectUnsubscribedError_1 = require("./internal/util/ObjectUnsubscribedError");
exports.ObjectUnsubscribedError = ObjectUnsubscribedError_1.ObjectUnsubscribedError;
var UnsubscriptionError_1 = require("./internal/util/UnsubscriptionError");
exports.UnsubscriptionError = UnsubscriptionError_1.UnsubscriptionError;
var TimeoutError_1 = require("./internal/util/TimeoutError");
exports.TimeoutError = TimeoutError_1.TimeoutError;
var bindCallback_1 = require("./internal/observable/bindCallback");
exports.bindCallback = bindCallback_1.bindCallback;
var bindNodeCallback_1 = require("./internal/observable/bindNodeCallback");
exports.bindNodeCallback = bindNodeCallback_1.bindNodeCallback;
var combineLatest_1 = require("./internal/observable/combineLatest");
exports.combineLatest = combineLatest_1.combineLatest;
var concat_1 = require("./internal/observable/concat");
exports.concat = concat_1.concat;
var defer_1 = require("./internal/observable/defer");
exports.defer = defer_1.defer;
var empty_1 = require("./internal/observable/empty");
exports.empty = empty_1.empty;
var forkJoin_1 = require("./internal/observable/forkJoin");
exports.forkJoin = forkJoin_1.forkJoin;
var from_1 = require("./internal/observable/from");
exports.from = from_1.from;
var fromEvent_1 = require("./internal/observable/fromEvent");
exports.fromEvent = fromEvent_1.fromEvent;
var fromEventPattern_1 = require("./internal/observable/fromEventPattern");
exports.fromEventPattern = fromEventPattern_1.fromEventPattern;
var generate_1 = require("./internal/observable/generate");
exports.generate = generate_1.generate;
var iif_1 = require("./internal/observable/iif");
exports.iif = iif_1.iif;
var interval_1 = require("./internal/observable/interval");
exports.interval = interval_1.interval;
var merge_1 = require("./internal/observable/merge");
exports.merge = merge_1.merge;
var never_1 = require("./internal/observable/never");
exports.never = never_1.never;
var of_1 = require("./internal/observable/of");
exports.of = of_1.of;
var onErrorResumeNext_1 = require("./internal/observable/onErrorResumeNext");
exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
var pairs_1 = require("./internal/observable/pairs");
exports.pairs = pairs_1.pairs;
var partition_1 = require("./internal/observable/partition");
exports.partition = partition_1.partition;
var race_1 = require("./internal/observable/race");
exports.race = race_1.race;
var range_1 = require("./internal/observable/range");
exports.range = range_1.range;
var throwError_1 = require("./internal/observable/throwError");
exports.throwError = throwError_1.throwError;
var timer_1 = require("./internal/observable/timer");
exports.timer = timer_1.timer;
var using_1 = require("./internal/observable/using");
exports.using = using_1.using;
var zip_1 = require("./internal/observable/zip");
exports.zip = zip_1.zip;
var scheduled_1 = require("./internal/scheduled/scheduled");
exports.scheduled = scheduled_1.scheduled;
var empty_2 = require("./internal/observable/empty");
exports.EMPTY = empty_2.EMPTY;
var never_2 = require("./internal/observable/never");
exports.NEVER = never_2.NEVER;
var config_1 = require("./internal/config");
exports.config = config_1.config;

},{"./internal/AsyncSubject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/AsyncSubject.js","./internal/BehaviorSubject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/BehaviorSubject.js","./internal/Notification":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Notification.js","./internal/Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","./internal/ReplaySubject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/ReplaySubject.js","./internal/Scheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Scheduler.js","./internal/Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","./internal/Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","./internal/Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js","./internal/config":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/config.js","./internal/observable/ConnectableObservable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/ConnectableObservable.js","./internal/observable/bindCallback":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/bindCallback.js","./internal/observable/bindNodeCallback":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/bindNodeCallback.js","./internal/observable/combineLatest":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/combineLatest.js","./internal/observable/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/concat.js","./internal/observable/defer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/defer.js","./internal/observable/empty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/empty.js","./internal/observable/forkJoin":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/forkJoin.js","./internal/observable/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/from.js","./internal/observable/fromEvent":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/fromEvent.js","./internal/observable/fromEventPattern":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/fromEventPattern.js","./internal/observable/generate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/generate.js","./internal/observable/iif":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/iif.js","./internal/observable/interval":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/interval.js","./internal/observable/merge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/merge.js","./internal/observable/never":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/never.js","./internal/observable/of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/of.js","./internal/observable/onErrorResumeNext":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/onErrorResumeNext.js","./internal/observable/pairs":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/pairs.js","./internal/observable/partition":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/partition.js","./internal/observable/race":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/race.js","./internal/observable/range":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/range.js","./internal/observable/throwError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/throwError.js","./internal/observable/timer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/timer.js","./internal/observable/using":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/using.js","./internal/observable/zip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/zip.js","./internal/operators/groupBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/groupBy.js","./internal/scheduled/scheduled":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/scheduled.js","./internal/scheduler/VirtualTimeScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.js","./internal/scheduler/animationFrame":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/animationFrame.js","./internal/scheduler/asap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/asap.js","./internal/scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","./internal/scheduler/queue":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/queue.js","./internal/symbol/observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/observable.js","./internal/util/ArgumentOutOfRangeError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js","./internal/util/EmptyError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/EmptyError.js","./internal/util/ObjectUnsubscribedError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/ObjectUnsubscribedError.js","./internal/util/TimeoutError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/TimeoutError.js","./internal/util/UnsubscriptionError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/UnsubscriptionError.js","./internal/util/identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/identity.js","./internal/util/isObservable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isObservable.js","./internal/util/noop":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/noop.js","./internal/util/pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/pipe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/AsyncSubject.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subject_1 = require("./Subject");
var Subscription_1 = require("./Subscription");
var AsyncSubject = (function (_super) {
    __extends(AsyncSubject, _super);
    function AsyncSubject() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this.value = null;
        _this.hasNext = false;
        _this.hasCompleted = false;
        return _this;
    }
    AsyncSubject.prototype._subscribe = function (subscriber) {
        if (this.hasError) {
            subscriber.error(this.thrownError);
            return Subscription_1.Subscription.EMPTY;
        }
        else if (this.hasCompleted && this.hasNext) {
            subscriber.next(this.value);
            subscriber.complete();
            return Subscription_1.Subscription.EMPTY;
        }
        return _super.prototype._subscribe.call(this, subscriber);
    };
    AsyncSubject.prototype.next = function (value) {
        if (!this.hasCompleted) {
            this.value = value;
            this.hasNext = true;
        }
    };
    AsyncSubject.prototype.error = function (error) {
        if (!this.hasCompleted) {
            _super.prototype.error.call(this, error);
        }
    };
    AsyncSubject.prototype.complete = function () {
        this.hasCompleted = true;
        if (this.hasNext) {
            _super.prototype.next.call(this, this.value);
        }
        _super.prototype.complete.call(this);
    };
    return AsyncSubject;
}(Subject_1.Subject));
exports.AsyncSubject = AsyncSubject;

},{"./Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","./Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/BehaviorSubject.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subject_1 = require("./Subject");
var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
var BehaviorSubject = (function (_super) {
    __extends(BehaviorSubject, _super);
    function BehaviorSubject(_value) {
        var _this = _super.call(this) || this;
        _this._value = _value;
        return _this;
    }
    Object.defineProperty(BehaviorSubject.prototype, "value", {
        get: function () {
            return this.getValue();
        },
        enumerable: true,
        configurable: true
    });
    BehaviorSubject.prototype._subscribe = function (subscriber) {
        var subscription = _super.prototype._subscribe.call(this, subscriber);
        if (subscription && !subscription.closed) {
            subscriber.next(this._value);
        }
        return subscription;
    };
    BehaviorSubject.prototype.getValue = function () {
        if (this.hasError) {
            throw this.thrownError;
        }
        else if (this.closed) {
            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
        }
        else {
            return this._value;
        }
    };
    BehaviorSubject.prototype.next = function (value) {
        _super.prototype.next.call(this, this._value = value);
    };
    return BehaviorSubject;
}(Subject_1.Subject));
exports.BehaviorSubject = BehaviorSubject;

},{"./Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","./util/ObjectUnsubscribedError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/ObjectUnsubscribedError.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/InnerSubscriber.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("./Subscriber");
var InnerSubscriber = (function (_super) {
    __extends(InnerSubscriber, _super);
    function InnerSubscriber(parent, outerValue, outerIndex) {
        var _this = _super.call(this) || this;
        _this.parent = parent;
        _this.outerValue = outerValue;
        _this.outerIndex = outerIndex;
        _this.index = 0;
        return _this;
    }
    InnerSubscriber.prototype._next = function (value) {
        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
    };
    InnerSubscriber.prototype._error = function (error) {
        this.parent.notifyError(error, this);
        this.unsubscribe();
    };
    InnerSubscriber.prototype._complete = function () {
        this.parent.notifyComplete(this);
        this.unsubscribe();
    };
    return InnerSubscriber;
}(Subscriber_1.Subscriber));
exports.InnerSubscriber = InnerSubscriber;

},{"./Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Notification.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var empty_1 = require("./observable/empty");
var of_1 = require("./observable/of");
var throwError_1 = require("./observable/throwError");
var NotificationKind;
(function (NotificationKind) {
    NotificationKind["NEXT"] = "N";
    NotificationKind["ERROR"] = "E";
    NotificationKind["COMPLETE"] = "C";
})(NotificationKind = exports.NotificationKind || (exports.NotificationKind = {}));
var Notification = (function () {
    function Notification(kind, value, error) {
        this.kind = kind;
        this.value = value;
        this.error = error;
        this.hasValue = kind === 'N';
    }
    Notification.prototype.observe = function (observer) {
        switch (this.kind) {
            case 'N':
                return observer.next && observer.next(this.value);
            case 'E':
                return observer.error && observer.error(this.error);
            case 'C':
                return observer.complete && observer.complete();
        }
    };
    Notification.prototype.do = function (next, error, complete) {
        var kind = this.kind;
        switch (kind) {
            case 'N':
                return next && next(this.value);
            case 'E':
                return error && error(this.error);
            case 'C':
                return complete && complete();
        }
    };
    Notification.prototype.accept = function (nextOrObserver, error, complete) {
        if (nextOrObserver && typeof nextOrObserver.next === 'function') {
            return this.observe(nextOrObserver);
        }
        else {
            return this.do(nextOrObserver, error, complete);
        }
    };
    Notification.prototype.toObservable = function () {
        var kind = this.kind;
        switch (kind) {
            case 'N':
                return of_1.of(this.value);
            case 'E':
                return throwError_1.throwError(this.error);
            case 'C':
                return empty_1.empty();
        }
        throw new Error('unexpected notification kind value');
    };
    Notification.createNext = function (value) {
        if (typeof value !== 'undefined') {
            return new Notification('N', value);
        }
        return Notification.undefinedValueNotification;
    };
    Notification.createError = function (err) {
        return new Notification('E', undefined, err);
    };
    Notification.createComplete = function () {
        return Notification.completeNotification;
    };
    Notification.completeNotification = new Notification('C');
    Notification.undefinedValueNotification = new Notification('N', undefined);
    return Notification;
}());
exports.Notification = Notification;

},{"./observable/empty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/empty.js","./observable/of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/of.js","./observable/throwError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/throwError.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var canReportError_1 = require("./util/canReportError");
var toSubscriber_1 = require("./util/toSubscriber");
var observable_1 = require("./symbol/observable");
var pipe_1 = require("./util/pipe");
var config_1 = require("./config");
var Observable = (function () {
    function Observable(subscribe) {
        this._isScalar = false;
        if (subscribe) {
            this._subscribe = subscribe;
        }
    }
    Observable.prototype.lift = function (operator) {
        var observable = new Observable();
        observable.source = this;
        observable.operator = operator;
        return observable;
    };
    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
        var operator = this.operator;
        var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);
        if (operator) {
            sink.add(operator.call(sink, this.source));
        }
        else {
            sink.add(this.source || (config_1.config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
                this._subscribe(sink) :
                this._trySubscribe(sink));
        }
        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
            if (sink.syncErrorThrowable) {
                sink.syncErrorThrowable = false;
                if (sink.syncErrorThrown) {
                    throw sink.syncErrorValue;
                }
            }
        }
        return sink;
    };
    Observable.prototype._trySubscribe = function (sink) {
        try {
            return this._subscribe(sink);
        }
        catch (err) {
            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
                sink.syncErrorThrown = true;
                sink.syncErrorValue = err;
            }
            if (canReportError_1.canReportError(sink)) {
                sink.error(err);
            }
            else {
                console.warn(err);
            }
        }
    };
    Observable.prototype.forEach = function (next, promiseCtor) {
        var _this = this;
        promiseCtor = getPromiseCtor(promiseCtor);
        return new promiseCtor(function (resolve, reject) {
            var subscription;
            subscription = _this.subscribe(function (value) {
                try {
                    next(value);
                }
                catch (err) {
                    reject(err);
                    if (subscription) {
                        subscription.unsubscribe();
                    }
                }
            }, reject, resolve);
        });
    };
    Observable.prototype._subscribe = function (subscriber) {
        var source = this.source;
        return source && source.subscribe(subscriber);
    };
    Observable.prototype[observable_1.observable] = function () {
        return this;
    };
    Observable.prototype.pipe = function () {
        var operations = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            operations[_i] = arguments[_i];
        }
        if (operations.length === 0) {
            return this;
        }
        return pipe_1.pipeFromArray(operations)(this);
    };
    Observable.prototype.toPromise = function (promiseCtor) {
        var _this = this;
        promiseCtor = getPromiseCtor(promiseCtor);
        return new promiseCtor(function (resolve, reject) {
            var value;
            _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });
        });
    };
    Observable.create = function (subscribe) {
        return new Observable(subscribe);
    };
    return Observable;
}());
exports.Observable = Observable;
function getPromiseCtor(promiseCtor) {
    if (!promiseCtor) {
        promiseCtor = config_1.config.Promise || Promise;
    }
    if (!promiseCtor) {
        throw new Error('no Promise impl found');
    }
    return promiseCtor;
}

},{"./config":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/config.js","./symbol/observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/observable.js","./util/canReportError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/canReportError.js","./util/pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/pipe.js","./util/toSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/toSubscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observer.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var config_1 = require("./config");
var hostReportError_1 = require("./util/hostReportError");
exports.empty = {
    closed: true,
    next: function (value) { },
    error: function (err) {
        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
            throw err;
        }
        else {
            hostReportError_1.hostReportError(err);
        }
    },
    complete: function () { }
};

},{"./config":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/config.js","./util/hostReportError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/hostReportError.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/OuterSubscriber.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("./Subscriber");
var OuterSubscriber = (function (_super) {
    __extends(OuterSubscriber, _super);
    function OuterSubscriber() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
        this.destination.next(innerValue);
    };
    OuterSubscriber.prototype.notifyError = function (error, innerSub) {
        this.destination.error(error);
    };
    OuterSubscriber.prototype.notifyComplete = function (innerSub) {
        this.destination.complete();
    };
    return OuterSubscriber;
}(Subscriber_1.Subscriber));
exports.OuterSubscriber = OuterSubscriber;

},{"./Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/ReplaySubject.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subject_1 = require("./Subject");
var queue_1 = require("./scheduler/queue");
var Subscription_1 = require("./Subscription");
var observeOn_1 = require("./operators/observeOn");
var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
var SubjectSubscription_1 = require("./SubjectSubscription");
var ReplaySubject = (function (_super) {
    __extends(ReplaySubject, _super);
    function ReplaySubject(bufferSize, windowTime, scheduler) {
        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
        var _this = _super.call(this) || this;
        _this.scheduler = scheduler;
        _this._events = [];
        _this._infiniteTimeWindow = false;
        _this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
        _this._windowTime = windowTime < 1 ? 1 : windowTime;
        if (windowTime === Number.POSITIVE_INFINITY) {
            _this._infiniteTimeWindow = true;
            _this.next = _this.nextInfiniteTimeWindow;
        }
        else {
            _this.next = _this.nextTimeWindow;
        }
        return _this;
    }
    ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) {
        if (!this.isStopped) {
            var _events = this._events;
            _events.push(value);
            if (_events.length > this._bufferSize) {
                _events.shift();
            }
        }
        _super.prototype.next.call(this, value);
    };
    ReplaySubject.prototype.nextTimeWindow = function (value) {
        if (!this.isStopped) {
            this._events.push(new ReplayEvent(this._getNow(), value));
            this._trimBufferThenGetEvents();
        }
        _super.prototype.next.call(this, value);
    };
    ReplaySubject.prototype._subscribe = function (subscriber) {
        var _infiniteTimeWindow = this._infiniteTimeWindow;
        var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();
        var scheduler = this.scheduler;
        var len = _events.length;
        var subscription;
        if (this.closed) {
            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
        }
        else if (this.isStopped || this.hasError) {
            subscription = Subscription_1.Subscription.EMPTY;
        }
        else {
            this.observers.push(subscriber);
            subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber);
        }
        if (scheduler) {
            subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));
        }
        if (_infiniteTimeWindow) {
            for (var i = 0; i < len && !subscriber.closed; i++) {
                subscriber.next(_events[i]);
            }
        }
        else {
            for (var i = 0; i < len && !subscriber.closed; i++) {
                subscriber.next(_events[i].value);
            }
        }
        if (this.hasError) {
            subscriber.error(this.thrownError);
        }
        else if (this.isStopped) {
            subscriber.complete();
        }
        return subscription;
    };
    ReplaySubject.prototype._getNow = function () {
        return (this.scheduler || queue_1.queue).now();
    };
    ReplaySubject.prototype._trimBufferThenGetEvents = function () {
        var now = this._getNow();
        var _bufferSize = this._bufferSize;
        var _windowTime = this._windowTime;
        var _events = this._events;
        var eventsCount = _events.length;
        var spliceCount = 0;
        while (spliceCount < eventsCount) {
            if ((now - _events[spliceCount].time) < _windowTime) {
                break;
            }
            spliceCount++;
        }
        if (eventsCount > _bufferSize) {
            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
        }
        if (spliceCount > 0) {
            _events.splice(0, spliceCount);
        }
        return _events;
    };
    return ReplaySubject;
}(Subject_1.Subject));
exports.ReplaySubject = ReplaySubject;
var ReplayEvent = (function () {
    function ReplayEvent(time, value) {
        this.time = time;
        this.value = value;
    }
    return ReplayEvent;
}());

},{"./Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","./SubjectSubscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/SubjectSubscription.js","./Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js","./operators/observeOn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/observeOn.js","./scheduler/queue":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/queue.js","./util/ObjectUnsubscribedError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/ObjectUnsubscribedError.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Scheduler.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Scheduler = (function () {
    function Scheduler(SchedulerAction, now) {
        if (now === void 0) { now = Scheduler.now; }
        this.SchedulerAction = SchedulerAction;
        this.now = now;
    }
    Scheduler.prototype.schedule = function (work, delay, state) {
        if (delay === void 0) { delay = 0; }
        return new this.SchedulerAction(this, work).schedule(state, delay);
    };
    Scheduler.now = function () { return Date.now(); };
    return Scheduler;
}());
exports.Scheduler = Scheduler;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("./Observable");
var Subscriber_1 = require("./Subscriber");
var Subscription_1 = require("./Subscription");
var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
var SubjectSubscription_1 = require("./SubjectSubscription");
var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
var SubjectSubscriber = (function (_super) {
    __extends(SubjectSubscriber, _super);
    function SubjectSubscriber(destination) {
        var _this = _super.call(this, destination) || this;
        _this.destination = destination;
        return _this;
    }
    return SubjectSubscriber;
}(Subscriber_1.Subscriber));
exports.SubjectSubscriber = SubjectSubscriber;
var Subject = (function (_super) {
    __extends(Subject, _super);
    function Subject() {
        var _this = _super.call(this) || this;
        _this.observers = [];
        _this.closed = false;
        _this.isStopped = false;
        _this.hasError = false;
        _this.thrownError = null;
        return _this;
    }
    Subject.prototype[rxSubscriber_1.rxSubscriber] = function () {
        return new SubjectSubscriber(this);
    };
    Subject.prototype.lift = function (operator) {
        var subject = new AnonymousSubject(this, this);
        subject.operator = operator;
        return subject;
    };
    Subject.prototype.next = function (value) {
        if (this.closed) {
            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
        }
        if (!this.isStopped) {
            var observers = this.observers;
            var len = observers.length;
            var copy = observers.slice();
            for (var i = 0; i < len; i++) {
                copy[i].next(value);
            }
        }
    };
    Subject.prototype.error = function (err) {
        if (this.closed) {
            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
        }
        this.hasError = true;
        this.thrownError = err;
        this.isStopped = true;
        var observers = this.observers;
        var len = observers.length;
        var copy = observers.slice();
        for (var i = 0; i < len; i++) {
            copy[i].error(err);
        }
        this.observers.length = 0;
    };
    Subject.prototype.complete = function () {
        if (this.closed) {
            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
        }
        this.isStopped = true;
        var observers = this.observers;
        var len = observers.length;
        var copy = observers.slice();
        for (var i = 0; i < len; i++) {
            copy[i].complete();
        }
        this.observers.length = 0;
    };
    Subject.prototype.unsubscribe = function () {
        this.isStopped = true;
        this.closed = true;
        this.observers = null;
    };
    Subject.prototype._trySubscribe = function (subscriber) {
        if (this.closed) {
            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
        }
        else {
            return _super.prototype._trySubscribe.call(this, subscriber);
        }
    };
    Subject.prototype._subscribe = function (subscriber) {
        if (this.closed) {
            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
        }
        else if (this.hasError) {
            subscriber.error(this.thrownError);
            return Subscription_1.Subscription.EMPTY;
        }
        else if (this.isStopped) {
            subscriber.complete();
            return Subscription_1.Subscription.EMPTY;
        }
        else {
            this.observers.push(subscriber);
            return new SubjectSubscription_1.SubjectSubscription(this, subscriber);
        }
    };
    Subject.prototype.asObservable = function () {
        var observable = new Observable_1.Observable();
        observable.source = this;
        return observable;
    };
    Subject.create = function (destination, source) {
        return new AnonymousSubject(destination, source);
    };
    return Subject;
}(Observable_1.Observable));
exports.Subject = Subject;
var AnonymousSubject = (function (_super) {
    __extends(AnonymousSubject, _super);
    function AnonymousSubject(destination, source) {
        var _this = _super.call(this) || this;
        _this.destination = destination;
        _this.source = source;
        return _this;
    }
    AnonymousSubject.prototype.next = function (value) {
        var destination = this.destination;
        if (destination && destination.next) {
            destination.next(value);
        }
    };
    AnonymousSubject.prototype.error = function (err) {
        var destination = this.destination;
        if (destination && destination.error) {
            this.destination.error(err);
        }
    };
    AnonymousSubject.prototype.complete = function () {
        var destination = this.destination;
        if (destination && destination.complete) {
            this.destination.complete();
        }
    };
    AnonymousSubject.prototype._subscribe = function (subscriber) {
        var source = this.source;
        if (source) {
            return this.source.subscribe(subscriber);
        }
        else {
            return Subscription_1.Subscription.EMPTY;
        }
    };
    return AnonymousSubject;
}(Subject));
exports.AnonymousSubject = AnonymousSubject;

},{"../internal/symbol/rxSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/rxSubscriber.js","./Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","./SubjectSubscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/SubjectSubscription.js","./Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","./Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js","./util/ObjectUnsubscribedError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/ObjectUnsubscribedError.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/SubjectSubscription.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscription_1 = require("./Subscription");
var SubjectSubscription = (function (_super) {
    __extends(SubjectSubscription, _super);
    function SubjectSubscription(subject, subscriber) {
        var _this = _super.call(this) || this;
        _this.subject = subject;
        _this.subscriber = subscriber;
        _this.closed = false;
        return _this;
    }
    SubjectSubscription.prototype.unsubscribe = function () {
        if (this.closed) {
            return;
        }
        this.closed = true;
        var subject = this.subject;
        var observers = subject.observers;
        this.subject = null;
        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
            return;
        }
        var subscriberIndex = observers.indexOf(this.subscriber);
        if (subscriberIndex !== -1) {
            observers.splice(subscriberIndex, 1);
        }
    };
    return SubjectSubscription;
}(Subscription_1.Subscription));
exports.SubjectSubscription = SubjectSubscription;

},{"./Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var isFunction_1 = require("./util/isFunction");
var Observer_1 = require("./Observer");
var Subscription_1 = require("./Subscription");
var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
var config_1 = require("./config");
var hostReportError_1 = require("./util/hostReportError");
var Subscriber = (function (_super) {
    __extends(Subscriber, _super);
    function Subscriber(destinationOrNext, error, complete) {
        var _this = _super.call(this) || this;
        _this.syncErrorValue = null;
        _this.syncErrorThrown = false;
        _this.syncErrorThrowable = false;
        _this.isStopped = false;
        switch (arguments.length) {
            case 0:
                _this.destination = Observer_1.empty;
                break;
            case 1:
                if (!destinationOrNext) {
                    _this.destination = Observer_1.empty;
                    break;
                }
                if (typeof destinationOrNext === 'object') {
                    if (destinationOrNext instanceof Subscriber) {
                        _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
                        _this.destination = destinationOrNext;
                        destinationOrNext.add(_this);
                    }
                    else {
                        _this.syncErrorThrowable = true;
                        _this.destination = new SafeSubscriber(_this, destinationOrNext);
                    }
                    break;
                }
            default:
                _this.syncErrorThrowable = true;
                _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete);
                break;
        }
        return _this;
    }
    Subscriber.prototype[rxSubscriber_1.rxSubscriber] = function () { return this; };
    Subscriber.create = function (next, error, complete) {
        var subscriber = new Subscriber(next, error, complete);
        subscriber.syncErrorThrowable = false;
        return subscriber;
    };
    Subscriber.prototype.next = function (value) {
        if (!this.isStopped) {
            this._next(value);
        }
    };
    Subscriber.prototype.error = function (err) {
        if (!this.isStopped) {
            this.isStopped = true;
            this._error(err);
        }
    };
    Subscriber.prototype.complete = function () {
        if (!this.isStopped) {
            this.isStopped = true;
            this._complete();
        }
    };
    Subscriber.prototype.unsubscribe = function () {
        if (this.closed) {
            return;
        }
        this.isStopped = true;
        _super.prototype.unsubscribe.call(this);
    };
    Subscriber.prototype._next = function (value) {
        this.destination.next(value);
    };
    Subscriber.prototype._error = function (err) {
        this.destination.error(err);
        this.unsubscribe();
    };
    Subscriber.prototype._complete = function () {
        this.destination.complete();
        this.unsubscribe();
    };
    Subscriber.prototype._unsubscribeAndRecycle = function () {
        var _parentOrParents = this._parentOrParents;
        this._parentOrParents = null;
        this.unsubscribe();
        this.closed = false;
        this.isStopped = false;
        this._parentOrParents = _parentOrParents;
        return this;
    };
    return Subscriber;
}(Subscription_1.Subscription));
exports.Subscriber = Subscriber;
var SafeSubscriber = (function (_super) {
    __extends(SafeSubscriber, _super);
    function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {
        var _this = _super.call(this) || this;
        _this._parentSubscriber = _parentSubscriber;
        var next;
        var context = _this;
        if (isFunction_1.isFunction(observerOrNext)) {
            next = observerOrNext;
        }
        else if (observerOrNext) {
            next = observerOrNext.next;
            error = observerOrNext.error;
            complete = observerOrNext.complete;
            if (observerOrNext !== Observer_1.empty) {
                context = Object.create(observerOrNext);
                if (isFunction_1.isFunction(context.unsubscribe)) {
                    _this.add(context.unsubscribe.bind(context));
                }
                context.unsubscribe = _this.unsubscribe.bind(_this);
            }
        }
        _this._context = context;
        _this._next = next;
        _this._error = error;
        _this._complete = complete;
        return _this;
    }
    SafeSubscriber.prototype.next = function (value) {
        if (!this.isStopped && this._next) {
            var _parentSubscriber = this._parentSubscriber;
            if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
                this.__tryOrUnsub(this._next, value);
            }
            else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
                this.unsubscribe();
            }
        }
    };
    SafeSubscriber.prototype.error = function (err) {
        if (!this.isStopped) {
            var _parentSubscriber = this._parentSubscriber;
            var useDeprecatedSynchronousErrorHandling = config_1.config.useDeprecatedSynchronousErrorHandling;
            if (this._error) {
                if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
                    this.__tryOrUnsub(this._error, err);
                    this.unsubscribe();
                }
                else {
                    this.__tryOrSetError(_parentSubscriber, this._error, err);
                    this.unsubscribe();
                }
            }
            else if (!_parentSubscriber.syncErrorThrowable) {
                this.unsubscribe();
                if (useDeprecatedSynchronousErrorHandling) {
                    throw err;
                }
                hostReportError_1.hostReportError(err);
            }
            else {
                if (useDeprecatedSynchronousErrorHandling) {
                    _parentSubscriber.syncErrorValue = err;
                    _parentSubscriber.syncErrorThrown = true;
                }
                else {
                    hostReportError_1.hostReportError(err);
                }
                this.unsubscribe();
            }
        }
    };
    SafeSubscriber.prototype.complete = function () {
        var _this = this;
        if (!this.isStopped) {
            var _parentSubscriber = this._parentSubscriber;
            if (this._complete) {
                var wrappedComplete = function () { return _this._complete.call(_this._context); };
                if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
                    this.__tryOrUnsub(wrappedComplete);
                    this.unsubscribe();
                }
                else {
                    this.__tryOrSetError(_parentSubscriber, wrappedComplete);
                    this.unsubscribe();
                }
            }
            else {
                this.unsubscribe();
            }
        }
    };
    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
        try {
            fn.call(this._context, value);
        }
        catch (err) {
            this.unsubscribe();
            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
                throw err;
            }
            else {
                hostReportError_1.hostReportError(err);
            }
        }
    };
    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
        if (!config_1.config.useDeprecatedSynchronousErrorHandling) {
            throw new Error('bad call');
        }
        try {
            fn.call(this._context, value);
        }
        catch (err) {
            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
                parent.syncErrorValue = err;
                parent.syncErrorThrown = true;
                return true;
            }
            else {
                hostReportError_1.hostReportError(err);
                return true;
            }
        }
        return false;
    };
    SafeSubscriber.prototype._unsubscribe = function () {
        var _parentSubscriber = this._parentSubscriber;
        this._context = null;
        this._parentSubscriber = null;
        _parentSubscriber.unsubscribe();
    };
    return SafeSubscriber;
}(Subscriber));
exports.SafeSubscriber = SafeSubscriber;

},{"../internal/symbol/rxSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/rxSubscriber.js","./Observer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observer.js","./Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js","./config":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/config.js","./util/hostReportError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/hostReportError.js","./util/isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isFunction.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var isArray_1 = require("./util/isArray");
var isObject_1 = require("./util/isObject");
var isFunction_1 = require("./util/isFunction");
var UnsubscriptionError_1 = require("./util/UnsubscriptionError");
var Subscription = (function () {
    function Subscription(unsubscribe) {
        this.closed = false;
        this._parentOrParents = null;
        this._subscriptions = null;
        if (unsubscribe) {
            this._ctorUnsubscribe = true;
            this._unsubscribe = unsubscribe;
        }
    }
    Subscription.prototype.unsubscribe = function () {
        var errors;
        if (this.closed) {
            return;
        }
        var _a = this, _parentOrParents = _a._parentOrParents, _ctorUnsubscribe = _a._ctorUnsubscribe, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
        this.closed = true;
        this._parentOrParents = null;
        this._subscriptions = null;
        if (_parentOrParents instanceof Subscription) {
            _parentOrParents.remove(this);
        }
        else if (_parentOrParents !== null) {
            for (var index = 0; index < _parentOrParents.length; ++index) {
                var parent_1 = _parentOrParents[index];
                parent_1.remove(this);
            }
        }
        if (isFunction_1.isFunction(_unsubscribe)) {
            if (_ctorUnsubscribe) {
                this._unsubscribe = undefined;
            }
            try {
                _unsubscribe.call(this);
            }
            catch (e) {
                errors = e instanceof UnsubscriptionError_1.UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];
            }
        }
        if (isArray_1.isArray(_subscriptions)) {
            var index = -1;
            var len = _subscriptions.length;
            while (++index < len) {
                var sub = _subscriptions[index];
                if (isObject_1.isObject(sub)) {
                    try {
                        sub.unsubscribe();
                    }
                    catch (e) {
                        errors = errors || [];
                        if (e instanceof UnsubscriptionError_1.UnsubscriptionError) {
                            errors = errors.concat(flattenUnsubscriptionErrors(e.errors));
                        }
                        else {
                            errors.push(e);
                        }
                    }
                }
            }
        }
        if (errors) {
            throw new UnsubscriptionError_1.UnsubscriptionError(errors);
        }
    };
    Subscription.prototype.add = function (teardown) {
        var subscription = teardown;
        if (!teardown) {
            return Subscription.EMPTY;
        }
        switch (typeof teardown) {
            case 'function':
                subscription = new Subscription(teardown);
            case 'object':
                if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {
                    return subscription;
                }
                else if (this.closed) {
                    subscription.unsubscribe();
                    return subscription;
                }
                else if (!(subscription instanceof Subscription)) {
                    var tmp = subscription;
                    subscription = new Subscription();
                    subscription._subscriptions = [tmp];
                }
                break;
            default: {
                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
            }
        }
        var _parentOrParents = subscription._parentOrParents;
        if (_parentOrParents === null) {
            subscription._parentOrParents = this;
        }
        else if (_parentOrParents instanceof Subscription) {
            if (_parentOrParents === this) {
                return subscription;
            }
            subscription._parentOrParents = [_parentOrParents, this];
        }
        else if (_parentOrParents.indexOf(this) === -1) {
            _parentOrParents.push(this);
        }
        else {
            return subscription;
        }
        var subscriptions = this._subscriptions;
        if (subscriptions === null) {
            this._subscriptions = [subscription];
        }
        else {
            subscriptions.push(subscription);
        }
        return subscription;
    };
    Subscription.prototype.remove = function (subscription) {
        var subscriptions = this._subscriptions;
        if (subscriptions) {
            var subscriptionIndex = subscriptions.indexOf(subscription);
            if (subscriptionIndex !== -1) {
                subscriptions.splice(subscriptionIndex, 1);
            }
        }
    };
    Subscription.EMPTY = (function (empty) {
        empty.closed = true;
        return empty;
    }(new Subscription()));
    return Subscription;
}());
exports.Subscription = Subscription;
function flattenUnsubscriptionErrors(errors) {
    return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []);
}

},{"./util/UnsubscriptionError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/UnsubscriptionError.js","./util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js","./util/isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isFunction.js","./util/isObject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isObject.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/config.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var _enable_super_gross_mode_that_will_cause_bad_things = false;
exports.config = {
    Promise: undefined,
    set useDeprecatedSynchronousErrorHandling(value) {
        if (value) {
            var error = new Error();
            console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
        }
        else if (_enable_super_gross_mode_that_will_cause_bad_things) {
            console.log('RxJS: Back to a better error behavior. Thank you. <3');
        }
        _enable_super_gross_mode_that_will_cause_bad_things = value;
    },
    get useDeprecatedSynchronousErrorHandling() {
        return _enable_super_gross_mode_that_will_cause_bad_things;
    },
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("./Subscriber");
var Observable_1 = require("./Observable");
var subscribeTo_1 = require("./util/subscribeTo");
var SimpleInnerSubscriber = (function (_super) {
    __extends(SimpleInnerSubscriber, _super);
    function SimpleInnerSubscriber(parent) {
        var _this = _super.call(this) || this;
        _this.parent = parent;
        return _this;
    }
    SimpleInnerSubscriber.prototype._next = function (value) {
        this.parent.notifyNext(value);
    };
    SimpleInnerSubscriber.prototype._error = function (error) {
        this.parent.notifyError(error);
        this.unsubscribe();
    };
    SimpleInnerSubscriber.prototype._complete = function () {
        this.parent.notifyComplete();
        this.unsubscribe();
    };
    return SimpleInnerSubscriber;
}(Subscriber_1.Subscriber));
exports.SimpleInnerSubscriber = SimpleInnerSubscriber;
var ComplexInnerSubscriber = (function (_super) {
    __extends(ComplexInnerSubscriber, _super);
    function ComplexInnerSubscriber(parent, outerValue, outerIndex) {
        var _this = _super.call(this) || this;
        _this.parent = parent;
        _this.outerValue = outerValue;
        _this.outerIndex = outerIndex;
        return _this;
    }
    ComplexInnerSubscriber.prototype._next = function (value) {
        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this);
    };
    ComplexInnerSubscriber.prototype._error = function (error) {
        this.parent.notifyError(error);
        this.unsubscribe();
    };
    ComplexInnerSubscriber.prototype._complete = function () {
        this.parent.notifyComplete(this);
        this.unsubscribe();
    };
    return ComplexInnerSubscriber;
}(Subscriber_1.Subscriber));
exports.ComplexInnerSubscriber = ComplexInnerSubscriber;
var SimpleOuterSubscriber = (function (_super) {
    __extends(SimpleOuterSubscriber, _super);
    function SimpleOuterSubscriber() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    SimpleOuterSubscriber.prototype.notifyNext = function (innerValue) {
        this.destination.next(innerValue);
    };
    SimpleOuterSubscriber.prototype.notifyError = function (err) {
        this.destination.error(err);
    };
    SimpleOuterSubscriber.prototype.notifyComplete = function () {
        this.destination.complete();
    };
    return SimpleOuterSubscriber;
}(Subscriber_1.Subscriber));
exports.SimpleOuterSubscriber = SimpleOuterSubscriber;
var ComplexOuterSubscriber = (function (_super) {
    __extends(ComplexOuterSubscriber, _super);
    function ComplexOuterSubscriber() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    ComplexOuterSubscriber.prototype.notifyNext = function (_outerValue, innerValue, _outerIndex, _innerSub) {
        this.destination.next(innerValue);
    };
    ComplexOuterSubscriber.prototype.notifyError = function (error) {
        this.destination.error(error);
    };
    ComplexOuterSubscriber.prototype.notifyComplete = function (_innerSub) {
        this.destination.complete();
    };
    return ComplexOuterSubscriber;
}(Subscriber_1.Subscriber));
exports.ComplexOuterSubscriber = ComplexOuterSubscriber;
function innerSubscribe(result, innerSubscriber) {
    if (innerSubscriber.closed) {
        return undefined;
    }
    if (result instanceof Observable_1.Observable) {
        return result.subscribe(innerSubscriber);
    }
    var subscription;
    try {
        subscription = subscribeTo_1.subscribeTo(result)(innerSubscriber);
    }
    catch (error) {
        innerSubscriber.error(error);
    }
    return subscription;
}
exports.innerSubscribe = innerSubscribe;

},{"./Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","./Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","./util/subscribeTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeTo.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/ConnectableObservable.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subject_1 = require("../Subject");
var Observable_1 = require("../Observable");
var Subscriber_1 = require("../Subscriber");
var Subscription_1 = require("../Subscription");
var refCount_1 = require("../operators/refCount");
var ConnectableObservable = (function (_super) {
    __extends(ConnectableObservable, _super);
    function ConnectableObservable(source, subjectFactory) {
        var _this = _super.call(this) || this;
        _this.source = source;
        _this.subjectFactory = subjectFactory;
        _this._refCount = 0;
        _this._isComplete = false;
        return _this;
    }
    ConnectableObservable.prototype._subscribe = function (subscriber) {
        return this.getSubject().subscribe(subscriber);
    };
    ConnectableObservable.prototype.getSubject = function () {
        var subject = this._subject;
        if (!subject || subject.isStopped) {
            this._subject = this.subjectFactory();
        }
        return this._subject;
    };
    ConnectableObservable.prototype.connect = function () {
        var connection = this._connection;
        if (!connection) {
            this._isComplete = false;
            connection = this._connection = new Subscription_1.Subscription();
            connection.add(this.source
                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
            if (connection.closed) {
                this._connection = null;
                connection = Subscription_1.Subscription.EMPTY;
            }
        }
        return connection;
    };
    ConnectableObservable.prototype.refCount = function () {
        return refCount_1.refCount()(this);
    };
    return ConnectableObservable;
}(Observable_1.Observable));
exports.ConnectableObservable = ConnectableObservable;
exports.connectableObservableDescriptor = (function () {
    var connectableProto = ConnectableObservable.prototype;
    return {
        operator: { value: null },
        _refCount: { value: 0, writable: true },
        _subject: { value: null, writable: true },
        _connection: { value: null, writable: true },
        _subscribe: { value: connectableProto._subscribe },
        _isComplete: { value: connectableProto._isComplete, writable: true },
        getSubject: { value: connectableProto.getSubject },
        connect: { value: connectableProto.connect },
        refCount: { value: connectableProto.refCount }
    };
})();
var ConnectableSubscriber = (function (_super) {
    __extends(ConnectableSubscriber, _super);
    function ConnectableSubscriber(destination, connectable) {
        var _this = _super.call(this, destination) || this;
        _this.connectable = connectable;
        return _this;
    }
    ConnectableSubscriber.prototype._error = function (err) {
        this._unsubscribe();
        _super.prototype._error.call(this, err);
    };
    ConnectableSubscriber.prototype._complete = function () {
        this.connectable._isComplete = true;
        this._unsubscribe();
        _super.prototype._complete.call(this);
    };
    ConnectableSubscriber.prototype._unsubscribe = function () {
        var connectable = this.connectable;
        if (connectable) {
            this.connectable = null;
            var connection = connectable._connection;
            connectable._refCount = 0;
            connectable._subject = null;
            connectable._connection = null;
            if (connection) {
                connection.unsubscribe();
            }
        }
    };
    return ConnectableSubscriber;
}(Subject_1.SubjectSubscriber));
var RefCountOperator = (function () {
    function RefCountOperator(connectable) {
        this.connectable = connectable;
    }
    RefCountOperator.prototype.call = function (subscriber, source) {
        var connectable = this.connectable;
        connectable._refCount++;
        var refCounter = new RefCountSubscriber(subscriber, connectable);
        var subscription = source.subscribe(refCounter);
        if (!refCounter.closed) {
            refCounter.connection = connectable.connect();
        }
        return subscription;
    };
    return RefCountOperator;
}());
var RefCountSubscriber = (function (_super) {
    __extends(RefCountSubscriber, _super);
    function RefCountSubscriber(destination, connectable) {
        var _this = _super.call(this, destination) || this;
        _this.connectable = connectable;
        return _this;
    }
    RefCountSubscriber.prototype._unsubscribe = function () {
        var connectable = this.connectable;
        if (!connectable) {
            this.connection = null;
            return;
        }
        this.connectable = null;
        var refCount = connectable._refCount;
        if (refCount <= 0) {
            this.connection = null;
            return;
        }
        connectable._refCount = refCount - 1;
        if (refCount > 1) {
            this.connection = null;
            return;
        }
        var connection = this.connection;
        var sharedConnection = connectable._connection;
        this.connection = null;
        if (sharedConnection && (!connection || sharedConnection === connection)) {
            sharedConnection.unsubscribe();
        }
    };
    return RefCountSubscriber;
}(Subscriber_1.Subscriber));

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js","../operators/refCount":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/refCount.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/SubscribeOnObservable.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var asap_1 = require("../scheduler/asap");
var isNumeric_1 = require("../util/isNumeric");
var SubscribeOnObservable = (function (_super) {
    __extends(SubscribeOnObservable, _super);
    function SubscribeOnObservable(source, delayTime, scheduler) {
        if (delayTime === void 0) { delayTime = 0; }
        if (scheduler === void 0) { scheduler = asap_1.asap; }
        var _this = _super.call(this) || this;
        _this.source = source;
        _this.delayTime = delayTime;
        _this.scheduler = scheduler;
        if (!isNumeric_1.isNumeric(delayTime) || delayTime < 0) {
            _this.delayTime = 0;
        }
        if (!scheduler || typeof scheduler.schedule !== 'function') {
            _this.scheduler = asap_1.asap;
        }
        return _this;
    }
    SubscribeOnObservable.create = function (source, delay, scheduler) {
        if (delay === void 0) { delay = 0; }
        if (scheduler === void 0) { scheduler = asap_1.asap; }
        return new SubscribeOnObservable(source, delay, scheduler);
    };
    SubscribeOnObservable.dispatch = function (arg) {
        var source = arg.source, subscriber = arg.subscriber;
        return this.add(source.subscribe(subscriber));
    };
    SubscribeOnObservable.prototype._subscribe = function (subscriber) {
        var delay = this.delayTime;
        var source = this.source;
        var scheduler = this.scheduler;
        return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {
            source: source, subscriber: subscriber
        });
    };
    return SubscribeOnObservable;
}(Observable_1.Observable));
exports.SubscribeOnObservable = SubscribeOnObservable;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../scheduler/asap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/asap.js","../util/isNumeric":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isNumeric.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/bindCallback.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var AsyncSubject_1 = require("../AsyncSubject");
var map_1 = require("../operators/map");
var canReportError_1 = require("../util/canReportError");
var isArray_1 = require("../util/isArray");
var isScheduler_1 = require("../util/isScheduler");
function bindCallback(callbackFunc, resultSelector, scheduler) {
    if (resultSelector) {
        if (isScheduler_1.isScheduler(resultSelector)) {
            scheduler = resultSelector;
        }
        else {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
            };
        }
    }
    return function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var context = this;
        var subject;
        var params = {
            context: context,
            subject: subject,
            callbackFunc: callbackFunc,
            scheduler: scheduler,
        };
        return new Observable_1.Observable(function (subscriber) {
            if (!scheduler) {
                if (!subject) {
                    subject = new AsyncSubject_1.AsyncSubject();
                    var handler = function () {
                        var innerArgs = [];
                        for (var _i = 0; _i < arguments.length; _i++) {
                            innerArgs[_i] = arguments[_i];
                        }
                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
                        subject.complete();
                    };
                    try {
                        callbackFunc.apply(context, args.concat([handler]));
                    }
                    catch (err) {
                        if (canReportError_1.canReportError(subject)) {
                            subject.error(err);
                        }
                        else {
                            console.warn(err);
                        }
                    }
                }
                return subject.subscribe(subscriber);
            }
            else {
                var state = {
                    args: args, subscriber: subscriber, params: params,
                };
                return scheduler.schedule(dispatch, 0, state);
            }
        });
    };
}
exports.bindCallback = bindCallback;
function dispatch(state) {
    var _this = this;
    var self = this;
    var args = state.args, subscriber = state.subscriber, params = state.params;
    var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler;
    var subject = params.subject;
    if (!subject) {
        subject = params.subject = new AsyncSubject_1.AsyncSubject();
        var handler = function () {
            var innerArgs = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                innerArgs[_i] = arguments[_i];
            }
            var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
            _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
        };
        try {
            callbackFunc.apply(context, args.concat([handler]));
        }
        catch (err) {
            subject.error(err);
        }
    }
    this.add(subject.subscribe(subscriber));
}
function dispatchNext(state) {
    var value = state.value, subject = state.subject;
    subject.next(value);
    subject.complete();
}
function dispatchError(state) {
    var err = state.err, subject = state.subject;
    subject.error(err);
}

},{"../AsyncSubject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/AsyncSubject.js","../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../operators/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js","../util/canReportError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/canReportError.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js","../util/isScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/bindNodeCallback.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var AsyncSubject_1 = require("../AsyncSubject");
var map_1 = require("../operators/map");
var canReportError_1 = require("../util/canReportError");
var isScheduler_1 = require("../util/isScheduler");
var isArray_1 = require("../util/isArray");
function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
    if (resultSelector) {
        if (isScheduler_1.isScheduler(resultSelector)) {
            scheduler = resultSelector;
        }
        else {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
            };
        }
    }
    return function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var params = {
            subject: undefined,
            args: args,
            callbackFunc: callbackFunc,
            scheduler: scheduler,
            context: this,
        };
        return new Observable_1.Observable(function (subscriber) {
            var context = params.context;
            var subject = params.subject;
            if (!scheduler) {
                if (!subject) {
                    subject = params.subject = new AsyncSubject_1.AsyncSubject();
                    var handler = function () {
                        var innerArgs = [];
                        for (var _i = 0; _i < arguments.length; _i++) {
                            innerArgs[_i] = arguments[_i];
                        }
                        var err = innerArgs.shift();
                        if (err) {
                            subject.error(err);
                            return;
                        }
                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
                        subject.complete();
                    };
                    try {
                        callbackFunc.apply(context, args.concat([handler]));
                    }
                    catch (err) {
                        if (canReportError_1.canReportError(subject)) {
                            subject.error(err);
                        }
                        else {
                            console.warn(err);
                        }
                    }
                }
                return subject.subscribe(subscriber);
            }
            else {
                return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context });
            }
        });
    };
}
exports.bindNodeCallback = bindNodeCallback;
function dispatch(state) {
    var _this = this;
    var params = state.params, subscriber = state.subscriber, context = state.context;
    var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler;
    var subject = params.subject;
    if (!subject) {
        subject = params.subject = new AsyncSubject_1.AsyncSubject();
        var handler = function () {
            var innerArgs = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                innerArgs[_i] = arguments[_i];
            }
            var err = innerArgs.shift();
            if (err) {
                _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
            }
            else {
                var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
                _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
            }
        };
        try {
            callbackFunc.apply(context, args.concat([handler]));
        }
        catch (err) {
            this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
        }
    }
    this.add(subject.subscribe(subscriber));
}
function dispatchNext(arg) {
    var value = arg.value, subject = arg.subject;
    subject.next(value);
    subject.complete();
}
function dispatchError(arg) {
    var err = arg.err, subject = arg.subject;
    subject.error(err);
}

},{"../AsyncSubject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/AsyncSubject.js","../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../operators/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js","../util/canReportError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/canReportError.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js","../util/isScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/combineLatest.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var isScheduler_1 = require("../util/isScheduler");
var isArray_1 = require("../util/isArray");
var OuterSubscriber_1 = require("../OuterSubscriber");
var subscribeToResult_1 = require("../util/subscribeToResult");
var fromArray_1 = require("./fromArray");
var NONE = {};
function combineLatest() {
    var observables = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        observables[_i] = arguments[_i];
    }
    var resultSelector = undefined;
    var scheduler = undefined;
    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {
        scheduler = observables.pop();
    }
    if (typeof observables[observables.length - 1] === 'function') {
        resultSelector = observables.pop();
    }
    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
        observables = observables[0];
    }
    return fromArray_1.fromArray(observables, scheduler).lift(new CombineLatestOperator(resultSelector));
}
exports.combineLatest = combineLatest;
var CombineLatestOperator = (function () {
    function CombineLatestOperator(resultSelector) {
        this.resultSelector = resultSelector;
    }
    CombineLatestOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));
    };
    return CombineLatestOperator;
}());
exports.CombineLatestOperator = CombineLatestOperator;
var CombineLatestSubscriber = (function (_super) {
    __extends(CombineLatestSubscriber, _super);
    function CombineLatestSubscriber(destination, resultSelector) {
        var _this = _super.call(this, destination) || this;
        _this.resultSelector = resultSelector;
        _this.active = 0;
        _this.values = [];
        _this.observables = [];
        return _this;
    }
    CombineLatestSubscriber.prototype._next = function (observable) {
        this.values.push(NONE);
        this.observables.push(observable);
    };
    CombineLatestSubscriber.prototype._complete = function () {
        var observables = this.observables;
        var len = observables.length;
        if (len === 0) {
            this.destination.complete();
        }
        else {
            this.active = len;
            this.toRespond = len;
            for (var i = 0; i < len; i++) {
                var observable = observables[i];
                this.add(subscribeToResult_1.subscribeToResult(this, observable, undefined, i));
            }
        }
    };
    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {
        if ((this.active -= 1) === 0) {
            this.destination.complete();
        }
    };
    CombineLatestSubscriber.prototype.notifyNext = function (_outerValue, innerValue, outerIndex) {
        var values = this.values;
        var oldVal = values[outerIndex];
        var toRespond = !this.toRespond
            ? 0
            : oldVal === NONE ? --this.toRespond : this.toRespond;
        values[outerIndex] = innerValue;
        if (toRespond === 0) {
            if (this.resultSelector) {
                this._tryResultSelector(values);
            }
            else {
                this.destination.next(values.slice());
            }
        }
    };
    CombineLatestSubscriber.prototype._tryResultSelector = function (values) {
        var result;
        try {
            result = this.resultSelector.apply(this, values);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        this.destination.next(result);
    };
    return CombineLatestSubscriber;
}(OuterSubscriber_1.OuterSubscriber));
exports.CombineLatestSubscriber = CombineLatestSubscriber;

},{"../OuterSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/OuterSubscriber.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js","../util/isScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isScheduler.js","../util/subscribeToResult":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToResult.js","./fromArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/fromArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/concat.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var of_1 = require("./of");
var concatAll_1 = require("../operators/concatAll");
function concat() {
    var observables = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        observables[_i] = arguments[_i];
    }
    return concatAll_1.concatAll()(of_1.of.apply(void 0, observables));
}
exports.concat = concat;

},{"../operators/concatAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/concatAll.js","./of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/defer.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var from_1 = require("./from");
var empty_1 = require("./empty");
function defer(observableFactory) {
    return new Observable_1.Observable(function (subscriber) {
        var input;
        try {
            input = observableFactory();
        }
        catch (err) {
            subscriber.error(err);
            return undefined;
        }
        var source = input ? from_1.from(input) : empty_1.empty();
        return source.subscribe(subscriber);
    });
}
exports.defer = defer;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","./empty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/empty.js","./from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/from.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/empty.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
exports.EMPTY = new Observable_1.Observable(function (subscriber) { return subscriber.complete(); });
function empty(scheduler) {
    return scheduler ? emptyScheduled(scheduler) : exports.EMPTY;
}
exports.empty = empty;
function emptyScheduled(scheduler) {
    return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
}

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/forkJoin.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var isArray_1 = require("../util/isArray");
var map_1 = require("../operators/map");
var isObject_1 = require("../util/isObject");
var from_1 = require("./from");
function forkJoin() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    if (sources.length === 1) {
        var first_1 = sources[0];
        if (isArray_1.isArray(first_1)) {
            return forkJoinInternal(first_1, null);
        }
        if (isObject_1.isObject(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) {
            var keys = Object.keys(first_1);
            return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys);
        }
    }
    if (typeof sources[sources.length - 1] === 'function') {
        var resultSelector_1 = sources.pop();
        sources = (sources.length === 1 && isArray_1.isArray(sources[0])) ? sources[0] : sources;
        return forkJoinInternal(sources, null).pipe(map_1.map(function (args) { return resultSelector_1.apply(void 0, args); }));
    }
    return forkJoinInternal(sources, null);
}
exports.forkJoin = forkJoin;
function forkJoinInternal(sources, keys) {
    return new Observable_1.Observable(function (subscriber) {
        var len = sources.length;
        if (len === 0) {
            subscriber.complete();
            return;
        }
        var values = new Array(len);
        var completed = 0;
        var emitted = 0;
        var _loop_1 = function (i) {
            var source = from_1.from(sources[i]);
            var hasValue = false;
            subscriber.add(source.subscribe({
                next: function (value) {
                    if (!hasValue) {
                        hasValue = true;
                        emitted++;
                    }
                    values[i] = value;
                },
                error: function (err) { return subscriber.error(err); },
                complete: function () {
                    completed++;
                    if (completed === len || !hasValue) {
                        if (emitted === len) {
                            subscriber.next(keys ?
                                keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) :
                                values);
                        }
                        subscriber.complete();
                    }
                }
            }));
        };
        for (var i = 0; i < len; i++) {
            _loop_1(i);
        }
    });
}

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../operators/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js","../util/isObject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isObject.js","./from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/from.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/from.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var subscribeTo_1 = require("../util/subscribeTo");
var scheduled_1 = require("../scheduled/scheduled");
function from(input, scheduler) {
    if (!scheduler) {
        if (input instanceof Observable_1.Observable) {
            return input;
        }
        return new Observable_1.Observable(subscribeTo_1.subscribeTo(input));
    }
    else {
        return scheduled_1.scheduled(input, scheduler);
    }
}
exports.from = from;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../scheduled/scheduled":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/scheduled.js","../util/subscribeTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeTo.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/fromArray.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var subscribeToArray_1 = require("../util/subscribeToArray");
var scheduleArray_1 = require("../scheduled/scheduleArray");
function fromArray(input, scheduler) {
    if (!scheduler) {
        return new Observable_1.Observable(subscribeToArray_1.subscribeToArray(input));
    }
    else {
        return scheduleArray_1.scheduleArray(input, scheduler);
    }
}
exports.fromArray = fromArray;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../scheduled/scheduleArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/scheduleArray.js","../util/subscribeToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/fromEvent.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var isArray_1 = require("../util/isArray");
var isFunction_1 = require("../util/isFunction");
var map_1 = require("../operators/map");
var toString = (function () { return Object.prototype.toString; })();
function fromEvent(target, eventName, options, resultSelector) {
    if (isFunction_1.isFunction(options)) {
        resultSelector = options;
        options = undefined;
    }
    if (resultSelector) {
        return fromEvent(target, eventName, options).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
    }
    return new Observable_1.Observable(function (subscriber) {
        function handler(e) {
            if (arguments.length > 1) {
                subscriber.next(Array.prototype.slice.call(arguments));
            }
            else {
                subscriber.next(e);
            }
        }
        setupSubscription(target, eventName, handler, subscriber, options);
    });
}
exports.fromEvent = fromEvent;
function setupSubscription(sourceObj, eventName, handler, subscriber, options) {
    var unsubscribe;
    if (isEventTarget(sourceObj)) {
        var source_1 = sourceObj;
        sourceObj.addEventListener(eventName, handler, options);
        unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); };
    }
    else if (isJQueryStyleEventEmitter(sourceObj)) {
        var source_2 = sourceObj;
        sourceObj.on(eventName, handler);
        unsubscribe = function () { return source_2.off(eventName, handler); };
    }
    else if (isNodeStyleEventEmitter(sourceObj)) {
        var source_3 = sourceObj;
        sourceObj.addListener(eventName, handler);
        unsubscribe = function () { return source_3.removeListener(eventName, handler); };
    }
    else if (sourceObj && sourceObj.length) {
        for (var i = 0, len = sourceObj.length; i < len; i++) {
            setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
        }
    }
    else {
        throw new TypeError('Invalid event target');
    }
    subscriber.add(unsubscribe);
}
function isNodeStyleEventEmitter(sourceObj) {
    return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
}
function isJQueryStyleEventEmitter(sourceObj) {
    return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
}
function isEventTarget(sourceObj) {
    return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
}

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../operators/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js","../util/isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isFunction.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/fromEventPattern.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var isArray_1 = require("../util/isArray");
var isFunction_1 = require("../util/isFunction");
var map_1 = require("../operators/map");
function fromEventPattern(addHandler, removeHandler, resultSelector) {
    if (resultSelector) {
        return fromEventPattern(addHandler, removeHandler).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
    }
    return new Observable_1.Observable(function (subscriber) {
        var handler = function () {
            var e = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                e[_i] = arguments[_i];
            }
            return subscriber.next(e.length === 1 ? e[0] : e);
        };
        var retValue;
        try {
            retValue = addHandler(handler);
        }
        catch (err) {
            subscriber.error(err);
            return undefined;
        }
        if (!isFunction_1.isFunction(removeHandler)) {
            return undefined;
        }
        return function () { return removeHandler(handler, retValue); };
    });
}
exports.fromEventPattern = fromEventPattern;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../operators/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js","../util/isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isFunction.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/generate.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var identity_1 = require("../util/identity");
var isScheduler_1 = require("../util/isScheduler");
function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {
    var resultSelector;
    var initialState;
    if (arguments.length == 1) {
        var options = initialStateOrOptions;
        initialState = options.initialState;
        condition = options.condition;
        iterate = options.iterate;
        resultSelector = options.resultSelector || identity_1.identity;
        scheduler = options.scheduler;
    }
    else if (resultSelectorOrObservable === undefined || isScheduler_1.isScheduler(resultSelectorOrObservable)) {
        initialState = initialStateOrOptions;
        resultSelector = identity_1.identity;
        scheduler = resultSelectorOrObservable;
    }
    else {
        initialState = initialStateOrOptions;
        resultSelector = resultSelectorOrObservable;
    }
    return new Observable_1.Observable(function (subscriber) {
        var state = initialState;
        if (scheduler) {
            return scheduler.schedule(dispatch, 0, {
                subscriber: subscriber,
                iterate: iterate,
                condition: condition,
                resultSelector: resultSelector,
                state: state
            });
        }
        do {
            if (condition) {
                var conditionResult = void 0;
                try {
                    conditionResult = condition(state);
                }
                catch (err) {
                    subscriber.error(err);
                    return undefined;
                }
                if (!conditionResult) {
                    subscriber.complete();
                    break;
                }
            }
            var value = void 0;
            try {
                value = resultSelector(state);
            }
            catch (err) {
                subscriber.error(err);
                return undefined;
            }
            subscriber.next(value);
            if (subscriber.closed) {
                break;
            }
            try {
                state = iterate(state);
            }
            catch (err) {
                subscriber.error(err);
                return undefined;
            }
        } while (true);
        return undefined;
    });
}
exports.generate = generate;
function dispatch(state) {
    var subscriber = state.subscriber, condition = state.condition;
    if (subscriber.closed) {
        return undefined;
    }
    if (state.needIterate) {
        try {
            state.state = state.iterate(state.state);
        }
        catch (err) {
            subscriber.error(err);
            return undefined;
        }
    }
    else {
        state.needIterate = true;
    }
    if (condition) {
        var conditionResult = void 0;
        try {
            conditionResult = condition(state.state);
        }
        catch (err) {
            subscriber.error(err);
            return undefined;
        }
        if (!conditionResult) {
            subscriber.complete();
            return undefined;
        }
        if (subscriber.closed) {
            return undefined;
        }
    }
    var value;
    try {
        value = state.resultSelector(state.state);
    }
    catch (err) {
        subscriber.error(err);
        return undefined;
    }
    if (subscriber.closed) {
        return undefined;
    }
    subscriber.next(value);
    if (subscriber.closed) {
        return undefined;
    }
    return this.schedule(state);
}

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../util/identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/identity.js","../util/isScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/iif.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var defer_1 = require("./defer");
var empty_1 = require("./empty");
function iif(condition, trueResult, falseResult) {
    if (trueResult === void 0) { trueResult = empty_1.EMPTY; }
    if (falseResult === void 0) { falseResult = empty_1.EMPTY; }
    return defer_1.defer(function () { return condition() ? trueResult : falseResult; });
}
exports.iif = iif;

},{"./defer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/defer.js","./empty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/empty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/interval.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var async_1 = require("../scheduler/async");
var isNumeric_1 = require("../util/isNumeric");
function interval(period, scheduler) {
    if (period === void 0) { period = 0; }
    if (scheduler === void 0) { scheduler = async_1.async; }
    if (!isNumeric_1.isNumeric(period) || period < 0) {
        period = 0;
    }
    if (!scheduler || typeof scheduler.schedule !== 'function') {
        scheduler = async_1.async;
    }
    return new Observable_1.Observable(function (subscriber) {
        subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period }));
        return subscriber;
    });
}
exports.interval = interval;
function dispatch(state) {
    var subscriber = state.subscriber, counter = state.counter, period = state.period;
    subscriber.next(counter);
    this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period);
}

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","../util/isNumeric":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isNumeric.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/merge.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var isScheduler_1 = require("../util/isScheduler");
var mergeAll_1 = require("../operators/mergeAll");
var fromArray_1 = require("./fromArray");
function merge() {
    var observables = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        observables[_i] = arguments[_i];
    }
    var concurrent = Number.POSITIVE_INFINITY;
    var scheduler = null;
    var last = observables[observables.length - 1];
    if (isScheduler_1.isScheduler(last)) {
        scheduler = observables.pop();
        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
            concurrent = observables.pop();
        }
    }
    else if (typeof last === 'number') {
        concurrent = observables.pop();
    }
    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {
        return observables[0];
    }
    return mergeAll_1.mergeAll(concurrent)(fromArray_1.fromArray(observables, scheduler));
}
exports.merge = merge;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../operators/mergeAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeAll.js","../util/isScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isScheduler.js","./fromArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/fromArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/never.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var noop_1 = require("../util/noop");
exports.NEVER = new Observable_1.Observable(noop_1.noop);
function never() {
    return exports.NEVER;
}
exports.never = never;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../util/noop":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/noop.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/of.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var isScheduler_1 = require("../util/isScheduler");
var fromArray_1 = require("./fromArray");
var scheduleArray_1 = require("../scheduled/scheduleArray");
function of() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = args[args.length - 1];
    if (isScheduler_1.isScheduler(scheduler)) {
        args.pop();
        return scheduleArray_1.scheduleArray(args, scheduler);
    }
    else {
        return fromArray_1.fromArray(args);
    }
}
exports.of = of;

},{"../scheduled/scheduleArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/scheduleArray.js","../util/isScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isScheduler.js","./fromArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/fromArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/onErrorResumeNext.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var from_1 = require("./from");
var isArray_1 = require("../util/isArray");
var empty_1 = require("./empty");
function onErrorResumeNext() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    if (sources.length === 0) {
        return empty_1.EMPTY;
    }
    var first = sources[0], remainder = sources.slice(1);
    if (sources.length === 1 && isArray_1.isArray(first)) {
        return onErrorResumeNext.apply(void 0, first);
    }
    return new Observable_1.Observable(function (subscriber) {
        var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); };
        return from_1.from(first).subscribe({
            next: function (value) { subscriber.next(value); },
            error: subNext,
            complete: subNext,
        });
    });
}
exports.onErrorResumeNext = onErrorResumeNext;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js","./empty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/empty.js","./from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/from.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/pairs.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var Subscription_1 = require("../Subscription");
function pairs(obj, scheduler) {
    if (!scheduler) {
        return new Observable_1.Observable(function (subscriber) {
            var keys = Object.keys(obj);
            for (var i = 0; i < keys.length && !subscriber.closed; i++) {
                var key = keys[i];
                if (obj.hasOwnProperty(key)) {
                    subscriber.next([key, obj[key]]);
                }
            }
            subscriber.complete();
        });
    }
    else {
        return new Observable_1.Observable(function (subscriber) {
            var keys = Object.keys(obj);
            var subscription = new Subscription_1.Subscription();
            subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj }));
            return subscription;
        });
    }
}
exports.pairs = pairs;
function dispatch(state) {
    var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj;
    if (!subscriber.closed) {
        if (index < keys.length) {
            var key = keys[index];
            subscriber.next([key, obj[key]]);
            subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj }));
        }
        else {
            subscriber.complete();
        }
    }
}
exports.dispatch = dispatch;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/partition.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var not_1 = require("../util/not");
var subscribeTo_1 = require("../util/subscribeTo");
var filter_1 = require("../operators/filter");
var Observable_1 = require("../Observable");
function partition(source, predicate, thisArg) {
    return [
        filter_1.filter(predicate, thisArg)(new Observable_1.Observable(subscribeTo_1.subscribeTo(source))),
        filter_1.filter(not_1.not(predicate, thisArg))(new Observable_1.Observable(subscribeTo_1.subscribeTo(source)))
    ];
}
exports.partition = partition;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../operators/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/filter.js","../util/not":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/not.js","../util/subscribeTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeTo.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/race.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var isArray_1 = require("../util/isArray");
var fromArray_1 = require("./fromArray");
var OuterSubscriber_1 = require("../OuterSubscriber");
var subscribeToResult_1 = require("../util/subscribeToResult");
function race() {
    var observables = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        observables[_i] = arguments[_i];
    }
    if (observables.length === 1) {
        if (isArray_1.isArray(observables[0])) {
            observables = observables[0];
        }
        else {
            return observables[0];
        }
    }
    return fromArray_1.fromArray(observables, undefined).lift(new RaceOperator());
}
exports.race = race;
var RaceOperator = (function () {
    function RaceOperator() {
    }
    RaceOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new RaceSubscriber(subscriber));
    };
    return RaceOperator;
}());
exports.RaceOperator = RaceOperator;
var RaceSubscriber = (function (_super) {
    __extends(RaceSubscriber, _super);
    function RaceSubscriber(destination) {
        var _this = _super.call(this, destination) || this;
        _this.hasFirst = false;
        _this.observables = [];
        _this.subscriptions = [];
        return _this;
    }
    RaceSubscriber.prototype._next = function (observable) {
        this.observables.push(observable);
    };
    RaceSubscriber.prototype._complete = function () {
        var observables = this.observables;
        var len = observables.length;
        if (len === 0) {
            this.destination.complete();
        }
        else {
            for (var i = 0; i < len && !this.hasFirst; i++) {
                var observable = observables[i];
                var subscription = subscribeToResult_1.subscribeToResult(this, observable, undefined, i);
                if (this.subscriptions) {
                    this.subscriptions.push(subscription);
                }
                this.add(subscription);
            }
            this.observables = null;
        }
    };
    RaceSubscriber.prototype.notifyNext = function (_outerValue, innerValue, outerIndex) {
        if (!this.hasFirst) {
            this.hasFirst = true;
            for (var i = 0; i < this.subscriptions.length; i++) {
                if (i !== outerIndex) {
                    var subscription = this.subscriptions[i];
                    subscription.unsubscribe();
                    this.remove(subscription);
                }
            }
            this.subscriptions = null;
        }
        this.destination.next(innerValue);
    };
    return RaceSubscriber;
}(OuterSubscriber_1.OuterSubscriber));
exports.RaceSubscriber = RaceSubscriber;

},{"../OuterSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/OuterSubscriber.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js","../util/subscribeToResult":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToResult.js","./fromArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/fromArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/range.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
function range(start, count, scheduler) {
    if (start === void 0) { start = 0; }
    return new Observable_1.Observable(function (subscriber) {
        if (count === undefined) {
            count = start;
            start = 0;
        }
        var index = 0;
        var current = start;
        if (scheduler) {
            return scheduler.schedule(dispatch, 0, {
                index: index, count: count, start: start, subscriber: subscriber
            });
        }
        else {
            do {
                if (index++ >= count) {
                    subscriber.complete();
                    break;
                }
                subscriber.next(current++);
                if (subscriber.closed) {
                    break;
                }
            } while (true);
        }
        return undefined;
    });
}
exports.range = range;
function dispatch(state) {
    var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber;
    if (index >= count) {
        subscriber.complete();
        return;
    }
    subscriber.next(start);
    if (subscriber.closed) {
        return;
    }
    state.index = index + 1;
    state.start = start + 1;
    this.schedule(state);
}
exports.dispatch = dispatch;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/throwError.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
function throwError(error, scheduler) {
    if (!scheduler) {
        return new Observable_1.Observable(function (subscriber) { return subscriber.error(error); });
    }
    else {
        return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); });
    }
}
exports.throwError = throwError;
function dispatch(_a) {
    var error = _a.error, subscriber = _a.subscriber;
    subscriber.error(error);
}

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/timer.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var async_1 = require("../scheduler/async");
var isNumeric_1 = require("../util/isNumeric");
var isScheduler_1 = require("../util/isScheduler");
function timer(dueTime, periodOrScheduler, scheduler) {
    if (dueTime === void 0) { dueTime = 0; }
    var period = -1;
    if (isNumeric_1.isNumeric(periodOrScheduler)) {
        period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);
    }
    else if (isScheduler_1.isScheduler(periodOrScheduler)) {
        scheduler = periodOrScheduler;
    }
    if (!isScheduler_1.isScheduler(scheduler)) {
        scheduler = async_1.async;
    }
    return new Observable_1.Observable(function (subscriber) {
        var due = isNumeric_1.isNumeric(dueTime)
            ? dueTime
            : (+dueTime - scheduler.now());
        return scheduler.schedule(dispatch, due, {
            index: 0, period: period, subscriber: subscriber
        });
    });
}
exports.timer = timer;
function dispatch(state) {
    var index = state.index, period = state.period, subscriber = state.subscriber;
    subscriber.next(index);
    if (subscriber.closed) {
        return;
    }
    else if (period === -1) {
        return subscriber.complete();
    }
    state.index = index + 1;
    this.schedule(state, period);
}

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","../util/isNumeric":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isNumeric.js","../util/isScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/using.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var from_1 = require("./from");
var empty_1 = require("./empty");
function using(resourceFactory, observableFactory) {
    return new Observable_1.Observable(function (subscriber) {
        var resource;
        try {
            resource = resourceFactory();
        }
        catch (err) {
            subscriber.error(err);
            return undefined;
        }
        var result;
        try {
            result = observableFactory(resource);
        }
        catch (err) {
            subscriber.error(err);
            return undefined;
        }
        var source = result ? from_1.from(result) : empty_1.EMPTY;
        var subscription = source.subscribe(subscriber);
        return function () {
            subscription.unsubscribe();
            if (resource) {
                resource.unsubscribe();
            }
        };
    });
}
exports.using = using;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","./empty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/empty.js","./from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/from.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/zip.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var fromArray_1 = require("./fromArray");
var isArray_1 = require("../util/isArray");
var Subscriber_1 = require("../Subscriber");
var iterator_1 = require("../../internal/symbol/iterator");
var innerSubscribe_1 = require("../innerSubscribe");
function zip() {
    var observables = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        observables[_i] = arguments[_i];
    }
    var resultSelector = observables[observables.length - 1];
    if (typeof resultSelector === 'function') {
        observables.pop();
    }
    return fromArray_1.fromArray(observables, undefined).lift(new ZipOperator(resultSelector));
}
exports.zip = zip;
var ZipOperator = (function () {
    function ZipOperator(resultSelector) {
        this.resultSelector = resultSelector;
    }
    ZipOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));
    };
    return ZipOperator;
}());
exports.ZipOperator = ZipOperator;
var ZipSubscriber = (function (_super) {
    __extends(ZipSubscriber, _super);
    function ZipSubscriber(destination, resultSelector, values) {
        if (values === void 0) { values = Object.create(null); }
        var _this = _super.call(this, destination) || this;
        _this.resultSelector = resultSelector;
        _this.iterators = [];
        _this.active = 0;
        _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : undefined;
        return _this;
    }
    ZipSubscriber.prototype._next = function (value) {
        var iterators = this.iterators;
        if (isArray_1.isArray(value)) {
            iterators.push(new StaticArrayIterator(value));
        }
        else if (typeof value[iterator_1.iterator] === 'function') {
            iterators.push(new StaticIterator(value[iterator_1.iterator]()));
        }
        else {
            iterators.push(new ZipBufferIterator(this.destination, this, value));
        }
    };
    ZipSubscriber.prototype._complete = function () {
        var iterators = this.iterators;
        var len = iterators.length;
        this.unsubscribe();
        if (len === 0) {
            this.destination.complete();
            return;
        }
        this.active = len;
        for (var i = 0; i < len; i++) {
            var iterator = iterators[i];
            if (iterator.stillUnsubscribed) {
                var destination = this.destination;
                destination.add(iterator.subscribe());
            }
            else {
                this.active--;
            }
        }
    };
    ZipSubscriber.prototype.notifyInactive = function () {
        this.active--;
        if (this.active === 0) {
            this.destination.complete();
        }
    };
    ZipSubscriber.prototype.checkIterators = function () {
        var iterators = this.iterators;
        var len = iterators.length;
        var destination = this.destination;
        for (var i = 0; i < len; i++) {
            var iterator = iterators[i];
            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
                return;
            }
        }
        var shouldComplete = false;
        var args = [];
        for (var i = 0; i < len; i++) {
            var iterator = iterators[i];
            var result = iterator.next();
            if (iterator.hasCompleted()) {
                shouldComplete = true;
            }
            if (result.done) {
                destination.complete();
                return;
            }
            args.push(result.value);
        }
        if (this.resultSelector) {
            this._tryresultSelector(args);
        }
        else {
            destination.next(args);
        }
        if (shouldComplete) {
            destination.complete();
        }
    };
    ZipSubscriber.prototype._tryresultSelector = function (args) {
        var result;
        try {
            result = this.resultSelector.apply(this, args);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        this.destination.next(result);
    };
    return ZipSubscriber;
}(Subscriber_1.Subscriber));
exports.ZipSubscriber = ZipSubscriber;
var StaticIterator = (function () {
    function StaticIterator(iterator) {
        this.iterator = iterator;
        this.nextResult = iterator.next();
    }
    StaticIterator.prototype.hasValue = function () {
        return true;
    };
    StaticIterator.prototype.next = function () {
        var result = this.nextResult;
        this.nextResult = this.iterator.next();
        return result;
    };
    StaticIterator.prototype.hasCompleted = function () {
        var nextResult = this.nextResult;
        return Boolean(nextResult && nextResult.done);
    };
    return StaticIterator;
}());
var StaticArrayIterator = (function () {
    function StaticArrayIterator(array) {
        this.array = array;
        this.index = 0;
        this.length = 0;
        this.length = array.length;
    }
    StaticArrayIterator.prototype[iterator_1.iterator] = function () {
        return this;
    };
    StaticArrayIterator.prototype.next = function (value) {
        var i = this.index++;
        var array = this.array;
        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
    };
    StaticArrayIterator.prototype.hasValue = function () {
        return this.array.length > this.index;
    };
    StaticArrayIterator.prototype.hasCompleted = function () {
        return this.array.length === this.index;
    };
    return StaticArrayIterator;
}());
var ZipBufferIterator = (function (_super) {
    __extends(ZipBufferIterator, _super);
    function ZipBufferIterator(destination, parent, observable) {
        var _this = _super.call(this, destination) || this;
        _this.parent = parent;
        _this.observable = observable;
        _this.stillUnsubscribed = true;
        _this.buffer = [];
        _this.isComplete = false;
        return _this;
    }
    ZipBufferIterator.prototype[iterator_1.iterator] = function () {
        return this;
    };
    ZipBufferIterator.prototype.next = function () {
        var buffer = this.buffer;
        if (buffer.length === 0 && this.isComplete) {
            return { value: null, done: true };
        }
        else {
            return { value: buffer.shift(), done: false };
        }
    };
    ZipBufferIterator.prototype.hasValue = function () {
        return this.buffer.length > 0;
    };
    ZipBufferIterator.prototype.hasCompleted = function () {
        return this.buffer.length === 0 && this.isComplete;
    };
    ZipBufferIterator.prototype.notifyComplete = function () {
        if (this.buffer.length > 0) {
            this.isComplete = true;
            this.parent.notifyInactive();
        }
        else {
            this.destination.complete();
        }
    };
    ZipBufferIterator.prototype.notifyNext = function (innerValue) {
        this.buffer.push(innerValue);
        this.parent.checkIterators();
    };
    ZipBufferIterator.prototype.subscribe = function () {
        return innerSubscribe_1.innerSubscribe(this.observable, new innerSubscribe_1.SimpleInnerSubscriber(this));
    };
    return ZipBufferIterator;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../../internal/symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/iterator.js","../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js","./fromArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/fromArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/audit.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
function audit(durationSelector) {
    return function auditOperatorFunction(source) {
        return source.lift(new AuditOperator(durationSelector));
    };
}
exports.audit = audit;
var AuditOperator = (function () {
    function AuditOperator(durationSelector) {
        this.durationSelector = durationSelector;
    }
    AuditOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));
    };
    return AuditOperator;
}());
var AuditSubscriber = (function (_super) {
    __extends(AuditSubscriber, _super);
    function AuditSubscriber(destination, durationSelector) {
        var _this = _super.call(this, destination) || this;
        _this.durationSelector = durationSelector;
        _this.hasValue = false;
        return _this;
    }
    AuditSubscriber.prototype._next = function (value) {
        this.value = value;
        this.hasValue = true;
        if (!this.throttled) {
            var duration = void 0;
            try {
                var durationSelector = this.durationSelector;
                duration = durationSelector(value);
            }
            catch (err) {
                return this.destination.error(err);
            }
            var innerSubscription = innerSubscribe_1.innerSubscribe(duration, new innerSubscribe_1.SimpleInnerSubscriber(this));
            if (!innerSubscription || innerSubscription.closed) {
                this.clearThrottle();
            }
            else {
                this.add(this.throttled = innerSubscription);
            }
        }
    };
    AuditSubscriber.prototype.clearThrottle = function () {
        var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;
        if (throttled) {
            this.remove(throttled);
            this.throttled = undefined;
            throttled.unsubscribe();
        }
        if (hasValue) {
            this.value = undefined;
            this.hasValue = false;
            this.destination.next(value);
        }
    };
    AuditSubscriber.prototype.notifyNext = function () {
        this.clearThrottle();
    };
    AuditSubscriber.prototype.notifyComplete = function () {
        this.clearThrottle();
    };
    return AuditSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/auditTime.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var async_1 = require("../scheduler/async");
var audit_1 = require("./audit");
var timer_1 = require("../observable/timer");
function auditTime(duration, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.async; }
    return audit_1.audit(function () { return timer_1.timer(duration, scheduler); });
}
exports.auditTime = auditTime;

},{"../observable/timer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/timer.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","./audit":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/audit.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/buffer.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
function buffer(closingNotifier) {
    return function bufferOperatorFunction(source) {
        return source.lift(new BufferOperator(closingNotifier));
    };
}
exports.buffer = buffer;
var BufferOperator = (function () {
    function BufferOperator(closingNotifier) {
        this.closingNotifier = closingNotifier;
    }
    BufferOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
    };
    return BufferOperator;
}());
var BufferSubscriber = (function (_super) {
    __extends(BufferSubscriber, _super);
    function BufferSubscriber(destination, closingNotifier) {
        var _this = _super.call(this, destination) || this;
        _this.buffer = [];
        _this.add(innerSubscribe_1.innerSubscribe(closingNotifier, new innerSubscribe_1.SimpleInnerSubscriber(_this)));
        return _this;
    }
    BufferSubscriber.prototype._next = function (value) {
        this.buffer.push(value);
    };
    BufferSubscriber.prototype.notifyNext = function () {
        var buffer = this.buffer;
        this.buffer = [];
        this.destination.next(buffer);
    };
    return BufferSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/bufferCount.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function bufferCount(bufferSize, startBufferEvery) {
    if (startBufferEvery === void 0) { startBufferEvery = null; }
    return function bufferCountOperatorFunction(source) {
        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));
    };
}
exports.bufferCount = bufferCount;
var BufferCountOperator = (function () {
    function BufferCountOperator(bufferSize, startBufferEvery) {
        this.bufferSize = bufferSize;
        this.startBufferEvery = startBufferEvery;
        if (!startBufferEvery || bufferSize === startBufferEvery) {
            this.subscriberClass = BufferCountSubscriber;
        }
        else {
            this.subscriberClass = BufferSkipCountSubscriber;
        }
    }
    BufferCountOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
    };
    return BufferCountOperator;
}());
var BufferCountSubscriber = (function (_super) {
    __extends(BufferCountSubscriber, _super);
    function BufferCountSubscriber(destination, bufferSize) {
        var _this = _super.call(this, destination) || this;
        _this.bufferSize = bufferSize;
        _this.buffer = [];
        return _this;
    }
    BufferCountSubscriber.prototype._next = function (value) {
        var buffer = this.buffer;
        buffer.push(value);
        if (buffer.length == this.bufferSize) {
            this.destination.next(buffer);
            this.buffer = [];
        }
    };
    BufferCountSubscriber.prototype._complete = function () {
        var buffer = this.buffer;
        if (buffer.length > 0) {
            this.destination.next(buffer);
        }
        _super.prototype._complete.call(this);
    };
    return BufferCountSubscriber;
}(Subscriber_1.Subscriber));
var BufferSkipCountSubscriber = (function (_super) {
    __extends(BufferSkipCountSubscriber, _super);
    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {
        var _this = _super.call(this, destination) || this;
        _this.bufferSize = bufferSize;
        _this.startBufferEvery = startBufferEvery;
        _this.buffers = [];
        _this.count = 0;
        return _this;
    }
    BufferSkipCountSubscriber.prototype._next = function (value) {
        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;
        this.count++;
        if (count % startBufferEvery === 0) {
            buffers.push([]);
        }
        for (var i = buffers.length; i--;) {
            var buffer = buffers[i];
            buffer.push(value);
            if (buffer.length === bufferSize) {
                buffers.splice(i, 1);
                this.destination.next(buffer);
            }
        }
    };
    BufferSkipCountSubscriber.prototype._complete = function () {
        var _a = this, buffers = _a.buffers, destination = _a.destination;
        while (buffers.length > 0) {
            var buffer = buffers.shift();
            if (buffer.length > 0) {
                destination.next(buffer);
            }
        }
        _super.prototype._complete.call(this);
    };
    return BufferSkipCountSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/bufferTime.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var async_1 = require("../scheduler/async");
var Subscriber_1 = require("../Subscriber");
var isScheduler_1 = require("../util/isScheduler");
function bufferTime(bufferTimeSpan) {
    var length = arguments.length;
    var scheduler = async_1.async;
    if (isScheduler_1.isScheduler(arguments[arguments.length - 1])) {
        scheduler = arguments[arguments.length - 1];
        length--;
    }
    var bufferCreationInterval = null;
    if (length >= 2) {
        bufferCreationInterval = arguments[1];
    }
    var maxBufferSize = Number.POSITIVE_INFINITY;
    if (length >= 3) {
        maxBufferSize = arguments[2];
    }
    return function bufferTimeOperatorFunction(source) {
        return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));
    };
}
exports.bufferTime = bufferTime;
var BufferTimeOperator = (function () {
    function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
        this.bufferTimeSpan = bufferTimeSpan;
        this.bufferCreationInterval = bufferCreationInterval;
        this.maxBufferSize = maxBufferSize;
        this.scheduler = scheduler;
    }
    BufferTimeOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));
    };
    return BufferTimeOperator;
}());
var Context = (function () {
    function Context() {
        this.buffer = [];
    }
    return Context;
}());
var BufferTimeSubscriber = (function (_super) {
    __extends(BufferTimeSubscriber, _super);
    function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
        var _this = _super.call(this, destination) || this;
        _this.bufferTimeSpan = bufferTimeSpan;
        _this.bufferCreationInterval = bufferCreationInterval;
        _this.maxBufferSize = maxBufferSize;
        _this.scheduler = scheduler;
        _this.contexts = [];
        var context = _this.openContext();
        _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;
        if (_this.timespanOnly) {
            var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan };
            _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
        }
        else {
            var closeState = { subscriber: _this, context: context };
            var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler };
            _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));
            _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));
        }
        return _this;
    }
    BufferTimeSubscriber.prototype._next = function (value) {
        var contexts = this.contexts;
        var len = contexts.length;
        var filledBufferContext;
        for (var i = 0; i < len; i++) {
            var context_1 = contexts[i];
            var buffer = context_1.buffer;
            buffer.push(value);
            if (buffer.length == this.maxBufferSize) {
                filledBufferContext = context_1;
            }
        }
        if (filledBufferContext) {
            this.onBufferFull(filledBufferContext);
        }
    };
    BufferTimeSubscriber.prototype._error = function (err) {
        this.contexts.length = 0;
        _super.prototype._error.call(this, err);
    };
    BufferTimeSubscriber.prototype._complete = function () {
        var _a = this, contexts = _a.contexts, destination = _a.destination;
        while (contexts.length > 0) {
            var context_2 = contexts.shift();
            destination.next(context_2.buffer);
        }
        _super.prototype._complete.call(this);
    };
    BufferTimeSubscriber.prototype._unsubscribe = function () {
        this.contexts = null;
    };
    BufferTimeSubscriber.prototype.onBufferFull = function (context) {
        this.closeContext(context);
        var closeAction = context.closeAction;
        closeAction.unsubscribe();
        this.remove(closeAction);
        if (!this.closed && this.timespanOnly) {
            context = this.openContext();
            var bufferTimeSpan = this.bufferTimeSpan;
            var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };
            this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
        }
    };
    BufferTimeSubscriber.prototype.openContext = function () {
        var context = new Context();
        this.contexts.push(context);
        return context;
    };
    BufferTimeSubscriber.prototype.closeContext = function (context) {
        this.destination.next(context.buffer);
        var contexts = this.contexts;
        var spliceIndex = contexts ? contexts.indexOf(context) : -1;
        if (spliceIndex >= 0) {
            contexts.splice(contexts.indexOf(context), 1);
        }
    };
    return BufferTimeSubscriber;
}(Subscriber_1.Subscriber));
function dispatchBufferTimeSpanOnly(state) {
    var subscriber = state.subscriber;
    var prevContext = state.context;
    if (prevContext) {
        subscriber.closeContext(prevContext);
    }
    if (!subscriber.closed) {
        state.context = subscriber.openContext();
        state.context.closeAction = this.schedule(state, state.bufferTimeSpan);
    }
}
function dispatchBufferCreation(state) {
    var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler;
    var context = subscriber.openContext();
    var action = this;
    if (!subscriber.closed) {
        subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context }));
        action.schedule(state, bufferCreationInterval);
    }
}
function dispatchBufferClose(arg) {
    var subscriber = arg.subscriber, context = arg.context;
    subscriber.closeContext(context);
}

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","../util/isScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/bufferToggle.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscription_1 = require("../Subscription");
var subscribeToResult_1 = require("../util/subscribeToResult");
var OuterSubscriber_1 = require("../OuterSubscriber");
function bufferToggle(openings, closingSelector) {
    return function bufferToggleOperatorFunction(source) {
        return source.lift(new BufferToggleOperator(openings, closingSelector));
    };
}
exports.bufferToggle = bufferToggle;
var BufferToggleOperator = (function () {
    function BufferToggleOperator(openings, closingSelector) {
        this.openings = openings;
        this.closingSelector = closingSelector;
    }
    BufferToggleOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
    };
    return BufferToggleOperator;
}());
var BufferToggleSubscriber = (function (_super) {
    __extends(BufferToggleSubscriber, _super);
    function BufferToggleSubscriber(destination, openings, closingSelector) {
        var _this = _super.call(this, destination) || this;
        _this.closingSelector = closingSelector;
        _this.contexts = [];
        _this.add(subscribeToResult_1.subscribeToResult(_this, openings));
        return _this;
    }
    BufferToggleSubscriber.prototype._next = function (value) {
        var contexts = this.contexts;
        var len = contexts.length;
        for (var i = 0; i < len; i++) {
            contexts[i].buffer.push(value);
        }
    };
    BufferToggleSubscriber.prototype._error = function (err) {
        var contexts = this.contexts;
        while (contexts.length > 0) {
            var context_1 = contexts.shift();
            context_1.subscription.unsubscribe();
            context_1.buffer = null;
            context_1.subscription = null;
        }
        this.contexts = null;
        _super.prototype._error.call(this, err);
    };
    BufferToggleSubscriber.prototype._complete = function () {
        var contexts = this.contexts;
        while (contexts.length > 0) {
            var context_2 = contexts.shift();
            this.destination.next(context_2.buffer);
            context_2.subscription.unsubscribe();
            context_2.buffer = null;
            context_2.subscription = null;
        }
        this.contexts = null;
        _super.prototype._complete.call(this);
    };
    BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue) {
        outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
    };
    BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) {
        this.closeBuffer(innerSub.context);
    };
    BufferToggleSubscriber.prototype.openBuffer = function (value) {
        try {
            var closingSelector = this.closingSelector;
            var closingNotifier = closingSelector.call(this, value);
            if (closingNotifier) {
                this.trySubscribe(closingNotifier);
            }
        }
        catch (err) {
            this._error(err);
        }
    };
    BufferToggleSubscriber.prototype.closeBuffer = function (context) {
        var contexts = this.contexts;
        if (contexts && context) {
            var buffer = context.buffer, subscription = context.subscription;
            this.destination.next(buffer);
            contexts.splice(contexts.indexOf(context), 1);
            this.remove(subscription);
            subscription.unsubscribe();
        }
    };
    BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) {
        var contexts = this.contexts;
        var buffer = [];
        var subscription = new Subscription_1.Subscription();
        var context = { buffer: buffer, subscription: subscription };
        contexts.push(context);
        var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context);
        if (!innerSubscription || innerSubscription.closed) {
            this.closeBuffer(context);
        }
        else {
            innerSubscription.context = context;
            this.add(innerSubscription);
            subscription.add(innerSubscription);
        }
    };
    return BufferToggleSubscriber;
}(OuterSubscriber_1.OuterSubscriber));

},{"../OuterSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/OuterSubscriber.js","../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js","../util/subscribeToResult":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToResult.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/bufferWhen.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscription_1 = require("../Subscription");
var innerSubscribe_1 = require("../innerSubscribe");
function bufferWhen(closingSelector) {
    return function (source) {
        return source.lift(new BufferWhenOperator(closingSelector));
    };
}
exports.bufferWhen = bufferWhen;
var BufferWhenOperator = (function () {
    function BufferWhenOperator(closingSelector) {
        this.closingSelector = closingSelector;
    }
    BufferWhenOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));
    };
    return BufferWhenOperator;
}());
var BufferWhenSubscriber = (function (_super) {
    __extends(BufferWhenSubscriber, _super);
    function BufferWhenSubscriber(destination, closingSelector) {
        var _this = _super.call(this, destination) || this;
        _this.closingSelector = closingSelector;
        _this.subscribing = false;
        _this.openBuffer();
        return _this;
    }
    BufferWhenSubscriber.prototype._next = function (value) {
        this.buffer.push(value);
    };
    BufferWhenSubscriber.prototype._complete = function () {
        var buffer = this.buffer;
        if (buffer) {
            this.destination.next(buffer);
        }
        _super.prototype._complete.call(this);
    };
    BufferWhenSubscriber.prototype._unsubscribe = function () {
        this.buffer = undefined;
        this.subscribing = false;
    };
    BufferWhenSubscriber.prototype.notifyNext = function () {
        this.openBuffer();
    };
    BufferWhenSubscriber.prototype.notifyComplete = function () {
        if (this.subscribing) {
            this.complete();
        }
        else {
            this.openBuffer();
        }
    };
    BufferWhenSubscriber.prototype.openBuffer = function () {
        var closingSubscription = this.closingSubscription;
        if (closingSubscription) {
            this.remove(closingSubscription);
            closingSubscription.unsubscribe();
        }
        var buffer = this.buffer;
        if (this.buffer) {
            this.destination.next(buffer);
        }
        this.buffer = [];
        var closingNotifier;
        try {
            var closingSelector = this.closingSelector;
            closingNotifier = closingSelector();
        }
        catch (err) {
            return this.error(err);
        }
        closingSubscription = new Subscription_1.Subscription();
        this.closingSubscription = closingSubscription;
        this.add(closingSubscription);
        this.subscribing = true;
        closingSubscription.add(innerSubscribe_1.innerSubscribe(closingNotifier, new innerSubscribe_1.SimpleInnerSubscriber(this)));
        this.subscribing = false;
    };
    return BufferWhenSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js","../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/catchError.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
function catchError(selector) {
    return function catchErrorOperatorFunction(source) {
        var operator = new CatchOperator(selector);
        var caught = source.lift(operator);
        return (operator.caught = caught);
    };
}
exports.catchError = catchError;
var CatchOperator = (function () {
    function CatchOperator(selector) {
        this.selector = selector;
    }
    CatchOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
    };
    return CatchOperator;
}());
var CatchSubscriber = (function (_super) {
    __extends(CatchSubscriber, _super);
    function CatchSubscriber(destination, selector, caught) {
        var _this = _super.call(this, destination) || this;
        _this.selector = selector;
        _this.caught = caught;
        return _this;
    }
    CatchSubscriber.prototype.error = function (err) {
        if (!this.isStopped) {
            var result = void 0;
            try {
                result = this.selector(err, this.caught);
            }
            catch (err2) {
                _super.prototype.error.call(this, err2);
                return;
            }
            this._unsubscribeAndRecycle();
            var innerSubscriber = new innerSubscribe_1.SimpleInnerSubscriber(this);
            this.add(innerSubscriber);
            var innerSubscription = innerSubscribe_1.innerSubscribe(result, innerSubscriber);
            if (innerSubscription !== innerSubscriber) {
                this.add(innerSubscription);
            }
        }
    };
    return CatchSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/combineAll.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var combineLatest_1 = require("../observable/combineLatest");
function combineAll(project) {
    return function (source) { return source.lift(new combineLatest_1.CombineLatestOperator(project)); };
}
exports.combineAll = combineAll;

},{"../observable/combineLatest":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/combineLatest.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/combineLatest.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var isArray_1 = require("../util/isArray");
var combineLatest_1 = require("../observable/combineLatest");
var from_1 = require("../observable/from");
var none = {};
function combineLatest() {
    var observables = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        observables[_i] = arguments[_i];
    }
    var project = null;
    if (typeof observables[observables.length - 1] === 'function') {
        project = observables.pop();
    }
    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
        observables = observables[0].slice();
    }
    return function (source) { return source.lift.call(from_1.from([source].concat(observables)), new combineLatest_1.CombineLatestOperator(project)); };
}
exports.combineLatest = combineLatest;

},{"../observable/combineLatest":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/combineLatest.js","../observable/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/from.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/concat.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var concat_1 = require("../observable/concat");
function concat() {
    var observables = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        observables[_i] = arguments[_i];
    }
    return function (source) { return source.lift.call(concat_1.concat.apply(void 0, [source].concat(observables))); };
}
exports.concat = concat;

},{"../observable/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/concat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/concatAll.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var mergeAll_1 = require("./mergeAll");
function concatAll() {
    return mergeAll_1.mergeAll(1);
}
exports.concatAll = concatAll;

},{"./mergeAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeAll.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/concatMap.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var mergeMap_1 = require("./mergeMap");
function concatMap(project, resultSelector) {
    return mergeMap_1.mergeMap(project, resultSelector, 1);
}
exports.concatMap = concatMap;

},{"./mergeMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeMap.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/concatMapTo.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var concatMap_1 = require("./concatMap");
function concatMapTo(innerObservable, resultSelector) {
    return concatMap_1.concatMap(function () { return innerObservable; }, resultSelector);
}
exports.concatMapTo = concatMapTo;

},{"./concatMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/concatMap.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/count.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function count(predicate) {
    return function (source) { return source.lift(new CountOperator(predicate, source)); };
}
exports.count = count;
var CountOperator = (function () {
    function CountOperator(predicate, source) {
        this.predicate = predicate;
        this.source = source;
    }
    CountOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));
    };
    return CountOperator;
}());
var CountSubscriber = (function (_super) {
    __extends(CountSubscriber, _super);
    function CountSubscriber(destination, predicate, source) {
        var _this = _super.call(this, destination) || this;
        _this.predicate = predicate;
        _this.source = source;
        _this.count = 0;
        _this.index = 0;
        return _this;
    }
    CountSubscriber.prototype._next = function (value) {
        if (this.predicate) {
            this._tryPredicate(value);
        }
        else {
            this.count++;
        }
    };
    CountSubscriber.prototype._tryPredicate = function (value) {
        var result;
        try {
            result = this.predicate(value, this.index++, this.source);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        if (result) {
            this.count++;
        }
    };
    CountSubscriber.prototype._complete = function () {
        this.destination.next(this.count);
        this.destination.complete();
    };
    return CountSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/debounce.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
function debounce(durationSelector) {
    return function (source) { return source.lift(new DebounceOperator(durationSelector)); };
}
exports.debounce = debounce;
var DebounceOperator = (function () {
    function DebounceOperator(durationSelector) {
        this.durationSelector = durationSelector;
    }
    DebounceOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));
    };
    return DebounceOperator;
}());
var DebounceSubscriber = (function (_super) {
    __extends(DebounceSubscriber, _super);
    function DebounceSubscriber(destination, durationSelector) {
        var _this = _super.call(this, destination) || this;
        _this.durationSelector = durationSelector;
        _this.hasValue = false;
        return _this;
    }
    DebounceSubscriber.prototype._next = function (value) {
        try {
            var result = this.durationSelector.call(this, value);
            if (result) {
                this._tryNext(value, result);
            }
        }
        catch (err) {
            this.destination.error(err);
        }
    };
    DebounceSubscriber.prototype._complete = function () {
        this.emitValue();
        this.destination.complete();
    };
    DebounceSubscriber.prototype._tryNext = function (value, duration) {
        var subscription = this.durationSubscription;
        this.value = value;
        this.hasValue = true;
        if (subscription) {
            subscription.unsubscribe();
            this.remove(subscription);
        }
        subscription = innerSubscribe_1.innerSubscribe(duration, new innerSubscribe_1.SimpleInnerSubscriber(this));
        if (subscription && !subscription.closed) {
            this.add(this.durationSubscription = subscription);
        }
    };
    DebounceSubscriber.prototype.notifyNext = function () {
        this.emitValue();
    };
    DebounceSubscriber.prototype.notifyComplete = function () {
        this.emitValue();
    };
    DebounceSubscriber.prototype.emitValue = function () {
        if (this.hasValue) {
            var value = this.value;
            var subscription = this.durationSubscription;
            if (subscription) {
                this.durationSubscription = undefined;
                subscription.unsubscribe();
                this.remove(subscription);
            }
            this.value = undefined;
            this.hasValue = false;
            _super.prototype._next.call(this, value);
        }
    };
    return DebounceSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/debounceTime.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var async_1 = require("../scheduler/async");
function debounceTime(dueTime, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.async; }
    return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };
}
exports.debounceTime = debounceTime;
var DebounceTimeOperator = (function () {
    function DebounceTimeOperator(dueTime, scheduler) {
        this.dueTime = dueTime;
        this.scheduler = scheduler;
    }
    DebounceTimeOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
    };
    return DebounceTimeOperator;
}());
var DebounceTimeSubscriber = (function (_super) {
    __extends(DebounceTimeSubscriber, _super);
    function DebounceTimeSubscriber(destination, dueTime, scheduler) {
        var _this = _super.call(this, destination) || this;
        _this.dueTime = dueTime;
        _this.scheduler = scheduler;
        _this.debouncedSubscription = null;
        _this.lastValue = null;
        _this.hasValue = false;
        return _this;
    }
    DebounceTimeSubscriber.prototype._next = function (value) {
        this.clearDebounce();
        this.lastValue = value;
        this.hasValue = true;
        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
    };
    DebounceTimeSubscriber.prototype._complete = function () {
        this.debouncedNext();
        this.destination.complete();
    };
    DebounceTimeSubscriber.prototype.debouncedNext = function () {
        this.clearDebounce();
        if (this.hasValue) {
            var lastValue = this.lastValue;
            this.lastValue = null;
            this.hasValue = false;
            this.destination.next(lastValue);
        }
    };
    DebounceTimeSubscriber.prototype.clearDebounce = function () {
        var debouncedSubscription = this.debouncedSubscription;
        if (debouncedSubscription !== null) {
            this.remove(debouncedSubscription);
            debouncedSubscription.unsubscribe();
            this.debouncedSubscription = null;
        }
    };
    return DebounceTimeSubscriber;
}(Subscriber_1.Subscriber));
function dispatchNext(subscriber) {
    subscriber.debouncedNext();
}

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/defaultIfEmpty.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function defaultIfEmpty(defaultValue) {
    if (defaultValue === void 0) { defaultValue = null; }
    return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); };
}
exports.defaultIfEmpty = defaultIfEmpty;
var DefaultIfEmptyOperator = (function () {
    function DefaultIfEmptyOperator(defaultValue) {
        this.defaultValue = defaultValue;
    }
    DefaultIfEmptyOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));
    };
    return DefaultIfEmptyOperator;
}());
var DefaultIfEmptySubscriber = (function (_super) {
    __extends(DefaultIfEmptySubscriber, _super);
    function DefaultIfEmptySubscriber(destination, defaultValue) {
        var _this = _super.call(this, destination) || this;
        _this.defaultValue = defaultValue;
        _this.isEmpty = true;
        return _this;
    }
    DefaultIfEmptySubscriber.prototype._next = function (value) {
        this.isEmpty = false;
        this.destination.next(value);
    };
    DefaultIfEmptySubscriber.prototype._complete = function () {
        if (this.isEmpty) {
            this.destination.next(this.defaultValue);
        }
        this.destination.complete();
    };
    return DefaultIfEmptySubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/delay.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var async_1 = require("../scheduler/async");
var isDate_1 = require("../util/isDate");
var Subscriber_1 = require("../Subscriber");
var Notification_1 = require("../Notification");
function delay(delay, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.async; }
    var absoluteDelay = isDate_1.isDate(delay);
    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
    return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };
}
exports.delay = delay;
var DelayOperator = (function () {
    function DelayOperator(delay, scheduler) {
        this.delay = delay;
        this.scheduler = scheduler;
    }
    DelayOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
    };
    return DelayOperator;
}());
var DelaySubscriber = (function (_super) {
    __extends(DelaySubscriber, _super);
    function DelaySubscriber(destination, delay, scheduler) {
        var _this = _super.call(this, destination) || this;
        _this.delay = delay;
        _this.scheduler = scheduler;
        _this.queue = [];
        _this.active = false;
        _this.errored = false;
        return _this;
    }
    DelaySubscriber.dispatch = function (state) {
        var source = state.source;
        var queue = source.queue;
        var scheduler = state.scheduler;
        var destination = state.destination;
        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
            queue.shift().notification.observe(destination);
        }
        if (queue.length > 0) {
            var delay_1 = Math.max(0, queue[0].time - scheduler.now());
            this.schedule(state, delay_1);
        }
        else {
            this.unsubscribe();
            source.active = false;
        }
    };
    DelaySubscriber.prototype._schedule = function (scheduler) {
        this.active = true;
        var destination = this.destination;
        destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {
            source: this, destination: this.destination, scheduler: scheduler
        }));
    };
    DelaySubscriber.prototype.scheduleNotification = function (notification) {
        if (this.errored === true) {
            return;
        }
        var scheduler = this.scheduler;
        var message = new DelayMessage(scheduler.now() + this.delay, notification);
        this.queue.push(message);
        if (this.active === false) {
            this._schedule(scheduler);
        }
    };
    DelaySubscriber.prototype._next = function (value) {
        this.scheduleNotification(Notification_1.Notification.createNext(value));
    };
    DelaySubscriber.prototype._error = function (err) {
        this.errored = true;
        this.queue = [];
        this.destination.error(err);
        this.unsubscribe();
    };
    DelaySubscriber.prototype._complete = function () {
        this.scheduleNotification(Notification_1.Notification.createComplete());
        this.unsubscribe();
    };
    return DelaySubscriber;
}(Subscriber_1.Subscriber));
var DelayMessage = (function () {
    function DelayMessage(time, notification) {
        this.time = time;
        this.notification = notification;
    }
    return DelayMessage;
}());

},{"../Notification":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Notification.js","../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","../util/isDate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isDate.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/delayWhen.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var Observable_1 = require("../Observable");
var OuterSubscriber_1 = require("../OuterSubscriber");
var subscribeToResult_1 = require("../util/subscribeToResult");
function delayWhen(delayDurationSelector, subscriptionDelay) {
    if (subscriptionDelay) {
        return function (source) {
            return new SubscriptionDelayObservable(source, subscriptionDelay)
                .lift(new DelayWhenOperator(delayDurationSelector));
        };
    }
    return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); };
}
exports.delayWhen = delayWhen;
var DelayWhenOperator = (function () {
    function DelayWhenOperator(delayDurationSelector) {
        this.delayDurationSelector = delayDurationSelector;
    }
    DelayWhenOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));
    };
    return DelayWhenOperator;
}());
var DelayWhenSubscriber = (function (_super) {
    __extends(DelayWhenSubscriber, _super);
    function DelayWhenSubscriber(destination, delayDurationSelector) {
        var _this = _super.call(this, destination) || this;
        _this.delayDurationSelector = delayDurationSelector;
        _this.completed = false;
        _this.delayNotifierSubscriptions = [];
        _this.index = 0;
        return _this;
    }
    DelayWhenSubscriber.prototype.notifyNext = function (outerValue, _innerValue, _outerIndex, _innerIndex, innerSub) {
        this.destination.next(outerValue);
        this.removeSubscription(innerSub);
        this.tryComplete();
    };
    DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) {
        this._error(error);
    };
    DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) {
        var value = this.removeSubscription(innerSub);
        if (value) {
            this.destination.next(value);
        }
        this.tryComplete();
    };
    DelayWhenSubscriber.prototype._next = function (value) {
        var index = this.index++;
        try {
            var delayNotifier = this.delayDurationSelector(value, index);
            if (delayNotifier) {
                this.tryDelay(delayNotifier, value);
            }
        }
        catch (err) {
            this.destination.error(err);
        }
    };
    DelayWhenSubscriber.prototype._complete = function () {
        this.completed = true;
        this.tryComplete();
        this.unsubscribe();
    };
    DelayWhenSubscriber.prototype.removeSubscription = function (subscription) {
        subscription.unsubscribe();
        var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);
        if (subscriptionIdx !== -1) {
            this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);
        }
        return subscription.outerValue;
    };
    DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) {
        var notifierSubscription = subscribeToResult_1.subscribeToResult(this, delayNotifier, value);
        if (notifierSubscription && !notifierSubscription.closed) {
            var destination = this.destination;
            destination.add(notifierSubscription);
            this.delayNotifierSubscriptions.push(notifierSubscription);
        }
    };
    DelayWhenSubscriber.prototype.tryComplete = function () {
        if (this.completed && this.delayNotifierSubscriptions.length === 0) {
            this.destination.complete();
        }
    };
    return DelayWhenSubscriber;
}(OuterSubscriber_1.OuterSubscriber));
var SubscriptionDelayObservable = (function (_super) {
    __extends(SubscriptionDelayObservable, _super);
    function SubscriptionDelayObservable(source, subscriptionDelay) {
        var _this = _super.call(this) || this;
        _this.source = source;
        _this.subscriptionDelay = subscriptionDelay;
        return _this;
    }
    SubscriptionDelayObservable.prototype._subscribe = function (subscriber) {
        this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));
    };
    return SubscriptionDelayObservable;
}(Observable_1.Observable));
var SubscriptionDelaySubscriber = (function (_super) {
    __extends(SubscriptionDelaySubscriber, _super);
    function SubscriptionDelaySubscriber(parent, source) {
        var _this = _super.call(this) || this;
        _this.parent = parent;
        _this.source = source;
        _this.sourceSubscribed = false;
        return _this;
    }
    SubscriptionDelaySubscriber.prototype._next = function (unused) {
        this.subscribeToSource();
    };
    SubscriptionDelaySubscriber.prototype._error = function (err) {
        this.unsubscribe();
        this.parent.error(err);
    };
    SubscriptionDelaySubscriber.prototype._complete = function () {
        this.unsubscribe();
        this.subscribeToSource();
    };
    SubscriptionDelaySubscriber.prototype.subscribeToSource = function () {
        if (!this.sourceSubscribed) {
            this.sourceSubscribed = true;
            this.unsubscribe();
            this.source.subscribe(this.parent);
        }
    };
    return SubscriptionDelaySubscriber;
}(Subscriber_1.Subscriber));

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../OuterSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/OuterSubscriber.js","../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../util/subscribeToResult":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToResult.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/dematerialize.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function dematerialize() {
    return function dematerializeOperatorFunction(source) {
        return source.lift(new DeMaterializeOperator());
    };
}
exports.dematerialize = dematerialize;
var DeMaterializeOperator = (function () {
    function DeMaterializeOperator() {
    }
    DeMaterializeOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new DeMaterializeSubscriber(subscriber));
    };
    return DeMaterializeOperator;
}());
var DeMaterializeSubscriber = (function (_super) {
    __extends(DeMaterializeSubscriber, _super);
    function DeMaterializeSubscriber(destination) {
        return _super.call(this, destination) || this;
    }
    DeMaterializeSubscriber.prototype._next = function (value) {
        value.observe(this.destination);
    };
    return DeMaterializeSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/distinct.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
function distinct(keySelector, flushes) {
    return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };
}
exports.distinct = distinct;
var DistinctOperator = (function () {
    function DistinctOperator(keySelector, flushes) {
        this.keySelector = keySelector;
        this.flushes = flushes;
    }
    DistinctOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
    };
    return DistinctOperator;
}());
var DistinctSubscriber = (function (_super) {
    __extends(DistinctSubscriber, _super);
    function DistinctSubscriber(destination, keySelector, flushes) {
        var _this = _super.call(this, destination) || this;
        _this.keySelector = keySelector;
        _this.values = new Set();
        if (flushes) {
            _this.add(innerSubscribe_1.innerSubscribe(flushes, new innerSubscribe_1.SimpleInnerSubscriber(_this)));
        }
        return _this;
    }
    DistinctSubscriber.prototype.notifyNext = function () {
        this.values.clear();
    };
    DistinctSubscriber.prototype.notifyError = function (error) {
        this._error(error);
    };
    DistinctSubscriber.prototype._next = function (value) {
        if (this.keySelector) {
            this._useKeySelector(value);
        }
        else {
            this._finalizeNext(value, value);
        }
    };
    DistinctSubscriber.prototype._useKeySelector = function (value) {
        var key;
        var destination = this.destination;
        try {
            key = this.keySelector(value);
        }
        catch (err) {
            destination.error(err);
            return;
        }
        this._finalizeNext(key, value);
    };
    DistinctSubscriber.prototype._finalizeNext = function (key, value) {
        var values = this.values;
        if (!values.has(key)) {
            values.add(key);
            this.destination.next(value);
        }
    };
    return DistinctSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));
exports.DistinctSubscriber = DistinctSubscriber;

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/distinctUntilChanged.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function distinctUntilChanged(compare, keySelector) {
    return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };
}
exports.distinctUntilChanged = distinctUntilChanged;
var DistinctUntilChangedOperator = (function () {
    function DistinctUntilChangedOperator(compare, keySelector) {
        this.compare = compare;
        this.keySelector = keySelector;
    }
    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
    };
    return DistinctUntilChangedOperator;
}());
var DistinctUntilChangedSubscriber = (function (_super) {
    __extends(DistinctUntilChangedSubscriber, _super);
    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {
        var _this = _super.call(this, destination) || this;
        _this.keySelector = keySelector;
        _this.hasKey = false;
        if (typeof compare === 'function') {
            _this.compare = compare;
        }
        return _this;
    }
    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {
        return x === y;
    };
    DistinctUntilChangedSubscriber.prototype._next = function (value) {
        var key;
        try {
            var keySelector = this.keySelector;
            key = keySelector ? keySelector(value) : value;
        }
        catch (err) {
            return this.destination.error(err);
        }
        var result = false;
        if (this.hasKey) {
            try {
                var compare = this.compare;
                result = compare(this.key, key);
            }
            catch (err) {
                return this.destination.error(err);
            }
        }
        else {
            this.hasKey = true;
        }
        if (!result) {
            this.key = key;
            this.destination.next(value);
        }
    };
    return DistinctUntilChangedSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/distinctUntilKeyChanged.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var distinctUntilChanged_1 = require("./distinctUntilChanged");
function distinctUntilKeyChanged(key, compare) {
    return distinctUntilChanged_1.distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });
}
exports.distinctUntilKeyChanged = distinctUntilKeyChanged;

},{"./distinctUntilChanged":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/distinctUntilChanged.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/elementAt.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
var filter_1 = require("./filter");
var throwIfEmpty_1 = require("./throwIfEmpty");
var defaultIfEmpty_1 = require("./defaultIfEmpty");
var take_1 = require("./take");
function elementAt(index, defaultValue) {
    if (index < 0) {
        throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError();
    }
    var hasDefaultValue = arguments.length >= 2;
    return function (source) { return source.pipe(filter_1.filter(function (v, i) { return i === index; }), take_1.take(1), hasDefaultValue
        ? defaultIfEmpty_1.defaultIfEmpty(defaultValue)
        : throwIfEmpty_1.throwIfEmpty(function () { return new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError(); })); };
}
exports.elementAt = elementAt;

},{"../util/ArgumentOutOfRangeError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js","./defaultIfEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/defaultIfEmpty.js","./filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/filter.js","./take":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/take.js","./throwIfEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/throwIfEmpty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/endWith.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var concat_1 = require("../observable/concat");
var of_1 = require("../observable/of");
function endWith() {
    var array = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        array[_i] = arguments[_i];
    }
    return function (source) { return concat_1.concat(source, of_1.of.apply(void 0, array)); };
}
exports.endWith = endWith;

},{"../observable/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/concat.js","../observable/of":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/of.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/every.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function every(predicate, thisArg) {
    return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); };
}
exports.every = every;
var EveryOperator = (function () {
    function EveryOperator(predicate, thisArg, source) {
        this.predicate = predicate;
        this.thisArg = thisArg;
        this.source = source;
    }
    EveryOperator.prototype.call = function (observer, source) {
        return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));
    };
    return EveryOperator;
}());
var EverySubscriber = (function (_super) {
    __extends(EverySubscriber, _super);
    function EverySubscriber(destination, predicate, thisArg, source) {
        var _this = _super.call(this, destination) || this;
        _this.predicate = predicate;
        _this.thisArg = thisArg;
        _this.source = source;
        _this.index = 0;
        _this.thisArg = thisArg || _this;
        return _this;
    }
    EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {
        this.destination.next(everyValueMatch);
        this.destination.complete();
    };
    EverySubscriber.prototype._next = function (value) {
        var result = false;
        try {
            result = this.predicate.call(this.thisArg, value, this.index++, this.source);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        if (!result) {
            this.notifyComplete(false);
        }
    };
    EverySubscriber.prototype._complete = function () {
        this.notifyComplete(true);
    };
    return EverySubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/exhaust.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
function exhaust() {
    return function (source) { return source.lift(new SwitchFirstOperator()); };
}
exports.exhaust = exhaust;
var SwitchFirstOperator = (function () {
    function SwitchFirstOperator() {
    }
    SwitchFirstOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new SwitchFirstSubscriber(subscriber));
    };
    return SwitchFirstOperator;
}());
var SwitchFirstSubscriber = (function (_super) {
    __extends(SwitchFirstSubscriber, _super);
    function SwitchFirstSubscriber(destination) {
        var _this = _super.call(this, destination) || this;
        _this.hasCompleted = false;
        _this.hasSubscription = false;
        return _this;
    }
    SwitchFirstSubscriber.prototype._next = function (value) {
        if (!this.hasSubscription) {
            this.hasSubscription = true;
            this.add(innerSubscribe_1.innerSubscribe(value, new innerSubscribe_1.SimpleInnerSubscriber(this)));
        }
    };
    SwitchFirstSubscriber.prototype._complete = function () {
        this.hasCompleted = true;
        if (!this.hasSubscription) {
            this.destination.complete();
        }
    };
    SwitchFirstSubscriber.prototype.notifyComplete = function () {
        this.hasSubscription = false;
        if (this.hasCompleted) {
            this.destination.complete();
        }
    };
    return SwitchFirstSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/exhaustMap.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var map_1 = require("./map");
var from_1 = require("../observable/from");
var innerSubscribe_1 = require("../innerSubscribe");
function exhaustMap(project, resultSelector) {
    if (resultSelector) {
        return function (source) { return source.pipe(exhaustMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
    }
    return function (source) {
        return source.lift(new ExhaustMapOperator(project));
    };
}
exports.exhaustMap = exhaustMap;
var ExhaustMapOperator = (function () {
    function ExhaustMapOperator(project) {
        this.project = project;
    }
    ExhaustMapOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));
    };
    return ExhaustMapOperator;
}());
var ExhaustMapSubscriber = (function (_super) {
    __extends(ExhaustMapSubscriber, _super);
    function ExhaustMapSubscriber(destination, project) {
        var _this = _super.call(this, destination) || this;
        _this.project = project;
        _this.hasSubscription = false;
        _this.hasCompleted = false;
        _this.index = 0;
        return _this;
    }
    ExhaustMapSubscriber.prototype._next = function (value) {
        if (!this.hasSubscription) {
            this.tryNext(value);
        }
    };
    ExhaustMapSubscriber.prototype.tryNext = function (value) {
        var result;
        var index = this.index++;
        try {
            result = this.project(value, index);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        this.hasSubscription = true;
        this._innerSub(result);
    };
    ExhaustMapSubscriber.prototype._innerSub = function (result) {
        var innerSubscriber = new innerSubscribe_1.SimpleInnerSubscriber(this);
        var destination = this.destination;
        destination.add(innerSubscriber);
        var innerSubscription = innerSubscribe_1.innerSubscribe(result, innerSubscriber);
        if (innerSubscription !== innerSubscriber) {
            destination.add(innerSubscription);
        }
    };
    ExhaustMapSubscriber.prototype._complete = function () {
        this.hasCompleted = true;
        if (!this.hasSubscription) {
            this.destination.complete();
        }
        this.unsubscribe();
    };
    ExhaustMapSubscriber.prototype.notifyNext = function (innerValue) {
        this.destination.next(innerValue);
    };
    ExhaustMapSubscriber.prototype.notifyError = function (err) {
        this.destination.error(err);
    };
    ExhaustMapSubscriber.prototype.notifyComplete = function () {
        this.hasSubscription = false;
        if (this.hasCompleted) {
            this.destination.complete();
        }
    };
    return ExhaustMapSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js","../observable/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/from.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/expand.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
function expand(project, concurrent, scheduler) {
    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
    return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };
}
exports.expand = expand;
var ExpandOperator = (function () {
    function ExpandOperator(project, concurrent, scheduler) {
        this.project = project;
        this.concurrent = concurrent;
        this.scheduler = scheduler;
    }
    ExpandOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
    };
    return ExpandOperator;
}());
exports.ExpandOperator = ExpandOperator;
var ExpandSubscriber = (function (_super) {
    __extends(ExpandSubscriber, _super);
    function ExpandSubscriber(destination, project, concurrent, scheduler) {
        var _this = _super.call(this, destination) || this;
        _this.project = project;
        _this.concurrent = concurrent;
        _this.scheduler = scheduler;
        _this.index = 0;
        _this.active = 0;
        _this.hasCompleted = false;
        if (concurrent < Number.POSITIVE_INFINITY) {
            _this.buffer = [];
        }
        return _this;
    }
    ExpandSubscriber.dispatch = function (arg) {
        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;
        subscriber.subscribeToProjection(result, value, index);
    };
    ExpandSubscriber.prototype._next = function (value) {
        var destination = this.destination;
        if (destination.closed) {
            this._complete();
            return;
        }
        var index = this.index++;
        if (this.active < this.concurrent) {
            destination.next(value);
            try {
                var project = this.project;
                var result = project(value, index);
                if (!this.scheduler) {
                    this.subscribeToProjection(result, value, index);
                }
                else {
                    var state = { subscriber: this, result: result, value: value, index: index };
                    var destination_1 = this.destination;
                    destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
                }
            }
            catch (e) {
                destination.error(e);
            }
        }
        else {
            this.buffer.push(value);
        }
    };
    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {
        this.active++;
        var destination = this.destination;
        destination.add(innerSubscribe_1.innerSubscribe(result, new innerSubscribe_1.SimpleInnerSubscriber(this)));
    };
    ExpandSubscriber.prototype._complete = function () {
        this.hasCompleted = true;
        if (this.hasCompleted && this.active === 0) {
            this.destination.complete();
        }
        this.unsubscribe();
    };
    ExpandSubscriber.prototype.notifyNext = function (innerValue) {
        this._next(innerValue);
    };
    ExpandSubscriber.prototype.notifyComplete = function () {
        var buffer = this.buffer;
        this.active--;
        if (buffer && buffer.length > 0) {
            this._next(buffer.shift());
        }
        if (this.hasCompleted && this.active === 0) {
            this.destination.complete();
        }
    };
    return ExpandSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));
exports.ExpandSubscriber = ExpandSubscriber;

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/filter.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function filter(predicate, thisArg) {
    return function filterOperatorFunction(source) {
        return source.lift(new FilterOperator(predicate, thisArg));
    };
}
exports.filter = filter;
var FilterOperator = (function () {
    function FilterOperator(predicate, thisArg) {
        this.predicate = predicate;
        this.thisArg = thisArg;
    }
    FilterOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
    };
    return FilterOperator;
}());
var FilterSubscriber = (function (_super) {
    __extends(FilterSubscriber, _super);
    function FilterSubscriber(destination, predicate, thisArg) {
        var _this = _super.call(this, destination) || this;
        _this.predicate = predicate;
        _this.thisArg = thisArg;
        _this.count = 0;
        return _this;
    }
    FilterSubscriber.prototype._next = function (value) {
        var result;
        try {
            result = this.predicate.call(this.thisArg, value, this.count++);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        if (result) {
            this.destination.next(value);
        }
    };
    return FilterSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/finalize.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var Subscription_1 = require("../Subscription");
function finalize(callback) {
    return function (source) { return source.lift(new FinallyOperator(callback)); };
}
exports.finalize = finalize;
var FinallyOperator = (function () {
    function FinallyOperator(callback) {
        this.callback = callback;
    }
    FinallyOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new FinallySubscriber(subscriber, this.callback));
    };
    return FinallyOperator;
}());
var FinallySubscriber = (function (_super) {
    __extends(FinallySubscriber, _super);
    function FinallySubscriber(destination, callback) {
        var _this = _super.call(this, destination) || this;
        _this.add(new Subscription_1.Subscription(callback));
        return _this;
    }
    return FinallySubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/find.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function find(predicate, thisArg) {
    if (typeof predicate !== 'function') {
        throw new TypeError('predicate is not a function');
    }
    return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); };
}
exports.find = find;
var FindValueOperator = (function () {
    function FindValueOperator(predicate, source, yieldIndex, thisArg) {
        this.predicate = predicate;
        this.source = source;
        this.yieldIndex = yieldIndex;
        this.thisArg = thisArg;
    }
    FindValueOperator.prototype.call = function (observer, source) {
        return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));
    };
    return FindValueOperator;
}());
exports.FindValueOperator = FindValueOperator;
var FindValueSubscriber = (function (_super) {
    __extends(FindValueSubscriber, _super);
    function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {
        var _this = _super.call(this, destination) || this;
        _this.predicate = predicate;
        _this.source = source;
        _this.yieldIndex = yieldIndex;
        _this.thisArg = thisArg;
        _this.index = 0;
        return _this;
    }
    FindValueSubscriber.prototype.notifyComplete = function (value) {
        var destination = this.destination;
        destination.next(value);
        destination.complete();
        this.unsubscribe();
    };
    FindValueSubscriber.prototype._next = function (value) {
        var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;
        var index = this.index++;
        try {
            var result = predicate.call(thisArg || this, value, index, this.source);
            if (result) {
                this.notifyComplete(this.yieldIndex ? index : value);
            }
        }
        catch (err) {
            this.destination.error(err);
        }
    };
    FindValueSubscriber.prototype._complete = function () {
        this.notifyComplete(this.yieldIndex ? -1 : undefined);
    };
    return FindValueSubscriber;
}(Subscriber_1.Subscriber));
exports.FindValueSubscriber = FindValueSubscriber;

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/findIndex.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var find_1 = require("../operators/find");
function findIndex(predicate, thisArg) {
    return function (source) { return source.lift(new find_1.FindValueOperator(predicate, source, true, thisArg)); };
}
exports.findIndex = findIndex;

},{"../operators/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/find.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/first.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var EmptyError_1 = require("../util/EmptyError");
var filter_1 = require("./filter");
var take_1 = require("./take");
var defaultIfEmpty_1 = require("./defaultIfEmpty");
var throwIfEmpty_1 = require("./throwIfEmpty");
var identity_1 = require("../util/identity");
function first(predicate, defaultValue) {
    var hasDefaultValue = arguments.length >= 2;
    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, take_1.take(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
}
exports.first = first;

},{"../util/EmptyError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/EmptyError.js","../util/identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/identity.js","./defaultIfEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/defaultIfEmpty.js","./filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/filter.js","./take":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/take.js","./throwIfEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/throwIfEmpty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/groupBy.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var Subscription_1 = require("../Subscription");
var Observable_1 = require("../Observable");
var Subject_1 = require("../Subject");
function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {
    return function (source) {
        return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));
    };
}
exports.groupBy = groupBy;
var GroupByOperator = (function () {
    function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {
        this.keySelector = keySelector;
        this.elementSelector = elementSelector;
        this.durationSelector = durationSelector;
        this.subjectSelector = subjectSelector;
    }
    GroupByOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));
    };
    return GroupByOperator;
}());
var GroupBySubscriber = (function (_super) {
    __extends(GroupBySubscriber, _super);
    function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {
        var _this = _super.call(this, destination) || this;
        _this.keySelector = keySelector;
        _this.elementSelector = elementSelector;
        _this.durationSelector = durationSelector;
        _this.subjectSelector = subjectSelector;
        _this.groups = null;
        _this.attemptedToUnsubscribe = false;
        _this.count = 0;
        return _this;
    }
    GroupBySubscriber.prototype._next = function (value) {
        var key;
        try {
            key = this.keySelector(value);
        }
        catch (err) {
            this.error(err);
            return;
        }
        this._group(value, key);
    };
    GroupBySubscriber.prototype._group = function (value, key) {
        var groups = this.groups;
        if (!groups) {
            groups = this.groups = new Map();
        }
        var group = groups.get(key);
        var element;
        if (this.elementSelector) {
            try {
                element = this.elementSelector(value);
            }
            catch (err) {
                this.error(err);
            }
        }
        else {
            element = value;
        }
        if (!group) {
            group = (this.subjectSelector ? this.subjectSelector() : new Subject_1.Subject());
            groups.set(key, group);
            var groupedObservable = new GroupedObservable(key, group, this);
            this.destination.next(groupedObservable);
            if (this.durationSelector) {
                var duration = void 0;
                try {
                    duration = this.durationSelector(new GroupedObservable(key, group));
                }
                catch (err) {
                    this.error(err);
                    return;
                }
                this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));
            }
        }
        if (!group.closed) {
            group.next(element);
        }
    };
    GroupBySubscriber.prototype._error = function (err) {
        var groups = this.groups;
        if (groups) {
            groups.forEach(function (group, key) {
                group.error(err);
            });
            groups.clear();
        }
        this.destination.error(err);
    };
    GroupBySubscriber.prototype._complete = function () {
        var groups = this.groups;
        if (groups) {
            groups.forEach(function (group, key) {
                group.complete();
            });
            groups.clear();
        }
        this.destination.complete();
    };
    GroupBySubscriber.prototype.removeGroup = function (key) {
        this.groups.delete(key);
    };
    GroupBySubscriber.prototype.unsubscribe = function () {
        if (!this.closed) {
            this.attemptedToUnsubscribe = true;
            if (this.count === 0) {
                _super.prototype.unsubscribe.call(this);
            }
        }
    };
    return GroupBySubscriber;
}(Subscriber_1.Subscriber));
var GroupDurationSubscriber = (function (_super) {
    __extends(GroupDurationSubscriber, _super);
    function GroupDurationSubscriber(key, group, parent) {
        var _this = _super.call(this, group) || this;
        _this.key = key;
        _this.group = group;
        _this.parent = parent;
        return _this;
    }
    GroupDurationSubscriber.prototype._next = function (value) {
        this.complete();
    };
    GroupDurationSubscriber.prototype._unsubscribe = function () {
        var _a = this, parent = _a.parent, key = _a.key;
        this.key = this.parent = null;
        if (parent) {
            parent.removeGroup(key);
        }
    };
    return GroupDurationSubscriber;
}(Subscriber_1.Subscriber));
var GroupedObservable = (function (_super) {
    __extends(GroupedObservable, _super);
    function GroupedObservable(key, groupSubject, refCountSubscription) {
        var _this = _super.call(this) || this;
        _this.key = key;
        _this.groupSubject = groupSubject;
        _this.refCountSubscription = refCountSubscription;
        return _this;
    }
    GroupedObservable.prototype._subscribe = function (subscriber) {
        var subscription = new Subscription_1.Subscription();
        var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;
        if (refCountSubscription && !refCountSubscription.closed) {
            subscription.add(new InnerRefCountSubscription(refCountSubscription));
        }
        subscription.add(groupSubject.subscribe(subscriber));
        return subscription;
    };
    return GroupedObservable;
}(Observable_1.Observable));
exports.GroupedObservable = GroupedObservable;
var InnerRefCountSubscription = (function (_super) {
    __extends(InnerRefCountSubscription, _super);
    function InnerRefCountSubscription(parent) {
        var _this = _super.call(this) || this;
        _this.parent = parent;
        parent.count++;
        return _this;
    }
    InnerRefCountSubscription.prototype.unsubscribe = function () {
        var parent = this.parent;
        if (!parent.closed && !this.closed) {
            _super.prototype.unsubscribe.call(this);
            parent.count -= 1;
            if (parent.count === 0 && parent.attemptedToUnsubscribe) {
                parent.unsubscribe();
            }
        }
    };
    return InnerRefCountSubscription;
}(Subscription_1.Subscription));

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/ignoreElements.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function ignoreElements() {
    return function ignoreElementsOperatorFunction(source) {
        return source.lift(new IgnoreElementsOperator());
    };
}
exports.ignoreElements = ignoreElements;
var IgnoreElementsOperator = (function () {
    function IgnoreElementsOperator() {
    }
    IgnoreElementsOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new IgnoreElementsSubscriber(subscriber));
    };
    return IgnoreElementsOperator;
}());
var IgnoreElementsSubscriber = (function (_super) {
    __extends(IgnoreElementsSubscriber, _super);
    function IgnoreElementsSubscriber() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    IgnoreElementsSubscriber.prototype._next = function (unused) {
    };
    return IgnoreElementsSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/isEmpty.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function isEmpty() {
    return function (source) { return source.lift(new IsEmptyOperator()); };
}
exports.isEmpty = isEmpty;
var IsEmptyOperator = (function () {
    function IsEmptyOperator() {
    }
    IsEmptyOperator.prototype.call = function (observer, source) {
        return source.subscribe(new IsEmptySubscriber(observer));
    };
    return IsEmptyOperator;
}());
var IsEmptySubscriber = (function (_super) {
    __extends(IsEmptySubscriber, _super);
    function IsEmptySubscriber(destination) {
        return _super.call(this, destination) || this;
    }
    IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) {
        var destination = this.destination;
        destination.next(isEmpty);
        destination.complete();
    };
    IsEmptySubscriber.prototype._next = function (value) {
        this.notifyComplete(false);
    };
    IsEmptySubscriber.prototype._complete = function () {
        this.notifyComplete(true);
    };
    return IsEmptySubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/last.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var EmptyError_1 = require("../util/EmptyError");
var filter_1 = require("./filter");
var takeLast_1 = require("./takeLast");
var throwIfEmpty_1 = require("./throwIfEmpty");
var defaultIfEmpty_1 = require("./defaultIfEmpty");
var identity_1 = require("../util/identity");
function last(predicate, defaultValue) {
    var hasDefaultValue = arguments.length >= 2;
    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, takeLast_1.takeLast(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
}
exports.last = last;

},{"../util/EmptyError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/EmptyError.js","../util/identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/identity.js","./defaultIfEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/defaultIfEmpty.js","./filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/filter.js","./takeLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/takeLast.js","./throwIfEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/throwIfEmpty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function map(project, thisArg) {
    return function mapOperation(source) {
        if (typeof project !== 'function') {
            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
        }
        return source.lift(new MapOperator(project, thisArg));
    };
}
exports.map = map;
var MapOperator = (function () {
    function MapOperator(project, thisArg) {
        this.project = project;
        this.thisArg = thisArg;
    }
    MapOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
    };
    return MapOperator;
}());
exports.MapOperator = MapOperator;
var MapSubscriber = (function (_super) {
    __extends(MapSubscriber, _super);
    function MapSubscriber(destination, project, thisArg) {
        var _this = _super.call(this, destination) || this;
        _this.project = project;
        _this.count = 0;
        _this.thisArg = thisArg || _this;
        return _this;
    }
    MapSubscriber.prototype._next = function (value) {
        var result;
        try {
            result = this.project.call(this.thisArg, value, this.count++);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        this.destination.next(result);
    };
    return MapSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mapTo.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function mapTo(value) {
    return function (source) { return source.lift(new MapToOperator(value)); };
}
exports.mapTo = mapTo;
var MapToOperator = (function () {
    function MapToOperator(value) {
        this.value = value;
    }
    MapToOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new MapToSubscriber(subscriber, this.value));
    };
    return MapToOperator;
}());
var MapToSubscriber = (function (_super) {
    __extends(MapToSubscriber, _super);
    function MapToSubscriber(destination, value) {
        var _this = _super.call(this, destination) || this;
        _this.value = value;
        return _this;
    }
    MapToSubscriber.prototype._next = function (x) {
        this.destination.next(this.value);
    };
    return MapToSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/materialize.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var Notification_1 = require("../Notification");
function materialize() {
    return function materializeOperatorFunction(source) {
        return source.lift(new MaterializeOperator());
    };
}
exports.materialize = materialize;
var MaterializeOperator = (function () {
    function MaterializeOperator() {
    }
    MaterializeOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new MaterializeSubscriber(subscriber));
    };
    return MaterializeOperator;
}());
var MaterializeSubscriber = (function (_super) {
    __extends(MaterializeSubscriber, _super);
    function MaterializeSubscriber(destination) {
        return _super.call(this, destination) || this;
    }
    MaterializeSubscriber.prototype._next = function (value) {
        this.destination.next(Notification_1.Notification.createNext(value));
    };
    MaterializeSubscriber.prototype._error = function (err) {
        var destination = this.destination;
        destination.next(Notification_1.Notification.createError(err));
        destination.complete();
    };
    MaterializeSubscriber.prototype._complete = function () {
        var destination = this.destination;
        destination.next(Notification_1.Notification.createComplete());
        destination.complete();
    };
    return MaterializeSubscriber;
}(Subscriber_1.Subscriber));

},{"../Notification":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Notification.js","../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/max.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var reduce_1 = require("./reduce");
function max(comparer) {
    var max = (typeof comparer === 'function')
        ? function (x, y) { return comparer(x, y) > 0 ? x : y; }
        : function (x, y) { return x > y ? x : y; };
    return reduce_1.reduce(max);
}
exports.max = max;

},{"./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/merge.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var merge_1 = require("../observable/merge");
function merge() {
    var observables = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        observables[_i] = arguments[_i];
    }
    return function (source) { return source.lift.call(merge_1.merge.apply(void 0, [source].concat(observables))); };
}
exports.merge = merge;

},{"../observable/merge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/merge.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeAll.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var mergeMap_1 = require("./mergeMap");
var identity_1 = require("../util/identity");
function mergeAll(concurrent) {
    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
    return mergeMap_1.mergeMap(identity_1.identity, concurrent);
}
exports.mergeAll = mergeAll;

},{"../util/identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/identity.js","./mergeMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeMap.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeMap.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var map_1 = require("./map");
var from_1 = require("../observable/from");
var innerSubscribe_1 = require("../innerSubscribe");
function mergeMap(project, resultSelector, concurrent) {
    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
    if (typeof resultSelector === 'function') {
        return function (source) { return source.pipe(mergeMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); };
    }
    else if (typeof resultSelector === 'number') {
        concurrent = resultSelector;
    }
    return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); };
}
exports.mergeMap = mergeMap;
var MergeMapOperator = (function () {
    function MergeMapOperator(project, concurrent) {
        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
        this.project = project;
        this.concurrent = concurrent;
    }
    MergeMapOperator.prototype.call = function (observer, source) {
        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));
    };
    return MergeMapOperator;
}());
exports.MergeMapOperator = MergeMapOperator;
var MergeMapSubscriber = (function (_super) {
    __extends(MergeMapSubscriber, _super);
    function MergeMapSubscriber(destination, project, concurrent) {
        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
        var _this = _super.call(this, destination) || this;
        _this.project = project;
        _this.concurrent = concurrent;
        _this.hasCompleted = false;
        _this.buffer = [];
        _this.active = 0;
        _this.index = 0;
        return _this;
    }
    MergeMapSubscriber.prototype._next = function (value) {
        if (this.active < this.concurrent) {
            this._tryNext(value);
        }
        else {
            this.buffer.push(value);
        }
    };
    MergeMapSubscriber.prototype._tryNext = function (value) {
        var result;
        var index = this.index++;
        try {
            result = this.project(value, index);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        this.active++;
        this._innerSub(result);
    };
    MergeMapSubscriber.prototype._innerSub = function (ish) {
        var innerSubscriber = new innerSubscribe_1.SimpleInnerSubscriber(this);
        var destination = this.destination;
        destination.add(innerSubscriber);
        var innerSubscription = innerSubscribe_1.innerSubscribe(ish, innerSubscriber);
        if (innerSubscription !== innerSubscriber) {
            destination.add(innerSubscription);
        }
    };
    MergeMapSubscriber.prototype._complete = function () {
        this.hasCompleted = true;
        if (this.active === 0 && this.buffer.length === 0) {
            this.destination.complete();
        }
        this.unsubscribe();
    };
    MergeMapSubscriber.prototype.notifyNext = function (innerValue) {
        this.destination.next(innerValue);
    };
    MergeMapSubscriber.prototype.notifyComplete = function () {
        var buffer = this.buffer;
        this.active--;
        if (buffer.length > 0) {
            this._next(buffer.shift());
        }
        else if (this.active === 0 && this.hasCompleted) {
            this.destination.complete();
        }
    };
    return MergeMapSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));
exports.MergeMapSubscriber = MergeMapSubscriber;
exports.flatMap = mergeMap;

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js","../observable/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/from.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeMapTo.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var mergeMap_1 = require("./mergeMap");
function mergeMapTo(innerObservable, resultSelector, concurrent) {
    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
    if (typeof resultSelector === 'function') {
        return mergeMap_1.mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
    }
    if (typeof resultSelector === 'number') {
        concurrent = resultSelector;
    }
    return mergeMap_1.mergeMap(function () { return innerObservable; }, concurrent);
}
exports.mergeMapTo = mergeMapTo;

},{"./mergeMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeMap.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeScan.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
function mergeScan(accumulator, seed, concurrent) {
    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
    return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); };
}
exports.mergeScan = mergeScan;
var MergeScanOperator = (function () {
    function MergeScanOperator(accumulator, seed, concurrent) {
        this.accumulator = accumulator;
        this.seed = seed;
        this.concurrent = concurrent;
    }
    MergeScanOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));
    };
    return MergeScanOperator;
}());
exports.MergeScanOperator = MergeScanOperator;
var MergeScanSubscriber = (function (_super) {
    __extends(MergeScanSubscriber, _super);
    function MergeScanSubscriber(destination, accumulator, acc, concurrent) {
        var _this = _super.call(this, destination) || this;
        _this.accumulator = accumulator;
        _this.acc = acc;
        _this.concurrent = concurrent;
        _this.hasValue = false;
        _this.hasCompleted = false;
        _this.buffer = [];
        _this.active = 0;
        _this.index = 0;
        return _this;
    }
    MergeScanSubscriber.prototype._next = function (value) {
        if (this.active < this.concurrent) {
            var index = this.index++;
            var destination = this.destination;
            var ish = void 0;
            try {
                var accumulator = this.accumulator;
                ish = accumulator(this.acc, value, index);
            }
            catch (e) {
                return destination.error(e);
            }
            this.active++;
            this._innerSub(ish);
        }
        else {
            this.buffer.push(value);
        }
    };
    MergeScanSubscriber.prototype._innerSub = function (ish) {
        var innerSubscriber = new innerSubscribe_1.SimpleInnerSubscriber(this);
        var destination = this.destination;
        destination.add(innerSubscriber);
        var innerSubscription = innerSubscribe_1.innerSubscribe(ish, innerSubscriber);
        if (innerSubscription !== innerSubscriber) {
            destination.add(innerSubscription);
        }
    };
    MergeScanSubscriber.prototype._complete = function () {
        this.hasCompleted = true;
        if (this.active === 0 && this.buffer.length === 0) {
            if (this.hasValue === false) {
                this.destination.next(this.acc);
            }
            this.destination.complete();
        }
        this.unsubscribe();
    };
    MergeScanSubscriber.prototype.notifyNext = function (innerValue) {
        var destination = this.destination;
        this.acc = innerValue;
        this.hasValue = true;
        destination.next(innerValue);
    };
    MergeScanSubscriber.prototype.notifyComplete = function () {
        var buffer = this.buffer;
        this.active--;
        if (buffer.length > 0) {
            this._next(buffer.shift());
        }
        else if (this.active === 0 && this.hasCompleted) {
            if (this.hasValue === false) {
                this.destination.next(this.acc);
            }
            this.destination.complete();
        }
    };
    return MergeScanSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));
exports.MergeScanSubscriber = MergeScanSubscriber;

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/min.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var reduce_1 = require("./reduce");
function min(comparer) {
    var min = (typeof comparer === 'function')
        ? function (x, y) { return comparer(x, y) < 0 ? x : y; }
        : function (x, y) { return x < y ? x : y; };
    return reduce_1.reduce(min);
}
exports.min = min;

},{"./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/multicast.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ConnectableObservable_1 = require("../observable/ConnectableObservable");
function multicast(subjectOrSubjectFactory, selector) {
    return function multicastOperatorFunction(source) {
        var subjectFactory;
        if (typeof subjectOrSubjectFactory === 'function') {
            subjectFactory = subjectOrSubjectFactory;
        }
        else {
            subjectFactory = function subjectFactory() {
                return subjectOrSubjectFactory;
            };
        }
        if (typeof selector === 'function') {
            return source.lift(new MulticastOperator(subjectFactory, selector));
        }
        var connectable = Object.create(source, ConnectableObservable_1.connectableObservableDescriptor);
        connectable.source = source;
        connectable.subjectFactory = subjectFactory;
        return connectable;
    };
}
exports.multicast = multicast;
var MulticastOperator = (function () {
    function MulticastOperator(subjectFactory, selector) {
        this.subjectFactory = subjectFactory;
        this.selector = selector;
    }
    MulticastOperator.prototype.call = function (subscriber, source) {
        var selector = this.selector;
        var subject = this.subjectFactory();
        var subscription = selector(subject).subscribe(subscriber);
        subscription.add(source.subscribe(subject));
        return subscription;
    };
    return MulticastOperator;
}());
exports.MulticastOperator = MulticastOperator;

},{"../observable/ConnectableObservable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/ConnectableObservable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/observeOn.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var Notification_1 = require("../Notification");
function observeOn(scheduler, delay) {
    if (delay === void 0) { delay = 0; }
    return function observeOnOperatorFunction(source) {
        return source.lift(new ObserveOnOperator(scheduler, delay));
    };
}
exports.observeOn = observeOn;
var ObserveOnOperator = (function () {
    function ObserveOnOperator(scheduler, delay) {
        if (delay === void 0) { delay = 0; }
        this.scheduler = scheduler;
        this.delay = delay;
    }
    ObserveOnOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
    };
    return ObserveOnOperator;
}());
exports.ObserveOnOperator = ObserveOnOperator;
var ObserveOnSubscriber = (function (_super) {
    __extends(ObserveOnSubscriber, _super);
    function ObserveOnSubscriber(destination, scheduler, delay) {
        if (delay === void 0) { delay = 0; }
        var _this = _super.call(this, destination) || this;
        _this.scheduler = scheduler;
        _this.delay = delay;
        return _this;
    }
    ObserveOnSubscriber.dispatch = function (arg) {
        var notification = arg.notification, destination = arg.destination;
        notification.observe(destination);
        this.unsubscribe();
    };
    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {
        var destination = this.destination;
        destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));
    };
    ObserveOnSubscriber.prototype._next = function (value) {
        this.scheduleMessage(Notification_1.Notification.createNext(value));
    };
    ObserveOnSubscriber.prototype._error = function (err) {
        this.scheduleMessage(Notification_1.Notification.createError(err));
        this.unsubscribe();
    };
    ObserveOnSubscriber.prototype._complete = function () {
        this.scheduleMessage(Notification_1.Notification.createComplete());
        this.unsubscribe();
    };
    return ObserveOnSubscriber;
}(Subscriber_1.Subscriber));
exports.ObserveOnSubscriber = ObserveOnSubscriber;
var ObserveOnMessage = (function () {
    function ObserveOnMessage(notification, destination) {
        this.notification = notification;
        this.destination = destination;
    }
    return ObserveOnMessage;
}());
exports.ObserveOnMessage = ObserveOnMessage;

},{"../Notification":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Notification.js","../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/onErrorResumeNext.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var from_1 = require("../observable/from");
var isArray_1 = require("../util/isArray");
var innerSubscribe_1 = require("../innerSubscribe");
function onErrorResumeNext() {
    var nextSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        nextSources[_i] = arguments[_i];
    }
    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
        nextSources = nextSources[0];
    }
    return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); };
}
exports.onErrorResumeNext = onErrorResumeNext;
function onErrorResumeNextStatic() {
    var nextSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        nextSources[_i] = arguments[_i];
    }
    var source = undefined;
    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
        nextSources = nextSources[0];
    }
    source = nextSources.shift();
    return from_1.from(source).lift(new OnErrorResumeNextOperator(nextSources));
}
exports.onErrorResumeNextStatic = onErrorResumeNextStatic;
var OnErrorResumeNextOperator = (function () {
    function OnErrorResumeNextOperator(nextSources) {
        this.nextSources = nextSources;
    }
    OnErrorResumeNextOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));
    };
    return OnErrorResumeNextOperator;
}());
var OnErrorResumeNextSubscriber = (function (_super) {
    __extends(OnErrorResumeNextSubscriber, _super);
    function OnErrorResumeNextSubscriber(destination, nextSources) {
        var _this = _super.call(this, destination) || this;
        _this.destination = destination;
        _this.nextSources = nextSources;
        return _this;
    }
    OnErrorResumeNextSubscriber.prototype.notifyError = function () {
        this.subscribeToNextSource();
    };
    OnErrorResumeNextSubscriber.prototype.notifyComplete = function () {
        this.subscribeToNextSource();
    };
    OnErrorResumeNextSubscriber.prototype._error = function (err) {
        this.subscribeToNextSource();
        this.unsubscribe();
    };
    OnErrorResumeNextSubscriber.prototype._complete = function () {
        this.subscribeToNextSource();
        this.unsubscribe();
    };
    OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () {
        var next = this.nextSources.shift();
        if (!!next) {
            var innerSubscriber = new innerSubscribe_1.SimpleInnerSubscriber(this);
            var destination = this.destination;
            destination.add(innerSubscriber);
            var innerSubscription = innerSubscribe_1.innerSubscribe(next, innerSubscriber);
            if (innerSubscription !== innerSubscriber) {
                destination.add(innerSubscription);
            }
        }
        else {
            this.destination.complete();
        }
    };
    return OnErrorResumeNextSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js","../observable/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/from.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/pairwise.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function pairwise() {
    return function (source) { return source.lift(new PairwiseOperator()); };
}
exports.pairwise = pairwise;
var PairwiseOperator = (function () {
    function PairwiseOperator() {
    }
    PairwiseOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new PairwiseSubscriber(subscriber));
    };
    return PairwiseOperator;
}());
var PairwiseSubscriber = (function (_super) {
    __extends(PairwiseSubscriber, _super);
    function PairwiseSubscriber(destination) {
        var _this = _super.call(this, destination) || this;
        _this.hasPrev = false;
        return _this;
    }
    PairwiseSubscriber.prototype._next = function (value) {
        var pair;
        if (this.hasPrev) {
            pair = [this.prev, value];
        }
        else {
            this.hasPrev = true;
        }
        this.prev = value;
        if (pair) {
            this.destination.next(pair);
        }
    };
    return PairwiseSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/partition.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var not_1 = require("../util/not");
var filter_1 = require("./filter");
function partition(predicate, thisArg) {
    return function (source) { return [
        filter_1.filter(predicate, thisArg)(source),
        filter_1.filter(not_1.not(predicate, thisArg))(source)
    ]; };
}
exports.partition = partition;

},{"../util/not":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/not.js","./filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/filter.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/pluck.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var map_1 = require("./map");
function pluck() {
    var properties = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        properties[_i] = arguments[_i];
    }
    var length = properties.length;
    if (length === 0) {
        throw new Error('list of properties cannot be empty.');
    }
    return function (source) { return map_1.map(plucker(properties, length))(source); };
}
exports.pluck = pluck;
function plucker(props, length) {
    var mapper = function (x) {
        var currentProp = x;
        for (var i = 0; i < length; i++) {
            var p = currentProp != null ? currentProp[props[i]] : undefined;
            if (p !== void 0) {
                currentProp = p;
            }
            else {
                return undefined;
            }
        }
        return currentProp;
    };
    return mapper;
}

},{"./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/publish.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Subject_1 = require("../Subject");
var multicast_1 = require("./multicast");
function publish(selector) {
    return selector ?
        multicast_1.multicast(function () { return new Subject_1.Subject(); }, selector) :
        multicast_1.multicast(new Subject_1.Subject());
}
exports.publish = publish;

},{"../Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","./multicast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/multicast.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/publishBehavior.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var BehaviorSubject_1 = require("../BehaviorSubject");
var multicast_1 = require("./multicast");
function publishBehavior(value) {
    return function (source) { return multicast_1.multicast(new BehaviorSubject_1.BehaviorSubject(value))(source); };
}
exports.publishBehavior = publishBehavior;

},{"../BehaviorSubject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/BehaviorSubject.js","./multicast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/multicast.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/publishLast.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AsyncSubject_1 = require("../AsyncSubject");
var multicast_1 = require("./multicast");
function publishLast() {
    return function (source) { return multicast_1.multicast(new AsyncSubject_1.AsyncSubject())(source); };
}
exports.publishLast = publishLast;

},{"../AsyncSubject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/AsyncSubject.js","./multicast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/multicast.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/publishReplay.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ReplaySubject_1 = require("../ReplaySubject");
var multicast_1 = require("./multicast");
function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
        scheduler = selectorOrScheduler;
    }
    var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
    var subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
    return function (source) { return multicast_1.multicast(function () { return subject; }, selector)(source); };
}
exports.publishReplay = publishReplay;

},{"../ReplaySubject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/ReplaySubject.js","./multicast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/multicast.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/race.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var isArray_1 = require("../util/isArray");
var race_1 = require("../observable/race");
function race() {
    var observables = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        observables[_i] = arguments[_i];
    }
    return function raceOperatorFunction(source) {
        if (observables.length === 1 && isArray_1.isArray(observables[0])) {
            observables = observables[0];
        }
        return source.lift.call(race_1.race.apply(void 0, [source].concat(observables)));
    };
}
exports.race = race;

},{"../observable/race":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/race.js","../util/isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/reduce.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var scan_1 = require("./scan");
var takeLast_1 = require("./takeLast");
var defaultIfEmpty_1 = require("./defaultIfEmpty");
var pipe_1 = require("../util/pipe");
function reduce(accumulator, seed) {
    if (arguments.length >= 2) {
        return function reduceOperatorFunctionWithSeed(source) {
            return pipe_1.pipe(scan_1.scan(accumulator, seed), takeLast_1.takeLast(1), defaultIfEmpty_1.defaultIfEmpty(seed))(source);
        };
    }
    return function reduceOperatorFunction(source) {
        return pipe_1.pipe(scan_1.scan(function (acc, value, index) { return accumulator(acc, value, index + 1); }), takeLast_1.takeLast(1))(source);
    };
}
exports.reduce = reduce;

},{"../util/pipe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/pipe.js","./defaultIfEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/defaultIfEmpty.js","./scan":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/scan.js","./takeLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/takeLast.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/refCount.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function refCount() {
    return function refCountOperatorFunction(source) {
        return source.lift(new RefCountOperator(source));
    };
}
exports.refCount = refCount;
var RefCountOperator = (function () {
    function RefCountOperator(connectable) {
        this.connectable = connectable;
    }
    RefCountOperator.prototype.call = function (subscriber, source) {
        var connectable = this.connectable;
        connectable._refCount++;
        var refCounter = new RefCountSubscriber(subscriber, connectable);
        var subscription = source.subscribe(refCounter);
        if (!refCounter.closed) {
            refCounter.connection = connectable.connect();
        }
        return subscription;
    };
    return RefCountOperator;
}());
var RefCountSubscriber = (function (_super) {
    __extends(RefCountSubscriber, _super);
    function RefCountSubscriber(destination, connectable) {
        var _this = _super.call(this, destination) || this;
        _this.connectable = connectable;
        return _this;
    }
    RefCountSubscriber.prototype._unsubscribe = function () {
        var connectable = this.connectable;
        if (!connectable) {
            this.connection = null;
            return;
        }
        this.connectable = null;
        var refCount = connectable._refCount;
        if (refCount <= 0) {
            this.connection = null;
            return;
        }
        connectable._refCount = refCount - 1;
        if (refCount > 1) {
            this.connection = null;
            return;
        }
        var connection = this.connection;
        var sharedConnection = connectable._connection;
        this.connection = null;
        if (sharedConnection && (!connection || sharedConnection === connection)) {
            sharedConnection.unsubscribe();
        }
    };
    return RefCountSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/repeat.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var empty_1 = require("../observable/empty");
function repeat(count) {
    if (count === void 0) { count = -1; }
    return function (source) {
        if (count === 0) {
            return empty_1.empty();
        }
        else if (count < 0) {
            return source.lift(new RepeatOperator(-1, source));
        }
        else {
            return source.lift(new RepeatOperator(count - 1, source));
        }
    };
}
exports.repeat = repeat;
var RepeatOperator = (function () {
    function RepeatOperator(count, source) {
        this.count = count;
        this.source = source;
    }
    RepeatOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
    };
    return RepeatOperator;
}());
var RepeatSubscriber = (function (_super) {
    __extends(RepeatSubscriber, _super);
    function RepeatSubscriber(destination, count, source) {
        var _this = _super.call(this, destination) || this;
        _this.count = count;
        _this.source = source;
        return _this;
    }
    RepeatSubscriber.prototype.complete = function () {
        if (!this.isStopped) {
            var _a = this, source = _a.source, count = _a.count;
            if (count === 0) {
                return _super.prototype.complete.call(this);
            }
            else if (count > -1) {
                this.count = count - 1;
            }
            source.subscribe(this._unsubscribeAndRecycle());
        }
    };
    return RepeatSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../observable/empty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/empty.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/repeatWhen.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subject_1 = require("../Subject");
var innerSubscribe_1 = require("../innerSubscribe");
function repeatWhen(notifier) {
    return function (source) { return source.lift(new RepeatWhenOperator(notifier)); };
}
exports.repeatWhen = repeatWhen;
var RepeatWhenOperator = (function () {
    function RepeatWhenOperator(notifier) {
        this.notifier = notifier;
    }
    RepeatWhenOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));
    };
    return RepeatWhenOperator;
}());
var RepeatWhenSubscriber = (function (_super) {
    __extends(RepeatWhenSubscriber, _super);
    function RepeatWhenSubscriber(destination, notifier, source) {
        var _this = _super.call(this, destination) || this;
        _this.notifier = notifier;
        _this.source = source;
        _this.sourceIsBeingSubscribedTo = true;
        return _this;
    }
    RepeatWhenSubscriber.prototype.notifyNext = function () {
        this.sourceIsBeingSubscribedTo = true;
        this.source.subscribe(this);
    };
    RepeatWhenSubscriber.prototype.notifyComplete = function () {
        if (this.sourceIsBeingSubscribedTo === false) {
            return _super.prototype.complete.call(this);
        }
    };
    RepeatWhenSubscriber.prototype.complete = function () {
        this.sourceIsBeingSubscribedTo = false;
        if (!this.isStopped) {
            if (!this.retries) {
                this.subscribeToRetries();
            }
            if (!this.retriesSubscription || this.retriesSubscription.closed) {
                return _super.prototype.complete.call(this);
            }
            this._unsubscribeAndRecycle();
            this.notifications.next(undefined);
        }
    };
    RepeatWhenSubscriber.prototype._unsubscribe = function () {
        var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;
        if (notifications) {
            notifications.unsubscribe();
            this.notifications = undefined;
        }
        if (retriesSubscription) {
            retriesSubscription.unsubscribe();
            this.retriesSubscription = undefined;
        }
        this.retries = undefined;
    };
    RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () {
        var _unsubscribe = this._unsubscribe;
        this._unsubscribe = null;
        _super.prototype._unsubscribeAndRecycle.call(this);
        this._unsubscribe = _unsubscribe;
        return this;
    };
    RepeatWhenSubscriber.prototype.subscribeToRetries = function () {
        this.notifications = new Subject_1.Subject();
        var retries;
        try {
            var notifier = this.notifier;
            retries = notifier(this.notifications);
        }
        catch (e) {
            return _super.prototype.complete.call(this);
        }
        this.retries = retries;
        this.retriesSubscription = innerSubscribe_1.innerSubscribe(retries, new innerSubscribe_1.SimpleInnerSubscriber(this));
    };
    return RepeatWhenSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/retry.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function retry(count) {
    if (count === void 0) { count = -1; }
    return function (source) { return source.lift(new RetryOperator(count, source)); };
}
exports.retry = retry;
var RetryOperator = (function () {
    function RetryOperator(count, source) {
        this.count = count;
        this.source = source;
    }
    RetryOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));
    };
    return RetryOperator;
}());
var RetrySubscriber = (function (_super) {
    __extends(RetrySubscriber, _super);
    function RetrySubscriber(destination, count, source) {
        var _this = _super.call(this, destination) || this;
        _this.count = count;
        _this.source = source;
        return _this;
    }
    RetrySubscriber.prototype.error = function (err) {
        if (!this.isStopped) {
            var _a = this, source = _a.source, count = _a.count;
            if (count === 0) {
                return _super.prototype.error.call(this, err);
            }
            else if (count > -1) {
                this.count = count - 1;
            }
            source.subscribe(this._unsubscribeAndRecycle());
        }
    };
    return RetrySubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/retryWhen.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subject_1 = require("../Subject");
var innerSubscribe_1 = require("../innerSubscribe");
function retryWhen(notifier) {
    return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); };
}
exports.retryWhen = retryWhen;
var RetryWhenOperator = (function () {
    function RetryWhenOperator(notifier, source) {
        this.notifier = notifier;
        this.source = source;
    }
    RetryWhenOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));
    };
    return RetryWhenOperator;
}());
var RetryWhenSubscriber = (function (_super) {
    __extends(RetryWhenSubscriber, _super);
    function RetryWhenSubscriber(destination, notifier, source) {
        var _this = _super.call(this, destination) || this;
        _this.notifier = notifier;
        _this.source = source;
        return _this;
    }
    RetryWhenSubscriber.prototype.error = function (err) {
        if (!this.isStopped) {
            var errors = this.errors;
            var retries = this.retries;
            var retriesSubscription = this.retriesSubscription;
            if (!retries) {
                errors = new Subject_1.Subject();
                try {
                    var notifier = this.notifier;
                    retries = notifier(errors);
                }
                catch (e) {
                    return _super.prototype.error.call(this, e);
                }
                retriesSubscription = innerSubscribe_1.innerSubscribe(retries, new innerSubscribe_1.SimpleInnerSubscriber(this));
            }
            else {
                this.errors = undefined;
                this.retriesSubscription = undefined;
            }
            this._unsubscribeAndRecycle();
            this.errors = errors;
            this.retries = retries;
            this.retriesSubscription = retriesSubscription;
            errors.next(err);
        }
    };
    RetryWhenSubscriber.prototype._unsubscribe = function () {
        var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;
        if (errors) {
            errors.unsubscribe();
            this.errors = undefined;
        }
        if (retriesSubscription) {
            retriesSubscription.unsubscribe();
            this.retriesSubscription = undefined;
        }
        this.retries = undefined;
    };
    RetryWhenSubscriber.prototype.notifyNext = function () {
        var _unsubscribe = this._unsubscribe;
        this._unsubscribe = null;
        this._unsubscribeAndRecycle();
        this._unsubscribe = _unsubscribe;
        this.source.subscribe(this);
    };
    return RetryWhenSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/sample.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
function sample(notifier) {
    return function (source) { return source.lift(new SampleOperator(notifier)); };
}
exports.sample = sample;
var SampleOperator = (function () {
    function SampleOperator(notifier) {
        this.notifier = notifier;
    }
    SampleOperator.prototype.call = function (subscriber, source) {
        var sampleSubscriber = new SampleSubscriber(subscriber);
        var subscription = source.subscribe(sampleSubscriber);
        subscription.add(innerSubscribe_1.innerSubscribe(this.notifier, new innerSubscribe_1.SimpleInnerSubscriber(sampleSubscriber)));
        return subscription;
    };
    return SampleOperator;
}());
var SampleSubscriber = (function (_super) {
    __extends(SampleSubscriber, _super);
    function SampleSubscriber() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this.hasValue = false;
        return _this;
    }
    SampleSubscriber.prototype._next = function (value) {
        this.value = value;
        this.hasValue = true;
    };
    SampleSubscriber.prototype.notifyNext = function () {
        this.emitValue();
    };
    SampleSubscriber.prototype.notifyComplete = function () {
        this.emitValue();
    };
    SampleSubscriber.prototype.emitValue = function () {
        if (this.hasValue) {
            this.hasValue = false;
            this.destination.next(this.value);
        }
    };
    return SampleSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/sampleTime.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var async_1 = require("../scheduler/async");
function sampleTime(period, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.async; }
    return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); };
}
exports.sampleTime = sampleTime;
var SampleTimeOperator = (function () {
    function SampleTimeOperator(period, scheduler) {
        this.period = period;
        this.scheduler = scheduler;
    }
    SampleTimeOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));
    };
    return SampleTimeOperator;
}());
var SampleTimeSubscriber = (function (_super) {
    __extends(SampleTimeSubscriber, _super);
    function SampleTimeSubscriber(destination, period, scheduler) {
        var _this = _super.call(this, destination) || this;
        _this.period = period;
        _this.scheduler = scheduler;
        _this.hasValue = false;
        _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period }));
        return _this;
    }
    SampleTimeSubscriber.prototype._next = function (value) {
        this.lastValue = value;
        this.hasValue = true;
    };
    SampleTimeSubscriber.prototype.notifyNext = function () {
        if (this.hasValue) {
            this.hasValue = false;
            this.destination.next(this.lastValue);
        }
    };
    return SampleTimeSubscriber;
}(Subscriber_1.Subscriber));
function dispatchNotification(state) {
    var subscriber = state.subscriber, period = state.period;
    subscriber.notifyNext();
    this.schedule(state, period);
}

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/scan.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function scan(accumulator, seed) {
    var hasSeed = false;
    if (arguments.length >= 2) {
        hasSeed = true;
    }
    return function scanOperatorFunction(source) {
        return source.lift(new ScanOperator(accumulator, seed, hasSeed));
    };
}
exports.scan = scan;
var ScanOperator = (function () {
    function ScanOperator(accumulator, seed, hasSeed) {
        if (hasSeed === void 0) { hasSeed = false; }
        this.accumulator = accumulator;
        this.seed = seed;
        this.hasSeed = hasSeed;
    }
    ScanOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));
    };
    return ScanOperator;
}());
var ScanSubscriber = (function (_super) {
    __extends(ScanSubscriber, _super);
    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {
        var _this = _super.call(this, destination) || this;
        _this.accumulator = accumulator;
        _this._seed = _seed;
        _this.hasSeed = hasSeed;
        _this.index = 0;
        return _this;
    }
    Object.defineProperty(ScanSubscriber.prototype, "seed", {
        get: function () {
            return this._seed;
        },
        set: function (value) {
            this.hasSeed = true;
            this._seed = value;
        },
        enumerable: true,
        configurable: true
    });
    ScanSubscriber.prototype._next = function (value) {
        if (!this.hasSeed) {
            this.seed = value;
            this.destination.next(value);
        }
        else {
            return this._tryNext(value);
        }
    };
    ScanSubscriber.prototype._tryNext = function (value) {
        var index = this.index++;
        var result;
        try {
            result = this.accumulator(this.seed, value, index);
        }
        catch (err) {
            this.destination.error(err);
        }
        this.seed = result;
        this.destination.next(result);
    };
    return ScanSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/sequenceEqual.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function sequenceEqual(compareTo, comparator) {
    return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); };
}
exports.sequenceEqual = sequenceEqual;
var SequenceEqualOperator = (function () {
    function SequenceEqualOperator(compareTo, comparator) {
        this.compareTo = compareTo;
        this.comparator = comparator;
    }
    SequenceEqualOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator));
    };
    return SequenceEqualOperator;
}());
exports.SequenceEqualOperator = SequenceEqualOperator;
var SequenceEqualSubscriber = (function (_super) {
    __extends(SequenceEqualSubscriber, _super);
    function SequenceEqualSubscriber(destination, compareTo, comparator) {
        var _this = _super.call(this, destination) || this;
        _this.compareTo = compareTo;
        _this.comparator = comparator;
        _this._a = [];
        _this._b = [];
        _this._oneComplete = false;
        _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this)));
        return _this;
    }
    SequenceEqualSubscriber.prototype._next = function (value) {
        if (this._oneComplete && this._b.length === 0) {
            this.emit(false);
        }
        else {
            this._a.push(value);
            this.checkValues();
        }
    };
    SequenceEqualSubscriber.prototype._complete = function () {
        if (this._oneComplete) {
            this.emit(this._a.length === 0 && this._b.length === 0);
        }
        else {
            this._oneComplete = true;
        }
        this.unsubscribe();
    };
    SequenceEqualSubscriber.prototype.checkValues = function () {
        var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator;
        while (_a.length > 0 && _b.length > 0) {
            var a = _a.shift();
            var b = _b.shift();
            var areEqual = false;
            try {
                areEqual = comparator ? comparator(a, b) : a === b;
            }
            catch (e) {
                this.destination.error(e);
            }
            if (!areEqual) {
                this.emit(false);
            }
        }
    };
    SequenceEqualSubscriber.prototype.emit = function (value) {
        var destination = this.destination;
        destination.next(value);
        destination.complete();
    };
    SequenceEqualSubscriber.prototype.nextB = function (value) {
        if (this._oneComplete && this._a.length === 0) {
            this.emit(false);
        }
        else {
            this._b.push(value);
            this.checkValues();
        }
    };
    SequenceEqualSubscriber.prototype.completeB = function () {
        if (this._oneComplete) {
            this.emit(this._a.length === 0 && this._b.length === 0);
        }
        else {
            this._oneComplete = true;
        }
    };
    return SequenceEqualSubscriber;
}(Subscriber_1.Subscriber));
exports.SequenceEqualSubscriber = SequenceEqualSubscriber;
var SequenceEqualCompareToSubscriber = (function (_super) {
    __extends(SequenceEqualCompareToSubscriber, _super);
    function SequenceEqualCompareToSubscriber(destination, parent) {
        var _this = _super.call(this, destination) || this;
        _this.parent = parent;
        return _this;
    }
    SequenceEqualCompareToSubscriber.prototype._next = function (value) {
        this.parent.nextB(value);
    };
    SequenceEqualCompareToSubscriber.prototype._error = function (err) {
        this.parent.error(err);
        this.unsubscribe();
    };
    SequenceEqualCompareToSubscriber.prototype._complete = function () {
        this.parent.completeB();
        this.unsubscribe();
    };
    return SequenceEqualCompareToSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/share.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var multicast_1 = require("./multicast");
var refCount_1 = require("./refCount");
var Subject_1 = require("../Subject");
function shareSubjectFactory() {
    return new Subject_1.Subject();
}
function share() {
    return function (source) { return refCount_1.refCount()(multicast_1.multicast(shareSubjectFactory)(source)); };
}
exports.share = share;

},{"../Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","./multicast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/multicast.js","./refCount":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/refCount.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/shareReplay.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ReplaySubject_1 = require("../ReplaySubject");
function shareReplay(configOrBufferSize, windowTime, scheduler) {
    var config;
    if (configOrBufferSize && typeof configOrBufferSize === 'object') {
        config = configOrBufferSize;
    }
    else {
        config = {
            bufferSize: configOrBufferSize,
            windowTime: windowTime,
            refCount: false,
            scheduler: scheduler,
        };
    }
    return function (source) { return source.lift(shareReplayOperator(config)); };
}
exports.shareReplay = shareReplay;
function shareReplayOperator(_a) {
    var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler;
    var subject;
    var refCount = 0;
    var subscription;
    var hasError = false;
    var isComplete = false;
    return function shareReplayOperation(source) {
        refCount++;
        var innerSub;
        if (!subject || hasError) {
            hasError = false;
            subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
            innerSub = subject.subscribe(this);
            subscription = source.subscribe({
                next: function (value) {
                    subject.next(value);
                },
                error: function (err) {
                    hasError = true;
                    subject.error(err);
                },
                complete: function () {
                    isComplete = true;
                    subscription = undefined;
                    subject.complete();
                },
            });
            if (isComplete) {
                subscription = undefined;
            }
        }
        else {
            innerSub = subject.subscribe(this);
        }
        this.add(function () {
            refCount--;
            innerSub.unsubscribe();
            innerSub = undefined;
            if (subscription && !isComplete && useRefCount && refCount === 0) {
                subscription.unsubscribe();
                subscription = undefined;
                subject = undefined;
            }
        });
    };
}

},{"../ReplaySubject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/ReplaySubject.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/single.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var EmptyError_1 = require("../util/EmptyError");
function single(predicate) {
    return function (source) { return source.lift(new SingleOperator(predicate, source)); };
}
exports.single = single;
var SingleOperator = (function () {
    function SingleOperator(predicate, source) {
        this.predicate = predicate;
        this.source = source;
    }
    SingleOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));
    };
    return SingleOperator;
}());
var SingleSubscriber = (function (_super) {
    __extends(SingleSubscriber, _super);
    function SingleSubscriber(destination, predicate, source) {
        var _this = _super.call(this, destination) || this;
        _this.predicate = predicate;
        _this.source = source;
        _this.seenValue = false;
        _this.index = 0;
        return _this;
    }
    SingleSubscriber.prototype.applySingleValue = function (value) {
        if (this.seenValue) {
            this.destination.error('Sequence contains more than one element');
        }
        else {
            this.seenValue = true;
            this.singleValue = value;
        }
    };
    SingleSubscriber.prototype._next = function (value) {
        var index = this.index++;
        if (this.predicate) {
            this.tryNext(value, index);
        }
        else {
            this.applySingleValue(value);
        }
    };
    SingleSubscriber.prototype.tryNext = function (value, index) {
        try {
            if (this.predicate(value, index, this.source)) {
                this.applySingleValue(value);
            }
        }
        catch (err) {
            this.destination.error(err);
        }
    };
    SingleSubscriber.prototype._complete = function () {
        var destination = this.destination;
        if (this.index > 0) {
            destination.next(this.seenValue ? this.singleValue : undefined);
            destination.complete();
        }
        else {
            destination.error(new EmptyError_1.EmptyError);
        }
    };
    return SingleSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../util/EmptyError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/EmptyError.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/skip.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function skip(count) {
    return function (source) { return source.lift(new SkipOperator(count)); };
}
exports.skip = skip;
var SkipOperator = (function () {
    function SkipOperator(total) {
        this.total = total;
    }
    SkipOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new SkipSubscriber(subscriber, this.total));
    };
    return SkipOperator;
}());
var SkipSubscriber = (function (_super) {
    __extends(SkipSubscriber, _super);
    function SkipSubscriber(destination, total) {
        var _this = _super.call(this, destination) || this;
        _this.total = total;
        _this.count = 0;
        return _this;
    }
    SkipSubscriber.prototype._next = function (x) {
        if (++this.count > this.total) {
            this.destination.next(x);
        }
    };
    return SkipSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/skipLast.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
function skipLast(count) {
    return function (source) { return source.lift(new SkipLastOperator(count)); };
}
exports.skipLast = skipLast;
var SkipLastOperator = (function () {
    function SkipLastOperator(_skipCount) {
        this._skipCount = _skipCount;
        if (this._skipCount < 0) {
            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
        }
    }
    SkipLastOperator.prototype.call = function (subscriber, source) {
        if (this._skipCount === 0) {
            return source.subscribe(new Subscriber_1.Subscriber(subscriber));
        }
        else {
            return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));
        }
    };
    return SkipLastOperator;
}());
var SkipLastSubscriber = (function (_super) {
    __extends(SkipLastSubscriber, _super);
    function SkipLastSubscriber(destination, _skipCount) {
        var _this = _super.call(this, destination) || this;
        _this._skipCount = _skipCount;
        _this._count = 0;
        _this._ring = new Array(_skipCount);
        return _this;
    }
    SkipLastSubscriber.prototype._next = function (value) {
        var skipCount = this._skipCount;
        var count = this._count++;
        if (count < skipCount) {
            this._ring[count] = value;
        }
        else {
            var currentIndex = count % skipCount;
            var ring = this._ring;
            var oldValue = ring[currentIndex];
            ring[currentIndex] = value;
            this.destination.next(oldValue);
        }
    };
    return SkipLastSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../util/ArgumentOutOfRangeError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/skipUntil.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
function skipUntil(notifier) {
    return function (source) { return source.lift(new SkipUntilOperator(notifier)); };
}
exports.skipUntil = skipUntil;
var SkipUntilOperator = (function () {
    function SkipUntilOperator(notifier) {
        this.notifier = notifier;
    }
    SkipUntilOperator.prototype.call = function (destination, source) {
        return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));
    };
    return SkipUntilOperator;
}());
var SkipUntilSubscriber = (function (_super) {
    __extends(SkipUntilSubscriber, _super);
    function SkipUntilSubscriber(destination, notifier) {
        var _this = _super.call(this, destination) || this;
        _this.hasValue = false;
        var innerSubscriber = new innerSubscribe_1.SimpleInnerSubscriber(_this);
        _this.add(innerSubscriber);
        _this.innerSubscription = innerSubscriber;
        var innerSubscription = innerSubscribe_1.innerSubscribe(notifier, innerSubscriber);
        if (innerSubscription !== innerSubscriber) {
            _this.add(innerSubscription);
            _this.innerSubscription = innerSubscription;
        }
        return _this;
    }
    SkipUntilSubscriber.prototype._next = function (value) {
        if (this.hasValue) {
            _super.prototype._next.call(this, value);
        }
    };
    SkipUntilSubscriber.prototype.notifyNext = function () {
        this.hasValue = true;
        if (this.innerSubscription) {
            this.innerSubscription.unsubscribe();
        }
    };
    SkipUntilSubscriber.prototype.notifyComplete = function () {
    };
    return SkipUntilSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/skipWhile.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function skipWhile(predicate) {
    return function (source) { return source.lift(new SkipWhileOperator(predicate)); };
}
exports.skipWhile = skipWhile;
var SkipWhileOperator = (function () {
    function SkipWhileOperator(predicate) {
        this.predicate = predicate;
    }
    SkipWhileOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
    };
    return SkipWhileOperator;
}());
var SkipWhileSubscriber = (function (_super) {
    __extends(SkipWhileSubscriber, _super);
    function SkipWhileSubscriber(destination, predicate) {
        var _this = _super.call(this, destination) || this;
        _this.predicate = predicate;
        _this.skipping = true;
        _this.index = 0;
        return _this;
    }
    SkipWhileSubscriber.prototype._next = function (value) {
        var destination = this.destination;
        if (this.skipping) {
            this.tryCallPredicate(value);
        }
        if (!this.skipping) {
            destination.next(value);
        }
    };
    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {
        try {
            var result = this.predicate(value, this.index++);
            this.skipping = Boolean(result);
        }
        catch (err) {
            this.destination.error(err);
        }
    };
    return SkipWhileSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/startWith.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var concat_1 = require("../observable/concat");
var isScheduler_1 = require("../util/isScheduler");
function startWith() {
    var array = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        array[_i] = arguments[_i];
    }
    var scheduler = array[array.length - 1];
    if (isScheduler_1.isScheduler(scheduler)) {
        array.pop();
        return function (source) { return concat_1.concat(array, source, scheduler); };
    }
    else {
        return function (source) { return concat_1.concat(array, source); };
    }
}
exports.startWith = startWith;

},{"../observable/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/concat.js","../util/isScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/subscribeOn.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var SubscribeOnObservable_1 = require("../observable/SubscribeOnObservable");
function subscribeOn(scheduler, delay) {
    if (delay === void 0) { delay = 0; }
    return function subscribeOnOperatorFunction(source) {
        return source.lift(new SubscribeOnOperator(scheduler, delay));
    };
}
exports.subscribeOn = subscribeOn;
var SubscribeOnOperator = (function () {
    function SubscribeOnOperator(scheduler, delay) {
        this.scheduler = scheduler;
        this.delay = delay;
    }
    SubscribeOnOperator.prototype.call = function (subscriber, source) {
        return new SubscribeOnObservable_1.SubscribeOnObservable(source, this.delay, this.scheduler).subscribe(subscriber);
    };
    return SubscribeOnOperator;
}());

},{"../observable/SubscribeOnObservable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/SubscribeOnObservable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/switchAll.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var switchMap_1 = require("./switchMap");
var identity_1 = require("../util/identity");
function switchAll() {
    return switchMap_1.switchMap(identity_1.identity);
}
exports.switchAll = switchAll;

},{"../util/identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/identity.js","./switchMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/switchMap.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/switchMap.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var map_1 = require("./map");
var from_1 = require("../observable/from");
var innerSubscribe_1 = require("../innerSubscribe");
function switchMap(project, resultSelector) {
    if (typeof resultSelector === 'function') {
        return function (source) { return source.pipe(switchMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
    }
    return function (source) { return source.lift(new SwitchMapOperator(project)); };
}
exports.switchMap = switchMap;
var SwitchMapOperator = (function () {
    function SwitchMapOperator(project) {
        this.project = project;
    }
    SwitchMapOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));
    };
    return SwitchMapOperator;
}());
var SwitchMapSubscriber = (function (_super) {
    __extends(SwitchMapSubscriber, _super);
    function SwitchMapSubscriber(destination, project) {
        var _this = _super.call(this, destination) || this;
        _this.project = project;
        _this.index = 0;
        return _this;
    }
    SwitchMapSubscriber.prototype._next = function (value) {
        var result;
        var index = this.index++;
        try {
            result = this.project(value, index);
        }
        catch (error) {
            this.destination.error(error);
            return;
        }
        this._innerSub(result);
    };
    SwitchMapSubscriber.prototype._innerSub = function (result) {
        var innerSubscription = this.innerSubscription;
        if (innerSubscription) {
            innerSubscription.unsubscribe();
        }
        var innerSubscriber = new innerSubscribe_1.SimpleInnerSubscriber(this);
        var destination = this.destination;
        destination.add(innerSubscriber);
        this.innerSubscription = innerSubscribe_1.innerSubscribe(result, innerSubscriber);
        if (this.innerSubscription !== innerSubscriber) {
            destination.add(this.innerSubscription);
        }
    };
    SwitchMapSubscriber.prototype._complete = function () {
        var innerSubscription = this.innerSubscription;
        if (!innerSubscription || innerSubscription.closed) {
            _super.prototype._complete.call(this);
        }
        this.unsubscribe();
    };
    SwitchMapSubscriber.prototype._unsubscribe = function () {
        this.innerSubscription = undefined;
    };
    SwitchMapSubscriber.prototype.notifyComplete = function () {
        this.innerSubscription = undefined;
        if (this.isStopped) {
            _super.prototype._complete.call(this);
        }
    };
    SwitchMapSubscriber.prototype.notifyNext = function (innerValue) {
        this.destination.next(innerValue);
    };
    return SwitchMapSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js","../observable/from":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/from.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/switchMapTo.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var switchMap_1 = require("./switchMap");
function switchMapTo(innerObservable, resultSelector) {
    return resultSelector ? switchMap_1.switchMap(function () { return innerObservable; }, resultSelector) : switchMap_1.switchMap(function () { return innerObservable; });
}
exports.switchMapTo = switchMapTo;

},{"./switchMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/switchMap.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/take.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
var empty_1 = require("../observable/empty");
function take(count) {
    return function (source) {
        if (count === 0) {
            return empty_1.empty();
        }
        else {
            return source.lift(new TakeOperator(count));
        }
    };
}
exports.take = take;
var TakeOperator = (function () {
    function TakeOperator(total) {
        this.total = total;
        if (this.total < 0) {
            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
        }
    }
    TakeOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new TakeSubscriber(subscriber, this.total));
    };
    return TakeOperator;
}());
var TakeSubscriber = (function (_super) {
    __extends(TakeSubscriber, _super);
    function TakeSubscriber(destination, total) {
        var _this = _super.call(this, destination) || this;
        _this.total = total;
        _this.count = 0;
        return _this;
    }
    TakeSubscriber.prototype._next = function (value) {
        var total = this.total;
        var count = ++this.count;
        if (count <= total) {
            this.destination.next(value);
            if (count === total) {
                this.destination.complete();
                this.unsubscribe();
            }
        }
    };
    return TakeSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../observable/empty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/empty.js","../util/ArgumentOutOfRangeError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/takeLast.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
var empty_1 = require("../observable/empty");
function takeLast(count) {
    return function takeLastOperatorFunction(source) {
        if (count === 0) {
            return empty_1.empty();
        }
        else {
            return source.lift(new TakeLastOperator(count));
        }
    };
}
exports.takeLast = takeLast;
var TakeLastOperator = (function () {
    function TakeLastOperator(total) {
        this.total = total;
        if (this.total < 0) {
            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
        }
    }
    TakeLastOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new TakeLastSubscriber(subscriber, this.total));
    };
    return TakeLastOperator;
}());
var TakeLastSubscriber = (function (_super) {
    __extends(TakeLastSubscriber, _super);
    function TakeLastSubscriber(destination, total) {
        var _this = _super.call(this, destination) || this;
        _this.total = total;
        _this.ring = new Array();
        _this.count = 0;
        return _this;
    }
    TakeLastSubscriber.prototype._next = function (value) {
        var ring = this.ring;
        var total = this.total;
        var count = this.count++;
        if (ring.length < total) {
            ring.push(value);
        }
        else {
            var index = count % total;
            ring[index] = value;
        }
    };
    TakeLastSubscriber.prototype._complete = function () {
        var destination = this.destination;
        var count = this.count;
        if (count > 0) {
            var total = this.count >= this.total ? this.total : this.count;
            var ring = this.ring;
            for (var i = 0; i < total; i++) {
                var idx = (count++) % total;
                destination.next(ring[idx]);
            }
        }
        destination.complete();
    };
    return TakeLastSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../observable/empty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/empty.js","../util/ArgumentOutOfRangeError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/takeUntil.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
function takeUntil(notifier) {
    return function (source) { return source.lift(new TakeUntilOperator(notifier)); };
}
exports.takeUntil = takeUntil;
var TakeUntilOperator = (function () {
    function TakeUntilOperator(notifier) {
        this.notifier = notifier;
    }
    TakeUntilOperator.prototype.call = function (subscriber, source) {
        var takeUntilSubscriber = new TakeUntilSubscriber(subscriber);
        var notifierSubscription = innerSubscribe_1.innerSubscribe(this.notifier, new innerSubscribe_1.SimpleInnerSubscriber(takeUntilSubscriber));
        if (notifierSubscription && !takeUntilSubscriber.seenValue) {
            takeUntilSubscriber.add(notifierSubscription);
            return source.subscribe(takeUntilSubscriber);
        }
        return takeUntilSubscriber;
    };
    return TakeUntilOperator;
}());
var TakeUntilSubscriber = (function (_super) {
    __extends(TakeUntilSubscriber, _super);
    function TakeUntilSubscriber(destination) {
        var _this = _super.call(this, destination) || this;
        _this.seenValue = false;
        return _this;
    }
    TakeUntilSubscriber.prototype.notifyNext = function () {
        this.seenValue = true;
        this.complete();
    };
    TakeUntilSubscriber.prototype.notifyComplete = function () {
    };
    return TakeUntilSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/takeWhile.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function takeWhile(predicate, inclusive) {
    if (inclusive === void 0) { inclusive = false; }
    return function (source) {
        return source.lift(new TakeWhileOperator(predicate, inclusive));
    };
}
exports.takeWhile = takeWhile;
var TakeWhileOperator = (function () {
    function TakeWhileOperator(predicate, inclusive) {
        this.predicate = predicate;
        this.inclusive = inclusive;
    }
    TakeWhileOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive));
    };
    return TakeWhileOperator;
}());
var TakeWhileSubscriber = (function (_super) {
    __extends(TakeWhileSubscriber, _super);
    function TakeWhileSubscriber(destination, predicate, inclusive) {
        var _this = _super.call(this, destination) || this;
        _this.predicate = predicate;
        _this.inclusive = inclusive;
        _this.index = 0;
        return _this;
    }
    TakeWhileSubscriber.prototype._next = function (value) {
        var destination = this.destination;
        var result;
        try {
            result = this.predicate(value, this.index++);
        }
        catch (err) {
            destination.error(err);
            return;
        }
        this.nextOrComplete(value, result);
    };
    TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {
        var destination = this.destination;
        if (Boolean(predicateResult)) {
            destination.next(value);
        }
        else {
            if (this.inclusive) {
                destination.next(value);
            }
            destination.complete();
        }
    };
    return TakeWhileSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/tap.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var noop_1 = require("../util/noop");
var isFunction_1 = require("../util/isFunction");
function tap(nextOrObserver, error, complete) {
    return function tapOperatorFunction(source) {
        return source.lift(new DoOperator(nextOrObserver, error, complete));
    };
}
exports.tap = tap;
var DoOperator = (function () {
    function DoOperator(nextOrObserver, error, complete) {
        this.nextOrObserver = nextOrObserver;
        this.error = error;
        this.complete = complete;
    }
    DoOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
    };
    return DoOperator;
}());
var TapSubscriber = (function (_super) {
    __extends(TapSubscriber, _super);
    function TapSubscriber(destination, observerOrNext, error, complete) {
        var _this = _super.call(this, destination) || this;
        _this._tapNext = noop_1.noop;
        _this._tapError = noop_1.noop;
        _this._tapComplete = noop_1.noop;
        _this._tapError = error || noop_1.noop;
        _this._tapComplete = complete || noop_1.noop;
        if (isFunction_1.isFunction(observerOrNext)) {
            _this._context = _this;
            _this._tapNext = observerOrNext;
        }
        else if (observerOrNext) {
            _this._context = observerOrNext;
            _this._tapNext = observerOrNext.next || noop_1.noop;
            _this._tapError = observerOrNext.error || noop_1.noop;
            _this._tapComplete = observerOrNext.complete || noop_1.noop;
        }
        return _this;
    }
    TapSubscriber.prototype._next = function (value) {
        try {
            this._tapNext.call(this._context, value);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        this.destination.next(value);
    };
    TapSubscriber.prototype._error = function (err) {
        try {
            this._tapError.call(this._context, err);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        this.destination.error(err);
    };
    TapSubscriber.prototype._complete = function () {
        try {
            this._tapComplete.call(this._context);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        return this.destination.complete();
    };
    return TapSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../util/isFunction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isFunction.js","../util/noop":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/noop.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/throttle.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var innerSubscribe_1 = require("../innerSubscribe");
exports.defaultThrottleConfig = {
    leading: true,
    trailing: false
};
function throttle(durationSelector, config) {
    if (config === void 0) { config = exports.defaultThrottleConfig; }
    return function (source) { return source.lift(new ThrottleOperator(durationSelector, !!config.leading, !!config.trailing)); };
}
exports.throttle = throttle;
var ThrottleOperator = (function () {
    function ThrottleOperator(durationSelector, leading, trailing) {
        this.durationSelector = durationSelector;
        this.leading = leading;
        this.trailing = trailing;
    }
    ThrottleOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));
    };
    return ThrottleOperator;
}());
var ThrottleSubscriber = (function (_super) {
    __extends(ThrottleSubscriber, _super);
    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {
        var _this = _super.call(this, destination) || this;
        _this.destination = destination;
        _this.durationSelector = durationSelector;
        _this._leading = _leading;
        _this._trailing = _trailing;
        _this._hasValue = false;
        return _this;
    }
    ThrottleSubscriber.prototype._next = function (value) {
        this._hasValue = true;
        this._sendValue = value;
        if (!this._throttled) {
            if (this._leading) {
                this.send();
            }
            else {
                this.throttle(value);
            }
        }
    };
    ThrottleSubscriber.prototype.send = function () {
        var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue;
        if (_hasValue) {
            this.destination.next(_sendValue);
            this.throttle(_sendValue);
        }
        this._hasValue = false;
        this._sendValue = undefined;
    };
    ThrottleSubscriber.prototype.throttle = function (value) {
        var duration = this.tryDurationSelector(value);
        if (!!duration) {
            this.add(this._throttled = innerSubscribe_1.innerSubscribe(duration, new innerSubscribe_1.SimpleInnerSubscriber(this)));
        }
    };
    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {
        try {
            return this.durationSelector(value);
        }
        catch (err) {
            this.destination.error(err);
            return null;
        }
    };
    ThrottleSubscriber.prototype.throttlingDone = function () {
        var _a = this, _throttled = _a._throttled, _trailing = _a._trailing;
        if (_throttled) {
            _throttled.unsubscribe();
        }
        this._throttled = undefined;
        if (_trailing) {
            this.send();
        }
    };
    ThrottleSubscriber.prototype.notifyNext = function () {
        this.throttlingDone();
    };
    ThrottleSubscriber.prototype.notifyComplete = function () {
        this.throttlingDone();
    };
    return ThrottleSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/throttleTime.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var async_1 = require("../scheduler/async");
var throttle_1 = require("./throttle");
function throttleTime(duration, scheduler, config) {
    if (scheduler === void 0) { scheduler = async_1.async; }
    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }
    return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };
}
exports.throttleTime = throttleTime;
var ThrottleTimeOperator = (function () {
    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {
        this.duration = duration;
        this.scheduler = scheduler;
        this.leading = leading;
        this.trailing = trailing;
    }
    ThrottleTimeOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));
    };
    return ThrottleTimeOperator;
}());
var ThrottleTimeSubscriber = (function (_super) {
    __extends(ThrottleTimeSubscriber, _super);
    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {
        var _this = _super.call(this, destination) || this;
        _this.duration = duration;
        _this.scheduler = scheduler;
        _this.leading = leading;
        _this.trailing = trailing;
        _this._hasTrailingValue = false;
        _this._trailingValue = null;
        return _this;
    }
    ThrottleTimeSubscriber.prototype._next = function (value) {
        if (this.throttled) {
            if (this.trailing) {
                this._trailingValue = value;
                this._hasTrailingValue = true;
            }
        }
        else {
            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));
            if (this.leading) {
                this.destination.next(value);
            }
            else if (this.trailing) {
                this._trailingValue = value;
                this._hasTrailingValue = true;
            }
        }
    };
    ThrottleTimeSubscriber.prototype._complete = function () {
        if (this._hasTrailingValue) {
            this.destination.next(this._trailingValue);
            this.destination.complete();
        }
        else {
            this.destination.complete();
        }
    };
    ThrottleTimeSubscriber.prototype.clearThrottle = function () {
        var throttled = this.throttled;
        if (throttled) {
            if (this.trailing && this._hasTrailingValue) {
                this.destination.next(this._trailingValue);
                this._trailingValue = null;
                this._hasTrailingValue = false;
            }
            throttled.unsubscribe();
            this.remove(throttled);
            this.throttled = null;
        }
    };
    return ThrottleTimeSubscriber;
}(Subscriber_1.Subscriber));
function dispatchNext(arg) {
    var subscriber = arg.subscriber;
    subscriber.clearThrottle();
}

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","./throttle":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/throttle.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/throwIfEmpty.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var EmptyError_1 = require("../util/EmptyError");
var Subscriber_1 = require("../Subscriber");
function throwIfEmpty(errorFactory) {
    if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }
    return function (source) {
        return source.lift(new ThrowIfEmptyOperator(errorFactory));
    };
}
exports.throwIfEmpty = throwIfEmpty;
var ThrowIfEmptyOperator = (function () {
    function ThrowIfEmptyOperator(errorFactory) {
        this.errorFactory = errorFactory;
    }
    ThrowIfEmptyOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory));
    };
    return ThrowIfEmptyOperator;
}());
var ThrowIfEmptySubscriber = (function (_super) {
    __extends(ThrowIfEmptySubscriber, _super);
    function ThrowIfEmptySubscriber(destination, errorFactory) {
        var _this = _super.call(this, destination) || this;
        _this.errorFactory = errorFactory;
        _this.hasValue = false;
        return _this;
    }
    ThrowIfEmptySubscriber.prototype._next = function (value) {
        this.hasValue = true;
        this.destination.next(value);
    };
    ThrowIfEmptySubscriber.prototype._complete = function () {
        if (!this.hasValue) {
            var err = void 0;
            try {
                err = this.errorFactory();
            }
            catch (e) {
                err = e;
            }
            this.destination.error(err);
        }
        else {
            return this.destination.complete();
        }
    };
    return ThrowIfEmptySubscriber;
}(Subscriber_1.Subscriber));
function defaultErrorFactory() {
    return new EmptyError_1.EmptyError();
}

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../util/EmptyError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/EmptyError.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/timeInterval.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var async_1 = require("../scheduler/async");
var scan_1 = require("./scan");
var defer_1 = require("../observable/defer");
var map_1 = require("./map");
function timeInterval(scheduler) {
    if (scheduler === void 0) { scheduler = async_1.async; }
    return function (source) { return defer_1.defer(function () {
        return source.pipe(scan_1.scan(function (_a, value) {
            var current = _a.current;
            return ({ value: value, current: scheduler.now(), last: current });
        }, { current: scheduler.now(), value: undefined, last: undefined }), map_1.map(function (_a) {
            var current = _a.current, last = _a.last, value = _a.value;
            return new TimeInterval(value, current - last);
        }));
    }); };
}
exports.timeInterval = timeInterval;
var TimeInterval = (function () {
    function TimeInterval(value, interval) {
        this.value = value;
        this.interval = interval;
    }
    return TimeInterval;
}());
exports.TimeInterval = TimeInterval;

},{"../observable/defer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/defer.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js","./scan":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/scan.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/timeout.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var async_1 = require("../scheduler/async");
var TimeoutError_1 = require("../util/TimeoutError");
var timeoutWith_1 = require("./timeoutWith");
var throwError_1 = require("../observable/throwError");
function timeout(due, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.async; }
    return timeoutWith_1.timeoutWith(due, throwError_1.throwError(new TimeoutError_1.TimeoutError()), scheduler);
}
exports.timeout = timeout;

},{"../observable/throwError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/throwError.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","../util/TimeoutError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/TimeoutError.js","./timeoutWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/timeoutWith.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/timeoutWith.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var async_1 = require("../scheduler/async");
var isDate_1 = require("../util/isDate");
var innerSubscribe_1 = require("../innerSubscribe");
function timeoutWith(due, withObservable, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.async; }
    return function (source) {
        var absoluteTimeout = isDate_1.isDate(due);
        var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);
        return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));
    };
}
exports.timeoutWith = timeoutWith;
var TimeoutWithOperator = (function () {
    function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) {
        this.waitFor = waitFor;
        this.absoluteTimeout = absoluteTimeout;
        this.withObservable = withObservable;
        this.scheduler = scheduler;
    }
    TimeoutWithOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));
    };
    return TimeoutWithOperator;
}());
var TimeoutWithSubscriber = (function (_super) {
    __extends(TimeoutWithSubscriber, _super);
    function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) {
        var _this = _super.call(this, destination) || this;
        _this.absoluteTimeout = absoluteTimeout;
        _this.waitFor = waitFor;
        _this.withObservable = withObservable;
        _this.scheduler = scheduler;
        _this.scheduleTimeout();
        return _this;
    }
    TimeoutWithSubscriber.dispatchTimeout = function (subscriber) {
        var withObservable = subscriber.withObservable;
        subscriber._unsubscribeAndRecycle();
        subscriber.add(innerSubscribe_1.innerSubscribe(withObservable, new innerSubscribe_1.SimpleInnerSubscriber(subscriber)));
    };
    TimeoutWithSubscriber.prototype.scheduleTimeout = function () {
        var action = this.action;
        if (action) {
            this.action = action.schedule(this, this.waitFor);
        }
        else {
            this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this));
        }
    };
    TimeoutWithSubscriber.prototype._next = function (value) {
        if (!this.absoluteTimeout) {
            this.scheduleTimeout();
        }
        _super.prototype._next.call(this, value);
    };
    TimeoutWithSubscriber.prototype._unsubscribe = function () {
        this.action = undefined;
        this.scheduler = null;
        this.withObservable = null;
    };
    return TimeoutWithSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","../util/isDate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isDate.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/timestamp.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var async_1 = require("../scheduler/async");
var map_1 = require("./map");
function timestamp(scheduler) {
    if (scheduler === void 0) { scheduler = async_1.async; }
    return map_1.map(function (value) { return new Timestamp(value, scheduler.now()); });
}
exports.timestamp = timestamp;
var Timestamp = (function () {
    function Timestamp(value, timestamp) {
        this.value = value;
        this.timestamp = timestamp;
    }
    return Timestamp;
}());
exports.Timestamp = Timestamp;

},{"../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","./map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/toArray.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var reduce_1 = require("./reduce");
function toArrayReducer(arr, item, index) {
    if (index === 0) {
        return [item];
    }
    arr.push(item);
    return arr;
}
function toArray() {
    return reduce_1.reduce(toArrayReducer, []);
}
exports.toArray = toArray;

},{"./reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/reduce.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/window.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subject_1 = require("../Subject");
var innerSubscribe_1 = require("../innerSubscribe");
function window(windowBoundaries) {
    return function windowOperatorFunction(source) {
        return source.lift(new WindowOperator(windowBoundaries));
    };
}
exports.window = window;
var WindowOperator = (function () {
    function WindowOperator(windowBoundaries) {
        this.windowBoundaries = windowBoundaries;
    }
    WindowOperator.prototype.call = function (subscriber, source) {
        var windowSubscriber = new WindowSubscriber(subscriber);
        var sourceSubscription = source.subscribe(windowSubscriber);
        if (!sourceSubscription.closed) {
            windowSubscriber.add(innerSubscribe_1.innerSubscribe(this.windowBoundaries, new innerSubscribe_1.SimpleInnerSubscriber(windowSubscriber)));
        }
        return sourceSubscription;
    };
    return WindowOperator;
}());
var WindowSubscriber = (function (_super) {
    __extends(WindowSubscriber, _super);
    function WindowSubscriber(destination) {
        var _this = _super.call(this, destination) || this;
        _this.window = new Subject_1.Subject();
        destination.next(_this.window);
        return _this;
    }
    WindowSubscriber.prototype.notifyNext = function () {
        this.openWindow();
    };
    WindowSubscriber.prototype.notifyError = function (error) {
        this._error(error);
    };
    WindowSubscriber.prototype.notifyComplete = function () {
        this._complete();
    };
    WindowSubscriber.prototype._next = function (value) {
        this.window.next(value);
    };
    WindowSubscriber.prototype._error = function (err) {
        this.window.error(err);
        this.destination.error(err);
    };
    WindowSubscriber.prototype._complete = function () {
        this.window.complete();
        this.destination.complete();
    };
    WindowSubscriber.prototype._unsubscribe = function () {
        this.window = null;
    };
    WindowSubscriber.prototype.openWindow = function () {
        var prevWindow = this.window;
        if (prevWindow) {
            prevWindow.complete();
        }
        var destination = this.destination;
        var newWindow = this.window = new Subject_1.Subject();
        destination.next(newWindow);
    };
    return WindowSubscriber;
}(innerSubscribe_1.SimpleOuterSubscriber));

},{"../Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","../innerSubscribe":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/innerSubscribe.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/windowCount.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var Subject_1 = require("../Subject");
function windowCount(windowSize, startWindowEvery) {
    if (startWindowEvery === void 0) { startWindowEvery = 0; }
    return function windowCountOperatorFunction(source) {
        return source.lift(new WindowCountOperator(windowSize, startWindowEvery));
    };
}
exports.windowCount = windowCount;
var WindowCountOperator = (function () {
    function WindowCountOperator(windowSize, startWindowEvery) {
        this.windowSize = windowSize;
        this.startWindowEvery = startWindowEvery;
    }
    WindowCountOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));
    };
    return WindowCountOperator;
}());
var WindowCountSubscriber = (function (_super) {
    __extends(WindowCountSubscriber, _super);
    function WindowCountSubscriber(destination, windowSize, startWindowEvery) {
        var _this = _super.call(this, destination) || this;
        _this.destination = destination;
        _this.windowSize = windowSize;
        _this.startWindowEvery = startWindowEvery;
        _this.windows = [new Subject_1.Subject()];
        _this.count = 0;
        destination.next(_this.windows[0]);
        return _this;
    }
    WindowCountSubscriber.prototype._next = function (value) {
        var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;
        var destination = this.destination;
        var windowSize = this.windowSize;
        var windows = this.windows;
        var len = windows.length;
        for (var i = 0; i < len && !this.closed; i++) {
            windows[i].next(value);
        }
        var c = this.count - windowSize + 1;
        if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {
            windows.shift().complete();
        }
        if (++this.count % startWindowEvery === 0 && !this.closed) {
            var window_1 = new Subject_1.Subject();
            windows.push(window_1);
            destination.next(window_1);
        }
    };
    WindowCountSubscriber.prototype._error = function (err) {
        var windows = this.windows;
        if (windows) {
            while (windows.length > 0 && !this.closed) {
                windows.shift().error(err);
            }
        }
        this.destination.error(err);
    };
    WindowCountSubscriber.prototype._complete = function () {
        var windows = this.windows;
        if (windows) {
            while (windows.length > 0 && !this.closed) {
                windows.shift().complete();
            }
        }
        this.destination.complete();
    };
    WindowCountSubscriber.prototype._unsubscribe = function () {
        this.count = 0;
        this.windows = null;
    };
    return WindowCountSubscriber;
}(Subscriber_1.Subscriber));

},{"../Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/windowTime.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subject_1 = require("../Subject");
var async_1 = require("../scheduler/async");
var Subscriber_1 = require("../Subscriber");
var isNumeric_1 = require("../util/isNumeric");
var isScheduler_1 = require("../util/isScheduler");
function windowTime(windowTimeSpan) {
    var scheduler = async_1.async;
    var windowCreationInterval = null;
    var maxWindowSize = Number.POSITIVE_INFINITY;
    if (isScheduler_1.isScheduler(arguments[3])) {
        scheduler = arguments[3];
    }
    if (isScheduler_1.isScheduler(arguments[2])) {
        scheduler = arguments[2];
    }
    else if (isNumeric_1.isNumeric(arguments[2])) {
        maxWindowSize = Number(arguments[2]);
    }
    if (isScheduler_1.isScheduler(arguments[1])) {
        scheduler = arguments[1];
    }
    else if (isNumeric_1.isNumeric(arguments[1])) {
        windowCreationInterval = Number(arguments[1]);
    }
    return function windowTimeOperatorFunction(source) {
        return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));
    };
}
exports.windowTime = windowTime;
var WindowTimeOperator = (function () {
    function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
        this.windowTimeSpan = windowTimeSpan;
        this.windowCreationInterval = windowCreationInterval;
        this.maxWindowSize = maxWindowSize;
        this.scheduler = scheduler;
    }
    WindowTimeOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler));
    };
    return WindowTimeOperator;
}());
var CountedSubject = (function (_super) {
    __extends(CountedSubject, _super);
    function CountedSubject() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this._numberOfNextedValues = 0;
        return _this;
    }
    CountedSubject.prototype.next = function (value) {
        this._numberOfNextedValues++;
        _super.prototype.next.call(this, value);
    };
    Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", {
        get: function () {
            return this._numberOfNextedValues;
        },
        enumerable: true,
        configurable: true
    });
    return CountedSubject;
}(Subject_1.Subject));
var WindowTimeSubscriber = (function (_super) {
    __extends(WindowTimeSubscriber, _super);
    function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
        var _this = _super.call(this, destination) || this;
        _this.destination = destination;
        _this.windowTimeSpan = windowTimeSpan;
        _this.windowCreationInterval = windowCreationInterval;
        _this.maxWindowSize = maxWindowSize;
        _this.scheduler = scheduler;
        _this.windows = [];
        var window = _this.openWindow();
        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
            var closeState = { subscriber: _this, window: window, context: null };
            var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler };
            _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));
            _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));
        }
        else {
            var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan };
            _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));
        }
        return _this;
    }
    WindowTimeSubscriber.prototype._next = function (value) {
        var windows = this.windows;
        var len = windows.length;
        for (var i = 0; i < len; i++) {
            var window_1 = windows[i];
            if (!window_1.closed) {
                window_1.next(value);
                if (window_1.numberOfNextedValues >= this.maxWindowSize) {
                    this.closeWindow(window_1);
                }
            }
        }
    };
    WindowTimeSubscriber.prototype._error = function (err) {
        var windows = this.windows;
        while (windows.length > 0) {
            windows.shift().error(err);
        }
        this.destination.error(err);
    };
    WindowTimeSubscriber.prototype._complete = function () {
        var windows = this.windows;
        while (windows.length > 0) {
            var window_2 = windows.shift();
            if (!window_2.closed) {
                window_2.complete();
            }
        }
        this.destination.complete();
    };
    WindowTimeSubscriber.prototype.openWindow = function () {
        var window = new CountedSubject();
        this.windows.push(window);
        var destination = this.destination;
        destination.next(window);
        return window;
    };
    WindowTimeSubscriber.prototype.closeWindow = function (window) {
        window.complete();
        var windows = this.windows;
        windows.splice(windows.indexOf(window), 1);
    };
    return WindowTimeSubscriber;
}(Subscriber_1.Subscriber));
function dispatchWindowTimeSpanOnly(state) {
    var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window;
    if (window) {
        subscriber.closeWindow(window);
    }
    state.window = subscriber.openWindow();
    this.schedule(state, windowTimeSpan);
}
function dispatchWindowCreation(state) {
    var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval;
    var window = subscriber.openWindow();
    var action = this;
    var context = { action: action, subscription: null };
    var timeSpanState = { subscriber: subscriber, window: window, context: context };
    context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);
    action.add(context.subscription);
    action.schedule(state, windowCreationInterval);
}
function dispatchWindowClose(state) {
    var subscriber = state.subscriber, window = state.window, context = state.context;
    if (context && context.action && context.subscription) {
        context.action.remove(context.subscription);
    }
    subscriber.closeWindow(window);
}

},{"../Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../scheduler/async":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js","../util/isNumeric":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isNumeric.js","../util/isScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/windowToggle.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subject_1 = require("../Subject");
var Subscription_1 = require("../Subscription");
var OuterSubscriber_1 = require("../OuterSubscriber");
var subscribeToResult_1 = require("../util/subscribeToResult");
function windowToggle(openings, closingSelector) {
    return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); };
}
exports.windowToggle = windowToggle;
var WindowToggleOperator = (function () {
    function WindowToggleOperator(openings, closingSelector) {
        this.openings = openings;
        this.closingSelector = closingSelector;
    }
    WindowToggleOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));
    };
    return WindowToggleOperator;
}());
var WindowToggleSubscriber = (function (_super) {
    __extends(WindowToggleSubscriber, _super);
    function WindowToggleSubscriber(destination, openings, closingSelector) {
        var _this = _super.call(this, destination) || this;
        _this.openings = openings;
        _this.closingSelector = closingSelector;
        _this.contexts = [];
        _this.add(_this.openSubscription = subscribeToResult_1.subscribeToResult(_this, openings, openings));
        return _this;
    }
    WindowToggleSubscriber.prototype._next = function (value) {
        var contexts = this.contexts;
        if (contexts) {
            var len = contexts.length;
            for (var i = 0; i < len; i++) {
                contexts[i].window.next(value);
            }
        }
    };
    WindowToggleSubscriber.prototype._error = function (err) {
        var contexts = this.contexts;
        this.contexts = null;
        if (contexts) {
            var len = contexts.length;
            var index = -1;
            while (++index < len) {
                var context_1 = contexts[index];
                context_1.window.error(err);
                context_1.subscription.unsubscribe();
            }
        }
        _super.prototype._error.call(this, err);
    };
    WindowToggleSubscriber.prototype._complete = function () {
        var contexts = this.contexts;
        this.contexts = null;
        if (contexts) {
            var len = contexts.length;
            var index = -1;
            while (++index < len) {
                var context_2 = contexts[index];
                context_2.window.complete();
                context_2.subscription.unsubscribe();
            }
        }
        _super.prototype._complete.call(this);
    };
    WindowToggleSubscriber.prototype._unsubscribe = function () {
        var contexts = this.contexts;
        this.contexts = null;
        if (contexts) {
            var len = contexts.length;
            var index = -1;
            while (++index < len) {
                var context_3 = contexts[index];
                context_3.window.unsubscribe();
                context_3.subscription.unsubscribe();
            }
        }
    };
    WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
        if (outerValue === this.openings) {
            var closingNotifier = void 0;
            try {
                var closingSelector = this.closingSelector;
                closingNotifier = closingSelector(innerValue);
            }
            catch (e) {
                return this.error(e);
            }
            var window_1 = new Subject_1.Subject();
            var subscription = new Subscription_1.Subscription();
            var context_4 = { window: window_1, subscription: subscription };
            this.contexts.push(context_4);
            var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context_4);
            if (innerSubscription.closed) {
                this.closeWindow(this.contexts.length - 1);
            }
            else {
                innerSubscription.context = context_4;
                subscription.add(innerSubscription);
            }
            this.destination.next(window_1);
        }
        else {
            this.closeWindow(this.contexts.indexOf(outerValue));
        }
    };
    WindowToggleSubscriber.prototype.notifyError = function (err) {
        this.error(err);
    };
    WindowToggleSubscriber.prototype.notifyComplete = function (inner) {
        if (inner !== this.openSubscription) {
            this.closeWindow(this.contexts.indexOf(inner.context));
        }
    };
    WindowToggleSubscriber.prototype.closeWindow = function (index) {
        if (index === -1) {
            return;
        }
        var contexts = this.contexts;
        var context = contexts[index];
        var window = context.window, subscription = context.subscription;
        contexts.splice(index, 1);
        window.complete();
        subscription.unsubscribe();
    };
    return WindowToggleSubscriber;
}(OuterSubscriber_1.OuterSubscriber));

},{"../OuterSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/OuterSubscriber.js","../Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js","../util/subscribeToResult":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToResult.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/windowWhen.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subject_1 = require("../Subject");
var OuterSubscriber_1 = require("../OuterSubscriber");
var subscribeToResult_1 = require("../util/subscribeToResult");
function windowWhen(closingSelector) {
    return function windowWhenOperatorFunction(source) {
        return source.lift(new WindowOperator(closingSelector));
    };
}
exports.windowWhen = windowWhen;
var WindowOperator = (function () {
    function WindowOperator(closingSelector) {
        this.closingSelector = closingSelector;
    }
    WindowOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));
    };
    return WindowOperator;
}());
var WindowSubscriber = (function (_super) {
    __extends(WindowSubscriber, _super);
    function WindowSubscriber(destination, closingSelector) {
        var _this = _super.call(this, destination) || this;
        _this.destination = destination;
        _this.closingSelector = closingSelector;
        _this.openWindow();
        return _this;
    }
    WindowSubscriber.prototype.notifyNext = function (_outerValue, _innerValue, _outerIndex, _innerIndex, innerSub) {
        this.openWindow(innerSub);
    };
    WindowSubscriber.prototype.notifyError = function (error) {
        this._error(error);
    };
    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
        this.openWindow(innerSub);
    };
    WindowSubscriber.prototype._next = function (value) {
        this.window.next(value);
    };
    WindowSubscriber.prototype._error = function (err) {
        this.window.error(err);
        this.destination.error(err);
        this.unsubscribeClosingNotification();
    };
    WindowSubscriber.prototype._complete = function () {
        this.window.complete();
        this.destination.complete();
        this.unsubscribeClosingNotification();
    };
    WindowSubscriber.prototype.unsubscribeClosingNotification = function () {
        if (this.closingNotification) {
            this.closingNotification.unsubscribe();
        }
    };
    WindowSubscriber.prototype.openWindow = function (innerSub) {
        if (innerSub === void 0) { innerSub = null; }
        if (innerSub) {
            this.remove(innerSub);
            innerSub.unsubscribe();
        }
        var prevWindow = this.window;
        if (prevWindow) {
            prevWindow.complete();
        }
        var window = this.window = new Subject_1.Subject();
        this.destination.next(window);
        var closingNotifier;
        try {
            var closingSelector = this.closingSelector;
            closingNotifier = closingSelector();
        }
        catch (e) {
            this.destination.error(e);
            this.window.error(e);
            return;
        }
        this.add(this.closingNotification = subscribeToResult_1.subscribeToResult(this, closingNotifier));
    };
    return WindowSubscriber;
}(OuterSubscriber_1.OuterSubscriber));

},{"../OuterSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/OuterSubscriber.js","../Subject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subject.js","../util/subscribeToResult":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToResult.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/withLatestFrom.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var OuterSubscriber_1 = require("../OuterSubscriber");
var subscribeToResult_1 = require("../util/subscribeToResult");
function withLatestFrom() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    return function (source) {
        var project;
        if (typeof args[args.length - 1] === 'function') {
            project = args.pop();
        }
        var observables = args;
        return source.lift(new WithLatestFromOperator(observables, project));
    };
}
exports.withLatestFrom = withLatestFrom;
var WithLatestFromOperator = (function () {
    function WithLatestFromOperator(observables, project) {
        this.observables = observables;
        this.project = project;
    }
    WithLatestFromOperator.prototype.call = function (subscriber, source) {
        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
    };
    return WithLatestFromOperator;
}());
var WithLatestFromSubscriber = (function (_super) {
    __extends(WithLatestFromSubscriber, _super);
    function WithLatestFromSubscriber(destination, observables, project) {
        var _this = _super.call(this, destination) || this;
        _this.observables = observables;
        _this.project = project;
        _this.toRespond = [];
        var len = observables.length;
        _this.values = new Array(len);
        for (var i = 0; i < len; i++) {
            _this.toRespond.push(i);
        }
        for (var i = 0; i < len; i++) {
            var observable = observables[i];
            _this.add(subscribeToResult_1.subscribeToResult(_this, observable, undefined, i));
        }
        return _this;
    }
    WithLatestFromSubscriber.prototype.notifyNext = function (_outerValue, innerValue, outerIndex) {
        this.values[outerIndex] = innerValue;
        var toRespond = this.toRespond;
        if (toRespond.length > 0) {
            var found = toRespond.indexOf(outerIndex);
            if (found !== -1) {
                toRespond.splice(found, 1);
            }
        }
    };
    WithLatestFromSubscriber.prototype.notifyComplete = function () {
    };
    WithLatestFromSubscriber.prototype._next = function (value) {
        if (this.toRespond.length === 0) {
            var args = [value].concat(this.values);
            if (this.project) {
                this._tryProject(args);
            }
            else {
                this.destination.next(args);
            }
        }
    };
    WithLatestFromSubscriber.prototype._tryProject = function (args) {
        var result;
        try {
            result = this.project.apply(this, args);
        }
        catch (err) {
            this.destination.error(err);
            return;
        }
        this.destination.next(result);
    };
    return WithLatestFromSubscriber;
}(OuterSubscriber_1.OuterSubscriber));

},{"../OuterSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/OuterSubscriber.js","../util/subscribeToResult":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToResult.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/zip.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var zip_1 = require("../observable/zip");
function zip() {
    var observables = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        observables[_i] = arguments[_i];
    }
    return function zipOperatorFunction(source) {
        return source.lift.call(zip_1.zip.apply(void 0, [source].concat(observables)));
    };
}
exports.zip = zip;

},{"../observable/zip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/zip.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/zipAll.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var zip_1 = require("../observable/zip");
function zipAll(project) {
    return function (source) { return source.lift(new zip_1.ZipOperator(project)); };
}
exports.zipAll = zipAll;

},{"../observable/zip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/observable/zip.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/scheduleArray.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var Subscription_1 = require("../Subscription");
function scheduleArray(input, scheduler) {
    return new Observable_1.Observable(function (subscriber) {
        var sub = new Subscription_1.Subscription();
        var i = 0;
        sub.add(scheduler.schedule(function () {
            if (i === input.length) {
                subscriber.complete();
                return;
            }
            subscriber.next(input[i++]);
            if (!subscriber.closed) {
                sub.add(this.schedule());
            }
        }));
        return sub;
    });
}
exports.scheduleArray = scheduleArray;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/scheduleIterable.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var Subscription_1 = require("../Subscription");
var iterator_1 = require("../symbol/iterator");
function scheduleIterable(input, scheduler) {
    if (!input) {
        throw new Error('Iterable cannot be null');
    }
    return new Observable_1.Observable(function (subscriber) {
        var sub = new Subscription_1.Subscription();
        var iterator;
        sub.add(function () {
            if (iterator && typeof iterator.return === 'function') {
                iterator.return();
            }
        });
        sub.add(scheduler.schedule(function () {
            iterator = input[iterator_1.iterator]();
            sub.add(scheduler.schedule(function () {
                if (subscriber.closed) {
                    return;
                }
                var value;
                var done;
                try {
                    var result = iterator.next();
                    value = result.value;
                    done = result.done;
                }
                catch (err) {
                    subscriber.error(err);
                    return;
                }
                if (done) {
                    subscriber.complete();
                }
                else {
                    subscriber.next(value);
                    this.schedule();
                }
            }));
        }));
        return sub;
    });
}
exports.scheduleIterable = scheduleIterable;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js","../symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/scheduleObservable.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var Subscription_1 = require("../Subscription");
var observable_1 = require("../symbol/observable");
function scheduleObservable(input, scheduler) {
    return new Observable_1.Observable(function (subscriber) {
        var sub = new Subscription_1.Subscription();
        sub.add(scheduler.schedule(function () {
            var observable = input[observable_1.observable]();
            sub.add(observable.subscribe({
                next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); },
                error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); },
                complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); },
            }));
        }));
        return sub;
    });
}
exports.scheduleObservable = scheduleObservable;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js","../symbol/observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/observable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/schedulePromise.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
var Subscription_1 = require("../Subscription");
function schedulePromise(input, scheduler) {
    return new Observable_1.Observable(function (subscriber) {
        var sub = new Subscription_1.Subscription();
        sub.add(scheduler.schedule(function () { return input.then(function (value) {
            sub.add(scheduler.schedule(function () {
                subscriber.next(value);
                sub.add(scheduler.schedule(function () { return subscriber.complete(); }));
            }));
        }, function (err) {
            sub.add(scheduler.schedule(function () { return subscriber.error(err); }));
        }); }));
        return sub;
    });
}
exports.schedulePromise = schedulePromise;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/scheduled.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var scheduleObservable_1 = require("./scheduleObservable");
var schedulePromise_1 = require("./schedulePromise");
var scheduleArray_1 = require("./scheduleArray");
var scheduleIterable_1 = require("./scheduleIterable");
var isInteropObservable_1 = require("../util/isInteropObservable");
var isPromise_1 = require("../util/isPromise");
var isArrayLike_1 = require("../util/isArrayLike");
var isIterable_1 = require("../util/isIterable");
function scheduled(input, scheduler) {
    if (input != null) {
        if (isInteropObservable_1.isInteropObservable(input)) {
            return scheduleObservable_1.scheduleObservable(input, scheduler);
        }
        else if (isPromise_1.isPromise(input)) {
            return schedulePromise_1.schedulePromise(input, scheduler);
        }
        else if (isArrayLike_1.isArrayLike(input)) {
            return scheduleArray_1.scheduleArray(input, scheduler);
        }
        else if (isIterable_1.isIterable(input) || typeof input === 'string') {
            return scheduleIterable_1.scheduleIterable(input, scheduler);
        }
    }
    throw new TypeError((input !== null && typeof input || input) + ' is not observable');
}
exports.scheduled = scheduled;

},{"../util/isArrayLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArrayLike.js","../util/isInteropObservable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isInteropObservable.js","../util/isIterable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isIterable.js","../util/isPromise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isPromise.js","./scheduleArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/scheduleArray.js","./scheduleIterable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/scheduleIterable.js","./scheduleObservable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/scheduleObservable.js","./schedulePromise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduled/schedulePromise.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/Action.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Subscription_1 = require("../Subscription");
var Action = (function (_super) {
    __extends(Action, _super);
    function Action(scheduler, work) {
        return _super.call(this) || this;
    }
    Action.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        return this;
    };
    return Action;
}(Subscription_1.Subscription));
exports.Action = Action;

},{"../Subscription":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscription.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AnimationFrameAction.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var AsyncAction_1 = require("./AsyncAction");
var AnimationFrameAction = (function (_super) {
    __extends(AnimationFrameAction, _super);
    function AnimationFrameAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay !== null && delay > 0) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        scheduler.actions.push(this);
        return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); }));
    };
    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
        }
        if (scheduler.actions.length === 0) {
            cancelAnimationFrame(id);
            scheduler.scheduled = undefined;
        }
        return undefined;
    };
    return AnimationFrameAction;
}(AsyncAction_1.AsyncAction));
exports.AnimationFrameAction = AnimationFrameAction;

},{"./AsyncAction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncAction.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var AsyncScheduler_1 = require("./AsyncScheduler");
var AnimationFrameScheduler = (function (_super) {
    __extends(AnimationFrameScheduler, _super);
    function AnimationFrameScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    AnimationFrameScheduler.prototype.flush = function (action) {
        this.active = true;
        this.scheduled = undefined;
        var actions = this.actions;
        var error;
        var index = -1;
        var count = actions.length;
        action = action || actions.shift();
        do {
            if (error = action.execute(action.state, action.delay)) {
                break;
            }
        } while (++index < count && (action = actions.shift()));
        this.active = false;
        if (error) {
            while (++index < count && (action = actions.shift())) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AnimationFrameScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.AnimationFrameScheduler = AnimationFrameScheduler;

},{"./AsyncScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsapAction.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Immediate_1 = require("../util/Immediate");
var AsyncAction_1 = require("./AsyncAction");
var AsapAction = (function (_super) {
    __extends(AsapAction, _super);
    function AsapAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay !== null && delay > 0) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        scheduler.actions.push(this);
        return scheduler.scheduled || (scheduler.scheduled = Immediate_1.Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));
    };
    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
        }
        if (scheduler.actions.length === 0) {
            Immediate_1.Immediate.clearImmediate(id);
            scheduler.scheduled = undefined;
        }
        return undefined;
    };
    return AsapAction;
}(AsyncAction_1.AsyncAction));
exports.AsapAction = AsapAction;

},{"../util/Immediate":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/Immediate.js","./AsyncAction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncAction.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsapScheduler.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var AsyncScheduler_1 = require("./AsyncScheduler");
var AsapScheduler = (function (_super) {
    __extends(AsapScheduler, _super);
    function AsapScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    AsapScheduler.prototype.flush = function (action) {
        this.active = true;
        this.scheduled = undefined;
        var actions = this.actions;
        var error;
        var index = -1;
        var count = actions.length;
        action = action || actions.shift();
        do {
            if (error = action.execute(action.state, action.delay)) {
                break;
            }
        } while (++index < count && (action = actions.shift()));
        this.active = false;
        if (error) {
            while (++index < count && (action = actions.shift())) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AsapScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.AsapScheduler = AsapScheduler;

},{"./AsyncScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncAction.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Action_1 = require("./Action");
var AsyncAction = (function (_super) {
    __extends(AsyncAction, _super);
    function AsyncAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        _this.pending = false;
        return _this;
    }
    AsyncAction.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        if (this.closed) {
            return this;
        }
        this.state = state;
        var id = this.id;
        var scheduler = this.scheduler;
        if (id != null) {
            this.id = this.recycleAsyncId(scheduler, id, delay);
        }
        this.pending = true;
        this.delay = delay;
        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
        return this;
    };
    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        return setInterval(scheduler.flush.bind(scheduler, this), delay);
    };
    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay !== null && this.delay === delay && this.pending === false) {
            return id;
        }
        clearInterval(id);
        return undefined;
    };
    AsyncAction.prototype.execute = function (state, delay) {
        if (this.closed) {
            return new Error('executing a cancelled action');
        }
        this.pending = false;
        var error = this._execute(state, delay);
        if (error) {
            return error;
        }
        else if (this.pending === false && this.id != null) {
            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
        }
    };
    AsyncAction.prototype._execute = function (state, delay) {
        var errored = false;
        var errorValue = undefined;
        try {
            this.work(state);
        }
        catch (e) {
            errored = true;
            errorValue = !!e && e || new Error(e);
        }
        if (errored) {
            this.unsubscribe();
            return errorValue;
        }
    };
    AsyncAction.prototype._unsubscribe = function () {
        var id = this.id;
        var scheduler = this.scheduler;
        var actions = scheduler.actions;
        var index = actions.indexOf(this);
        this.work = null;
        this.state = null;
        this.pending = false;
        this.scheduler = null;
        if (index !== -1) {
            actions.splice(index, 1);
        }
        if (id != null) {
            this.id = this.recycleAsyncId(scheduler, id, null);
        }
        this.delay = null;
    };
    return AsyncAction;
}(Action_1.Action));
exports.AsyncAction = AsyncAction;

},{"./Action":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/Action.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncScheduler.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Scheduler_1 = require("../Scheduler");
var AsyncScheduler = (function (_super) {
    __extends(AsyncScheduler, _super);
    function AsyncScheduler(SchedulerAction, now) {
        if (now === void 0) { now = Scheduler_1.Scheduler.now; }
        var _this = _super.call(this, SchedulerAction, function () {
            if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) {
                return AsyncScheduler.delegate.now();
            }
            else {
                return now();
            }
        }) || this;
        _this.actions = [];
        _this.active = false;
        _this.scheduled = undefined;
        return _this;
    }
    AsyncScheduler.prototype.schedule = function (work, delay, state) {
        if (delay === void 0) { delay = 0; }
        if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
            return AsyncScheduler.delegate.schedule(work, delay, state);
        }
        else {
            return _super.prototype.schedule.call(this, work, delay, state);
        }
    };
    AsyncScheduler.prototype.flush = function (action) {
        var actions = this.actions;
        if (this.active) {
            actions.push(action);
            return;
        }
        var error;
        this.active = true;
        do {
            if (error = action.execute(action.state, action.delay)) {
                break;
            }
        } while (action = actions.shift());
        this.active = false;
        if (error) {
            while (action = actions.shift()) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AsyncScheduler;
}(Scheduler_1.Scheduler));
exports.AsyncScheduler = AsyncScheduler;

},{"../Scheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Scheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/QueueAction.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var AsyncAction_1 = require("./AsyncAction");
var QueueAction = (function (_super) {
    __extends(QueueAction, _super);
    function QueueAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    QueueAction.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay > 0) {
            return _super.prototype.schedule.call(this, state, delay);
        }
        this.delay = delay;
        this.state = state;
        this.scheduler.flush(this);
        return this;
    };
    QueueAction.prototype.execute = function (state, delay) {
        return (delay > 0 || this.closed) ?
            _super.prototype.execute.call(this, state, delay) :
            this._execute(state, delay);
    };
    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        return scheduler.flush(this);
    };
    return QueueAction;
}(AsyncAction_1.AsyncAction));
exports.QueueAction = QueueAction;

},{"./AsyncAction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncAction.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/QueueScheduler.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var AsyncScheduler_1 = require("./AsyncScheduler");
var QueueScheduler = (function (_super) {
    __extends(QueueScheduler, _super);
    function QueueScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    return QueueScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.QueueScheduler = QueueScheduler;

},{"./AsyncScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.js":[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    }
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var AsyncAction_1 = require("./AsyncAction");
var AsyncScheduler_1 = require("./AsyncScheduler");
var VirtualTimeScheduler = (function (_super) {
    __extends(VirtualTimeScheduler, _super);
    function VirtualTimeScheduler(SchedulerAction, maxFrames) {
        if (SchedulerAction === void 0) { SchedulerAction = VirtualAction; }
        if (maxFrames === void 0) { maxFrames = Number.POSITIVE_INFINITY; }
        var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this;
        _this.maxFrames = maxFrames;
        _this.frame = 0;
        _this.index = -1;
        return _this;
    }
    VirtualTimeScheduler.prototype.flush = function () {
        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
        var error, action;
        while ((action = actions[0]) && action.delay <= maxFrames) {
            actions.shift();
            this.frame = action.delay;
            if (error = action.execute(action.state, action.delay)) {
                break;
            }
        }
        if (error) {
            while (action = actions.shift()) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    VirtualTimeScheduler.frameTimeFactor = 10;
    return VirtualTimeScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.VirtualTimeScheduler = VirtualTimeScheduler;
var VirtualAction = (function (_super) {
    __extends(VirtualAction, _super);
    function VirtualAction(scheduler, work, index) {
        if (index === void 0) { index = scheduler.index += 1; }
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        _this.index = index;
        _this.active = true;
        _this.index = scheduler.index = index;
        return _this;
    }
    VirtualAction.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        if (!this.id) {
            return _super.prototype.schedule.call(this, state, delay);
        }
        this.active = false;
        var action = new VirtualAction(this.scheduler, this.work);
        this.add(action);
        return action.schedule(state, delay);
    };
    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        this.delay = scheduler.frame + delay;
        var actions = scheduler.actions;
        actions.push(this);
        actions.sort(VirtualAction.sortActions);
        return true;
    };
    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        return undefined;
    };
    VirtualAction.prototype._execute = function (state, delay) {
        if (this.active === true) {
            return _super.prototype._execute.call(this, state, delay);
        }
    };
    VirtualAction.sortActions = function (a, b) {
        if (a.delay === b.delay) {
            if (a.index === b.index) {
                return 0;
            }
            else if (a.index > b.index) {
                return 1;
            }
            else {
                return -1;
            }
        }
        else if (a.delay > b.delay) {
            return 1;
        }
        else {
            return -1;
        }
    };
    return VirtualAction;
}(AsyncAction_1.AsyncAction));
exports.VirtualAction = VirtualAction;

},{"./AsyncAction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncAction.js","./AsyncScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/animationFrame.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AnimationFrameAction_1 = require("./AnimationFrameAction");
var AnimationFrameScheduler_1 = require("./AnimationFrameScheduler");
exports.animationFrameScheduler = new AnimationFrameScheduler_1.AnimationFrameScheduler(AnimationFrameAction_1.AnimationFrameAction);
exports.animationFrame = exports.animationFrameScheduler;

},{"./AnimationFrameAction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AnimationFrameAction.js","./AnimationFrameScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/asap.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AsapAction_1 = require("./AsapAction");
var AsapScheduler_1 = require("./AsapScheduler");
exports.asapScheduler = new AsapScheduler_1.AsapScheduler(AsapAction_1.AsapAction);
exports.asap = exports.asapScheduler;

},{"./AsapAction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsapAction.js","./AsapScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsapScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/async.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AsyncAction_1 = require("./AsyncAction");
var AsyncScheduler_1 = require("./AsyncScheduler");
exports.asyncScheduler = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
exports.async = exports.asyncScheduler;

},{"./AsyncAction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncAction.js","./AsyncScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/AsyncScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/queue.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var QueueAction_1 = require("./QueueAction");
var QueueScheduler_1 = require("./QueueScheduler");
exports.queueScheduler = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
exports.queue = exports.queueScheduler;

},{"./QueueAction":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/QueueAction.js","./QueueScheduler":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/scheduler/QueueScheduler.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/iterator.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function getSymbolIterator() {
    if (typeof Symbol !== 'function' || !Symbol.iterator) {
        return '@@iterator';
    }
    return Symbol.iterator;
}
exports.getSymbolIterator = getSymbolIterator;
exports.iterator = getSymbolIterator();
exports.$$iterator = exports.iterator;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/observable.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.observable = (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })();

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/rxSubscriber.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.rxSubscriber = (function () {
    return typeof Symbol === 'function'
        ? Symbol('rxSubscriber')
        : '@@rxSubscriber_' + Math.random();
})();
exports.$$rxSubscriber = exports.rxSubscriber;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ArgumentOutOfRangeErrorImpl = (function () {
    function ArgumentOutOfRangeErrorImpl() {
        Error.call(this);
        this.message = 'argument out of range';
        this.name = 'ArgumentOutOfRangeError';
        return this;
    }
    ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);
    return ArgumentOutOfRangeErrorImpl;
})();
exports.ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/EmptyError.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var EmptyErrorImpl = (function () {
    function EmptyErrorImpl() {
        Error.call(this);
        this.message = 'no elements in sequence';
        this.name = 'EmptyError';
        return this;
    }
    EmptyErrorImpl.prototype = Object.create(Error.prototype);
    return EmptyErrorImpl;
})();
exports.EmptyError = EmptyErrorImpl;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/Immediate.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var nextHandle = 1;
var RESOLVED = (function () { return Promise.resolve(); })();
var activeHandles = {};
function findAndClearHandle(handle) {
    if (handle in activeHandles) {
        delete activeHandles[handle];
        return true;
    }
    return false;
}
exports.Immediate = {
    setImmediate: function (cb) {
        var handle = nextHandle++;
        activeHandles[handle] = true;
        RESOLVED.then(function () { return findAndClearHandle(handle) && cb(); });
        return handle;
    },
    clearImmediate: function (handle) {
        findAndClearHandle(handle);
    },
};
exports.TestTools = {
    pending: function () {
        return Object.keys(activeHandles).length;
    }
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/ObjectUnsubscribedError.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectUnsubscribedErrorImpl = (function () {
    function ObjectUnsubscribedErrorImpl() {
        Error.call(this);
        this.message = 'object unsubscribed';
        this.name = 'ObjectUnsubscribedError';
        return this;
    }
    ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);
    return ObjectUnsubscribedErrorImpl;
})();
exports.ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/TimeoutError.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var TimeoutErrorImpl = (function () {
    function TimeoutErrorImpl() {
        Error.call(this);
        this.message = 'Timeout has occurred';
        this.name = 'TimeoutError';
        return this;
    }
    TimeoutErrorImpl.prototype = Object.create(Error.prototype);
    return TimeoutErrorImpl;
})();
exports.TimeoutError = TimeoutErrorImpl;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/UnsubscriptionError.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var UnsubscriptionErrorImpl = (function () {
    function UnsubscriptionErrorImpl(errors) {
        Error.call(this);
        this.message = errors ?
            errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ') : '';
        this.name = 'UnsubscriptionError';
        this.errors = errors;
        return this;
    }
    UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);
    return UnsubscriptionErrorImpl;
})();
exports.UnsubscriptionError = UnsubscriptionErrorImpl;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/canReportError.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
function canReportError(observer) {
    while (observer) {
        var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped;
        if (closed_1 || isStopped) {
            return false;
        }
        else if (destination && destination instanceof Subscriber_1.Subscriber) {
            observer = destination;
        }
        else {
            observer = null;
        }
    }
    return true;
}
exports.canReportError = canReportError;

},{"../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/hostReportError.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function hostReportError(err) {
    setTimeout(function () { throw err; }, 0);
}
exports.hostReportError = hostReportError;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/identity.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function identity(x) {
    return x;
}
exports.identity = identity;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isArray = (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })();

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArrayLike.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isDate.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function isDate(value) {
    return value instanceof Date && !isNaN(+value);
}
exports.isDate = isDate;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isFunction.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function isFunction(x) {
    return typeof x === 'function';
}
exports.isFunction = isFunction;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isInteropObservable.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var observable_1 = require("../symbol/observable");
function isInteropObservable(input) {
    return input && typeof input[observable_1.observable] === 'function';
}
exports.isInteropObservable = isInteropObservable;

},{"../symbol/observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/observable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isIterable.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var iterator_1 = require("../symbol/iterator");
function isIterable(input) {
    return input && typeof input[iterator_1.iterator] === 'function';
}
exports.isIterable = isIterable;

},{"../symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isNumeric.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var isArray_1 = require("./isArray");
function isNumeric(val) {
    return !isArray_1.isArray(val) && (val - parseFloat(val) + 1) >= 0;
}
exports.isNumeric = isNumeric;

},{"./isArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArray.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isObject.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function isObject(x) {
    return x !== null && typeof x === 'object';
}
exports.isObject = isObject;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isObservable.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Observable_1 = require("../Observable");
function isObservable(obj) {
    return !!obj && (obj instanceof Observable_1.Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));
}
exports.isObservable = isObservable;

},{"../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isPromise.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function isPromise(value) {
    return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
}
exports.isPromise = isPromise;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isScheduler.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function isScheduler(value) {
    return value && typeof value.schedule === 'function';
}
exports.isScheduler = isScheduler;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/noop.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function noop() { }
exports.noop = noop;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/not.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function not(pred, thisArg) {
    function notPred() {
        return !(notPred.pred.apply(notPred.thisArg, arguments));
    }
    notPred.pred = pred;
    notPred.thisArg = thisArg;
    return notPred;
}
exports.not = not;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/pipe.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var identity_1 = require("./identity");
function pipe() {
    var fns = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        fns[_i] = arguments[_i];
    }
    return pipeFromArray(fns);
}
exports.pipe = pipe;
function pipeFromArray(fns) {
    if (fns.length === 0) {
        return identity_1.identity;
    }
    if (fns.length === 1) {
        return fns[0];
    }
    return function piped(input) {
        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
    };
}
exports.pipeFromArray = pipeFromArray;

},{"./identity":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/identity.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeTo.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var subscribeToArray_1 = require("./subscribeToArray");
var subscribeToPromise_1 = require("./subscribeToPromise");
var subscribeToIterable_1 = require("./subscribeToIterable");
var subscribeToObservable_1 = require("./subscribeToObservable");
var isArrayLike_1 = require("./isArrayLike");
var isPromise_1 = require("./isPromise");
var isObject_1 = require("./isObject");
var iterator_1 = require("../symbol/iterator");
var observable_1 = require("../symbol/observable");
exports.subscribeTo = function (result) {
    if (!!result && typeof result[observable_1.observable] === 'function') {
        return subscribeToObservable_1.subscribeToObservable(result);
    }
    else if (isArrayLike_1.isArrayLike(result)) {
        return subscribeToArray_1.subscribeToArray(result);
    }
    else if (isPromise_1.isPromise(result)) {
        return subscribeToPromise_1.subscribeToPromise(result);
    }
    else if (!!result && typeof result[iterator_1.iterator] === 'function') {
        return subscribeToIterable_1.subscribeToIterable(result);
    }
    else {
        var value = isObject_1.isObject(result) ? 'an invalid object' : "'" + result + "'";
        var msg = "You provided " + value + " where a stream was expected."
            + ' You can provide an Observable, Promise, Array, or Iterable.';
        throw new TypeError(msg);
    }
};

},{"../symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/iterator.js","../symbol/observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/observable.js","./isArrayLike":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isArrayLike.js","./isObject":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isObject.js","./isPromise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/isPromise.js","./subscribeToArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToArray.js","./subscribeToIterable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToIterable.js","./subscribeToObservable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToObservable.js","./subscribeToPromise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToPromise.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToArray.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.subscribeToArray = function (array) { return function (subscriber) {
    for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {
        subscriber.next(array[i]);
    }
    subscriber.complete();
}; };

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToIterable.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var iterator_1 = require("../symbol/iterator");
exports.subscribeToIterable = function (iterable) { return function (subscriber) {
    var iterator = iterable[iterator_1.iterator]();
    do {
        var item = void 0;
        try {
            item = iterator.next();
        }
        catch (err) {
            subscriber.error(err);
            return subscriber;
        }
        if (item.done) {
            subscriber.complete();
            break;
        }
        subscriber.next(item.value);
        if (subscriber.closed) {
            break;
        }
    } while (true);
    if (typeof iterator.return === 'function') {
        subscriber.add(function () {
            if (iterator.return) {
                iterator.return();
            }
        });
    }
    return subscriber;
}; };

},{"../symbol/iterator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/iterator.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToObservable.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var observable_1 = require("../symbol/observable");
exports.subscribeToObservable = function (obj) { return function (subscriber) {
    var obs = obj[observable_1.observable]();
    if (typeof obs.subscribe !== 'function') {
        throw new TypeError('Provided object does not correctly implement Symbol.observable');
    }
    else {
        return obs.subscribe(subscriber);
    }
}; };

},{"../symbol/observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/observable.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToPromise.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var hostReportError_1 = require("./hostReportError");
exports.subscribeToPromise = function (promise) { return function (subscriber) {
    promise.then(function (value) {
        if (!subscriber.closed) {
            subscriber.next(value);
            subscriber.complete();
        }
    }, function (err) { return subscriber.error(err); })
        .then(null, hostReportError_1.hostReportError);
    return subscriber;
}; };

},{"./hostReportError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/hostReportError.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeToResult.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var InnerSubscriber_1 = require("../InnerSubscriber");
var subscribeTo_1 = require("./subscribeTo");
var Observable_1 = require("../Observable");
function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, innerSubscriber) {
    if (innerSubscriber === void 0) { innerSubscriber = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex); }
    if (innerSubscriber.closed) {
        return undefined;
    }
    if (result instanceof Observable_1.Observable) {
        return result.subscribe(innerSubscriber);
    }
    return subscribeTo_1.subscribeTo(result)(innerSubscriber);
}
exports.subscribeToResult = subscribeToResult;

},{"../InnerSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/InnerSubscriber.js","../Observable":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observable.js","./subscribeTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/subscribeTo.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/util/toSubscriber.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Subscriber_1 = require("../Subscriber");
var rxSubscriber_1 = require("../symbol/rxSubscriber");
var Observer_1 = require("../Observer");
function toSubscriber(nextOrObserver, error, complete) {
    if (nextOrObserver) {
        if (nextOrObserver instanceof Subscriber_1.Subscriber) {
            return nextOrObserver;
        }
        if (nextOrObserver[rxSubscriber_1.rxSubscriber]) {
            return nextOrObserver[rxSubscriber_1.rxSubscriber]();
        }
    }
    if (!nextOrObserver && !error && !complete) {
        return new Subscriber_1.Subscriber(Observer_1.empty);
    }
    return new Subscriber_1.Subscriber(nextOrObserver, error, complete);
}
exports.toSubscriber = toSubscriber;

},{"../Observer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Observer.js","../Subscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/Subscriber.js","../symbol/rxSubscriber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/symbol/rxSubscriber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/operators/index.js":[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var audit_1 = require("../internal/operators/audit");
exports.audit = audit_1.audit;
var auditTime_1 = require("../internal/operators/auditTime");
exports.auditTime = auditTime_1.auditTime;
var buffer_1 = require("../internal/operators/buffer");
exports.buffer = buffer_1.buffer;
var bufferCount_1 = require("../internal/operators/bufferCount");
exports.bufferCount = bufferCount_1.bufferCount;
var bufferTime_1 = require("../internal/operators/bufferTime");
exports.bufferTime = bufferTime_1.bufferTime;
var bufferToggle_1 = require("../internal/operators/bufferToggle");
exports.bufferToggle = bufferToggle_1.bufferToggle;
var bufferWhen_1 = require("../internal/operators/bufferWhen");
exports.bufferWhen = bufferWhen_1.bufferWhen;
var catchError_1 = require("../internal/operators/catchError");
exports.catchError = catchError_1.catchError;
var combineAll_1 = require("../internal/operators/combineAll");
exports.combineAll = combineAll_1.combineAll;
var combineLatest_1 = require("../internal/operators/combineLatest");
exports.combineLatest = combineLatest_1.combineLatest;
var concat_1 = require("../internal/operators/concat");
exports.concat = concat_1.concat;
var concatAll_1 = require("../internal/operators/concatAll");
exports.concatAll = concatAll_1.concatAll;
var concatMap_1 = require("../internal/operators/concatMap");
exports.concatMap = concatMap_1.concatMap;
var concatMapTo_1 = require("../internal/operators/concatMapTo");
exports.concatMapTo = concatMapTo_1.concatMapTo;
var count_1 = require("../internal/operators/count");
exports.count = count_1.count;
var debounce_1 = require("../internal/operators/debounce");
exports.debounce = debounce_1.debounce;
var debounceTime_1 = require("../internal/operators/debounceTime");
exports.debounceTime = debounceTime_1.debounceTime;
var defaultIfEmpty_1 = require("../internal/operators/defaultIfEmpty");
exports.defaultIfEmpty = defaultIfEmpty_1.defaultIfEmpty;
var delay_1 = require("../internal/operators/delay");
exports.delay = delay_1.delay;
var delayWhen_1 = require("../internal/operators/delayWhen");
exports.delayWhen = delayWhen_1.delayWhen;
var dematerialize_1 = require("../internal/operators/dematerialize");
exports.dematerialize = dematerialize_1.dematerialize;
var distinct_1 = require("../internal/operators/distinct");
exports.distinct = distinct_1.distinct;
var distinctUntilChanged_1 = require("../internal/operators/distinctUntilChanged");
exports.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;
var distinctUntilKeyChanged_1 = require("../internal/operators/distinctUntilKeyChanged");
exports.distinctUntilKeyChanged = distinctUntilKeyChanged_1.distinctUntilKeyChanged;
var elementAt_1 = require("../internal/operators/elementAt");
exports.elementAt = elementAt_1.elementAt;
var endWith_1 = require("../internal/operators/endWith");
exports.endWith = endWith_1.endWith;
var every_1 = require("../internal/operators/every");
exports.every = every_1.every;
var exhaust_1 = require("../internal/operators/exhaust");
exports.exhaust = exhaust_1.exhaust;
var exhaustMap_1 = require("../internal/operators/exhaustMap");
exports.exhaustMap = exhaustMap_1.exhaustMap;
var expand_1 = require("../internal/operators/expand");
exports.expand = expand_1.expand;
var filter_1 = require("../internal/operators/filter");
exports.filter = filter_1.filter;
var finalize_1 = require("../internal/operators/finalize");
exports.finalize = finalize_1.finalize;
var find_1 = require("../internal/operators/find");
exports.find = find_1.find;
var findIndex_1 = require("../internal/operators/findIndex");
exports.findIndex = findIndex_1.findIndex;
var first_1 = require("../internal/operators/first");
exports.first = first_1.first;
var groupBy_1 = require("../internal/operators/groupBy");
exports.groupBy = groupBy_1.groupBy;
var ignoreElements_1 = require("../internal/operators/ignoreElements");
exports.ignoreElements = ignoreElements_1.ignoreElements;
var isEmpty_1 = require("../internal/operators/isEmpty");
exports.isEmpty = isEmpty_1.isEmpty;
var last_1 = require("../internal/operators/last");
exports.last = last_1.last;
var map_1 = require("../internal/operators/map");
exports.map = map_1.map;
var mapTo_1 = require("../internal/operators/mapTo");
exports.mapTo = mapTo_1.mapTo;
var materialize_1 = require("../internal/operators/materialize");
exports.materialize = materialize_1.materialize;
var max_1 = require("../internal/operators/max");
exports.max = max_1.max;
var merge_1 = require("../internal/operators/merge");
exports.merge = merge_1.merge;
var mergeAll_1 = require("../internal/operators/mergeAll");
exports.mergeAll = mergeAll_1.mergeAll;
var mergeMap_1 = require("../internal/operators/mergeMap");
exports.mergeMap = mergeMap_1.mergeMap;
exports.flatMap = mergeMap_1.flatMap;
var mergeMapTo_1 = require("../internal/operators/mergeMapTo");
exports.mergeMapTo = mergeMapTo_1.mergeMapTo;
var mergeScan_1 = require("../internal/operators/mergeScan");
exports.mergeScan = mergeScan_1.mergeScan;
var min_1 = require("../internal/operators/min");
exports.min = min_1.min;
var multicast_1 = require("../internal/operators/multicast");
exports.multicast = multicast_1.multicast;
var observeOn_1 = require("../internal/operators/observeOn");
exports.observeOn = observeOn_1.observeOn;
var onErrorResumeNext_1 = require("../internal/operators/onErrorResumeNext");
exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
var pairwise_1 = require("../internal/operators/pairwise");
exports.pairwise = pairwise_1.pairwise;
var partition_1 = require("../internal/operators/partition");
exports.partition = partition_1.partition;
var pluck_1 = require("../internal/operators/pluck");
exports.pluck = pluck_1.pluck;
var publish_1 = require("../internal/operators/publish");
exports.publish = publish_1.publish;
var publishBehavior_1 = require("../internal/operators/publishBehavior");
exports.publishBehavior = publishBehavior_1.publishBehavior;
var publishLast_1 = require("../internal/operators/publishLast");
exports.publishLast = publishLast_1.publishLast;
var publishReplay_1 = require("../internal/operators/publishReplay");
exports.publishReplay = publishReplay_1.publishReplay;
var race_1 = require("../internal/operators/race");
exports.race = race_1.race;
var reduce_1 = require("../internal/operators/reduce");
exports.reduce = reduce_1.reduce;
var repeat_1 = require("../internal/operators/repeat");
exports.repeat = repeat_1.repeat;
var repeatWhen_1 = require("../internal/operators/repeatWhen");
exports.repeatWhen = repeatWhen_1.repeatWhen;
var retry_1 = require("../internal/operators/retry");
exports.retry = retry_1.retry;
var retryWhen_1 = require("../internal/operators/retryWhen");
exports.retryWhen = retryWhen_1.retryWhen;
var refCount_1 = require("../internal/operators/refCount");
exports.refCount = refCount_1.refCount;
var sample_1 = require("../internal/operators/sample");
exports.sample = sample_1.sample;
var sampleTime_1 = require("../internal/operators/sampleTime");
exports.sampleTime = sampleTime_1.sampleTime;
var scan_1 = require("../internal/operators/scan");
exports.scan = scan_1.scan;
var sequenceEqual_1 = require("../internal/operators/sequenceEqual");
exports.sequenceEqual = sequenceEqual_1.sequenceEqual;
var share_1 = require("../internal/operators/share");
exports.share = share_1.share;
var shareReplay_1 = require("../internal/operators/shareReplay");
exports.shareReplay = shareReplay_1.shareReplay;
var single_1 = require("../internal/operators/single");
exports.single = single_1.single;
var skip_1 = require("../internal/operators/skip");
exports.skip = skip_1.skip;
var skipLast_1 = require("../internal/operators/skipLast");
exports.skipLast = skipLast_1.skipLast;
var skipUntil_1 = require("../internal/operators/skipUntil");
exports.skipUntil = skipUntil_1.skipUntil;
var skipWhile_1 = require("../internal/operators/skipWhile");
exports.skipWhile = skipWhile_1.skipWhile;
var startWith_1 = require("../internal/operators/startWith");
exports.startWith = startWith_1.startWith;
var subscribeOn_1 = require("../internal/operators/subscribeOn");
exports.subscribeOn = subscribeOn_1.subscribeOn;
var switchAll_1 = require("../internal/operators/switchAll");
exports.switchAll = switchAll_1.switchAll;
var switchMap_1 = require("../internal/operators/switchMap");
exports.switchMap = switchMap_1.switchMap;
var switchMapTo_1 = require("../internal/operators/switchMapTo");
exports.switchMapTo = switchMapTo_1.switchMapTo;
var take_1 = require("../internal/operators/take");
exports.take = take_1.take;
var takeLast_1 = require("../internal/operators/takeLast");
exports.takeLast = takeLast_1.takeLast;
var takeUntil_1 = require("../internal/operators/takeUntil");
exports.takeUntil = takeUntil_1.takeUntil;
var takeWhile_1 = require("../internal/operators/takeWhile");
exports.takeWhile = takeWhile_1.takeWhile;
var tap_1 = require("../internal/operators/tap");
exports.tap = tap_1.tap;
var throttle_1 = require("../internal/operators/throttle");
exports.throttle = throttle_1.throttle;
var throttleTime_1 = require("../internal/operators/throttleTime");
exports.throttleTime = throttleTime_1.throttleTime;
var throwIfEmpty_1 = require("../internal/operators/throwIfEmpty");
exports.throwIfEmpty = throwIfEmpty_1.throwIfEmpty;
var timeInterval_1 = require("../internal/operators/timeInterval");
exports.timeInterval = timeInterval_1.timeInterval;
var timeout_1 = require("../internal/operators/timeout");
exports.timeout = timeout_1.timeout;
var timeoutWith_1 = require("../internal/operators/timeoutWith");
exports.timeoutWith = timeoutWith_1.timeoutWith;
var timestamp_1 = require("../internal/operators/timestamp");
exports.timestamp = timestamp_1.timestamp;
var toArray_1 = require("../internal/operators/toArray");
exports.toArray = toArray_1.toArray;
var window_1 = require("../internal/operators/window");
exports.window = window_1.window;
var windowCount_1 = require("../internal/operators/windowCount");
exports.windowCount = windowCount_1.windowCount;
var windowTime_1 = require("../internal/operators/windowTime");
exports.windowTime = windowTime_1.windowTime;
var windowToggle_1 = require("../internal/operators/windowToggle");
exports.windowToggle = windowToggle_1.windowToggle;
var windowWhen_1 = require("../internal/operators/windowWhen");
exports.windowWhen = windowWhen_1.windowWhen;
var withLatestFrom_1 = require("../internal/operators/withLatestFrom");
exports.withLatestFrom = withLatestFrom_1.withLatestFrom;
var zip_1 = require("../internal/operators/zip");
exports.zip = zip_1.zip;
var zipAll_1 = require("../internal/operators/zipAll");
exports.zipAll = zipAll_1.zipAll;

},{"../internal/operators/audit":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/audit.js","../internal/operators/auditTime":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/auditTime.js","../internal/operators/buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/buffer.js","../internal/operators/bufferCount":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/bufferCount.js","../internal/operators/bufferTime":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/bufferTime.js","../internal/operators/bufferToggle":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/bufferToggle.js","../internal/operators/bufferWhen":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/bufferWhen.js","../internal/operators/catchError":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/catchError.js","../internal/operators/combineAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/combineAll.js","../internal/operators/combineLatest":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/combineLatest.js","../internal/operators/concat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/concat.js","../internal/operators/concatAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/concatAll.js","../internal/operators/concatMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/concatMap.js","../internal/operators/concatMapTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/concatMapTo.js","../internal/operators/count":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/count.js","../internal/operators/debounce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/debounce.js","../internal/operators/debounceTime":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/debounceTime.js","../internal/operators/defaultIfEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/defaultIfEmpty.js","../internal/operators/delay":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/delay.js","../internal/operators/delayWhen":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/delayWhen.js","../internal/operators/dematerialize":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/dematerialize.js","../internal/operators/distinct":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/distinct.js","../internal/operators/distinctUntilChanged":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/distinctUntilChanged.js","../internal/operators/distinctUntilKeyChanged":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/distinctUntilKeyChanged.js","../internal/operators/elementAt":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/elementAt.js","../internal/operators/endWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/endWith.js","../internal/operators/every":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/every.js","../internal/operators/exhaust":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/exhaust.js","../internal/operators/exhaustMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/exhaustMap.js","../internal/operators/expand":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/expand.js","../internal/operators/filter":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/filter.js","../internal/operators/finalize":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/finalize.js","../internal/operators/find":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/find.js","../internal/operators/findIndex":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/findIndex.js","../internal/operators/first":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/first.js","../internal/operators/groupBy":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/groupBy.js","../internal/operators/ignoreElements":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/ignoreElements.js","../internal/operators/isEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/isEmpty.js","../internal/operators/last":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/last.js","../internal/operators/map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/map.js","../internal/operators/mapTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mapTo.js","../internal/operators/materialize":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/materialize.js","../internal/operators/max":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/max.js","../internal/operators/merge":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/merge.js","../internal/operators/mergeAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeAll.js","../internal/operators/mergeMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeMap.js","../internal/operators/mergeMapTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeMapTo.js","../internal/operators/mergeScan":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/mergeScan.js","../internal/operators/min":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/min.js","../internal/operators/multicast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/multicast.js","../internal/operators/observeOn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/observeOn.js","../internal/operators/onErrorResumeNext":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/onErrorResumeNext.js","../internal/operators/pairwise":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/pairwise.js","../internal/operators/partition":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/partition.js","../internal/operators/pluck":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/pluck.js","../internal/operators/publish":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/publish.js","../internal/operators/publishBehavior":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/publishBehavior.js","../internal/operators/publishLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/publishLast.js","../internal/operators/publishReplay":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/publishReplay.js","../internal/operators/race":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/race.js","../internal/operators/reduce":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/reduce.js","../internal/operators/refCount":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/refCount.js","../internal/operators/repeat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/repeat.js","../internal/operators/repeatWhen":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/repeatWhen.js","../internal/operators/retry":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/retry.js","../internal/operators/retryWhen":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/retryWhen.js","../internal/operators/sample":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/sample.js","../internal/operators/sampleTime":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/sampleTime.js","../internal/operators/scan":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/scan.js","../internal/operators/sequenceEqual":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/sequenceEqual.js","../internal/operators/share":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/share.js","../internal/operators/shareReplay":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/shareReplay.js","../internal/operators/single":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/single.js","../internal/operators/skip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/skip.js","../internal/operators/skipLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/skipLast.js","../internal/operators/skipUntil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/skipUntil.js","../internal/operators/skipWhile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/skipWhile.js","../internal/operators/startWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/startWith.js","../internal/operators/subscribeOn":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/subscribeOn.js","../internal/operators/switchAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/switchAll.js","../internal/operators/switchMap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/switchMap.js","../internal/operators/switchMapTo":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/switchMapTo.js","../internal/operators/take":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/take.js","../internal/operators/takeLast":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/takeLast.js","../internal/operators/takeUntil":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/takeUntil.js","../internal/operators/takeWhile":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/takeWhile.js","../internal/operators/tap":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/tap.js","../internal/operators/throttle":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/throttle.js","../internal/operators/throttleTime":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/throttleTime.js","../internal/operators/throwIfEmpty":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/throwIfEmpty.js","../internal/operators/timeInterval":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/timeInterval.js","../internal/operators/timeout":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/timeout.js","../internal/operators/timeoutWith":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/timeoutWith.js","../internal/operators/timestamp":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/timestamp.js","../internal/operators/toArray":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/toArray.js","../internal/operators/window":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/window.js","../internal/operators/windowCount":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/windowCount.js","../internal/operators/windowTime":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/windowTime.js","../internal/operators/windowToggle":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/windowToggle.js","../internal/operators/windowWhen":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/windowWhen.js","../internal/operators/withLatestFrom":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/withLatestFrom.js","../internal/operators/zip":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/zip.js","../internal/operators/zipAll":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/rxjs/internal/operators/zipAll.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/safe-buffer/index.js":[function(require,module,exports){
/* eslint-disable node/no-deprecated-api */
var buffer = require('buffer')
var Buffer = buffer.Buffer

// alternative to using Object.keys for old browsers
function copyProps (src, dst) {
  for (var key in src) {
    dst[key] = src[key]
  }
}
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  module.exports = buffer
} else {
  // Copy properties from require('buffer')
  copyProps(buffer, exports)
  exports.Buffer = SafeBuffer
}

function SafeBuffer (arg, encodingOrOffset, length) {
  return Buffer(arg, encodingOrOffset, length)
}

// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)

SafeBuffer.from = function (arg, encodingOrOffset, length) {
  if (typeof arg === 'number') {
    throw new TypeError('Argument must not be a number')
  }
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.alloc = function (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  var buf = Buffer(size)
  if (fill !== undefined) {
    if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
  } else {
    buf.fill(0)
  }
  return buf
}

SafeBuffer.allocUnsafe = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return Buffer(size)
}

SafeBuffer.allocUnsafeSlow = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return buffer.SlowBuffer(size)
}

},{"buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/side-channel/index.js":[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');
var inspect = require('object-inspect');

var $TypeError = GetIntrinsic('%TypeError%');
var $WeakMap = GetIntrinsic('%WeakMap%', true);
var $Map = GetIntrinsic('%Map%', true);

var $weakMapGet = callBound('WeakMap.prototype.get', true);
var $weakMapSet = callBound('WeakMap.prototype.set', true);
var $weakMapHas = callBound('WeakMap.prototype.has', true);
var $mapGet = callBound('Map.prototype.get', true);
var $mapSet = callBound('Map.prototype.set', true);
var $mapHas = callBound('Map.prototype.has', true);

/*
 * This function traverses the list returning the node corresponding to the
 * given key.
 *
 * That node is also moved to the head of the list, so that if it's accessed
 * again we don't need to traverse the whole list. By doing so, all the recently
 * used nodes can be accessed relatively quickly.
 */
var listGetNode = function (list, key) { // eslint-disable-line consistent-return
	for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) {
		if (curr.key === key) {
			prev.next = curr.next;
			curr.next = list.next;
			list.next = curr; // eslint-disable-line no-param-reassign
			return curr;
		}
	}
};

var listGet = function (objects, key) {
	var node = listGetNode(objects, key);
	return node && node.value;
};
var listSet = function (objects, key, value) {
	var node = listGetNode(objects, key);
	if (node) {
		node.value = value;
	} else {
		// Prepend the new node to the beginning of the list
		objects.next = { // eslint-disable-line no-param-reassign
			key: key,
			next: objects.next,
			value: value
		};
	}
};
var listHas = function (objects, key) {
	return !!listGetNode(objects, key);
};

module.exports = function getSideChannel() {
	var $wm;
	var $m;
	var $o;
	var channel = {
		assert: function (key) {
			if (!channel.has(key)) {
				throw new $TypeError('Side channel does not contain ' + inspect(key));
			}
		},
		get: function (key) { // eslint-disable-line consistent-return
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if ($wm) {
					return $weakMapGet($wm, key);
				}
			} else if ($Map) {
				if ($m) {
					return $mapGet($m, key);
				}
			} else {
				if ($o) { // eslint-disable-line no-lonely-if
					return listGet($o, key);
				}
			}
		},
		has: function (key) {
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if ($wm) {
					return $weakMapHas($wm, key);
				}
			} else if ($Map) {
				if ($m) {
					return $mapHas($m, key);
				}
			} else {
				if ($o) { // eslint-disable-line no-lonely-if
					return listHas($o, key);
				}
			}
			return false;
		},
		set: function (key, value) {
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if (!$wm) {
					$wm = new $WeakMap();
				}
				$weakMapSet($wm, key, value);
			} else if ($Map) {
				if (!$m) {
					$m = new $Map();
				}
				$mapSet($m, key, value);
			} else {
				if (!$o) {
					/*
					 * Initialize the linked list as an empty node, so that we don't have
					 * to special-case handling of the first node: we can always refer to
					 * it as (previous node).next, instead of something like (list).head
					 */
					$o = { key: {}, next: null };
				}
				listSet($o, key, value);
			}
		}
	};
	return channel;
};

},{"call-bind/callBound":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/call-bind/callBound.js","get-intrinsic":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/get-intrinsic/index.js","object-inspect":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/object-inspect/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/array-set.js":[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var util = require('./util');
var has = Object.prototype.hasOwnProperty;
var hasNativeMap = typeof Map !== "undefined";

/**
 * A data structure which is a combination of an array and a set. Adding a new
 * member is O(1), testing for membership is O(1), and finding the index of an
 * element is O(1). Removing elements from the set is not supported. Only
 * strings are supported for membership.
 */
function ArraySet() {
  this._array = [];
  this._set = hasNativeMap ? new Map() : Object.create(null);
}

/**
 * Static method for creating ArraySet instances from an existing array.
 */
ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
  var set = new ArraySet();
  for (var i = 0, len = aArray.length; i < len; i++) {
    set.add(aArray[i], aAllowDuplicates);
  }
  return set;
};

/**
 * Return how many unique items are in this ArraySet. If duplicates have been
 * added, than those do not count towards the size.
 *
 * @returns Number
 */
ArraySet.prototype.size = function ArraySet_size() {
  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
};

/**
 * Add the given string to this set.
 *
 * @param String aStr
 */
ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
  var idx = this._array.length;
  if (!isDuplicate || aAllowDuplicates) {
    this._array.push(aStr);
  }
  if (!isDuplicate) {
    if (hasNativeMap) {
      this._set.set(aStr, idx);
    } else {
      this._set[sStr] = idx;
    }
  }
};

/**
 * Is the given string a member of this set?
 *
 * @param String aStr
 */
ArraySet.prototype.has = function ArraySet_has(aStr) {
  if (hasNativeMap) {
    return this._set.has(aStr);
  } else {
    var sStr = util.toSetString(aStr);
    return has.call(this._set, sStr);
  }
};

/**
 * What is the index of the given string in the array?
 *
 * @param String aStr
 */
ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
  if (hasNativeMap) {
    var idx = this._set.get(aStr);
    if (idx >= 0) {
        return idx;
    }
  } else {
    var sStr = util.toSetString(aStr);
    if (has.call(this._set, sStr)) {
      return this._set[sStr];
    }
  }

  throw new Error('"' + aStr + '" is not in the set.');
};

/**
 * What is the element at the given index?
 *
 * @param Number aIdx
 */
ArraySet.prototype.at = function ArraySet_at(aIdx) {
  if (aIdx >= 0 && aIdx < this._array.length) {
    return this._array[aIdx];
  }
  throw new Error('No element indexed by ' + aIdx);
};

/**
 * Returns the array representation of this set (which has the proper indices
 * indicated by indexOf). Note that this is a copy of the internal array used
 * for storing the members so that no one can mess with internal state.
 */
ArraySet.prototype.toArray = function ArraySet_toArray() {
  return this._array.slice();
};

exports.ArraySet = ArraySet;

},{"./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/base64-vlq.js":[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 *
 * Based on the Base 64 VLQ implementation in Closure Compiler:
 * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
 *
 * Copyright 2011 The Closure Compiler Authors. All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 *  * Neither the name of Google Inc. nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

var base64 = require('./base64');

// A single base 64 digit can contain 6 bits of data. For the base 64 variable
// length quantities we use in the source map spec, the first bit is the sign,
// the next four bits are the actual value, and the 6th bit is the
// continuation bit. The continuation bit tells us whether there are more
// digits in this value following this digit.
//
//   Continuation
//   |    Sign
//   |    |
//   V    V
//   101011

var VLQ_BASE_SHIFT = 5;

// binary: 100000
var VLQ_BASE = 1 << VLQ_BASE_SHIFT;

// binary: 011111
var VLQ_BASE_MASK = VLQ_BASE - 1;

// binary: 100000
var VLQ_CONTINUATION_BIT = VLQ_BASE;

/**
 * Converts from a two-complement value to a value where the sign bit is
 * placed in the least significant bit.  For example, as decimals:
 *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
 *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
 */
function toVLQSigned(aValue) {
  return aValue < 0
    ? ((-aValue) << 1) + 1
    : (aValue << 1) + 0;
}

/**
 * Converts to a two-complement value from a value where the sign bit is
 * placed in the least significant bit.  For example, as decimals:
 *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1
 *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2
 */
function fromVLQSigned(aValue) {
  var isNegative = (aValue & 1) === 1;
  var shifted = aValue >> 1;
  return isNegative
    ? -shifted
    : shifted;
}

/**
 * Returns the base 64 VLQ encoded value.
 */
exports.encode = function base64VLQ_encode(aValue) {
  var encoded = "";
  var digit;

  var vlq = toVLQSigned(aValue);

  do {
    digit = vlq & VLQ_BASE_MASK;
    vlq >>>= VLQ_BASE_SHIFT;
    if (vlq > 0) {
      // There are still more digits in this value, so we must make sure the
      // continuation bit is marked.
      digit |= VLQ_CONTINUATION_BIT;
    }
    encoded += base64.encode(digit);
  } while (vlq > 0);

  return encoded;
};

/**
 * Decodes the next base 64 VLQ value from the given string and returns the
 * value and the rest of the string via the out parameter.
 */
exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
  var strLen = aStr.length;
  var result = 0;
  var shift = 0;
  var continuation, digit;

  do {
    if (aIndex >= strLen) {
      throw new Error("Expected more digits in base 64 VLQ value.");
    }

    digit = base64.decode(aStr.charCodeAt(aIndex++));
    if (digit === -1) {
      throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
    }

    continuation = !!(digit & VLQ_CONTINUATION_BIT);
    digit &= VLQ_BASE_MASK;
    result = result + (digit << shift);
    shift += VLQ_BASE_SHIFT;
  } while (continuation);

  aOutParam.value = fromVLQSigned(result);
  aOutParam.rest = aIndex;
};

},{"./base64":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/base64.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/base64.js":[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');

/**
 * Encode an integer in the range of 0 to 63 to a single base 64 digit.
 */
exports.encode = function (number) {
  if (0 <= number && number < intToCharMap.length) {
    return intToCharMap[number];
  }
  throw new TypeError("Must be between 0 and 63: " + number);
};

/**
 * Decode a single base 64 character code digit to an integer. Returns -1 on
 * failure.
 */
exports.decode = function (charCode) {
  var bigA = 65;     // 'A'
  var bigZ = 90;     // 'Z'

  var littleA = 97;  // 'a'
  var littleZ = 122; // 'z'

  var zero = 48;     // '0'
  var nine = 57;     // '9'

  var plus = 43;     // '+'
  var slash = 47;    // '/'

  var littleOffset = 26;
  var numberOffset = 52;

  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
  if (bigA <= charCode && charCode <= bigZ) {
    return (charCode - bigA);
  }

  // 26 - 51: abcdefghijklmnopqrstuvwxyz
  if (littleA <= charCode && charCode <= littleZ) {
    return (charCode - littleA + littleOffset);
  }

  // 52 - 61: 0123456789
  if (zero <= charCode && charCode <= nine) {
    return (charCode - zero + numberOffset);
  }

  // 62: +
  if (charCode == plus) {
    return 62;
  }

  // 63: /
  if (charCode == slash) {
    return 63;
  }

  // Invalid base64 digit.
  return -1;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/binary-search.js":[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

exports.GREATEST_LOWER_BOUND = 1;
exports.LEAST_UPPER_BOUND = 2;

/**
 * Recursive implementation of binary search.
 *
 * @param aLow Indices here and lower do not contain the needle.
 * @param aHigh Indices here and higher do not contain the needle.
 * @param aNeedle The element being searched for.
 * @param aHaystack The non-empty array being searched.
 * @param aCompare Function which takes two elements and returns -1, 0, or 1.
 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 */
function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
  // This function terminates when one of the following is true:
  //
  //   1. We find the exact element we are looking for.
  //
  //   2. We did not find the exact element, but we can return the index of
  //      the next-closest element.
  //
  //   3. We did not find the exact element, and there is no next-closest
  //      element than the one we are searching for, so we return -1.
  var mid = Math.floor((aHigh - aLow) / 2) + aLow;
  var cmp = aCompare(aNeedle, aHaystack[mid], true);
  if (cmp === 0) {
    // Found the element we are looking for.
    return mid;
  }
  else if (cmp > 0) {
    // Our needle is greater than aHaystack[mid].
    if (aHigh - mid > 1) {
      // The element is in the upper half.
      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
    }

    // The exact needle element was not found in this haystack. Determine if
    // we are in termination case (3) or (2) and return the appropriate thing.
    if (aBias == exports.LEAST_UPPER_BOUND) {
      return aHigh < aHaystack.length ? aHigh : -1;
    } else {
      return mid;
    }
  }
  else {
    // Our needle is less than aHaystack[mid].
    if (mid - aLow > 1) {
      // The element is in the lower half.
      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
    }

    // we are in termination case (3) or (2) and return the appropriate thing.
    if (aBias == exports.LEAST_UPPER_BOUND) {
      return mid;
    } else {
      return aLow < 0 ? -1 : aLow;
    }
  }
}

/**
 * This is an implementation of binary search which will always try and return
 * the index of the closest element if there is no exact hit. This is because
 * mappings between original and generated line/col pairs are single points,
 * and there is an implicit region between each of them, so a miss just means
 * that you aren't on the very start of a region.
 *
 * @param aNeedle The element you are looking for.
 * @param aHaystack The array that is being searched.
 * @param aCompare A function which takes the needle and an element in the
 *     array and returns -1, 0, or 1 depending on whether the needle is less
 *     than, equal to, or greater than the element, respectively.
 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
 */
exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
  if (aHaystack.length === 0) {
    return -1;
  }

  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);
  if (index < 0) {
    return -1;
  }

  // We have found either the exact element, or the next-closest element than
  // the one we are searching for. However, there may be more than one such
  // element. Make sure we always return the smallest of these.
  while (index - 1 >= 0) {
    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
      break;
    }
    --index;
  }

  return index;
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/mapping-list.js":[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2014 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var util = require('./util');

/**
 * Determine whether mappingB is after mappingA with respect to generated
 * position.
 */
function generatedPositionAfter(mappingA, mappingB) {
  // Optimized for most common case
  var lineA = mappingA.generatedLine;
  var lineB = mappingB.generatedLine;
  var columnA = mappingA.generatedColumn;
  var columnB = mappingB.generatedColumn;
  return lineB > lineA || lineB == lineA && columnB >= columnA ||
         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
}

/**
 * A data structure to provide a sorted view of accumulated mappings in a
 * performance conscious manner. It trades a neglibable overhead in general
 * case for a large speedup in case of mappings being added in order.
 */
function MappingList() {
  this._array = [];
  this._sorted = true;
  // Serves as infimum
  this._last = {generatedLine: -1, generatedColumn: 0};
}

/**
 * Iterate through internal items. This method takes the same arguments that
 * `Array.prototype.forEach` takes.
 *
 * NOTE: The order of the mappings is NOT guaranteed.
 */
MappingList.prototype.unsortedForEach =
  function MappingList_forEach(aCallback, aThisArg) {
    this._array.forEach(aCallback, aThisArg);
  };

/**
 * Add the given source mapping.
 *
 * @param Object aMapping
 */
MappingList.prototype.add = function MappingList_add(aMapping) {
  if (generatedPositionAfter(this._last, aMapping)) {
    this._last = aMapping;
    this._array.push(aMapping);
  } else {
    this._sorted = false;
    this._array.push(aMapping);
  }
};

/**
 * Returns the flat, sorted array of mappings. The mappings are sorted by
 * generated position.
 *
 * WARNING: This method returns internal data without copying, for
 * performance. The return value must NOT be mutated, and should be treated as
 * an immutable borrow. If you want to take ownership, you must make your own
 * copy.
 */
MappingList.prototype.toArray = function MappingList_toArray() {
  if (!this._sorted) {
    this._array.sort(util.compareByGeneratedPositionsInflated);
    this._sorted = true;
  }
  return this._array;
};

exports.MappingList = MappingList;

},{"./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/quick-sort.js":[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

// It turns out that some (most?) JavaScript engines don't self-host
// `Array.prototype.sort`. This makes sense because C++ will likely remain
// faster than JS when doing raw CPU-intensive sorting. However, when using a
// custom comparator function, calling back and forth between the VM's C++ and
// JIT'd JS is rather slow *and* loses JIT type information, resulting in
// worse generated code for the comparator function than would be optimal. In
// fact, when sorting with a comparator, these costs outweigh the benefits of
// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
// a ~3500ms mean speed-up in `bench/bench.html`.

/**
 * Swap the elements indexed by `x` and `y` in the array `ary`.
 *
 * @param {Array} ary
 *        The array.
 * @param {Number} x
 *        The index of the first item.
 * @param {Number} y
 *        The index of the second item.
 */
function swap(ary, x, y) {
  var temp = ary[x];
  ary[x] = ary[y];
  ary[y] = temp;
}

/**
 * Returns a random integer within the range `low .. high` inclusive.
 *
 * @param {Number} low
 *        The lower bound on the range.
 * @param {Number} high
 *        The upper bound on the range.
 */
function randomIntInRange(low, high) {
  return Math.round(low + (Math.random() * (high - low)));
}

/**
 * The Quick Sort algorithm.
 *
 * @param {Array} ary
 *        An array to sort.
 * @param {function} comparator
 *        Function to use to compare two items.
 * @param {Number} p
 *        Start index of the array
 * @param {Number} r
 *        End index of the array
 */
function doQuickSort(ary, comparator, p, r) {
  // If our lower bound is less than our upper bound, we (1) partition the
  // array into two pieces and (2) recurse on each half. If it is not, this is
  // the empty array and our base case.

  if (p < r) {
    // (1) Partitioning.
    //
    // The partitioning chooses a pivot between `p` and `r` and moves all
    // elements that are less than or equal to the pivot to the before it, and
    // all the elements that are greater than it after it. The effect is that
    // once partition is done, the pivot is in the exact place it will be when
    // the array is put in sorted order, and it will not need to be moved
    // again. This runs in O(n) time.

    // Always choose a random pivot so that an input array which is reverse
    // sorted does not cause O(n^2) running time.
    var pivotIndex = randomIntInRange(p, r);
    var i = p - 1;

    swap(ary, pivotIndex, r);
    var pivot = ary[r];

    // Immediately after `j` is incremented in this loop, the following hold
    // true:
    //
    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.
    //
    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
    for (var j = p; j < r; j++) {
      if (comparator(ary[j], pivot) <= 0) {
        i += 1;
        swap(ary, i, j);
      }
    }

    swap(ary, i + 1, j);
    var q = i + 1;

    // (2) Recurse on each half.

    doQuickSort(ary, comparator, p, q - 1);
    doQuickSort(ary, comparator, q + 1, r);
  }
}

/**
 * Sort the given array in-place with the given comparator function.
 *
 * @param {Array} ary
 *        An array to sort.
 * @param {function} comparator
 *        Function to use to compare two items.
 */
exports.quickSort = function (ary, comparator) {
  doQuickSort(ary, comparator, 0, ary.length - 1);
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/source-map-consumer.js":[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var util = require('./util');
var binarySearch = require('./binary-search');
var ArraySet = require('./array-set').ArraySet;
var base64VLQ = require('./base64-vlq');
var quickSort = require('./quick-sort').quickSort;

function SourceMapConsumer(aSourceMap, aSourceMapURL) {
  var sourceMap = aSourceMap;
  if (typeof aSourceMap === 'string') {
    sourceMap = util.parseSourceMapInput(aSourceMap);
  }

  return sourceMap.sections != null
    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
}

SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
}

/**
 * The version of the source mapping spec that we are consuming.
 */
SourceMapConsumer.prototype._version = 3;

// `__generatedMappings` and `__originalMappings` are arrays that hold the
// parsed mapping coordinates from the source map's "mappings" attribute. They
// are lazily instantiated, accessed via the `_generatedMappings` and
// `_originalMappings` getters respectively, and we only parse the mappings
// and create these arrays once queried for a source location. We jump through
// these hoops because there can be many thousands of mappings, and parsing
// them is expensive, so we only want to do it if we must.
//
// Each object in the arrays is of the form:
//
//     {
//       generatedLine: The line number in the generated code,
//       generatedColumn: The column number in the generated code,
//       source: The path to the original source file that generated this
//               chunk of code,
//       originalLine: The line number in the original source that
//                     corresponds to this chunk of generated code,
//       originalColumn: The column number in the original source that
//                       corresponds to this chunk of generated code,
//       name: The name of the original symbol which generated this chunk of
//             code.
//     }
//
// All properties except for `generatedLine` and `generatedColumn` can be
// `null`.
//
// `_generatedMappings` is ordered by the generated positions.
//
// `_originalMappings` is ordered by the original positions.

SourceMapConsumer.prototype.__generatedMappings = null;
Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
  configurable: true,
  enumerable: true,
  get: function () {
    if (!this.__generatedMappings) {
      this._parseMappings(this._mappings, this.sourceRoot);
    }

    return this.__generatedMappings;
  }
});

SourceMapConsumer.prototype.__originalMappings = null;
Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
  configurable: true,
  enumerable: true,
  get: function () {
    if (!this.__originalMappings) {
      this._parseMappings(this._mappings, this.sourceRoot);
    }

    return this.__originalMappings;
  }
});

SourceMapConsumer.prototype._charIsMappingSeparator =
  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
    var c = aStr.charAt(index);
    return c === ";" || c === ",";
  };

/**
 * Parse the mappings in a string in to a data structure which we can easily
 * query (the ordered arrays in the `this.__generatedMappings` and
 * `this.__originalMappings` properties).
 */
SourceMapConsumer.prototype._parseMappings =
  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
    throw new Error("Subclasses must implement _parseMappings");
  };

SourceMapConsumer.GENERATED_ORDER = 1;
SourceMapConsumer.ORIGINAL_ORDER = 2;

SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
SourceMapConsumer.LEAST_UPPER_BOUND = 2;

/**
 * Iterate over each mapping between an original source/line/column and a
 * generated line/column in this source map.
 *
 * @param Function aCallback
 *        The function that is called with each mapping.
 * @param Object aContext
 *        Optional. If specified, this object will be the value of `this` every
 *        time that `aCallback` is called.
 * @param aOrder
 *        Either `SourceMapConsumer.GENERATED_ORDER` or
 *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
 *        iterate over the mappings sorted by the generated file's line/column
 *        order or the original's source/line/column order, respectively. Defaults to
 *        `SourceMapConsumer.GENERATED_ORDER`.
 */
SourceMapConsumer.prototype.eachMapping =
  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
    var context = aContext || null;
    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;

    var mappings;
    switch (order) {
    case SourceMapConsumer.GENERATED_ORDER:
      mappings = this._generatedMappings;
      break;
    case SourceMapConsumer.ORIGINAL_ORDER:
      mappings = this._originalMappings;
      break;
    default:
      throw new Error("Unknown order of iteration.");
    }

    var sourceRoot = this.sourceRoot;
    mappings.map(function (mapping) {
      var source = mapping.source === null ? null : this._sources.at(mapping.source);
      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
      return {
        source: source,
        generatedLine: mapping.generatedLine,
        generatedColumn: mapping.generatedColumn,
        originalLine: mapping.originalLine,
        originalColumn: mapping.originalColumn,
        name: mapping.name === null ? null : this._names.at(mapping.name)
      };
    }, this).forEach(aCallback, context);
  };

/**
 * Returns all generated line and column information for the original source,
 * line, and column provided. If no column is provided, returns all mappings
 * corresponding to a either the line we are searching for or the next
 * closest line that has any mappings. Otherwise, returns all mappings
 * corresponding to the given line and either the column we are searching for
 * or the next closest column that has any offsets.
 *
 * The only argument is an object with the following properties:
 *
 *   - source: The filename of the original source.
 *   - line: The line number in the original source.  The line number is 1-based.
 *   - column: Optional. the column number in the original source.
 *    The column number is 0-based.
 *
 * and an array of objects is returned, each with the following properties:
 *
 *   - line: The line number in the generated source, or null.  The
 *    line number is 1-based.
 *   - column: The column number in the generated source, or null.
 *    The column number is 0-based.
 */
SourceMapConsumer.prototype.allGeneratedPositionsFor =
  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
    var line = util.getArg(aArgs, 'line');

    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
    // returns the index of the closest mapping less than the needle. By
    // setting needle.originalColumn to 0, we thus find the last mapping for
    // the given line, provided such a mapping exists.
    var needle = {
      source: util.getArg(aArgs, 'source'),
      originalLine: line,
      originalColumn: util.getArg(aArgs, 'column', 0)
    };

    needle.source = this._findSourceIndex(needle.source);
    if (needle.source < 0) {
      return [];
    }

    var mappings = [];

    var index = this._findMapping(needle,
                                  this._originalMappings,
                                  "originalLine",
                                  "originalColumn",
                                  util.compareByOriginalPositions,
                                  binarySearch.LEAST_UPPER_BOUND);
    if (index >= 0) {
      var mapping = this._originalMappings[index];

      if (aArgs.column === undefined) {
        var originalLine = mapping.originalLine;

        // Iterate until either we run out of mappings, or we run into
        // a mapping for a different line than the one we found. Since
        // mappings are sorted, this is guaranteed to find all mappings for
        // the line we found.
        while (mapping && mapping.originalLine === originalLine) {
          mappings.push({
            line: util.getArg(mapping, 'generatedLine', null),
            column: util.getArg(mapping, 'generatedColumn', null),
            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
          });

          mapping = this._originalMappings[++index];
        }
      } else {
        var originalColumn = mapping.originalColumn;

        // Iterate until either we run out of mappings, or we run into
        // a mapping for a different line than the one we were searching for.
        // Since mappings are sorted, this is guaranteed to find all mappings for
        // the line we are searching for.
        while (mapping &&
               mapping.originalLine === line &&
               mapping.originalColumn == originalColumn) {
          mappings.push({
            line: util.getArg(mapping, 'generatedLine', null),
            column: util.getArg(mapping, 'generatedColumn', null),
            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
          });

          mapping = this._originalMappings[++index];
        }
      }
    }

    return mappings;
  };

exports.SourceMapConsumer = SourceMapConsumer;

/**
 * A BasicSourceMapConsumer instance represents a parsed source map which we can
 * query for information about the original file positions by giving it a file
 * position in the generated source.
 *
 * The first parameter is the raw source map (either as a JSON string, or
 * already parsed to an object). According to the spec, source maps have the
 * following attributes:
 *
 *   - version: Which version of the source map spec this map is following.
 *   - sources: An array of URLs to the original source files.
 *   - names: An array of identifiers which can be referrenced by individual mappings.
 *   - sourceRoot: Optional. The URL root from which all sources are relative.
 *   - sourcesContent: Optional. An array of contents of the original source files.
 *   - mappings: A string of base64 VLQs which contain the actual mappings.
 *   - file: Optional. The generated file this source map is associated with.
 *
 * Here is an example source map, taken from the source map spec[0]:
 *
 *     {
 *       version : 3,
 *       file: "out.js",
 *       sourceRoot : "",
 *       sources: ["foo.js", "bar.js"],
 *       names: ["src", "maps", "are", "fun"],
 *       mappings: "AA,AB;;ABCDE;"
 *     }
 *
 * The second parameter, if given, is a string whose value is the URL
 * at which the source map was found.  This URL is used to compute the
 * sources array.
 *
 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
 */
function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
  var sourceMap = aSourceMap;
  if (typeof aSourceMap === 'string') {
    sourceMap = util.parseSourceMapInput(aSourceMap);
  }

  var version = util.getArg(sourceMap, 'version');
  var sources = util.getArg(sourceMap, 'sources');
  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
  // requires the array) to play nice here.
  var names = util.getArg(sourceMap, 'names', []);
  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
  var mappings = util.getArg(sourceMap, 'mappings');
  var file = util.getArg(sourceMap, 'file', null);

  // Once again, Sass deviates from the spec and supplies the version as a
  // string rather than a number, so we use loose equality checking here.
  if (version != this._version) {
    throw new Error('Unsupported version: ' + version);
  }

  if (sourceRoot) {
    sourceRoot = util.normalize(sourceRoot);
  }

  sources = sources
    .map(String)
    // Some source maps produce relative source paths like "./foo.js" instead of
    // "foo.js".  Normalize these first so that future comparisons will succeed.
    // See bugzil.la/1090768.
    .map(util.normalize)
    // Always ensure that absolute sources are internally stored relative to
    // the source root, if the source root is absolute. Not doing this would
    // be particularly problematic when the source root is a prefix of the
    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
    .map(function (source) {
      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
        ? util.relative(sourceRoot, source)
        : source;
    });

  // Pass `true` below to allow duplicate names and sources. While source maps
  // are intended to be compressed and deduplicated, the TypeScript compiler
  // sometimes generates source maps with duplicates in them. See Github issue
  // #72 and bugzil.la/889492.
  this._names = ArraySet.fromArray(names.map(String), true);
  this._sources = ArraySet.fromArray(sources, true);

  this._absoluteSources = this._sources.toArray().map(function (s) {
    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
  });

  this.sourceRoot = sourceRoot;
  this.sourcesContent = sourcesContent;
  this._mappings = mappings;
  this._sourceMapURL = aSourceMapURL;
  this.file = file;
}

BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;

/**
 * Utility function to find the index of a source.  Returns -1 if not
 * found.
 */
BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
  var relativeSource = aSource;
  if (this.sourceRoot != null) {
    relativeSource = util.relative(this.sourceRoot, relativeSource);
  }

  if (this._sources.has(relativeSource)) {
    return this._sources.indexOf(relativeSource);
  }

  // Maybe aSource is an absolute URL as returned by |sources|.  In
  // this case we can't simply undo the transform.
  var i;
  for (i = 0; i < this._absoluteSources.length; ++i) {
    if (this._absoluteSources[i] == aSource) {
      return i;
    }
  }

  return -1;
};

/**
 * Create a BasicSourceMapConsumer from a SourceMapGenerator.
 *
 * @param SourceMapGenerator aSourceMap
 *        The source map that will be consumed.
 * @param String aSourceMapURL
 *        The URL at which the source map can be found (optional)
 * @returns BasicSourceMapConsumer
 */
BasicSourceMapConsumer.fromSourceMap =
  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
    var smc = Object.create(BasicSourceMapConsumer.prototype);

    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
    smc.sourceRoot = aSourceMap._sourceRoot;
    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
                                                            smc.sourceRoot);
    smc.file = aSourceMap._file;
    smc._sourceMapURL = aSourceMapURL;
    smc._absoluteSources = smc._sources.toArray().map(function (s) {
      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
    });

    // Because we are modifying the entries (by converting string sources and
    // names to indices into the sources and names ArraySets), we have to make
    // a copy of the entry or else bad things happen. Shared mutable state
    // strikes again! See github issue #191.

    var generatedMappings = aSourceMap._mappings.toArray().slice();
    var destGeneratedMappings = smc.__generatedMappings = [];
    var destOriginalMappings = smc.__originalMappings = [];

    for (var i = 0, length = generatedMappings.length; i < length; i++) {
      var srcMapping = generatedMappings[i];
      var destMapping = new Mapping;
      destMapping.generatedLine = srcMapping.generatedLine;
      destMapping.generatedColumn = srcMapping.generatedColumn;

      if (srcMapping.source) {
        destMapping.source = sources.indexOf(srcMapping.source);
        destMapping.originalLine = srcMapping.originalLine;
        destMapping.originalColumn = srcMapping.originalColumn;

        if (srcMapping.name) {
          destMapping.name = names.indexOf(srcMapping.name);
        }

        destOriginalMappings.push(destMapping);
      }

      destGeneratedMappings.push(destMapping);
    }

    quickSort(smc.__originalMappings, util.compareByOriginalPositions);

    return smc;
  };

/**
 * The version of the source mapping spec that we are consuming.
 */
BasicSourceMapConsumer.prototype._version = 3;

/**
 * The list of original sources.
 */
Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
  get: function () {
    return this._absoluteSources.slice();
  }
});

/**
 * Provide the JIT with a nice shape / hidden class.
 */
function Mapping() {
  this.generatedLine = 0;
  this.generatedColumn = 0;
  this.source = null;
  this.originalLine = null;
  this.originalColumn = null;
  this.name = null;
}

/**
 * Parse the mappings in a string in to a data structure which we can easily
 * query (the ordered arrays in the `this.__generatedMappings` and
 * `this.__originalMappings` properties).
 */
BasicSourceMapConsumer.prototype._parseMappings =
  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
    var generatedLine = 1;
    var previousGeneratedColumn = 0;
    var previousOriginalLine = 0;
    var previousOriginalColumn = 0;
    var previousSource = 0;
    var previousName = 0;
    var length = aStr.length;
    var index = 0;
    var cachedSegments = {};
    var temp = {};
    var originalMappings = [];
    var generatedMappings = [];
    var mapping, str, segment, end, value;

    while (index < length) {
      if (aStr.charAt(index) === ';') {
        generatedLine++;
        index++;
        previousGeneratedColumn = 0;
      }
      else if (aStr.charAt(index) === ',') {
        index++;
      }
      else {
        mapping = new Mapping();
        mapping.generatedLine = generatedLine;

        // Because each offset is encoded relative to the previous one,
        // many segments often have the same encoding. We can exploit this
        // fact by caching the parsed variable length fields of each segment,
        // allowing us to avoid a second parse if we encounter the same
        // segment again.
        for (end = index; end < length; end++) {
          if (this._charIsMappingSeparator(aStr, end)) {
            break;
          }
        }
        str = aStr.slice(index, end);

        segment = cachedSegments[str];
        if (segment) {
          index += str.length;
        } else {
          segment = [];
          while (index < end) {
            base64VLQ.decode(aStr, index, temp);
            value = temp.value;
            index = temp.rest;
            segment.push(value);
          }

          if (segment.length === 2) {
            throw new Error('Found a source, but no line and column');
          }

          if (segment.length === 3) {
            throw new Error('Found a source and line, but no column');
          }

          cachedSegments[str] = segment;
        }

        // Generated column.
        mapping.generatedColumn = previousGeneratedColumn + segment[0];
        previousGeneratedColumn = mapping.generatedColumn;

        if (segment.length > 1) {
          // Original source.
          mapping.source = previousSource + segment[1];
          previousSource += segment[1];

          // Original line.
          mapping.originalLine = previousOriginalLine + segment[2];
          previousOriginalLine = mapping.originalLine;
          // Lines are stored 0-based
          mapping.originalLine += 1;

          // Original column.
          mapping.originalColumn = previousOriginalColumn + segment[3];
          previousOriginalColumn = mapping.originalColumn;

          if (segment.length > 4) {
            // Original name.
            mapping.name = previousName + segment[4];
            previousName += segment[4];
          }
        }

        generatedMappings.push(mapping);
        if (typeof mapping.originalLine === 'number') {
          originalMappings.push(mapping);
        }
      }
    }

    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
    this.__generatedMappings = generatedMappings;

    quickSort(originalMappings, util.compareByOriginalPositions);
    this.__originalMappings = originalMappings;
  };

/**
 * Find the mapping that best matches the hypothetical "needle" mapping that
 * we are searching for in the given "haystack" of mappings.
 */
BasicSourceMapConsumer.prototype._findMapping =
  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
                                         aColumnName, aComparator, aBias) {
    // To return the position we are searching for, we must first find the
    // mapping for the given position and then return the opposite position it
    // points to. Because the mappings are sorted, we can use binary search to
    // find the best mapping.

    if (aNeedle[aLineName] <= 0) {
      throw new TypeError('Line must be greater than or equal to 1, got '
                          + aNeedle[aLineName]);
    }
    if (aNeedle[aColumnName] < 0) {
      throw new TypeError('Column must be greater than or equal to 0, got '
                          + aNeedle[aColumnName]);
    }

    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
  };

/**
 * Compute the last column for each generated mapping. The last column is
 * inclusive.
 */
BasicSourceMapConsumer.prototype.computeColumnSpans =
  function SourceMapConsumer_computeColumnSpans() {
    for (var index = 0; index < this._generatedMappings.length; ++index) {
      var mapping = this._generatedMappings[index];

      // Mappings do not contain a field for the last generated columnt. We
      // can come up with an optimistic estimate, however, by assuming that
      // mappings are contiguous (i.e. given two consecutive mappings, the
      // first mapping ends where the second one starts).
      if (index + 1 < this._generatedMappings.length) {
        var nextMapping = this._generatedMappings[index + 1];

        if (mapping.generatedLine === nextMapping.generatedLine) {
          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
          continue;
        }
      }

      // The last mapping for each line spans the entire line.
      mapping.lastGeneratedColumn = Infinity;
    }
  };

/**
 * Returns the original source, line, and column information for the generated
 * source's line and column positions provided. The only argument is an object
 * with the following properties:
 *
 *   - line: The line number in the generated source.  The line number
 *     is 1-based.
 *   - column: The column number in the generated source.  The column
 *     number is 0-based.
 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
 *
 * and an object is returned with the following properties:
 *
 *   - source: The original source file, or null.
 *   - line: The line number in the original source, or null.  The
 *     line number is 1-based.
 *   - column: The column number in the original source, or null.  The
 *     column number is 0-based.
 *   - name: The original identifier, or null.
 */
BasicSourceMapConsumer.prototype.originalPositionFor =
  function SourceMapConsumer_originalPositionFor(aArgs) {
    var needle = {
      generatedLine: util.getArg(aArgs, 'line'),
      generatedColumn: util.getArg(aArgs, 'column')
    };

    var index = this._findMapping(
      needle,
      this._generatedMappings,
      "generatedLine",
      "generatedColumn",
      util.compareByGeneratedPositionsDeflated,
      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
    );

    if (index >= 0) {
      var mapping = this._generatedMappings[index];

      if (mapping.generatedLine === needle.generatedLine) {
        var source = util.getArg(mapping, 'source', null);
        if (source !== null) {
          source = this._sources.at(source);
          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
        }
        var name = util.getArg(mapping, 'name', null);
        if (name !== null) {
          name = this._names.at(name);
        }
        return {
          source: source,
          line: util.getArg(mapping, 'originalLine', null),
          column: util.getArg(mapping, 'originalColumn', null),
          name: name
        };
      }
    }

    return {
      source: null,
      line: null,
      column: null,
      name: null
    };
  };

/**
 * Return true if we have the source content for every source in the source
 * map, false otherwise.
 */
BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
  function BasicSourceMapConsumer_hasContentsOfAllSources() {
    if (!this.sourcesContent) {
      return false;
    }
    return this.sourcesContent.length >= this._sources.size() &&
      !this.sourcesContent.some(function (sc) { return sc == null; });
  };

/**
 * Returns the original source content. The only argument is the url of the
 * original source file. Returns null if no original source content is
 * available.
 */
BasicSourceMapConsumer.prototype.sourceContentFor =
  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
    if (!this.sourcesContent) {
      return null;
    }

    var index = this._findSourceIndex(aSource);
    if (index >= 0) {
      return this.sourcesContent[index];
    }

    var relativeSource = aSource;
    if (this.sourceRoot != null) {
      relativeSource = util.relative(this.sourceRoot, relativeSource);
    }

    var url;
    if (this.sourceRoot != null
        && (url = util.urlParse(this.sourceRoot))) {
      // XXX: file:// URIs and absolute paths lead to unexpected behavior for
      // many users. We can help them out when they expect file:// URIs to
      // behave like it would if they were running a local HTTP server. See
      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
      var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
      if (url.scheme == "file"
          && this._sources.has(fileUriAbsPath)) {
        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
      }

      if ((!url.path || url.path == "/")
          && this._sources.has("/" + relativeSource)) {
        return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
      }
    }

    // This function is used recursively from
    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
    // don't want to throw if we can't find the source - we just want to
    // return null, so we provide a flag to exit gracefully.
    if (nullOnMissing) {
      return null;
    }
    else {
      throw new Error('"' + relativeSource + '" is not in the SourceMap.');
    }
  };

/**
 * Returns the generated line and column information for the original source,
 * line, and column positions provided. The only argument is an object with
 * the following properties:
 *
 *   - source: The filename of the original source.
 *   - line: The line number in the original source.  The line number
 *     is 1-based.
 *   - column: The column number in the original source.  The column
 *     number is 0-based.
 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
 *
 * and an object is returned with the following properties:
 *
 *   - line: The line number in the generated source, or null.  The
 *     line number is 1-based.
 *   - column: The column number in the generated source, or null.
 *     The column number is 0-based.
 */
BasicSourceMapConsumer.prototype.generatedPositionFor =
  function SourceMapConsumer_generatedPositionFor(aArgs) {
    var source = util.getArg(aArgs, 'source');
    source = this._findSourceIndex(source);
    if (source < 0) {
      return {
        line: null,
        column: null,
        lastColumn: null
      };
    }

    var needle = {
      source: source,
      originalLine: util.getArg(aArgs, 'line'),
      originalColumn: util.getArg(aArgs, 'column')
    };

    var index = this._findMapping(
      needle,
      this._originalMappings,
      "originalLine",
      "originalColumn",
      util.compareByOriginalPositions,
      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
    );

    if (index >= 0) {
      var mapping = this._originalMappings[index];

      if (mapping.source === needle.source) {
        return {
          line: util.getArg(mapping, 'generatedLine', null),
          column: util.getArg(mapping, 'generatedColumn', null),
          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
        };
      }
    }

    return {
      line: null,
      column: null,
      lastColumn: null
    };
  };

exports.BasicSourceMapConsumer = BasicSourceMapConsumer;

/**
 * An IndexedSourceMapConsumer instance represents a parsed source map which
 * we can query for information. It differs from BasicSourceMapConsumer in
 * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
 * input.
 *
 * The first parameter is a raw source map (either as a JSON string, or already
 * parsed to an object). According to the spec for indexed source maps, they
 * have the following attributes:
 *
 *   - version: Which version of the source map spec this map is following.
 *   - file: Optional. The generated file this source map is associated with.
 *   - sections: A list of section definitions.
 *
 * Each value under the "sections" field has two fields:
 *   - offset: The offset into the original specified at which this section
 *       begins to apply, defined as an object with a "line" and "column"
 *       field.
 *   - map: A source map definition. This source map could also be indexed,
 *       but doesn't have to be.
 *
 * Instead of the "map" field, it's also possible to have a "url" field
 * specifying a URL to retrieve a source map from, but that's currently
 * unsupported.
 *
 * Here's an example source map, taken from the source map spec[0], but
 * modified to omit a section which uses the "url" field.
 *
 *  {
 *    version : 3,
 *    file: "app.js",
 *    sections: [{
 *      offset: {line:100, column:10},
 *      map: {
 *        version : 3,
 *        file: "section.js",
 *        sources: ["foo.js", "bar.js"],
 *        names: ["src", "maps", "are", "fun"],
 *        mappings: "AAAA,E;;ABCDE;"
 *      }
 *    }],
 *  }
 *
 * The second parameter, if given, is a string whose value is the URL
 * at which the source map was found.  This URL is used to compute the
 * sources array.
 *
 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
 */
function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
  var sourceMap = aSourceMap;
  if (typeof aSourceMap === 'string') {
    sourceMap = util.parseSourceMapInput(aSourceMap);
  }

  var version = util.getArg(sourceMap, 'version');
  var sections = util.getArg(sourceMap, 'sections');

  if (version != this._version) {
    throw new Error('Unsupported version: ' + version);
  }

  this._sources = new ArraySet();
  this._names = new ArraySet();

  var lastOffset = {
    line: -1,
    column: 0
  };
  this._sections = sections.map(function (s) {
    if (s.url) {
      // The url field will require support for asynchronicity.
      // See https://github.com/mozilla/source-map/issues/16
      throw new Error('Support for url field in sections not implemented.');
    }
    var offset = util.getArg(s, 'offset');
    var offsetLine = util.getArg(offset, 'line');
    var offsetColumn = util.getArg(offset, 'column');

    if (offsetLine < lastOffset.line ||
        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
      throw new Error('Section offsets must be ordered and non-overlapping.');
    }
    lastOffset = offset;

    return {
      generatedOffset: {
        // The offset fields are 0-based, but we use 1-based indices when
        // encoding/decoding from VLQ.
        generatedLine: offsetLine + 1,
        generatedColumn: offsetColumn + 1
      },
      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
    }
  });
}

IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;

/**
 * The version of the source mapping spec that we are consuming.
 */
IndexedSourceMapConsumer.prototype._version = 3;

/**
 * The list of original sources.
 */
Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
  get: function () {
    var sources = [];
    for (var i = 0; i < this._sections.length; i++) {
      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
        sources.push(this._sections[i].consumer.sources[j]);
      }
    }
    return sources;
  }
});

/**
 * Returns the original source, line, and column information for the generated
 * source's line and column positions provided. The only argument is an object
 * with the following properties:
 *
 *   - line: The line number in the generated source.  The line number
 *     is 1-based.
 *   - column: The column number in the generated source.  The column
 *     number is 0-based.
 *
 * and an object is returned with the following properties:
 *
 *   - source: The original source file, or null.
 *   - line: The line number in the original source, or null.  The
 *     line number is 1-based.
 *   - column: The column number in the original source, or null.  The
 *     column number is 0-based.
 *   - name: The original identifier, or null.
 */
IndexedSourceMapConsumer.prototype.originalPositionFor =
  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
    var needle = {
      generatedLine: util.getArg(aArgs, 'line'),
      generatedColumn: util.getArg(aArgs, 'column')
    };

    // Find the section containing the generated position we're trying to map
    // to an original position.
    var sectionIndex = binarySearch.search(needle, this._sections,
      function(needle, section) {
        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
        if (cmp) {
          return cmp;
        }

        return (needle.generatedColumn -
                section.generatedOffset.generatedColumn);
      });
    var section = this._sections[sectionIndex];

    if (!section) {
      return {
        source: null,
        line: null,
        column: null,
        name: null
      };
    }

    return section.consumer.originalPositionFor({
      line: needle.generatedLine -
        (section.generatedOffset.generatedLine - 1),
      column: needle.generatedColumn -
        (section.generatedOffset.generatedLine === needle.generatedLine
         ? section.generatedOffset.generatedColumn - 1
         : 0),
      bias: aArgs.bias
    });
  };

/**
 * Return true if we have the source content for every source in the source
 * map, false otherwise.
 */
IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
  function IndexedSourceMapConsumer_hasContentsOfAllSources() {
    return this._sections.every(function (s) {
      return s.consumer.hasContentsOfAllSources();
    });
  };

/**
 * Returns the original source content. The only argument is the url of the
 * original source file. Returns null if no original source content is
 * available.
 */
IndexedSourceMapConsumer.prototype.sourceContentFor =
  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
    for (var i = 0; i < this._sections.length; i++) {
      var section = this._sections[i];

      var content = section.consumer.sourceContentFor(aSource, true);
      if (content) {
        return content;
      }
    }
    if (nullOnMissing) {
      return null;
    }
    else {
      throw new Error('"' + aSource + '" is not in the SourceMap.');
    }
  };

/**
 * Returns the generated line and column information for the original source,
 * line, and column positions provided. The only argument is an object with
 * the following properties:
 *
 *   - source: The filename of the original source.
 *   - line: The line number in the original source.  The line number
 *     is 1-based.
 *   - column: The column number in the original source.  The column
 *     number is 0-based.
 *
 * and an object is returned with the following properties:
 *
 *   - line: The line number in the generated source, or null.  The
 *     line number is 1-based. 
 *   - column: The column number in the generated source, or null.
 *     The column number is 0-based.
 */
IndexedSourceMapConsumer.prototype.generatedPositionFor =
  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
    for (var i = 0; i < this._sections.length; i++) {
      var section = this._sections[i];

      // Only consider this section if the requested source is in the list of
      // sources of the consumer.
      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
        continue;
      }
      var generatedPosition = section.consumer.generatedPositionFor(aArgs);
      if (generatedPosition) {
        var ret = {
          line: generatedPosition.line +
            (section.generatedOffset.generatedLine - 1),
          column: generatedPosition.column +
            (section.generatedOffset.generatedLine === generatedPosition.line
             ? section.generatedOffset.generatedColumn - 1
             : 0)
        };
        return ret;
      }
    }

    return {
      line: null,
      column: null
    };
  };

/**
 * Parse the mappings in a string in to a data structure which we can easily
 * query (the ordered arrays in the `this.__generatedMappings` and
 * `this.__originalMappings` properties).
 */
IndexedSourceMapConsumer.prototype._parseMappings =
  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
    this.__generatedMappings = [];
    this.__originalMappings = [];
    for (var i = 0; i < this._sections.length; i++) {
      var section = this._sections[i];
      var sectionMappings = section.consumer._generatedMappings;
      for (var j = 0; j < sectionMappings.length; j++) {
        var mapping = sectionMappings[j];

        var source = section.consumer._sources.at(mapping.source);
        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
        this._sources.add(source);
        source = this._sources.indexOf(source);

        var name = null;
        if (mapping.name) {
          name = section.consumer._names.at(mapping.name);
          this._names.add(name);
          name = this._names.indexOf(name);
        }

        // The mappings coming from the consumer for the section have
        // generated positions relative to the start of the section, so we
        // need to offset them to be relative to the start of the concatenated
        // generated file.
        var adjustedMapping = {
          source: source,
          generatedLine: mapping.generatedLine +
            (section.generatedOffset.generatedLine - 1),
          generatedColumn: mapping.generatedColumn +
            (section.generatedOffset.generatedLine === mapping.generatedLine
            ? section.generatedOffset.generatedColumn - 1
            : 0),
          originalLine: mapping.originalLine,
          originalColumn: mapping.originalColumn,
          name: name
        };

        this.__generatedMappings.push(adjustedMapping);
        if (typeof adjustedMapping.originalLine === 'number') {
          this.__originalMappings.push(adjustedMapping);
        }
      }
    }

    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
    quickSort(this.__originalMappings, util.compareByOriginalPositions);
  };

exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;

},{"./array-set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/array-set.js","./base64-vlq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/base64-vlq.js","./binary-search":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/binary-search.js","./quick-sort":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/quick-sort.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/source-map-generator.js":[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var base64VLQ = require('./base64-vlq');
var util = require('./util');
var ArraySet = require('./array-set').ArraySet;
var MappingList = require('./mapping-list').MappingList;

/**
 * An instance of the SourceMapGenerator represents a source map which is
 * being built incrementally. You may pass an object with the following
 * properties:
 *
 *   - file: The filename of the generated source.
 *   - sourceRoot: A root for all relative URLs in this source map.
 */
function SourceMapGenerator(aArgs) {
  if (!aArgs) {
    aArgs = {};
  }
  this._file = util.getArg(aArgs, 'file', null);
  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
  this._sources = new ArraySet();
  this._names = new ArraySet();
  this._mappings = new MappingList();
  this._sourcesContents = null;
}

SourceMapGenerator.prototype._version = 3;

/**
 * Creates a new SourceMapGenerator based on a SourceMapConsumer
 *
 * @param aSourceMapConsumer The SourceMap.
 */
SourceMapGenerator.fromSourceMap =
  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
    var sourceRoot = aSourceMapConsumer.sourceRoot;
    var generator = new SourceMapGenerator({
      file: aSourceMapConsumer.file,
      sourceRoot: sourceRoot
    });
    aSourceMapConsumer.eachMapping(function (mapping) {
      var newMapping = {
        generated: {
          line: mapping.generatedLine,
          column: mapping.generatedColumn
        }
      };

      if (mapping.source != null) {
        newMapping.source = mapping.source;
        if (sourceRoot != null) {
          newMapping.source = util.relative(sourceRoot, newMapping.source);
        }

        newMapping.original = {
          line: mapping.originalLine,
          column: mapping.originalColumn
        };

        if (mapping.name != null) {
          newMapping.name = mapping.name;
        }
      }

      generator.addMapping(newMapping);
    });
    aSourceMapConsumer.sources.forEach(function (sourceFile) {
      var sourceRelative = sourceFile;
      if (sourceRoot !== null) {
        sourceRelative = util.relative(sourceRoot, sourceFile);
      }

      if (!generator._sources.has(sourceRelative)) {
        generator._sources.add(sourceRelative);
      }

      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
      if (content != null) {
        generator.setSourceContent(sourceFile, content);
      }
    });
    return generator;
  };

/**
 * Add a single mapping from original source line and column to the generated
 * source's line and column for this source map being created. The mapping
 * object should have the following properties:
 *
 *   - generated: An object with the generated line and column positions.
 *   - original: An object with the original line and column positions.
 *   - source: The original source file (relative to the sourceRoot).
 *   - name: An optional original token name for this mapping.
 */
SourceMapGenerator.prototype.addMapping =
  function SourceMapGenerator_addMapping(aArgs) {
    var generated = util.getArg(aArgs, 'generated');
    var original = util.getArg(aArgs, 'original', null);
    var source = util.getArg(aArgs, 'source', null);
    var name = util.getArg(aArgs, 'name', null);

    if (!this._skipValidation) {
      this._validateMapping(generated, original, source, name);
    }

    if (source != null) {
      source = String(source);
      if (!this._sources.has(source)) {
        this._sources.add(source);
      }
    }

    if (name != null) {
      name = String(name);
      if (!this._names.has(name)) {
        this._names.add(name);
      }
    }

    this._mappings.add({
      generatedLine: generated.line,
      generatedColumn: generated.column,
      originalLine: original != null && original.line,
      originalColumn: original != null && original.column,
      source: source,
      name: name
    });
  };

/**
 * Set the source content for a source file.
 */
SourceMapGenerator.prototype.setSourceContent =
  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
    var source = aSourceFile;
    if (this._sourceRoot != null) {
      source = util.relative(this._sourceRoot, source);
    }

    if (aSourceContent != null) {
      // Add the source content to the _sourcesContents map.
      // Create a new _sourcesContents map if the property is null.
      if (!this._sourcesContents) {
        this._sourcesContents = Object.create(null);
      }
      this._sourcesContents[util.toSetString(source)] = aSourceContent;
    } else if (this._sourcesContents) {
      // Remove the source file from the _sourcesContents map.
      // If the _sourcesContents map is empty, set the property to null.
      delete this._sourcesContents[util.toSetString(source)];
      if (Object.keys(this._sourcesContents).length === 0) {
        this._sourcesContents = null;
      }
    }
  };

/**
 * Applies the mappings of a sub-source-map for a specific source file to the
 * source map being generated. Each mapping to the supplied source file is
 * rewritten using the supplied source map. Note: The resolution for the
 * resulting mappings is the minimium of this map and the supplied map.
 *
 * @param aSourceMapConsumer The source map to be applied.
 * @param aSourceFile Optional. The filename of the source file.
 *        If omitted, SourceMapConsumer's file property will be used.
 * @param aSourceMapPath Optional. The dirname of the path to the source map
 *        to be applied. If relative, it is relative to the SourceMapConsumer.
 *        This parameter is needed when the two source maps aren't in the same
 *        directory, and the source map to be applied contains relative source
 *        paths. If so, those relative source paths need to be rewritten
 *        relative to the SourceMapGenerator.
 */
SourceMapGenerator.prototype.applySourceMap =
  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
    var sourceFile = aSourceFile;
    // If aSourceFile is omitted, we will use the file property of the SourceMap
    if (aSourceFile == null) {
      if (aSourceMapConsumer.file == null) {
        throw new Error(
          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
          'or the source map\'s "file" property. Both were omitted.'
        );
      }
      sourceFile = aSourceMapConsumer.file;
    }
    var sourceRoot = this._sourceRoot;
    // Make "sourceFile" relative if an absolute Url is passed.
    if (sourceRoot != null) {
      sourceFile = util.relative(sourceRoot, sourceFile);
    }
    // Applying the SourceMap can add and remove items from the sources and
    // the names array.
    var newSources = new ArraySet();
    var newNames = new ArraySet();

    // Find mappings for the "sourceFile"
    this._mappings.unsortedForEach(function (mapping) {
      if (mapping.source === sourceFile && mapping.originalLine != null) {
        // Check if it can be mapped by the source map, then update the mapping.
        var original = aSourceMapConsumer.originalPositionFor({
          line: mapping.originalLine,
          column: mapping.originalColumn
        });
        if (original.source != null) {
          // Copy mapping
          mapping.source = original.source;
          if (aSourceMapPath != null) {
            mapping.source = util.join(aSourceMapPath, mapping.source)
          }
          if (sourceRoot != null) {
            mapping.source = util.relative(sourceRoot, mapping.source);
          }
          mapping.originalLine = original.line;
          mapping.originalColumn = original.column;
          if (original.name != null) {
            mapping.name = original.name;
          }
        }
      }

      var source = mapping.source;
      if (source != null && !newSources.has(source)) {
        newSources.add(source);
      }

      var name = mapping.name;
      if (name != null && !newNames.has(name)) {
        newNames.add(name);
      }

    }, this);
    this._sources = newSources;
    this._names = newNames;

    // Copy sourcesContents of applied map.
    aSourceMapConsumer.sources.forEach(function (sourceFile) {
      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
      if (content != null) {
        if (aSourceMapPath != null) {
          sourceFile = util.join(aSourceMapPath, sourceFile);
        }
        if (sourceRoot != null) {
          sourceFile = util.relative(sourceRoot, sourceFile);
        }
        this.setSourceContent(sourceFile, content);
      }
    }, this);
  };

/**
 * A mapping can have one of the three levels of data:
 *
 *   1. Just the generated position.
 *   2. The Generated position, original position, and original source.
 *   3. Generated and original position, original source, as well as a name
 *      token.
 *
 * To maintain consistency, we validate that any new mapping being added falls
 * in to one of these categories.
 */
SourceMapGenerator.prototype._validateMapping =
  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
                                              aName) {
    // When aOriginal is truthy but has empty values for .line and .column,
    // it is most likely a programmer error. In this case we throw a very
    // specific error message to try to guide them the right way.
    // For example: https://github.com/Polymer/polymer-bundler/pull/519
    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
        throw new Error(
            'original.line and original.column are not numbers -- you probably meant to omit ' +
            'the original mapping entirely and only map the generated position. If so, pass ' +
            'null for the original mapping instead of an object with empty or null values.'
        );
    }

    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
        && aGenerated.line > 0 && aGenerated.column >= 0
        && !aOriginal && !aSource && !aName) {
      // Case 1.
      return;
    }
    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
             && aOriginal && 'line' in aOriginal && 'column' in aOriginal
             && aGenerated.line > 0 && aGenerated.column >= 0
             && aOriginal.line > 0 && aOriginal.column >= 0
             && aSource) {
      // Cases 2 and 3.
      return;
    }
    else {
      throw new Error('Invalid mapping: ' + JSON.stringify({
        generated: aGenerated,
        source: aSource,
        original: aOriginal,
        name: aName
      }));
    }
  };

/**
 * Serialize the accumulated mappings in to the stream of base 64 VLQs
 * specified by the source map format.
 */
SourceMapGenerator.prototype._serializeMappings =
  function SourceMapGenerator_serializeMappings() {
    var previousGeneratedColumn = 0;
    var previousGeneratedLine = 1;
    var previousOriginalColumn = 0;
    var previousOriginalLine = 0;
    var previousName = 0;
    var previousSource = 0;
    var result = '';
    var next;
    var mapping;
    var nameIdx;
    var sourceIdx;

    var mappings = this._mappings.toArray();
    for (var i = 0, len = mappings.length; i < len; i++) {
      mapping = mappings[i];
      next = ''

      if (mapping.generatedLine !== previousGeneratedLine) {
        previousGeneratedColumn = 0;
        while (mapping.generatedLine !== previousGeneratedLine) {
          next += ';';
          previousGeneratedLine++;
        }
      }
      else {
        if (i > 0) {
          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
            continue;
          }
          next += ',';
        }
      }

      next += base64VLQ.encode(mapping.generatedColumn
                                 - previousGeneratedColumn);
      previousGeneratedColumn = mapping.generatedColumn;

      if (mapping.source != null) {
        sourceIdx = this._sources.indexOf(mapping.source);
        next += base64VLQ.encode(sourceIdx - previousSource);
        previousSource = sourceIdx;

        // lines are stored 0-based in SourceMap spec version 3
        next += base64VLQ.encode(mapping.originalLine - 1
                                   - previousOriginalLine);
        previousOriginalLine = mapping.originalLine - 1;

        next += base64VLQ.encode(mapping.originalColumn
                                   - previousOriginalColumn);
        previousOriginalColumn = mapping.originalColumn;

        if (mapping.name != null) {
          nameIdx = this._names.indexOf(mapping.name);
          next += base64VLQ.encode(nameIdx - previousName);
          previousName = nameIdx;
        }
      }

      result += next;
    }

    return result;
  };

SourceMapGenerator.prototype._generateSourcesContent =
  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
    return aSources.map(function (source) {
      if (!this._sourcesContents) {
        return null;
      }
      if (aSourceRoot != null) {
        source = util.relative(aSourceRoot, source);
      }
      var key = util.toSetString(source);
      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
        ? this._sourcesContents[key]
        : null;
    }, this);
  };

/**
 * Externalize the source map.
 */
SourceMapGenerator.prototype.toJSON =
  function SourceMapGenerator_toJSON() {
    var map = {
      version: this._version,
      sources: this._sources.toArray(),
      names: this._names.toArray(),
      mappings: this._serializeMappings()
    };
    if (this._file != null) {
      map.file = this._file;
    }
    if (this._sourceRoot != null) {
      map.sourceRoot = this._sourceRoot;
    }
    if (this._sourcesContents) {
      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
    }

    return map;
  };

/**
 * Render the source map being generated to a string.
 */
SourceMapGenerator.prototype.toString =
  function SourceMapGenerator_toString() {
    return JSON.stringify(this.toJSON());
  };

exports.SourceMapGenerator = SourceMapGenerator;

},{"./array-set":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/array-set.js","./base64-vlq":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/base64-vlq.js","./mapping-list":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/mapping-list.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/source-node.js":[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;
var util = require('./util');

// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
// operating systems these days (capturing the result).
var REGEX_NEWLINE = /(\r?\n)/;

// Newline character code for charCodeAt() comparisons
var NEWLINE_CODE = 10;

// Private symbol for identifying `SourceNode`s when multiple versions of
// the source-map library are loaded. This MUST NOT CHANGE across
// versions!
var isSourceNode = "$$$isSourceNode$$$";

/**
 * SourceNodes provide a way to abstract over interpolating/concatenating
 * snippets of generated JavaScript source code while maintaining the line and
 * column information associated with the original source code.
 *
 * @param aLine The original line number.
 * @param aColumn The original column number.
 * @param aSource The original source's filename.
 * @param aChunks Optional. An array of strings which are snippets of
 *        generated JS, or other SourceNodes.
 * @param aName The original identifier.
 */
function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
  this.children = [];
  this.sourceContents = {};
  this.line = aLine == null ? null : aLine;
  this.column = aColumn == null ? null : aColumn;
  this.source = aSource == null ? null : aSource;
  this.name = aName == null ? null : aName;
  this[isSourceNode] = true;
  if (aChunks != null) this.add(aChunks);
}

/**
 * Creates a SourceNode from generated code and a SourceMapConsumer.
 *
 * @param aGeneratedCode The generated code
 * @param aSourceMapConsumer The SourceMap for the generated code
 * @param aRelativePath Optional. The path that relative sources in the
 *        SourceMapConsumer should be relative to.
 */
SourceNode.fromStringWithSourceMap =
  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
    // The SourceNode we want to fill with the generated code
    // and the SourceMap
    var node = new SourceNode();

    // All even indices of this array are one line of the generated code,
    // while all odd indices are the newlines between two adjacent lines
    // (since `REGEX_NEWLINE` captures its match).
    // Processed fragments are accessed by calling `shiftNextLine`.
    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
    var remainingLinesIndex = 0;
    var shiftNextLine = function() {
      var lineContents = getNextLine();
      // The last line of a file might not have a newline.
      var newLine = getNextLine() || "";
      return lineContents + newLine;

      function getNextLine() {
        return remainingLinesIndex < remainingLines.length ?
            remainingLines[remainingLinesIndex++] : undefined;
      }
    };

    // We need to remember the position of "remainingLines"
    var lastGeneratedLine = 1, lastGeneratedColumn = 0;

    // The generate SourceNodes we need a code range.
    // To extract it current and last mapping is used.
    // Here we store the last mapping.
    var lastMapping = null;

    aSourceMapConsumer.eachMapping(function (mapping) {
      if (lastMapping !== null) {
        // We add the code from "lastMapping" to "mapping":
        // First check if there is a new line in between.
        if (lastGeneratedLine < mapping.generatedLine) {
          // Associate first line with "lastMapping"
          addMappingWithCode(lastMapping, shiftNextLine());
          lastGeneratedLine++;
          lastGeneratedColumn = 0;
          // The remaining code is added without mapping
        } else {
          // There is no new line in between.
          // Associate the code between "lastGeneratedColumn" and
          // "mapping.generatedColumn" with "lastMapping"
          var nextLine = remainingLines[remainingLinesIndex] || '';
          var code = nextLine.substr(0, mapping.generatedColumn -
                                        lastGeneratedColumn);
          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
                                              lastGeneratedColumn);
          lastGeneratedColumn = mapping.generatedColumn;
          addMappingWithCode(lastMapping, code);
          // No more remaining code, continue
          lastMapping = mapping;
          return;
        }
      }
      // We add the generated code until the first mapping
      // to the SourceNode without any mapping.
      // Each line is added as separate string.
      while (lastGeneratedLine < mapping.generatedLine) {
        node.add(shiftNextLine());
        lastGeneratedLine++;
      }
      if (lastGeneratedColumn < mapping.generatedColumn) {
        var nextLine = remainingLines[remainingLinesIndex] || '';
        node.add(nextLine.substr(0, mapping.generatedColumn));
        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
        lastGeneratedColumn = mapping.generatedColumn;
      }
      lastMapping = mapping;
    }, this);
    // We have processed all mappings.
    if (remainingLinesIndex < remainingLines.length) {
      if (lastMapping) {
        // Associate the remaining code in the current line with "lastMapping"
        addMappingWithCode(lastMapping, shiftNextLine());
      }
      // and add the remaining lines without any mapping
      node.add(remainingLines.splice(remainingLinesIndex).join(""));
    }

    // Copy sourcesContent into SourceNode
    aSourceMapConsumer.sources.forEach(function (sourceFile) {
      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
      if (content != null) {
        if (aRelativePath != null) {
          sourceFile = util.join(aRelativePath, sourceFile);
        }
        node.setSourceContent(sourceFile, content);
      }
    });

    return node;

    function addMappingWithCode(mapping, code) {
      if (mapping === null || mapping.source === undefined) {
        node.add(code);
      } else {
        var source = aRelativePath
          ? util.join(aRelativePath, mapping.source)
          : mapping.source;
        node.add(new SourceNode(mapping.originalLine,
                                mapping.originalColumn,
                                source,
                                code,
                                mapping.name));
      }
    }
  };

/**
 * Add a chunk of generated JS to this source node.
 *
 * @param aChunk A string snippet of generated JS code, another instance of
 *        SourceNode, or an array where each member is one of those things.
 */
SourceNode.prototype.add = function SourceNode_add(aChunk) {
  if (Array.isArray(aChunk)) {
    aChunk.forEach(function (chunk) {
      this.add(chunk);
    }, this);
  }
  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
    if (aChunk) {
      this.children.push(aChunk);
    }
  }
  else {
    throw new TypeError(
      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
    );
  }
  return this;
};

/**
 * Add a chunk of generated JS to the beginning of this source node.
 *
 * @param aChunk A string snippet of generated JS code, another instance of
 *        SourceNode, or an array where each member is one of those things.
 */
SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
  if (Array.isArray(aChunk)) {
    for (var i = aChunk.length-1; i >= 0; i--) {
      this.prepend(aChunk[i]);
    }
  }
  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
    this.children.unshift(aChunk);
  }
  else {
    throw new TypeError(
      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
    );
  }
  return this;
};

/**
 * Walk over the tree of JS snippets in this node and its children. The
 * walking function is called once for each snippet of JS and is passed that
 * snippet and the its original associated source's line/column location.
 *
 * @param aFn The traversal function.
 */
SourceNode.prototype.walk = function SourceNode_walk(aFn) {
  var chunk;
  for (var i = 0, len = this.children.length; i < len; i++) {
    chunk = this.children[i];
    if (chunk[isSourceNode]) {
      chunk.walk(aFn);
    }
    else {
      if (chunk !== '') {
        aFn(chunk, { source: this.source,
                     line: this.line,
                     column: this.column,
                     name: this.name });
      }
    }
  }
};

/**
 * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
 * each of `this.children`.
 *
 * @param aSep The separator.
 */
SourceNode.prototype.join = function SourceNode_join(aSep) {
  var newChildren;
  var i;
  var len = this.children.length;
  if (len > 0) {
    newChildren = [];
    for (i = 0; i < len-1; i++) {
      newChildren.push(this.children[i]);
      newChildren.push(aSep);
    }
    newChildren.push(this.children[i]);
    this.children = newChildren;
  }
  return this;
};

/**
 * Call String.prototype.replace on the very right-most source snippet. Useful
 * for trimming whitespace from the end of a source node, etc.
 *
 * @param aPattern The pattern to replace.
 * @param aReplacement The thing to replace the pattern with.
 */
SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
  var lastChild = this.children[this.children.length - 1];
  if (lastChild[isSourceNode]) {
    lastChild.replaceRight(aPattern, aReplacement);
  }
  else if (typeof lastChild === 'string') {
    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
  }
  else {
    this.children.push(''.replace(aPattern, aReplacement));
  }
  return this;
};

/**
 * Set the source content for a source file. This will be added to the SourceMapGenerator
 * in the sourcesContent field.
 *
 * @param aSourceFile The filename of the source file
 * @param aSourceContent The content of the source file
 */
SourceNode.prototype.setSourceContent =
  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
  };

/**
 * Walk over the tree of SourceNodes. The walking function is called for each
 * source file content and is passed the filename and source content.
 *
 * @param aFn The traversal function.
 */
SourceNode.prototype.walkSourceContents =
  function SourceNode_walkSourceContents(aFn) {
    for (var i = 0, len = this.children.length; i < len; i++) {
      if (this.children[i][isSourceNode]) {
        this.children[i].walkSourceContents(aFn);
      }
    }

    var sources = Object.keys(this.sourceContents);
    for (var i = 0, len = sources.length; i < len; i++) {
      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
    }
  };

/**
 * Return the string representation of this source node. Walks over the tree
 * and concatenates all the various snippets together to one string.
 */
SourceNode.prototype.toString = function SourceNode_toString() {
  var str = "";
  this.walk(function (chunk) {
    str += chunk;
  });
  return str;
};

/**
 * Returns the string representation of this source node along with a source
 * map.
 */
SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
  var generated = {
    code: "",
    line: 1,
    column: 0
  };
  var map = new SourceMapGenerator(aArgs);
  var sourceMappingActive = false;
  var lastOriginalSource = null;
  var lastOriginalLine = null;
  var lastOriginalColumn = null;
  var lastOriginalName = null;
  this.walk(function (chunk, original) {
    generated.code += chunk;
    if (original.source !== null
        && original.line !== null
        && original.column !== null) {
      if(lastOriginalSource !== original.source
         || lastOriginalLine !== original.line
         || lastOriginalColumn !== original.column
         || lastOriginalName !== original.name) {
        map.addMapping({
          source: original.source,
          original: {
            line: original.line,
            column: original.column
          },
          generated: {
            line: generated.line,
            column: generated.column
          },
          name: original.name
        });
      }
      lastOriginalSource = original.source;
      lastOriginalLine = original.line;
      lastOriginalColumn = original.column;
      lastOriginalName = original.name;
      sourceMappingActive = true;
    } else if (sourceMappingActive) {
      map.addMapping({
        generated: {
          line: generated.line,
          column: generated.column
        }
      });
      lastOriginalSource = null;
      sourceMappingActive = false;
    }
    for (var idx = 0, length = chunk.length; idx < length; idx++) {
      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
        generated.line++;
        generated.column = 0;
        // Mappings end at eol
        if (idx + 1 === length) {
          lastOriginalSource = null;
          sourceMappingActive = false;
        } else if (sourceMappingActive) {
          map.addMapping({
            source: original.source,
            original: {
              line: original.line,
              column: original.column
            },
            generated: {
              line: generated.line,
              column: generated.column
            },
            name: original.name
          });
        }
      } else {
        generated.column++;
      }
    }
  });
  this.walkSourceContents(function (sourceFile, sourceContent) {
    map.setSourceContent(sourceFile, sourceContent);
  });

  return { code: generated.code, map: map };
};

exports.SourceNode = SourceNode;

},{"./source-map-generator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/source-map-generator.js","./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/util.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/util.js":[function(require,module,exports){
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

/**
 * This is a helper function for getting values from parameter/options
 * objects.
 *
 * @param args The object we are extracting values from
 * @param name The name of the property we are getting.
 * @param defaultValue An optional value to return if the property is missing
 * from the object. If this is not specified and the property is missing, an
 * error will be thrown.
 */
function getArg(aArgs, aName, aDefaultValue) {
  if (aName in aArgs) {
    return aArgs[aName];
  } else if (arguments.length === 3) {
    return aDefaultValue;
  } else {
    throw new Error('"' + aName + '" is a required argument.');
  }
}
exports.getArg = getArg;

var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
var dataUrlRegexp = /^data:.+\,.+$/;

function urlParse(aUrl) {
  var match = aUrl.match(urlRegexp);
  if (!match) {
    return null;
  }
  return {
    scheme: match[1],
    auth: match[2],
    host: match[3],
    port: match[4],
    path: match[5]
  };
}
exports.urlParse = urlParse;

function urlGenerate(aParsedUrl) {
  var url = '';
  if (aParsedUrl.scheme) {
    url += aParsedUrl.scheme + ':';
  }
  url += '//';
  if (aParsedUrl.auth) {
    url += aParsedUrl.auth + '@';
  }
  if (aParsedUrl.host) {
    url += aParsedUrl.host;
  }
  if (aParsedUrl.port) {
    url += ":" + aParsedUrl.port
  }
  if (aParsedUrl.path) {
    url += aParsedUrl.path;
  }
  return url;
}
exports.urlGenerate = urlGenerate;

/**
 * Normalizes a path, or the path portion of a URL:
 *
 * - Replaces consecutive slashes with one slash.
 * - Removes unnecessary '.' parts.
 * - Removes unnecessary '<dir>/..' parts.
 *
 * Based on code in the Node.js 'path' core module.
 *
 * @param aPath The path or url to normalize.
 */
function normalize(aPath) {
  var path = aPath;
  var url = urlParse(aPath);
  if (url) {
    if (!url.path) {
      return aPath;
    }
    path = url.path;
  }
  var isAbsolute = exports.isAbsolute(path);

  var parts = path.split(/\/+/);
  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
    part = parts[i];
    if (part === '.') {
      parts.splice(i, 1);
    } else if (part === '..') {
      up++;
    } else if (up > 0) {
      if (part === '') {
        // The first part is blank if the path is absolute. Trying to go
        // above the root is a no-op. Therefore we can remove all '..' parts
        // directly after the root.
        parts.splice(i + 1, up);
        up = 0;
      } else {
        parts.splice(i, 2);
        up--;
      }
    }
  }
  path = parts.join('/');

  if (path === '') {
    path = isAbsolute ? '/' : '.';
  }

  if (url) {
    url.path = path;
    return urlGenerate(url);
  }
  return path;
}
exports.normalize = normalize;

/**
 * Joins two paths/URLs.
 *
 * @param aRoot The root path or URL.
 * @param aPath The path or URL to be joined with the root.
 *
 * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
 *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended
 *   first.
 * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
 *   is updated with the result and aRoot is returned. Otherwise the result
 *   is returned.
 *   - If aPath is absolute, the result is aPath.
 *   - Otherwise the two paths are joined with a slash.
 * - Joining for example 'http://' and 'www.example.com' is also supported.
 */
function join(aRoot, aPath) {
  if (aRoot === "") {
    aRoot = ".";
  }
  if (aPath === "") {
    aPath = ".";
  }
  var aPathUrl = urlParse(aPath);
  var aRootUrl = urlParse(aRoot);
  if (aRootUrl) {
    aRoot = aRootUrl.path || '/';
  }

  // `join(foo, '//www.example.org')`
  if (aPathUrl && !aPathUrl.scheme) {
    if (aRootUrl) {
      aPathUrl.scheme = aRootUrl.scheme;
    }
    return urlGenerate(aPathUrl);
  }

  if (aPathUrl || aPath.match(dataUrlRegexp)) {
    return aPath;
  }

  // `join('http://', 'www.example.com')`
  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
    aRootUrl.host = aPath;
    return urlGenerate(aRootUrl);
  }

  var joined = aPath.charAt(0) === '/'
    ? aPath
    : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);

  if (aRootUrl) {
    aRootUrl.path = joined;
    return urlGenerate(aRootUrl);
  }
  return joined;
}
exports.join = join;

exports.isAbsolute = function (aPath) {
  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
};

/**
 * Make a path relative to a URL or another path.
 *
 * @param aRoot The root path or URL.
 * @param aPath The path or URL to be made relative to aRoot.
 */
function relative(aRoot, aPath) {
  if (aRoot === "") {
    aRoot = ".";
  }

  aRoot = aRoot.replace(/\/$/, '');

  // It is possible for the path to be above the root. In this case, simply
  // checking whether the root is a prefix of the path won't work. Instead, we
  // need to remove components from the root one by one, until either we find
  // a prefix that fits, or we run out of components to remove.
  var level = 0;
  while (aPath.indexOf(aRoot + '/') !== 0) {
    var index = aRoot.lastIndexOf("/");
    if (index < 0) {
      return aPath;
    }

    // If the only part of the root that is left is the scheme (i.e. http://,
    // file:///, etc.), one or more slashes (/), or simply nothing at all, we
    // have exhausted all components, so the path is not relative to the root.
    aRoot = aRoot.slice(0, index);
    if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
      return aPath;
    }

    ++level;
  }

  // Make sure we add a "../" for each component we removed from the root.
  return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
}
exports.relative = relative;

var supportsNullProto = (function () {
  var obj = Object.create(null);
  return !('__proto__' in obj);
}());

function identity (s) {
  return s;
}

/**
 * Because behavior goes wacky when you set `__proto__` on objects, we
 * have to prefix all the strings in our set with an arbitrary character.
 *
 * See https://github.com/mozilla/source-map/pull/31 and
 * https://github.com/mozilla/source-map/issues/30
 *
 * @param String aStr
 */
function toSetString(aStr) {
  if (isProtoString(aStr)) {
    return '$' + aStr;
  }

  return aStr;
}
exports.toSetString = supportsNullProto ? identity : toSetString;

function fromSetString(aStr) {
  if (isProtoString(aStr)) {
    return aStr.slice(1);
  }

  return aStr;
}
exports.fromSetString = supportsNullProto ? identity : fromSetString;

function isProtoString(s) {
  if (!s) {
    return false;
  }

  var length = s.length;

  if (length < 9 /* "__proto__".length */) {
    return false;
  }

  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||
      s.charCodeAt(length - 2) !== 95  /* '_' */ ||
      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
      s.charCodeAt(length - 4) !== 116 /* 't' */ ||
      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
      s.charCodeAt(length - 8) !== 95  /* '_' */ ||
      s.charCodeAt(length - 9) !== 95  /* '_' */) {
    return false;
  }

  for (var i = length - 10; i >= 0; i--) {
    if (s.charCodeAt(i) !== 36 /* '$' */) {
      return false;
    }
  }

  return true;
}

/**
 * Comparator between two mappings where the original positions are compared.
 *
 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
 * mappings with the same original source/line/column, but different generated
 * line and column the same. Useful when searching for a mapping with a
 * stubbed out mapping.
 */
function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
  var cmp = strcmp(mappingA.source, mappingB.source);
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalLine - mappingB.originalLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalColumn - mappingB.originalColumn;
  if (cmp !== 0 || onlyCompareOriginal) {
    return cmp;
  }

  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.generatedLine - mappingB.generatedLine;
  if (cmp !== 0) {
    return cmp;
  }

  return strcmp(mappingA.name, mappingB.name);
}
exports.compareByOriginalPositions = compareByOriginalPositions;

/**
 * Comparator between two mappings with deflated source and name indices where
 * the generated positions are compared.
 *
 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
 * mappings with the same generated line and column, but different
 * source/name/original line and column the same. Useful when searching for a
 * mapping with a stubbed out mapping.
 */
function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
  var cmp = mappingA.generatedLine - mappingB.generatedLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  if (cmp !== 0 || onlyCompareGenerated) {
    return cmp;
  }

  cmp = strcmp(mappingA.source, mappingB.source);
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalLine - mappingB.originalLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalColumn - mappingB.originalColumn;
  if (cmp !== 0) {
    return cmp;
  }

  return strcmp(mappingA.name, mappingB.name);
}
exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;

function strcmp(aStr1, aStr2) {
  if (aStr1 === aStr2) {
    return 0;
  }

  if (aStr1 === null) {
    return 1; // aStr2 !== null
  }

  if (aStr2 === null) {
    return -1; // aStr1 !== null
  }

  if (aStr1 > aStr2) {
    return 1;
  }

  return -1;
}

/**
 * Comparator between two mappings with inflated source and name strings where
 * the generated positions are compared.
 */
function compareByGeneratedPositionsInflated(mappingA, mappingB) {
  var cmp = mappingA.generatedLine - mappingB.generatedLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = strcmp(mappingA.source, mappingB.source);
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalLine - mappingB.originalLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalColumn - mappingB.originalColumn;
  if (cmp !== 0) {
    return cmp;
  }

  return strcmp(mappingA.name, mappingB.name);
}
exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;

/**
 * Strip any JSON XSSI avoidance prefix from the string (as documented
 * in the source maps specification), and then parse the string as
 * JSON.
 */
function parseSourceMapInput(str) {
  return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
}
exports.parseSourceMapInput = parseSourceMapInput;

/**
 * Compute the URL of a source given the the source root, the source's
 * URL, and the source map's URL.
 */
function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
  sourceURL = sourceURL || '';

  if (sourceRoot) {
    // This follows what Chrome does.
    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
      sourceRoot += '/';
    }
    // The spec says:
    //   Line 4: An optional source root, useful for relocating source
    //   files on a server or removing repeated values in the
    //   “sources” entry.  This value is prepended to the individual
    //   entries in the “source” field.
    sourceURL = sourceRoot + sourceURL;
  }

  // Historically, SourceMapConsumer did not take the sourceMapURL as
  // a parameter.  This mode is still somewhat supported, which is why
  // this code block is conditional.  However, it's preferable to pass
  // the source map URL to SourceMapConsumer, so that this function
  // can implement the source URL resolution algorithm as outlined in
  // the spec.  This block is basically the equivalent of:
  //    new URL(sourceURL, sourceMapURL).toString()
  // ... except it avoids using URL, which wasn't available in the
  // older releases of node still supported by this library.
  //
  // The spec says:
  //   If the sources are not absolute URLs after prepending of the
  //   “sourceRoot”, the sources are resolved relative to the
  //   SourceMap (like resolving script src in a html document).
  if (sourceMapURL) {
    var parsed = urlParse(sourceMapURL);
    if (!parsed) {
      throw new Error("sourceMapURL could not be parsed");
    }
    if (parsed.path) {
      // Strip the last path component, but keep the "/".
      var index = parsed.path.lastIndexOf('/');
      if (index >= 0) {
        parsed.path = parsed.path.substring(0, index + 1);
      }
    }
    sourceURL = join(urlGenerate(parsed), sourceURL);
  }

  return normalize(sourceURL);
}
exports.computeSourceURL = computeSourceURL;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/source-map.js":[function(require,module,exports){
/*
 * Copyright 2009-2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE.txt or:
 * http://opensource.org/licenses/BSD-3-Clause
 */
exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;
exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;
exports.SourceNode = require('./lib/source-node').SourceNode;

},{"./lib/source-map-consumer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/source-map-consumer.js","./lib/source-map-generator":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/source-map-generator.js","./lib/source-node":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/lib/source-node.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval/index.js":[function(require,module,exports){
var unparse = require('escodegen').generate;

module.exports = function (ast, vars) {
    if (!vars) vars = {};
    var FAIL = {};
    
    var result = (function walk (node, scopeVars) {
        if (node.type === 'Literal') {
            return node.value;
        }
        else if (node.type === 'UnaryExpression'){
            var val = walk(node.argument)
            if (node.operator === '+') return +val
            if (node.operator === '-') return -val
            if (node.operator === '~') return ~val
            if (node.operator === '!') return !val
            return FAIL
        }
        else if (node.type === 'ArrayExpression') {
            var xs = [];
            for (var i = 0, l = node.elements.length; i < l; i++) {
                var x = walk(node.elements[i]);
                if (x === FAIL) return FAIL;
                xs.push(x);
            }
            return xs;
        }
        else if (node.type === 'ObjectExpression') {
            var obj = {};
            for (var i = 0; i < node.properties.length; i++) {
                var prop = node.properties[i];
                var value = prop.value === null
                    ? prop.value
                    : walk(prop.value)
                ;
                if (value === FAIL) return FAIL;
                obj[prop.key.value || prop.key.name] = value;
            }
            return obj;
        }
        else if (node.type === 'BinaryExpression' ||
                 node.type === 'LogicalExpression') {
            var l = walk(node.left);
            if (l === FAIL) return FAIL;
            var r = walk(node.right);
            if (r === FAIL) return FAIL;
            
            var op = node.operator;
            if (op === '==') return l == r;
            if (op === '===') return l === r;
            if (op === '!=') return l != r;
            if (op === '!==') return l !== r;
            if (op === '+') return l + r;
            if (op === '-') return l - r;
            if (op === '*') return l * r;
            if (op === '/') return l / r;
            if (op === '%') return l % r;
            if (op === '<') return l < r;
            if (op === '<=') return l <= r;
            if (op === '>') return l > r;
            if (op === '>=') return l >= r;
            if (op === '|') return l | r;
            if (op === '&') return l & r;
            if (op === '^') return l ^ r;
            if (op === '&&') return l && r;
            if (op === '||') return l || r;
            
            return FAIL;
        }
        else if (node.type === 'Identifier') {
            if ({}.hasOwnProperty.call(vars, node.name)) {
                return vars[node.name];
            }
            else return FAIL;
        }
        else if (node.type === 'ThisExpression') {
            if ({}.hasOwnProperty.call(vars, 'this')) {
                return vars['this'];
            }
            else return FAIL;
        }
        else if (node.type === 'CallExpression') {
            var callee = walk(node.callee);
            if (callee === FAIL) return FAIL;
            if (typeof callee !== 'function') return FAIL;
            
            var ctx = node.callee.object ? walk(node.callee.object) : FAIL;
            if (ctx === FAIL) ctx = null;

            var args = [];
            for (var i = 0, l = node.arguments.length; i < l; i++) {
                var x = walk(node.arguments[i]);
                if (x === FAIL) return FAIL;
                args.push(x);
            }
            return callee.apply(ctx, args);
        }
        else if (node.type === 'MemberExpression') {
            var obj = walk(node.object);
            // do not allow access to methods on Function 
            if((obj === FAIL) || (typeof obj == 'function')){
                return FAIL;
            }
            if (node.property.type === 'Identifier') {
                return obj[node.property.name];
            }
            var prop = walk(node.property);
            if (prop === FAIL) return FAIL;
            return obj[prop];
        }
        else if (node.type === 'ConditionalExpression') {
            var val = walk(node.test)
            if (val === FAIL) return FAIL;
            return val ? walk(node.consequent) : walk(node.alternate)
        }
        else if (node.type === 'ExpressionStatement') {
            var val = walk(node.expression)
            if (val === FAIL) return FAIL;
            return val;
        }
        else if (node.type === 'ReturnStatement') {
            return walk(node.argument)
        }
        else if (node.type === 'FunctionExpression') {
            
            var bodies = node.body.body;
            
            // Create a "scope" for our arguments
            var oldVars = {};
            Object.keys(vars).forEach(function(element){
                oldVars[element] = vars[element];
            })

            for(var i=0; i<node.params.length; i++){
                var key = node.params[i];
                if(key.type == 'Identifier'){
                  vars[key.name] = null;
                }
                else return FAIL;
            }
            for(var i in bodies){
                if(walk(bodies[i]) === FAIL){
                    return FAIL;
                }
            }
            // restore the vars and scope after we walk
            vars = oldVars;
            
            var keys = Object.keys(vars);
            var vals = keys.map(function(key) {
                return vars[key];
            });
            return Function(keys.join(', '), 'return ' + unparse(node)).apply(null, vals);
        }
        else if (node.type === 'TemplateLiteral') {
            var str = '';
            for (var i = 0; i < node.expressions.length; i++) {
                str += walk(node.quasis[i]);
                str += walk(node.expressions[i]);
            }
            str += walk(node.quasis[i]);
            return str;
        }
        else if (node.type === 'TaggedTemplateExpression') {
            var tag = walk(node.tag);
            var quasi = node.quasi;
            var strings = quasi.quasis.map(walk);
            var values = quasi.expressions.map(walk);
            return tag.apply(null, [strings].concat(values));
        }
        else if (node.type === 'TemplateElement') {
            return node.value.cooked;
        }
        else return FAIL;
    })(ast);
    
    return result === FAIL ? undefined : result;
};

},{"escodegen":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval/node_modules/escodegen/escodegen.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval/node_modules/escodegen/escodegen.js":[function(require,module,exports){
(function (global){(function (){
/*
  Copyright (C) 2012-2014 Yusuke Suzuki <utatane.tea@gmail.com>
  Copyright (C) 2015 Ingvar Stepanyan <me@rreverser.com>
  Copyright (C) 2014 Ivan Nikulin <ifaaan@gmail.com>
  Copyright (C) 2012-2013 Michael Ficarra <escodegen.copyright@michael.ficarra.me>
  Copyright (C) 2012-2013 Mathias Bynens <mathias@qiwi.be>
  Copyright (C) 2013 Irakli Gozalishvili <rfobic@gmail.com>
  Copyright (C) 2012 Robert Gust-Bardon <donate@robert.gust-bardon.org>
  Copyright (C) 2012 John Freeman <jfreeman08@gmail.com>
  Copyright (C) 2011-2012 Ariya Hidayat <ariya.hidayat@gmail.com>
  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>
  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*global exports:true, require:true, global:true*/
(function () {
    'use strict';

    var Syntax,
        Precedence,
        BinaryPrecedence,
        SourceNode,
        estraverse,
        esutils,
        base,
        indent,
        json,
        renumber,
        hexadecimal,
        quotes,
        escapeless,
        newline,
        space,
        parentheses,
        semicolons,
        safeConcatenation,
        directive,
        extra,
        parse,
        sourceMap,
        sourceCode,
        preserveBlankLines,
        FORMAT_MINIFY,
        FORMAT_DEFAULTS;

    estraverse = require('estraverse');
    esutils = require('esutils');

    Syntax = estraverse.Syntax;

    // Generation is done by generateExpression.
    function isExpression(node) {
        return CodeGenerator.Expression.hasOwnProperty(node.type);
    }

    // Generation is done by generateStatement.
    function isStatement(node) {
        return CodeGenerator.Statement.hasOwnProperty(node.type);
    }

    Precedence = {
        Sequence: 0,
        Yield: 1,
        Assignment: 1,
        Conditional: 2,
        ArrowFunction: 2,
        LogicalOR: 3,
        LogicalAND: 4,
        BitwiseOR: 5,
        BitwiseXOR: 6,
        BitwiseAND: 7,
        Equality: 8,
        Relational: 9,
        BitwiseSHIFT: 10,
        Additive: 11,
        Multiplicative: 12,
        Exponentiation: 13,
        Await: 14,
        Unary: 14,
        Postfix: 15,
        Call: 16,
        New: 17,
        TaggedTemplate: 18,
        Member: 19,
        Primary: 20
    };

    BinaryPrecedence = {
        '||': Precedence.LogicalOR,
        '&&': Precedence.LogicalAND,
        '|': Precedence.BitwiseOR,
        '^': Precedence.BitwiseXOR,
        '&': Precedence.BitwiseAND,
        '==': Precedence.Equality,
        '!=': Precedence.Equality,
        '===': Precedence.Equality,
        '!==': Precedence.Equality,
        'is': Precedence.Equality,
        'isnt': Precedence.Equality,
        '<': Precedence.Relational,
        '>': Precedence.Relational,
        '<=': Precedence.Relational,
        '>=': Precedence.Relational,
        'in': Precedence.Relational,
        'instanceof': Precedence.Relational,
        '<<': Precedence.BitwiseSHIFT,
        '>>': Precedence.BitwiseSHIFT,
        '>>>': Precedence.BitwiseSHIFT,
        '+': Precedence.Additive,
        '-': Precedence.Additive,
        '*': Precedence.Multiplicative,
        '%': Precedence.Multiplicative,
        '/': Precedence.Multiplicative,
        '**': Precedence.Exponentiation
    };

    //Flags
    var F_ALLOW_IN = 1,
        F_ALLOW_CALL = 1 << 1,
        F_ALLOW_UNPARATH_NEW = 1 << 2,
        F_FUNC_BODY = 1 << 3,
        F_DIRECTIVE_CTX = 1 << 4,
        F_SEMICOLON_OPT = 1 << 5;

    //Expression flag sets
    //NOTE: Flag order:
    // F_ALLOW_IN
    // F_ALLOW_CALL
    // F_ALLOW_UNPARATH_NEW
    var E_FTT = F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
        E_TTF = F_ALLOW_IN | F_ALLOW_CALL,
        E_TTT = F_ALLOW_IN | F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
        E_TFF = F_ALLOW_IN,
        E_FFT = F_ALLOW_UNPARATH_NEW,
        E_TFT = F_ALLOW_IN | F_ALLOW_UNPARATH_NEW;

    //Statement flag sets
    //NOTE: Flag order:
    // F_ALLOW_IN
    // F_FUNC_BODY
    // F_DIRECTIVE_CTX
    // F_SEMICOLON_OPT
    var S_TFFF = F_ALLOW_IN,
        S_TFFT = F_ALLOW_IN | F_SEMICOLON_OPT,
        S_FFFF = 0x00,
        S_TFTF = F_ALLOW_IN | F_DIRECTIVE_CTX,
        S_TTFF = F_ALLOW_IN | F_FUNC_BODY;

    function getDefaultOptions() {
        // default options
        return {
            indent: null,
            base: null,
            parse: null,
            comment: false,
            format: {
                indent: {
                    style: '    ',
                    base: 0,
                    adjustMultilineComment: false
                },
                newline: '\n',
                space: ' ',
                json: false,
                renumber: false,
                hexadecimal: false,
                quotes: 'single',
                escapeless: false,
                compact: false,
                parentheses: true,
                semicolons: true,
                safeConcatenation: false,
                preserveBlankLines: false
            },
            moz: {
                comprehensionExpressionStartsWithAssignment: false,
                starlessGenerator: false
            },
            sourceMap: null,
            sourceMapRoot: null,
            sourceMapWithCode: false,
            directive: false,
            raw: true,
            verbatim: null,
            sourceCode: null
        };
    }

    function stringRepeat(str, num) {
        var result = '';

        for (num |= 0; num > 0; num >>>= 1, str += str) {
            if (num & 1) {
                result += str;
            }
        }

        return result;
    }

    function hasLineTerminator(str) {
        return (/[\r\n]/g).test(str);
    }

    function endsWithLineTerminator(str) {
        var len = str.length;
        return len && esutils.code.isLineTerminator(str.charCodeAt(len - 1));
    }

    function merge(target, override) {
        var key;
        for (key in override) {
            if (override.hasOwnProperty(key)) {
                target[key] = override[key];
            }
        }
        return target;
    }

    function updateDeeply(target, override) {
        var key, val;

        function isHashObject(target) {
            return typeof target === 'object' && target instanceof Object && !(target instanceof RegExp);
        }

        for (key in override) {
            if (override.hasOwnProperty(key)) {
                val = override[key];
                if (isHashObject(val)) {
                    if (isHashObject(target[key])) {
                        updateDeeply(target[key], val);
                    } else {
                        target[key] = updateDeeply({}, val);
                    }
                } else {
                    target[key] = val;
                }
            }
        }
        return target;
    }

    function generateNumber(value) {
        var result, point, temp, exponent, pos;

        if (value !== value) {
            throw new Error('Numeric literal whose value is NaN');
        }
        if (value < 0 || (value === 0 && 1 / value < 0)) {
            throw new Error('Numeric literal whose value is negative');
        }

        if (value === 1 / 0) {
            return json ? 'null' : renumber ? '1e400' : '1e+400';
        }

        result = '' + value;
        if (!renumber || result.length < 3) {
            return result;
        }

        point = result.indexOf('.');
        if (!json && result.charCodeAt(0) === 0x30  /* 0 */ && point === 1) {
            point = 0;
            result = result.slice(1);
        }
        temp = result;
        result = result.replace('e+', 'e');
        exponent = 0;
        if ((pos = temp.indexOf('e')) > 0) {
            exponent = +temp.slice(pos + 1);
            temp = temp.slice(0, pos);
        }
        if (point >= 0) {
            exponent -= temp.length - point - 1;
            temp = +(temp.slice(0, point) + temp.slice(point + 1)) + '';
        }
        pos = 0;
        while (temp.charCodeAt(temp.length + pos - 1) === 0x30  /* 0 */) {
            --pos;
        }
        if (pos !== 0) {
            exponent -= pos;
            temp = temp.slice(0, pos);
        }
        if (exponent !== 0) {
            temp += 'e' + exponent;
        }
        if ((temp.length < result.length ||
                    (hexadecimal && value > 1e12 && Math.floor(value) === value && (temp = '0x' + value.toString(16)).length < result.length)) &&
                +temp === value) {
            result = temp;
        }

        return result;
    }

    // Generate valid RegExp expression.
    // This function is based on https://github.com/Constellation/iv Engine

    function escapeRegExpCharacter(ch, previousIsBackslash) {
        // not handling '\' and handling \u2028 or \u2029 to unicode escape sequence
        if ((ch & ~1) === 0x2028) {
            return (previousIsBackslash ? 'u' : '\\u') + ((ch === 0x2028) ? '2028' : '2029');
        } else if (ch === 10 || ch === 13) {  // \n, \r
            return (previousIsBackslash ? '' : '\\') + ((ch === 10) ? 'n' : 'r');
        }
        return String.fromCharCode(ch);
    }

    function generateRegExp(reg) {
        var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash;

        result = reg.toString();

        if (reg.source) {
            // extract flag from toString result
            match = result.match(/\/([^/]*)$/);
            if (!match) {
                return result;
            }

            flags = match[1];
            result = '';

            characterInBrack = false;
            previousIsBackslash = false;
            for (i = 0, iz = reg.source.length; i < iz; ++i) {
                ch = reg.source.charCodeAt(i);

                if (!previousIsBackslash) {
                    if (characterInBrack) {
                        if (ch === 93) {  // ]
                            characterInBrack = false;
                        }
                    } else {
                        if (ch === 47) {  // /
                            result += '\\';
                        } else if (ch === 91) {  // [
                            characterInBrack = true;
                        }
                    }
                    result += escapeRegExpCharacter(ch, previousIsBackslash);
                    previousIsBackslash = ch === 92;  // \
                } else {
                    // if new RegExp("\\\n') is provided, create /\n/
                    result += escapeRegExpCharacter(ch, previousIsBackslash);
                    // prevent like /\\[/]/
                    previousIsBackslash = false;
                }
            }

            return '/' + result + '/' + flags;
        }

        return result;
    }

    function escapeAllowedCharacter(code, next) {
        var hex;

        if (code === 0x08  /* \b */) {
            return '\\b';
        }

        if (code === 0x0C  /* \f */) {
            return '\\f';
        }

        if (code === 0x09  /* \t */) {
            return '\\t';
        }

        hex = code.toString(16).toUpperCase();
        if (json || code > 0xFF) {
            return '\\u' + '0000'.slice(hex.length) + hex;
        } else if (code === 0x0000 && !esutils.code.isDecimalDigit(next)) {
            return '\\0';
        } else if (code === 0x000B  /* \v */) { // '\v'
            return '\\x0B';
        } else {
            return '\\x' + '00'.slice(hex.length) + hex;
        }
    }

    function escapeDisallowedCharacter(code) {
        if (code === 0x5C  /* \ */) {
            return '\\\\';
        }

        if (code === 0x0A  /* \n */) {
            return '\\n';
        }

        if (code === 0x0D  /* \r */) {
            return '\\r';
        }

        if (code === 0x2028) {
            return '\\u2028';
        }

        if (code === 0x2029) {
            return '\\u2029';
        }

        throw new Error('Incorrectly classified character');
    }

    function escapeDirective(str) {
        var i, iz, code, quote;

        quote = quotes === 'double' ? '"' : '\'';
        for (i = 0, iz = str.length; i < iz; ++i) {
            code = str.charCodeAt(i);
            if (code === 0x27  /* ' */) {
                quote = '"';
                break;
            } else if (code === 0x22  /* " */) {
                quote = '\'';
                break;
            } else if (code === 0x5C  /* \ */) {
                ++i;
            }
        }

        return quote + str + quote;
    }

    function escapeString(str) {
        var result = '', i, len, code, singleQuotes = 0, doubleQuotes = 0, single, quote;

        for (i = 0, len = str.length; i < len; ++i) {
            code = str.charCodeAt(i);
            if (code === 0x27  /* ' */) {
                ++singleQuotes;
            } else if (code === 0x22  /* " */) {
                ++doubleQuotes;
            } else if (code === 0x2F  /* / */ && json) {
                result += '\\';
            } else if (esutils.code.isLineTerminator(code) || code === 0x5C  /* \ */) {
                result += escapeDisallowedCharacter(code);
                continue;
            } else if (!esutils.code.isIdentifierPartES5(code) && (json && code < 0x20  /* SP */ || !json && !escapeless && (code < 0x20  /* SP */ || code > 0x7E  /* ~ */))) {
                result += escapeAllowedCharacter(code, str.charCodeAt(i + 1));
                continue;
            }
            result += String.fromCharCode(code);
        }

        single = !(quotes === 'double' || (quotes === 'auto' && doubleQuotes < singleQuotes));
        quote = single ? '\'' : '"';

        if (!(single ? singleQuotes : doubleQuotes)) {
            return quote + result + quote;
        }

        str = result;
        result = quote;

        for (i = 0, len = str.length; i < len; ++i) {
            code = str.charCodeAt(i);
            if ((code === 0x27  /* ' */ && single) || (code === 0x22  /* " */ && !single)) {
                result += '\\';
            }
            result += String.fromCharCode(code);
        }

        return result + quote;
    }

    /**
     * flatten an array to a string, where the array can contain
     * either strings or nested arrays
     */
    function flattenToString(arr) {
        var i, iz, elem, result = '';
        for (i = 0, iz = arr.length; i < iz; ++i) {
            elem = arr[i];
            result += Array.isArray(elem) ? flattenToString(elem) : elem;
        }
        return result;
    }

    /**
     * convert generated to a SourceNode when source maps are enabled.
     */
    function toSourceNodeWhenNeeded(generated, node) {
        if (!sourceMap) {
            // with no source maps, generated is either an
            // array or a string.  if an array, flatten it.
            // if a string, just return it
            if (Array.isArray(generated)) {
                return flattenToString(generated);
            } else {
                return generated;
            }
        }
        if (node == null) {
            if (generated instanceof SourceNode) {
                return generated;
            } else {
                node = {};
            }
        }
        if (node.loc == null) {
            return new SourceNode(null, null, sourceMap, generated, node.name || null);
        }
        return new SourceNode(node.loc.start.line, node.loc.start.column, (sourceMap === true ? node.loc.source || null : sourceMap), generated, node.name || null);
    }

    function noEmptySpace() {
        return (space) ? space : ' ';
    }

    function join(left, right) {
        var leftSource,
            rightSource,
            leftCharCode,
            rightCharCode;

        leftSource = toSourceNodeWhenNeeded(left).toString();
        if (leftSource.length === 0) {
            return [right];
        }

        rightSource = toSourceNodeWhenNeeded(right).toString();
        if (rightSource.length === 0) {
            return [left];
        }

        leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
        rightCharCode = rightSource.charCodeAt(0);

        if ((leftCharCode === 0x2B  /* + */ || leftCharCode === 0x2D  /* - */) && leftCharCode === rightCharCode ||
            esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode) ||
            leftCharCode === 0x2F  /* / */ && rightCharCode === 0x69  /* i */) { // infix word operators all start with `i`
            return [left, noEmptySpace(), right];
        } else if (esutils.code.isWhiteSpace(leftCharCode) || esutils.code.isLineTerminator(leftCharCode) ||
                esutils.code.isWhiteSpace(rightCharCode) || esutils.code.isLineTerminator(rightCharCode)) {
            return [left, right];
        }
        return [left, space, right];
    }

    function addIndent(stmt) {
        return [base, stmt];
    }

    function withIndent(fn) {
        var previousBase;
        previousBase = base;
        base += indent;
        fn(base);
        base = previousBase;
    }

    function calculateSpaces(str) {
        var i;
        for (i = str.length - 1; i >= 0; --i) {
            if (esutils.code.isLineTerminator(str.charCodeAt(i))) {
                break;
            }
        }
        return (str.length - 1) - i;
    }

    function adjustMultilineComment(value, specialBase) {
        var array, i, len, line, j, spaces, previousBase, sn;

        array = value.split(/\r\n|[\r\n]/);
        spaces = Number.MAX_VALUE;

        // first line doesn't have indentation
        for (i = 1, len = array.length; i < len; ++i) {
            line = array[i];
            j = 0;
            while (j < line.length && esutils.code.isWhiteSpace(line.charCodeAt(j))) {
                ++j;
            }
            if (spaces > j) {
                spaces = j;
            }
        }

        if (typeof specialBase !== 'undefined') {
            // pattern like
            // {
            //   var t = 20;  /*
            //                 * this is comment
            //                 */
            // }
            previousBase = base;
            if (array[1][spaces] === '*') {
                specialBase += ' ';
            }
            base = specialBase;
        } else {
            if (spaces & 1) {
                // /*
                //  *
                //  */
                // If spaces are odd number, above pattern is considered.
                // We waste 1 space.
                --spaces;
            }
            previousBase = base;
        }

        for (i = 1, len = array.length; i < len; ++i) {
            sn = toSourceNodeWhenNeeded(addIndent(array[i].slice(spaces)));
            array[i] = sourceMap ? sn.join('') : sn;
        }

        base = previousBase;

        return array.join('\n');
    }

    function generateComment(comment, specialBase) {
        if (comment.type === 'Line') {
            if (endsWithLineTerminator(comment.value)) {
                return '//' + comment.value;
            } else {
                // Always use LineTerminator
                var result = '//' + comment.value;
                if (!preserveBlankLines) {
                    result += '\n';
                }
                return result;
            }
        }
        if (extra.format.indent.adjustMultilineComment && /[\n\r]/.test(comment.value)) {
            return adjustMultilineComment('/*' + comment.value + '*/', specialBase);
        }
        return '/*' + comment.value + '*/';
    }

    function addComments(stmt, result) {
        var i, len, comment, save, tailingToStatement, specialBase, fragment,
            extRange, range, prevRange, prefix, infix, suffix, count;

        if (stmt.leadingComments && stmt.leadingComments.length > 0) {
            save = result;

            if (preserveBlankLines) {
                comment = stmt.leadingComments[0];
                result = [];

                extRange = comment.extendedRange;
                range = comment.range;

                prefix = sourceCode.substring(extRange[0], range[0]);
                count = (prefix.match(/\n/g) || []).length;
                if (count > 0) {
                    result.push(stringRepeat('\n', count));
                    result.push(addIndent(generateComment(comment)));
                } else {
                    result.push(prefix);
                    result.push(generateComment(comment));
                }

                prevRange = range;

                for (i = 1, len = stmt.leadingComments.length; i < len; i++) {
                    comment = stmt.leadingComments[i];
                    range = comment.range;

                    infix = sourceCode.substring(prevRange[1], range[0]);
                    count = (infix.match(/\n/g) || []).length;
                    result.push(stringRepeat('\n', count));
                    result.push(addIndent(generateComment(comment)));

                    prevRange = range;
                }

                suffix = sourceCode.substring(range[1], extRange[1]);
                count = (suffix.match(/\n/g) || []).length;
                result.push(stringRepeat('\n', count));
            } else {
                comment = stmt.leadingComments[0];
                result = [];
                if (safeConcatenation && stmt.type === Syntax.Program && stmt.body.length === 0) {
                    result.push('\n');
                }
                result.push(generateComment(comment));
                if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
                    result.push('\n');
                }

                for (i = 1, len = stmt.leadingComments.length; i < len; ++i) {
                    comment = stmt.leadingComments[i];
                    fragment = [generateComment(comment)];
                    if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
                        fragment.push('\n');
                    }
                    result.push(addIndent(fragment));
                }
            }

            result.push(addIndent(save));
        }

        if (stmt.trailingComments) {

            if (preserveBlankLines) {
                comment = stmt.trailingComments[0];
                extRange = comment.extendedRange;
                range = comment.range;

                prefix = sourceCode.substring(extRange[0], range[0]);
                count = (prefix.match(/\n/g) || []).length;

                if (count > 0) {
                    result.push(stringRepeat('\n', count));
                    result.push(addIndent(generateComment(comment)));
                } else {
                    result.push(prefix);
                    result.push(generateComment(comment));
                }
            } else {
                tailingToStatement = !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
                specialBase = stringRepeat(' ', calculateSpaces(toSourceNodeWhenNeeded([base, result, indent]).toString()));
                for (i = 0, len = stmt.trailingComments.length; i < len; ++i) {
                    comment = stmt.trailingComments[i];
                    if (tailingToStatement) {
                        // We assume target like following script
                        //
                        // var t = 20;  /**
                        //               * This is comment of t
                        //               */
                        if (i === 0) {
                            // first case
                            result = [result, indent];
                        } else {
                            result = [result, specialBase];
                        }
                        result.push(generateComment(comment, specialBase));
                    } else {
                        result = [result, addIndent(generateComment(comment))];
                    }
                    if (i !== len - 1 && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
                        result = [result, '\n'];
                    }
                }
            }
        }

        return result;
    }

    function generateBlankLines(start, end, result) {
        var j, newlineCount = 0;

        for (j = start; j < end; j++) {
            if (sourceCode[j] === '\n') {
                newlineCount++;
            }
        }

        for (j = 1; j < newlineCount; j++) {
            result.push(newline);
        }
    }

    function parenthesize(text, current, should) {
        if (current < should) {
            return ['(', text, ')'];
        }
        return text;
    }

    function generateVerbatimString(string) {
        var i, iz, result;
        result = string.split(/\r\n|\n/);
        for (i = 1, iz = result.length; i < iz; i++) {
            result[i] = newline + base + result[i];
        }
        return result;
    }

    function generateVerbatim(expr, precedence) {
        var verbatim, result, prec;
        verbatim = expr[extra.verbatim];

        if (typeof verbatim === 'string') {
            result = parenthesize(generateVerbatimString(verbatim), Precedence.Sequence, precedence);
        } else {
            // verbatim is object
            result = generateVerbatimString(verbatim.content);
            prec = (verbatim.precedence != null) ? verbatim.precedence : Precedence.Sequence;
            result = parenthesize(result, prec, precedence);
        }

        return toSourceNodeWhenNeeded(result, expr);
    }

    function CodeGenerator() {
    }

    // Helpers.

    CodeGenerator.prototype.maybeBlock = function(stmt, flags) {
        var result, noLeadingComment, that = this;

        noLeadingComment = !extra.comment || !stmt.leadingComments;

        if (stmt.type === Syntax.BlockStatement && noLeadingComment) {
            return [space, this.generateStatement(stmt, flags)];
        }

        if (stmt.type === Syntax.EmptyStatement && noLeadingComment) {
            return ';';
        }

        withIndent(function () {
            result = [
                newline,
                addIndent(that.generateStatement(stmt, flags))
            ];
        });

        return result;
    };

    CodeGenerator.prototype.maybeBlockSuffix = function (stmt, result) {
        var ends = endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
        if (stmt.type === Syntax.BlockStatement && (!extra.comment || !stmt.leadingComments) && !ends) {
            return [result, space];
        }
        if (ends) {
            return [result, base];
        }
        return [result, newline, base];
    };

    function generateIdentifier(node) {
        return toSourceNodeWhenNeeded(node.name, node);
    }

    function generateAsyncPrefix(node, spaceRequired) {
        return node.async ? 'async' + (spaceRequired ? noEmptySpace() : space) : '';
    }

    function generateStarSuffix(node) {
        var isGenerator = node.generator && !extra.moz.starlessGenerator;
        return isGenerator ? '*' + space : '';
    }

    function generateMethodPrefix(prop) {
        var func = prop.value, prefix = '';
        if (func.async) {
            prefix += generateAsyncPrefix(func, !prop.computed);
        }
        if (func.generator) {
            // avoid space before method name
            prefix += generateStarSuffix(func) ? '*' : '';
        }
        return prefix;
    }

    CodeGenerator.prototype.generatePattern = function (node, precedence, flags) {
        if (node.type === Syntax.Identifier) {
            return generateIdentifier(node);
        }
        return this.generateExpression(node, precedence, flags);
    };

    CodeGenerator.prototype.generateFunctionParams = function (node) {
        var i, iz, result, hasDefault;

        hasDefault = false;

        if (node.type === Syntax.ArrowFunctionExpression &&
                !node.rest && (!node.defaults || node.defaults.length === 0) &&
                node.params.length === 1 && node.params[0].type === Syntax.Identifier) {
            // arg => { } case
            result = [generateAsyncPrefix(node, true), generateIdentifier(node.params[0])];
        } else {
            result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : [];
            result.push('(');
            if (node.defaults) {
                hasDefault = true;
            }
            for (i = 0, iz = node.params.length; i < iz; ++i) {
                if (hasDefault && node.defaults[i]) {
                    // Handle default values.
                    result.push(this.generateAssignment(node.params[i], node.defaults[i], '=', Precedence.Assignment, E_TTT));
                } else {
                    result.push(this.generatePattern(node.params[i], Precedence.Assignment, E_TTT));
                }
                if (i + 1 < iz) {
                    result.push(',' + space);
                }
            }

            if (node.rest) {
                if (node.params.length) {
                    result.push(',' + space);
                }
                result.push('...');
                result.push(generateIdentifier(node.rest));
            }

            result.push(')');
        }

        return result;
    };

    CodeGenerator.prototype.generateFunctionBody = function (node) {
        var result, expr;

        result = this.generateFunctionParams(node);

        if (node.type === Syntax.ArrowFunctionExpression) {
            result.push(space);
            result.push('=>');
        }

        if (node.expression) {
            result.push(space);
            expr = this.generateExpression(node.body, Precedence.Assignment, E_TTT);
            if (expr.toString().charAt(0) === '{') {
                expr = ['(', expr, ')'];
            }
            result.push(expr);
        } else {
            result.push(this.maybeBlock(node.body, S_TTFF));
        }

        return result;
    };

    CodeGenerator.prototype.generateIterationForStatement = function (operator, stmt, flags) {
        var result = ['for' + (stmt.await ? noEmptySpace() + 'await' : '') + space + '('], that = this;
        withIndent(function () {
            if (stmt.left.type === Syntax.VariableDeclaration) {
                withIndent(function () {
                    result.push(stmt.left.kind + noEmptySpace());
                    result.push(that.generateStatement(stmt.left.declarations[0], S_FFFF));
                });
            } else {
                result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT));
            }

            result = join(result, operator);
            result = [join(
                result,
                that.generateExpression(stmt.right, Precedence.Assignment, E_TTT)
            ), ')'];
        });
        result.push(this.maybeBlock(stmt.body, flags));
        return result;
    };

    CodeGenerator.prototype.generatePropertyKey = function (expr, computed) {
        var result = [];

        if (computed) {
            result.push('[');
        }

        result.push(this.generateExpression(expr, Precedence.Assignment, E_TTT));

        if (computed) {
            result.push(']');
        }

        return result;
    };

    CodeGenerator.prototype.generateAssignment = function (left, right, operator, precedence, flags) {
        if (Precedence.Assignment < precedence) {
            flags |= F_ALLOW_IN;
        }

        return parenthesize(
            [
                this.generateExpression(left, Precedence.Call, flags),
                space + operator + space,
                this.generateExpression(right, Precedence.Assignment, flags)
            ],
            Precedence.Assignment,
            precedence
        );
    };

    CodeGenerator.prototype.semicolon = function (flags) {
        if (!semicolons && flags & F_SEMICOLON_OPT) {
            return '';
        }
        return ';';
    };

    // Statements.

    CodeGenerator.Statement = {

        BlockStatement: function (stmt, flags) {
            var range, content, result = ['{', newline], that = this;

            withIndent(function () {
                // handle functions without any code
                if (stmt.body.length === 0 && preserveBlankLines) {
                    range = stmt.range;
                    if (range[1] - range[0] > 2) {
                        content = sourceCode.substring(range[0] + 1, range[1] - 1);
                        if (content[0] === '\n') {
                            result = ['{'];
                        }
                        result.push(content);
                    }
                }

                var i, iz, fragment, bodyFlags;
                bodyFlags = S_TFFF;
                if (flags & F_FUNC_BODY) {
                    bodyFlags |= F_DIRECTIVE_CTX;
                }

                for (i = 0, iz = stmt.body.length; i < iz; ++i) {
                    if (preserveBlankLines) {
                        // handle spaces before the first line
                        if (i === 0) {
                            if (stmt.body[0].leadingComments) {
                                range = stmt.body[0].leadingComments[0].extendedRange;
                                content = sourceCode.substring(range[0], range[1]);
                                if (content[0] === '\n') {
                                    result = ['{'];
                                }
                            }
                            if (!stmt.body[0].leadingComments) {
                                generateBlankLines(stmt.range[0], stmt.body[0].range[0], result);
                            }
                        }

                        // handle spaces between lines
                        if (i > 0) {
                            if (!stmt.body[i - 1].trailingComments  && !stmt.body[i].leadingComments) {
                                generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
                            }
                        }
                    }

                    if (i === iz - 1) {
                        bodyFlags |= F_SEMICOLON_OPT;
                    }

                    if (stmt.body[i].leadingComments && preserveBlankLines) {
                        fragment = that.generateStatement(stmt.body[i], bodyFlags);
                    } else {
                        fragment = addIndent(that.generateStatement(stmt.body[i], bodyFlags));
                    }

                    result.push(fragment);
                    if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
                        if (preserveBlankLines && i < iz - 1) {
                            // don't add a new line if there are leading coments
                            // in the next statement
                            if (!stmt.body[i + 1].leadingComments) {
                                result.push(newline);
                            }
                        } else {
                            result.push(newline);
                        }
                    }

                    if (preserveBlankLines) {
                        // handle spaces after the last line
                        if (i === iz - 1) {
                            if (!stmt.body[i].trailingComments) {
                                generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
                            }
                        }
                    }
                }
            });

            result.push(addIndent('}'));
            return result;
        },

        BreakStatement: function (stmt, flags) {
            if (stmt.label) {
                return 'break ' + stmt.label.name + this.semicolon(flags);
            }
            return 'break' + this.semicolon(flags);
        },

        ContinueStatement: function (stmt, flags) {
            if (stmt.label) {
                return 'continue ' + stmt.label.name + this.semicolon(flags);
            }
            return 'continue' + this.semicolon(flags);
        },

        ClassBody: function (stmt, flags) {
            var result = [ '{', newline], that = this;

            withIndent(function (indent) {
                var i, iz;

                for (i = 0, iz = stmt.body.length; i < iz; ++i) {
                    result.push(indent);
                    result.push(that.generateExpression(stmt.body[i], Precedence.Sequence, E_TTT));
                    if (i + 1 < iz) {
                        result.push(newline);
                    }
                }
            });

            if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
                result.push(newline);
            }
            result.push(base);
            result.push('}');
            return result;
        },

        ClassDeclaration: function (stmt, flags) {
            var result, fragment;
            result  = ['class'];
            if (stmt.id) {
                result = join(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT));
            }
            if (stmt.superClass) {
                fragment = join('extends', this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT));
                result = join(result, fragment);
            }
            result.push(space);
            result.push(this.generateStatement(stmt.body, S_TFFT));
            return result;
        },

        DirectiveStatement: function (stmt, flags) {
            if (extra.raw && stmt.raw) {
                return stmt.raw + this.semicolon(flags);
            }
            return escapeDirective(stmt.directive) + this.semicolon(flags);
        },

        DoWhileStatement: function (stmt, flags) {
            // Because `do 42 while (cond)` is Syntax Error. We need semicolon.
            var result = join('do', this.maybeBlock(stmt.body, S_TFFF));
            result = this.maybeBlockSuffix(stmt.body, result);
            return join(result, [
                'while' + space + '(',
                this.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
                ')' + this.semicolon(flags)
            ]);
        },

        CatchClause: function (stmt, flags) {
            var result, that = this;
            withIndent(function () {
                var guard;

                if (stmt.param) {
                    result = [
                        'catch' + space + '(',
                        that.generateExpression(stmt.param, Precedence.Sequence, E_TTT),
                        ')'
                    ];

                    if (stmt.guard) {
                        guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT);
                        result.splice(2, 0, ' if ', guard);
                    }
                } else {
                    result = ['catch'];
                }
            });
            result.push(this.maybeBlock(stmt.body, S_TFFF));
            return result;
        },

        DebuggerStatement: function (stmt, flags) {
            return 'debugger' + this.semicolon(flags);
        },

        EmptyStatement: function (stmt, flags) {
            return ';';
        },

        ExportDefaultDeclaration: function (stmt, flags) {
            var result = [ 'export' ], bodyFlags;

            bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;

            // export default HoistableDeclaration[Default]
            // export default AssignmentExpression[In] ;
            result = join(result, 'default');
            if (isStatement(stmt.declaration)) {
                result = join(result, this.generateStatement(stmt.declaration, bodyFlags));
            } else {
                result = join(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
            }
            return result;
        },

        ExportNamedDeclaration: function (stmt, flags) {
            var result = [ 'export' ], bodyFlags, that = this;

            bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;

            // export VariableStatement
            // export Declaration[Default]
            if (stmt.declaration) {
                return join(result, this.generateStatement(stmt.declaration, bodyFlags));
            }

            // export ExportClause[NoReference] FromClause ;
            // export ExportClause ;
            if (stmt.specifiers) {
                if (stmt.specifiers.length === 0) {
                    result = join(result, '{' + space + '}');
                } else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) {
                    result = join(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
                } else {
                    result = join(result, '{');
                    withIndent(function (indent) {
                        var i, iz;
                        result.push(newline);
                        for (i = 0, iz = stmt.specifiers.length; i < iz; ++i) {
                            result.push(indent);
                            result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
                            if (i + 1 < iz) {
                                result.push(',' + newline);
                            }
                        }
                    });
                    if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
                        result.push(newline);
                    }
                    result.push(base + '}');
                }

                if (stmt.source) {
                    result = join(result, [
                        'from' + space,
                        // ModuleSpecifier
                        this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
                        this.semicolon(flags)
                    ]);
                } else {
                    result.push(this.semicolon(flags));
                }
            }
            return result;
        },

        ExportAllDeclaration: function (stmt, flags) {
            // export * FromClause ;
            return [
                'export' + space,
                '*' + space,
                'from' + space,
                // ModuleSpecifier
                this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
                this.semicolon(flags)
            ];
        },

        ExpressionStatement: function (stmt, flags) {
            var result, fragment;

            function isClassPrefixed(fragment) {
                var code;
                if (fragment.slice(0, 5) !== 'class') {
                    return false;
                }
                code = fragment.charCodeAt(5);
                return code === 0x7B  /* '{' */ || esutils.code.isWhiteSpace(code) || esutils.code.isLineTerminator(code);
            }

            function isFunctionPrefixed(fragment) {
                var code;
                if (fragment.slice(0, 8) !== 'function') {
                    return false;
                }
                code = fragment.charCodeAt(8);
                return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A  /* '*' */ || esutils.code.isLineTerminator(code);
            }

            function isAsyncPrefixed(fragment) {
                var code, i, iz;
                if (fragment.slice(0, 5) !== 'async') {
                    return false;
                }
                if (!esutils.code.isWhiteSpace(fragment.charCodeAt(5))) {
                    return false;
                }
                for (i = 6, iz = fragment.length; i < iz; ++i) {
                    if (!esutils.code.isWhiteSpace(fragment.charCodeAt(i))) {
                        break;
                    }
                }
                if (i === iz) {
                    return false;
                }
                if (fragment.slice(i, i + 8) !== 'function') {
                    return false;
                }
                code = fragment.charCodeAt(i + 8);
                return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A  /* '*' */ || esutils.code.isLineTerminator(code);
            }

            result = [this.generateExpression(stmt.expression, Precedence.Sequence, E_TTT)];
            // 12.4 '{', 'function', 'class' is not allowed in this position.
            // wrap expression with parentheses
            fragment = toSourceNodeWhenNeeded(result).toString();
            if (fragment.charCodeAt(0) === 0x7B  /* '{' */ ||  // ObjectExpression
                    isClassPrefixed(fragment) ||
                    isFunctionPrefixed(fragment) ||
                    isAsyncPrefixed(fragment) ||
                    (directive && (flags & F_DIRECTIVE_CTX) && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string')) {
                result = ['(', result, ')' + this.semicolon(flags)];
            } else {
                result.push(this.semicolon(flags));
            }
            return result;
        },

        ImportDeclaration: function (stmt, flags) {
            // ES6: 15.2.1 valid import declarations:
            //     - import ImportClause FromClause ;
            //     - import ModuleSpecifier ;
            var result, cursor, that = this;

            // If no ImportClause is present,
            // this should be `import ModuleSpecifier` so skip `from`
            // ModuleSpecifier is StringLiteral.
            if (stmt.specifiers.length === 0) {
                // import ModuleSpecifier ;
                return [
                    'import',
                    space,
                    // ModuleSpecifier
                    this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
                    this.semicolon(flags)
                ];
            }

            // import ImportClause FromClause ;
            result = [
                'import'
            ];
            cursor = 0;

            // ImportedBinding
            if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) {
                result = join(result, [
                        this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
                ]);
                ++cursor;
            }

            if (stmt.specifiers[cursor]) {
                if (cursor !== 0) {
                    result.push(',');
                }

                if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) {
                    // NameSpaceImport
                    result = join(result, [
                            space,
                            this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
                    ]);
                } else {
                    // NamedImports
                    result.push(space + '{');

                    if ((stmt.specifiers.length - cursor) === 1) {
                        // import { ... } from "...";
                        result.push(space);
                        result.push(this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT));
                        result.push(space + '}' + space);
                    } else {
                        // import {
                        //    ...,
                        //    ...,
                        // } from "...";
                        withIndent(function (indent) {
                            var i, iz;
                            result.push(newline);
                            for (i = cursor, iz = stmt.specifiers.length; i < iz; ++i) {
                                result.push(indent);
                                result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
                                if (i + 1 < iz) {
                                    result.push(',' + newline);
                                }
                            }
                        });
                        if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
                            result.push(newline);
                        }
                        result.push(base + '}' + space);
                    }
                }
            }

            result = join(result, [
                'from' + space,
                // ModuleSpecifier
                this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
                this.semicolon(flags)
            ]);
            return result;
        },

        VariableDeclarator: function (stmt, flags) {
            var itemFlags = (flags & F_ALLOW_IN) ? E_TTT : E_FTT;
            if (stmt.init) {
                return [
                    this.generateExpression(stmt.id, Precedence.Assignment, itemFlags),
                    space,
                    '=',
                    space,
                    this.generateExpression(stmt.init, Precedence.Assignment, itemFlags)
                ];
            }
            return this.generatePattern(stmt.id, Precedence.Assignment, itemFlags);
        },

        VariableDeclaration: function (stmt, flags) {
            // VariableDeclarator is typed as Statement,
            // but joined with comma (not LineTerminator).
            // So if comment is attached to target node, we should specialize.
            var result, i, iz, node, bodyFlags, that = this;

            result = [ stmt.kind ];

            bodyFlags = (flags & F_ALLOW_IN) ? S_TFFF : S_FFFF;

            function block() {
                node = stmt.declarations[0];
                if (extra.comment && node.leadingComments) {
                    result.push('\n');
                    result.push(addIndent(that.generateStatement(node, bodyFlags)));
                } else {
                    result.push(noEmptySpace());
                    result.push(that.generateStatement(node, bodyFlags));
                }

                for (i = 1, iz = stmt.declarations.length; i < iz; ++i) {
                    node = stmt.declarations[i];
                    if (extra.comment && node.leadingComments) {
                        result.push(',' + newline);
                        result.push(addIndent(that.generateStatement(node, bodyFlags)));
                    } else {
                        result.push(',' + space);
                        result.push(that.generateStatement(node, bodyFlags));
                    }
                }
            }

            if (stmt.declarations.length > 1) {
                withIndent(block);
            } else {
                block();
            }

            result.push(this.semicolon(flags));

            return result;
        },

        ThrowStatement: function (stmt, flags) {
            return [join(
                'throw',
                this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
            ), this.semicolon(flags)];
        },

        TryStatement: function (stmt, flags) {
            var result, i, iz, guardedHandlers;

            result = ['try', this.maybeBlock(stmt.block, S_TFFF)];
            result = this.maybeBlockSuffix(stmt.block, result);

            if (stmt.handlers) {
                // old interface
                for (i = 0, iz = stmt.handlers.length; i < iz; ++i) {
                    result = join(result, this.generateStatement(stmt.handlers[i], S_TFFF));
                    if (stmt.finalizer || i + 1 !== iz) {
                        result = this.maybeBlockSuffix(stmt.handlers[i].body, result);
                    }
                }
            } else {
                guardedHandlers = stmt.guardedHandlers || [];

                for (i = 0, iz = guardedHandlers.length; i < iz; ++i) {
                    result = join(result, this.generateStatement(guardedHandlers[i], S_TFFF));
                    if (stmt.finalizer || i + 1 !== iz) {
                        result = this.maybeBlockSuffix(guardedHandlers[i].body, result);
                    }
                }

                // new interface
                if (stmt.handler) {
                    if (Array.isArray(stmt.handler)) {
                        for (i = 0, iz = stmt.handler.length; i < iz; ++i) {
                            result = join(result, this.generateStatement(stmt.handler[i], S_TFFF));
                            if (stmt.finalizer || i + 1 !== iz) {
                                result = this.maybeBlockSuffix(stmt.handler[i].body, result);
                            }
                        }
                    } else {
                        result = join(result, this.generateStatement(stmt.handler, S_TFFF));
                        if (stmt.finalizer) {
                            result = this.maybeBlockSuffix(stmt.handler.body, result);
                        }
                    }
                }
            }
            if (stmt.finalizer) {
                result = join(result, ['finally', this.maybeBlock(stmt.finalizer, S_TFFF)]);
            }
            return result;
        },

        SwitchStatement: function (stmt, flags) {
            var result, fragment, i, iz, bodyFlags, that = this;
            withIndent(function () {
                result = [
                    'switch' + space + '(',
                    that.generateExpression(stmt.discriminant, Precedence.Sequence, E_TTT),
                    ')' + space + '{' + newline
                ];
            });
            if (stmt.cases) {
                bodyFlags = S_TFFF;
                for (i = 0, iz = stmt.cases.length; i < iz; ++i) {
                    if (i === iz - 1) {
                        bodyFlags |= F_SEMICOLON_OPT;
                    }
                    fragment = addIndent(this.generateStatement(stmt.cases[i], bodyFlags));
                    result.push(fragment);
                    if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
                        result.push(newline);
                    }
                }
            }
            result.push(addIndent('}'));
            return result;
        },

        SwitchCase: function (stmt, flags) {
            var result, fragment, i, iz, bodyFlags, that = this;
            withIndent(function () {
                if (stmt.test) {
                    result = [
                        join('case', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
                        ':'
                    ];
                } else {
                    result = ['default:'];
                }

                i = 0;
                iz = stmt.consequent.length;
                if (iz && stmt.consequent[0].type === Syntax.BlockStatement) {
                    fragment = that.maybeBlock(stmt.consequent[0], S_TFFF);
                    result.push(fragment);
                    i = 1;
                }

                if (i !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
                    result.push(newline);
                }

                bodyFlags = S_TFFF;
                for (; i < iz; ++i) {
                    if (i === iz - 1 && flags & F_SEMICOLON_OPT) {
                        bodyFlags |= F_SEMICOLON_OPT;
                    }
                    fragment = addIndent(that.generateStatement(stmt.consequent[i], bodyFlags));
                    result.push(fragment);
                    if (i + 1 !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
                        result.push(newline);
                    }
                }
            });
            return result;
        },

        IfStatement: function (stmt, flags) {
            var result, bodyFlags, semicolonOptional, that = this;
            withIndent(function () {
                result = [
                    'if' + space + '(',
                    that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
                    ')'
                ];
            });
            semicolonOptional = flags & F_SEMICOLON_OPT;
            bodyFlags = S_TFFF;
            if (semicolonOptional) {
                bodyFlags |= F_SEMICOLON_OPT;
            }
            if (stmt.alternate) {
                result.push(this.maybeBlock(stmt.consequent, S_TFFF));
                result = this.maybeBlockSuffix(stmt.consequent, result);
                if (stmt.alternate.type === Syntax.IfStatement) {
                    result = join(result, ['else ', this.generateStatement(stmt.alternate, bodyFlags)]);
                } else {
                    result = join(result, join('else', this.maybeBlock(stmt.alternate, bodyFlags)));
                }
            } else {
                result.push(this.maybeBlock(stmt.consequent, bodyFlags));
            }
            return result;
        },

        ForStatement: function (stmt, flags) {
            var result, that = this;
            withIndent(function () {
                result = ['for' + space + '('];
                if (stmt.init) {
                    if (stmt.init.type === Syntax.VariableDeclaration) {
                        result.push(that.generateStatement(stmt.init, S_FFFF));
                    } else {
                        // F_ALLOW_IN becomes false.
                        result.push(that.generateExpression(stmt.init, Precedence.Sequence, E_FTT));
                        result.push(';');
                    }
                } else {
                    result.push(';');
                }

                if (stmt.test) {
                    result.push(space);
                    result.push(that.generateExpression(stmt.test, Precedence.Sequence, E_TTT));
                    result.push(';');
                } else {
                    result.push(';');
                }

                if (stmt.update) {
                    result.push(space);
                    result.push(that.generateExpression(stmt.update, Precedence.Sequence, E_TTT));
                    result.push(')');
                } else {
                    result.push(')');
                }
            });

            result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
            return result;
        },

        ForInStatement: function (stmt, flags) {
            return this.generateIterationForStatement('in', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
        },

        ForOfStatement: function (stmt, flags) {
            return this.generateIterationForStatement('of', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
        },

        LabeledStatement: function (stmt, flags) {
            return [stmt.label.name + ':', this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)];
        },

        Program: function (stmt, flags) {
            var result, fragment, i, iz, bodyFlags;
            iz = stmt.body.length;
            result = [safeConcatenation && iz > 0 ? '\n' : ''];
            bodyFlags = S_TFTF;
            for (i = 0; i < iz; ++i) {
                if (!safeConcatenation && i === iz - 1) {
                    bodyFlags |= F_SEMICOLON_OPT;
                }

                if (preserveBlankLines) {
                    // handle spaces before the first line
                    if (i === 0) {
                        if (!stmt.body[0].leadingComments) {
                            generateBlankLines(stmt.range[0], stmt.body[i].range[0], result);
                        }
                    }

                    // handle spaces between lines
                    if (i > 0) {
                        if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {
                            generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
                        }
                    }
                }

                fragment = addIndent(this.generateStatement(stmt.body[i], bodyFlags));
                result.push(fragment);
                if (i + 1 < iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
                    if (preserveBlankLines) {
                        if (!stmt.body[i + 1].leadingComments) {
                            result.push(newline);
                        }
                    } else {
                        result.push(newline);
                    }
                }

                if (preserveBlankLines) {
                    // handle spaces after the last line
                    if (i === iz - 1) {
                        if (!stmt.body[i].trailingComments) {
                            generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
                        }
                    }
                }
            }
            return result;
        },

        FunctionDeclaration: function (stmt, flags) {
            return [
                generateAsyncPrefix(stmt, true),
                'function',
                generateStarSuffix(stmt) || noEmptySpace(),
                stmt.id ? generateIdentifier(stmt.id) : '',
                this.generateFunctionBody(stmt)
            ];
        },

        ReturnStatement: function (stmt, flags) {
            if (stmt.argument) {
                return [join(
                    'return',
                    this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
                ), this.semicolon(flags)];
            }
            return ['return' + this.semicolon(flags)];
        },

        WhileStatement: function (stmt, flags) {
            var result, that = this;
            withIndent(function () {
                result = [
                    'while' + space + '(',
                    that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
                    ')'
                ];
            });
            result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
            return result;
        },

        WithStatement: function (stmt, flags) {
            var result, that = this;
            withIndent(function () {
                result = [
                    'with' + space + '(',
                    that.generateExpression(stmt.object, Precedence.Sequence, E_TTT),
                    ')'
                ];
            });
            result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
            return result;
        }

    };

    merge(CodeGenerator.prototype, CodeGenerator.Statement);

    // Expressions.

    CodeGenerator.Expression = {

        SequenceExpression: function (expr, precedence, flags) {
            var result, i, iz;
            if (Precedence.Sequence < precedence) {
                flags |= F_ALLOW_IN;
            }
            result = [];
            for (i = 0, iz = expr.expressions.length; i < iz; ++i) {
                result.push(this.generateExpression(expr.expressions[i], Precedence.Assignment, flags));
                if (i + 1 < iz) {
                    result.push(',' + space);
                }
            }
            return parenthesize(result, Precedence.Sequence, precedence);
        },

        AssignmentExpression: function (expr, precedence, flags) {
            return this.generateAssignment(expr.left, expr.right, expr.operator, precedence, flags);
        },

        ArrowFunctionExpression: function (expr, precedence, flags) {
            return parenthesize(this.generateFunctionBody(expr), Precedence.ArrowFunction, precedence);
        },

        ConditionalExpression: function (expr, precedence, flags) {
            if (Precedence.Conditional < precedence) {
                flags |= F_ALLOW_IN;
            }
            return parenthesize(
                [
                    this.generateExpression(expr.test, Precedence.LogicalOR, flags),
                    space + '?' + space,
                    this.generateExpression(expr.consequent, Precedence.Assignment, flags),
                    space + ':' + space,
                    this.generateExpression(expr.alternate, Precedence.Assignment, flags)
                ],
                Precedence.Conditional,
                precedence
            );
        },

        LogicalExpression: function (expr, precedence, flags) {
            return this.BinaryExpression(expr, precedence, flags);
        },

        BinaryExpression: function (expr, precedence, flags) {
            var result, leftPrecedence, rightPrecedence, currentPrecedence, fragment, leftSource;
            currentPrecedence = BinaryPrecedence[expr.operator];
            leftPrecedence = expr.operator === '**' ? Precedence.Postfix : currentPrecedence;
            rightPrecedence = expr.operator === '**' ? currentPrecedence : currentPrecedence + 1;

            if (currentPrecedence < precedence) {
                flags |= F_ALLOW_IN;
            }

            fragment = this.generateExpression(expr.left, leftPrecedence, flags);

            leftSource = fragment.toString();

            if (leftSource.charCodeAt(leftSource.length - 1) === 0x2F /* / */ && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) {
                result = [fragment, noEmptySpace(), expr.operator];
            } else {
                result = join(fragment, expr.operator);
            }

            fragment = this.generateExpression(expr.right, rightPrecedence, flags);

            if (expr.operator === '/' && fragment.toString().charAt(0) === '/' ||
            expr.operator.slice(-1) === '<' && fragment.toString().slice(0, 3) === '!--') {
                // If '/' concats with '/' or `<` concats with `!--`, it is interpreted as comment start
                result.push(noEmptySpace());
                result.push(fragment);
            } else {
                result = join(result, fragment);
            }

            if (expr.operator === 'in' && !(flags & F_ALLOW_IN)) {
                return ['(', result, ')'];
            }
            return parenthesize(result, currentPrecedence, precedence);
        },

        CallExpression: function (expr, precedence, flags) {
            var result, i, iz;
            // F_ALLOW_UNPARATH_NEW becomes false.
            result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)];
            result.push('(');
            for (i = 0, iz = expr['arguments'].length; i < iz; ++i) {
                result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
                if (i + 1 < iz) {
                    result.push(',' + space);
                }
            }
            result.push(')');

            if (!(flags & F_ALLOW_CALL)) {
                return ['(', result, ')'];
            }
            return parenthesize(result, Precedence.Call, precedence);
        },

        NewExpression: function (expr, precedence, flags) {
            var result, length, i, iz, itemFlags;
            length = expr['arguments'].length;

            // F_ALLOW_CALL becomes false.
            // F_ALLOW_UNPARATH_NEW may become false.
            itemFlags = (flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0) ? E_TFT : E_TFF;

            result = join(
                'new',
                this.generateExpression(expr.callee, Precedence.New, itemFlags)
            );

            if (!(flags & F_ALLOW_UNPARATH_NEW) || parentheses || length > 0) {
                result.push('(');
                for (i = 0, iz = length; i < iz; ++i) {
                    result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
                    if (i + 1 < iz) {
                        result.push(',' + space);
                    }
                }
                result.push(')');
            }

            return parenthesize(result, Precedence.New, precedence);
        },

        MemberExpression: function (expr, precedence, flags) {
            var result, fragment;

            // F_ALLOW_UNPARATH_NEW becomes false.
            result = [this.generateExpression(expr.object, Precedence.Call, (flags & F_ALLOW_CALL) ? E_TTF : E_TFF)];

            if (expr.computed) {
                result.push('[');
                result.push(this.generateExpression(expr.property, Precedence.Sequence, flags & F_ALLOW_CALL ? E_TTT : E_TFT));
                result.push(']');
            } else {
                if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') {
                    fragment = toSourceNodeWhenNeeded(result).toString();
                    // When the following conditions are all true,
                    //   1. No floating point
                    //   2. Don't have exponents
                    //   3. The last character is a decimal digit
                    //   4. Not hexadecimal OR octal number literal
                    // we should add a floating point.
                    if (
                            fragment.indexOf('.') < 0 &&
                            !/[eExX]/.test(fragment) &&
                            esutils.code.isDecimalDigit(fragment.charCodeAt(fragment.length - 1)) &&
                            !(fragment.length >= 2 && fragment.charCodeAt(0) === 48)  // '0'
                            ) {
                        result.push(' ');
                    }
                }
                result.push('.');
                result.push(generateIdentifier(expr.property));
            }

            return parenthesize(result, Precedence.Member, precedence);
        },

        MetaProperty: function (expr, precedence, flags) {
            var result;
            result = [];
            result.push(typeof expr.meta === "string" ? expr.meta : generateIdentifier(expr.meta));
            result.push('.');
            result.push(typeof expr.property === "string" ? expr.property : generateIdentifier(expr.property));
            return parenthesize(result, Precedence.Member, precedence);
        },

        UnaryExpression: function (expr, precedence, flags) {
            var result, fragment, rightCharCode, leftSource, leftCharCode;
            fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT);

            if (space === '') {
                result = join(expr.operator, fragment);
            } else {
                result = [expr.operator];
                if (expr.operator.length > 2) {
                    // delete, void, typeof
                    // get `typeof []`, not `typeof[]`
                    result = join(result, fragment);
                } else {
                    // Prevent inserting spaces between operator and argument if it is unnecessary
                    // like, `!cond`
                    leftSource = toSourceNodeWhenNeeded(result).toString();
                    leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
                    rightCharCode = fragment.toString().charCodeAt(0);

                    if (((leftCharCode === 0x2B  /* + */ || leftCharCode === 0x2D  /* - */) && leftCharCode === rightCharCode) ||
                            (esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode))) {
                        result.push(noEmptySpace());
                        result.push(fragment);
                    } else {
                        result.push(fragment);
                    }
                }
            }
            return parenthesize(result, Precedence.Unary, precedence);
        },

        YieldExpression: function (expr, precedence, flags) {
            var result;
            if (expr.delegate) {
                result = 'yield*';
            } else {
                result = 'yield';
            }
            if (expr.argument) {
                result = join(
                    result,
                    this.generateExpression(expr.argument, Precedence.Yield, E_TTT)
                );
            }
            return parenthesize(result, Precedence.Yield, precedence);
        },

        AwaitExpression: function (expr, precedence, flags) {
            var result = join(
                expr.all ? 'await*' : 'await',
                this.generateExpression(expr.argument, Precedence.Await, E_TTT)
            );
            return parenthesize(result, Precedence.Await, precedence);
        },

        UpdateExpression: function (expr, precedence, flags) {
            if (expr.prefix) {
                return parenthesize(
                    [
                        expr.operator,
                        this.generateExpression(expr.argument, Precedence.Unary, E_TTT)
                    ],
                    Precedence.Unary,
                    precedence
                );
            }
            return parenthesize(
                [
                    this.generateExpression(expr.argument, Precedence.Postfix, E_TTT),
                    expr.operator
                ],
                Precedence.Postfix,
                precedence
            );
        },

        FunctionExpression: function (expr, precedence, flags) {
            var result = [
                generateAsyncPrefix(expr, true),
                'function'
            ];
            if (expr.id) {
                result.push(generateStarSuffix(expr) || noEmptySpace());
                result.push(generateIdentifier(expr.id));
            } else {
                result.push(generateStarSuffix(expr) || space);
            }
            result.push(this.generateFunctionBody(expr));
            return result;
        },

        ArrayPattern: function (expr, precedence, flags) {
            return this.ArrayExpression(expr, precedence, flags, true);
        },

        ArrayExpression: function (expr, precedence, flags, isPattern) {
            var result, multiline, that = this;
            if (!expr.elements.length) {
                return '[]';
            }
            multiline = isPattern ? false : expr.elements.length > 1;
            result = ['[', multiline ? newline : ''];
            withIndent(function (indent) {
                var i, iz;
                for (i = 0, iz = expr.elements.length; i < iz; ++i) {
                    if (!expr.elements[i]) {
                        if (multiline) {
                            result.push(indent);
                        }
                        if (i + 1 === iz) {
                            result.push(',');
                        }
                    } else {
                        result.push(multiline ? indent : '');
                        result.push(that.generateExpression(expr.elements[i], Precedence.Assignment, E_TTT));
                    }
                    if (i + 1 < iz) {
                        result.push(',' + (multiline ? newline : space));
                    }
                }
            });
            if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
                result.push(newline);
            }
            result.push(multiline ? base : '');
            result.push(']');
            return result;
        },

        RestElement: function(expr, precedence, flags) {
            return '...' + this.generatePattern(expr.argument);
        },

        ClassExpression: function (expr, precedence, flags) {
            var result, fragment;
            result = ['class'];
            if (expr.id) {
                result = join(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
            }
            if (expr.superClass) {
                fragment = join('extends', this.generateExpression(expr.superClass, Precedence.Unary, E_TTT));
                result = join(result, fragment);
            }
            result.push(space);
            result.push(this.generateStatement(expr.body, S_TFFT));
            return result;
        },

        MethodDefinition: function (expr, precedence, flags) {
            var result, fragment;
            if (expr['static']) {
                result = ['static' + space];
            } else {
                result = [];
            }
            if (expr.kind === 'get' || expr.kind === 'set') {
                fragment = [
                    join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
                    this.generateFunctionBody(expr.value)
                ];
            } else {
                fragment = [
                    generateMethodPrefix(expr),
                    this.generatePropertyKey(expr.key, expr.computed),
                    this.generateFunctionBody(expr.value)
                ];
            }
            return join(result, fragment);
        },

        Property: function (expr, precedence, flags) {
            if (expr.kind === 'get' || expr.kind === 'set') {
                return [
                    expr.kind, noEmptySpace(),
                    this.generatePropertyKey(expr.key, expr.computed),
                    this.generateFunctionBody(expr.value)
                ];
            }

            if (expr.shorthand) {
                if (expr.value.type === "AssignmentPattern") {
                    return this.AssignmentPattern(expr.value, Precedence.Sequence, E_TTT);
                }
                return this.generatePropertyKey(expr.key, expr.computed);
            }

            if (expr.method) {
                return [
                    generateMethodPrefix(expr),
                    this.generatePropertyKey(expr.key, expr.computed),
                    this.generateFunctionBody(expr.value)
                ];
            }

            return [
                this.generatePropertyKey(expr.key, expr.computed),
                ':' + space,
                this.generateExpression(expr.value, Precedence.Assignment, E_TTT)
            ];
        },

        ObjectExpression: function (expr, precedence, flags) {
            var multiline, result, fragment, that = this;

            if (!expr.properties.length) {
                return '{}';
            }
            multiline = expr.properties.length > 1;

            withIndent(function () {
                fragment = that.generateExpression(expr.properties[0], Precedence.Sequence, E_TTT);
            });

            if (!multiline) {
                // issues 4
                // Do not transform from
                //   dejavu.Class.declare({
                //       method2: function () {}
                //   });
                // to
                //   dejavu.Class.declare({method2: function () {
                //       }});
                if (!hasLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
                    return [ '{', space, fragment, space, '}' ];
                }
            }

            withIndent(function (indent) {
                var i, iz;
                result = [ '{', newline, indent, fragment ];

                if (multiline) {
                    result.push(',' + newline);
                    for (i = 1, iz = expr.properties.length; i < iz; ++i) {
                        result.push(indent);
                        result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
                        if (i + 1 < iz) {
                            result.push(',' + newline);
                        }
                    }
                }
            });

            if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
                result.push(newline);
            }
            result.push(base);
            result.push('}');
            return result;
        },

        AssignmentPattern: function(expr, precedence, flags) {
            return this.generateAssignment(expr.left, expr.right, '=', precedence, flags);
        },

        ObjectPattern: function (expr, precedence, flags) {
            var result, i, iz, multiline, property, that = this;
            if (!expr.properties.length) {
                return '{}';
            }

            multiline = false;
            if (expr.properties.length === 1) {
                property = expr.properties[0];
                if (
                    property.type === Syntax.Property
                    && property.value.type !== Syntax.Identifier
                ) {
                    multiline = true;
                }
            } else {
                for (i = 0, iz = expr.properties.length; i < iz; ++i) {
                    property = expr.properties[i];
                    if (
                        property.type === Syntax.Property
                        && !property.shorthand
                    ) {
                        multiline = true;
                        break;
                    }
                }
            }
            result = ['{', multiline ? newline : '' ];

            withIndent(function (indent) {
                var i, iz;
                for (i = 0, iz = expr.properties.length; i < iz; ++i) {
                    result.push(multiline ? indent : '');
                    result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
                    if (i + 1 < iz) {
                        result.push(',' + (multiline ? newline : space));
                    }
                }
            });

            if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
                result.push(newline);
            }
            result.push(multiline ? base : '');
            result.push('}');
            return result;
        },

        ThisExpression: function (expr, precedence, flags) {
            return 'this';
        },

        Super: function (expr, precedence, flags) {
            return 'super';
        },

        Identifier: function (expr, precedence, flags) {
            return generateIdentifier(expr);
        },

        ImportDefaultSpecifier: function (expr, precedence, flags) {
            return generateIdentifier(expr.id || expr.local);
        },

        ImportNamespaceSpecifier: function (expr, precedence, flags) {
            var result = ['*'];
            var id = expr.id || expr.local;
            if (id) {
                result.push(space + 'as' + noEmptySpace() + generateIdentifier(id));
            }
            return result;
        },

        ImportSpecifier: function (expr, precedence, flags) {
            var imported = expr.imported;
            var result = [ imported.name ];
            var local = expr.local;
            if (local && local.name !== imported.name) {
                result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(local));
            }
            return result;
        },

        ExportSpecifier: function (expr, precedence, flags) {
            var local = expr.local;
            var result = [ local.name ];
            var exported = expr.exported;
            if (exported && exported.name !== local.name) {
                result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(exported));
            }
            return result;
        },

        Literal: function (expr, precedence, flags) {
            var raw;
            if (expr.hasOwnProperty('raw') && parse && extra.raw) {
                try {
                    raw = parse(expr.raw).body[0].expression;
                    if (raw.type === Syntax.Literal) {
                        if (raw.value === expr.value) {
                            return expr.raw;
                        }
                    }
                } catch (e) {
                    // not use raw property
                }
            }

            if (expr.regex) {
              return '/' + expr.regex.pattern + '/' + expr.regex.flags;
            }

            if (expr.value === null) {
                return 'null';
            }

            if (typeof expr.value === 'string') {
                return escapeString(expr.value);
            }

            if (typeof expr.value === 'number') {
                return generateNumber(expr.value);
            }

            if (typeof expr.value === 'boolean') {
                return expr.value ? 'true' : 'false';
            }

            return generateRegExp(expr.value);
        },

        GeneratorExpression: function (expr, precedence, flags) {
            return this.ComprehensionExpression(expr, precedence, flags);
        },

        ComprehensionExpression: function (expr, precedence, flags) {
            // GeneratorExpression should be parenthesized with (...), ComprehensionExpression with [...]
            // Due to https://bugzilla.mozilla.org/show_bug.cgi?id=883468 position of expr.body can differ in Spidermonkey and ES6

            var result, i, iz, fragment, that = this;
            result = (expr.type === Syntax.GeneratorExpression) ? ['('] : ['['];

            if (extra.moz.comprehensionExpressionStartsWithAssignment) {
                fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
                result.push(fragment);
            }

            if (expr.blocks) {
                withIndent(function () {
                    for (i = 0, iz = expr.blocks.length; i < iz; ++i) {
                        fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT);
                        if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) {
                            result = join(result, fragment);
                        } else {
                            result.push(fragment);
                        }
                    }
                });
            }

            if (expr.filter) {
                result = join(result, 'if' + space);
                fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT);
                result = join(result, [ '(', fragment, ')' ]);
            }

            if (!extra.moz.comprehensionExpressionStartsWithAssignment) {
                fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);

                result = join(result, fragment);
            }

            result.push((expr.type === Syntax.GeneratorExpression) ? ')' : ']');
            return result;
        },

        ComprehensionBlock: function (expr, precedence, flags) {
            var fragment;
            if (expr.left.type === Syntax.VariableDeclaration) {
                fragment = [
                    expr.left.kind, noEmptySpace(),
                    this.generateStatement(expr.left.declarations[0], S_FFFF)
                ];
            } else {
                fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT);
            }

            fragment = join(fragment, expr.of ? 'of' : 'in');
            fragment = join(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));

            return [ 'for' + space + '(', fragment, ')' ];
        },

        SpreadElement: function (expr, precedence, flags) {
            return [
                '...',
                this.generateExpression(expr.argument, Precedence.Assignment, E_TTT)
            ];
        },

        TaggedTemplateExpression: function (expr, precedence, flags) {
            var itemFlags = E_TTF;
            if (!(flags & F_ALLOW_CALL)) {
                itemFlags = E_TFF;
            }
            var result = [
                this.generateExpression(expr.tag, Precedence.Call, itemFlags),
                this.generateExpression(expr.quasi, Precedence.Primary, E_FFT)
            ];
            return parenthesize(result, Precedence.TaggedTemplate, precedence);
        },

        TemplateElement: function (expr, precedence, flags) {
            // Don't use "cooked". Since tagged template can use raw template
            // representation. So if we do so, it breaks the script semantics.
            return expr.value.raw;
        },

        TemplateLiteral: function (expr, precedence, flags) {
            var result, i, iz;
            result = [ '`' ];
            for (i = 0, iz = expr.quasis.length; i < iz; ++i) {
                result.push(this.generateExpression(expr.quasis[i], Precedence.Primary, E_TTT));
                if (i + 1 < iz) {
                    result.push('${' + space);
                    result.push(this.generateExpression(expr.expressions[i], Precedence.Sequence, E_TTT));
                    result.push(space + '}');
                }
            }
            result.push('`');
            return result;
        },

        ModuleSpecifier: function (expr, precedence, flags) {
            return this.Literal(expr, precedence, flags);
        },

        ImportExpression: function(expr, precedence, flag) {
            return parenthesize([
                'import(',
                this.generateExpression(expr.source, Precedence.Assignment, E_TTT),
                ')'
            ], Precedence.Call, precedence);
        },

    };

    merge(CodeGenerator.prototype, CodeGenerator.Expression);

    CodeGenerator.prototype.generateExpression = function (expr, precedence, flags) {
        var result, type;

        type = expr.type || Syntax.Property;

        if (extra.verbatim && expr.hasOwnProperty(extra.verbatim)) {
            return generateVerbatim(expr, precedence);
        }

        result = this[type](expr, precedence, flags);


        if (extra.comment) {
            result = addComments(expr, result);
        }
        return toSourceNodeWhenNeeded(result, expr);
    };

    CodeGenerator.prototype.generateStatement = function (stmt, flags) {
        var result,
            fragment;

        result = this[stmt.type](stmt, flags);

        // Attach comments

        if (extra.comment) {
            result = addComments(stmt, result);
        }

        fragment = toSourceNodeWhenNeeded(result).toString();
        if (stmt.type === Syntax.Program && !safeConcatenation && newline === '' &&  fragment.charAt(fragment.length - 1) === '\n') {
            result = sourceMap ? toSourceNodeWhenNeeded(result).replaceRight(/\s+$/, '') : fragment.replace(/\s+$/, '');
        }

        return toSourceNodeWhenNeeded(result, stmt);
    };

    function generateInternal(node) {
        var codegen;

        codegen = new CodeGenerator();
        if (isStatement(node)) {
            return codegen.generateStatement(node, S_TFFF);
        }

        if (isExpression(node)) {
            return codegen.generateExpression(node, Precedence.Sequence, E_TTT);
        }

        throw new Error('Unknown node type: ' + node.type);
    }

    function generate(node, options) {
        var defaultOptions = getDefaultOptions(), result, pair;

        if (options != null) {
            // Obsolete options
            //
            //   `options.indent`
            //   `options.base`
            //
            // Instead of them, we can use `option.format.indent`.
            if (typeof options.indent === 'string') {
                defaultOptions.format.indent.style = options.indent;
            }
            if (typeof options.base === 'number') {
                defaultOptions.format.indent.base = options.base;
            }
            options = updateDeeply(defaultOptions, options);
            indent = options.format.indent.style;
            if (typeof options.base === 'string') {
                base = options.base;
            } else {
                base = stringRepeat(indent, options.format.indent.base);
            }
        } else {
            options = defaultOptions;
            indent = options.format.indent.style;
            base = stringRepeat(indent, options.format.indent.base);
        }
        json = options.format.json;
        renumber = options.format.renumber;
        hexadecimal = json ? false : options.format.hexadecimal;
        quotes = json ? 'double' : options.format.quotes;
        escapeless = options.format.escapeless;
        newline = options.format.newline;
        space = options.format.space;
        if (options.format.compact) {
            newline = space = indent = base = '';
        }
        parentheses = options.format.parentheses;
        semicolons = options.format.semicolons;
        safeConcatenation = options.format.safeConcatenation;
        directive = options.directive;
        parse = json ? null : options.parse;
        sourceMap = options.sourceMap;
        sourceCode = options.sourceCode;
        preserveBlankLines = options.format.preserveBlankLines && sourceCode !== null;
        extra = options;

        if (sourceMap) {
            if (!exports.browser) {
                // We assume environment is node.js
                // And prevent from including source-map by browserify
                SourceNode = require('source-map').SourceNode;
            } else {
                SourceNode = global.sourceMap.SourceNode;
            }
        }

        result = generateInternal(node);

        if (!sourceMap) {
            pair = {code: result.toString(), map: null};
            return options.sourceMapWithCode ? pair : pair.code;
        }


        pair = result.toStringWithSourceMap({
            file: options.file,
            sourceRoot: options.sourceMapRoot
        });

        if (options.sourceContent) {
            pair.map.setSourceContent(options.sourceMap,
                                      options.sourceContent);
        }

        if (options.sourceMapWithCode) {
            return pair;
        }

        return pair.map.toString();
    }

    FORMAT_MINIFY = {
        indent: {
            style: '',
            base: 0
        },
        renumber: true,
        hexadecimal: true,
        quotes: 'auto',
        escapeless: true,
        compact: true,
        parentheses: false,
        semicolons: false
    };

    FORMAT_DEFAULTS = getDefaultOptions().format;

    exports.version = require('./package.json').version;
    exports.generate = generate;
    exports.attachComments = estraverse.attachComments;
    exports.Precedence = updateDeeply({}, Precedence);
    exports.browser = false;
    exports.FORMAT_MINIFY = FORMAT_MINIFY;
    exports.FORMAT_DEFAULTS = FORMAT_DEFAULTS;
}());
/* vim: set sw=4 ts=4 et tw=80 : */

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./package.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval/node_modules/escodegen/package.json","estraverse":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval/node_modules/estraverse/estraverse.js","esutils":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/esutils/lib/utils.js","source-map":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/source-map/source-map.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval/node_modules/escodegen/package.json":[function(require,module,exports){
module.exports={
  "_from": "escodegen@^1.8.1",
  "_id": "escodegen@1.14.3",
  "_inBundle": false,
  "_integrity": "sha1-TnuB+6YVgdyXWC7XjKt/Do1j9QM=",
  "_location": "/static-eval/escodegen",
  "_phantomChildren": {},
  "_requested": {
    "type": "range",
    "registry": true,
    "raw": "escodegen@^1.8.1",
    "name": "escodegen",
    "escapedName": "escodegen",
    "rawSpec": "^1.8.1",
    "saveSpec": null,
    "fetchSpec": "^1.8.1"
  },
  "_requiredBy": [
    "/static-eval"
  ],
  "_resolved": "https://artifactory.g.devqa.gcp.dev.paypalinc.com/artifactory/api/npm/npm-all/escodegen/-/escodegen-1.14.3.tgz",
  "_shasum": "4e7b81fba61581dc97582ed78cab7f0e8d63f503",
  "_spec": "escodegen@^1.8.1",
  "_where": "/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval",
  "bin": {
    "esgenerate": "bin/esgenerate.js",
    "escodegen": "bin/escodegen.js"
  },
  "bugs": {
    "url": "https://github.com/estools/escodegen/issues"
  },
  "bundleDependencies": false,
  "dependencies": {
    "esprima": "^4.0.1",
    "estraverse": "^4.2.0",
    "esutils": "^2.0.2",
    "optionator": "^0.8.1",
    "source-map": "~0.6.1"
  },
  "deprecated": false,
  "description": "ECMAScript code generator",
  "devDependencies": {
    "acorn": "^7.1.0",
    "bluebird": "^3.4.7",
    "bower-registry-client": "^1.0.0",
    "chai": "^3.5.0",
    "commonjs-everywhere": "^0.9.7",
    "gulp": "^3.8.10",
    "gulp-eslint": "^3.0.1",
    "gulp-mocha": "^3.0.1",
    "semver": "^5.1.0"
  },
  "engines": {
    "node": ">=4.0"
  },
  "files": [
    "LICENSE.BSD",
    "README.md",
    "bin",
    "escodegen.js",
    "package.json"
  ],
  "homepage": "http://github.com/estools/escodegen",
  "license": "BSD-2-Clause",
  "main": "escodegen.js",
  "maintainers": [
    {
      "name": "Yusuke Suzuki",
      "email": "utatane.tea@gmail.com",
      "url": "http://github.com/Constellation"
    }
  ],
  "name": "escodegen",
  "optionalDependencies": {
    "source-map": "~0.6.1"
  },
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/estools/escodegen.git"
  },
  "scripts": {
    "build": "cjsify -a path: tools/entry-point.js > escodegen.browser.js",
    "build-min": "cjsify -ma path: tools/entry-point.js > escodegen.browser.min.js",
    "lint": "gulp lint",
    "release": "node tools/release.js",
    "test": "gulp travis",
    "unit-test": "gulp test"
  },
  "version": "1.14.3"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval/node_modules/estraverse/estraverse.js":[function(require,module,exports){
/*
  Copyright (C) 2012-2013 Yusuke Suzuki <utatane.tea@gmail.com>
  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*jslint vars:false, bitwise:true*/
/*jshint indent:4*/
/*global exports:true*/
(function clone(exports) {
    'use strict';

    var Syntax,
        VisitorOption,
        VisitorKeys,
        BREAK,
        SKIP,
        REMOVE;

    function deepCopy(obj) {
        var ret = {}, key, val;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                val = obj[key];
                if (typeof val === 'object' && val !== null) {
                    ret[key] = deepCopy(val);
                } else {
                    ret[key] = val;
                }
            }
        }
        return ret;
    }

    // based on LLVM libc++ upper_bound / lower_bound
    // MIT License

    function upperBound(array, func) {
        var diff, len, i, current;

        len = array.length;
        i = 0;

        while (len) {
            diff = len >>> 1;
            current = i + diff;
            if (func(array[current])) {
                len = diff;
            } else {
                i = current + 1;
                len -= diff + 1;
            }
        }
        return i;
    }

    Syntax = {
        AssignmentExpression: 'AssignmentExpression',
        AssignmentPattern: 'AssignmentPattern',
        ArrayExpression: 'ArrayExpression',
        ArrayPattern: 'ArrayPattern',
        ArrowFunctionExpression: 'ArrowFunctionExpression',
        AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7.
        BlockStatement: 'BlockStatement',
        BinaryExpression: 'BinaryExpression',
        BreakStatement: 'BreakStatement',
        CallExpression: 'CallExpression',
        CatchClause: 'CatchClause',
        ClassBody: 'ClassBody',
        ClassDeclaration: 'ClassDeclaration',
        ClassExpression: 'ClassExpression',
        ComprehensionBlock: 'ComprehensionBlock',  // CAUTION: It's deferred to ES7.
        ComprehensionExpression: 'ComprehensionExpression',  // CAUTION: It's deferred to ES7.
        ConditionalExpression: 'ConditionalExpression',
        ContinueStatement: 'ContinueStatement',
        DebuggerStatement: 'DebuggerStatement',
        DirectiveStatement: 'DirectiveStatement',
        DoWhileStatement: 'DoWhileStatement',
        EmptyStatement: 'EmptyStatement',
        ExportAllDeclaration: 'ExportAllDeclaration',
        ExportDefaultDeclaration: 'ExportDefaultDeclaration',
        ExportNamedDeclaration: 'ExportNamedDeclaration',
        ExportSpecifier: 'ExportSpecifier',
        ExpressionStatement: 'ExpressionStatement',
        ForStatement: 'ForStatement',
        ForInStatement: 'ForInStatement',
        ForOfStatement: 'ForOfStatement',
        FunctionDeclaration: 'FunctionDeclaration',
        FunctionExpression: 'FunctionExpression',
        GeneratorExpression: 'GeneratorExpression',  // CAUTION: It's deferred to ES7.
        Identifier: 'Identifier',
        IfStatement: 'IfStatement',
        ImportExpression: 'ImportExpression',
        ImportDeclaration: 'ImportDeclaration',
        ImportDefaultSpecifier: 'ImportDefaultSpecifier',
        ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
        ImportSpecifier: 'ImportSpecifier',
        Literal: 'Literal',
        LabeledStatement: 'LabeledStatement',
        LogicalExpression: 'LogicalExpression',
        MemberExpression: 'MemberExpression',
        MetaProperty: 'MetaProperty',
        MethodDefinition: 'MethodDefinition',
        ModuleSpecifier: 'ModuleSpecifier',
        NewExpression: 'NewExpression',
        ObjectExpression: 'ObjectExpression',
        ObjectPattern: 'ObjectPattern',
        Program: 'Program',
        Property: 'Property',
        RestElement: 'RestElement',
        ReturnStatement: 'ReturnStatement',
        SequenceExpression: 'SequenceExpression',
        SpreadElement: 'SpreadElement',
        Super: 'Super',
        SwitchStatement: 'SwitchStatement',
        SwitchCase: 'SwitchCase',
        TaggedTemplateExpression: 'TaggedTemplateExpression',
        TemplateElement: 'TemplateElement',
        TemplateLiteral: 'TemplateLiteral',
        ThisExpression: 'ThisExpression',
        ThrowStatement: 'ThrowStatement',
        TryStatement: 'TryStatement',
        UnaryExpression: 'UnaryExpression',
        UpdateExpression: 'UpdateExpression',
        VariableDeclaration: 'VariableDeclaration',
        VariableDeclarator: 'VariableDeclarator',
        WhileStatement: 'WhileStatement',
        WithStatement: 'WithStatement',
        YieldExpression: 'YieldExpression'
    };

    VisitorKeys = {
        AssignmentExpression: ['left', 'right'],
        AssignmentPattern: ['left', 'right'],
        ArrayExpression: ['elements'],
        ArrayPattern: ['elements'],
        ArrowFunctionExpression: ['params', 'body'],
        AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7.
        BlockStatement: ['body'],
        BinaryExpression: ['left', 'right'],
        BreakStatement: ['label'],
        CallExpression: ['callee', 'arguments'],
        CatchClause: ['param', 'body'],
        ClassBody: ['body'],
        ClassDeclaration: ['id', 'superClass', 'body'],
        ClassExpression: ['id', 'superClass', 'body'],
        ComprehensionBlock: ['left', 'right'],  // CAUTION: It's deferred to ES7.
        ComprehensionExpression: ['blocks', 'filter', 'body'],  // CAUTION: It's deferred to ES7.
        ConditionalExpression: ['test', 'consequent', 'alternate'],
        ContinueStatement: ['label'],
        DebuggerStatement: [],
        DirectiveStatement: [],
        DoWhileStatement: ['body', 'test'],
        EmptyStatement: [],
        ExportAllDeclaration: ['source'],
        ExportDefaultDeclaration: ['declaration'],
        ExportNamedDeclaration: ['declaration', 'specifiers', 'source'],
        ExportSpecifier: ['exported', 'local'],
        ExpressionStatement: ['expression'],
        ForStatement: ['init', 'test', 'update', 'body'],
        ForInStatement: ['left', 'right', 'body'],
        ForOfStatement: ['left', 'right', 'body'],
        FunctionDeclaration: ['id', 'params', 'body'],
        FunctionExpression: ['id', 'params', 'body'],
        GeneratorExpression: ['blocks', 'filter', 'body'],  // CAUTION: It's deferred to ES7.
        Identifier: [],
        IfStatement: ['test', 'consequent', 'alternate'],
        ImportExpression: ['source'],
        ImportDeclaration: ['specifiers', 'source'],
        ImportDefaultSpecifier: ['local'],
        ImportNamespaceSpecifier: ['local'],
        ImportSpecifier: ['imported', 'local'],
        Literal: [],
        LabeledStatement: ['label', 'body'],
        LogicalExpression: ['left', 'right'],
        MemberExpression: ['object', 'property'],
        MetaProperty: ['meta', 'property'],
        MethodDefinition: ['key', 'value'],
        ModuleSpecifier: [],
        NewExpression: ['callee', 'arguments'],
        ObjectExpression: ['properties'],
        ObjectPattern: ['properties'],
        Program: ['body'],
        Property: ['key', 'value'],
        RestElement: [ 'argument' ],
        ReturnStatement: ['argument'],
        SequenceExpression: ['expressions'],
        SpreadElement: ['argument'],
        Super: [],
        SwitchStatement: ['discriminant', 'cases'],
        SwitchCase: ['test', 'consequent'],
        TaggedTemplateExpression: ['tag', 'quasi'],
        TemplateElement: [],
        TemplateLiteral: ['quasis', 'expressions'],
        ThisExpression: [],
        ThrowStatement: ['argument'],
        TryStatement: ['block', 'handler', 'finalizer'],
        UnaryExpression: ['argument'],
        UpdateExpression: ['argument'],
        VariableDeclaration: ['declarations'],
        VariableDeclarator: ['id', 'init'],
        WhileStatement: ['test', 'body'],
        WithStatement: ['object', 'body'],
        YieldExpression: ['argument']
    };

    // unique id
    BREAK = {};
    SKIP = {};
    REMOVE = {};

    VisitorOption = {
        Break: BREAK,
        Skip: SKIP,
        Remove: REMOVE
    };

    function Reference(parent, key) {
        this.parent = parent;
        this.key = key;
    }

    Reference.prototype.replace = function replace(node) {
        this.parent[this.key] = node;
    };

    Reference.prototype.remove = function remove() {
        if (Array.isArray(this.parent)) {
            this.parent.splice(this.key, 1);
            return true;
        } else {
            this.replace(null);
            return false;
        }
    };

    function Element(node, path, wrap, ref) {
        this.node = node;
        this.path = path;
        this.wrap = wrap;
        this.ref = ref;
    }

    function Controller() { }

    // API:
    // return property path array from root to current node
    Controller.prototype.path = function path() {
        var i, iz, j, jz, result, element;

        function addToPath(result, path) {
            if (Array.isArray(path)) {
                for (j = 0, jz = path.length; j < jz; ++j) {
                    result.push(path[j]);
                }
            } else {
                result.push(path);
            }
        }

        // root node
        if (!this.__current.path) {
            return null;
        }

        // first node is sentinel, second node is root element
        result = [];
        for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {
            element = this.__leavelist[i];
            addToPath(result, element.path);
        }
        addToPath(result, this.__current.path);
        return result;
    };

    // API:
    // return type of current node
    Controller.prototype.type = function () {
        var node = this.current();
        return node.type || this.__current.wrap;
    };

    // API:
    // return array of parent elements
    Controller.prototype.parents = function parents() {
        var i, iz, result;

        // first node is sentinel
        result = [];
        for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {
            result.push(this.__leavelist[i].node);
        }

        return result;
    };

    // API:
    // return current node
    Controller.prototype.current = function current() {
        return this.__current.node;
    };

    Controller.prototype.__execute = function __execute(callback, element) {
        var previous, result;

        result = undefined;

        previous  = this.__current;
        this.__current = element;
        this.__state = null;
        if (callback) {
            result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);
        }
        this.__current = previous;

        return result;
    };

    // API:
    // notify control skip / break
    Controller.prototype.notify = function notify(flag) {
        this.__state = flag;
    };

    // API:
    // skip child nodes of current node
    Controller.prototype.skip = function () {
        this.notify(SKIP);
    };

    // API:
    // break traversals
    Controller.prototype['break'] = function () {
        this.notify(BREAK);
    };

    // API:
    // remove node
    Controller.prototype.remove = function () {
        this.notify(REMOVE);
    };

    Controller.prototype.__initialize = function(root, visitor) {
        this.visitor = visitor;
        this.root = root;
        this.__worklist = [];
        this.__leavelist = [];
        this.__current = null;
        this.__state = null;
        this.__fallback = null;
        if (visitor.fallback === 'iteration') {
            this.__fallback = Object.keys;
        } else if (typeof visitor.fallback === 'function') {
            this.__fallback = visitor.fallback;
        }

        this.__keys = VisitorKeys;
        if (visitor.keys) {
            this.__keys = Object.assign(Object.create(this.__keys), visitor.keys);
        }
    };

    function isNode(node) {
        if (node == null) {
            return false;
        }
        return typeof node === 'object' && typeof node.type === 'string';
    }

    function isProperty(nodeType, key) {
        return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;
    }

    Controller.prototype.traverse = function traverse(root, visitor) {
        var worklist,
            leavelist,
            element,
            node,
            nodeType,
            ret,
            key,
            current,
            current2,
            candidates,
            candidate,
            sentinel;

        this.__initialize(root, visitor);

        sentinel = {};

        // reference
        worklist = this.__worklist;
        leavelist = this.__leavelist;

        // initialize
        worklist.push(new Element(root, null, null, null));
        leavelist.push(new Element(null, null, null, null));

        while (worklist.length) {
            element = worklist.pop();

            if (element === sentinel) {
                element = leavelist.pop();

                ret = this.__execute(visitor.leave, element);

                if (this.__state === BREAK || ret === BREAK) {
                    return;
                }
                continue;
            }

            if (element.node) {

                ret = this.__execute(visitor.enter, element);

                if (this.__state === BREAK || ret === BREAK) {
                    return;
                }

                worklist.push(sentinel);
                leavelist.push(element);

                if (this.__state === SKIP || ret === SKIP) {
                    continue;
                }

                node = element.node;
                nodeType = node.type || element.wrap;
                candidates = this.__keys[nodeType];
                if (!candidates) {
                    if (this.__fallback) {
                        candidates = this.__fallback(node);
                    } else {
                        throw new Error('Unknown node type ' + nodeType + '.');
                    }
                }

                current = candidates.length;
                while ((current -= 1) >= 0) {
                    key = candidates[current];
                    candidate = node[key];
                    if (!candidate) {
                        continue;
                    }

                    if (Array.isArray(candidate)) {
                        current2 = candidate.length;
                        while ((current2 -= 1) >= 0) {
                            if (!candidate[current2]) {
                                continue;
                            }
                            if (isProperty(nodeType, candidates[current])) {
                                element = new Element(candidate[current2], [key, current2], 'Property', null);
                            } else if (isNode(candidate[current2])) {
                                element = new Element(candidate[current2], [key, current2], null, null);
                            } else {
                                continue;
                            }
                            worklist.push(element);
                        }
                    } else if (isNode(candidate)) {
                        worklist.push(new Element(candidate, key, null, null));
                    }
                }
            }
        }
    };

    Controller.prototype.replace = function replace(root, visitor) {
        var worklist,
            leavelist,
            node,
            nodeType,
            target,
            element,
            current,
            current2,
            candidates,
            candidate,
            sentinel,
            outer,
            key;

        function removeElem(element) {
            var i,
                key,
                nextElem,
                parent;

            if (element.ref.remove()) {
                // When the reference is an element of an array.
                key = element.ref.key;
                parent = element.ref.parent;

                // If removed from array, then decrease following items' keys.
                i = worklist.length;
                while (i--) {
                    nextElem = worklist[i];
                    if (nextElem.ref && nextElem.ref.parent === parent) {
                        if  (nextElem.ref.key < key) {
                            break;
                        }
                        --nextElem.ref.key;
                    }
                }
            }
        }

        this.__initialize(root, visitor);

        sentinel = {};

        // reference
        worklist = this.__worklist;
        leavelist = this.__leavelist;

        // initialize
        outer = {
            root: root
        };
        element = new Element(root, null, null, new Reference(outer, 'root'));
        worklist.push(element);
        leavelist.push(element);

        while (worklist.length) {
            element = worklist.pop();

            if (element === sentinel) {
                element = leavelist.pop();

                target = this.__execute(visitor.leave, element);

                // node may be replaced with null,
                // so distinguish between undefined and null in this place
                if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
                    // replace
                    element.ref.replace(target);
                }

                if (this.__state === REMOVE || target === REMOVE) {
                    removeElem(element);
                }

                if (this.__state === BREAK || target === BREAK) {
                    return outer.root;
                }
                continue;
            }

            target = this.__execute(visitor.enter, element);

            // node may be replaced with null,
            // so distinguish between undefined and null in this place
            if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
                // replace
                element.ref.replace(target);
                element.node = target;
            }

            if (this.__state === REMOVE || target === REMOVE) {
                removeElem(element);
                element.node = null;
            }

            if (this.__state === BREAK || target === BREAK) {
                return outer.root;
            }

            // node may be null
            node = element.node;
            if (!node) {
                continue;
            }

            worklist.push(sentinel);
            leavelist.push(element);

            if (this.__state === SKIP || target === SKIP) {
                continue;
            }

            nodeType = node.type || element.wrap;
            candidates = this.__keys[nodeType];
            if (!candidates) {
                if (this.__fallback) {
                    candidates = this.__fallback(node);
                } else {
                    throw new Error('Unknown node type ' + nodeType + '.');
                }
            }

            current = candidates.length;
            while ((current -= 1) >= 0) {
                key = candidates[current];
                candidate = node[key];
                if (!candidate) {
                    continue;
                }

                if (Array.isArray(candidate)) {
                    current2 = candidate.length;
                    while ((current2 -= 1) >= 0) {
                        if (!candidate[current2]) {
                            continue;
                        }
                        if (isProperty(nodeType, candidates[current])) {
                            element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));
                        } else if (isNode(candidate[current2])) {
                            element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));
                        } else {
                            continue;
                        }
                        worklist.push(element);
                    }
                } else if (isNode(candidate)) {
                    worklist.push(new Element(candidate, key, null, new Reference(node, key)));
                }
            }
        }

        return outer.root;
    };

    function traverse(root, visitor) {
        var controller = new Controller();
        return controller.traverse(root, visitor);
    }

    function replace(root, visitor) {
        var controller = new Controller();
        return controller.replace(root, visitor);
    }

    function extendCommentRange(comment, tokens) {
        var target;

        target = upperBound(tokens, function search(token) {
            return token.range[0] > comment.range[0];
        });

        comment.extendedRange = [comment.range[0], comment.range[1]];

        if (target !== tokens.length) {
            comment.extendedRange[1] = tokens[target].range[0];
        }

        target -= 1;
        if (target >= 0) {
            comment.extendedRange[0] = tokens[target].range[1];
        }

        return comment;
    }

    function attachComments(tree, providedComments, tokens) {
        // At first, we should calculate extended comment ranges.
        var comments = [], comment, len, i, cursor;

        if (!tree.range) {
            throw new Error('attachComments needs range information');
        }

        // tokens array is empty, we attach comments to tree as 'leadingComments'
        if (!tokens.length) {
            if (providedComments.length) {
                for (i = 0, len = providedComments.length; i < len; i += 1) {
                    comment = deepCopy(providedComments[i]);
                    comment.extendedRange = [0, tree.range[0]];
                    comments.push(comment);
                }
                tree.leadingComments = comments;
            }
            return tree;
        }

        for (i = 0, len = providedComments.length; i < len; i += 1) {
            comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));
        }

        // This is based on John Freeman's implementation.
        cursor = 0;
        traverse(tree, {
            enter: function (node) {
                var comment;

                while (cursor < comments.length) {
                    comment = comments[cursor];
                    if (comment.extendedRange[1] > node.range[0]) {
                        break;
                    }

                    if (comment.extendedRange[1] === node.range[0]) {
                        if (!node.leadingComments) {
                            node.leadingComments = [];
                        }
                        node.leadingComments.push(comment);
                        comments.splice(cursor, 1);
                    } else {
                        cursor += 1;
                    }
                }

                // already out of owned node
                if (cursor === comments.length) {
                    return VisitorOption.Break;
                }

                if (comments[cursor].extendedRange[0] > node.range[1]) {
                    return VisitorOption.Skip;
                }
            }
        });

        cursor = 0;
        traverse(tree, {
            leave: function (node) {
                var comment;

                while (cursor < comments.length) {
                    comment = comments[cursor];
                    if (node.range[1] < comment.extendedRange[0]) {
                        break;
                    }

                    if (node.range[1] === comment.extendedRange[0]) {
                        if (!node.trailingComments) {
                            node.trailingComments = [];
                        }
                        node.trailingComments.push(comment);
                        comments.splice(cursor, 1);
                    } else {
                        cursor += 1;
                    }
                }

                // already out of owned node
                if (cursor === comments.length) {
                    return VisitorOption.Break;
                }

                if (comments[cursor].extendedRange[0] > node.range[1]) {
                    return VisitorOption.Skip;
                }
            }
        });

        return tree;
    }

    exports.version = require('./package.json').version;
    exports.Syntax = Syntax;
    exports.traverse = traverse;
    exports.replace = replace;
    exports.attachComments = attachComments;
    exports.VisitorKeys = VisitorKeys;
    exports.VisitorOption = VisitorOption;
    exports.Controller = Controller;
    exports.cloneEnvironment = function () { return clone({}); };

    return exports;
}(exports));
/* vim: set sw=4 ts=4 et tw=80 : */

},{"./package.json":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval/node_modules/estraverse/package.json"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval/node_modules/estraverse/package.json":[function(require,module,exports){
module.exports={
  "_from": "estraverse@^4.2.0",
  "_id": "estraverse@4.3.0",
  "_inBundle": false,
  "_integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=",
  "_location": "/static-eval/estraverse",
  "_phantomChildren": {},
  "_requested": {
    "type": "range",
    "registry": true,
    "raw": "estraverse@^4.2.0",
    "name": "estraverse",
    "escapedName": "estraverse",
    "rawSpec": "^4.2.0",
    "saveSpec": null,
    "fetchSpec": "^4.2.0"
  },
  "_requiredBy": [
    "/static-eval/escodegen"
  ],
  "_resolved": "https://artifactory.g.devqa.gcp.dev.paypalinc.com/artifactory/api/npm/npm-all/estraverse/-/estraverse-4.3.0.tgz",
  "_shasum": "398ad3f3c5a24948be7725e83d11a7de28cdbd1d",
  "_spec": "estraverse@^4.2.0",
  "_where": "/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/static-eval/node_modules/escodegen",
  "bugs": {
    "url": "https://github.com/estools/estraverse/issues"
  },
  "bundleDependencies": false,
  "deprecated": false,
  "description": "ECMAScript JS AST traversal functions",
  "devDependencies": {
    "babel-preset-env": "^1.6.1",
    "babel-register": "^6.3.13",
    "chai": "^2.1.1",
    "espree": "^1.11.0",
    "gulp": "^3.8.10",
    "gulp-bump": "^0.2.2",
    "gulp-filter": "^2.0.0",
    "gulp-git": "^1.0.1",
    "gulp-tag-version": "^1.3.0",
    "jshint": "^2.5.6",
    "mocha": "^2.1.0"
  },
  "engines": {
    "node": ">=4.0"
  },
  "homepage": "https://github.com/estools/estraverse",
  "license": "BSD-2-Clause",
  "main": "estraverse.js",
  "maintainers": [
    {
      "name": "Yusuke Suzuki",
      "email": "utatane.tea@gmail.com",
      "url": "http://github.com/Constellation"
    }
  ],
  "name": "estraverse",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/estools/estraverse.git"
  },
  "scripts": {
    "lint": "jshint estraverse.js",
    "test": "npm run-script lint && npm run-script unit-test",
    "unit-test": "mocha --compilers js:babel-register"
  },
  "version": "4.3.0"
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/stream-browserify/index.js":[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

module.exports = Stream;

var EE = require('events').EventEmitter;
var inherits = require('inherits');

inherits(Stream, EE);
Stream.Readable = require('readable-stream/readable.js');
Stream.Writable = require('readable-stream/writable.js');
Stream.Duplex = require('readable-stream/duplex.js');
Stream.Transform = require('readable-stream/transform.js');
Stream.PassThrough = require('readable-stream/passthrough.js');

// Backwards-compat with node 0.4.x
Stream.Stream = Stream;



// old-style streams.  Note that the pipe method (the only relevant
// part of this class) is overridden in the Readable class.

function Stream() {
  EE.call(this);
}

Stream.prototype.pipe = function(dest, options) {
  var source = this;

  function ondata(chunk) {
    if (dest.writable) {
      if (false === dest.write(chunk) && source.pause) {
        source.pause();
      }
    }
  }

  source.on('data', ondata);

  function ondrain() {
    if (source.readable && source.resume) {
      source.resume();
    }
  }

  dest.on('drain', ondrain);

  // If the 'end' option is not supplied, dest.end() will be called when
  // source gets the 'end' or 'close' events.  Only dest.end() once.
  if (!dest._isStdio && (!options || options.end !== false)) {
    source.on('end', onend);
    source.on('close', onclose);
  }

  var didOnEnd = false;
  function onend() {
    if (didOnEnd) return;
    didOnEnd = true;

    dest.end();
  }


  function onclose() {
    if (didOnEnd) return;
    didOnEnd = true;

    if (typeof dest.destroy === 'function') dest.destroy();
  }

  // don't leave dangling pipes when there are errors.
  function onerror(er) {
    cleanup();
    if (EE.listenerCount(this, 'error') === 0) {
      throw er; // Unhandled stream error in pipe.
    }
  }

  source.on('error', onerror);
  dest.on('error', onerror);

  // remove all the event listeners that were added.
  function cleanup() {
    source.removeListener('data', ondata);
    dest.removeListener('drain', ondrain);

    source.removeListener('end', onend);
    source.removeListener('close', onclose);

    source.removeListener('error', onerror);
    dest.removeListener('error', onerror);

    source.removeListener('end', cleanup);
    source.removeListener('close', cleanup);

    dest.removeListener('close', cleanup);
  }

  source.on('end', cleanup);
  source.on('close', cleanup);

  dest.on('close', cleanup);

  dest.emit('pipe', source);

  // Allow for unix-like usage: A.pipe(B).pipe(C)
  return dest;
};

},{"events":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/events/events.js","inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/inherits/inherits_browser.js","readable-stream/duplex.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/duplex-browser.js","readable-stream/passthrough.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/passthrough.js","readable-stream/readable.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/readable-browser.js","readable-stream/transform.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/transform.js","readable-stream/writable.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/readable-stream/writable-browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/string_decoder/lib/string_decoder.js":[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

/*<replacement>*/

var Buffer = require('safe-buffer').Buffer;
/*</replacement>*/

var isEncoding = Buffer.isEncoding || function (encoding) {
  encoding = '' + encoding;
  switch (encoding && encoding.toLowerCase()) {
    case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
      return true;
    default:
      return false;
  }
};

function _normalizeEncoding(enc) {
  if (!enc) return 'utf8';
  var retried;
  while (true) {
    switch (enc) {
      case 'utf8':
      case 'utf-8':
        return 'utf8';
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return 'utf16le';
      case 'latin1':
      case 'binary':
        return 'latin1';
      case 'base64':
      case 'ascii':
      case 'hex':
        return enc;
      default:
        if (retried) return; // undefined
        enc = ('' + enc).toLowerCase();
        retried = true;
    }
  }
};

// Do not cache `Buffer.isEncoding` when checking encoding names as some
// modules monkey-patch it to support additional encodings
function normalizeEncoding(enc) {
  var nenc = _normalizeEncoding(enc);
  if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
  return nenc || enc;
}

// StringDecoder provides an interface for efficiently splitting a series of
// buffers into a series of JS strings without breaking apart multi-byte
// characters.
exports.StringDecoder = StringDecoder;
function StringDecoder(encoding) {
  this.encoding = normalizeEncoding(encoding);
  var nb;
  switch (this.encoding) {
    case 'utf16le':
      this.text = utf16Text;
      this.end = utf16End;
      nb = 4;
      break;
    case 'utf8':
      this.fillLast = utf8FillLast;
      nb = 4;
      break;
    case 'base64':
      this.text = base64Text;
      this.end = base64End;
      nb = 3;
      break;
    default:
      this.write = simpleWrite;
      this.end = simpleEnd;
      return;
  }
  this.lastNeed = 0;
  this.lastTotal = 0;
  this.lastChar = Buffer.allocUnsafe(nb);
}

StringDecoder.prototype.write = function (buf) {
  if (buf.length === 0) return '';
  var r;
  var i;
  if (this.lastNeed) {
    r = this.fillLast(buf);
    if (r === undefined) return '';
    i = this.lastNeed;
    this.lastNeed = 0;
  } else {
    i = 0;
  }
  if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
  return r || '';
};

StringDecoder.prototype.end = utf8End;

// Returns only complete characters in a Buffer
StringDecoder.prototype.text = utf8Text;

// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
StringDecoder.prototype.fillLast = function (buf) {
  if (this.lastNeed <= buf.length) {
    buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  }
  buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
  this.lastNeed -= buf.length;
};

// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
// continuation byte. If an invalid byte is detected, -2 is returned.
function utf8CheckByte(byte) {
  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
  return byte >> 6 === 0x02 ? -1 : -2;
}

// Checks at most 3 bytes at the end of a Buffer in order to detect an
// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
// needed to complete the UTF-8 character (if applicable) are returned.
function utf8CheckIncomplete(self, buf, i) {
  var j = buf.length - 1;
  if (j < i) return 0;
  var nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) self.lastNeed = nb - 1;
    return nb;
  }
  if (--j < i || nb === -2) return 0;
  nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) self.lastNeed = nb - 2;
    return nb;
  }
  if (--j < i || nb === -2) return 0;
  nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) {
      if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
    }
    return nb;
  }
  return 0;
}

// Validates as many continuation bytes for a multi-byte UTF-8 character as
// needed or are available. If we see a non-continuation byte where we expect
// one, we "replace" the validated continuation bytes we've seen so far with
// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
// behavior. The continuation byte check is included three times in the case
// where all of the continuation bytes for a character exist in the same buffer.
// It is also done this way as a slight performance increase instead of using a
// loop.
function utf8CheckExtraBytes(self, buf, p) {
  if ((buf[0] & 0xC0) !== 0x80) {
    self.lastNeed = 0;
    return '\ufffd';
  }
  if (self.lastNeed > 1 && buf.length > 1) {
    if ((buf[1] & 0xC0) !== 0x80) {
      self.lastNeed = 1;
      return '\ufffd';
    }
    if (self.lastNeed > 2 && buf.length > 2) {
      if ((buf[2] & 0xC0) !== 0x80) {
        self.lastNeed = 2;
        return '\ufffd';
      }
    }
  }
}

// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
function utf8FillLast(buf) {
  var p = this.lastTotal - this.lastNeed;
  var r = utf8CheckExtraBytes(this, buf, p);
  if (r !== undefined) return r;
  if (this.lastNeed <= buf.length) {
    buf.copy(this.lastChar, p, 0, this.lastNeed);
    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  }
  buf.copy(this.lastChar, p, 0, buf.length);
  this.lastNeed -= buf.length;
}

// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
// partial character, the character's bytes are buffered until the required
// number of bytes are available.
function utf8Text(buf, i) {
  var total = utf8CheckIncomplete(this, buf, i);
  if (!this.lastNeed) return buf.toString('utf8', i);
  this.lastTotal = total;
  var end = buf.length - (total - this.lastNeed);
  buf.copy(this.lastChar, 0, end);
  return buf.toString('utf8', i, end);
}

// For UTF-8, a replacement character is added when ending on a partial
// character.
function utf8End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) return r + '\ufffd';
  return r;
}

// UTF-16LE typically needs two bytes per character, but even if we have an even
// number of bytes available, we need to check if we end on a leading/high
// surrogate. In that case, we need to wait for the next two bytes in order to
// decode the last character properly.
function utf16Text(buf, i) {
  if ((buf.length - i) % 2 === 0) {
    var r = buf.toString('utf16le', i);
    if (r) {
      var c = r.charCodeAt(r.length - 1);
      if (c >= 0xD800 && c <= 0xDBFF) {
        this.lastNeed = 2;
        this.lastTotal = 4;
        this.lastChar[0] = buf[buf.length - 2];
        this.lastChar[1] = buf[buf.length - 1];
        return r.slice(0, -1);
      }
    }
    return r;
  }
  this.lastNeed = 1;
  this.lastTotal = 2;
  this.lastChar[0] = buf[buf.length - 1];
  return buf.toString('utf16le', i, buf.length - 1);
}

// For UTF-16LE we do not explicitly append special replacement characters if we
// end on a partial character, we simply let v8 handle that.
function utf16End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) {
    var end = this.lastTotal - this.lastNeed;
    return r + this.lastChar.toString('utf16le', 0, end);
  }
  return r;
}

function base64Text(buf, i) {
  var n = (buf.length - i) % 3;
  if (n === 0) return buf.toString('base64', i);
  this.lastNeed = 3 - n;
  this.lastTotal = 3;
  if (n === 1) {
    this.lastChar[0] = buf[buf.length - 1];
  } else {
    this.lastChar[0] = buf[buf.length - 2];
    this.lastChar[1] = buf[buf.length - 1];
  }
  return buf.toString('base64', i, buf.length - n);
}

function base64End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
  return r;
}

// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
function simpleWrite(buf) {
  return buf.toString(this.encoding);
}

function simpleEnd(buf) {
  return buf && buf.length ? this.write(buf) : '';
}
},{"safe-buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/safe-buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/timers-browserify/main.js":[function(require,module,exports){
(function (setImmediate,clearImmediate){(function (){
var nextTick = require('process/browser.js').nextTick;
var apply = Function.prototype.apply;
var slice = Array.prototype.slice;
var immediateIds = {};
var nextImmediateId = 0;

// DOM APIs, for completeness

exports.setTimeout = function() {
  return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
};
exports.setInterval = function() {
  return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
};
exports.clearTimeout =
exports.clearInterval = function(timeout) { timeout.close(); };

function Timeout(id, clearFn) {
  this._id = id;
  this._clearFn = clearFn;
}
Timeout.prototype.unref = Timeout.prototype.ref = function() {};
Timeout.prototype.close = function() {
  this._clearFn.call(window, this._id);
};

// Does not start the time, just sets up the members needed.
exports.enroll = function(item, msecs) {
  clearTimeout(item._idleTimeoutId);
  item._idleTimeout = msecs;
};

exports.unenroll = function(item) {
  clearTimeout(item._idleTimeoutId);
  item._idleTimeout = -1;
};

exports._unrefActive = exports.active = function(item) {
  clearTimeout(item._idleTimeoutId);

  var msecs = item._idleTimeout;
  if (msecs >= 0) {
    item._idleTimeoutId = setTimeout(function onTimeout() {
      if (item._onTimeout)
        item._onTimeout();
    }, msecs);
  }
};

// That's not how node.js implements it but the exposed api is the same.
exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) {
  var id = nextImmediateId++;
  var args = arguments.length < 2 ? false : slice.call(arguments, 1);

  immediateIds[id] = true;

  nextTick(function onNextTick() {
    if (immediateIds[id]) {
      // fn.call() is faster so we optimize for the common use-case
      // @see http://jsperf.com/call-apply-segu
      if (args) {
        fn.apply(null, args);
      } else {
        fn.call(null);
      }
      // Prevent ids from leaking
      exports.clearImmediate(id);
    }
  });

  return id;
};

exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) {
  delete immediateIds[id];
};
}).call(this)}).call(this,require("timers").setImmediate,require("timers").clearImmediate)
},{"process/browser.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","timers":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/timers-browserify/main.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/index.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});
var Tlv = exports.Tlv = require('./lib/Tlv').default;
var TlvList = exports.TlvList = require('./lib/TlvList').default;
var Tags = exports.Tags = require('./lib/Tags').default;
var ValueFormat = exports.ValueFormat = require('./lib/ValueFormat').default;
var DefinedTag = exports.DefinedTag = require('./lib/DefinedTag').default;
var ApduCommand = exports.ApduCommand = require('./lib/apdu/Command').default;
var ApduResponse = exports.ApduResponse = require('./lib/apdu/Response').default;
var Ber = exports.Ber = require('./lib/ber').default;
},{"./lib/DefinedTag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/DefinedTag.js","./lib/Tags":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/Tags.js","./lib/Tlv":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/Tlv.js","./lib/TlvList":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/TlvList.js","./lib/ValueFormat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/ValueFormat.js","./lib/apdu/Command":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/apdu/Command.js","./lib/apdu/Response":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/apdu/Response.js","./lib/ber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/ber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/DefinedTag.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _ValueFormat = require('./ValueFormat');

var _ValueFormat2 = _interopRequireDefault(_ValueFormat);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var allTags = {};
var tagsByName = {};

/**
 * A defined tag represents a TLV format tag with a known type and purpose.
 * Because the TLV format will accommodate any "tag id," not all TLVs encountered
 * in a message will have a matching DefinedTag
 * @class
 * @property {string} name The name of the tag @readOnly
 * @property {int} number The numeric 'index' of this tag @readOnly
 * @property {ValueFormat} format The format of values of this type @readOnly
 * @property {int} length (optional) the length of the value, if fixed @readOnly
 * @property {bool} addToKnownTags (optional) if ===false, do not add this to the
 *  tags for findTag/findTags.
 */

var DefinedTag = function () {
  function DefinedTag(name, number, format, length) {
    var addToKnownTags = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;

    _classCallCheck(this, DefinedTag);

    this.name = name;
    this.number = number;
    this.format = format;
    this.length = length;
    if (addToKnownTags !== false) {
      if (allTags[number]) {
        allTags[number].push(this);
      } else {
        allTags[number] = [this];
      }
      tagsByName[name] = this;
    }
  }

  _createClass(DefinedTag, [{
    key: 'valueFromBytes',
    value: function valueFromBytes(bytes) {
      return this.format ? this.format.fromBytes(bytes, this.length) : bytes;
    }
  }, {
    key: 'valueToBytes',
    value: function valueToBytes(value) {
      return this.format.toBytes(value, this.length);
    }
  }], [{
    key: 'findTags',
    value: function findTags(number) {
      if (allTags[number]) {
        return allTags[number];
      }
      return [new DefinedTag('UnknownTag', number, _ValueFormat2.default.Binary, null, false)];
    }
  }, {
    key: 'getTagsByName',
    value: function getTagsByName() {
      return tagsByName;
    }
  }, {
    key: 'findTag',
    value: function findTag(number) {
      return DefinedTag.findTags(number)[0];
    }
  }]);

  return DefinedTag;
}();

exports.default = DefinedTag;
},{"./ValueFormat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/ValueFormat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/Tags.js":[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.UnknownTag = exports.UnpredictableNumberAlternate = exports.UnpredictableNumber = exports.TransactionStatusInformation = exports.TransactionSequenceCounter = exports.TransactionType = exports.TransactionTime = exports.TransactionDate = exports.TransactionCurrencyCode = exports.Track2UnpredictableNumberAndAttackCounterPosition = exports.Track2NumberOfATCDigits = exports.Track2Cvc3Position = exports.Track2Cvc3 = exports.Track2 = exports.Track1UnpredictableNumberAndAttackCounterPosition = exports.Track1NumberOfATCDigits = exports.Track1Cvc3Position = exports.Track1Cvc3 = exports.Track1 = exports.TerminalVerificationResults = exports.TerminalType = exports.TerminalTransactionQualifiers = exports.TerminalIdentification = exports.TerminalCountryCode = exports.TerminalCapabilities = exports.TerminalApplicationIdentifier = exports.ServiceCode = exports.ProcessingDataObjectList = exports.MsdOffset = exports.MobileSupportIndicator = exports.LanguagePreference = exports.IssuerCountryCode = exports.IssuerCodeTableIndex = exports.IssuerApplicationData = exports.IssuerAuthenticationData = exports.InterfaceDeviceSerialNumber = exports.FciProprietaryData = exports.FciProprietaryTemplate = exports.DfNameRaw = exports.DfNameAscii = exports.CryptogramInformationData = exports.CardTransactionQualifiers = exports.CardholderVerificationMethodResults = exports.CardholderNameExtended = exports.CardholderName = exports.CardCvmLimit = exports.CardAuthenticationRelatedData = exports.AuthorizationResponseCode = exports.ApplicationVersionNumber = exports.ApplicationTransactionCounter = exports.ApplicationTemplate = exports.ApplicationPriorityIndicator = exports.ApplicationPreferredName = exports.ApplicationPanSequenceCode = exports.ApplicationLabel = exports.ApplicationInterchangeProfile = exports.ApplicationIdentifier = exports.ApplicationFileLocator = exports.ApplicationExpirationDate = exports.ApplicationCryptogram = exports.AmountOther = exports.AmountAuthorized = undefined;

var _DefinedTag = require('./DefinedTag');

var _DefinedTag2 = _interopRequireDefault(_DefinedTag);

var _ValueFormat = require('./ValueFormat');

var _ValueFormat2 = _interopRequireDefault(_ValueFormat);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * DO NOT EDIT THIS FILE, IT IS AUTOMATICALLY GENERATED BY gulpfile.js
**/
var AmountAuthorized = exports.AmountAuthorized = new _DefinedTag2.default('AmountAuthorized', 0x9F02, _ValueFormat2.default.CompressedNumeric);
var AmountOther = exports.AmountOther = new _DefinedTag2.default('AmountOther', 0x9F03, _ValueFormat2.default.CompressedNumeric);
var ApplicationCryptogram = exports.ApplicationCryptogram = new _DefinedTag2.default('ApplicationCryptogram', 0x9f26, _ValueFormat2.default.Binary);
var ApplicationExpirationDate = exports.ApplicationExpirationDate = new _DefinedTag2.default('ApplicationExpirationDate', 0x5f24, _ValueFormat2.default.Date);
var ApplicationFileLocator = exports.ApplicationFileLocator = new _DefinedTag2.default('ApplicationFileLocator', 0x94, _ValueFormat2.default.Binary);
var ApplicationIdentifier = exports.ApplicationIdentifier = new _DefinedTag2.default('ApplicationIdentifier', 0x4F, _ValueFormat2.default.Binary);
var ApplicationInterchangeProfile = exports.ApplicationInterchangeProfile = new _DefinedTag2.default('ApplicationInterchangeProfile', 0x82, _ValueFormat2.default.Binary, 2);
var ApplicationLabel = exports.ApplicationLabel = new _DefinedTag2.default('ApplicationLabel', 0x50, _ValueFormat2.default.AlphaWithSpace);
var ApplicationPanSequenceCode = exports.ApplicationPanSequenceCode = new _DefinedTag2.default('ApplicationPanSequenceCode', 0x5f34, _ValueFormat2.default.Numeric, 2);
var ApplicationPreferredName = exports.ApplicationPreferredName = new _DefinedTag2.default('ApplicationPreferredName', 0x9f12, _ValueFormat2.default.AlphaWithSpace);
var ApplicationPriorityIndicator = exports.ApplicationPriorityIndicator = new _DefinedTag2.default('ApplicationPriorityIndicator', 0x87, _ValueFormat2.default.Binary, 1);
var ApplicationTemplate = exports.ApplicationTemplate = new _DefinedTag2.default('ApplicationTemplate', 0x61, _ValueFormat2.default.Tlv);
var ApplicationTransactionCounter = exports.ApplicationTransactionCounter = new _DefinedTag2.default('ApplicationTransactionCounter', 0x9F36, _ValueFormat2.default.Binary, 2);
var ApplicationVersionNumber = exports.ApplicationVersionNumber = new _DefinedTag2.default('ApplicationVersionNumber', 0x9F09, _ValueFormat2.default.Binary, 2);
var AuthorizationResponseCode = exports.AuthorizationResponseCode = new _DefinedTag2.default('AuthorizationResponseCode', 0x8A, _ValueFormat2.default.AlphaNumeric, 2);
var CardAuthenticationRelatedData = exports.CardAuthenticationRelatedData = new _DefinedTag2.default('CardAuthenticationRelatedData', 0x9F69, _ValueFormat2.default.Dol);
var CardCvmLimit = exports.CardCvmLimit = new _DefinedTag2.default('CardCvmLimit', 0x9f6b, _ValueFormat2.default.Binary);
var CardholderName = exports.CardholderName = new _DefinedTag2.default('CardholderName', 0x5F20, _ValueFormat2.default.AlphaWithSpace);
var CardholderNameExtended = exports.CardholderNameExtended = new _DefinedTag2.default('CardholderNameExtended', 0x9F0B, _ValueFormat2.default.AlphaWithSpace);
var CardholderVerificationMethodResults = exports.CardholderVerificationMethodResults = new _DefinedTag2.default('CardholderVerificationMethodResults', 0x9F34, _ValueFormat2.default.Binary);
var CardTransactionQualifiers = exports.CardTransactionQualifiers = new _DefinedTag2.default('CardTransactionQualifiers', 0x9F6C, _ValueFormat2.default.Binary, 2);
var CryptogramInformationData = exports.CryptogramInformationData = new _DefinedTag2.default('CryptogramInformationData', 0x9f27, _ValueFormat2.default.Binary, 1);
var DfNameAscii = exports.DfNameAscii = new _DefinedTag2.default('DfNameAscii', 0x84, _ValueFormat2.default.Alpha);
var DfNameRaw = exports.DfNameRaw = new _DefinedTag2.default('DfNameRaw', 0x84, _ValueFormat2.default.Binary);
var FciProprietaryTemplate = exports.FciProprietaryTemplate = new _DefinedTag2.default('FciProprietaryTemplate', 0xA5, _ValueFormat2.default.Tlv);
var FciProprietaryData = exports.FciProprietaryData = new _DefinedTag2.default('FciProprietaryData', 0xBF0C, _ValueFormat2.default.Tlv);
var InterfaceDeviceSerialNumber = exports.InterfaceDeviceSerialNumber = new _DefinedTag2.default('InterfaceDeviceSerialNumber', 0x9F1E, _ValueFormat2.default.AlphaNumeric);
var IssuerAuthenticationData = exports.IssuerAuthenticationData = new _DefinedTag2.default('IssuerAuthenticationData', 0x91, _ValueFormat2.default.Binary);
var IssuerApplicationData = exports.IssuerApplicationData = new _DefinedTag2.default('IssuerApplicationData', 0x9f10, _ValueFormat2.default.Binary);
var IssuerCodeTableIndex = exports.IssuerCodeTableIndex = new _DefinedTag2.default('IssuerCodeTableIndex', 0x9F11, _ValueFormat2.default.Numeric);
var IssuerCountryCode = exports.IssuerCountryCode = new _DefinedTag2.default('IssuerCountryCode', 0x5f28, _ValueFormat2.default.Numeric);
var LanguagePreference = exports.LanguagePreference = new _DefinedTag2.default('LanguagePreference', 0x5F2D, _ValueFormat2.default.Alpha);
var MobileSupportIndicator = exports.MobileSupportIndicator = new _DefinedTag2.default('MobileSupportIndicator', 0x9F7E, _ValueFormat2.default.Binary, 1);
var MsdOffset = exports.MsdOffset = new _DefinedTag2.default('MsdOffset', 0x9f67, _ValueFormat2.default.Binary);
var ProcessingDataObjectList = exports.ProcessingDataObjectList = new _DefinedTag2.default('ProcessingDataObjectList', 0x9F38, _ValueFormat2.default.Dol);
var ServiceCode = exports.ServiceCode = new _DefinedTag2.default('ServiceCode', 0x5f30, _ValueFormat2.default.Numeric);
var TerminalApplicationIdentifier = exports.TerminalApplicationIdentifier = new _DefinedTag2.default('TerminalApplicationIdentifier', 0x9f06, _ValueFormat2.default.Binary);
var TerminalCapabilities = exports.TerminalCapabilities = new _DefinedTag2.default('TerminalCapabilities', 0x9f33, _ValueFormat2.default.Binary);
var TerminalCountryCode = exports.TerminalCountryCode = new _DefinedTag2.default('TerminalCountryCode', 0x9F1A, _ValueFormat2.default.Numeric);
var TerminalIdentification = exports.TerminalIdentification = new _DefinedTag2.default('TerminalIdentification', 0x9F1C, _ValueFormat2.default.Alpha);
var TerminalTransactionQualifiers = exports.TerminalTransactionQualifiers = new _DefinedTag2.default('TerminalTransactionQualifiers', 0x9f66, _ValueFormat2.default.Binary);
var TerminalType = exports.TerminalType = new _DefinedTag2.default('TerminalType', 0x9f35, _ValueFormat2.default.Numeric);
var TerminalVerificationResults = exports.TerminalVerificationResults = new _DefinedTag2.default('TerminalVerificationResults', 0x95, _ValueFormat2.default.Binary);
var Track1 = exports.Track1 = new _DefinedTag2.default('Track1', 0x56, _ValueFormat2.default.Alpha);
var Track1Cvc3 = exports.Track1Cvc3 = new _DefinedTag2.default('Track1Cvc3', 0x9F60, _ValueFormat2.default.Binary, 2);
var Track1Cvc3Position = exports.Track1Cvc3Position = new _DefinedTag2.default('Track1Cvc3Position', 0x9F62, _ValueFormat2.default.Binary);
var Track1NumberOfATCDigits = exports.Track1NumberOfATCDigits = new _DefinedTag2.default('Track1NumberOfATCDigits', 0x9F64, _ValueFormat2.default.Binary, 1);
var Track1UnpredictableNumberAndAttackCounterPosition = exports.Track1UnpredictableNumberAndAttackCounterPosition = new _DefinedTag2.default('Track1UnpredictableNumberAndAttackCounterPosition', 0x9F63, _ValueFormat2.default.Binary);
var Track2 = exports.Track2 = new _DefinedTag2.default('Track2', 0x9F6B, _ValueFormat2.default.Numeric);
var Track2Cvc3 = exports.Track2Cvc3 = new _DefinedTag2.default('Track2Cvc3', 0x9F61, _ValueFormat2.default.Binary, 2);
var Track2Cvc3Position = exports.Track2Cvc3Position = new _DefinedTag2.default('Track2Cvc3Position', 0x9F65, _ValueFormat2.default.Binary);
var Track2NumberOfATCDigits = exports.Track2NumberOfATCDigits = new _DefinedTag2.default('Track2NumberOfATCDigits', 0x9F67, _ValueFormat2.default.Binary, 1);
var Track2UnpredictableNumberAndAttackCounterPosition = exports.Track2UnpredictableNumberAndAttackCounterPosition = new _DefinedTag2.default('Track2UnpredictableNumberAndAttackCounterPosition', 0x9F66, _ValueFormat2.default.Binary);
var TransactionCurrencyCode = exports.TransactionCurrencyCode = new _DefinedTag2.default('TransactionCurrencyCode', 0x5F2A, _ValueFormat2.default.CompressedNumeric, 2);
var TransactionDate = exports.TransactionDate = new _DefinedTag2.default('TransactionDate', 0x9A, _ValueFormat2.default.Date);
var TransactionTime = exports.TransactionTime = new _DefinedTag2.default('TransactionTime', 0x9F21, _ValueFormat2.default.Time);
var TransactionType = exports.TransactionType = new _DefinedTag2.default('TransactionType', 0x9C, _ValueFormat2.default.CompressedNumeric);
var TransactionSequenceCounter = exports.TransactionSequenceCounter = new _DefinedTag2.default('TransactionSequenceCounter', 0x9F41, _ValueFormat2.default.Numeric, 4);
var TransactionStatusInformation = exports.TransactionStatusInformation = new _DefinedTag2.default('TransactionStatusInformation', 0x9B, _ValueFormat2.default.Binary, 2);
var UnpredictableNumber = exports.UnpredictableNumber = new _DefinedTag2.default('UnpredictableNumber', 0x9f37, _ValueFormat2.default.Binary);
var UnpredictableNumberAlternate = exports.UnpredictableNumberAlternate = new _DefinedTag2.default('UnpredictableNumberAlternate', 0x9F6A, _ValueFormat2.default.Binary);
var UnknownTag = exports.UnknownTag = new _DefinedTag2.default('UnknownTag', 0x7FFFFFFF, _ValueFormat2.default.Binary);

exports.default = _DefinedTag2.default.getTagsByName();
},{"./DefinedTag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/DefinedTag.js","./ValueFormat":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/ValueFormat.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/Tlv.js":[function(require,module,exports){
(function (Buffer){(function (){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _ber = require('./ber');

var _ber2 = _interopRequireDefault(_ber);

var _DefinedTag = require('./DefinedTag');

var _DefinedTag2 = _interopRequireDefault(_DefinedTag);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * A single tag/length/value entry with binary data
 * @class
 * @property {DefinedTag} tag The "defined tag" for this TLV, if known
 * @property {int} tagNumber The raw tag number for this TLV
 * @property {Buffer} bytes The raw bytes of the TLV
 * @property {object} value The value as parsed by ValueFormat for the defined tag. You
 * must call parse() first before this is available
 */
var Tlv = function () {
  function Tlv(tagOrTagNumber, bytes) {
    _classCallCheck(this, Tlv);

    if (tagOrTagNumber instanceof _DefinedTag2.default) {
      this.tag = tagOrTagNumber;
      this.tagNumber = tagOrTagNumber.number;
    } else {
      this.tagNumber = tagOrTagNumber;
      this.tag = _DefinedTag2.default.findTag(tagOrTagNumber);
    }
    if (!Buffer.isBuffer(bytes)) {
      this.bytes = this.tag.valueToBytes(bytes);
    } else {
      this.bytes = bytes;
    }
  }

  _createClass(Tlv, [{
    key: 'parse',
    value: function parse() {
      if (!this.hasOwnProperty('value')) {
        this.value = this.tag.valueFromBytes(this.bytes);
      }
      return this.value;
    }
  }, {
    key: 'toBytes',
    value: function toBytes() {
      var parts = [_ber2.default.encodeTag(this.tagNumber), _ber2.default.encodeLength(this.bytes ? this.bytes.length : 0)];
      if (this.bytes) {
        parts.push(this.bytes);
      }
      return Buffer.concat(parts);
    }
  }, {
    key: 'toString',
    value: function toString(shouldParse) {
      var parts = ['  Tag 0x', this.tagNumber.toString(16)];
      if (this.tag && this.tag.name) {
        parts.push(' ');
        parts.push(this.tag.name);
      }
      parts.push(': ');
      if (this.value || shouldParse) {
        if (Buffer.isBuffer(this.parse())) {
          parts.push('0x');
          parts.push(this.value.toString('hex'));
        } else {
          parts.push(this.value.toString());
        }
      } else if (this.bytes) {
        parts.push('0x');
        parts.push(this.bytes.toString('hex'));
      } else {
        parts.push('<empty>');
      }
      return parts.join('');
    }
  }], [{
    key: 'readLength',
    value: function readLength(bytes, startPosition) {
      return _ber2.default.readLength(bytes, startPosition);
    }
  }]);

  return Tlv;
}();

exports.default = Tlv;
}).call(this)}).call(this,require("buffer").Buffer)
},{"./DefinedTag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/DefinedTag.js","./ber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/ber.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/TlvList.js":[function(require,module,exports){
(function (Buffer){(function (){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _Tlv = require('./Tlv');

var _Tlv2 = _interopRequireDefault(_Tlv);

var _DefinedTag = require('./DefinedTag');

var _DefinedTag2 = _interopRequireDefault(_DefinedTag);

var _ber = require('./ber');

var _ber2 = _interopRequireDefault(_ber);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function lengthCheck(index, start, length, message) {
  if (index > start + length) {
    throw new Error(message);
  }
}

var TlvList = function () {
  function TlvList(bufferOrNull, start, length) {
    _classCallCheck(this, TlvList);

    this.values = [];
    if (bufferOrNull) {
      this._parse(bufferOrNull, start, length);
    }
  }

  _createClass(TlvList, [{
    key: '_parse',
    value: function _parse(buffer) {
      var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
      var length = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : buffer.length - start;

      var index = start;
      while (index < start + length) {
        var tagData = _ber2.default.readTag(buffer, index);
        var tagStart = index;
        index += tagData.length;
        lengthCheck(index, start, length, 'Invalid TLV - tag ends buffer.');
        var lenData = _ber2.default.readLength(buffer, index);
        index += lenData.lengthOfEncoding;
        lengthCheck(index, start, length, 'Invalid TLV - tag value length ends buffer.');
        var value = void 0;
        if (lenData.lengthValue) {
          lengthCheck(index + lenData.lengthValue, start, length, 'Invalid TLV - value overruns buffer.');
          value = buffer.slice(index, index + lenData.lengthValue);
          index += lenData.lengthValue;
        }
        var tagEnd = index;
        if (!value) {
          continue;
        }
        var tags = _DefinedTag2.default.findTags(tagData.number);
        var _iteratorNormalCompletion = true;
        var _didIteratorError = false;
        var _iteratorError = undefined;

        try {
          for (var _iterator = tags[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
            var t = _step.value;

            var tlv = new _Tlv2.default(t, value);
            tlv.buffStart = tagStart;
            tlv.buffEnd = tagEnd;
            this.values.push(tlv);
          }
        } catch (err) {
          _didIteratorError = true;
          _iteratorError = err;
        } finally {
          try {
            if (!_iteratorNormalCompletion && _iterator.return) {
              _iterator.return();
            }
          } finally {
            if (_didIteratorError) {
              throw _iteratorError;
            }
          }
        }
      }
    }
  }, {
    key: 'add',
    value: function add(tlvOrTag, valueOrNull) {
      if (tlvOrTag instanceof _DefinedTag2.default) {
        this.values.push(new _Tlv2.default(tlvOrTag, valueOrNull));
      } else if (tlvOrTag instanceof _Tlv2.default) {
        this.values.push(tlvOrTag);
      } else if (!Buffer.isBuffer(valueOrNull)) {
        throw new Error('Add must be called with a tag and value, or a tag number and buffer.');
      } else {
        this.values.push(new _Tlv2.default(_DefinedTag2.default.findTag(tlvOrTag), valueOrNull));
      }
    }

    /**
     * Find a tag in the list of values.
     * @param tag
     * @param skip For multiple tags, pass a non-zero skip value
     * @returns {*}
     */

  }, {
    key: 'find',
    value: function find(tag, skip) {
      var toSkip = skip || 0;
      var findNumber = tag.number || tag;
      var _iteratorNormalCompletion2 = true;
      var _didIteratorError2 = false;
      var _iteratorError2 = undefined;

      try {
        for (var _iterator2 = this.values[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
          var tlv = _step2.value;

          if (tlv.tagNumber === findNumber) {
            if (toSkip > 0) {
              toSkip--;
            } else {
              return tlv;
            }
          }
        }
      } catch (err) {
        _didIteratorError2 = true;
        _iteratorError2 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion2 && _iterator2.return) {
            _iterator2.return();
          }
        } finally {
          if (_didIteratorError2) {
            throw _iteratorError2;
          }
        }
      }

      return null;
    }
  }, {
    key: 'toBytes',
    value: function toBytes() {
      // TODO this isn't right anymore...
      var parts = [];
      var _iteratorNormalCompletion3 = true;
      var _didIteratorError3 = false;
      var _iteratorError3 = undefined;

      try {
        for (var _iterator3 = this.values[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
          var tlv = _step3.value;

          parts.push(tlv.toBytes());
        }
      } catch (err) {
        _didIteratorError3 = true;
        _iteratorError3 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion3 && _iterator3.return) {
            _iterator3.return();
          }
        } finally {
          if (_didIteratorError3) {
            throw _iteratorError3;
          }
        }
      }

      return Buffer.concat(parts);
    }
  }, {
    key: 'toString',
    value: function toString(shouldParse) {
      var parts = ['TLV:'];
      var _iteratorNormalCompletion4 = true;
      var _didIteratorError4 = false;
      var _iteratorError4 = undefined;

      try {
        for (var _iterator4 = this.values[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
          var tlv = _step4.value;

          if (Buffer.isBuffer(tlv)) {
            parts.push(tlv.toString('hex'));
          } else {
            parts.push(tlv.toString(shouldParse));
          }
        }
      } catch (err) {
        _didIteratorError4 = true;
        _iteratorError4 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion4 && _iterator4.return) {
            _iterator4.return();
          }
        } finally {
          if (_didIteratorError4) {
            throw _iteratorError4;
          }
        }
      }

      return parts.join('\n');
    }
  }, {
    key: 'length',
    get: function get() {
      return this.values.length;
    }
  }]);

  return TlvList;
}();

exports.default = TlvList;
}).call(this)}).call(this,require("buffer").Buffer)
},{"./DefinedTag":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/DefinedTag.js","./Tlv":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/Tlv.js","./ber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/ber.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/ValueFormat.js":[function(require,module,exports){
(function (Buffer){(function (){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});
// Delay load this one to avoid circular dependency
var TlvList = void 0;

function fromBytes(buf, len) {
  if (len && buf && buf.length !== len) {
    var b = new Buffer(len);
    buf.copy(b);
    return b;
  }
  return buf;
}

function toBytes(bytes, len) {
  if (len && (!bytes || bytes.length !== len)) {
    var b = new Buffer(len);
    if (bytes) {
      bytes.copy(b);
    }
    return b;
  }
  return bytes;
}

function fromUtf8(buf) {
  return buf.toString('utf8');
}

function toUtf8(val) {
  return new Buffer(val, 'utf8');
}

function toValidHexBytes(val, length) {
  if (Buffer.isBuffer(val)) {
    return val;
  }
  var strval = String(val);
  if (strval.length % 2 === 1) {
    strval = '0' + strval;
  }
  while (length && strval.length < length * 2) {
    strval = '00' + strval;
  }
  return new Buffer(strval, 'hex');
}

/**
 * Encoding/decoding utilities for Javascript to TLV type mapping
 */
exports.default = {
  Alpha: {
    fromBytes: fromUtf8,
    toBytes: toUtf8
  },
  AlphaNumeric: {
    fromBytes: fromUtf8,
    toBytes: toUtf8
  },
  AlphaWithSpace: {
    fromBytes: fromUtf8,
    toBytes: toUtf8
  },
  Binary: {
    fromBytes: fromBytes,
    toBytes: toBytes
  },
  Date: {
    // YYMMDD
    fromBytes: function fromBytes(buf) {
      if (buf.length < 3) {
        throw new Error('Invalid date format.');
      }
      var hex = buf.toString('hex');
      // y,m,d
      return new Date(2000 + parseInt(hex.substring(0, 2), 10), parseInt(hex.substring(2, 4) - 1, 10), parseInt(hex.substring(4, 6), 10));
    },
    toBytes: function toBytes(date) {
      var hexstr = [];
      [date.getFullYear() - 2000, date.getMonth() + 1, date.getDate()].forEach(function (v) {
        if (v < 10) {
          hexstr.push('0');
        }
        hexstr.push(String(v));
      });
      return new Buffer(hexstr.join(''), 'hex');
    }
  },
  Time: {
    // HHmmss
    fromBytes: function fromBytes(buf) {
      if (buf.length < 3) {
        throw new Error('Invalid time format.');
      }
      var hex = buf.toString('hex');
      // hr, min, ss
      return new Date(2000, 1, 1, parseInt(hex.substring(0, 2), 10), parseInt(hex.substring(2, 4), 10), parseInt(hex.substring(4, 6), 10));
    },
    toBytes: function toBytes(date) {
      var hexstr = [];
      [date.getHours(), date.getMinutes(), date.getSeconds()].forEach(function (v) {
        if (v < 10) {
          hexstr.push('0');
        }
        hexstr.push(String(v));
      });
      return new Buffer(hexstr.join(''), 'hex');
    }
  },
  // Otherwise known as BCD?
  CompressedNumeric: {
    fromBytes: function fromBytes(buf) {
      return parseInt(buf.toString('hex'), 10);
    },
    toBytes: toValidHexBytes
  },
  // 0-9A-F
  CompressedAlpha: {
    fromBytes: function fromBytes(buf) {
      return buf.toString('hex');
    },
    toBytes: toValidHexBytes
  },
  Numeric: {
    fromBytes: function fromBytes(buf) {
      var v = 0;
      for (var i = 0; i < buf.length; i++) {
        v = v << 8;
        v += buf[i];
      }
      return v;
    },
    toBytes: function toBytes(val) {
      var len = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;

      var buf = new Buffer(len);
      var remaining = val;
      for (var i = 0; i < len; i++) {
        buf[len - i - 1] = remaining & 0xFF;
        remaining = remaining >> 8;
      }
      return buf;
    }
  },
  TypeLengthValueList: {
    fromBytes: function fromBytes(buf) {
      if (!TlvList) {
        TlvList = require('./TlvList').default;
      }
      return new TlvList(buf);
    },
    toBytes: function toBytes(tlv) {
      return tlv.toBytes();
    }
  },
  DataObjectList: {}
};
}).call(this)}).call(this,require("buffer").Buffer)
},{"./TlvList":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/TlvList.js","buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/apdu/Command.js":[function(require,module,exports){
(function (Buffer){(function (){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var ApduCommand = function () {
  /**
   * Create a new ApduCommand either from a data buffer (i.e. parse it)
   * or from command/instruction/p1/p2 with a blank buffer.
   * @param bufferOrCommandClass
   * @param instruction
   * @param p1
   * @param p2
   * @param data
   * @param le
   * @param longLength Uses 2 bytes to indicate length while converting to byte array
   */
  function ApduCommand(bufferOrCommandClass, instruction, p1, p2, data, le, longLength) {
    _classCallCheck(this, ApduCommand);

    var preambleByteSize = this.longLength ? 5 : 4;
    this.preamble = new Buffer(preambleByteSize);
    this.longLength = longLength;
    if (data) {
      if (Buffer.isBuffer(data)) {
        this.data = [data];
      } else {
        // Better be an array...
        this.data = data;
      }
    } else {
      this.data = null;
    }
    // This is the common case. Use expectNoBytes property to set it to null and not send the byte.
    this.le = 0;
    if (Buffer.isBuffer(bufferOrCommandClass)) {
      // Parse an Apdu Command
    } else {
      // Create a new Apdu Command
      this.commandClass = bufferOrCommandClass;
      this.instruction = instruction;
      this.p1 = p1 || 0;
      this.p2 = p2 || 0;
      if (le !== undefined) {
        this.le = le;
      }
    }
  }

  _createClass(ApduCommand, [{
    key: 'expectNoBytes',
    value: function expectNoBytes() {
      this.le = null;
    }
  }, {
    key: 'appendHex',
    value: function appendHex(hexString) {
      this.data = this.data || [];
      this.data.push(new Buffer(hexString, 'hex'));
    }
  }, {
    key: 'appendBytes',
    value: function appendBytes(buffer) {
      this.data = this.data || [];
      this.data.push(buffer);
    }
  }, {
    key: 'appendString',
    value: function appendString(utf8String) {
      this.data = this.data || [];
      this.data.push(new Buffer(utf8String, 'utf8'));
    }
  }, {
    key: 'toBytes',
    value: function toBytes() {
      var parts = [this.preamble];

      // https://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit
      var len = 0;
      if (this.data) {
        parts.push(null);
        this.data.forEach(function (p) {
          len += p.length;
          parts.push(p);
        });
        if (len > 65535) {
          throw new Error('ApduCommand buffer is too long');
        } else if (len > 255) {
          parts[1] = new Buffer([len >> 8, len & 0xFF]);
        } else {
          parts[1] = this.longLength ? new Buffer([0, len]) : new Buffer([len]);
        }
      }

      if (this.le !== null) {
        if (this.le > 65535) {
          throw new Error('Le value must be between 0 and 65535');
        } else if (this.le <= 256) {
          parts.push(new Buffer([this.le & 0xFF]));
        } else {
          if (parts.length === 1) {
            // In this case (case 2E from http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_5_basic_organizations.aspx#table4), we need a 0 byte for Lc
            parts.push(new Buffer([0]));
          }
          parts.push(new Buffer([this.le >> 8, this.le & 0xFF]));
        }
      }
      return Buffer.concat(parts);
    }
  }, {
    key: 'toString',
    value: function toString() {
      var parts = ['ApduCommand class 0x', this.commandClass.toString(16), ', instruction 0x', this.instruction.toString(16), ', P1 0x', this.p1.toString(16), ', P2 0x', this.p2.toString(16), '\n'];
      if (this.data && this.data.length) {
        var buf = Buffer.concat(this.data);
        parts.push(buf.length + ' bytes: ' + buf.toString('hex'));
      }
      return parts.join('');
    }
  }, {
    key: 'commandClass',
    get: function get() {
      return this.preamble[0];
    },
    set: function set(value) {
      this.preamble.writeUInt8(value, 0);
    }
  }, {
    key: 'instruction',
    get: function get() {
      return this.preamble[1];
    },
    set: function set(value) {
      this.preamble.writeUInt8(value, 1);
    }
  }, {
    key: 'p1',
    get: function get() {
      return this.preamble[2];
    },
    set: function set(value) {
      this.preamble.writeUInt8(value, 2);
    }
  }, {
    key: 'p2',
    get: function get() {
      return this.preamble[3];
    },
    set: function set(value) {
      this.preamble.writeUInt8(value, 3);
    }
  }]);

  return ApduCommand;
}();

exports.default = ApduCommand;
}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/apdu/Response.js":[function(require,module,exports){
(function (Buffer){(function (){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _ber = require('../ber');

var _ber2 = _interopRequireDefault(_ber);

var _TlvList = require('../TlvList');

var _TlvList2 = _interopRequireDefault(_TlvList);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * An APDU response. The truth is this is a nonstandard implementation because we
 * assume the first byte is a "template identifier" as it is in Miura APDU responses,
 * and the rest of the payload is a tlv list. If you don't want that, just pad the
 * buffer with an extra byte at the beginning...
 */
var ApduResponse = function () {
  function ApduResponse(buffer) {
    var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
    var length = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : buffer.length - start;
    var isRaw = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;

    _classCallCheck(this, ApduResponse);

    if (Buffer.isBuffer(buffer)) {
      this.sw1 = buffer[start + length - 2];
      this.sw2 = buffer[start + length - 1];
      if (length === 2) {
        // Only a success value.
        return;
      }
      if (isRaw) {
        this.data = buffer.slice(start, start + length - 2);
      } else {
        this.template = buffer[start];
        var lenInfo = _ber2.default.readLength(buffer, start + 1);

        if (lenInfo.lengthValue !== length - 3 - lenInfo.lengthOfEncoding) {
          var buflen = length - 3 - lenInfo.lengthOfEncoding;
          var msg = 'Invalid ApduResponse length ' + lenInfo.lengthValue + ' vs buffer length ' + buflen;
          throw new Error(msg);
        }
        this.data = buffer.slice(start + 1 + lenInfo.lengthOfEncoding, start + length - 2);
      }
    } else if (buffer instanceof _TlvList2.default) {
      this._tlvs = buffer;
      this.data = buffer.toBytes();
      this.sw1 = 0x90;
      this.sw2 = 0;
    } else {
      // TODO create a blank response that can be added to
      throw new Error('You must provide a Buffer or TlvList to create an APDU response.');
    }
  }

  _createClass(ApduResponse, [{
    key: 'toString',
    value: function toString(shouldParse) {
      var parts = [];
      if (this.template) {
        parts.push('Template: 0x' + this.template.toString(16));
      }
      if (this.data) {
        parts.push('Data (' + this.data.length + ' bytes): 0x' + this.data.toString('hex'));
      }
      if (this._tlvs || shouldParse && this.tlvs) {
        parts.push(this.tlvs.toString(shouldParse));
      }
      parts.push('SW1: 0x' + this.sw1.toString(16) + ' SW2: 0x' + this.sw2.toString(16));
      return parts.join('\n');
    }
  }, {
    key: 'isSuccess',
    get: function get() {
      return this.sw1 === 0x90 && this.sw2 === 0;
    }
  }, {
    key: 'tlvs',
    get: function get() {
      if (!this._tlvs) {
        this._tlvs = new _TlvList2.default(this.data);
      }
      return this._tlvs;
    }
  }]);

  return ApduResponse;
}();

exports.default = ApduResponse;
}).call(this)}).call(this,{"isBuffer":require("../../../../is-buffer/index.js")})
},{"../../../../is-buffer/index.js":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/is-buffer/index.js","../TlvList":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/TlvList.js","../ber":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/ber.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/tlvlib/build/lib/ber.js":[function(require,module,exports){
(function (Buffer){(function (){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = {
  /**
   * Read a tag from a buffer, including multi-byte tags
   * @param {Buffer} buffer The source buffer
   * @param startPosition The position at which to start reading the tag
   * @returns {{length: number, tag: Tag, rawTag: number}}
   */
  readTag: function readTag(buffer, startPosition) {
    var tag = {
      length: 1,
      number: 0
    };
    for (var index = startPosition; index < buffer.length; index++, tag.length++) {
      var t = buffer[index] & 0xff;
      tag.number = (tag.number << 8) + t;
      if (index === startPosition && (t & 0x1F) !== 0x1F) {
        break;
      } else if (index !== startPosition && (t & 0x80) === 0) {
        break;
      }
    }
    return tag;
  },

  /**
   * Return a binary representation of the tag
   * @param tagNumber either a numeric tag value or a DefinedTag object
   */
  encodeTag: function encodeTag(tag) {
    var tagNumber = tag.number || tag;
    var flipped = 0;
    var len = 0;
    while (tagNumber > 0) {
      len++;
      flipped = (flipped << 8) + (tagNumber & 0xFF);
      tagNumber = tagNumber >> 8;
    }
    var buf = new Buffer(len);
    var ix = 0;
    while (flipped > 0) {
      buf.writeUInt8(flipped & 0xFF, ix++);
      flipped = flipped >> 8;
    }
    return buf;
  },

  /**
   * Read a length value and return the value with the number of bytes used to encode
   * the value.
   * @param buffer
   * @param startPosition
   * @returns {{lengthOfEncoding: number, lengthValue: number}}
   */
  readLength: function readLength(buffer, startPosition) {
    var lenInfo = {
      lengthOfEncoding: 1,
      lengthValue: 0
    };
    var curPosition = startPosition;
    var first = buffer[curPosition++];
    if ((first & 0x80) === 0x80) {
      // Long form encoding
      var bytesOfLen = first & 0x7F;
      if (curPosition + bytesOfLen > buffer.length) {
        throw new Error('Malformed length value - not enough bytes.');
      }
      lenInfo.lengthOfEncoding = bytesOfLen + 1;
      for (var j = 0; j < bytesOfLen; j++) {
        lenInfo.lengthValue = (lenInfo.lengthValue << 8) + buffer[curPosition++];
      }
      if (lenInfo.lengthValue < 0) {
        throw new Error('Overflow in length value.');
      }
    } else {
      lenInfo.lengthValue = first;
    }
    return lenInfo;
  },

  /**
   * Return a binary representation of a length value
   * @param len
   * @returns {Buffer} buffer
   */
  encodeLength: function encodeLength(len) {
    if (len > 65535) {
      throw new Error('Invalid length for tlv format: ' + len);
    }
    var buf = void 0;
    if (len <= 127) {
      buf = new Buffer(1);
      buf.writeUInt8(len, 0);
    } else if (len > 0xFF) {
      // Three bytes total
      buf = new Buffer(3);
      buf.writeUInt8(0x82, 0);
      buf.writeUInt8(len >> 8 & 0xFF, 1);
      buf.writeUInt8(len & 0xFF, 2);
    } else {
      // Two bytes
      buf = new Buffer(2);
      buf.writeUInt8(0x81, 0);
      buf.writeUInt8(len & 0xFF, 1);
    }
    return buf;
  }
};
}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/browserify/node_modules/buffer/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/underscore/underscore.js":[function(require,module,exports){
//     Underscore.js 1.7.0
//     http://underscorejs.org
//     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
//     Underscore may be freely distributed under the MIT license.

(function() {

  // Baseline setup
  // --------------

  // Establish the root object, `window` in the browser, or `exports` on the server.
  var root = this;

  // Save the previous value of the `_` variable.
  var previousUnderscore = root._;

  // Save bytes in the minified (but not gzipped) version:
  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;

  // Create quick reference variables for speed access to core prototypes.
  var
    push             = ArrayProto.push,
    slice            = ArrayProto.slice,
    concat           = ArrayProto.concat,
    toString         = ObjProto.toString,
    hasOwnProperty   = ObjProto.hasOwnProperty;

  // All **ECMAScript 5** native function implementations that we hope to use
  // are declared here.
  var
    nativeIsArray      = Array.isArray,
    nativeKeys         = Object.keys,
    nativeBind         = FuncProto.bind;

  // Create a safe reference to the Underscore object for use below.
  var _ = function(obj) {
    if (obj instanceof _) return obj;
    if (!(this instanceof _)) return new _(obj);
    this._wrapped = obj;
  };

  // Export the Underscore object for **Node.js**, with
  // backwards-compatibility for the old `require()` API. If we're in
  // the browser, add `_` as a global object.
  if (typeof exports !== 'undefined') {
    if (typeof module !== 'undefined' && module.exports) {
      exports = module.exports = _;
    }
    exports._ = _;
  } else {
    root._ = _;
  }

  // Current version.
  _.VERSION = '1.7.0';

  // Internal function that returns an efficient (for current engines) version
  // of the passed-in callback, to be repeatedly applied in other Underscore
  // functions.
  var createCallback = function(func, context, argCount) {
    if (context === void 0) return func;
    switch (argCount == null ? 3 : argCount) {
      case 1: return function(value) {
        return func.call(context, value);
      };
      case 2: return function(value, other) {
        return func.call(context, value, other);
      };
      case 3: return function(value, index, collection) {
        return func.call(context, value, index, collection);
      };
      case 4: return function(accumulator, value, index, collection) {
        return func.call(context, accumulator, value, index, collection);
      };
    }
    return function() {
      return func.apply(context, arguments);
    };
  };

  // A mostly-internal function to generate callbacks that can be applied
  // to each element in a collection, returning the desired result — either
  // identity, an arbitrary callback, a property matcher, or a property accessor.
  _.iteratee = function(value, context, argCount) {
    if (value == null) return _.identity;
    if (_.isFunction(value)) return createCallback(value, context, argCount);
    if (_.isObject(value)) return _.matches(value);
    return _.property(value);
  };

  // Collection Functions
  // --------------------

  // The cornerstone, an `each` implementation, aka `forEach`.
  // Handles raw objects in addition to array-likes. Treats all
  // sparse array-likes as if they were dense.
  _.each = _.forEach = function(obj, iteratee, context) {
    if (obj == null) return obj;
    iteratee = createCallback(iteratee, context);
    var i, length = obj.length;
    if (length === +length) {
      for (i = 0; i < length; i++) {
        iteratee(obj[i], i, obj);
      }
    } else {
      var keys = _.keys(obj);
      for (i = 0, length = keys.length; i < length; i++) {
        iteratee(obj[keys[i]], keys[i], obj);
      }
    }
    return obj;
  };

  // Return the results of applying the iteratee to each element.
  _.map = _.collect = function(obj, iteratee, context) {
    if (obj == null) return [];
    iteratee = _.iteratee(iteratee, context);
    var keys = obj.length !== +obj.length && _.keys(obj),
        length = (keys || obj).length,
        results = Array(length),
        currentKey;
    for (var index = 0; index < length; index++) {
      currentKey = keys ? keys[index] : index;
      results[index] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  };

  var reduceError = 'Reduce of empty array with no initial value';

  // **Reduce** builds up a single result from a list of values, aka `inject`,
  // or `foldl`.
  _.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {
    if (obj == null) obj = [];
    iteratee = createCallback(iteratee, context, 4);
    var keys = obj.length !== +obj.length && _.keys(obj),
        length = (keys || obj).length,
        index = 0, currentKey;
    if (arguments.length < 3) {
      if (!length) throw new TypeError(reduceError);
      memo = obj[keys ? keys[index++] : index++];
    }
    for (; index < length; index++) {
      currentKey = keys ? keys[index] : index;
      memo = iteratee(memo, obj[currentKey], currentKey, obj);
    }
    return memo;
  };

  // The right-associative version of reduce, also known as `foldr`.
  _.reduceRight = _.foldr = function(obj, iteratee, memo, context) {
    if (obj == null) obj = [];
    iteratee = createCallback(iteratee, context, 4);
    var keys = obj.length !== + obj.length && _.keys(obj),
        index = (keys || obj).length,
        currentKey;
    if (arguments.length < 3) {
      if (!index) throw new TypeError(reduceError);
      memo = obj[keys ? keys[--index] : --index];
    }
    while (index--) {
      currentKey = keys ? keys[index] : index;
      memo = iteratee(memo, obj[currentKey], currentKey, obj);
    }
    return memo;
  };

  // Return the first value which passes a truth test. Aliased as `detect`.
  _.find = _.detect = function(obj, predicate, context) {
    var result;
    predicate = _.iteratee(predicate, context);
    _.some(obj, function(value, index, list) {
      if (predicate(value, index, list)) {
        result = value;
        return true;
      }
    });
    return result;
  };

  // Return all the elements that pass a truth test.
  // Aliased as `select`.
  _.filter = _.select = function(obj, predicate, context) {
    var results = [];
    if (obj == null) return results;
    predicate = _.iteratee(predicate, context);
    _.each(obj, function(value, index, list) {
      if (predicate(value, index, list)) results.push(value);
    });
    return results;
  };

  // Return all the elements for which a truth test fails.
  _.reject = function(obj, predicate, context) {
    return _.filter(obj, _.negate(_.iteratee(predicate)), context);
  };

  // Determine whether all of the elements match a truth test.
  // Aliased as `all`.
  _.every = _.all = function(obj, predicate, context) {
    if (obj == null) return true;
    predicate = _.iteratee(predicate, context);
    var keys = obj.length !== +obj.length && _.keys(obj),
        length = (keys || obj).length,
        index, currentKey;
    for (index = 0; index < length; index++) {
      currentKey = keys ? keys[index] : index;
      if (!predicate(obj[currentKey], currentKey, obj)) return false;
    }
    return true;
  };

  // Determine if at least one element in the object matches a truth test.
  // Aliased as `any`.
  _.some = _.any = function(obj, predicate, context) {
    if (obj == null) return false;
    predicate = _.iteratee(predicate, context);
    var keys = obj.length !== +obj.length && _.keys(obj),
        length = (keys || obj).length,
        index, currentKey;
    for (index = 0; index < length; index++) {
      currentKey = keys ? keys[index] : index;
      if (predicate(obj[currentKey], currentKey, obj)) return true;
    }
    return false;
  };

  // Determine if the array or object contains a given value (using `===`).
  // Aliased as `include`.
  _.contains = _.include = function(obj, target) {
    if (obj == null) return false;
    if (obj.length !== +obj.length) obj = _.values(obj);
    return _.indexOf(obj, target) >= 0;
  };

  // Invoke a method (with arguments) on every item in a collection.
  _.invoke = function(obj, method) {
    var args = slice.call(arguments, 2);
    var isFunc = _.isFunction(method);
    return _.map(obj, function(value) {
      return (isFunc ? method : value[method]).apply(value, args);
    });
  };

  // Convenience version of a common use case of `map`: fetching a property.
  _.pluck = function(obj, key) {
    return _.map(obj, _.property(key));
  };

  // Convenience version of a common use case of `filter`: selecting only objects
  // containing specific `key:value` pairs.
  _.where = function(obj, attrs) {
    return _.filter(obj, _.matches(attrs));
  };

  // Convenience version of a common use case of `find`: getting the first object
  // containing specific `key:value` pairs.
  _.findWhere = function(obj, attrs) {
    return _.find(obj, _.matches(attrs));
  };

  // Return the maximum element (or element-based computation).
  _.max = function(obj, iteratee, context) {
    var result = -Infinity, lastComputed = -Infinity,
        value, computed;
    if (iteratee == null && obj != null) {
      obj = obj.length === +obj.length ? obj : _.values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value > result) {
          result = value;
        }
      }
    } else {
      iteratee = _.iteratee(iteratee, context);
      _.each(obj, function(value, index, list) {
        computed = iteratee(value, index, list);
        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
          result = value;
          lastComputed = computed;
        }
      });
    }
    return result;
  };

  // Return the minimum element (or element-based computation).
  _.min = function(obj, iteratee, context) {
    var result = Infinity, lastComputed = Infinity,
        value, computed;
    if (iteratee == null && obj != null) {
      obj = obj.length === +obj.length ? obj : _.values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value < result) {
          result = value;
        }
      }
    } else {
      iteratee = _.iteratee(iteratee, context);
      _.each(obj, function(value, index, list) {
        computed = iteratee(value, index, list);
        if (computed < lastComputed || computed === Infinity && result === Infinity) {
          result = value;
          lastComputed = computed;
        }
      });
    }
    return result;
  };

  // Shuffle a collection, using the modern version of the
  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
  _.shuffle = function(obj) {
    var set = obj && obj.length === +obj.length ? obj : _.values(obj);
    var length = set.length;
    var shuffled = Array(length);
    for (var index = 0, rand; index < length; index++) {
      rand = _.random(0, index);
      if (rand !== index) shuffled[index] = shuffled[rand];
      shuffled[rand] = set[index];
    }
    return shuffled;
  };

  // Sample **n** random values from a collection.
  // If **n** is not specified, returns a single random element.
  // The internal `guard` argument allows it to work with `map`.
  _.sample = function(obj, n, guard) {
    if (n == null || guard) {
      if (obj.length !== +obj.length) obj = _.values(obj);
      return obj[_.random(obj.length - 1)];
    }
    return _.shuffle(obj).slice(0, Math.max(0, n));
  };

  // Sort the object's values by a criterion produced by an iteratee.
  _.sortBy = function(obj, iteratee, context) {
    iteratee = _.iteratee(iteratee, context);
    return _.pluck(_.map(obj, function(value, index, list) {
      return {
        value: value,
        index: index,
        criteria: iteratee(value, index, list)
      };
    }).sort(function(left, right) {
      var a = left.criteria;
      var b = right.criteria;
      if (a !== b) {
        if (a > b || a === void 0) return 1;
        if (a < b || b === void 0) return -1;
      }
      return left.index - right.index;
    }), 'value');
  };

  // An internal function used for aggregate "group by" operations.
  var group = function(behavior) {
    return function(obj, iteratee, context) {
      var result = {};
      iteratee = _.iteratee(iteratee, context);
      _.each(obj, function(value, index) {
        var key = iteratee(value, index, obj);
        behavior(result, value, key);
      });
      return result;
    };
  };

  // Groups the object's values by a criterion. Pass either a string attribute
  // to group by, or a function that returns the criterion.
  _.groupBy = group(function(result, value, key) {
    if (_.has(result, key)) result[key].push(value); else result[key] = [value];
  });

  // Indexes the object's values by a criterion, similar to `groupBy`, but for
  // when you know that your index values will be unique.
  _.indexBy = group(function(result, value, key) {
    result[key] = value;
  });

  // Counts instances of an object that group by a certain criterion. Pass
  // either a string attribute to count by, or a function that returns the
  // criterion.
  _.countBy = group(function(result, value, key) {
    if (_.has(result, key)) result[key]++; else result[key] = 1;
  });

  // Use a comparator function to figure out the smallest index at which
  // an object should be inserted so as to maintain order. Uses binary search.
  _.sortedIndex = function(array, obj, iteratee, context) {
    iteratee = _.iteratee(iteratee, context, 1);
    var value = iteratee(obj);
    var low = 0, high = array.length;
    while (low < high) {
      var mid = low + high >>> 1;
      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
    }
    return low;
  };

  // Safely create a real, live array from anything iterable.
  _.toArray = function(obj) {
    if (!obj) return [];
    if (_.isArray(obj)) return slice.call(obj);
    if (obj.length === +obj.length) return _.map(obj, _.identity);
    return _.values(obj);
  };

  // Return the number of elements in an object.
  _.size = function(obj) {
    if (obj == null) return 0;
    return obj.length === +obj.length ? obj.length : _.keys(obj).length;
  };

  // Split a collection into two arrays: one whose elements all satisfy the given
  // predicate, and one whose elements all do not satisfy the predicate.
  _.partition = function(obj, predicate, context) {
    predicate = _.iteratee(predicate, context);
    var pass = [], fail = [];
    _.each(obj, function(value, key, obj) {
      (predicate(value, key, obj) ? pass : fail).push(value);
    });
    return [pass, fail];
  };

  // Array Functions
  // ---------------

  // Get the first element of an array. Passing **n** will return the first N
  // values in the array. Aliased as `head` and `take`. The **guard** check
  // allows it to work with `_.map`.
  _.first = _.head = _.take = function(array, n, guard) {
    if (array == null) return void 0;
    if (n == null || guard) return array[0];
    if (n < 0) return [];
    return slice.call(array, 0, n);
  };

  // Returns everything but the last entry of the array. Especially useful on
  // the arguments object. Passing **n** will return all the values in
  // the array, excluding the last N. The **guard** check allows it to work with
  // `_.map`.
  _.initial = function(array, n, guard) {
    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
  };

  // Get the last element of an array. Passing **n** will return the last N
  // values in the array. The **guard** check allows it to work with `_.map`.
  _.last = function(array, n, guard) {
    if (array == null) return void 0;
    if (n == null || guard) return array[array.length - 1];
    return slice.call(array, Math.max(array.length - n, 0));
  };

  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
  // Especially useful on the arguments object. Passing an **n** will return
  // the rest N values in the array. The **guard**
  // check allows it to work with `_.map`.
  _.rest = _.tail = _.drop = function(array, n, guard) {
    return slice.call(array, n == null || guard ? 1 : n);
  };

  // Trim out all falsy values from an array.
  _.compact = function(array) {
    return _.filter(array, _.identity);
  };

  // Internal implementation of a recursive `flatten` function.
  var flatten = function(input, shallow, strict, output) {
    if (shallow && _.every(input, _.isArray)) {
      return concat.apply(output, input);
    }
    for (var i = 0, length = input.length; i < length; i++) {
      var value = input[i];
      if (!_.isArray(value) && !_.isArguments(value)) {
        if (!strict) output.push(value);
      } else if (shallow) {
        push.apply(output, value);
      } else {
        flatten(value, shallow, strict, output);
      }
    }
    return output;
  };

  // Flatten out an array, either recursively (by default), or just one level.
  _.flatten = function(array, shallow) {
    return flatten(array, shallow, false, []);
  };

  // Return a version of the array that does not contain the specified value(s).
  _.without = function(array) {
    return _.difference(array, slice.call(arguments, 1));
  };

  // Produce a duplicate-free version of the array. If the array has already
  // been sorted, you have the option of using a faster algorithm.
  // Aliased as `unique`.
  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
    if (array == null) return [];
    if (!_.isBoolean(isSorted)) {
      context = iteratee;
      iteratee = isSorted;
      isSorted = false;
    }
    if (iteratee != null) iteratee = _.iteratee(iteratee, context);
    var result = [];
    var seen = [];
    for (var i = 0, length = array.length; i < length; i++) {
      var value = array[i];
      if (isSorted) {
        if (!i || seen !== value) result.push(value);
        seen = value;
      } else if (iteratee) {
        var computed = iteratee(value, i, array);
        if (_.indexOf(seen, computed) < 0) {
          seen.push(computed);
          result.push(value);
        }
      } else if (_.indexOf(result, value) < 0) {
        result.push(value);
      }
    }
    return result;
  };

  // Produce an array that contains the union: each distinct element from all of
  // the passed-in arrays.
  _.union = function() {
    return _.uniq(flatten(arguments, true, true, []));
  };

  // Produce an array that contains every item shared between all the
  // passed-in arrays.
  _.intersection = function(array) {
    if (array == null) return [];
    var result = [];
    var argsLength = arguments.length;
    for (var i = 0, length = array.length; i < length; i++) {
      var item = array[i];
      if (_.contains(result, item)) continue;
      for (var j = 1; j < argsLength; j++) {
        if (!_.contains(arguments[j], item)) break;
      }
      if (j === argsLength) result.push(item);
    }
    return result;
  };

  // Take the difference between one array and a number of other arrays.
  // Only the elements present in just the first array will remain.
  _.difference = function(array) {
    var rest = flatten(slice.call(arguments, 1), true, true, []);
    return _.filter(array, function(value){
      return !_.contains(rest, value);
    });
  };

  // Zip together multiple lists into a single array -- elements that share
  // an index go together.
  _.zip = function(array) {
    if (array == null) return [];
    var length = _.max(arguments, 'length').length;
    var results = Array(length);
    for (var i = 0; i < length; i++) {
      results[i] = _.pluck(arguments, i);
    }
    return results;
  };

  // Converts lists into objects. Pass either a single array of `[key, value]`
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
  // the corresponding values.
  _.object = function(list, values) {
    if (list == null) return {};
    var result = {};
    for (var i = 0, length = list.length; i < length; i++) {
      if (values) {
        result[list[i]] = values[i];
      } else {
        result[list[i][0]] = list[i][1];
      }
    }
    return result;
  };

  // Return the position of the first occurrence of an item in an array,
  // or -1 if the item is not included in the array.
  // If the array is large and already in sort order, pass `true`
  // for **isSorted** to use binary search.
  _.indexOf = function(array, item, isSorted) {
    if (array == null) return -1;
    var i = 0, length = array.length;
    if (isSorted) {
      if (typeof isSorted == 'number') {
        i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
      } else {
        i = _.sortedIndex(array, item);
        return array[i] === item ? i : -1;
      }
    }
    for (; i < length; i++) if (array[i] === item) return i;
    return -1;
  };

  _.lastIndexOf = function(array, item, from) {
    if (array == null) return -1;
    var idx = array.length;
    if (typeof from == 'number') {
      idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
    }
    while (--idx >= 0) if (array[idx] === item) return idx;
    return -1;
  };

  // Generate an integer Array containing an arithmetic progression. A port of
  // the native Python `range()` function. See
  // [the Python documentation](http://docs.python.org/library/functions.html#range).
  _.range = function(start, stop, step) {
    if (arguments.length <= 1) {
      stop = start || 0;
      start = 0;
    }
    step = step || 1;

    var length = Math.max(Math.ceil((stop - start) / step), 0);
    var range = Array(length);

    for (var idx = 0; idx < length; idx++, start += step) {
      range[idx] = start;
    }

    return range;
  };

  // Function (ahem) Functions
  // ------------------

  // Reusable constructor function for prototype setting.
  var Ctor = function(){};

  // Create a function bound to a given object (assigning `this`, and arguments,
  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
  // available.
  _.bind = function(func, context) {
    var args, bound;
    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
    args = slice.call(arguments, 2);
    bound = function() {
      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
      Ctor.prototype = func.prototype;
      var self = new Ctor;
      Ctor.prototype = null;
      var result = func.apply(self, args.concat(slice.call(arguments)));
      if (_.isObject(result)) return result;
      return self;
    };
    return bound;
  };

  // Partially apply a function by creating a version that has had some of its
  // arguments pre-filled, without changing its dynamic `this` context. _ acts
  // as a placeholder, allowing any combination of arguments to be pre-filled.
  _.partial = function(func) {
    var boundArgs = slice.call(arguments, 1);
    return function() {
      var position = 0;
      var args = boundArgs.slice();
      for (var i = 0, length = args.length; i < length; i++) {
        if (args[i] === _) args[i] = arguments[position++];
      }
      while (position < arguments.length) args.push(arguments[position++]);
      return func.apply(this, args);
    };
  };

  // Bind a number of an object's methods to that object. Remaining arguments
  // are the method names to be bound. Useful for ensuring that all callbacks
  // defined on an object belong to it.
  _.bindAll = function(obj) {
    var i, length = arguments.length, key;
    if (length <= 1) throw new Error('bindAll must be passed function names');
    for (i = 1; i < length; i++) {
      key = arguments[i];
      obj[key] = _.bind(obj[key], obj);
    }
    return obj;
  };

  // Memoize an expensive function by storing its results.
  _.memoize = function(func, hasher) {
    var memoize = function(key) {
      var cache = memoize.cache;
      var address = hasher ? hasher.apply(this, arguments) : key;
      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
      return cache[address];
    };
    memoize.cache = {};
    return memoize;
  };

  // Delays a function for the given number of milliseconds, and then calls
  // it with the arguments supplied.
  _.delay = function(func, wait) {
    var args = slice.call(arguments, 2);
    return setTimeout(function(){
      return func.apply(null, args);
    }, wait);
  };

  // Defers a function, scheduling it to run after the current call stack has
  // cleared.
  _.defer = function(func) {
    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
  };

  // Returns a function, that, when invoked, will only be triggered at most once
  // during a given window of time. Normally, the throttled function will run
  // as much as it can, without ever going more than once per `wait` duration;
  // but if you'd like to disable the execution on the leading edge, pass
  // `{leading: false}`. To disable execution on the trailing edge, ditto.
  _.throttle = function(func, wait, options) {
    var context, args, result;
    var timeout = null;
    var previous = 0;
    if (!options) options = {};
    var later = function() {
      previous = options.leading === false ? 0 : _.now();
      timeout = null;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    };
    return function() {
      var now = _.now();
      if (!previous && options.leading === false) previous = now;
      var remaining = wait - (now - previous);
      context = this;
      args = arguments;
      if (remaining <= 0 || remaining > wait) {
        clearTimeout(timeout);
        timeout = null;
        previous = now;
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      } else if (!timeout && options.trailing !== false) {
        timeout = setTimeout(later, remaining);
      }
      return result;
    };
  };

  // Returns a function, that, as long as it continues to be invoked, will not
  // be triggered. The function will be called after it stops being called for
  // N milliseconds. If `immediate` is passed, trigger the function on the
  // leading edge, instead of the trailing.
  _.debounce = function(func, wait, immediate) {
    var timeout, args, context, timestamp, result;

    var later = function() {
      var last = _.now() - timestamp;

      if (last < wait && last > 0) {
        timeout = setTimeout(later, wait - last);
      } else {
        timeout = null;
        if (!immediate) {
          result = func.apply(context, args);
          if (!timeout) context = args = null;
        }
      }
    };

    return function() {
      context = this;
      args = arguments;
      timestamp = _.now();
      var callNow = immediate && !timeout;
      if (!timeout) timeout = setTimeout(later, wait);
      if (callNow) {
        result = func.apply(context, args);
        context = args = null;
      }

      return result;
    };
  };

  // Returns the first function passed as an argument to the second,
  // allowing you to adjust arguments, run code before and after, and
  // conditionally execute the original function.
  _.wrap = function(func, wrapper) {
    return _.partial(wrapper, func);
  };

  // Returns a negated version of the passed-in predicate.
  _.negate = function(predicate) {
    return function() {
      return !predicate.apply(this, arguments);
    };
  };

  // Returns a function that is the composition of a list of functions, each
  // consuming the return value of the function that follows.
  _.compose = function() {
    var args = arguments;
    var start = args.length - 1;
    return function() {
      var i = start;
      var result = args[start].apply(this, arguments);
      while (i--) result = args[i].call(this, result);
      return result;
    };
  };

  // Returns a function that will only be executed after being called N times.
  _.after = function(times, func) {
    return function() {
      if (--times < 1) {
        return func.apply(this, arguments);
      }
    };
  };

  // Returns a function that will only be executed before being called N times.
  _.before = function(times, func) {
    var memo;
    return function() {
      if (--times > 0) {
        memo = func.apply(this, arguments);
      } else {
        func = null;
      }
      return memo;
    };
  };

  // Returns a function that will be executed at most one time, no matter how
  // often you call it. Useful for lazy initialization.
  _.once = _.partial(_.before, 2);

  // Object Functions
  // ----------------

  // Retrieve the names of an object's properties.
  // Delegates to **ECMAScript 5**'s native `Object.keys`
  _.keys = function(obj) {
    if (!_.isObject(obj)) return [];
    if (nativeKeys) return nativeKeys(obj);
    var keys = [];
    for (var key in obj) if (_.has(obj, key)) keys.push(key);
    return keys;
  };

  // Retrieve the values of an object's properties.
  _.values = function(obj) {
    var keys = _.keys(obj);
    var length = keys.length;
    var values = Array(length);
    for (var i = 0; i < length; i++) {
      values[i] = obj[keys[i]];
    }
    return values;
  };

  // Convert an object into a list of `[key, value]` pairs.
  _.pairs = function(obj) {
    var keys = _.keys(obj);
    var length = keys.length;
    var pairs = Array(length);
    for (var i = 0; i < length; i++) {
      pairs[i] = [keys[i], obj[keys[i]]];
    }
    return pairs;
  };

  // Invert the keys and values of an object. The values must be serializable.
  _.invert = function(obj) {
    var result = {};
    var keys = _.keys(obj);
    for (var i = 0, length = keys.length; i < length; i++) {
      result[obj[keys[i]]] = keys[i];
    }
    return result;
  };

  // Return a sorted list of the function names available on the object.
  // Aliased as `methods`
  _.functions = _.methods = function(obj) {
    var names = [];
    for (var key in obj) {
      if (_.isFunction(obj[key])) names.push(key);
    }
    return names.sort();
  };

  // Extend a given object with all the properties in passed-in object(s).
  _.extend = function(obj) {
    if (!_.isObject(obj)) return obj;
    var source, prop;
    for (var i = 1, length = arguments.length; i < length; i++) {
      source = arguments[i];
      for (prop in source) {
        if (hasOwnProperty.call(source, prop)) {
            obj[prop] = source[prop];
        }
      }
    }
    return obj;
  };

  // Return a copy of the object only containing the whitelisted properties.
  _.pick = function(obj, iteratee, context) {
    var result = {}, key;
    if (obj == null) return result;
    if (_.isFunction(iteratee)) {
      iteratee = createCallback(iteratee, context);
      for (key in obj) {
        var value = obj[key];
        if (iteratee(value, key, obj)) result[key] = value;
      }
    } else {
      var keys = concat.apply([], slice.call(arguments, 1));
      obj = new Object(obj);
      for (var i = 0, length = keys.length; i < length; i++) {
        key = keys[i];
        if (key in obj) result[key] = obj[key];
      }
    }
    return result;
  };

   // Return a copy of the object without the blacklisted properties.
  _.omit = function(obj, iteratee, context) {
    if (_.isFunction(iteratee)) {
      iteratee = _.negate(iteratee);
    } else {
      var keys = _.map(concat.apply([], slice.call(arguments, 1)), String);
      iteratee = function(value, key) {
        return !_.contains(keys, key);
      };
    }
    return _.pick(obj, iteratee, context);
  };

  // Fill in a given object with default properties.
  _.defaults = function(obj) {
    if (!_.isObject(obj)) return obj;
    for (var i = 1, length = arguments.length; i < length; i++) {
      var source = arguments[i];
      for (var prop in source) {
        if (obj[prop] === void 0) obj[prop] = source[prop];
      }
    }
    return obj;
  };

  // Create a (shallow-cloned) duplicate of an object.
  _.clone = function(obj) {
    if (!_.isObject(obj)) return obj;
    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
  };

  // Invokes interceptor with the obj, and then returns obj.
  // The primary purpose of this method is to "tap into" a method chain, in
  // order to perform operations on intermediate results within the chain.
  _.tap = function(obj, interceptor) {
    interceptor(obj);
    return obj;
  };

  // Internal recursive comparison function for `isEqual`.
  var eq = function(a, b, aStack, bStack) {
    // Identical objects are equal. `0 === -0`, but they aren't identical.
    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
    if (a === b) return a !== 0 || 1 / a === 1 / b;
    // A strict comparison is necessary because `null == undefined`.
    if (a == null || b == null) return a === b;
    // Unwrap any wrapped objects.
    if (a instanceof _) a = a._wrapped;
    if (b instanceof _) b = b._wrapped;
    // Compare `[[Class]]` names.
    var className = toString.call(a);
    if (className !== toString.call(b)) return false;
    switch (className) {
      // Strings, numbers, regular expressions, dates, and booleans are compared by value.
      case '[object RegExp]':
      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
      case '[object String]':
        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
        // equivalent to `new String("5")`.
        return '' + a === '' + b;
      case '[object Number]':
        // `NaN`s are equivalent, but non-reflexive.
        // Object(NaN) is equivalent to NaN
        if (+a !== +a) return +b !== +b;
        // An `egal` comparison is performed for other numeric values.
        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
      case '[object Date]':
      case '[object Boolean]':
        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
        // millisecond representations. Note that invalid dates with millisecond representations
        // of `NaN` are not equivalent.
        return +a === +b;
    }
    if (typeof a != 'object' || typeof b != 'object') return false;
    // Assume equality for cyclic structures. The algorithm for detecting cyclic
    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
    var length = aStack.length;
    while (length--) {
      // Linear search. Performance is inversely proportional to the number of
      // unique nested structures.
      if (aStack[length] === a) return bStack[length] === b;
    }
    // Objects with different constructors are not equivalent, but `Object`s
    // from different frames are.
    var aCtor = a.constructor, bCtor = b.constructor;
    if (
      aCtor !== bCtor &&
      // Handle Object.create(x) cases
      'constructor' in a && 'constructor' in b &&
      !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
        _.isFunction(bCtor) && bCtor instanceof bCtor)
    ) {
      return false;
    }
    // Add the first object to the stack of traversed objects.
    aStack.push(a);
    bStack.push(b);
    var size, result;
    // Recursively compare objects and arrays.
    if (className === '[object Array]') {
      // Compare array lengths to determine if a deep comparison is necessary.
      size = a.length;
      result = size === b.length;
      if (result) {
        // Deep compare the contents, ignoring non-numeric properties.
        while (size--) {
          if (!(result = eq(a[size], b[size], aStack, bStack))) break;
        }
      }
    } else {
      // Deep compare objects.
      var keys = _.keys(a), key;
      size = keys.length;
      // Ensure that both objects contain the same number of properties before comparing deep equality.
      result = _.keys(b).length === size;
      if (result) {
        while (size--) {
          // Deep compare each member
          key = keys[size];
          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
        }
      }
    }
    // Remove the first object from the stack of traversed objects.
    aStack.pop();
    bStack.pop();
    return result;
  };

  // Perform a deep comparison to check if two objects are equal.
  _.isEqual = function(a, b) {
    return eq(a, b, [], []);
  };

  // Is a given array, string, or object empty?
  // An "empty" object has no enumerable own-properties.
  _.isEmpty = function(obj) {
    if (obj == null) return true;
    if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
    for (var key in obj) if (_.has(obj, key)) return false;
    return true;
  };

  // Is a given value a DOM element?
  _.isElement = function(obj) {
    return !!(obj && obj.nodeType === 1);
  };

  // Is a given value an array?
  // Delegates to ECMA5's native Array.isArray
  _.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
  };

  // Is a given variable an object?
  _.isObject = function(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && !!obj;
  };

  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
    _['is' + name] = function(obj) {
      return toString.call(obj) === '[object ' + name + ']';
    };
  });

  // Define a fallback version of the method in browsers (ahem, IE), where
  // there isn't any inspectable "Arguments" type.
  if (!_.isArguments(arguments)) {
    _.isArguments = function(obj) {
      return _.has(obj, 'callee');
    };
  }

  // Optimize `isFunction` if appropriate. Work around an IE 11 bug.
  if (typeof /./ !== 'function') {
    _.isFunction = function(obj) {
      return typeof obj == 'function' || false;
    };
  }

  // Is a given object a finite number?
  _.isFinite = function(obj) {
    return isFinite(obj) && !isNaN(parseFloat(obj));
  };

  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
  _.isNaN = function(obj) {
    return _.isNumber(obj) && obj !== +obj;
  };

  // Is a given value a boolean?
  _.isBoolean = function(obj) {
    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
  };

  // Is a given value equal to null?
  _.isNull = function(obj) {
    return obj === null;
  };

  // Is a given variable undefined?
  _.isUndefined = function(obj) {
    return obj === void 0;
  };

  // Shortcut function for checking if an object has a given property directly
  // on itself (in other words, not on a prototype).
  _.has = function(obj, key) {
    return obj != null && hasOwnProperty.call(obj, key);
  };

  // Utility Functions
  // -----------------

  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
  // previous owner. Returns a reference to the Underscore object.
  _.noConflict = function() {
    root._ = previousUnderscore;
    return this;
  };

  // Keep the identity function around for default iteratees.
  _.identity = function(value) {
    return value;
  };

  _.constant = function(value) {
    return function() {
      return value;
    };
  };

  _.noop = function(){};

  _.property = function(key) {
    return function(obj) {
      return obj[key];
    };
  };

  // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
  _.matches = function(attrs) {
    var pairs = _.pairs(attrs), length = pairs.length;
    return function(obj) {
      if (obj == null) return !length;
      obj = new Object(obj);
      for (var i = 0; i < length; i++) {
        var pair = pairs[i], key = pair[0];
        if (pair[1] !== obj[key] || !(key in obj)) return false;
      }
      return true;
    };
  };

  // Run a function **n** times.
  _.times = function(n, iteratee, context) {
    var accum = Array(Math.max(0, n));
    iteratee = createCallback(iteratee, context, 1);
    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
    return accum;
  };

  // Return a random integer between min and max (inclusive).
  _.random = function(min, max) {
    if (max == null) {
      max = min;
      min = 0;
    }
    return min + Math.floor(Math.random() * (max - min + 1));
  };

  // A (possibly faster) way to get the current timestamp as an integer.
  _.now = Date.now || function() {
    return new Date().getTime();
  };

   // List of HTML entities for escaping.
  var escapeMap = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#x27;',
    '`': '&#x60;'
  };
  var unescapeMap = _.invert(escapeMap);

  // Functions for escaping and unescaping strings to/from HTML interpolation.
  var createEscaper = function(map) {
    var escaper = function(match) {
      return map[match];
    };
    // Regexes for identifying a key that needs to be escaped
    var source = '(?:' + _.keys(map).join('|') + ')';
    var testRegexp = RegExp(source);
    var replaceRegexp = RegExp(source, 'g');
    return function(string) {
      string = string == null ? '' : '' + string;
      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
    };
  };
  _.escape = createEscaper(escapeMap);
  _.unescape = createEscaper(unescapeMap);

  // If the value of the named `property` is a function then invoke it with the
  // `object` as context; otherwise, return it.
  _.result = function(object, property) {
    if (object == null) return void 0;
    var value = object[property];
    return _.isFunction(value) ? object[property]() : value;
  };

  // Generate a unique integer id (unique within the entire client session).
  // Useful for temporary DOM ids.
  var idCounter = 0;
  _.uniqueId = function(prefix) {
    var id = ++idCounter + '';
    return prefix ? prefix + id : id;
  };

  // By default, Underscore uses ERB-style template delimiters, change the
  // following template settings to use alternative delimiters.
  _.templateSettings = {
    evaluate    : /<%([\s\S]+?)%>/g,
    interpolate : /<%=([\s\S]+?)%>/g,
    escape      : /<%-([\s\S]+?)%>/g
  };

  // When customizing `templateSettings`, if you don't want to define an
  // interpolation, evaluation or escaping regex, we need one that is
  // guaranteed not to match.
  var noMatch = /(.)^/;

  // Certain characters need to be escaped so that they can be put into a
  // string literal.
  var escapes = {
    "'":      "'",
    '\\':     '\\',
    '\r':     'r',
    '\n':     'n',
    '\u2028': 'u2028',
    '\u2029': 'u2029'
  };

  var escaper = /\\|'|\r|\n|\u2028|\u2029/g;

  var escapeChar = function(match) {
    return '\\' + escapes[match];
  };

  // JavaScript micro-templating, similar to John Resig's implementation.
  // Underscore templating handles arbitrary delimiters, preserves whitespace,
  // and correctly escapes quotes within interpolated code.
  // NB: `oldSettings` only exists for backwards compatibility.
  _.template = function(text, settings, oldSettings) {
    if (!settings && oldSettings) settings = oldSettings;
    settings = _.defaults({}, settings, _.templateSettings);

    // Combine delimiters into one regular expression via alternation.
    var matcher = RegExp([
      (settings.escape || noMatch).source,
      (settings.interpolate || noMatch).source,
      (settings.evaluate || noMatch).source
    ].join('|') + '|$', 'g');

    // Compile the template source, escaping string literals appropriately.
    var index = 0;
    var source = "__p+='";
    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
      source += text.slice(index, offset).replace(escaper, escapeChar);
      index = offset + match.length;

      if (escape) {
        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
      } else if (interpolate) {
        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
      } else if (evaluate) {
        source += "';\n" + evaluate + "\n__p+='";
      }

      // Adobe VMs need the match returned to produce the correct offest.
      return match;
    });
    source += "';\n";

    // If a variable is not specified, place data values in local scope.
    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';

    source = "var __t,__p='',__j=Array.prototype.join," +
      "print=function(){__p+=__j.call(arguments,'');};\n" +
      source + 'return __p;\n';

    try {
      var render = new Function(settings.variable || 'obj', '_', source);
    } catch (e) {
      e.source = source;
      throw e;
    }

    var template = function(data) {
      return render.call(this, data, _);
    };

    // Provide the compiled source as a convenience for precompilation.
    var argument = settings.variable || 'obj';
    template.source = 'function(' + argument + '){\n' + source + '}';

    return template;
  };

  // Add a "chain" function. Start chaining a wrapped Underscore object.
  _.chain = function(obj) {
    var instance = _(obj);
    instance._chain = true;
    return instance;
  };

  // OOP
  // ---------------
  // If Underscore is called as a function, it returns a wrapped object that
  // can be used OO-style. This wrapper holds altered versions of all the
  // underscore functions. Wrapped objects may be chained.

  // Helper function to continue chaining intermediate results.
  var result = function(obj) {
    return this._chain ? _(obj).chain() : obj;
  };

  // Add your own custom functions to the Underscore object.
  _.mixin = function(obj) {
    _.each(_.functions(obj), function(name) {
      var func = _[name] = obj[name];
      _.prototype[name] = function() {
        var args = [this._wrapped];
        push.apply(args, arguments);
        return result.call(this, func.apply(_, args));
      };
    });
  };

  // Add all of the Underscore functions to the wrapper object.
  _.mixin(_);

  // Add all mutator Array functions to the wrapper.
  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      var obj = this._wrapped;
      method.apply(obj, arguments);
      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
      return result.call(this, obj);
    };
  });

  // Add all accessor Array functions to the wrapper.
  _.each(['concat', 'join', 'slice'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      return result.call(this, method.apply(this._wrapped, arguments));
    };
  });

  // Extracts the result from a wrapped and chained object.
  _.prototype.value = function() {
    return this._wrapped;
  };

  // AMD registration happens at the end for compatibility with AMD loaders
  // that may not enforce next-turn semantics on modules. Even though general
  // practice for AMD registration is to be anonymous, underscore registers
  // as a named module because, like jQuery, it is a base library that is
  // popular enough to be bundled in a third party lib, but not be part of
  // an AMD load request. Those cases could generate an error when an
  // anonymous define() is called outside of a loader request.
  if (typeof define === 'function' && define.amd) {
    define('underscore', [], function() {
      return _;
    });
  }
}.call(this));

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/url/url.js":[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

var punycode = require('punycode');
var util = require('./util');

exports.parse = urlParse;
exports.resolve = urlResolve;
exports.resolveObject = urlResolveObject;
exports.format = urlFormat;

exports.Url = Url;

function Url() {
  this.protocol = null;
  this.slashes = null;
  this.auth = null;
  this.host = null;
  this.port = null;
  this.hostname = null;
  this.hash = null;
  this.search = null;
  this.query = null;
  this.pathname = null;
  this.path = null;
  this.href = null;
}

// Reference: RFC 3986, RFC 1808, RFC 2396

// define these here so at least they only have to be
// compiled once on the first module load.
var protocolPattern = /^([a-z0-9.+-]+:)/i,
    portPattern = /:[0-9]*$/,

    // Special case for a simple path URL
    simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,

    // RFC 2396: characters reserved for delimiting URLs.
    // We actually just auto-escape these.
    delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],

    // RFC 2396: characters not allowed for various reasons.
    unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),

    // Allowed by RFCs, but cause of XSS attacks.  Always escape these.
    autoEscape = ['\''].concat(unwise),
    // Characters that are never ever allowed in a hostname.
    // Note that any invalid chars are also handled, but these
    // are the ones that are *expected* to be seen, so we fast-path
    // them.
    nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
    hostEndingChars = ['/', '?', '#'],
    hostnameMaxLen = 255,
    hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,
    hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,
    // protocols that can allow "unsafe" and "unwise" chars.
    unsafeProtocol = {
      'javascript': true,
      'javascript:': true
    },
    // protocols that never have a hostname.
    hostlessProtocol = {
      'javascript': true,
      'javascript:': true
    },
    // protocols that always contain a // bit.
    slashedProtocol = {
      'http': true,
      'https': true,
      'ftp': true,
      'gopher': true,
      'file': true,
      'http:': true,
      'https:': true,
      'ftp:': true,
      'gopher:': true,
      'file:': true
    },
    querystring = require('querystring');

function urlParse(url, parseQueryString, slashesDenoteHost) {
  if (url && util.isObject(url) && url instanceof Url) return url;

  var u = new Url;
  u.parse(url, parseQueryString, slashesDenoteHost);
  return u;
}

Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
  if (!util.isString(url)) {
    throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
  }

  // Copy chrome, IE, opera backslash-handling behavior.
  // Back slashes before the query string get converted to forward slashes
  // See: https://code.google.com/p/chromium/issues/detail?id=25916
  var queryIndex = url.indexOf('?'),
      splitter =
          (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',
      uSplit = url.split(splitter),
      slashRegex = /\\/g;
  uSplit[0] = uSplit[0].replace(slashRegex, '/');
  url = uSplit.join(splitter);

  var rest = url;

  // trim before proceeding.
  // This is to support parse stuff like "  http://foo.com  \n"
  rest = rest.trim();

  if (!slashesDenoteHost && url.split('#').length === 1) {
    // Try fast path regexp
    var simplePath = simplePathPattern.exec(rest);
    if (simplePath) {
      this.path = rest;
      this.href = rest;
      this.pathname = simplePath[1];
      if (simplePath[2]) {
        this.search = simplePath[2];
        if (parseQueryString) {
          this.query = querystring.parse(this.search.substr(1));
        } else {
          this.query = this.search.substr(1);
        }
      } else if (parseQueryString) {
        this.search = '';
        this.query = {};
      }
      return this;
    }
  }

  var proto = protocolPattern.exec(rest);
  if (proto) {
    proto = proto[0];
    var lowerProto = proto.toLowerCase();
    this.protocol = lowerProto;
    rest = rest.substr(proto.length);
  }

  // figure out if it's got a host
  // user@server is *always* interpreted as a hostname, and url
  // resolution will treat //foo/bar as host=foo,path=bar because that's
  // how the browser resolves relative URLs.
  if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
    var slashes = rest.substr(0, 2) === '//';
    if (slashes && !(proto && hostlessProtocol[proto])) {
      rest = rest.substr(2);
      this.slashes = true;
    }
  }

  if (!hostlessProtocol[proto] &&
      (slashes || (proto && !slashedProtocol[proto]))) {

    // there's a hostname.
    // the first instance of /, ?, ;, or # ends the host.
    //
    // If there is an @ in the hostname, then non-host chars *are* allowed
    // to the left of the last @ sign, unless some host-ending character
    // comes *before* the @-sign.
    // URLs are obnoxious.
    //
    // ex:
    // http://a@b@c/ => user:a@b host:c
    // http://a@b?@c => user:a host:c path:/?@c

    // v0.12 TODO(isaacs): This is not quite how Chrome does things.
    // Review our test case against browsers more comprehensively.

    // find the first instance of any hostEndingChars
    var hostEnd = -1;
    for (var i = 0; i < hostEndingChars.length; i++) {
      var hec = rest.indexOf(hostEndingChars[i]);
      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
        hostEnd = hec;
    }

    // at this point, either we have an explicit point where the
    // auth portion cannot go past, or the last @ char is the decider.
    var auth, atSign;
    if (hostEnd === -1) {
      // atSign can be anywhere.
      atSign = rest.lastIndexOf('@');
    } else {
      // atSign must be in auth portion.
      // http://a@b/c@d => host:b auth:a path:/c@d
      atSign = rest.lastIndexOf('@', hostEnd);
    }

    // Now we have a portion which is definitely the auth.
    // Pull that off.
    if (atSign !== -1) {
      auth = rest.slice(0, atSign);
      rest = rest.slice(atSign + 1);
      this.auth = decodeURIComponent(auth);
    }

    // the host is the remaining to the left of the first non-host char
    hostEnd = -1;
    for (var i = 0; i < nonHostChars.length; i++) {
      var hec = rest.indexOf(nonHostChars[i]);
      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
        hostEnd = hec;
    }
    // if we still have not hit it, then the entire thing is a host.
    if (hostEnd === -1)
      hostEnd = rest.length;

    this.host = rest.slice(0, hostEnd);
    rest = rest.slice(hostEnd);

    // pull out port.
    this.parseHost();

    // we've indicated that there is a hostname,
    // so even if it's empty, it has to be present.
    this.hostname = this.hostname || '';

    // if hostname begins with [ and ends with ]
    // assume that it's an IPv6 address.
    var ipv6Hostname = this.hostname[0] === '[' &&
        this.hostname[this.hostname.length - 1] === ']';

    // validate a little.
    if (!ipv6Hostname) {
      var hostparts = this.hostname.split(/\./);
      for (var i = 0, l = hostparts.length; i < l; i++) {
        var part = hostparts[i];
        if (!part) continue;
        if (!part.match(hostnamePartPattern)) {
          var newpart = '';
          for (var j = 0, k = part.length; j < k; j++) {
            if (part.charCodeAt(j) > 127) {
              // we replace non-ASCII char with a temporary placeholder
              // we need this to make sure size of hostname is not
              // broken by replacing non-ASCII by nothing
              newpart += 'x';
            } else {
              newpart += part[j];
            }
          }
          // we test again with ASCII char only
          if (!newpart.match(hostnamePartPattern)) {
            var validParts = hostparts.slice(0, i);
            var notHost = hostparts.slice(i + 1);
            var bit = part.match(hostnamePartStart);
            if (bit) {
              validParts.push(bit[1]);
              notHost.unshift(bit[2]);
            }
            if (notHost.length) {
              rest = '/' + notHost.join('.') + rest;
            }
            this.hostname = validParts.join('.');
            break;
          }
        }
      }
    }

    if (this.hostname.length > hostnameMaxLen) {
      this.hostname = '';
    } else {
      // hostnames are always lower case.
      this.hostname = this.hostname.toLowerCase();
    }

    if (!ipv6Hostname) {
      // IDNA Support: Returns a punycoded representation of "domain".
      // It only converts parts of the domain name that
      // have non-ASCII characters, i.e. it doesn't matter if
      // you call it with a domain that already is ASCII-only.
      this.hostname = punycode.toASCII(this.hostname);
    }

    var p = this.port ? ':' + this.port : '';
    var h = this.hostname || '';
    this.host = h + p;
    this.href += this.host;

    // strip [ and ] from the hostname
    // the host field still retains them, though
    if (ipv6Hostname) {
      this.hostname = this.hostname.substr(1, this.hostname.length - 2);
      if (rest[0] !== '/') {
        rest = '/' + rest;
      }
    }
  }

  // now rest is set to the post-host stuff.
  // chop off any delim chars.
  if (!unsafeProtocol[lowerProto]) {

    // First, make 100% sure that any "autoEscape" chars get
    // escaped, even if encodeURIComponent doesn't think they
    // need to be.
    for (var i = 0, l = autoEscape.length; i < l; i++) {
      var ae = autoEscape[i];
      if (rest.indexOf(ae) === -1)
        continue;
      var esc = encodeURIComponent(ae);
      if (esc === ae) {
        esc = escape(ae);
      }
      rest = rest.split(ae).join(esc);
    }
  }


  // chop off from the tail first.
  var hash = rest.indexOf('#');
  if (hash !== -1) {
    // got a fragment string.
    this.hash = rest.substr(hash);
    rest = rest.slice(0, hash);
  }
  var qm = rest.indexOf('?');
  if (qm !== -1) {
    this.search = rest.substr(qm);
    this.query = rest.substr(qm + 1);
    if (parseQueryString) {
      this.query = querystring.parse(this.query);
    }
    rest = rest.slice(0, qm);
  } else if (parseQueryString) {
    // no query string, but parseQueryString still requested
    this.search = '';
    this.query = {};
  }
  if (rest) this.pathname = rest;
  if (slashedProtocol[lowerProto] &&
      this.hostname && !this.pathname) {
    this.pathname = '/';
  }

  //to support http.request
  if (this.pathname || this.search) {
    var p = this.pathname || '';
    var s = this.search || '';
    this.path = p + s;
  }

  // finally, reconstruct the href based on what has been validated.
  this.href = this.format();
  return this;
};

// format a parsed object into a url string
function urlFormat(obj) {
  // ensure it's an object, and not a string url.
  // If it's an obj, this is a no-op.
  // this way, you can call url_format() on strings
  // to clean up potentially wonky urls.
  if (util.isString(obj)) obj = urlParse(obj);
  if (!(obj instanceof Url)) return Url.prototype.format.call(obj);
  return obj.format();
}

Url.prototype.format = function() {
  var auth = this.auth || '';
  if (auth) {
    auth = encodeURIComponent(auth);
    auth = auth.replace(/%3A/i, ':');
    auth += '@';
  }

  var protocol = this.protocol || '',
      pathname = this.pathname || '',
      hash = this.hash || '',
      host = false,
      query = '';

  if (this.host) {
    host = auth + this.host;
  } else if (this.hostname) {
    host = auth + (this.hostname.indexOf(':') === -1 ?
        this.hostname :
        '[' + this.hostname + ']');
    if (this.port) {
      host += ':' + this.port;
    }
  }

  if (this.query &&
      util.isObject(this.query) &&
      Object.keys(this.query).length) {
    query = querystring.stringify(this.query);
  }

  var search = this.search || (query && ('?' + query)) || '';

  if (protocol && protocol.substr(-1) !== ':') protocol += ':';

  // only the slashedProtocols get the //.  Not mailto:, xmpp:, etc.
  // unless they had them to begin with.
  if (this.slashes ||
      (!protocol || slashedProtocol[protocol]) && host !== false) {
    host = '//' + (host || '');
    if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
  } else if (!host) {
    host = '';
  }

  if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
  if (search && search.charAt(0) !== '?') search = '?' + search;

  pathname = pathname.replace(/[?#]/g, function(match) {
    return encodeURIComponent(match);
  });
  search = search.replace('#', '%23');

  return protocol + host + pathname + search + hash;
};

function urlResolve(source, relative) {
  return urlParse(source, false, true).resolve(relative);
}

Url.prototype.resolve = function(relative) {
  return this.resolveObject(urlParse(relative, false, true)).format();
};

function urlResolveObject(source, relative) {
  if (!source) return relative;
  return urlParse(source, false, true).resolveObject(relative);
}

Url.prototype.resolveObject = function(relative) {
  if (util.isString(relative)) {
    var rel = new Url();
    rel.parse(relative, false, true);
    relative = rel;
  }

  var result = new Url();
  var tkeys = Object.keys(this);
  for (var tk = 0; tk < tkeys.length; tk++) {
    var tkey = tkeys[tk];
    result[tkey] = this[tkey];
  }

  // hash is always overridden, no matter what.
  // even href="" will remove it.
  result.hash = relative.hash;

  // if the relative url is empty, then there's nothing left to do here.
  if (relative.href === '') {
    result.href = result.format();
    return result;
  }

  // hrefs like //foo/bar always cut to the protocol.
  if (relative.slashes && !relative.protocol) {
    // take everything except the protocol from relative
    var rkeys = Object.keys(relative);
    for (var rk = 0; rk < rkeys.length; rk++) {
      var rkey = rkeys[rk];
      if (rkey !== 'protocol')
        result[rkey] = relative[rkey];
    }

    //urlParse appends trailing / to urls like http://www.example.com
    if (slashedProtocol[result.protocol] &&
        result.hostname && !result.pathname) {
      result.path = result.pathname = '/';
    }

    result.href = result.format();
    return result;
  }

  if (relative.protocol && relative.protocol !== result.protocol) {
    // if it's a known url protocol, then changing
    // the protocol does weird things
    // first, if it's not file:, then we MUST have a host,
    // and if there was a path
    // to begin with, then we MUST have a path.
    // if it is file:, then the host is dropped,
    // because that's known to be hostless.
    // anything else is assumed to be absolute.
    if (!slashedProtocol[relative.protocol]) {
      var keys = Object.keys(relative);
      for (var v = 0; v < keys.length; v++) {
        var k = keys[v];
        result[k] = relative[k];
      }
      result.href = result.format();
      return result;
    }

    result.protocol = relative.protocol;
    if (!relative.host && !hostlessProtocol[relative.protocol]) {
      var relPath = (relative.pathname || '').split('/');
      while (relPath.length && !(relative.host = relPath.shift()));
      if (!relative.host) relative.host = '';
      if (!relative.hostname) relative.hostname = '';
      if (relPath[0] !== '') relPath.unshift('');
      if (relPath.length < 2) relPath.unshift('');
      result.pathname = relPath.join('/');
    } else {
      result.pathname = relative.pathname;
    }
    result.search = relative.search;
    result.query = relative.query;
    result.host = relative.host || '';
    result.auth = relative.auth;
    result.hostname = relative.hostname || relative.host;
    result.port = relative.port;
    // to support http.request
    if (result.pathname || result.search) {
      var p = result.pathname || '';
      var s = result.search || '';
      result.path = p + s;
    }
    result.slashes = result.slashes || relative.slashes;
    result.href = result.format();
    return result;
  }

  var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),
      isRelAbs = (
          relative.host ||
          relative.pathname && relative.pathname.charAt(0) === '/'
      ),
      mustEndAbs = (isRelAbs || isSourceAbs ||
                    (result.host && relative.pathname)),
      removeAllDots = mustEndAbs,
      srcPath = result.pathname && result.pathname.split('/') || [],
      relPath = relative.pathname && relative.pathname.split('/') || [],
      psychotic = result.protocol && !slashedProtocol[result.protocol];

  // if the url is a non-slashed url, then relative
  // links like ../.. should be able
  // to crawl up to the hostname, as well.  This is strange.
  // result.protocol has already been set by now.
  // Later on, put the first path part into the host field.
  if (psychotic) {
    result.hostname = '';
    result.port = null;
    if (result.host) {
      if (srcPath[0] === '') srcPath[0] = result.host;
      else srcPath.unshift(result.host);
    }
    result.host = '';
    if (relative.protocol) {
      relative.hostname = null;
      relative.port = null;
      if (relative.host) {
        if (relPath[0] === '') relPath[0] = relative.host;
        else relPath.unshift(relative.host);
      }
      relative.host = null;
    }
    mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
  }

  if (isRelAbs) {
    // it's absolute.
    result.host = (relative.host || relative.host === '') ?
                  relative.host : result.host;
    result.hostname = (relative.hostname || relative.hostname === '') ?
                      relative.hostname : result.hostname;
    result.search = relative.search;
    result.query = relative.query;
    srcPath = relPath;
    // fall through to the dot-handling below.
  } else if (relPath.length) {
    // it's relative
    // throw away the existing file, and take the new path instead.
    if (!srcPath) srcPath = [];
    srcPath.pop();
    srcPath = srcPath.concat(relPath);
    result.search = relative.search;
    result.query = relative.query;
  } else if (!util.isNullOrUndefined(relative.search)) {
    // just pull out the search.
    // like href='?foo'.
    // Put this after the other two cases because it simplifies the booleans
    if (psychotic) {
      result.hostname = result.host = srcPath.shift();
      //occationaly the auth can get stuck only in host
      //this especially happens in cases like
      //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
      var authInHost = result.host && result.host.indexOf('@') > 0 ?
                       result.host.split('@') : false;
      if (authInHost) {
        result.auth = authInHost.shift();
        result.host = result.hostname = authInHost.shift();
      }
    }
    result.search = relative.search;
    result.query = relative.query;
    //to support http.request
    if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
      result.path = (result.pathname ? result.pathname : '') +
                    (result.search ? result.search : '');
    }
    result.href = result.format();
    return result;
  }

  if (!srcPath.length) {
    // no path at all.  easy.
    // we've already handled the other stuff above.
    result.pathname = null;
    //to support http.request
    if (result.search) {
      result.path = '/' + result.search;
    } else {
      result.path = null;
    }
    result.href = result.format();
    return result;
  }

  // if a url ENDs in . or .., then it must get a trailing slash.
  // however, if it ends in anything else non-slashy,
  // then it must NOT get a trailing slash.
  var last = srcPath.slice(-1)[0];
  var hasTrailingSlash = (
      (result.host || relative.host || srcPath.length > 1) &&
      (last === '.' || last === '..') || last === '');

  // strip single dots, resolve double dots to parent dir
  // if the path tries to go above the root, `up` ends up > 0
  var up = 0;
  for (var i = srcPath.length; i >= 0; i--) {
    last = srcPath[i];
    if (last === '.') {
      srcPath.splice(i, 1);
    } else if (last === '..') {
      srcPath.splice(i, 1);
      up++;
    } else if (up) {
      srcPath.splice(i, 1);
      up--;
    }
  }

  // if the path is allowed to go above the root, restore leading ..s
  if (!mustEndAbs && !removeAllDots) {
    for (; up--; up) {
      srcPath.unshift('..');
    }
  }

  if (mustEndAbs && srcPath[0] !== '' &&
      (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
    srcPath.unshift('');
  }

  if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
    srcPath.push('');
  }

  var isAbsolute = srcPath[0] === '' ||
      (srcPath[0] && srcPath[0].charAt(0) === '/');

  // put the host back
  if (psychotic) {
    result.hostname = result.host = isAbsolute ? '' :
                                    srcPath.length ? srcPath.shift() : '';
    //occationaly the auth can get stuck only in host
    //this especially happens in cases like
    //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
    var authInHost = result.host && result.host.indexOf('@') > 0 ?
                     result.host.split('@') : false;
    if (authInHost) {
      result.auth = authInHost.shift();
      result.host = result.hostname = authInHost.shift();
    }
  }

  mustEndAbs = mustEndAbs || (result.host && srcPath.length);

  if (mustEndAbs && !isAbsolute) {
    srcPath.unshift('');
  }

  if (!srcPath.length) {
    result.pathname = null;
    result.path = null;
  } else {
    result.pathname = srcPath.join('/');
  }

  //to support request.http
  if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
    result.path = (result.pathname ? result.pathname : '') +
                  (result.search ? result.search : '');
  }
  result.auth = relative.auth || result.auth;
  result.slashes = result.slashes || relative.slashes;
  result.href = result.format();
  return result;
};

Url.prototype.parseHost = function() {
  var host = this.host;
  var port = portPattern.exec(host);
  if (port) {
    port = port[0];
    if (port !== ':') {
      this.port = port.substr(1);
    }
    host = host.substr(0, host.length - port.length);
  }
  if (host) this.hostname = host;
};

},{"./util":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/url/util.js","punycode":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/punycode/punycode.js","querystring":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/querystring-es3/index.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/url/util.js":[function(require,module,exports){
'use strict';

module.exports = {
  isString: function(arg) {
    return typeof(arg) === 'string';
  },
  isObject: function(arg) {
    return typeof(arg) === 'object' && arg !== null;
  },
  isNull: function(arg) {
    return arg === null;
  },
  isNullOrUndefined: function(arg) {
    return arg == null;
  }
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/util-deprecate/browser.js":[function(require,module,exports){
(function (global){(function (){

/**
 * Module exports.
 */

module.exports = deprecate;

/**
 * Mark that a method should not be used.
 * Returns a modified function which warns once by default.
 *
 * If `localStorage.noDeprecation = true` is set, then it is a no-op.
 *
 * If `localStorage.throwDeprecation = true` is set, then deprecated functions
 * will throw an Error when invoked.
 *
 * If `localStorage.traceDeprecation = true` is set, then deprecated functions
 * will invoke `console.trace()` instead of `console.error()`.
 *
 * @param {Function} fn - the function to deprecate
 * @param {String} msg - the string to print to the console when `fn` is invoked
 * @returns {Function} a new "deprecated" version of `fn`
 * @api public
 */

function deprecate (fn, msg) {
  if (config('noDeprecation')) {
    return fn;
  }

  var warned = false;
  function deprecated() {
    if (!warned) {
      if (config('throwDeprecation')) {
        throw new Error(msg);
      } else if (config('traceDeprecation')) {
        console.trace(msg);
      } else {
        console.warn(msg);
      }
      warned = true;
    }
    return fn.apply(this, arguments);
  }

  return deprecated;
}

/**
 * Checks `localStorage` for boolean values for the given `name`.
 *
 * @param {String} name
 * @returns {Boolean}
 * @api private
 */

function config (name) {
  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
  try {
    if (!global.localStorage) return false;
  } catch (_) {
    return false;
  }
  var val = global.localStorage[name];
  if (null == val) return false;
  return String(val).toLowerCase() === 'true';
}

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/util/node_modules/inherits/inherits_browser.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/node_modules/inherits/inherits_browser.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/util/support/isBufferBrowser.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/node_modules/util/support/isBufferBrowser.js"][0].apply(exports,arguments)
},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/util/util.js":[function(require,module,exports){
arguments[4]["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/assert/node_modules/util/util.js"][0].apply(exports,arguments)
},{"./support/isBuffer":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/util/support/isBufferBrowser.js","_process":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/process/browser.js","inherits":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/util/node_modules/inherits/inherits_browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/index.js":[function(require,module,exports){
var v1 = require('./v1');
var v4 = require('./v4');

var uuid = v4;
uuid.v1 = v1;
uuid.v4 = v4;

module.exports = uuid;

},{"./v1":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/v1.js","./v4":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/v4.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/lib/bytesToUuid.js":[function(require,module,exports){
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */
var byteToHex = [];
for (var i = 0; i < 256; ++i) {
  byteToHex[i] = (i + 0x100).toString(16).substr(1);
}

function bytesToUuid(buf, offset) {
  var i = offset || 0;
  var bth = byteToHex;
  // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4
  return ([
    bth[buf[i++]], bth[buf[i++]],
    bth[buf[i++]], bth[buf[i++]], '-',
    bth[buf[i++]], bth[buf[i++]], '-',
    bth[buf[i++]], bth[buf[i++]], '-',
    bth[buf[i++]], bth[buf[i++]], '-',
    bth[buf[i++]], bth[buf[i++]],
    bth[buf[i++]], bth[buf[i++]],
    bth[buf[i++]], bth[buf[i++]]
  ]).join('');
}

module.exports = bytesToUuid;

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/lib/rng-browser.js":[function(require,module,exports){
// Unique ID creation requires a high quality random # generator.  In the
// browser this is a little complicated due to unknown quality of Math.random()
// and inconsistent support for the `crypto` API.  We do the best we can via
// feature-detection

// getRandomValues needs to be invoked in a context where "this" is a Crypto
// implementation. Also, find the complete implementation of crypto on IE11.
var getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||
                      (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));

if (getRandomValues) {
  // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto
  var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef

  module.exports = function whatwgRNG() {
    getRandomValues(rnds8);
    return rnds8;
  };
} else {
  // Math.random()-based (RNG)
  //
  // If all else fails, use Math.random().  It's fast, but is of unspecified
  // quality.
  var rnds = new Array(16);

  module.exports = function mathRNG() {
    for (var i = 0, r; i < 16; i++) {
      if ((i & 0x03) === 0) r = Math.random() * 0x100000000;
      rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;
    }

    return rnds;
  };
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/v1.js":[function(require,module,exports){
var rng = require('./lib/rng');
var bytesToUuid = require('./lib/bytesToUuid');

// **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

var _nodeId;
var _clockseq;

// Previous uuid creation time
var _lastMSecs = 0;
var _lastNSecs = 0;

// See https://github.com/uuidjs/uuid for API details
function v1(options, buf, offset) {
  var i = buf && offset || 0;
  var b = buf || [];

  options = options || {};
  var node = options.node || _nodeId;
  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;

  // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189
  if (node == null || clockseq == null) {
    var seedBytes = rng();
    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [
        seedBytes[0] | 0x01,
        seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]
      ];
    }
    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  }

  // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
  var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();

  // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock
  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;

  // Time since last uuid creation (in msecs)
  var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;

  // Per 4.2.1.2, Bump clockseq on clock regression
  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  }

  // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval
  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  }

  // Per 4.2.1.2 Throw error if too many uuids are requested
  if (nsecs >= 10000) {
    throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec');
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq;

  // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
  msecs += 12219292800000;

  // `time_low`
  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff;

  // `time_mid`
  var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff;

  // `time_high_and_version`
  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
  b[i++] = tmh >>> 16 & 0xff;

  // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
  b[i++] = clockseq >>> 8 | 0x80;

  // `clock_seq_low`
  b[i++] = clockseq & 0xff;

  // `node`
  for (var n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf ? buf : bytesToUuid(b);
}

module.exports = v1;

},{"./lib/bytesToUuid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/lib/bytesToUuid.js","./lib/rng":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/lib/rng-browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/v4.js":[function(require,module,exports){
var rng = require('./lib/rng');
var bytesToUuid = require('./lib/bytesToUuid');

function v4(options, buf, offset) {
  var i = buf && offset || 0;

  if (typeof(options) == 'string') {
    buf = options === 'binary' ? new Array(16) : null;
    options = null;
  }
  options = options || {};

  var rnds = options.random || (options.rng || rng)();

  // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
  rnds[6] = (rnds[6] & 0x0f) | 0x40;
  rnds[8] = (rnds[8] & 0x3f) | 0x80;

  // Copy bytes to buffer, if provided
  if (buf) {
    for (var ii = 0; ii < 16; ++ii) {
      buf[i + ii] = rnds[ii];
    }
  }

  return buf || bytesToUuid(rnds);
}

module.exports = v4;

},{"./lib/bytesToUuid":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/lib/bytesToUuid.js","./lib/rng":"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/node_modules/uuid/lib/rng-browser.js"}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/package.json":[function(require,module,exports){
module.exports={
  "name": "retail-sdk",
  "version": "2.4.00",
  "mobileVersion": "22105000",
  "description": "A cross platform sdk for applications using PayPal Retail services, such as card acceptance and checkin",
  "main": "index.js",
  "pre-commit": [
    "lint"
  ],
  "pre-push": [
    "test"
  ],
  "scripts": {
    "test": "npm run test2 && npm run test1",
    "test1": " mocha --timeout 10000 --require test/testSetup --recursive ./test/mocha/**",
    "test1:cov": "nyc --report-dir=coverage-mocha --reporter=html mocha --timeout 10000 --require test/testSetup --recursive ./test/mocha/**",
    "test2": "tape --require ./test/testSetup test/tape/* | tap-difflet -p",
    "test2:cov": "nyc --report-dir=coverage-tape --reporter=html tape --require ./test/testSetup test/tape/* | tap-difflet",
    "ci-test": "JUNIT_REPORT_PATH=report.xml JUNIT_REPORT_STACK=1 mocha --timeout 5000 --require test/testSetup --reporter mocha-jenkins-reporter \"test/**/*.js\"",
    "ci-lint": "eslint js",
    "lint": "eslint js test/tape",
    "code-gen": "gulp develop"
  },
  "repository": {
    "type": "git",
    "url": "git@github.paypal.com:PPH-SDK/retail-sdk.git"
  },
  "keywords": [
    "retail",
    "paypal_here",
    "emv",
    "sdk"
  ],
  "publishConfig": {
    "registry": "https://npm.paypal.com"
  },
  "author": "PayPal",
  "license": "UNLICENSED",
  "dependencies": {
    "@babel/register": "^7.4.0",
    "@babel/runtime-corejs3": "^7.4.3",
    "@hapi/wreck": "^15.0.1",
    "@paypalcorp/manticore-log": "3.0.0",
    "@paypalcorp/manticore-paypalerror": "3.4.1",
    "@paypalcorp/miura-emv": "17.5.4",
    "@paypalcorp/paypal-invoicing": "11.0.0",
    "@paypalcorp/paypalrest-manticore": "5.3.0",
    "@paypalcorp/pph-sdk-enums": "0.6.2",
    "@paypalcorp/retail-payment-device": "28.6.0",
    "@paypalcorp/verifone": "2.0.1",
    "@paypalcorp/verifone-payment-device": "0.6.0",
    "async": "^1.5.0",
    "axios": "^0.21.1",
    "bignumber.js": "7.2.1",
    "commander": "^2.7.1",
    "core-js": "^3.6.4",
    "crc": "^3.8.0",
    "es6-template-strings": "^2.0.0",
    "event-stream": "^4.0.1",
    "fs-extra": "^0.26.0",
    "jsonpath": "1.0.1",
    "l10n-manticore": "^1.0.3",
    "lodash": "^4.17.21",
    "machina": "^4.0.2",
    "manticore": "1.3.1",
    "manticore-browser": "1.1.4",
    "manticore-util": "2.4.2",
    "mcc-mnc-list": "^1.0.79",
    "md5": "^2.0.0",
    "moment": "^2.29.1",
    "nocycle": "^1.1.0",
    "node-jose": "^1.1.3",
    "qs": "^6.9.1",
    "ramda": "^0.26.1",
    "ramda-adjunct": "^2.20.0",
    "readline-sync": "^1.0.0",
    "retail-page-tracker": "^1.4.0",
    "rimraf": "^2.4.0",
    "rxjs": "^6.5.2",
    "tlvlib": "3.5.0",
    "uglifyify": "^3.0.1",
    "uuid": "^3.3.3",
    "vinyl-map": "^1.0.2",
    "vinyl-transform": "^1.0.0",
    "yargs": "^12.0.5"
  },
  "devDependencies": {
    "@babel/cli": "^7.4.3",
    "@babel/core": "^7.4.3",
    "@babel/eslint-parser": "^7.11.3",
    "@babel/plugin-proposal-class-properties": "^7.5.5",
    "@babel/plugin-proposal-decorators": "^7.6.0",
    "@babel/plugin-proposal-export-default-from": "^7.8.3",
    "@babel/plugin-proposal-export-namespace-from": "^7.8.3",
    "@babel/plugin-proposal-optional-chaining": "^7.2.0",
    "@babel/plugin-transform-runtime": "^7.4.3",
    "@babel/polyfill": "^7.6.0",
    "@babel/preset-env": "^7.9.5",
    "babel-plugin-import-graphql": "^2.6.2",
    "babel-plugin-syntax-async-functions": "^6.13.0",
    "babel-plugin-transform-regenerator": "^6.26.0",
    "babelify": "^10.0.0",
    "browserify": "16.5.1",
    "chai": "^3.1.0",
    "commitizen": "^4.0.3",
    "eslint": "^7.6.0",
    "eslint-config-airbnb-base": "^14.2.1",
    "eslint-config-prettier": "^3.5.0",
    "eslint-plugin-babel": "^5.3.0",
    "eslint-plugin-import": "^2.14.0",
    "eslint-plugin-jsx-a11y": "^6.2.3",
    "eslint-plugin-prettier": "^3.0.1",
    "eslint-plugin-react": "^4.3.0",
    "fancy-log": "^1.3.3",
    "graphql": "^14.1.1",
    "gulp": "^4.0.2",
    "gulp-base64-encode": "^1.0.1",
    "gulp-concat": "^2.6.0",
    "gulp-jshint": "^2.1.0",
    "gulp-multi-dest": "^1.3.7",
    "gulp-rename": "^1.4.0",
    "gulp-replace": "^1.0.0",
    "gulp-sourcemaps": "^1.5.1",
    "gulplog": "^1.0.0",
    "jshint": "^2.10.2",
    "manticore-gen": "4.3.7",
    "mocha": "^6.1.4",
    "mocha-jenkins-reporter": "^0.1.8",
    "mockery": "^1.4.0",
    "nyc": "^14.1.1",
    "pre-commit": "^1.1.3",
    "pre-push": "^0.1.1",
    "prettier": "^1.15.3",
    "proxyquire": "^1.8.0",
    "sinon": "^6.0.0",
    "sinon-chai": "^2.8.0",
    "tap-difflet": "^0.7.2",
    "tape": "^4.2.2",
    "uglifyify": "^3.0.1"
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  }
}

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/ppPublicKey.js":[function(require,module,exports){
"use strict";

module.exports = {
  KEY_HASHES: {
    'paypal.com': ['WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18=', 'Wd8xe/qfTwq3ylFNd3IpaqLHZbh2ZNCLluVzmeNkcpw=', 'JbQbUG5JMJUoI6brnx0x3vZF6jilxsapbXGVfjhN8Fg=', 'lnsM2T/O9/J84sJFdnrpsFp3awZJ+ZZbYpCWhGloaHI=', 'i7WTqTvh0OioIruIfFR4kMPnBqrS2rdiVPl/s2uC/CY='],
    'paypalobjects.com': ['WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18=', 'Wd8xe/qfTwq3ylFNd3IpaqLHZbh2ZNCLluVzmeNkcpw=', 'JbQbUG5JMJUoI6brnx0x3vZF6jilxsapbXGVfjhN8Fg=', 'lnsM2T/O9/J84sJFdnrpsFp3awZJ+ZZbYpCWhGloaHI=', 'i7WTqTvh0OioIruIfFR4kMPnBqrS2rdiVPl/s2uC/CY=']
  }
};

},{}],"/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/resources/feature-map.json":[function(require,module,exports){
module.exports={
  "VERSION":"1.6",
  "GLOBAL": {
    "sig": false,
    "apic": true,
    "nslall": false,
    "fhlem": [],
    "fhlbid": [],
    "SWU_CHECK_PERIOD": 300,
    "READER_SLEEP_DELAY": 60,
    "QRC": {
      "POLLING": {
        "INTERVAL": 2000,
        "TIMEOUT": 60000
      }
    }
  },
  "ANDROID":{
    "minSDKVersion":"1.0"
  },
  "IOS":{
    "minSDKVersion":"1.0"
  },
  "US":{
    "MCC_CODES":{
      "4121":"*",
      "5812":"*",
      "5813":"*",
      "5814":"*",
      "7230":"*",
      "7298":"*",
      "4411":"*",
      "7519":"*",
      "7011":"*",
      "7512":"*"
    },
    "CONTACTLESS_LIMIT":"10000",
    "CAPABILITY" : [ "MOBILE", "WEB" ],
    "QRC":{
      "POLLING": {
        "INTERVAL": 2000,
        "TIMEOUT": 60000
      },
      "TC": {
        "ENABLE": true,
        "CONTENT": "<html><body><h1>Notice of fees</h1><br><br><p>Transaction fees: For promotional period ending December 31, 2020, sellers will pay 2.2% per transaction when accepting QR code in-store payments using PayPal Here. After that, you'll pay a 2.7% per transaction fee when accepting QR code in-store payments. An additional 1.5% cross-border fee applies if you accept a payment from a non-US account.</p><br><br><br><br><p style=\"text-align: center\">All other <a href=\"https://www.paypal.com/us/webapps/mpp/ua/paypalhereterms-full\\\">PayPal Here Terms</a> apply</p></body></html>",
        "LINK": "All other <a href=\"https://www.paypal.com/us/webapps/mpp/ua/paypalhereterms-full\\\">PayPal Here Terms</a> apply",
        "VERSION": "1"
      }
    }
  },
  "GB":{
    "CONTACTLESS_LIMIT":"45",
    "CAPABILITY" : [ "MOBILE" ]
  },
  "AU":{
    "CONTACTLESS_LIMIT":"*",
    "CAPABILITY" : [ "MOBILE" ]
  }
}

},{}]},{},["/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/debug.js","/Users/jenkins/.jenkins/workspace/SDKBetaBuild/retail-sdk/js/index.js"]);
